@qwickapps/react-framework 1.9.0 → 1.9.1

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 (44) hide show
  1. package/dist/components/Html.d.ts.map +1 -1
  2. package/dist/components/blocks/HeroSlideshow.d.ts +54 -0
  3. package/dist/components/blocks/HeroSlideshow.d.ts.map +1 -0
  4. package/dist/components/blocks/index.d.ts +2 -0
  5. package/dist/components/blocks/index.d.ts.map +1 -1
  6. package/dist/components/forms/FormField.d.ts +2 -0
  7. package/dist/components/forms/FormField.d.ts.map +1 -1
  8. package/dist/components/forms/FormSelect.d.ts +2 -0
  9. package/dist/components/forms/FormSelect.d.ts.map +1 -1
  10. package/dist/index.css +1 -1
  11. package/dist/index.esm.css +1 -1
  12. package/dist/index.esm.js +189 -42
  13. package/dist/index.js +189 -41
  14. package/dist/palettes/manifest.json +22 -22
  15. package/package.json +3 -3
  16. package/src/components/Scaffold.css +3 -0
  17. package/dist/palettes/palette-autumn.1.8.1.css +0 -174
  18. package/dist/palettes/palette-autumn.1.8.1.min.css +0 -1
  19. package/dist/palettes/palette-boutique.1.8.1.css +0 -176
  20. package/dist/palettes/palette-boutique.1.8.1.min.css +0 -1
  21. package/dist/palettes/palette-cosmic.1.8.1.css +0 -174
  22. package/dist/palettes/palette-cosmic.1.8.1.min.css +0 -1
  23. package/dist/palettes/palette-default.1.8.1.css +0 -178
  24. package/dist/palettes/palette-default.1.8.1.min.css +0 -1
  25. package/dist/palettes/palette-ocean.1.8.1.css +0 -174
  26. package/dist/palettes/palette-ocean.1.8.1.min.css +0 -1
  27. package/dist/palettes/palette-spring.1.8.1.css +0 -168
  28. package/dist/palettes/palette-spring.1.8.1.min.css +0 -1
  29. package/dist/palettes/palette-winter.1.8.1.css +0 -174
  30. package/dist/palettes/palette-winter.1.8.1.min.css +0 -1
  31. /package/dist/palettes/{palette-autumn.1.8.0.css → palette-autumn.1.9.1.css} +0 -0
  32. /package/dist/palettes/{palette-autumn.1.8.0.min.css → palette-autumn.1.9.1.min.css} +0 -0
  33. /package/dist/palettes/{palette-boutique.1.8.0.css → palette-boutique.1.9.1.css} +0 -0
  34. /package/dist/palettes/{palette-boutique.1.8.0.min.css → palette-boutique.1.9.1.min.css} +0 -0
  35. /package/dist/palettes/{palette-cosmic.1.8.0.css → palette-cosmic.1.9.1.css} +0 -0
  36. /package/dist/palettes/{palette-cosmic.1.8.0.min.css → palette-cosmic.1.9.1.min.css} +0 -0
  37. /package/dist/palettes/{palette-default.1.8.0.css → palette-default.1.9.1.css} +0 -0
  38. /package/dist/palettes/{palette-default.1.8.0.min.css → palette-default.1.9.1.min.css} +0 -0
  39. /package/dist/palettes/{palette-ocean.1.8.0.css → palette-ocean.1.9.1.css} +0 -0
  40. /package/dist/palettes/{palette-ocean.1.8.0.min.css → palette-ocean.1.9.1.min.css} +0 -0
  41. /package/dist/palettes/{palette-spring.1.8.0.css → palette-spring.1.9.1.css} +0 -0
  42. /package/dist/palettes/{palette-spring.1.8.0.min.css → palette-spring.1.9.1.min.css} +0 -0
  43. /package/dist/palettes/{palette-winter.1.8.0.css → palette-winter.1.9.1.css} +0 -0
  44. /package/dist/palettes/{palette-winter.1.8.0.min.css → palette-winter.1.9.1.min.css} +0 -0
package/dist/index.js CHANGED
@@ -5769,7 +5769,7 @@ function LogoView({
5769
5769
  setCalculatedBadgePosition(badgePos);
5770
5770
  setSvgWidth(requiredWidth);
5771
5771
  }
5772
- }, [name, badge, badgeOffset, calculateBadgePosition, fontSize, height, parseNameParts, svgWidth]);
5772
+ }, [name, badge, badgeOffset, calculateBadgePosition, fontSize, height, parseNameParts]);
5773
5773
  // Determine CSS class for variant
5774
5774
  let variantClass = '';
5775
5775
  if (variant === 'high-contrast' || variant === 'monochrome' || variant === 'on-primary') {
@@ -15935,7 +15935,8 @@ function sanitizeHtml(html, options, _recursing) {
15935
15935
  }
15936
15936
 
15937
15937
  let result = '';
15938
- // Used for hot swapping the result variable with an empty string in order to "capture" the text written to it.
15938
+ // Used for hot swapping the result variable with an empty string
15939
+ // in order to "capture" the text written to it.
15939
15940
  let tempResult = '';
15940
15941
 
15941
15942
  function Frame(tag, attribs) {
@@ -15966,7 +15967,8 @@ function sanitizeHtml(html, options, _recursing) {
15966
15967
  options.parser = Object.assign({}, htmlParserDefaults, options.parser);
15967
15968
 
15968
15969
  const tagAllowed = function (name) {
15969
- return options.allowedTags === false || (options.allowedTags || []).indexOf(name) > -1;
15970
+ return options.allowedTags === false ||
15971
+ (options.allowedTags || []).indexOf(name) > -1;
15970
15972
  };
15971
15973
 
15972
15974
  // vulnerableTags
@@ -16148,7 +16150,8 @@ function sanitizeHtml(html, options, _recursing) {
16148
16150
  }
16149
16151
 
16150
16152
  const isBeingEscaped = skip && (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape');
16151
- const shouldPreserveEscapedAttributes = isBeingEscaped && options.preserveEscapedAttributes;
16153
+ const shouldPreserveEscapedAttributes = isBeingEscaped &&
16154
+ options.preserveEscapedAttributes;
16152
16155
 
16153
16156
  if (shouldPreserveEscapedAttributes) {
16154
16157
  each(attribs, function(value, a) {
@@ -16162,8 +16165,10 @@ function sanitizeHtml(html, options, _recursing) {
16162
16165
  delete frame.attribs[a];
16163
16166
  return;
16164
16167
  }
16165
- // If the value is empty, check if the attribute is in the allowedEmptyAttributes array.
16166
- // If it is not in the allowedEmptyAttributes array, and it is a known non-boolean attribute, delete it
16168
+ // If the value is empty, check if the attribute is
16169
+ // in the allowedEmptyAttributes array.
16170
+ // If it is not in the allowedEmptyAttributes array,
16171
+ // and it is a known non-boolean attribute, delete it
16167
16172
  // List taken from https://html.spec.whatwg.org/multipage/indices.html#attributes-3
16168
16173
  if (value === '' && (!options.allowedEmptyAttributes.includes(a)) &&
16169
16174
  (options.nonBooleanAttributes.includes(a) || options.nonBooleanAttributes.includes('*'))) {
@@ -16174,9 +16179,11 @@ function sanitizeHtml(html, options, _recursing) {
16174
16179
  // as necessary if there are specific values defined.
16175
16180
  let passedAllowedAttributesMapCheck = false;
16176
16181
  if (!allowedAttributesMap ||
16177
- (has(allowedAttributesMap, name) && allowedAttributesMap[name].indexOf(a) !== -1) ||
16182
+ (has(allowedAttributesMap, name) &&
16183
+ allowedAttributesMap[name].indexOf(a) !== -1) ||
16178
16184
  (allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||
16179
- (has(allowedAttributesGlobMap, name) && allowedAttributesGlobMap[name].test(a)) ||
16185
+ (has(allowedAttributesGlobMap, name) &&
16186
+ allowedAttributesGlobMap[name].test(a)) ||
16180
16187
  (allowedAttributesGlobMap['*'] && allowedAttributesGlobMap['*'].test(a))) {
16181
16188
  passedAllowedAttributesMapCheck = true;
16182
16189
  } else if (allowedAttributesMap && allowedAttributesMap[name]) {
@@ -16220,12 +16227,14 @@ function sanitizeHtml(html, options, _recursing) {
16220
16227
  const parsed = parseUrl(value);
16221
16228
 
16222
16229
  if (options.allowedScriptHostnames || options.allowedScriptDomains) {
16223
- const allowedHostname = (options.allowedScriptHostnames || []).find(function (hostname) {
16224
- return hostname === parsed.url.hostname;
16225
- });
16226
- const allowedDomain = (options.allowedScriptDomains || []).find(function(domain) {
16227
- return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);
16228
- });
16230
+ const allowedHostname = (options.allowedScriptHostnames || [])
16231
+ .find(function (hostname) {
16232
+ return hostname === parsed.url.hostname;
16233
+ });
16234
+ const allowedDomain = (options.allowedScriptDomains || [])
16235
+ .find(function(domain) {
16236
+ return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);
16237
+ });
16229
16238
  allowed = allowedHostname || allowedDomain;
16230
16239
  }
16231
16240
  } catch (e) {
@@ -16249,13 +16258,18 @@ function sanitizeHtml(html, options, _recursing) {
16249
16258
  allowed = has(options, 'allowIframeRelativeUrls')
16250
16259
  ? options.allowIframeRelativeUrls
16251
16260
  : (!options.allowedIframeHostnames && !options.allowedIframeDomains);
16252
- } else if (options.allowedIframeHostnames || options.allowedIframeDomains) {
16253
- const allowedHostname = (options.allowedIframeHostnames || []).find(function (hostname) {
16254
- return hostname === parsed.url.hostname;
16255
- });
16256
- const allowedDomain = (options.allowedIframeDomains || []).find(function(domain) {
16257
- return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);
16258
- });
16261
+ } else if (
16262
+ options.allowedIframeHostnames ||
16263
+ options.allowedIframeDomains
16264
+ ) {
16265
+ const allowedHostname = (options.allowedIframeHostnames || [])
16266
+ .find(function (hostname) {
16267
+ return hostname === parsed.url.hostname;
16268
+ });
16269
+ const allowedDomain = (options.allowedIframeDomains || [])
16270
+ .find(function(domain) {
16271
+ return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);
16272
+ });
16259
16273
  allowed = allowedHostname || allowedDomain;
16260
16274
  }
16261
16275
  } catch (e) {
@@ -16309,9 +16323,17 @@ function sanitizeHtml(html, options, _recursing) {
16309
16323
  return t;
16310
16324
  });
16311
16325
  if (allowedSpecificClasses && allowedWildcardClasses) {
16312
- value = filterClasses(value, deepmerge(allowedSpecificClasses, allowedWildcardClasses), allowedClassesGlobs);
16326
+ value = filterClasses(
16327
+ value,
16328
+ deepmerge(allowedSpecificClasses, allowedWildcardClasses),
16329
+ allowedClassesGlobs
16330
+ );
16313
16331
  } else {
16314
- value = filterClasses(value, allowedSpecificClasses || allowedWildcardClasses, allowedClassesGlobs);
16332
+ value = filterClasses(
16333
+ value,
16334
+ allowedSpecificClasses || allowedWildcardClasses,
16335
+ allowedClassesGlobs
16336
+ );
16315
16337
  }
16316
16338
  if (!value.length) {
16317
16339
  delete frame.attribs[a];
@@ -16322,7 +16344,10 @@ function sanitizeHtml(html, options, _recursing) {
16322
16344
  if (options.parseStyleAttributes) {
16323
16345
  try {
16324
16346
  const abstractSyntaxTree = postcssParse(name + ' {' + value + '}', { map: false });
16325
- const filteredAST = filterCss(abstractSyntaxTree, options.allowedStyles);
16347
+ const filteredAST = filterCss(
16348
+ abstractSyntaxTree,
16349
+ options.allowedStyles
16350
+ );
16326
16351
 
16327
16352
  value = stringifyStyleAttributes(filteredAST);
16328
16353
 
@@ -16455,7 +16480,8 @@ function sanitizeHtml(html, options, _recursing) {
16455
16480
  tempResult = '';
16456
16481
  }
16457
16482
  // remove the opening tag from the result
16458
- result = result.substring(0, frame.tagPosition) + result.substring(frame.tagPosition + frame.openingTagLength);
16483
+ result = result.substring(0, frame.tagPosition) +
16484
+ result.substring(frame.tagPosition + frame.openingTagLength);
16459
16485
  return;
16460
16486
  } else if (filterResult) {
16461
16487
  result = result.substring(0, frame.tagPosition);
@@ -16490,6 +16516,16 @@ function sanitizeHtml(html, options, _recursing) {
16490
16516
  parser.write(html);
16491
16517
  parser.end();
16492
16518
 
16519
+ if (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape') {
16520
+ const lastParsedIndex = parser.endIndex;
16521
+ if (lastParsedIndex != null && lastParsedIndex >= 0 && lastParsedIndex < html.length) {
16522
+ const unparsed = html.substring(lastParsedIndex);
16523
+ result += escapeHtml(unparsed);
16524
+ } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === '') {
16525
+ result = escapeHtml(html);
16526
+ }
16527
+ }
16528
+
16493
16529
  return result;
16494
16530
 
16495
16531
  function initializeState() {
@@ -16600,8 +16636,10 @@ function sanitizeHtml(html, options, _recursing) {
16600
16636
  * Modifies the abstractSyntaxTree object.
16601
16637
  *
16602
16638
  * @param {object} abstractSyntaxTree - Object representation of CSS attributes.
16603
- * @property {array[Declaration]} abstractSyntaxTree.nodes[0] - Each object cointains prop and value key, i.e { prop: 'color', value: 'red' }.
16604
- * @param {object} allowedStyles - Keys are properties (i.e color), value is list of permitted regex rules (i.e /green/i).
16639
+ * @property {array[Declaration]} abstractSyntaxTree.nodes[0] -
16640
+ * Each object contains prop and value key, i.e { prop: 'color', value: 'red' }.
16641
+ * @param {object} allowedStyles - Keys are properties (i.e color),
16642
+ * value is list of permitted regex rules (i.e /green/i).
16605
16643
  * @return {object} - The modified tree.
16606
16644
  */
16607
16645
  function filterCss(abstractSyntaxTree, allowedStyles) {
@@ -16623,7 +16661,8 @@ function sanitizeHtml(html, options, _recursing) {
16623
16661
  }
16624
16662
 
16625
16663
  if (selectedRule) {
16626
- abstractSyntaxTree.nodes[0].nodes = astRules.nodes.reduce(filterDeclarations(selectedRule), []);
16664
+ abstractSyntaxTree.nodes[0].nodes = astRules.nodes
16665
+ .reduce(filterDeclarations(selectedRule), []);
16627
16666
  }
16628
16667
 
16629
16668
  return abstractSyntaxTree;
@@ -16634,7 +16673,8 @@ function sanitizeHtml(html, options, _recursing) {
16634
16673
  * values in the inline style attribute format.
16635
16674
  *
16636
16675
  * @param {AbstractSyntaxTree} filteredAST
16637
- * @return {string} - Example: "color:yellow;text-align:center !important;font-family:helvetica;"
16676
+ * @return {string} - Example:
16677
+ * "color:yellow;text-align:center !important;font-family:helvetica;"
16638
16678
  */
16639
16679
  function stringifyStyleAttributes(filteredAST) {
16640
16680
  return filteredAST.nodes[0].nodes
@@ -16651,21 +16691,25 @@ function sanitizeHtml(html, options, _recursing) {
16651
16691
  * Filters the existing attributes for the given property. Discards any attributes
16652
16692
  * which don't match the allowlist.
16653
16693
  *
16654
- * @param {object} selectedRule - Example: { color: red, font-family: helvetica }
16655
- * @param {array} allowedDeclarationsList - List of declarations which pass the allowlist.
16656
- * @param {object} attributeObject - Object representing the current css property.
16657
- * @property {string} attributeObject.type - Typically 'declaration'.
16658
- * @property {string} attributeObject.prop - The CSS property, i.e 'color'.
16659
- * @property {string} attributeObject.value - The corresponding value to the css property, i.e 'red'.
16660
- * @return {function} - When used in Array.reduce, will return an array of Declaration objects
16694
+ * @param {object} selectedRule - Example: { color: red, font-family: helvetica }
16695
+ * @param {array} allowedDeclarationsList - List of declarations
16696
+ * which pass the allowlist.
16697
+ * @param {object} attributeObject - Object representing the current css property.
16698
+ * @property {string} attributeObject.type - Typically 'declaration'.
16699
+ * @property {string} attributeObject.prop - The CSS property, i.e 'color'.
16700
+ * @property {string} attributeObject.value - The corresponding value to
16701
+ * the css property, i.e 'red'.
16702
+ * @return {function} - When used in Array.reduce,
16703
+ * will return an array of Declaration objects
16661
16704
  */
16662
16705
  function filterDeclarations(selectedRule) {
16663
16706
  return function (allowedDeclarationsList, attributeObject) {
16664
16707
  // If this property is allowlisted...
16665
16708
  if (has(selectedRule, attributeObject.prop)) {
16666
- const matchesRegex = selectedRule[attributeObject.prop].some(function(regularExpression) {
16667
- return regularExpression.test(attributeObject.value);
16668
- });
16709
+ const matchesRegex = selectedRule[attributeObject.prop]
16710
+ .some(function(regularExpression) {
16711
+ return regularExpression.test(attributeObject.value);
16712
+ });
16669
16713
 
16670
16714
  if (matchesRegex) {
16671
16715
  allowedDeclarationsList.push(attributeObject);
@@ -16797,7 +16841,7 @@ sanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) {
16797
16841
 
16798
16842
  return {
16799
16843
  tagName: newTagName,
16800
- attribs: attribs
16844
+ attribs
16801
16845
  };
16802
16846
  };
16803
16847
  };
@@ -18118,7 +18162,9 @@ function HtmlView({
18118
18162
  },
18119
18163
  ...styleProps.sx
18120
18164
  },
18121
- children: components
18165
+ children: Array.isArray(components) ? components.map((child, idx) => /*#__PURE__*/React.isValidElement(child) && child.key == null ? /*#__PURE__*/React.cloneElement(child, {
18166
+ key: `html-child-${idx}`
18167
+ }) : child) : components
18122
18168
  });
18123
18169
  } catch (error) {
18124
18170
  console.error('Error transforming HTML content:', error);
@@ -18953,6 +18999,103 @@ function registerSerializableComponents() {
18953
18999
  */
18954
19000
  registerSerializableComponents();
18955
19001
 
19002
+ /**
19003
+ * HeroSlideshow Component
19004
+ *
19005
+ * A slideshow built on top of HeroBlock that cycles through multiple slides
19006
+ * with auto-rotation, fade transitions, and progress dot navigation.
19007
+ *
19008
+ * Usage (props-driven, e.g. qwickdocs):
19009
+ * <HeroSlideshow slides={[{ title: 'Slide 1', ... }, ...]} />
19010
+ *
19011
+ * Usage (CMS-driven, e.g. work-macha):
19012
+ * const slideshow = await payload.findByID({ collection: 'hero-slideshows', id });
19013
+ * <HeroSlideshow slides={slideshow.slides} autoPlayInterval={slideshow.autoPlayInterval} />
19014
+ *
19015
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
19016
+ */
19017
+ const TRANSITION_DURATION = 300; // ms
19018
+ /**
19019
+ * HeroSlideshow - Cycles through HeroBlock slides with fade transitions
19020
+ */
19021
+ function HeroSlideshow({
19022
+ slides,
19023
+ autoPlayInterval = 5000,
19024
+ showDots = true,
19025
+ blockHeight = 'large',
19026
+ textAlign = 'center'
19027
+ }) {
19028
+ const [currentIndex, setCurrentIndex] = React.useState(0);
19029
+ const [isVisible, setIsVisible] = React.useState(true);
19030
+ const goToSlide = React.useCallback(index => {
19031
+ if (index === currentIndex) return;
19032
+ setIsVisible(false);
19033
+ setTimeout(() => {
19034
+ setCurrentIndex(index);
19035
+ setIsVisible(true);
19036
+ }, TRANSITION_DURATION);
19037
+ }, [currentIndex]);
19038
+ React.useEffect(() => {
19039
+ if (slides.length <= 1 || autoPlayInterval <= 0) return;
19040
+ const timer = setTimeout(() => {
19041
+ goToSlide((currentIndex + 1) % slides.length);
19042
+ }, autoPlayInterval);
19043
+ return () => clearTimeout(timer);
19044
+ }, [currentIndex, slides.length, autoPlayInterval, goToSlide]);
19045
+ if (!slides.length) return null;
19046
+ const slide = slides[currentIndex];
19047
+ return jsxRuntime.jsxs(material.Box, {
19048
+ sx: {
19049
+ position: 'relative',
19050
+ overflow: 'hidden'
19051
+ },
19052
+ children: [jsxRuntime.jsx(material.Box, {
19053
+ sx: {
19054
+ opacity: isVisible ? 1 : 0,
19055
+ transition: `opacity ${TRANSITION_DURATION}ms ease-in-out`
19056
+ },
19057
+ children: jsxRuntime.jsx(HeroBlock, {
19058
+ title: slide.title,
19059
+ subtitle: slide.subtitle,
19060
+ backgroundImage: slide.backgroundImage,
19061
+ backgroundGradient: slide.backgroundGradient,
19062
+ backgroundColor: slide.backgroundColor,
19063
+ actions: slide.actions,
19064
+ overlayOpacity: slide.overlayOpacity,
19065
+ blockHeight: blockHeight,
19066
+ textAlign: textAlign
19067
+ })
19068
+ }), showDots && slides.length > 1 && jsxRuntime.jsx(material.Box, {
19069
+ sx: {
19070
+ position: 'absolute',
19071
+ bottom: 20,
19072
+ left: '50%',
19073
+ transform: 'translateX(-50%)',
19074
+ display: 'flex',
19075
+ gap: 1,
19076
+ zIndex: 10
19077
+ },
19078
+ children: slides.map((_, index) => jsxRuntime.jsx(material.Box, {
19079
+ role: "button",
19080
+ "aria-label": `Go to slide ${index + 1}`,
19081
+ onClick: () => goToSlide(index),
19082
+ sx: {
19083
+ width: index === currentIndex ? 28 : 8,
19084
+ height: 8,
19085
+ borderRadius: 4,
19086
+ backgroundColor: 'rgba(255, 255, 255, 0.9)',
19087
+ opacity: index === currentIndex ? 1 : 0.45,
19088
+ cursor: 'pointer',
19089
+ transition: 'all 0.3s ease',
19090
+ '&:hover': {
19091
+ opacity: 0.8
19092
+ }
19093
+ }
19094
+ }, index))
19095
+ })]
19096
+ });
19097
+ }
19098
+
18956
19099
  // View component - handles the actual rendering
18957
19100
  function ArticleView({
18958
19101
  html = '',
@@ -23227,6 +23370,7 @@ function FormFieldView({
23227
23370
  startAdornment,
23228
23371
  endAdornment,
23229
23372
  inputProps,
23373
+ error,
23230
23374
  // Exclude ViewProps that conflict with MUI FormControl types
23231
23375
  margin: _margin,
23232
23376
  marginTop: _marginTop,
@@ -23281,6 +23425,7 @@ function FormFieldView({
23281
23425
  };
23282
23426
  return jsxRuntime.jsxs(material.FormControl, {
23283
23427
  fullWidth: fullWidth,
23428
+ error: error,
23284
23429
  ...restProps,
23285
23430
  children: [jsxRuntime.jsx(material.InputLabel, {
23286
23431
  htmlFor: fieldId,
@@ -23340,6 +23485,7 @@ function FormSelectView({
23340
23485
  size = 'small',
23341
23486
  placeholder,
23342
23487
  name,
23488
+ error,
23343
23489
  // Exclude ViewProps that conflict with MUI FormControl types
23344
23490
  margin: _margin,
23345
23491
  marginTop: _marginTop,
@@ -23383,6 +23529,7 @@ function FormSelectView({
23383
23529
  return jsxRuntime.jsxs(material.FormControl, {
23384
23530
  fullWidth: fullWidth,
23385
23531
  size: size,
23532
+ error: error,
23386
23533
  ...restProps,
23387
23534
  children: [label && jsxRuntime.jsx(material.InputLabel, {
23388
23535
  sx: labelStyles,
@@ -33761,6 +33908,7 @@ exports.GalleryImageModel = GalleryImageModel;
33761
33908
  exports.GridCell = GridCell;
33762
33909
  exports.GridLayout = GridLayout;
33763
33910
  exports.HeroBlock = HeroBlock;
33911
+ exports.HeroSlideshow = HeroSlideshow;
33764
33912
  exports.Html = Html;
33765
33913
  exports.HtmlInputField = HtmlInputField;
33766
33914
  exports.Image = Image;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./manifest.schema.json",
3
- "version": "1.8.1",
3
+ "version": "1.9.1",
4
4
  "palettes": [
5
5
  {
6
6
  "id": "default",
@@ -8,11 +8,11 @@
8
8
  "description": "Classic blue and neutral color scheme - the original QwickApps palette",
9
9
  "author": "QwickApps",
10
10
  "license": "PolyForm-Shield-1.0.0",
11
- "version": "1.8.1",
12
- "file": "palette-default.1.8.1.css",
11
+ "version": "1.9.1",
12
+ "file": "palette-default.1.9.1.css",
13
13
  "primaryColor": "#007bff",
14
14
  "inlined": true,
15
- "fileMinified": "palette-default.1.8.1.min.css",
15
+ "fileMinified": "palette-default.1.9.1.min.css",
16
16
  "fileLatest": "palette-default.latest.css",
17
17
  "fileLatestMinified": "palette-default.latest.min.css"
18
18
  },
@@ -22,11 +22,11 @@
22
22
  "description": "Warm oranges, golden yellows, and earthy browns - inspired by fall foliage",
23
23
  "author": "QwickApps",
24
24
  "license": "PolyForm-Shield-1.0.0",
25
- "version": "1.8.1",
26
- "file": "palette-autumn.1.8.1.css",
25
+ "version": "1.9.1",
26
+ "file": "palette-autumn.1.9.1.css",
27
27
  "primaryColor": "#ea580c",
28
28
  "inlined": false,
29
- "fileMinified": "palette-autumn.1.8.1.min.css",
29
+ "fileMinified": "palette-autumn.1.9.1.min.css",
30
30
  "fileLatest": "palette-autumn.latest.css",
31
31
  "fileLatestMinified": "palette-autumn.latest.min.css"
32
32
  },
@@ -36,11 +36,11 @@
36
36
  "description": "Sophisticated teal, bronze, and navy - perfect for premium retail and fashion brands",
37
37
  "author": "QwickApps",
38
38
  "license": "PolyForm-Shield-1.0.0",
39
- "version": "1.8.1",
40
- "file": "palette-boutique.1.8.1.css",
39
+ "version": "1.9.1",
40
+ "file": "palette-boutique.1.9.1.css",
41
41
  "primaryColor": "#3ca6b6",
42
42
  "inlined": false,
43
- "fileMinified": "palette-boutique.1.8.1.min.css",
43
+ "fileMinified": "palette-boutique.1.9.1.min.css",
44
44
  "fileLatest": "palette-boutique.latest.css",
45
45
  "fileLatestMinified": "palette-boutique.latest.min.css"
46
46
  },
@@ -50,11 +50,11 @@
50
50
  "description": "Modern purple gradient for creative and tech brands - inspired by cosmic nebulae",
51
51
  "author": "QwickApps",
52
52
  "license": "PolyForm-Shield-1.0.0",
53
- "version": "1.8.1",
54
- "file": "palette-cosmic.1.8.1.css",
53
+ "version": "1.9.1",
54
+ "file": "palette-cosmic.1.9.1.css",
55
55
  "primaryColor": "#8b5cf6",
56
56
  "inlined": false,
57
- "fileMinified": "palette-cosmic.1.8.1.min.css",
57
+ "fileMinified": "palette-cosmic.1.9.1.min.css",
58
58
  "fileLatest": "palette-cosmic.latest.css",
59
59
  "fileLatestMinified": "palette-cosmic.latest.min.css"
60
60
  },
@@ -64,11 +64,11 @@
64
64
  "description": "Deep blues, aqua teals, and seafoam greens - inspired by ocean depths",
65
65
  "author": "QwickApps",
66
66
  "license": "PolyForm-Shield-1.0.0",
67
- "version": "1.8.1",
68
- "file": "palette-ocean.1.8.1.css",
67
+ "version": "1.9.1",
68
+ "file": "palette-ocean.1.9.1.css",
69
69
  "primaryColor": "#0891b2",
70
70
  "inlined": false,
71
- "fileMinified": "palette-ocean.1.8.1.min.css",
71
+ "fileMinified": "palette-ocean.1.9.1.min.css",
72
72
  "fileLatest": "palette-ocean.latest.css",
73
73
  "fileLatestMinified": "palette-ocean.latest.min.css"
74
74
  },
@@ -78,11 +78,11 @@
78
78
  "description": "Fresh greens, soft pinks, and bright yellows - inspired by spring blooms",
79
79
  "author": "QwickApps",
80
80
  "license": "PolyForm-Shield-1.0.0",
81
- "version": "1.8.1",
82
- "file": "palette-spring.1.8.1.css",
81
+ "version": "1.9.1",
82
+ "file": "palette-spring.1.9.1.css",
83
83
  "primaryColor": "#16a34a",
84
84
  "inlined": false,
85
- "fileMinified": "palette-spring.1.8.1.min.css",
85
+ "fileMinified": "palette-spring.1.9.1.min.css",
86
86
  "fileLatest": "palette-spring.latest.css",
87
87
  "fileLatestMinified": "palette-spring.latest.min.css"
88
88
  },
@@ -92,11 +92,11 @@
92
92
  "description": "Cool blues, icy whites, and frosty grays - inspired by winter landscapes",
93
93
  "author": "QwickApps",
94
94
  "license": "PolyForm-Shield-1.0.0",
95
- "version": "1.8.1",
96
- "file": "palette-winter.1.8.1.css",
95
+ "version": "1.9.1",
96
+ "file": "palette-winter.1.9.1.css",
97
97
  "primaryColor": "#0077be",
98
98
  "inlined": false,
99
- "fileMinified": "palette-winter.1.8.1.min.css",
99
+ "fileMinified": "palette-winter.1.9.1.min.css",
100
100
  "fileLatest": "palette-winter.latest.css",
101
101
  "fileLatestMinified": "palette-winter.latest.min.css"
102
102
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@qwickapps/react-framework",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
4
4
  "description": "Complete React framework with responsive navigation, flexible layouts, theming system, and reusable components for building modern applications.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "bin": {
9
- "create": "./scripts/create-qwickapps-project.js"
9
+ "create": "scripts/create-qwickapps-project.js"
10
10
  },
11
11
  "exports": {
12
12
  ".": {
@@ -180,7 +180,7 @@
180
180
  },
181
181
  "repository": {
182
182
  "type": "git",
183
- "url": "https://github.com/qwickapps/react-framework.git"
183
+ "url": "git+https://github.com/qwickapps/react-framework.git"
184
184
  },
185
185
  "homepage": "https://github.com/qwickapps/react-framework#readme"
186
186
  }
@@ -458,6 +458,9 @@
458
458
  background: var(--scaffold-background);
459
459
  transition: padding 0.3s ease;
460
460
  box-sizing: border-box;
461
+ /* Establish stacking context below app bar to prevent content bleed-through on scroll (GH-1) */
462
+ position: relative;
463
+ z-index: 1;
461
464
  }
462
465
 
463
466
  /* =================== ANIMATIONS =================== */