@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
package/dist/index.esm.js CHANGED
@@ -1272,6 +1272,18 @@ const PaletteAutumn = {
1272
1272
  primaryColor: '#ea580c'
1273
1273
  };
1274
1274
 
1275
+ /**
1276
+ * Boutique Palette Configuration
1277
+ *
1278
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
1279
+ */
1280
+ const PaletteBoutique = {
1281
+ id: 'boutique',
1282
+ name: 'Boutique',
1283
+ description: 'Sophisticated teal, bronze, and navy - perfect for premium retail and fashion brands',
1284
+ primaryColor: '#3ca6b6'
1285
+ };
1286
+
1275
1287
  /**
1276
1288
  * Ocean Palette Configuration
1277
1289
  *
@@ -1325,7 +1337,7 @@ const PaletteCosmic = {
1325
1337
  *
1326
1338
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
1327
1339
  */
1328
- const AllPalettes = [PaletteDefault, PaletteOcean, PaletteCosmic, PaletteWinter, PaletteAutumn, PaletteSpring];
1340
+ const AllPalettes = [PaletteDefault, PaletteBoutique, PaletteOcean, PaletteCosmic, PaletteWinter, PaletteAutumn, PaletteSpring];
1329
1341
 
1330
1342
  /**
1331
1343
  * Persistence utilities for theme and palette preferences
@@ -18493,6 +18505,20 @@ class ReactNodeTransformer {
18493
18505
  *
18494
18506
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
18495
18507
  */
18508
+ // Import linkedom for server-side HTML parsing
18509
+ let parseHTML = null;
18510
+ if (typeof window === 'undefined') {
18511
+ // Server-side: use linkedom
18512
+ try {
18513
+ const {
18514
+ parseHTML: parse
18515
+ } = require('linkedom');
18516
+ parseHTML = html => parse(html).document;
18517
+ } catch (e) {
18518
+ // linkedom not available, will fall back to client-only rendering
18519
+ console.warn('linkedom not available for SSR HTML parsing');
18520
+ }
18521
+ }
18496
18522
  /**
18497
18523
  * Registry for component classes that support serialization
18498
18524
  */
@@ -18801,13 +18827,27 @@ let ComponentTransformer$1 = class ComponentTransformer {
18801
18827
  }
18802
18828
  /**
18803
18829
  * Transform HTML string to React nodes using registered patterns
18830
+ * Supports both server-side (linkedom) and client-side (DOMParser) rendering
18804
18831
  * @param html - HTML string to transform
18805
18832
  * @returns Array of React nodes
18806
18833
  */
18807
18834
  static transformHTML(html) {
18808
18835
  if (!html.trim()) return [];
18809
- const parser = new DOMParser();
18810
- const doc = parser.parseFromString(html, 'text/html');
18836
+ let doc;
18837
+ // Server-side: use linkedom if available
18838
+ if (typeof window === 'undefined') {
18839
+ if (parseHTML) {
18840
+ doc = parseHTML(html);
18841
+ } else {
18842
+ // linkedom not available, return empty for client-side rendering
18843
+ console.warn('SSR HTML parsing unavailable - content will render client-side only');
18844
+ return [];
18845
+ }
18846
+ } else {
18847
+ // Client-side: use DOMParser
18848
+ const parser = new DOMParser();
18849
+ doc = parser.parseFromString(html, 'text/html');
18850
+ }
18811
18851
  return Array.from(doc.body.children).map((element, index) => ComponentTransformer.transformElement(element, `element-${index}`));
18812
18852
  }
18813
18853
  /**
@@ -22974,36 +23014,31 @@ function DialogContentText({
22974
23014
  });
22975
23015
  }
22976
23016
 
22977
- const FormField = /*#__PURE__*/React.forwardRef((props, ref) => {
22978
- const {
22979
- gridProps,
22980
- styleProps,
22981
- htmlProps,
22982
- restProps
22983
- } = useBaseProps(props);
22984
- const {
22985
- label,
22986
- value,
22987
- onChange,
22988
- onChangeRaw,
22989
- type = 'text',
22990
- helperText,
22991
- required = false,
22992
- readOnly = false,
22993
- disabled = false,
22994
- disabledColor,
22995
- fullWidth = true,
22996
- multiline = false,
22997
- rows,
22998
- placeholder,
22999
- startAdornment,
23000
- endAdornment,
23001
- inputProps
23002
- } = restProps;
23003
- // Generate a unique ID for the input field
23017
+ /**
23018
+ * FormFieldView - Pure view component that renders the input field
23019
+ */
23020
+ function FormFieldView({
23021
+ label,
23022
+ value,
23023
+ onChange,
23024
+ onChangeRaw,
23025
+ type = 'text',
23026
+ helperText,
23027
+ required = false,
23028
+ readOnly = false,
23029
+ disabled = false,
23030
+ disabledColor,
23031
+ fullWidth = true,
23032
+ multiline = false,
23033
+ rows,
23034
+ placeholder,
23035
+ startAdornment,
23036
+ endAdornment,
23037
+ inputProps,
23038
+ ...restProps
23039
+ }) {
23004
23040
  const fieldId = React.useId();
23005
23041
  const handleChange = e => {
23006
- // If onChangeRaw is provided, use it instead
23007
23042
  if (onChangeRaw) {
23008
23043
  onChangeRaw(e);
23009
23044
  return;
@@ -23027,8 +23062,7 @@ const FormField = /*#__PURE__*/React.forwardRef((props, ref) => {
23027
23062
  '& input.Mui-disabled': disabledColor ? {
23028
23063
  color: disabledColor,
23029
23064
  WebkitTextFillColor: disabledColor
23030
- } : undefined,
23031
- ...styleProps.sx
23065
+ } : undefined
23032
23066
  };
23033
23067
  const labelStyles = {
23034
23068
  left: -12,
@@ -23039,18 +23073,8 @@ const FormField = /*#__PURE__*/React.forwardRef((props, ref) => {
23039
23073
  color: 'var(--theme-secondary)'
23040
23074
  };
23041
23075
  return jsxs(FormControl, {
23042
- ref: ref,
23043
23076
  fullWidth: fullWidth,
23044
- ...htmlProps,
23045
- ...styleProps,
23046
- ...(gridProps && {
23047
- 'data-grid-span': gridProps.span,
23048
- 'data-grid-xs': gridProps.xs,
23049
- 'data-grid-sm': gridProps.sm,
23050
- 'data-grid-md': gridProps.md,
23051
- 'data-grid-lg': gridProps.lg,
23052
- 'data-grid-xl': gridProps.xl
23053
- }),
23077
+ ...restProps,
23054
23078
  children: [jsx(InputLabel, {
23055
23079
  htmlFor: fieldId,
23056
23080
  sx: labelStyles,
@@ -23082,32 +23106,33 @@ const FormField = /*#__PURE__*/React.forwardRef((props, ref) => {
23082
23106
  children: helperText
23083
23107
  })]
23084
23108
  });
23085
- });
23086
- FormField.displayName = 'FormField';
23087
- // Mark as QwickApp component
23088
- Object.assign(FormField, {
23089
- [QWICKAPP_COMPONENT]: true
23109
+ }
23110
+ /**
23111
+ * Create FormField component using the factory pattern
23112
+ */
23113
+ const FormField = createSerializableView({
23114
+ tagName: 'FormField',
23115
+ version: '1.0.0',
23116
+ role: 'input',
23117
+ View: FormFieldView
23090
23118
  });
23091
23119
 
23092
- const FormSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
23093
- const {
23094
- gridProps,
23095
- styleProps,
23096
- htmlProps,
23097
- restProps
23098
- } = useBaseProps(props);
23099
- const {
23100
- label,
23101
- value,
23102
- onChange,
23103
- options,
23104
- helperText,
23105
- required = false,
23106
- disabled = false,
23107
- fullWidth = true,
23108
- size = 'small',
23109
- placeholder
23110
- } = restProps;
23120
+ /**
23121
+ * FormSelectView - Pure view component that renders the select field
23122
+ */
23123
+ function FormSelectView({
23124
+ label,
23125
+ value,
23126
+ onChange,
23127
+ options,
23128
+ helperText,
23129
+ required = false,
23130
+ disabled = false,
23131
+ fullWidth = true,
23132
+ size = 'small',
23133
+ placeholder,
23134
+ ...restProps
23135
+ }) {
23111
23136
  const handleChange = e => {
23112
23137
  onChange(e.target.value);
23113
23138
  };
@@ -23121,8 +23146,7 @@ const FormSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
23121
23146
  backgroundColor: 'var(--theme-surface-variant)',
23122
23147
  borderColor: 'var(--theme-surface)',
23123
23148
  color: 'var(--theme-text-primary)',
23124
- borderRadius: 1,
23125
- ...styleProps.sx
23149
+ borderRadius: 1
23126
23150
  };
23127
23151
  const labelStyles = {
23128
23152
  left: -12,
@@ -23133,19 +23157,9 @@ const FormSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
23133
23157
  color: 'var(--theme-secondary)'
23134
23158
  };
23135
23159
  return jsxs(FormControl, {
23136
- ref: ref,
23137
23160
  fullWidth: fullWidth,
23138
23161
  size: size,
23139
- ...htmlProps,
23140
- ...styleProps,
23141
- ...(gridProps && {
23142
- 'data-grid-span': gridProps.span,
23143
- 'data-grid-xs': gridProps.xs,
23144
- 'data-grid-sm': gridProps.sm,
23145
- 'data-grid-md': gridProps.md,
23146
- 'data-grid-lg': gridProps.lg,
23147
- 'data-grid-xl': gridProps.xl
23148
- }),
23162
+ ...restProps,
23149
23163
  children: [label && jsx(InputLabel, {
23150
23164
  sx: labelStyles,
23151
23165
  shrink: true,
@@ -23170,28 +23184,29 @@ const FormSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
23170
23184
  children: helperText
23171
23185
  })]
23172
23186
  });
23173
- });
23174
- FormSelect.displayName = 'FormSelect';
23175
- // Mark as QwickApp component
23176
- Object.assign(FormSelect, {
23177
- [QWICKAPP_COMPONENT]: true
23187
+ }
23188
+ /**
23189
+ * Create FormSelect component using the factory pattern
23190
+ */
23191
+ const FormSelect = createSerializableView({
23192
+ tagName: 'FormSelect',
23193
+ version: '1.0.0',
23194
+ role: 'input',
23195
+ View: FormSelectView
23178
23196
  });
23179
23197
 
23180
- const FormCheckbox = /*#__PURE__*/React.forwardRef((props, ref) => {
23181
- const {
23182
- gridProps,
23183
- styleProps,
23184
- htmlProps,
23185
- restProps
23186
- } = useBaseProps(props);
23187
- const {
23188
- label,
23189
- checked,
23190
- onChange,
23191
- helperText,
23192
- required = false,
23193
- disabled = false
23194
- } = restProps;
23198
+ /**
23199
+ * FormCheckboxView - Pure view component that renders the checkbox
23200
+ */
23201
+ function FormCheckboxView({
23202
+ label,
23203
+ checked,
23204
+ onChange,
23205
+ helperText,
23206
+ required = false,
23207
+ disabled = false,
23208
+ ...restProps
23209
+ }) {
23195
23210
  const handleChange = e => {
23196
23211
  onChange(e.target.checked);
23197
23212
  };
@@ -23211,25 +23226,14 @@ const FormCheckbox = /*#__PURE__*/React.forwardRef((props, ref) => {
23211
23226
  },
23212
23227
  '& .MuiFormControlLabel-label.Mui-disabled': {
23213
23228
  color: 'var(--theme-text-disabled)'
23214
- },
23215
- ...styleProps.sx
23229
+ }
23216
23230
  };
23217
23231
  const helperTextStyles = {
23218
23232
  color: 'var(--theme-secondary)',
23219
- marginLeft: '32px' // Align with checkbox + label
23233
+ marginLeft: '32px'
23220
23234
  };
23221
23235
  return jsxs(FormControl, {
23222
- ref: ref,
23223
- ...htmlProps,
23224
- ...styleProps,
23225
- ...(gridProps && {
23226
- 'data-grid-span': gridProps.span,
23227
- 'data-grid-xs': gridProps.xs,
23228
- 'data-grid-sm': gridProps.sm,
23229
- 'data-grid-md': gridProps.md,
23230
- 'data-grid-lg': gridProps.lg,
23231
- 'data-grid-xl': gridProps.xl
23232
- }),
23236
+ ...restProps,
23233
23237
  children: [jsx(FormControlLabel, {
23234
23238
  control: jsx(Checkbox, {
23235
23239
  checked: checked,
@@ -23245,30 +23249,31 @@ const FormCheckbox = /*#__PURE__*/React.forwardRef((props, ref) => {
23245
23249
  children: helperText
23246
23250
  })]
23247
23251
  });
23248
- });
23249
- FormCheckbox.displayName = 'FormCheckbox';
23250
- // Mark as QwickApp component
23251
- Object.assign(FormCheckbox, {
23252
- [QWICKAPP_COMPONENT]: true
23252
+ }
23253
+ /**
23254
+ * Create FormCheckbox component using the factory pattern
23255
+ */
23256
+ const FormCheckbox = createSerializableView({
23257
+ tagName: 'FormCheckbox',
23258
+ version: '1.0.0',
23259
+ role: 'input',
23260
+ View: FormCheckboxView
23253
23261
  });
23254
23262
 
23255
- const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23256
- const {
23257
- gridProps,
23258
- styleProps,
23259
- htmlProps,
23260
- restProps
23261
- } = useBaseProps(props);
23262
- const {
23263
- provider,
23264
- siteKey,
23265
- onVerify,
23266
- onExpire,
23267
- onError,
23268
- theme = 'light',
23269
- size = 'normal',
23270
- action = 'submit'
23271
- } = restProps;
23263
+ /**
23264
+ * CaptchaView - Pure view component that renders the CAPTCHA widget
23265
+ */
23266
+ function CaptchaView({
23267
+ provider,
23268
+ siteKey,
23269
+ onVerify,
23270
+ onExpire,
23271
+ onError,
23272
+ theme = 'light',
23273
+ size = 'normal',
23274
+ action = 'submit',
23275
+ ...restProps
23276
+ }) {
23272
23277
  const containerRef = useRef(null);
23273
23278
  const widgetIdRef = useRef(null);
23274
23279
  const [isLoaded, setIsLoaded] = useState(false);
@@ -23341,7 +23346,7 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23341
23346
  try {
23342
23347
  switch (provider) {
23343
23348
  case 'recaptcha-v2':
23344
- if (window.grecaptcha && window.grecaptcha.render) {
23349
+ if (window.grecaptcha?.render) {
23345
23350
  widgetIdRef.current = window.grecaptcha.render(containerRef.current, {
23346
23351
  sitekey: siteKey,
23347
23352
  callback: onVerify,
@@ -23358,7 +23363,7 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23358
23363
  break;
23359
23364
  case 'recaptcha-v3':
23360
23365
  // reCAPTCHA v3 is invisible and executes programmatically
23361
- if (window.grecaptcha && window.grecaptcha.execute) {
23366
+ if (window.grecaptcha?.execute) {
23362
23367
  window.grecaptcha.execute(siteKey, {
23363
23368
  action
23364
23369
  }).then(token => {
@@ -23370,7 +23375,7 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23370
23375
  }
23371
23376
  break;
23372
23377
  case 'hcaptcha':
23373
- if (window.hcaptcha && window.hcaptcha.render) {
23378
+ if (window.hcaptcha?.render) {
23374
23379
  widgetIdRef.current = window.hcaptcha.render(containerRef.current, {
23375
23380
  sitekey: siteKey,
23376
23381
  callback: onVerify,
@@ -23386,7 +23391,7 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23386
23391
  }
23387
23392
  break;
23388
23393
  case 'turnstile':
23389
- if (window.turnstile && window.turnstile.render) {
23394
+ if (window.turnstile?.render) {
23390
23395
  widgetIdRef.current = window.turnstile.render(containerRef.current, {
23391
23396
  sitekey: siteKey,
23392
23397
  callback: onVerify,
@@ -23437,20 +23442,10 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23437
23442
  return null;
23438
23443
  }
23439
23444
  return jsxs(Box, {
23440
- ref: ref,
23441
- ...htmlProps,
23445
+ ...restProps,
23442
23446
  sx: {
23443
- my: 2,
23444
- ...styleProps.sx
23447
+ my: 2
23445
23448
  },
23446
- ...(gridProps && {
23447
- 'data-grid-span': gridProps.span,
23448
- 'data-grid-xs': gridProps.xs,
23449
- 'data-grid-sm': gridProps.sm,
23450
- 'data-grid-md': gridProps.md,
23451
- 'data-grid-lg': gridProps.lg,
23452
- 'data-grid-xl': gridProps.xl
23453
- }),
23454
23449
  children: [error && jsx(Alert, {
23455
23450
  severity: "error",
23456
23451
  sx: {
@@ -23461,11 +23456,15 @@ const Captcha = /*#__PURE__*/React.forwardRef((props, ref) => {
23461
23456
  ref: containerRef
23462
23457
  })]
23463
23458
  });
23464
- });
23465
- Captcha.displayName = 'Captcha';
23466
- // Mark as QwickApp component
23467
- Object.assign(Captcha, {
23468
- [QWICKAPP_COMPONENT]: true
23459
+ }
23460
+ /**
23461
+ * Create Captcha component using the factory pattern
23462
+ */
23463
+ const Captcha = createSerializableView({
23464
+ tagName: 'Captcha',
23465
+ version: '1.0.0',
23466
+ role: 'input',
23467
+ View: CaptchaView
23469
23468
  });
23470
23469
 
23471
23470
  /**
@@ -24593,7 +24592,7 @@ const Scaffold = ({
24593
24592
  className: "appbar-right",
24594
24593
  children: [enhancedAppBar?.actions && jsx("div", {
24595
24594
  className: "appbar-actions",
24596
- children: enhancedAppBar.actions
24595
+ children: typeof enhancedAppBar.actions === 'function' ? enhancedAppBar.actions() : enhancedAppBar.actions
24597
24596
  }, "appbar-actions"), jsxs("div", {
24598
24597
  className: "appbar-theme-controls",
24599
24598
  children: [showThemeSwitcher && jsx(ThemeSwitcher, {}, "theme-switcher"), showPaletteSwitcher && jsx(PaletteSwitcher, {}, "palette-switcher")]
@@ -31064,6 +31063,240 @@ __decorate([Field(), Editor({
31064
31063
  }), IsOptional(), IsString(), __metadata("design:type", String)], FormBlockModel.prototype, "backgroundImage", void 0);
31065
31064
  FormBlockModel = __decorate([Schema('FormBlock', '1.0.0')], FormBlockModel);
31066
31065
 
31066
+ /**
31067
+ * Schema for FormSelect component - Themed dropdown select input
31068
+ *
31069
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
31070
+ */
31071
+ let FormSelectModel = class FormSelectModel extends ViewSchema$1 {};
31072
+ __decorate([Field(), Editor({
31073
+ field_type: FieldType.TEXT,
31074
+ label: 'Label',
31075
+ description: 'Label text for the select field',
31076
+ placeholder: 'Enter label...'
31077
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormSelectModel.prototype, "label", void 0);
31078
+ __decorate([Field(), Editor({
31079
+ field_type: FieldType.TEXT,
31080
+ label: 'Value',
31081
+ description: 'Current selected value',
31082
+ placeholder: ''
31083
+ }), IsString(), __metadata("design:type", Object)], FormSelectModel.prototype, "value", void 0);
31084
+ __decorate([Field(), Editor({
31085
+ field_type: FieldType.TEXTAREA,
31086
+ label: 'Options',
31087
+ description: 'Select options as JSON array: [{"value": "1", "label": "Option 1"}]',
31088
+ placeholder: '[{"value": "1", "label": "Option 1"}]'
31089
+ }), IsString(), __metadata("design:type", String)], FormSelectModel.prototype, "options", void 0);
31090
+ __decorate([Field(), Editor({
31091
+ field_type: FieldType.TEXT,
31092
+ label: 'Helper Text',
31093
+ description: 'Helper text displayed below the select',
31094
+ placeholder: 'Enter helper text...'
31095
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormSelectModel.prototype, "helperText", void 0);
31096
+ __decorate([Field({
31097
+ defaultValue: false
31098
+ }), Editor({
31099
+ field_type: FieldType.BOOLEAN,
31100
+ label: 'Required',
31101
+ description: 'Mark field as required'
31102
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormSelectModel.prototype, "required", void 0);
31103
+ __decorate([Field({
31104
+ defaultValue: false
31105
+ }), Editor({
31106
+ field_type: FieldType.BOOLEAN,
31107
+ label: 'Disabled',
31108
+ description: 'Disable the select field'
31109
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormSelectModel.prototype, "disabled", void 0);
31110
+ __decorate([Field({
31111
+ defaultValue: true
31112
+ }), Editor({
31113
+ field_type: FieldType.BOOLEAN,
31114
+ label: 'Full Width',
31115
+ description: 'Make select take full width of container'
31116
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormSelectModel.prototype, "fullWidth", void 0);
31117
+ __decorate([Field({
31118
+ defaultValue: 'small'
31119
+ }), Editor({
31120
+ field_type: FieldType.SELECT,
31121
+ label: 'Size',
31122
+ description: 'Size variant of the select field'
31123
+ }), IsOptional(), IsIn(['small', 'medium']), __metadata("design:type", String)], FormSelectModel.prototype, "size", void 0);
31124
+ __decorate([Field(), Editor({
31125
+ field_type: FieldType.TEXT,
31126
+ label: 'Placeholder',
31127
+ description: 'Placeholder text when no value is selected',
31128
+ placeholder: 'Select an option...'
31129
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormSelectModel.prototype, "placeholder", void 0);
31130
+ FormSelectModel = __decorate([Schema('FormSelect', '1.0.0')], FormSelectModel);
31131
+
31132
+ /**
31133
+ * Schema for FormField component - Themed text/number input field
31134
+ *
31135
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
31136
+ */
31137
+ let FormFieldModel = class FormFieldModel extends ViewSchema$1 {};
31138
+ __decorate([Field(), Editor({
31139
+ field_type: FieldType.TEXT,
31140
+ label: 'Label',
31141
+ description: 'Label text for the input field',
31142
+ placeholder: 'Enter label...'
31143
+ }), IsString(), __metadata("design:type", String)], FormFieldModel.prototype, "label", void 0);
31144
+ __decorate([Field(), Editor({
31145
+ field_type: FieldType.TEXT,
31146
+ label: 'Value',
31147
+ description: 'Current input value',
31148
+ placeholder: ''
31149
+ }), IsString(), __metadata("design:type", Object)], FormFieldModel.prototype, "value", void 0);
31150
+ __decorate([Field({
31151
+ defaultValue: 'text'
31152
+ }), Editor({
31153
+ field_type: FieldType.SELECT,
31154
+ label: 'Input Type',
31155
+ description: 'Type of input field'
31156
+ }), IsOptional(), IsIn(['text', 'number', 'password', 'email', 'tel']), __metadata("design:type", String)], FormFieldModel.prototype, "type", void 0);
31157
+ __decorate([Field(), Editor({
31158
+ field_type: FieldType.TEXT,
31159
+ label: 'Helper Text',
31160
+ description: 'Helper text displayed below the input',
31161
+ placeholder: 'Enter helper text...'
31162
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormFieldModel.prototype, "helperText", void 0);
31163
+ __decorate([Field({
31164
+ defaultValue: false
31165
+ }), Editor({
31166
+ field_type: FieldType.BOOLEAN,
31167
+ label: 'Required',
31168
+ description: 'Mark field as required'
31169
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormFieldModel.prototype, "required", void 0);
31170
+ __decorate([Field({
31171
+ defaultValue: false
31172
+ }), Editor({
31173
+ field_type: FieldType.BOOLEAN,
31174
+ label: 'Read Only',
31175
+ description: 'Make field read-only'
31176
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormFieldModel.prototype, "readOnly", void 0);
31177
+ __decorate([Field({
31178
+ defaultValue: false
31179
+ }), Editor({
31180
+ field_type: FieldType.BOOLEAN,
31181
+ label: 'Disabled',
31182
+ description: 'Disable the input field'
31183
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormFieldModel.prototype, "disabled", void 0);
31184
+ __decorate([Field(), Editor({
31185
+ field_type: FieldType.TEXT,
31186
+ label: 'Disabled Color',
31187
+ description: 'Custom color for disabled state (CSS color value)',
31188
+ placeholder: 'var(--theme-text-disabled)'
31189
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormFieldModel.prototype, "disabledColor", void 0);
31190
+ __decorate([Field({
31191
+ defaultValue: true
31192
+ }), Editor({
31193
+ field_type: FieldType.BOOLEAN,
31194
+ label: 'Full Width',
31195
+ description: 'Make input take full width of container'
31196
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormFieldModel.prototype, "fullWidth", void 0);
31197
+ __decorate([Field({
31198
+ defaultValue: false
31199
+ }), Editor({
31200
+ field_type: FieldType.BOOLEAN,
31201
+ label: 'Multiline',
31202
+ description: 'Enable multiline textarea mode'
31203
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormFieldModel.prototype, "multiline", void 0);
31204
+ __decorate([Field(), Editor({
31205
+ field_type: FieldType.TEXT,
31206
+ label: 'Rows',
31207
+ description: 'Number of rows for multiline textarea',
31208
+ placeholder: '4'
31209
+ }), IsOptional(), IsInt(), Min(1), __metadata("design:type", Number)], FormFieldModel.prototype, "rows", void 0);
31210
+ __decorate([Field(), Editor({
31211
+ field_type: FieldType.TEXT,
31212
+ label: 'Placeholder',
31213
+ description: 'Placeholder text',
31214
+ placeholder: 'Enter text...'
31215
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormFieldModel.prototype, "placeholder", void 0);
31216
+ FormFieldModel = __decorate([Schema('FormField', '1.0.0')], FormFieldModel);
31217
+
31218
+ /**
31219
+ * Schema for FormCheckbox component - Themed checkbox input
31220
+ *
31221
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
31222
+ */
31223
+ let FormCheckboxModel = class FormCheckboxModel extends ViewSchema$1 {};
31224
+ __decorate([Field(), Editor({
31225
+ field_type: FieldType.TEXT,
31226
+ label: 'Label',
31227
+ description: 'Label text for the checkbox',
31228
+ placeholder: 'Enter label...'
31229
+ }), IsString(), __metadata("design:type", String)], FormCheckboxModel.prototype, "label", void 0);
31230
+ __decorate([Field({
31231
+ defaultValue: false
31232
+ }), Editor({
31233
+ field_type: FieldType.BOOLEAN,
31234
+ label: 'Checked',
31235
+ description: 'Checkbox checked state'
31236
+ }), IsBoolean(), __metadata("design:type", Boolean)], FormCheckboxModel.prototype, "checked", void 0);
31237
+ __decorate([Field(), Editor({
31238
+ field_type: FieldType.TEXT,
31239
+ label: 'Helper Text',
31240
+ description: 'Helper text displayed below the checkbox',
31241
+ placeholder: 'Enter helper text...'
31242
+ }), IsOptional(), IsString(), __metadata("design:type", String)], FormCheckboxModel.prototype, "helperText", void 0);
31243
+ __decorate([Field({
31244
+ defaultValue: false
31245
+ }), Editor({
31246
+ field_type: FieldType.BOOLEAN,
31247
+ label: 'Required',
31248
+ description: 'Mark checkbox as required'
31249
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormCheckboxModel.prototype, "required", void 0);
31250
+ __decorate([Field({
31251
+ defaultValue: false
31252
+ }), Editor({
31253
+ field_type: FieldType.BOOLEAN,
31254
+ label: 'Disabled',
31255
+ description: 'Disable the checkbox'
31256
+ }), IsOptional(), IsBoolean(), __metadata("design:type", Boolean)], FormCheckboxModel.prototype, "disabled", void 0);
31257
+ FormCheckboxModel = __decorate([Schema('FormCheckbox', '1.0.0')], FormCheckboxModel);
31258
+
31259
+ /**
31260
+ * Schema for Captcha component - Universal CAPTCHA widget
31261
+ *
31262
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
31263
+ */
31264
+ let CaptchaModel = class CaptchaModel extends ViewSchema$1 {};
31265
+ __decorate([Field(), Editor({
31266
+ field_type: FieldType.SELECT,
31267
+ label: 'CAPTCHA Provider',
31268
+ description: 'Which CAPTCHA service to use'
31269
+ }), IsIn(['recaptcha-v2', 'recaptcha-v3', 'hcaptcha', 'turnstile']), __metadata("design:type", String)], CaptchaModel.prototype, "provider", void 0);
31270
+ __decorate([Field(), Editor({
31271
+ field_type: FieldType.TEXT,
31272
+ label: 'Site Key',
31273
+ description: 'Public site key from CAPTCHA provider',
31274
+ placeholder: 'Enter site key...'
31275
+ }), IsString(), __metadata("design:type", String)], CaptchaModel.prototype, "siteKey", void 0);
31276
+ __decorate([Field({
31277
+ defaultValue: 'light'
31278
+ }), Editor({
31279
+ field_type: FieldType.SELECT,
31280
+ label: 'Theme',
31281
+ description: 'CAPTCHA widget theme'
31282
+ }), IsOptional(), IsIn(['light', 'dark']), __metadata("design:type", String)], CaptchaModel.prototype, "theme", void 0);
31283
+ __decorate([Field({
31284
+ defaultValue: 'normal'
31285
+ }), Editor({
31286
+ field_type: FieldType.SELECT,
31287
+ label: 'Size',
31288
+ description: 'CAPTCHA widget size'
31289
+ }), IsOptional(), IsIn(['normal', 'compact', 'invisible']), __metadata("design:type", String)], CaptchaModel.prototype, "size", void 0);
31290
+ __decorate([Field({
31291
+ defaultValue: 'submit'
31292
+ }), Editor({
31293
+ field_type: FieldType.TEXT,
31294
+ label: 'Action',
31295
+ description: 'reCAPTCHA v3 action name',
31296
+ placeholder: 'submit'
31297
+ }), IsOptional(), IsString(), __metadata("design:type", String)], CaptchaModel.prototype, "action", void 0);
31298
+ CaptchaModel = __decorate([Schema('Captcha', '1.0.0')], CaptchaModel);
31299
+
31067
31300
  /**
31068
31301
  * FooterSection Schema - Defines data structure for footer sections
31069
31302
  *
@@ -33239,4 +33472,4 @@ __decorate([Field({
33239
33472
  }), IsOptional(), __metadata("design:type", Boolean)], PageTemplateSchema.prototype, "indexable", void 0);
33240
33473
  PageTemplateSchema = __decorate([Schema('PageTemplate', '1.0.0')], PageTemplateSchema);
33241
33474
 
33242
- export { AVAILABLE_PALETTES, AccessibilityProvider, ActionModel, ActionType, AllPalettes, AppConfig, AppConfigBuilder, Article, ArticleModel, Breadcrumbs, Button, Captcha, CardListGrid, CardListGridModel, ChoiceInputField, ChoiceInputFieldModel, Code, CodeModel, CollapsibleLayout, CollapsibleLayoutView, ComponentTransformer$1 as ComponentTransformer, Container$8 as Container, Content, ContentModel, CoverImageHeader, CoverImageHeaderModel, DataProvider, DataProxy, DataTable, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, DimensionsProvider, ErrorBoundary, FeatureCard, FeatureCardActionModel, FeatureCardModel, FeatureGrid, FeatureGridModel, FeatureItemModel, Footer, FooterItemModel, FooterModel, FooterSectionModel, FormBlock, FormBlockModel, FormCheckbox, FormField, FormMethod, FormPage, FormSelect, GalleryImageModel, GridCell, GridCellModel, GridLayout, GridLayoutModel, HeaderActionModel, HeroBlock, HeroBlockModel, Html, HtmlInputField, HtmlModel, Image, ImageGallery, ImageGalleryModel, ImageModel, Logo, Markdown, MarkdownModel, MetadataItemModel, ModelView, NavigationProvider, OptionSelector, OptionSelectorModel, Page, PageBannerHeader, PageBannerHeaderModel, PageTemplateSchema, PaletteAutumn, PaletteCosmic, PaletteDefault, PaletteOcean, PaletteProvider, PaletteSpring, PaletteSwitcher, PaletteSwitcherModel, PaletteWinter, PrintConfigSchema, PrintModeProvider, ProductCard, ProductCardActionModel, ProductCardModel, ProductLogo, ProductModel, QWICKAPP_COMPONENT, QwickApp, QwickAppsLogo, QwickIcon, ResponsiveMenu, SafeSpan, SafeSpanModel, Scaffold, SchemaFormRenderer, Section, SectionModel, SelectInputField, SelectOptionModel, StatCard, SwitchInputField, T, Text$1 as Text, TextField, TextInputField, TextInputFieldModel, TextModel, ThemeProvider, ThemeSwitcher, ThemeSwitcherModel, ViewSchema, animationConfigs, applyCustomPalette, clearManifestCache, clearPaletteCache, clearUserPalettePreference, clearUserThemePreference, configurePaletteLoader, createAppConfig, createModelViewClass, createPaletteFromCurrentTheme, createSerializableView, defaultCollapsibleLayoutProps, deleteCustomPalette, exportPalette, extractTextFromReactNode, getAvailablePalettes, getCSSVariable, getComputedTheme, getCurrentPalette, getCurrentTheme, getCustomPalettes, getIconComponent, getIconEmoji, getLogger, getPaletteConfig, getPaletteFromManifest, getPaletteName, getRegisteredIcons, getSystemTheme, getThemePerformanceStats, hasIcon, iconMap, importPalette, initializePalette, initializeTheme, isCollapsibleLayoutProps, isPaletteLoaded, loadPalette, loadPaletteManifest, loadUserPalettePreference, loadUserThemePreference, logThemePerformanceStats, loggers, preloadPalettes, registerCustomPalette, registerIcon, resetThemePerformanceStats, resolveDimension, resolveDimensions, resolveSpacing, resolveSpacingProps, saveCustomPalette, savePalettePreference, saveThemePreference, saveUserPalettePreference, saveUserThemePreference, setCSSVariable, setPalette, setTheme, spacingConfigs, t, toCssLength, useAccessibility, useBaseProps, useBreadcrumbs, useCollapsibleState, useData, useDataBinding, useDataContext, useDataProvider, useDimensions, useNavigation, usePageContext, usePalette, usePrintMode$1 as usePrintMode, usePrintMode as usePrintModeHook, useQwickApp, useResolveTemplate, useTemplate, useTheme, withAccessibility, withErrorBoundary };
33475
+ export { AVAILABLE_PALETTES, AccessibilityProvider, ActionModel, ActionType, AllPalettes, AppConfig, AppConfigBuilder, Article, ArticleModel, Breadcrumbs, Button, Captcha, CaptchaModel, CardListGrid, CardListGridModel, ChoiceInputField, ChoiceInputFieldModel, Code, CodeModel, CollapsibleLayout, CollapsibleLayoutView, ComponentTransformer$1 as ComponentTransformer, Container$8 as Container, Content, ContentModel, CoverImageHeader, CoverImageHeaderModel, DataProvider, DataProxy, DataTable, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, DimensionsProvider, ErrorBoundary, FeatureCard, FeatureCardActionModel, FeatureCardModel, FeatureGrid, FeatureGridModel, FeatureItemModel, Footer, FooterItemModel, FooterModel, FooterSectionModel, FormBlock, FormBlockModel, FormCheckbox, FormCheckboxModel, FormField, FormFieldModel, FormMethod, FormPage, FormSelect, FormSelectModel, GalleryImageModel, GridCell, GridCellModel, GridLayout, GridLayoutModel, HeaderActionModel, HeroBlock, HeroBlockModel, Html, HtmlInputField, HtmlModel, Image, ImageGallery, ImageGalleryModel, ImageModel, Logo, Markdown, MarkdownModel, MetadataItemModel, ModelView, NavigationProvider, OptionSelector, OptionSelectorModel, Page, PageBannerHeader, PageBannerHeaderModel, PageTemplateSchema, PaletteAutumn, PaletteBoutique, PaletteCosmic, PaletteDefault, PaletteOcean, PaletteProvider, PaletteSpring, PaletteSwitcher, PaletteSwitcherModel, PaletteWinter, PrintConfigSchema, PrintModeProvider, ProductCard, ProductCardActionModel, ProductCardModel, ProductLogo, ProductModel, QWICKAPP_COMPONENT, QwickApp, QwickAppsLogo, QwickIcon, ResponsiveMenu, SafeSpan, SafeSpanModel, Scaffold, SchemaFormRenderer, Section, SectionModel, SelectInputField, SelectOptionModel, StatCard, SwitchInputField, T, Text$1 as Text, TextField, TextInputField, TextInputFieldModel, TextModel, ThemeProvider, ThemeSwitcher, ThemeSwitcherModel, ViewSchema, animationConfigs, applyCustomPalette, clearManifestCache, clearPaletteCache, clearUserPalettePreference, clearUserThemePreference, configurePaletteLoader, createAppConfig, createModelViewClass, createPaletteFromCurrentTheme, createSerializableView, defaultCollapsibleLayoutProps, deleteCustomPalette, exportPalette, extractTextFromReactNode, getAvailablePalettes, getCSSVariable, getComputedTheme, getCurrentPalette, getCurrentTheme, getCustomPalettes, getIconComponent, getIconEmoji, getLogger, getPaletteConfig, getPaletteFromManifest, getPaletteName, getRegisteredIcons, getSystemTheme, getThemePerformanceStats, hasIcon, iconMap, importPalette, initializePalette, initializeTheme, isCollapsibleLayoutProps, isPaletteLoaded, loadPalette, loadPaletteManifest, loadUserPalettePreference, loadUserThemePreference, logThemePerformanceStats, loggers, preloadPalettes, registerCustomPalette, registerIcon, resetThemePerformanceStats, resolveDimension, resolveDimensions, resolveSpacing, resolveSpacingProps, saveCustomPalette, savePalettePreference, saveThemePreference, saveUserPalettePreference, saveUserThemePreference, setCSSVariable, setPalette, setTheme, spacingConfigs, t, toCssLength, useAccessibility, useBaseProps, useBreadcrumbs, useCollapsibleState, useData, useDataBinding, useDataContext, useDataProvider, useDimensions, useNavigation, usePageContext, usePalette, usePrintMode$1 as usePrintMode, usePrintMode as usePrintModeHook, useQwickApp, useResolveTemplate, useTemplate, useTheme, withAccessibility, withErrorBoundary };