@qwickapps/react-framework 1.4.7 → 1.4.9
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/QUICK_START_GUIDE.md +1 -1
- package/README.md +14 -4
- package/dist/index.css +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +255 -54
- package/dist/index.js +249 -48
- package/dist/src/components/Logo.d.ts.map +1 -1
- package/dist/src/components/ResponsiveMenu.d.ts.map +1 -1
- package/dist/src/components/SafeSpan.d.ts.map +1 -1
- package/dist/src/components/Scaffold.d.ts.map +1 -1
- package/dist/src/components/blocks/Article.d.ts.map +1 -1
- package/dist/src/components/blocks/Footer.d.ts.map +1 -1
- package/dist/src/components/blocks/Text.d.ts.map +1 -1
- package/dist/src/components/buttons/Button.d.ts +26 -10
- package/dist/src/components/buttons/Button.d.ts.map +1 -1
- package/dist/src/components/menu/MenuItem.d.ts +2 -2
- package/dist/src/components/menu/MenuItem.d.ts.map +1 -1
- package/dist/src/schemas/ButtonSchema.d.ts +3 -0
- package/dist/src/schemas/ButtonSchema.d.ts.map +1 -1
- package/dist/src/schemas/transformers/ComponentTransformer.d.ts.map +1 -1
- package/dist/src/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
- package/package.json +9 -1
- package/scripts/create-qwickapps-project.js +4 -2
- package/src/components/Html.tsx +1 -1
- package/src/components/Logo.tsx +2 -4
- package/src/components/QwickApp.css +19 -13
- package/src/components/ResponsiveMenu.tsx +12 -1
- package/src/components/SafeSpan.tsx +0 -1
- package/src/components/Scaffold.css +14 -0
- package/src/components/Scaffold.tsx +16 -2
- package/src/components/blocks/Article.tsx +78 -7
- package/src/components/blocks/CoverImageHeader.tsx +1 -1
- package/src/components/blocks/Footer.tsx +23 -23
- package/src/components/blocks/PageBannerHeader.tsx +1 -1
- package/src/components/blocks/Text.tsx +7 -4
- package/src/components/buttons/Button.tsx +189 -15
- package/src/components/menu/MenuItem.tsx +2 -2
- package/src/contexts/ThemeContext.tsx +1 -1
- package/src/schemas/ButtonSchema.ts +33 -0
- package/src/schemas/ViewSchema.ts +1 -1
- package/src/schemas/transformers/ComponentTransformer.ts +2 -8
- package/src/schemas/transformers/ReactNodeTransformer.ts +1 -2
- package/src/stories/Article.stories.tsx +1 -1
- package/src/stories/ChoiceInputField.stories.tsx +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../src/components/buttons/Button.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAuB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../src/components/buttons/Button.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAuB,MAAM,OAAO,CAAC;AAqC5C,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAA0B,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E;;;GAGG;AACH,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAkCrD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAUxF;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAGxB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAEhG,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AA6OF,eAAO,MAAM,MAAM,EAAE,qBAAqB,CAAC,WAAW,CA0BpD,CAAC;AAwEH,eAAe,MAAM,CAAC"}
|
|
@@ -11,8 +11,8 @@ export interface MenuItem {
|
|
|
11
11
|
id: string;
|
|
12
12
|
/** Display label for the menu item */
|
|
13
13
|
label: string;
|
|
14
|
-
/** Icon
|
|
15
|
-
icon?: React.ReactNode;
|
|
14
|
+
/** Icon name (string) or icon component (React.ReactNode) to display */
|
|
15
|
+
icon?: string | React.ReactNode;
|
|
16
16
|
/** Click handler for the menu item */
|
|
17
17
|
onClick?: () => void;
|
|
18
18
|
/** External link URL (if this is a link) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/MenuItem.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd
|
|
1
|
+
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../../../../src/components/menu/MenuItem.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -8,12 +8,15 @@ import { ViewSchema } from './ViewSchema';
|
|
|
8
8
|
export declare class ButtonModel extends ViewSchema {
|
|
9
9
|
label?: string;
|
|
10
10
|
variant?: 'primary' | 'secondary' | 'outlined' | 'text' | 'contained';
|
|
11
|
+
color?: 'primary' | 'secondary' | 'error' | 'warning' | 'info' | 'success';
|
|
11
12
|
buttonSize?: 'small' | 'medium' | 'large';
|
|
12
13
|
href?: string;
|
|
13
14
|
target?: '_blank' | '_self' | '_parent' | '_top';
|
|
14
15
|
disabled?: boolean;
|
|
15
16
|
loading?: boolean;
|
|
16
17
|
fullWidth?: boolean;
|
|
18
|
+
icon?: string;
|
|
19
|
+
endIcon?: string;
|
|
17
20
|
}
|
|
18
21
|
export default ButtonModel;
|
|
19
22
|
//# sourceMappingURL=ButtonSchema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ButtonSchema.d.ts","sourceRoot":"","sources":["../../../src/schemas/ButtonSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBACa,WAAY,SAAQ,UAAU;IAUzC,KAAK,CAAC,EAAE,MAAM,CAAC;IAWf,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;IAWtE,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAW1C,IAAI,CAAC,EAAE,MAAM,CAAC;IAWd,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAUjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAUnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAUlB,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ButtonSchema.d.ts","sourceRoot":"","sources":["../../../src/schemas/ButtonSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBACa,WAAY,SAAQ,UAAU;IAUzC,KAAK,CAAC,EAAE,MAAM,CAAC;IAWf,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;IAWtE,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAW3E,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAW1C,IAAI,CAAC,EAAE,MAAM,CAAC;IAWd,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAUjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAUnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAUlB,SAAS,CAAC,EAAE,OAAO,CAAC;IAWpB,IAAI,CAAC,EAAE,MAAM,CAAC;IAWd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentTransformer.d.ts","sourceRoot":"","sources":["../../../../src/schemas/transformers/ComponentTransformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAc,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAahE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,CAAC;AAcvD;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI5C;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,OAAO;IAI9B;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,uBAAuB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ComponentTransformer.d.ts","sourceRoot":"","sources":["../../../../src/schemas/transformers/ComponentTransformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAc,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAahE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,CAAC;AAcvD;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI5C;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,OAAO;IAI9B;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,uBAAuB,GAAG,IAAI;IA2BvE;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,MAAM;IAKvD;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE;IAe9E;;;;KAIC;IACD,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAQpC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAsC9B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAgE5B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAI/C;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA4BtC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,IAAI,MAAM,EAAE;IAI1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAOtE;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;OAIG;IACH,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAe/D;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAS/C;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsC/B;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;CAGzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactNodeTransformer.d.ts","sourceRoot":"","sources":["../../../../src/schemas/transformers/ReactNodeTransformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,SAAS,EAAiC,MAAM,OAAO,CAAC;AAG/E;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"ReactNodeTransformer.d.ts","sourceRoot":"","sources":["../../../../src/schemas/transformers/ReactNodeTransformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,SAAS,EAAiC,MAAM,OAAO,CAAC;AAG/E;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,GAAG;IAoEtC;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS;IA2CxC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAqB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAkBtC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAkB/B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAqBlC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qwickapps/react-framework",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Complete React framework with responsive navigation, flexible layouts, theming system, and reusable components for building modern applications.",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,6 +23,13 @@
|
|
|
23
23
|
"./dist/index.css": "./dist/index.css",
|
|
24
24
|
"./index.css": "./dist/index.css"
|
|
25
25
|
},
|
|
26
|
+
"sideEffects": [
|
|
27
|
+
"**/*.css",
|
|
28
|
+
"./src/schemas/transformers/registry.ts",
|
|
29
|
+
"./src/schemas/index.ts",
|
|
30
|
+
"./dist/schemas/transformers/registry.js",
|
|
31
|
+
"./dist/schemas/index.js"
|
|
32
|
+
],
|
|
26
33
|
"files": [
|
|
27
34
|
"dist",
|
|
28
35
|
"src",
|
|
@@ -41,6 +48,7 @@
|
|
|
41
48
|
"clean": "rm -rf dist node_modules .rollup.cache storybook-static",
|
|
42
49
|
"create-project": "node scripts/create-qwickapps-project.js",
|
|
43
50
|
"prepublishOnly": "npm run build",
|
|
51
|
+
"publish": "npm publish",
|
|
44
52
|
"storybook": "storybook dev -p 6006",
|
|
45
53
|
"build-storybook": "storybook build"
|
|
46
54
|
},
|
|
@@ -19,9 +19,11 @@ import { fileURLToPath } from 'url';
|
|
|
19
19
|
|
|
20
20
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
// When run as: npx @qwickapps/react-framework create my-project
|
|
23
|
+
// argv[0] = node, argv[1] = script, argv[2] = "create", argv[3] = "my-project"
|
|
24
|
+
const projectName = process.argv[3] || process.argv[2];
|
|
23
25
|
|
|
24
|
-
if (!projectName) {
|
|
26
|
+
if (!projectName || projectName === 'create') {
|
|
25
27
|
console.error('❌ Error: Please provide a project name');
|
|
26
28
|
console.log('Usage: npx @qwickapps/react-framework create my-app-name');
|
|
27
29
|
process.exit(1);
|
package/src/components/Html.tsx
CHANGED
|
@@ -194,7 +194,7 @@ export class Html extends ModelView<HtmlProps, HtmlModel> {
|
|
|
194
194
|
if (version !== Html.version) {
|
|
195
195
|
console.warn(`Version mismatch: Expected ${Html.version} but got ${version}`);
|
|
196
196
|
}
|
|
197
|
-
|
|
197
|
+
|
|
198
198
|
const { children, ...props } = data || {};
|
|
199
199
|
return <Html {...props} >{ComponentTransformer.deserialize(children)}</Html>;
|
|
200
200
|
}
|
package/src/components/Logo.tsx
CHANGED
|
@@ -325,7 +325,7 @@ function LogoView({
|
|
|
325
325
|
}
|
|
326
326
|
|
|
327
327
|
// If image is a React node, render it directly
|
|
328
|
-
return <div className="logo-image-container">{image}</div>;
|
|
328
|
+
return <div className="logo-image-container" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>{image}</div>;
|
|
329
329
|
};
|
|
330
330
|
|
|
331
331
|
// Determine layout based on image position
|
|
@@ -338,7 +338,7 @@ function LogoView({
|
|
|
338
338
|
fill="none"
|
|
339
339
|
xmlns="http://www.w3.org/2000/svg"
|
|
340
340
|
className={`logo-svg dynamic-logo ${sizeClass} ${variantClass}`.trim()}
|
|
341
|
-
style={{ height: `${height}px
|
|
341
|
+
style={{ height: `${height}px`, ...style }}
|
|
342
342
|
role="img"
|
|
343
343
|
aria-label={ariaLabel}
|
|
344
344
|
>
|
|
@@ -446,7 +446,6 @@ function Logo(props: LogoProps) {
|
|
|
446
446
|
|
|
447
447
|
// Show error state
|
|
448
448
|
if (error) {
|
|
449
|
-
console.error('Error loading logo:', error);
|
|
450
449
|
return (
|
|
451
450
|
<div style={{ color: 'red', textAlign: 'center', padding: '16px' }}>
|
|
452
451
|
Error loading logo: {error.message}
|
|
@@ -454,7 +453,6 @@ function Logo(props: LogoProps) {
|
|
|
454
453
|
);
|
|
455
454
|
}
|
|
456
455
|
|
|
457
|
-
console.log('Resolved props for Logo:', logoProps);
|
|
458
456
|
return <LogoView {...logoProps} />;
|
|
459
457
|
}
|
|
460
458
|
|
|
@@ -148,7 +148,7 @@ html[data-palette="autumn"][data-theme="dark"] {
|
|
|
148
148
|
|
|
149
149
|
/* Text palette - Warm light */
|
|
150
150
|
--palette-text-primary: #fef3c7;
|
|
151
|
-
--palette-text-secondary: #
|
|
151
|
+
--palette-text-secondary: #a8a29e;
|
|
152
152
|
--palette-text-disabled: rgba(254, 243, 199, 0.38);
|
|
153
153
|
--palette-text-inverted: #0c0a09;
|
|
154
154
|
|
|
@@ -322,7 +322,7 @@ html[data-palette="cosmic"][data-theme="dark"] {
|
|
|
322
322
|
|
|
323
323
|
/* Text palette - Starlight */
|
|
324
324
|
--palette-text-primary: #e0e7ff;
|
|
325
|
-
--palette-text-secondary: #
|
|
325
|
+
--palette-text-secondary: #a78bfa;
|
|
326
326
|
--palette-text-disabled: rgba(224, 231, 255, 0.38);
|
|
327
327
|
--palette-text-inverted: #0f0c29;
|
|
328
328
|
|
|
@@ -498,7 +498,7 @@ html[data-palette="default"][data-theme="dark"] {
|
|
|
498
498
|
|
|
499
499
|
/* Text palette */
|
|
500
500
|
--palette-text-primary: #ffffff;
|
|
501
|
-
--palette-text-secondary: #
|
|
501
|
+
--palette-text-secondary: #9ca3af;
|
|
502
502
|
--palette-text-disabled: rgba(255, 255, 255, 0.38);
|
|
503
503
|
--palette-text-inverted: #000000;
|
|
504
504
|
|
|
@@ -675,7 +675,7 @@ html[data-palette="ocean"][data-theme="dark"] {
|
|
|
675
675
|
|
|
676
676
|
/* Text palette - Phosphorescent */
|
|
677
677
|
--palette-text-primary: #cffafe;
|
|
678
|
-
--palette-text-secondary: #
|
|
678
|
+
--palette-text-secondary: #67e8f9;
|
|
679
679
|
--palette-text-disabled: rgba(207, 250, 254, 0.38);
|
|
680
680
|
--palette-text-inverted: #020617;
|
|
681
681
|
|
|
@@ -837,7 +837,7 @@ html[data-palette="spring"][data-theme="dark"] {
|
|
|
837
837
|
|
|
838
838
|
/* Text palette - Moonlit green */
|
|
839
839
|
--palette-text-primary: #dcfce7;
|
|
840
|
-
--palette-text-secondary: #
|
|
840
|
+
--palette-text-secondary: #86efac;
|
|
841
841
|
--palette-text-disabled: rgba(220, 252, 231, 0.38);
|
|
842
842
|
--palette-text-inverted: #0a120a;
|
|
843
843
|
|
|
@@ -1011,7 +1011,7 @@ html[data-palette="winter"][data-theme="dark"] {
|
|
|
1011
1011
|
|
|
1012
1012
|
/* Text palette - Snow and ice */
|
|
1013
1013
|
--palette-text-primary: #f8fafc;
|
|
1014
|
-
--palette-text-secondary: #
|
|
1014
|
+
--palette-text-secondary: #94a3b8;
|
|
1015
1015
|
--palette-text-disabled: rgba(248, 250, 252, 0.38);
|
|
1016
1016
|
--palette-text-inverted: #020617;
|
|
1017
1017
|
|
|
@@ -1191,7 +1191,7 @@ html[data-palette="autumn"][data-theme="dark"] {
|
|
|
1191
1191
|
|
|
1192
1192
|
/* Text palette */
|
|
1193
1193
|
--palette-text-primary: #fef3c7;
|
|
1194
|
-
--palette-text-secondary: #
|
|
1194
|
+
--palette-text-secondary: #a8a29e;
|
|
1195
1195
|
--palette-text-disabled: rgba(254, 243, 199, 0.38);
|
|
1196
1196
|
--palette-text-inverted: #0c0a09;
|
|
1197
1197
|
|
|
@@ -1349,8 +1349,8 @@ html[data-palette="autumn"][data-theme="dark"] {
|
|
|
1349
1349
|
--theme-link-hover: var(--palette-info-dark);
|
|
1350
1350
|
|
|
1351
1351
|
/* Code colors */
|
|
1352
|
-
--theme-code-bg: var(--palette-surface-
|
|
1353
|
-
--theme-code-text: var(--palette-
|
|
1352
|
+
--theme-code-bg: var(--palette-surface-main);
|
|
1353
|
+
--theme-code-text: var(--palette-primary);
|
|
1354
1354
|
|
|
1355
1355
|
/* MUI integration */
|
|
1356
1356
|
--theme-mui-label-bg: var(--palette-surface-main);
|
|
@@ -1398,7 +1398,7 @@ html[data-theme="light"] {
|
|
|
1398
1398
|
--theme-option-selected-text: var(--palette-primary-dark);
|
|
1399
1399
|
|
|
1400
1400
|
/* Code colors */
|
|
1401
|
-
--theme-code-
|
|
1401
|
+
--theme-code-text: var(--palette-primary-dark);
|
|
1402
1402
|
}
|
|
1403
1403
|
|
|
1404
1404
|
/* Dark theme specific adjustments */
|
|
@@ -1427,8 +1427,7 @@ html[data-theme="dark"] {
|
|
|
1427
1427
|
--theme-option-selected-text: var(--palette-primary-light);
|
|
1428
1428
|
|
|
1429
1429
|
/* Code colors */
|
|
1430
|
-
--theme-code-
|
|
1431
|
-
--theme-code-text: var(--palette-text-secondary);
|
|
1430
|
+
--theme-code-text: var(--palette-primary-light);
|
|
1432
1431
|
|
|
1433
1432
|
/* MUI integration */
|
|
1434
1433
|
--theme-mui-label-bg: rgb(41, 41, 41);
|
|
@@ -1465,4 +1464,11 @@ button:focus,
|
|
|
1465
1464
|
transition: none;
|
|
1466
1465
|
}
|
|
1467
1466
|
|
|
1468
|
-
|
|
1467
|
+
/* Improve standard element appearances */
|
|
1468
|
+
code, code.inline-code {
|
|
1469
|
+
font-family: 'Source Code Pro', monospace;
|
|
1470
|
+
background-color: var(--theme-code-bg) !important;
|
|
1471
|
+
color: var(--theme-code-text) !important;
|
|
1472
|
+
padding: 2px 4px;
|
|
1473
|
+
border-radius: 4px;
|
|
1474
|
+
}
|
|
@@ -20,6 +20,7 @@ import React, { useState, useEffect } from 'react';
|
|
|
20
20
|
import { WithBaseProps, useBaseProps, QWICKAPP_COMPONENT } from '../hooks/useBaseProps';
|
|
21
21
|
import { useQwickApp } from '../contexts/QwickAppContext';
|
|
22
22
|
import Logo from './Logo';
|
|
23
|
+
import { getIconComponent } from './buttons/Button';
|
|
23
24
|
import './ResponsiveMenu.css';
|
|
24
25
|
import { useSafeLocation, useSafeNavigate } from '../utils/reactUtils';
|
|
25
26
|
import { loggers } from '../utils/logger';
|
|
@@ -143,9 +144,19 @@ const ResponsiveMenu: React.FC<ResponsiveMenuProps> = (props) => {
|
|
|
143
144
|
}
|
|
144
145
|
};
|
|
145
146
|
|
|
147
|
+
// Transform icon string to component or use provided ReactNode
|
|
148
|
+
let displayIcon: React.ReactNode = null;
|
|
149
|
+
if (item.icon) {
|
|
150
|
+
if (typeof item.icon === 'string') {
|
|
151
|
+
displayIcon = getIconComponent(item.icon);
|
|
152
|
+
} else {
|
|
153
|
+
displayIcon = item.icon;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
146
157
|
const content = (
|
|
147
158
|
<>
|
|
148
|
-
{
|
|
159
|
+
{displayIcon && <span className="menu-item-icon">{displayIcon}</span>}
|
|
149
160
|
{!isCompact && <span className="menu-item-label">{item.label}</span>}
|
|
150
161
|
{item.badge && <span className="menu-item-badge">{item.badge}</span>}
|
|
151
162
|
</>
|
|
@@ -15,6 +15,14 @@
|
|
|
15
15
|
--rail-width-expanded: 280px;
|
|
16
16
|
--touch-target-size: 48px;
|
|
17
17
|
|
|
18
|
+
--menu-bg: var(--theme-surface);
|
|
19
|
+
--menu-text: var(--theme-on-surface);
|
|
20
|
+
--menu-hover: var(--theme-surface-variant);
|
|
21
|
+
--menu-active: var(--theme-primary);
|
|
22
|
+
--menu-active-text: var(--theme-on-primary);
|
|
23
|
+
--menu-border: var(--theme-outline-variant);
|
|
24
|
+
--menu-shadow: rgba(0, 0, 0, 0.1);
|
|
25
|
+
|
|
18
26
|
--scaffold-background: var(--theme-background);
|
|
19
27
|
--scaffold-surface: var(--theme-surface);
|
|
20
28
|
--scaffold-on-surface: var(--theme-on-surface);
|
|
@@ -92,6 +100,12 @@
|
|
|
92
100
|
gap: 8px;
|
|
93
101
|
}
|
|
94
102
|
|
|
103
|
+
.appbar-theme-controls {
|
|
104
|
+
display: flex;
|
|
105
|
+
align-items: center;
|
|
106
|
+
gap: 8px;
|
|
107
|
+
}
|
|
108
|
+
|
|
95
109
|
/* Menu button */
|
|
96
110
|
.menu-button {
|
|
97
111
|
display: flex;
|
|
@@ -22,6 +22,7 @@ import Logo from './Logo';
|
|
|
22
22
|
import ThemeSwitcher from './buttons/ThemeSwitcher';
|
|
23
23
|
import PaletteSwitcher from './buttons/PaletteSwitcher';
|
|
24
24
|
import { RadioButtonUnchecked as DefaultIcon } from '@mui/icons-material';
|
|
25
|
+
import { getIconComponent } from './buttons/Button';
|
|
25
26
|
import './Scaffold.css';
|
|
26
27
|
import { useSafeLocation, useSafeNavigate } from '../utils/reactUtils';
|
|
27
28
|
import { loggers } from '../utils/logger';
|
|
@@ -251,9 +252,22 @@ const Scaffold: React.FC<ScaffoldProps> = ({
|
|
|
251
252
|
}
|
|
252
253
|
};
|
|
253
254
|
|
|
254
|
-
//
|
|
255
|
+
// Transform icon string to component, or use provided ReactNode, or fallback to DefaultIcon
|
|
255
256
|
const needsIcon = variant !== 'drawer';
|
|
256
|
-
|
|
257
|
+
let displayIcon: React.ReactNode = null;
|
|
258
|
+
|
|
259
|
+
if (item.icon) {
|
|
260
|
+
// If icon is a string, transform it to component
|
|
261
|
+
if (typeof item.icon === 'string') {
|
|
262
|
+
displayIcon = getIconComponent(item.icon) || (needsIcon ? <DefaultIcon /> : null);
|
|
263
|
+
} else {
|
|
264
|
+
// If icon is already a React component, use it
|
|
265
|
+
displayIcon = item.icon;
|
|
266
|
+
}
|
|
267
|
+
} else if (needsIcon) {
|
|
268
|
+
// No icon provided, use default for primary navigation
|
|
269
|
+
displayIcon = <DefaultIcon />;
|
|
270
|
+
}
|
|
257
271
|
|
|
258
272
|
const content = (
|
|
259
273
|
<>
|
|
@@ -77,11 +77,13 @@ function ArticleView({
|
|
|
77
77
|
// Ensure proper width constraints for article content
|
|
78
78
|
maxWidth: '800px',
|
|
79
79
|
mx: 'auto',
|
|
80
|
+
p: 3,
|
|
80
81
|
// Header styling when headers are present
|
|
81
82
|
'& h1, & h2, & h3, & h4, & h5, & h6': {
|
|
82
83
|
maxWidth: '100%',
|
|
83
|
-
mb:
|
|
84
|
-
mt:
|
|
84
|
+
mb: 2,
|
|
85
|
+
mt: 3,
|
|
86
|
+
color: 'var(--theme-text-primary)',
|
|
85
87
|
'&:first-of-type': {
|
|
86
88
|
mt: 0
|
|
87
89
|
}
|
|
@@ -101,15 +103,85 @@ function ArticleView({
|
|
|
101
103
|
fontWeight: 600,
|
|
102
104
|
lineHeight: 1.4
|
|
103
105
|
},
|
|
106
|
+
'& h4': {
|
|
107
|
+
fontSize: '1.25rem',
|
|
108
|
+
fontWeight: 600,
|
|
109
|
+
lineHeight: 1.4,
|
|
110
|
+
mt: 2.5,
|
|
111
|
+
mb: 1.5
|
|
112
|
+
},
|
|
104
113
|
// Ensure paragraphs have proper spacing
|
|
105
114
|
'& p': {
|
|
106
|
-
mb:
|
|
107
|
-
lineHeight: 1.
|
|
115
|
+
mb: 2,
|
|
116
|
+
lineHeight: 1.8,
|
|
117
|
+
fontSize: '1.1rem',
|
|
118
|
+
color: 'var(--theme-text-primary)'
|
|
108
119
|
},
|
|
109
120
|
// Ensure lists have proper spacing
|
|
110
121
|
'& ul, & ol': {
|
|
111
|
-
mb:
|
|
112
|
-
pl:
|
|
122
|
+
mb: 2.5,
|
|
123
|
+
pl: 4,
|
|
124
|
+
'& li': {
|
|
125
|
+
mb: 1,
|
|
126
|
+
lineHeight: 1.8,
|
|
127
|
+
fontSize: '1.05rem',
|
|
128
|
+
color: 'var(--theme-text-primary)'
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
// Blockquote styling
|
|
132
|
+
'& blockquote': {
|
|
133
|
+
borderLeft: '4px solid var(--theme-primary)',
|
|
134
|
+
pl: 3,
|
|
135
|
+
pr: 2,
|
|
136
|
+
py: 2,
|
|
137
|
+
my: 3,
|
|
138
|
+
ml: 0,
|
|
139
|
+
mr: 0,
|
|
140
|
+
background: 'var(--theme-surface)',
|
|
141
|
+
borderRadius: '8px',
|
|
142
|
+
'& p': {
|
|
143
|
+
fontSize: '1.15rem',
|
|
144
|
+
fontStyle: 'italic',
|
|
145
|
+
lineHeight: 1.7,
|
|
146
|
+
mb: 1,
|
|
147
|
+
color: 'var(--theme-text-primary)'
|
|
148
|
+
},
|
|
149
|
+
'& cite': {
|
|
150
|
+
display: 'block',
|
|
151
|
+
fontSize: '0.95rem',
|
|
152
|
+
fontStyle: 'normal',
|
|
153
|
+
fontWeight: 600,
|
|
154
|
+
color: 'var(--theme-text-secondary)',
|
|
155
|
+
mt: 1
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// Strong/bold text
|
|
159
|
+
'& strong': {
|
|
160
|
+
fontWeight: 600,
|
|
161
|
+
color: 'var(--theme-text-primary)'
|
|
162
|
+
},
|
|
163
|
+
// Emphasis/italic text
|
|
164
|
+
'& em': {
|
|
165
|
+
fontStyle: 'italic',
|
|
166
|
+
color: 'var(--theme-text-primary)'
|
|
167
|
+
},
|
|
168
|
+
// Links
|
|
169
|
+
'& a': {
|
|
170
|
+
color: 'var(--theme-primary)',
|
|
171
|
+
textDecoration: 'none',
|
|
172
|
+
fontWeight: 500,
|
|
173
|
+
'&:hover': {
|
|
174
|
+
textDecoration: 'underline'
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
// Images and figures
|
|
178
|
+
'& figure': {
|
|
179
|
+
margin: '2rem 0',
|
|
180
|
+
'& img': {
|
|
181
|
+
maxWidth: '100%',
|
|
182
|
+
height: 'auto',
|
|
183
|
+
borderRadius: '8px'
|
|
184
|
+
}
|
|
113
185
|
},
|
|
114
186
|
...styleProps.sx
|
|
115
187
|
}}
|
|
@@ -221,7 +293,6 @@ function ArticleWithDataBinding(props: ArticleProps) {
|
|
|
221
293
|
return null;
|
|
222
294
|
}
|
|
223
295
|
|
|
224
|
-
console.log('Resolved props for Article:', articleProps);
|
|
225
296
|
return <ArticleView {...articleProps} />;
|
|
226
297
|
}
|
|
227
298
|
|
|
@@ -430,7 +430,7 @@ function CoverImageHeader(props: CoverImageHeaderProps) {
|
|
|
430
430
|
.map(action => ({
|
|
431
431
|
...action,
|
|
432
432
|
id: action.id as string,
|
|
433
|
-
onClick: () => console.
|
|
433
|
+
onClick: () => console.debug(`Action clicked: ${action.id}`) // Default handler for data-driven actions
|
|
434
434
|
}))
|
|
435
435
|
: [];
|
|
436
436
|
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
Divider,
|
|
17
17
|
Link,
|
|
18
18
|
Paper,
|
|
19
|
-
Typography,
|
|
20
19
|
useMediaQuery,
|
|
21
20
|
useTheme,
|
|
22
21
|
} from '@mui/material';
|
|
@@ -24,6 +23,7 @@ import { WithDataBinding } from '@qwickapps/schema';
|
|
|
24
23
|
import React from 'react';
|
|
25
24
|
import { QWICKAPP_COMPONENT, useBaseProps, useDataBinding, WithBaseProps } from '../../hooks';
|
|
26
25
|
import FooterModel from '../../schemas/FooterSchema';
|
|
26
|
+
import Text from './Text';
|
|
27
27
|
|
|
28
28
|
export interface FooterSection {
|
|
29
29
|
/** Unique identifier for the section */
|
|
@@ -64,7 +64,7 @@ interface FooterViewProps extends WithBaseProps {
|
|
|
64
64
|
showDivider?: boolean;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export interface FooterProps extends FooterViewProps, WithDataBinding {}
|
|
67
|
+
export interface FooterProps extends FooterViewProps, WithDataBinding { }
|
|
68
68
|
|
|
69
69
|
function FooterView({
|
|
70
70
|
sections = [],
|
|
@@ -77,21 +77,21 @@ function FooterView({
|
|
|
77
77
|
...restProps
|
|
78
78
|
}: FooterViewProps) {
|
|
79
79
|
const { gridProps, styleProps, htmlProps } = useBaseProps(restProps);
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
// Mark as QwickApp component
|
|
82
82
|
(FooterView as any)[QWICKAPP_COMPONENT] = true;
|
|
83
83
|
const theme = useTheme();
|
|
84
84
|
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
// Force vertical on mobile for better usability
|
|
87
87
|
const effectiveOrientation = isMobile ? 'vertical' : orientation;
|
|
88
88
|
|
|
89
89
|
const renderFooterItem = (item: FooterItem) => {
|
|
90
90
|
const content = (
|
|
91
|
-
<
|
|
91
|
+
<Text
|
|
92
92
|
variant="body2"
|
|
93
|
-
|
|
94
|
-
sx={{
|
|
93
|
+
customColor="var(--theme-text-secondary)"
|
|
94
|
+
sx={{
|
|
95
95
|
textDecoration: item.href ? 'none' : 'inherit',
|
|
96
96
|
'&:hover': item.href ? { color: 'primary.main' } : {},
|
|
97
97
|
cursor: item.href || item.onClick ? 'pointer' : 'default',
|
|
@@ -100,7 +100,7 @@ function FooterView({
|
|
|
100
100
|
onClick={item.onClick}
|
|
101
101
|
>
|
|
102
102
|
{item.label}
|
|
103
|
-
</
|
|
103
|
+
</Text>
|
|
104
104
|
);
|
|
105
105
|
|
|
106
106
|
if (item.href) {
|
|
@@ -128,17 +128,17 @@ function FooterView({
|
|
|
128
128
|
const renderSection = (section: FooterSection) => (
|
|
129
129
|
<Box key={section.id} sx={{ minWidth: 0 }}>
|
|
130
130
|
{section.title && (
|
|
131
|
-
<
|
|
131
|
+
<Text
|
|
132
132
|
variant="subtitle2"
|
|
133
133
|
component="h3"
|
|
134
|
-
sx={{
|
|
134
|
+
sx={{
|
|
135
135
|
fontWeight: 600,
|
|
136
|
-
mb: 1.5
|
|
137
|
-
color: 'text.primary'
|
|
136
|
+
mb: 1.5
|
|
138
137
|
}}
|
|
138
|
+
customColor="var(--theme-text-primary)"
|
|
139
139
|
>
|
|
140
140
|
{section.title}
|
|
141
|
-
</
|
|
141
|
+
</Text>
|
|
142
142
|
)}
|
|
143
143
|
<Box>
|
|
144
144
|
{section.items.map(item => renderFooterItem(item))}
|
|
@@ -214,8 +214,8 @@ function FooterView({
|
|
|
214
214
|
>
|
|
215
215
|
{/* Logo/Branding Section */}
|
|
216
216
|
{logo && (
|
|
217
|
-
<Box
|
|
218
|
-
sx={{
|
|
217
|
+
<Box
|
|
218
|
+
sx={{
|
|
219
219
|
flexShrink: 0,
|
|
220
220
|
mb: effectiveOrientation === 'vertical' ? 2 : 0,
|
|
221
221
|
mr: effectiveOrientation === 'horizontal' ? 'auto' : 0
|
|
@@ -263,14 +263,14 @@ function FooterView({
|
|
|
263
263
|
}}
|
|
264
264
|
>
|
|
265
265
|
{copyright && (
|
|
266
|
-
<
|
|
266
|
+
<Text variant="caption" customColor='var(--theme-text-secondary)'>
|
|
267
267
|
{copyright}
|
|
268
|
-
</
|
|
268
|
+
</Text>
|
|
269
269
|
)}
|
|
270
270
|
{legalText && (
|
|
271
|
-
<
|
|
271
|
+
<Text variant="caption" customColor="var(--theme-text-secondary)">
|
|
272
272
|
{legalText}
|
|
273
|
-
</
|
|
273
|
+
</Text>
|
|
274
274
|
)}
|
|
275
275
|
</Box>
|
|
276
276
|
</Box>
|
|
@@ -308,9 +308,9 @@ function Footer(props: FooterProps) {
|
|
|
308
308
|
textAlign: 'center'
|
|
309
309
|
}}
|
|
310
310
|
>
|
|
311
|
-
<
|
|
311
|
+
<Text variant="body2" customColor="var(--theme-text-secondary)">
|
|
312
312
|
Loading Footer...
|
|
313
|
-
</
|
|
313
|
+
</Text>
|
|
314
314
|
</Box>
|
|
315
315
|
);
|
|
316
316
|
}
|
|
@@ -328,9 +328,9 @@ function Footer(props: FooterProps) {
|
|
|
328
328
|
textAlign: 'center'
|
|
329
329
|
}}
|
|
330
330
|
>
|
|
331
|
-
<
|
|
331
|
+
<Text variant="body2" customColor='var(--theme-error)' >
|
|
332
332
|
Error Loading Footer: {error.message}
|
|
333
|
-
</
|
|
333
|
+
</Text>
|
|
334
334
|
</Box>
|
|
335
335
|
);
|
|
336
336
|
}
|
|
@@ -407,7 +407,7 @@ function PageBannerHeader(props: PageBannerHeaderProps) {
|
|
|
407
407
|
destructive: action.destructive,
|
|
408
408
|
priority: action.priority,
|
|
409
409
|
onClick: () => {
|
|
410
|
-
console.
|
|
410
|
+
console.debug(`Action clicked: ${action.id} - ${action.label}`);
|
|
411
411
|
// In a real app, this would dispatch events or call configured handlers
|
|
412
412
|
}
|
|
413
413
|
}));
|