@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.
- package/dist/components/Html.d.ts.map +1 -1
- package/dist/components/blocks/HeroSlideshow.d.ts +54 -0
- package/dist/components/blocks/HeroSlideshow.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +2 -0
- package/dist/components/blocks/index.d.ts.map +1 -1
- package/dist/components/forms/FormField.d.ts +2 -0
- package/dist/components/forms/FormField.d.ts.map +1 -1
- package/dist/components/forms/FormSelect.d.ts +2 -0
- package/dist/components/forms/FormSelect.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +189 -42
- package/dist/index.js +189 -41
- package/dist/palettes/manifest.json +22 -22
- package/package.json +3 -3
- package/src/components/Scaffold.css +3 -0
- package/dist/palettes/palette-autumn.1.8.1.css +0 -174
- package/dist/palettes/palette-autumn.1.8.1.min.css +0 -1
- package/dist/palettes/palette-boutique.1.8.1.css +0 -176
- package/dist/palettes/palette-boutique.1.8.1.min.css +0 -1
- package/dist/palettes/palette-cosmic.1.8.1.css +0 -174
- package/dist/palettes/palette-cosmic.1.8.1.min.css +0 -1
- package/dist/palettes/palette-default.1.8.1.css +0 -178
- package/dist/palettes/palette-default.1.8.1.min.css +0 -1
- package/dist/palettes/palette-ocean.1.8.1.css +0 -174
- package/dist/palettes/palette-ocean.1.8.1.min.css +0 -1
- package/dist/palettes/palette-spring.1.8.1.css +0 -168
- package/dist/palettes/palette-spring.1.8.1.min.css +0 -1
- package/dist/palettes/palette-winter.1.8.1.css +0 -174
- package/dist/palettes/palette-winter.1.8.1.min.css +0 -1
- /package/dist/palettes/{palette-autumn.1.8.0.css → palette-autumn.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-autumn.1.8.0.min.css → palette-autumn.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-boutique.1.8.0.css → palette-boutique.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-boutique.1.8.0.min.css → palette-boutique.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-cosmic.1.8.0.css → palette-cosmic.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-cosmic.1.8.0.min.css → palette-cosmic.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-default.1.8.0.css → palette-default.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-default.1.8.0.min.css → palette-default.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-ocean.1.8.0.css → palette-ocean.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-ocean.1.8.0.min.css → palette-ocean.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-spring.1.8.0.css → palette-spring.1.9.1.css} +0 -0
- /package/dist/palettes/{palette-spring.1.8.0.min.css → palette-spring.1.9.1.min.css} +0 -0
- /package/dist/palettes/{palette-winter.1.8.0.css → palette-winter.1.9.1.css} +0 -0
- /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
|
|
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
|
|
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 ||
|
|
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 &&
|
|
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
|
|
16166
|
-
//
|
|
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) &&
|
|
16182
|
+
(has(allowedAttributesMap, name) &&
|
|
16183
|
+
allowedAttributesMap[name].indexOf(a) !== -1) ||
|
|
16178
16184
|
(allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||
|
|
16179
|
-
(has(allowedAttributesGlobMap, name) &&
|
|
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 || [])
|
|
16224
|
-
|
|
16225
|
-
|
|
16226
|
-
|
|
16227
|
-
|
|
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 (
|
|
16253
|
-
|
|
16254
|
-
|
|
16255
|
-
|
|
16256
|
-
const
|
|
16257
|
-
|
|
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(
|
|
16326
|
+
value = filterClasses(
|
|
16327
|
+
value,
|
|
16328
|
+
deepmerge(allowedSpecificClasses, allowedWildcardClasses),
|
|
16329
|
+
allowedClassesGlobs
|
|
16330
|
+
);
|
|
16313
16331
|
} else {
|
|
16314
|
-
value = filterClasses(
|
|
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(
|
|
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) +
|
|
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] -
|
|
16604
|
-
*
|
|
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
|
|
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:
|
|
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
|
|
16655
|
-
* @param {array} allowedDeclarationsList
|
|
16656
|
-
*
|
|
16657
|
-
* @
|
|
16658
|
-
* @property {string} attributeObject.
|
|
16659
|
-
* @property {string} attributeObject.
|
|
16660
|
-
* @
|
|
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]
|
|
16667
|
-
|
|
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
|
|
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.
|
|
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.
|
|
12
|
-
"file": "palette-default.1.
|
|
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.
|
|
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.
|
|
26
|
-
"file": "palette-autumn.1.
|
|
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.
|
|
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.
|
|
40
|
-
"file": "palette-boutique.1.
|
|
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.
|
|
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.
|
|
54
|
-
"file": "palette-cosmic.1.
|
|
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.
|
|
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.
|
|
68
|
-
"file": "palette-ocean.1.
|
|
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.
|
|
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.
|
|
82
|
-
"file": "palette-spring.1.
|
|
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.
|
|
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.
|
|
96
|
-
"file": "palette-winter.1.
|
|
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.
|
|
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.
|
|
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": "
|
|
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 =================== */
|