@qwickapps/react-framework 1.4.8 → 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.
Files changed (42) hide show
  1. package/README.md +13 -3
  2. package/dist/index.css +1 -1
  3. package/dist/index.esm.css +1 -1
  4. package/dist/index.esm.js +255 -54
  5. package/dist/index.js +249 -48
  6. package/dist/src/components/Logo.d.ts.map +1 -1
  7. package/dist/src/components/ResponsiveMenu.d.ts.map +1 -1
  8. package/dist/src/components/SafeSpan.d.ts.map +1 -1
  9. package/dist/src/components/Scaffold.d.ts.map +1 -1
  10. package/dist/src/components/blocks/Article.d.ts.map +1 -1
  11. package/dist/src/components/blocks/Footer.d.ts.map +1 -1
  12. package/dist/src/components/blocks/Text.d.ts.map +1 -1
  13. package/dist/src/components/buttons/Button.d.ts +26 -10
  14. package/dist/src/components/buttons/Button.d.ts.map +1 -1
  15. package/dist/src/components/menu/MenuItem.d.ts +2 -2
  16. package/dist/src/components/menu/MenuItem.d.ts.map +1 -1
  17. package/dist/src/schemas/ButtonSchema.d.ts +3 -0
  18. package/dist/src/schemas/ButtonSchema.d.ts.map +1 -1
  19. package/dist/src/schemas/transformers/ComponentTransformer.d.ts.map +1 -1
  20. package/dist/src/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
  21. package/package.json +9 -1
  22. package/src/components/Html.tsx +1 -1
  23. package/src/components/Logo.tsx +2 -4
  24. package/src/components/QwickApp.css +19 -13
  25. package/src/components/ResponsiveMenu.tsx +12 -1
  26. package/src/components/SafeSpan.tsx +0 -1
  27. package/src/components/Scaffold.css +14 -0
  28. package/src/components/Scaffold.tsx +16 -2
  29. package/src/components/blocks/Article.tsx +78 -7
  30. package/src/components/blocks/CoverImageHeader.tsx +1 -1
  31. package/src/components/blocks/Footer.tsx +23 -23
  32. package/src/components/blocks/PageBannerHeader.tsx +1 -1
  33. package/src/components/blocks/Text.tsx +7 -4
  34. package/src/components/buttons/Button.tsx +189 -15
  35. package/src/components/menu/MenuItem.tsx +2 -2
  36. package/src/contexts/ThemeContext.tsx +1 -1
  37. package/src/schemas/ButtonSchema.ts +33 -0
  38. package/src/schemas/ViewSchema.ts +1 -1
  39. package/src/schemas/transformers/ComponentTransformer.ts +2 -8
  40. package/src/schemas/transformers/ReactNodeTransformer.ts +1 -2
  41. package/src/stories/Article.stories.tsx +1 -1
  42. 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;AAG5C,OAAO,EAA0B,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,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,MAAM,WAAW,WAAY,SAAQ,SAAS;IAE5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;IACtE,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAoLD,eAAO,MAAM,MAAM,EAAE,qBAAqB,CAAC,WAAW,CAMpD,CAAC;AAwEH,eAAe,MAAM,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 component or JSX element to display */
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,+CAA+C;IAC/C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,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"}
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;CACrB;AAED,eAAe,WAAW,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;IA4BvE;;;;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;IAqE5B;;;;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
+ {"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;IAqEtC;;;;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"}
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.8",
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
  },
@@ -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
- console.log(`TEST: Creating ${tagName} - ${version} from JSON:`, jsonData);
197
+
198
198
  const { children, ...props } = data || {};
199
199
  return <Html {...props} >{ComponentTransformer.deserialize(children)}</Html>;
200
200
  }
@@ -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: #d6d3d1;
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: #c4b5fd;
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: #b0b0b0;
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: #a5f3fc;
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: #bbf7d0;
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: #cbd5e1;
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: #d6d3d1;
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-variant);
1353
- --theme-code-text: var(--palette-text-primary);
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-bg: rgba(0, 0, 0, 0.1);
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-bg: rgba(255, 255, 255, 0.1);
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
- {item.icon && <span className="menu-item-icon">{item.icon}</span>}
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
  </>
@@ -171,7 +171,6 @@ function SafeSpanWithDataBinding(props: SafeSpanProps) {
171
171
  return null;
172
172
  }
173
173
 
174
- console.log('Resolved props for SafeSpan:', safeSpanProps);
175
174
  return <SafeSpanView {...safeSpanProps} />;
176
175
  }
177
176
 
@@ -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
- // For primary navigation (bottom, rail, appbar), enforce icon requirement
255
+ // Transform icon string to component, or use provided ReactNode, or fallback to DefaultIcon
255
256
  const needsIcon = variant !== 'drawer';
256
- const displayIcon = item.icon || (needsIcon ? <DefaultIcon /> : null);
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: 1.5,
84
- mt: 2,
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: 1.5,
107
- lineHeight: 1.6
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: 1.5,
112
- pl: 3
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.log(`Action clicked: ${action.id}`) // Default handler for data-driven actions
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
- <Typography
91
+ <Text
92
92
  variant="body2"
93
- color="text.secondary"
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
- </Typography>
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
- <Typography
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
- </Typography>
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
- <Typography variant="caption" color="text.secondary">
266
+ <Text variant="caption" customColor='var(--theme-text-secondary)'>
267
267
  {copyright}
268
- </Typography>
268
+ </Text>
269
269
  )}
270
270
  {legalText && (
271
- <Typography variant="caption" color="text.secondary">
271
+ <Text variant="caption" customColor="var(--theme-text-secondary)">
272
272
  {legalText}
273
- </Typography>
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
- <Typography variant="body2" color="text.secondary">
311
+ <Text variant="body2" customColor="var(--theme-text-secondary)">
312
312
  Loading Footer...
313
- </Typography>
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
- <Typography variant="body2" color="error">
331
+ <Text variant="body2" customColor='var(--theme-error)' >
332
332
  Error Loading Footer: {error.message}
333
- </Typography>
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.log(`Action clicked: ${action.id} - ${action.label}`);
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
  }));
@@ -140,7 +140,8 @@ export const Text: SerializableComponent<TextProps> = createSerializableView<Tex
140
140
  (Text as any).transformParagraph = (element: Element): any => {
141
141
  return {
142
142
  tagName: 'Text',
143
- props: {
143
+ version: '1.0.0',
144
+ data: {
144
145
  variant: 'body1',
145
146
  component: 'p',
146
147
  content: element.textContent || ''
@@ -152,7 +153,7 @@ export const Text: SerializableComponent<TextProps> = createSerializableView<Tex
152
153
  (Text as any).transformHeading = (element: Element, tagName: string): any => {
153
154
  const variantMap: { [key: string]: string } = {
154
155
  'h1': 'h1',
155
- 'h2': 'h2',
156
+ 'h2': 'h2',
156
157
  'h3': 'h3',
157
158
  'h4': 'h4',
158
159
  'h5': 'h5',
@@ -161,7 +162,8 @@ export const Text: SerializableComponent<TextProps> = createSerializableView<Tex
161
162
 
162
163
  return {
163
164
  tagName: 'Text',
164
- props: {
165
+ version: '1.0.0',
166
+ data: {
165
167
  variant: variantMap[tagName] || 'h4',
166
168
  component: tagName,
167
169
  content: element.textContent || ''
@@ -173,7 +175,8 @@ export const Text: SerializableComponent<TextProps> = createSerializableView<Tex
173
175
  (Text as any).transformSpan = (element: Element): any => {
174
176
  return {
175
177
  tagName: 'Text',
176
- props: {
178
+ version: '1.0.0',
179
+ data: {
177
180
  variant: 'body2',
178
181
  component: 'span',
179
182
  content: element.textContent || ''