@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.
Files changed (44) hide show
  1. package/QUICK_START_GUIDE.md +1 -1
  2. package/README.md +14 -4
  3. package/dist/index.css +1 -1
  4. package/dist/index.esm.css +1 -1
  5. package/dist/index.esm.js +255 -54
  6. package/dist/index.js +249 -48
  7. package/dist/src/components/Logo.d.ts.map +1 -1
  8. package/dist/src/components/ResponsiveMenu.d.ts.map +1 -1
  9. package/dist/src/components/SafeSpan.d.ts.map +1 -1
  10. package/dist/src/components/Scaffold.d.ts.map +1 -1
  11. package/dist/src/components/blocks/Article.d.ts.map +1 -1
  12. package/dist/src/components/blocks/Footer.d.ts.map +1 -1
  13. package/dist/src/components/blocks/Text.d.ts.map +1 -1
  14. package/dist/src/components/buttons/Button.d.ts +26 -10
  15. package/dist/src/components/buttons/Button.d.ts.map +1 -1
  16. package/dist/src/components/menu/MenuItem.d.ts +2 -2
  17. package/dist/src/components/menu/MenuItem.d.ts.map +1 -1
  18. package/dist/src/schemas/ButtonSchema.d.ts +3 -0
  19. package/dist/src/schemas/ButtonSchema.d.ts.map +1 -1
  20. package/dist/src/schemas/transformers/ComponentTransformer.d.ts.map +1 -1
  21. package/dist/src/schemas/transformers/ReactNodeTransformer.d.ts.map +1 -1
  22. package/package.json +9 -1
  23. package/scripts/create-qwickapps-project.js +4 -2
  24. package/src/components/Html.tsx +1 -1
  25. package/src/components/Logo.tsx +2 -4
  26. package/src/components/QwickApp.css +19 -13
  27. package/src/components/ResponsiveMenu.tsx +12 -1
  28. package/src/components/SafeSpan.tsx +0 -1
  29. package/src/components/Scaffold.css +14 -0
  30. package/src/components/Scaffold.tsx +16 -2
  31. package/src/components/blocks/Article.tsx +78 -7
  32. package/src/components/blocks/CoverImageHeader.tsx +1 -1
  33. package/src/components/blocks/Footer.tsx +23 -23
  34. package/src/components/blocks/PageBannerHeader.tsx +1 -1
  35. package/src/components/blocks/Text.tsx +7 -4
  36. package/src/components/buttons/Button.tsx +189 -15
  37. package/src/components/menu/MenuItem.tsx +2 -2
  38. package/src/contexts/ThemeContext.tsx +1 -1
  39. package/src/schemas/ButtonSchema.ts +33 -0
  40. package/src/schemas/ViewSchema.ts +1 -1
  41. package/src/schemas/transformers/ComponentTransformer.ts +2 -8
  42. package/src/schemas/transformers/ReactNodeTransformer.ts +1 -2
  43. package/src/stories/Article.stories.tsx +1 -1
  44. package/src/stories/ChoiceInputField.stories.tsx +2 -2
package/dist/index.js CHANGED
@@ -1545,7 +1545,7 @@ const ThemeProvider = ({
1545
1545
  const backgroundMain = getCSSCustomProperty('--theme-background') || (isDark ? '#121212' : '#ffffff');
1546
1546
  const surfaceMain = getCSSCustomProperty('--theme-surface') || (isDark ? '#1e1e1e' : '#ffffff');
1547
1547
  const textPrimary = getCSSCustomProperty('--theme-text-primary') || (isDark ? '#ffffff' : '#000000');
1548
- const textSecondary = getCSSCustomProperty('--theme-text-secondary') || (isDark ? '#000000' : '#ffffff');
1548
+ const textSecondary = getCSSCustomProperty('--theme-text-secondary') || (isDark ? 'rgba(255, 255, 255, 0.7)' : 'rgba(0, 0, 0, 0.6)');
1549
1549
  const textDisabled = getCSSCustomProperty('--theme-on-disabled') || (isDark ? 'rgba(255, 255, 255, 0.38)' : 'rgba(0, 0, 0, 0.38)');
1550
1550
  return styles.createTheme({
1551
1551
  palette: {
@@ -2650,11 +2650,64 @@ Code.transformCodeHighlight = element => {
2650
2650
  };
2651
2651
  };
2652
2652
 
2653
+ /**
2654
+ * Icon name to Material-UI icon component mapping
2655
+ * Used by finalize function to transform icon string names to React components
2656
+ */
2657
+ const iconRegistry = {
2658
+ home: iconsMaterial.Home,
2659
+ download: iconsMaterial.Download,
2660
+ clouddownload: iconsMaterial.CloudDownload,
2661
+ cloudupload: iconsMaterial.CloudUpload,
2662
+ settings: iconsMaterial.Settings,
2663
+ dashboard: iconsMaterial.Dashboard,
2664
+ info: iconsMaterial.Info,
2665
+ help: iconsMaterial.Help,
2666
+ add: iconsMaterial.Add,
2667
+ edit: iconsMaterial.Edit,
2668
+ delete: iconsMaterial.Delete,
2669
+ check: iconsMaterial.Check,
2670
+ close: iconsMaterial.Close,
2671
+ arrowforward: iconsMaterial.ArrowForward,
2672
+ arrowback: iconsMaterial.ArrowBack,
2673
+ menu: iconsMaterial.Menu,
2674
+ search: iconsMaterial.Search,
2675
+ favorite: iconsMaterial.Favorite,
2676
+ star: iconsMaterial.Star,
2677
+ share: iconsMaterial.Share,
2678
+ save: iconsMaterial.Save,
2679
+ send: iconsMaterial.Send,
2680
+ email: iconsMaterial.Email,
2681
+ phone: iconsMaterial.Phone,
2682
+ person: iconsMaterial.Person,
2683
+ group: iconsMaterial.Group,
2684
+ business: iconsMaterial.Business,
2685
+ shoppingcart: iconsMaterial.ShoppingCart,
2686
+ attachmoney: iconsMaterial.AttachMoney,
2687
+ lock: iconsMaterial.Lock,
2688
+ lockopen: iconsMaterial.LockOpen,
2689
+ visibility: iconsMaterial.Visibility,
2690
+ visibilityoff: iconsMaterial.VisibilityOff
2691
+ };
2692
+ /**
2693
+ * Get icon component from icon name string
2694
+ * Exported for use by other components (Scaffold, ResponsiveMenu, etc.)
2695
+ */
2696
+ function getIconComponent(iconName) {
2697
+ if (!iconName) return null;
2698
+ const IconComponent = iconRegistry[iconName.toLowerCase()];
2699
+ if (!IconComponent) {
2700
+ console.warn(`[Button] Icon "${iconName}" not found in registry`);
2701
+ return null;
2702
+ }
2703
+ return jsxRuntime.jsx(IconComponent, {});
2704
+ }
2653
2705
  // View component - handles the actual rendering
2654
2706
  const ButtonView = /*#__PURE__*/React.forwardRef((props, ref) => {
2655
2707
  const {
2656
2708
  label,
2657
2709
  variant = 'primary',
2710
+ color,
2658
2711
  buttonSize = 'medium',
2659
2712
  icon,
2660
2713
  endIcon,
@@ -2685,8 +2738,13 @@ const ButtonView = /*#__PURE__*/React.forwardRef((props, ref) => {
2685
2738
  return 'contained';
2686
2739
  }
2687
2740
  };
2688
- // Map our variants to MUI colors
2689
- const getMuiColor = () => {
2741
+ // Get theme color name - prioritize explicit color prop over variant-derived color
2742
+ const getThemeColorName = () => {
2743
+ // If color prop is explicitly provided, use it
2744
+ if (color) {
2745
+ return color;
2746
+ }
2747
+ // Otherwise derive from variant
2690
2748
  switch (variant) {
2691
2749
  case 'primary':
2692
2750
  return 'primary';
@@ -2702,6 +2760,50 @@ const ButtonView = /*#__PURE__*/React.forwardRef((props, ref) => {
2702
2760
  return 'primary';
2703
2761
  }
2704
2762
  };
2763
+ // Get CSS theme variable styles based on variant and color
2764
+ const getColorStyles = () => {
2765
+ const muiVariant = getMuiVariant();
2766
+ const colorName = getThemeColorName();
2767
+ // For contained buttons: use solid background
2768
+ if (muiVariant === 'contained') {
2769
+ return {
2770
+ backgroundColor: `var(--theme-${colorName})`,
2771
+ color: `var(--theme-on-${colorName})`,
2772
+ '&:hover': {
2773
+ backgroundColor: `var(--theme-${colorName}-dark)`
2774
+ },
2775
+ '&.Mui-disabled': {
2776
+ backgroundColor: 'var(--theme-text-disabled)',
2777
+ color: 'var(--theme-on-surface)'
2778
+ }
2779
+ };
2780
+ }
2781
+ // For outlined buttons: border and text color
2782
+ if (muiVariant === 'outlined') {
2783
+ return {
2784
+ borderColor: `var(--theme-${colorName})`,
2785
+ color: `var(--theme-${colorName})`,
2786
+ '&:hover': {
2787
+ borderColor: `var(--theme-${colorName}-dark)`,
2788
+ backgroundColor: `var(--theme-${colorName}-light)`
2789
+ },
2790
+ '&.Mui-disabled': {
2791
+ borderColor: 'var(--theme-border-main)',
2792
+ color: 'var(--theme-text-disabled)'
2793
+ }
2794
+ };
2795
+ }
2796
+ // For text buttons: just text color
2797
+ return {
2798
+ color: `var(--theme-${colorName})`,
2799
+ '&:hover': {
2800
+ backgroundColor: `var(--theme-${colorName}-light)`
2801
+ },
2802
+ '&.Mui-disabled': {
2803
+ color: 'var(--theme-text-disabled)'
2804
+ }
2805
+ };
2806
+ };
2705
2807
  // Handle action serialization pattern for onClick
2706
2808
  const handleActionClick = React.useCallback(event => {
2707
2809
  if (action) {
@@ -2758,12 +2860,13 @@ const ButtonView = /*#__PURE__*/React.forwardRef((props, ref) => {
2758
2860
  // Base button props
2759
2861
  const baseProps = {
2760
2862
  variant: getMuiVariant(),
2761
- color: getMuiColor(),
2762
2863
  size: buttonSize,
2763
2864
  disabled: disabled || loading,
2764
2865
  fullWidth,
2765
2866
  ...restProps,
2766
2867
  sx: {
2868
+ // Apply CSS theme variable colors
2869
+ ...getColorStyles(),
2767
2870
  // Ensure consistent text transform
2768
2871
  textTransform: 'none',
2769
2872
  // Loading state adjustments
@@ -2772,6 +2875,7 @@ const ButtonView = /*#__PURE__*/React.forwardRef((props, ref) => {
2772
2875
  marginRight: 1
2773
2876
  }
2774
2877
  }),
2878
+ // Merge user-provided sx prop last to allow overrides
2775
2879
  ...(restProps.sx || {})
2776
2880
  },
2777
2881
  startIcon: loading ? jsxRuntime.jsx(material.CircularProgress, {
@@ -2814,8 +2918,27 @@ const Button = createSerializableView({
2814
2918
  tagName: 'Button',
2815
2919
  version: '1.0.0',
2816
2920
  role: 'view',
2817
- View: ButtonView
2921
+ View: ButtonView,
2818
2922
  // Button component uses default react-children strategy for potential child content
2923
+ finalize: props => {
2924
+ // Transform icon string names to React icon components
2925
+ const transformedProps = {
2926
+ ...props
2927
+ };
2928
+ if (typeof props.icon === 'string') {
2929
+ const iconComponent = getIconComponent(props.icon);
2930
+ if (iconComponent) {
2931
+ transformedProps.icon = iconComponent;
2932
+ }
2933
+ }
2934
+ if (typeof props.endIcon === 'string') {
2935
+ const endIconComponent = getIconComponent(props.endIcon);
2936
+ if (endIconComponent) {
2937
+ transformedProps.endIcon = endIconComponent;
2938
+ }
2939
+ }
2940
+ return transformedProps;
2941
+ }
2819
2942
  });
2820
2943
  // Register HTML patterns that Button component can handle
2821
2944
  Button.registerPatternHandlers = registry => {
@@ -3548,7 +3671,8 @@ Text$1.registerPatternHandlers = registry => {
3548
3671
  Text$1.transformParagraph = element => {
3549
3672
  return {
3550
3673
  tagName: 'Text',
3551
- props: {
3674
+ version: '1.0.0',
3675
+ data: {
3552
3676
  variant: 'body1',
3553
3677
  component: 'p',
3554
3678
  content: element.textContent || ''
@@ -3567,7 +3691,8 @@ Text$1.transformHeading = (element, tagName) => {
3567
3691
  };
3568
3692
  return {
3569
3693
  tagName: 'Text',
3570
- props: {
3694
+ version: '1.0.0',
3695
+ data: {
3571
3696
  variant: variantMap[tagName] || 'h4',
3572
3697
  component: tagName,
3573
3698
  content: element.textContent || ''
@@ -3578,7 +3703,8 @@ Text$1.transformHeading = (element, tagName) => {
3578
3703
  Text$1.transformSpan = element => {
3579
3704
  return {
3580
3705
  tagName: 'Text',
3581
- props: {
3706
+ version: '1.0.0',
3707
+ data: {
3582
3708
  variant: 'body2',
3583
3709
  component: 'span',
3584
3710
  content: element.textContent || ''
@@ -3856,7 +3982,7 @@ __decorate([schema.Field(), schema.Editor({
3856
3982
  field_type: schema.FieldType.TEXTAREA,
3857
3983
  label: 'Click Handler',
3858
3984
  description: 'JavaScript function for click events',
3859
- placeholder: 'function(event) { console.log("clicked"); }'
3985
+ placeholder: 'function(event) { console.debug("clicked"); }'
3860
3986
  }), classValidator.IsOptional(), classValidator.IsString(), __metadata("design:type", Function)], exports.ViewSchema.prototype, "onClick", void 0);
3861
3987
  __decorate([schema.Field(), schema.Editor({
3862
3988
  field_type: schema.FieldType.TEXTAREA,
@@ -4524,7 +4650,7 @@ function CoverImageHeader(props) {
4524
4650
  const convertedActions = modelActions ? modelActions.filter(action => typeof action.id === 'string' && !!action.id).map(action => ({
4525
4651
  ...action,
4526
4652
  id: action.id,
4527
- onClick: () => console.log(`Action clicked: ${action.id}`) // Default handler for data-driven actions
4653
+ onClick: () => console.debug(`Action clicked: ${action.id}`) // Default handler for data-driven actions
4528
4654
  })) : [];
4529
4655
  return jsxRuntime.jsx(CoverImageHeaderView, {
4530
4656
  ...viewProps,
@@ -5081,6 +5207,11 @@ function LogoView({
5081
5207
  // If image is a React node, render it directly
5082
5208
  return jsxRuntime.jsx("div", {
5083
5209
  className: "logo-image-container",
5210
+ style: {
5211
+ display: 'flex',
5212
+ alignItems: 'center',
5213
+ justifyContent: 'center'
5214
+ },
5084
5215
  children: image
5085
5216
  });
5086
5217
  };
@@ -5094,7 +5225,8 @@ function LogoView({
5094
5225
  xmlns: "http://www.w3.org/2000/svg",
5095
5226
  className: `logo-svg dynamic-logo ${sizeClass} ${variantClass}`.trim(),
5096
5227
  style: {
5097
- height: `${height}px`
5228
+ height: `${height}px`,
5229
+ ...style
5098
5230
  },
5099
5231
  role: "img",
5100
5232
  "aria-label": ariaLabel,
@@ -5204,7 +5336,6 @@ function Logo(props) {
5204
5336
  }
5205
5337
  // Show error state
5206
5338
  if (error) {
5207
- console.error('Error loading logo:', error);
5208
5339
  return jsxRuntime.jsxs("div", {
5209
5340
  style: {
5210
5341
  color: 'red',
@@ -5214,7 +5345,6 @@ function Logo(props) {
5214
5345
  children: ["Error loading logo: ", error.message]
5215
5346
  });
5216
5347
  }
5217
- console.log('Resolved props for Logo:', logoProps);
5218
5348
  return jsxRuntime.jsx(LogoView, {
5219
5349
  ...logoProps
5220
5350
  });
@@ -16526,7 +16656,6 @@ function SafeSpanWithDataBinding(props) {
16526
16656
  });
16527
16657
  }
16528
16658
  }
16529
- console.log('Resolved props for SafeSpan:', safeSpanProps);
16530
16659
  return jsxRuntime.jsx(SafeSpanView, {
16531
16660
  ...safeSpanProps
16532
16661
  });
@@ -17444,7 +17573,6 @@ class Html extends ModelView {
17444
17573
  if (version !== Html.version) {
17445
17574
  console.warn(`Version mismatch: Expected ${Html.version} but got ${version}`);
17446
17575
  }
17447
- console.log(`TEST: Creating ${tagName} - ${version} from JSON:`, jsonData);
17448
17576
  const {
17449
17577
  children,
17450
17578
  ...props
@@ -17613,7 +17741,6 @@ class ReactNodeTransformer {
17613
17741
  // Handle React elements
17614
17742
  if (/*#__PURE__*/React.isValidElement(node)) {
17615
17743
  const element = node;
17616
- console.log(`TEST: isValidElement:`, element);
17617
17744
  const comp = element.type;
17618
17745
  const rawName = typeof comp === 'string' ? comp : comp?.render?.name || comp?.name || comp?.muiName || comp?.displayName || 'Anonymous';
17619
17746
  // Normalize wrapper names like ForwardRef(Typography), Styled(Typography)
@@ -17726,7 +17853,6 @@ class ReactNodeTransformer {
17726
17853
  // Handle HTML elements
17727
17854
  if (typeof elementType === 'string') {
17728
17855
  const deserializedProps = ReactNodeTransformer.deserializeProps(props);
17729
- console.log(`TEST: Create Element:`, elementType, deserializedProps);
17730
17856
  return /*#__PURE__*/React.createElement(elementType, {
17731
17857
  key,
17732
17858
  ...deserializedProps
@@ -17853,7 +17979,6 @@ class ComponentTransformer {
17853
17979
  if (componentRegistry.has(tagName)) {
17854
17980
  console.warn(`Component '${tagName}' is already registered. Overwriting existing registration.`);
17855
17981
  }
17856
- console.log(`TEST: Registering component: ${tagName} (version ${version})`);
17857
17982
  componentRegistry.set(tagName, componentClass);
17858
17983
  // Register HTML patterns if component supports them
17859
17984
  if (typeof componentClass.registerPatternHandlers === 'function') {
@@ -17967,13 +18092,9 @@ class ComponentTransformer {
17967
18092
  if (typeof componentType === 'function') {
17968
18093
  const tagName = ComponentTransformer.findTagNameForComponent(componentType);
17969
18094
  if (tagName) {
17970
- console.log(`TEST: Serializing component instance of ${tagName}:`, element.props);
17971
18095
  const componentClass = componentRegistry.get(tagName);
17972
18096
  let serializedData = null;
17973
- console.log(`TEST: Element type:`, typeof element.toJson);
17974
- console.log(`TEST: Component type:`, typeof componentClass.toJson);
17975
18097
  if (typeof componentClass.toJson === 'function') {
17976
- console.log(`TEST: Serializing via component toJson method ${tagName}:`, element.props);
17977
18098
  serializedData = componentClass.toJson(element.props);
17978
18099
  }
17979
18100
  if (serializedData !== null) {
@@ -17985,7 +18106,6 @@ class ComponentTransformer {
17985
18106
  ...key,
17986
18107
  ...serializedData
17987
18108
  };
17988
- console.log(`TEST: Serialized component ${tagName}:`, result);
17989
18109
  return result;
17990
18110
  }
17991
18111
  } else if (strictMode) {
@@ -18003,8 +18123,6 @@ class ComponentTransformer {
18003
18123
  version: FALLBACK_VERSION,
18004
18124
  data: ReactNodeTransformer.serialize(node)
18005
18125
  };
18006
- console.log(`TEST: Serialized unregistered node as ${FALLBACK_TAG}:`, result, node);
18007
- console.log(`TEST: Component Registry:`, componentRegistry);
18008
18126
  return result;
18009
18127
  }
18010
18128
  /**
@@ -18268,11 +18386,13 @@ function ArticleView({
18268
18386
  // Ensure proper width constraints for article content
18269
18387
  maxWidth: '800px',
18270
18388
  mx: 'auto',
18389
+ p: 3,
18271
18390
  // Header styling when headers are present
18272
18391
  '& h1, & h2, & h3, & h4, & h5, & h6': {
18273
18392
  maxWidth: '100%',
18274
- mb: 1.5,
18275
- mt: 2,
18393
+ mb: 2,
18394
+ mt: 3,
18395
+ color: 'var(--theme-text-primary)',
18276
18396
  '&:first-of-type': {
18277
18397
  mt: 0
18278
18398
  }
@@ -18292,15 +18412,85 @@ function ArticleView({
18292
18412
  fontWeight: 600,
18293
18413
  lineHeight: 1.4
18294
18414
  },
18415
+ '& h4': {
18416
+ fontSize: '1.25rem',
18417
+ fontWeight: 600,
18418
+ lineHeight: 1.4,
18419
+ mt: 2.5,
18420
+ mb: 1.5
18421
+ },
18295
18422
  // Ensure paragraphs have proper spacing
18296
18423
  '& p': {
18297
- mb: 1.5,
18298
- lineHeight: 1.6
18424
+ mb: 2,
18425
+ lineHeight: 1.8,
18426
+ fontSize: '1.1rem',
18427
+ color: 'var(--theme-text-primary)'
18299
18428
  },
18300
18429
  // Ensure lists have proper spacing
18301
18430
  '& ul, & ol': {
18302
- mb: 1.5,
18303
- pl: 3
18431
+ mb: 2.5,
18432
+ pl: 4,
18433
+ '& li': {
18434
+ mb: 1,
18435
+ lineHeight: 1.8,
18436
+ fontSize: '1.05rem',
18437
+ color: 'var(--theme-text-primary)'
18438
+ }
18439
+ },
18440
+ // Blockquote styling
18441
+ '& blockquote': {
18442
+ borderLeft: '4px solid var(--theme-primary)',
18443
+ pl: 3,
18444
+ pr: 2,
18445
+ py: 2,
18446
+ my: 3,
18447
+ ml: 0,
18448
+ mr: 0,
18449
+ background: 'var(--theme-surface)',
18450
+ borderRadius: '8px',
18451
+ '& p': {
18452
+ fontSize: '1.15rem',
18453
+ fontStyle: 'italic',
18454
+ lineHeight: 1.7,
18455
+ mb: 1,
18456
+ color: 'var(--theme-text-primary)'
18457
+ },
18458
+ '& cite': {
18459
+ display: 'block',
18460
+ fontSize: '0.95rem',
18461
+ fontStyle: 'normal',
18462
+ fontWeight: 600,
18463
+ color: 'var(--theme-text-secondary)',
18464
+ mt: 1
18465
+ }
18466
+ },
18467
+ // Strong/bold text
18468
+ '& strong': {
18469
+ fontWeight: 600,
18470
+ color: 'var(--theme-text-primary)'
18471
+ },
18472
+ // Emphasis/italic text
18473
+ '& em': {
18474
+ fontStyle: 'italic',
18475
+ color: 'var(--theme-text-primary)'
18476
+ },
18477
+ // Links
18478
+ '& a': {
18479
+ color: 'var(--theme-primary)',
18480
+ textDecoration: 'none',
18481
+ fontWeight: 500,
18482
+ '&:hover': {
18483
+ textDecoration: 'underline'
18484
+ }
18485
+ },
18486
+ // Images and figures
18487
+ '& figure': {
18488
+ margin: '2rem 0',
18489
+ '& img': {
18490
+ maxWidth: '100%',
18491
+ height: 'auto',
18492
+ borderRadius: '8px'
18493
+ }
18304
18494
  },
18305
18495
  ...styleProps.sx,
18306
18496
  children: html
@@ -18416,7 +18606,6 @@ function ArticleWithDataBinding(props) {
18416
18606
  });
18417
18607
  }
18418
18608
  }
18419
- console.log('Resolved props for Article:', articleProps);
18420
18609
  return jsxRuntime.jsx(ArticleView, {
18421
18610
  ...articleProps
18422
18611
  });
@@ -19347,7 +19536,7 @@ function PageBannerHeader(props) {
19347
19536
  destructive: action.destructive,
19348
19537
  priority: action.priority,
19349
19538
  onClick: () => {
19350
- console.log(`Action clicked: ${action.id} - ${action.label}`);
19539
+ console.debug(`Action clicked: ${action.id} - ${action.label}`);
19351
19540
  // In a real app, this would dispatch events or call configured handlers
19352
19541
  }
19353
19542
  }));
@@ -20824,9 +21013,9 @@ function FooterView({
20824
21013
  // Force vertical on mobile for better usability
20825
21014
  const effectiveOrientation = isMobile ? 'vertical' : orientation;
20826
21015
  const renderFooterItem = item => {
20827
- const content = jsxRuntime.jsx(material.Typography, {
21016
+ const content = jsxRuntime.jsx(Text$1, {
20828
21017
  variant: "body2",
20829
- color: "text.secondary",
21018
+ customColor: "var(--theme-text-secondary)",
20830
21019
  sx: {
20831
21020
  textDecoration: item.href ? 'none' : 'inherit',
20832
21021
  '&:hover': item.href ? {
@@ -20862,14 +21051,14 @@ function FooterView({
20862
21051
  sx: {
20863
21052
  minWidth: 0
20864
21053
  },
20865
- children: [section.title && jsxRuntime.jsx(material.Typography, {
21054
+ children: [section.title && jsxRuntime.jsx(Text$1, {
20866
21055
  variant: "subtitle2",
20867
21056
  component: "h3",
20868
21057
  sx: {
20869
21058
  fontWeight: 600,
20870
- mb: 1.5,
20871
- color: 'text.primary'
21059
+ mb: 1.5
20872
21060
  },
21061
+ customColor: "var(--theme-text-primary)",
20873
21062
  children: section.title
20874
21063
  }), jsxRuntime.jsx(material.Box, {
20875
21064
  children: section.items.map(item => renderFooterItem(item))
@@ -20985,13 +21174,13 @@ function FooterView({
20985
21174
  },
20986
21175
  gap: 1
20987
21176
  },
20988
- children: [copyright && jsxRuntime.jsx(material.Typography, {
21177
+ children: [copyright && jsxRuntime.jsx(Text$1, {
20989
21178
  variant: "caption",
20990
- color: "text.secondary",
21179
+ customColor: 'var(--theme-text-secondary)',
20991
21180
  children: copyright
20992
- }), legalText && jsxRuntime.jsx(material.Typography, {
21181
+ }), legalText && jsxRuntime.jsx(Text$1, {
20993
21182
  variant: "caption",
20994
- color: "text.secondary",
21183
+ customColor: "var(--theme-text-secondary)",
20995
21184
  children: legalText
20996
21185
  })]
20997
21186
  })
@@ -21037,9 +21226,9 @@ function Footer(props) {
21037
21226
  },
21038
21227
  textAlign: 'center'
21039
21228
  },
21040
- children: jsxRuntime.jsx(material.Typography, {
21229
+ children: jsxRuntime.jsx(Text$1, {
21041
21230
  variant: "body2",
21042
- color: "text.secondary",
21231
+ customColor: "var(--theme-text-secondary)",
21043
21232
  children: "Loading Footer..."
21044
21233
  })
21045
21234
  });
@@ -21058,9 +21247,9 @@ function Footer(props) {
21058
21247
  },
21059
21248
  textAlign: 'center'
21060
21249
  },
21061
- children: jsxRuntime.jsxs(material.Typography, {
21250
+ children: jsxRuntime.jsxs(Text$1, {
21062
21251
  variant: "body2",
21063
- color: "error",
21252
+ customColor: 'var(--theme-error)',
21064
21253
  children: ["Error Loading Footer: ", error.message]
21065
21254
  })
21066
21255
  });
@@ -23140,9 +23329,21 @@ const Scaffold = ({
23140
23329
  }
23141
23330
  }
23142
23331
  };
23143
- // For primary navigation (bottom, rail, appbar), enforce icon requirement
23332
+ // Transform icon string to component, or use provided ReactNode, or fallback to DefaultIcon
23144
23333
  const needsIcon = variant !== 'drawer';
23145
- const displayIcon = item.icon || (needsIcon ? jsxRuntime.jsx(iconsMaterial.RadioButtonUnchecked, {}) : null);
23334
+ let displayIcon = null;
23335
+ if (item.icon) {
23336
+ // If icon is a string, transform it to component
23337
+ if (typeof item.icon === 'string') {
23338
+ displayIcon = getIconComponent(item.icon) || (needsIcon ? jsxRuntime.jsx(iconsMaterial.RadioButtonUnchecked, {}) : null);
23339
+ } else {
23340
+ // If icon is already a React component, use it
23341
+ displayIcon = item.icon;
23342
+ }
23343
+ } else if (needsIcon) {
23344
+ // No icon provided, use default for primary navigation
23345
+ displayIcon = jsxRuntime.jsx(iconsMaterial.RadioButtonUnchecked, {});
23346
+ }
23146
23347
  const content = jsxRuntime.jsxs(jsxRuntime.Fragment, {
23147
23348
  children: [displayIcon && jsxRuntime.jsx("span", {
23148
23349
  className: `menu-item-icon menu-item-icon-${variant}`,
@@ -1 +1 @@
1
- {"version":3,"file":"Logo.d.ts","sourceRoot":"","sources":["../../../src/components/Logo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,YAAY,CAAC;AAEpB,KAAK,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG;IAC5C,iCAAiC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,aAAa,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC;IAC5E,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,UAAU,SAAU,SAAQ,aAAa,EAAE,eAAe;CAAG;AAgX7D,iBAAS,IAAI,CAAC,KAAK,EAAE,SAAS,2CAqC7B;AAMD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAEzC,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Logo.d.ts","sourceRoot":"","sources":["../../../src/components/Logo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,YAAY,CAAC;AAEpB,KAAK,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG;IAC5C,iCAAiC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,aAAa,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC;IAC5E,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,UAAU,SAAU,SAAQ,aAAa,EAAE,eAAe;CAAG;AAgX7D,iBAAS,IAAI,CAAC,KAAK,EAAE,SAAS,2CAmC7B;AAMD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAEzC,eAAe,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResponsiveMenu.d.ts","sourceRoot":"","sources":["../../../src/components/ResponsiveMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,aAAa,EAAoC,MAAM,uBAAuB,CAAC;AAGxF,OAAO,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,qCAAqC;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAID,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAqQjD,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ResponsiveMenu.d.ts","sourceRoot":"","sources":["../../../src/components/ResponsiveMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,aAAa,EAAoC,MAAM,uBAAuB,CAAC;AAIxF,OAAO,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,qCAAqC;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAID,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA+QjD,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SafeSpan.d.ts","sourceRoot":"","sources":["../../../src/components/SafeSpan.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,KAAK,iBAAiB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,WAAW,aAAc,SAAQ,iBAAiB,EAAE,eAAe;CAAG;AA6E5E,qBAAa,QAAS,SAAQ,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IAEnE,MAAM,CAAC,QAAQ,CAAC,OAAO,cAAc;IACrC,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,SAAS,CAAC,yBAAyB,IAAI,GAAG;IAQ1C,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY;IAM1C,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC,YAAY;IAKrD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAanD,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAWjC;AA+BD,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"SafeSpan.d.ts","sourceRoot":"","sources":["../../../src/components/SafeSpan.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,KAAK,iBAAiB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,WAAW,aAAc,SAAQ,iBAAiB,EAAE,eAAe;CAAG;AA6E5E,qBAAa,QAAS,SAAQ,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IAEnE,MAAM,CAAC,QAAQ,CAAC,OAAO,cAAc;IACrC,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,SAAS,CAAC,yBAAyB,IAAI,GAAG;IAQ1C,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY;IAM1C,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC,YAAY;IAKrD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAanD,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAWjC;AA8BD,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Scaffold.d.ts","sourceRoot":"","sources":["../../../src/components/Scaffold.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,OAAO,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+BAA+B;IAC/B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAWD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0XrC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Scaffold.d.ts","sourceRoot":"","sources":["../../../src/components/Scaffold.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,OAAO,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+BAA+B;IAC/B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAWD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAuYrC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Article.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Article.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAuB,MAAM,OAAO,CAAC;AAE5C,OAAO,YAAY,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,KAAK,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,gBAAgB,EAAE,eAAe;CACtE;AAgGD,qBAAa,OAAQ,SAAQ,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IAEhE,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,SAAS,CAAC,yBAAyB,IAAI,GAAG;IAQ1C,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY;IAM1C,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC,YAAY;IAKrD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAQnD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAWhC;AA6DD,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Article.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Article.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAuB,MAAM,OAAO,CAAC;AAE5C,OAAO,YAAY,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,KAAK,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,gBAAgB,EAAE,eAAe;CACtE;AAwKD,qBAAa,OAAQ,SAAQ,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IAEhE,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,SAAS,CAAC,yBAAyB,IAAI,GAAG;IAQ1C,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY;IAM1C,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC,YAAY;IAKrD,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAQnD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAWhC;AA4DD,eAAe,OAAO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Footer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAoD,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9F,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,eAAgB,SAAQ,aAAa;IAC7C,sBAAsB;IACtB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,yBAAyB;IACzB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC/C,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe,EAAE,eAAe;CAAG;AAwNxE,iBAAS,MAAM,CAAC,KAAK,EAAE,WAAW,kDAsEjC;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Footer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAoD,aAAa,EAAE,MAAM,aAAa,CAAC;AAI9F,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,eAAgB,SAAQ,aAAa;IAC7C,sBAAsB;IACtB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,yBAAyB;IACzB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC/C,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe,EAAE,eAAe;CAAI;AAwNzE,iBAAS,MAAM,CAAC,KAAK,EAAE,WAAW,kDAsEjC;AAED,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Text.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAA0B,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AA6EnE;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAMhD,CAAC;AAoEH;;GAEG;AACH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/components/blocks/Text.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAA0B,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AA6EnE;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAMhD,CAAC;AAuEH;;GAEG;AACH,eAAe,IAAI,CAAC"}
@@ -14,8 +14,24 @@
14
14
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
15
15
  */
16
16
  import React from 'react';
17
+ import ButtonModel from '../../schemas/ButtonSchema';
17
18
  import { SerializableComponent } from '../shared/createSerializableView';
18
19
  import { ViewProps } from '../shared/viewProps';
20
+ import type { SchemaProps } from '@qwickapps/schema/src/types/ModelProps';
21
+ /**
22
+ * Icon name to Material-UI icon component mapping
23
+ * Used by finalize function to transform icon string names to React components
24
+ */
25
+ declare const iconRegistry: Record<string, React.ComponentType>;
26
+ /**
27
+ * Get icon component from icon name string
28
+ * Exported for use by other components (Scaffold, ResponsiveMenu, etc.)
29
+ */
30
+ export declare function getIconComponent(iconName: string | undefined): React.ReactElement | null;
31
+ /**
32
+ * Export icon registry for extension by applications
33
+ */
34
+ export { iconRegistry };
19
35
  export interface ButtonAction {
20
36
  type: 'navigate' | 'submit' | 'custom' | 'external';
21
37
  url?: string;
@@ -23,19 +39,19 @@ export interface ButtonAction {
23
39
  form?: string;
24
40
  customHandler?: string;
25
41
  }
26
- export interface ButtonProps extends ViewProps {
27
- label?: string;
28
- variant?: 'primary' | 'secondary' | 'outlined' | 'text' | 'contained';
29
- buttonSize?: 'small' | 'medium' | 'large';
30
- href?: string;
31
- target?: '_blank' | '_self' | '_parent' | '_top';
32
- disabled?: boolean;
33
- loading?: boolean;
34
- fullWidth?: boolean;
42
+ /**
43
+ * Props interface for Button component
44
+ * Uses SchemaProps<typeof ButtonSchema> for schema-driven typing
45
+ * Icons are transformed from strings to React components by finalize function
46
+ *
47
+ * Note: We omit 'icon' and 'endIcon' from schema props because they are strings in the schema
48
+ * but get transformed to ReactElements by the finalize function.
49
+ */
50
+ export type ButtonProps = ViewProps & Omit<SchemaProps<typeof ButtonModel>, 'icon' | 'endIcon'> & {
35
51
  icon?: React.ReactNode;
36
52
  endIcon?: React.ReactNode;
37
53
  action?: ButtonAction;
38
- }
54
+ };
39
55
  export declare const Button: SerializableComponent<ButtonProps>;
40
56
  export default Button;
41
57
  //# sourceMappingURL=Button.d.ts.map