react-pdf-levelup 2.0.21 → 2.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -109,33 +109,19 @@ interface PageElementProps {
109
109
  declare const Header: React$1.FC<PageElementProps>;
110
110
  declare const Footer: React$1.FC<PageElementProps>;
111
111
 
112
- interface QRCustomProps {
113
- url: string;
112
+ interface QRProps {
113
+ value: string;
114
114
  size?: number;
115
- colorData?: string;
116
- colorDataBG?: string;
115
+ style?: any;
116
+ colorDark?: string;
117
+ colorLight?: string;
118
+ margin?: number;
117
119
  logo?: string;
118
120
  logoWidth?: number;
119
121
  logoHeight?: number;
120
- margin?: number;
121
122
  errorCorrectionLevel?: "L" | "M" | "Q" | "H";
122
- style?: any;
123
- dotType?: "rounded" | "dots" | "classy" | "classy-rounded" | "square" | "extra-rounded";
124
- cornerSquareType?: "square" | "dot" | "extra-rounded";
125
- cornerDotType?: "square" | "dot";
126
- cornerSquareColor?: string;
127
- cornerDotColor?: string;
128
- logoBG?: string;
129
- logoText?: string;
130
- moveText?: number;
131
- textColor?: string;
132
- fontSize?: number;
133
- fontFamily?: string;
134
- textBackgroundColor?: string;
135
- textPadding?: number;
136
- textBold?: boolean;
137
123
  }
138
- declare const QR: React$1.FC<QRCustomProps>;
124
+ declare const QR: React$1.FC<QRProps>;
139
125
 
140
126
  interface ListProps {
141
127
  children: React$1.ReactNode;
package/dist/index.d.ts CHANGED
@@ -109,33 +109,19 @@ interface PageElementProps {
109
109
  declare const Header: React$1.FC<PageElementProps>;
110
110
  declare const Footer: React$1.FC<PageElementProps>;
111
111
 
112
- interface QRCustomProps {
113
- url: string;
112
+ interface QRProps {
113
+ value: string;
114
114
  size?: number;
115
- colorData?: string;
116
- colorDataBG?: string;
115
+ style?: any;
116
+ colorDark?: string;
117
+ colorLight?: string;
118
+ margin?: number;
117
119
  logo?: string;
118
120
  logoWidth?: number;
119
121
  logoHeight?: number;
120
- margin?: number;
121
122
  errorCorrectionLevel?: "L" | "M" | "Q" | "H";
122
- style?: any;
123
- dotType?: "rounded" | "dots" | "classy" | "classy-rounded" | "square" | "extra-rounded";
124
- cornerSquareType?: "square" | "dot" | "extra-rounded";
125
- cornerDotType?: "square" | "dot";
126
- cornerSquareColor?: string;
127
- cornerDotColor?: string;
128
- logoBG?: string;
129
- logoText?: string;
130
- moveText?: number;
131
- textColor?: string;
132
- fontSize?: number;
133
- fontFamily?: string;
134
- textBackgroundColor?: string;
135
- textPadding?: number;
136
- textBold?: boolean;
137
123
  }
138
- declare const QR: React$1.FC<QRCustomProps>;
124
+ declare const QR: React$1.FC<QRProps>;
139
125
 
140
126
  interface ListProps {
141
127
  children: React$1.ReactNode;
package/dist/index.js CHANGED
@@ -527,174 +527,154 @@ var Footer = ({ children, style, fixed = false }) => {
527
527
 
528
528
  // src/components/core/QR.tsx
529
529
  var import_react8 = __toESM(require("react"));
530
- var import_react9 = require("react");
531
530
  var import_renderer8 = require("@react-pdf/renderer");
532
- var import_qr_code_styling = __toESM(require("qr-code-styling"));
533
- var QR = ({
534
- url,
535
- size = 200,
536
- colorData = "#000000",
537
- colorDataBG = "#ffffff",
538
- logo,
539
- logoWidth = 30,
540
- logoHeight,
531
+ var import_react9 = require("react");
532
+
533
+ // src/components/core/QRGenerator.tsx
534
+ var import_qrcode = __toESM(require("qrcode"));
535
+ var generateQRAsBase64 = async ({
536
+ value,
537
+ size = 150,
538
+ colorDark = "#000000",
539
+ colorLight = "#ffffff",
541
540
  margin = 0,
542
- errorCorrectionLevel = "H",
541
+ errorCorrectionLevel = "M"
542
+ }) => {
543
+ try {
544
+ const options = {
545
+ errorCorrectionLevel,
546
+ type: "image/png",
547
+ quality: 0.92,
548
+ margin,
549
+ color: {
550
+ dark: colorDark,
551
+ light: colorLight
552
+ },
553
+ width: size
554
+ };
555
+ const qrDataUrl = import_qrcode.default.toDataURL(value, options);
556
+ return qrDataUrl;
557
+ } catch (error) {
558
+ console.error("Error generando QR:", error);
559
+ return "";
560
+ }
561
+ };
562
+ var addLogoToQR = async (qrDataUrl, logoUrl, logoWidth, logoHeight) => {
563
+ return new Promise((resolve) => {
564
+ if (!qrDataUrl || !logoUrl) {
565
+ resolve(qrDataUrl);
566
+ return;
567
+ }
568
+ try {
569
+ const canvas = document.createElement("canvas");
570
+ const ctx = canvas.getContext("2d");
571
+ if (!ctx) {
572
+ resolve(qrDataUrl);
573
+ return;
574
+ }
575
+ const qrImage = new Image();
576
+ qrImage.crossOrigin = "anonymous";
577
+ qrImage.onload = () => {
578
+ canvas.width = qrImage.width;
579
+ canvas.height = qrImage.height;
580
+ ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height);
581
+ const logoImage = new Image();
582
+ logoImage.crossOrigin = "anonymous";
583
+ logoImage.onload = () => {
584
+ const x = (canvas.width - logoWidth) / 2;
585
+ const y = (canvas.height - logoHeight) / 2;
586
+ ctx.fillStyle = "#FFFFFF";
587
+ ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10);
588
+ ctx.drawImage(logoImage, x, y, logoWidth, logoHeight);
589
+ const finalQrDataUrl = canvas.toDataURL("image/png");
590
+ resolve(finalQrDataUrl);
591
+ };
592
+ logoImage.onerror = () => {
593
+ console.error("Error cargando el logo");
594
+ resolve(qrDataUrl);
595
+ };
596
+ logoImage.src = logoUrl;
597
+ };
598
+ qrImage.onerror = () => {
599
+ console.error("Error cargando el QR");
600
+ resolve("");
601
+ };
602
+ qrImage.src = qrDataUrl;
603
+ } catch (error) {
604
+ console.error("Error procesando el QR con logo:", error);
605
+ resolve(qrDataUrl);
606
+ }
607
+ });
608
+ };
609
+
610
+ // src/components/core/QR.tsx
611
+ var styles8 = import_renderer8.StyleSheet.create({
612
+ qrContainer: {
613
+ display: "flex",
614
+ alignItems: "center",
615
+ justifyContent: "center",
616
+ margin: 10
617
+ }
618
+ });
619
+ var errorLevelMap = {
620
+ 0: "L",
621
+ 1: "M",
622
+ 2: "Q",
623
+ 3: "H"
624
+ };
625
+ var QR = ({
626
+ value,
627
+ size = 150,
543
628
  style,
544
- dotType = "square",
545
- cornerSquareType = "square",
546
- cornerDotType = "square",
547
- cornerSquareColor,
548
- cornerDotColor,
549
- logoBG = colorDataBG,
550
- logoText,
551
- moveText = 0,
552
- textColor = colorData,
553
- fontSize = 12,
554
- fontFamily = "Helvetica",
555
- textBackgroundColor = colorDataBG,
556
- textPadding = 1,
557
- textBold = true
629
+ colorDark = "#000000",
630
+ colorLight = "#ffffff",
631
+ margin = 0,
632
+ logo = "",
633
+ logoWidth = 30,
634
+ logoHeight = 30,
635
+ errorCorrectionLevel = "M"
558
636
  }) => {
559
- const [qrDataURL, setQrDataURL] = (0, import_react9.useState)(null);
560
- const actualLogoWidth = logoWidth || Math.floor(size * 0.2);
561
- const actualLogoHeight = logoHeight || actualLogoWidth;
637
+ const [qrDataUrl, setQrDataUrl] = (0, import_react9.useState)("");
562
638
  (0, import_react9.useEffect)(() => {
563
- if (typeof window === "undefined") return;
564
- const generateQRCode = async () => {
639
+ const generateQR = async () => {
565
640
  try {
566
- const qrCode = new import_qr_code_styling.default({
567
- width: size,
568
- height: size,
569
- type: "canvas",
570
- data: url,
571
- dotsOptions: {
572
- color: colorData,
573
- type: dotType
574
- },
575
- cornersSquareOptions: {
576
- color: cornerSquareColor || colorData,
577
- type: cornerSquareType
578
- },
579
- cornersDotOptions: {
580
- color: cornerDotColor || colorData,
581
- type: cornerDotType
582
- },
583
- backgroundOptions: {
584
- color: colorDataBG
585
- },
586
- qrOptions: {
587
- errorCorrectionLevel
588
- },
589
- margin
641
+ const baseQrDataUrl = await generateQRAsBase64({
642
+ value,
643
+ size,
644
+ colorDark,
645
+ colorLight,
646
+ margin,
647
+ errorCorrectionLevel: typeof errorCorrectionLevel === "number" ? errorLevelMap[errorCorrectionLevel] || "M" : errorCorrectionLevel
590
648
  });
591
- const container = document.createElement("div");
592
- container.style.position = "absolute";
593
- container.style.top = "-9999px";
594
- container.style.left = "-9999px";
595
- document.body.appendChild(container);
596
- qrCode.append(container);
597
- setTimeout(() => {
598
- try {
599
- const qrCanvas = container.querySelector("canvas");
600
- if (qrCanvas) {
601
- const canvas = document.createElement("canvas");
602
- canvas.width = size;
603
- canvas.height = size;
604
- const ctx = canvas.getContext("2d");
605
- if (ctx) {
606
- ctx.drawImage(qrCanvas, 0, 0);
607
- const dataURL = canvas.toDataURL("image/png");
608
- setQrDataURL(dataURL);
609
- }
610
- }
611
- document.body.removeChild(container);
612
- } catch (error) {
613
- console.error("Error capturing QR code:", error);
614
- }
615
- }, 100);
649
+ if (logo && logoWidth && logoHeight) {
650
+ const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight);
651
+ setQrDataUrl(qrWithLogo);
652
+ } else {
653
+ setQrDataUrl(baseQrDataUrl);
654
+ }
616
655
  } catch (error) {
617
- console.error("Error generating QR code:", error);
656
+ console.error("Error generando QR:", error);
657
+ const fallbackUrl2 = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(
658
+ value
659
+ )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace("#", ""))}&bgcolor=${encodeURIComponent(
660
+ colorLight.replace("#", "")
661
+ )}`;
662
+ setQrDataUrl(fallbackUrl2);
618
663
  }
619
664
  };
620
- generateQRCode();
621
- }, [
622
- url,
623
- size,
624
- colorData,
625
- colorDataBG,
626
- margin,
627
- errorCorrectionLevel,
628
- dotType,
629
- cornerSquareType,
630
- cornerDotType,
631
- cornerSquareColor,
632
- cornerDotColor,
633
- logoBG
634
- ]);
635
- if (!qrDataURL) return null;
636
- const centerPosition = size / 2;
637
- const logoContainerSize = Math.max(actualLogoWidth, actualLogoHeight) + 10;
638
- return /* @__PURE__ */ import_react8.default.createElement(import_renderer8.View, { style: { width: size, height: size, position: "relative", ...style } }, /* @__PURE__ */ import_react8.default.createElement(import_renderer8.Image, { src: qrDataURL || "/placeholder.svg", style: { width: size, height: size } }), logo && /* @__PURE__ */ import_react8.default.createElement(
639
- import_renderer8.View,
640
- {
641
- style: {
642
- position: "absolute",
643
- width: logoContainerSize,
644
- height: logoContainerSize,
645
- backgroundColor: logoBG || colorDataBG,
646
- left: centerPosition - logoContainerSize / 2,
647
- top: centerPosition - logoContainerSize / 2,
648
- borderRadius: 100,
649
- border: `5px solid ${colorData}`,
650
- padding: 0
651
- }
652
- },
653
- /* @__PURE__ */ import_react8.default.createElement(
654
- import_renderer8.Image,
655
- {
656
- src: logo || "/placeholder.svg",
657
- style: {
658
- objectFit: "contain",
659
- width: actualLogoWidth,
660
- height: actualLogoHeight || actualLogoWidth
661
- }
662
- }
663
- )
664
- ), !logo && logoText && /* @__PURE__ */ import_react8.default.createElement(
665
- import_renderer8.View,
666
- {
667
- style: {
668
- position: "absolute",
669
- backgroundColor: textBackgroundColor,
670
- padding: textPadding,
671
- borderRadius: 4,
672
- left: moveText + centerPosition - 20,
673
- // Approximate center
674
- top: centerPosition - 10
675
- // Approximate center
676
- }
677
- },
678
- /* @__PURE__ */ import_react8.default.createElement(
679
- import_renderer8.Text,
680
- {
681
- style: {
682
- color: textColor,
683
- fontSize,
684
- fontFamily,
685
- fontWeight: textBold ? "bold" : "normal"
686
- }
687
- },
688
- logoText
689
- )
690
- ));
665
+ generateQR();
666
+ }, [value, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel]);
667
+ const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(
668
+ value
669
+ )}&size=${size}x${size}`;
670
+ return /* @__PURE__ */ import_react8.default.createElement(import_renderer8.View, { style: [styles8.qrContainer, style] }, /* @__PURE__ */ import_react8.default.createElement(import_renderer8.Image, { src: qrDataUrl || fallbackUrl, style: { width: size, height: size } }));
691
671
  };
692
672
  var QR_default = QR;
693
673
 
694
674
  // src/components/core/Lista.tsx
695
675
  var import_react10 = __toESM(require("react"));
696
676
  var import_renderer9 = require("@react-pdf/renderer");
697
- var styles8 = import_renderer9.StyleSheet.create({
677
+ var styles9 = import_renderer9.StyleSheet.create({
698
678
  ul: {
699
679
  marginBottom: 10,
700
680
  paddingLeft: 15
@@ -764,7 +744,7 @@ var UL = ({ children, style, type = "disc" }) => {
764
744
  }
765
745
  return child;
766
746
  });
767
- return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles8.ul, style] }, childrenWithBullets);
747
+ return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles9.ul, style] }, childrenWithBullets);
768
748
  };
769
749
  var OL = ({ children, style, type = "decimal", start = 1 }) => {
770
750
  const childrenWithNumbers = import_react10.default.Children.map(children, (child, index) => {
@@ -778,7 +758,7 @@ var OL = ({ children, style, type = "decimal", start = 1 }) => {
778
758
  }
779
759
  return child;
780
760
  });
781
- return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles8.ol, style] }, childrenWithNumbers);
761
+ return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles9.ol, style] }, childrenWithNumbers);
782
762
  };
783
763
  var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1, start = 1, value }) => {
784
764
  let marker;
@@ -788,7 +768,7 @@ var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1,
788
768
  } else {
789
769
  marker = getBulletPoint(bulletType);
790
770
  }
791
- return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles8.li, style] }, /* @__PURE__ */ import_react10.default.createElement(import_renderer9.Text, { style: styles8.bulletPoint }, marker), /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: styles8.itemContent }, typeof children === "string" ? /* @__PURE__ */ import_react10.default.createElement(import_renderer9.Text, null, children) : children));
771
+ return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles9.li, style] }, /* @__PURE__ */ import_react10.default.createElement(import_renderer9.Text, { style: styles9.bulletPoint }, marker), /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: styles9.itemContent }, typeof children === "string" ? /* @__PURE__ */ import_react10.default.createElement(import_renderer9.Text, null, children) : children));
792
772
  };
793
773
 
794
774
  // src/components/core/index.tsx
package/dist/index.mjs CHANGED
@@ -71,7 +71,7 @@ var LayoutPDF_default = LayoutPDF;
71
71
 
72
72
  // src/components/core/Img.tsx
73
73
  import React2 from "react";
74
- import { Image, StyleSheet as StyleSheet2 } from "@react-pdf/renderer";
74
+ import { Image as Image2, StyleSheet as StyleSheet2 } from "@react-pdf/renderer";
75
75
  var styles2 = StyleSheet2.create({
76
76
  image: {
77
77
  width: "100%",
@@ -80,7 +80,7 @@ var styles2 = StyleSheet2.create({
80
80
  }
81
81
  });
82
82
  var Img = ({ src, style }) => {
83
- return /* @__PURE__ */ React2.createElement(Image, { src, style: [styles2.image, style] });
83
+ return /* @__PURE__ */ React2.createElement(Image2, { src, style: [styles2.image, style] });
84
84
  };
85
85
  var Img_default = Img;
86
86
 
@@ -439,174 +439,154 @@ var Footer = ({ children, style, fixed = false }) => {
439
439
 
440
440
  // src/components/core/QR.tsx
441
441
  import React8 from "react";
442
+ import { Image as Image3, StyleSheet as StyleSheet8, View as View5 } from "@react-pdf/renderer";
442
443
  import { useEffect, useState } from "react";
443
- import { Image as Image2, View as View5, Text as Text5 } from "@react-pdf/renderer";
444
- import QRCodeStyling from "qr-code-styling";
445
- var QR = ({
446
- url,
447
- size = 200,
448
- colorData = "#000000",
449
- colorDataBG = "#ffffff",
450
- logo,
451
- logoWidth = 30,
452
- logoHeight,
444
+
445
+ // src/components/core/QRGenerator.tsx
446
+ import QRCode from "qrcode";
447
+ var generateQRAsBase64 = async ({
448
+ value,
449
+ size = 150,
450
+ colorDark = "#000000",
451
+ colorLight = "#ffffff",
453
452
  margin = 0,
454
- errorCorrectionLevel = "H",
453
+ errorCorrectionLevel = "M"
454
+ }) => {
455
+ try {
456
+ const options = {
457
+ errorCorrectionLevel,
458
+ type: "image/png",
459
+ quality: 0.92,
460
+ margin,
461
+ color: {
462
+ dark: colorDark,
463
+ light: colorLight
464
+ },
465
+ width: size
466
+ };
467
+ const qrDataUrl = QRCode.toDataURL(value, options);
468
+ return qrDataUrl;
469
+ } catch (error) {
470
+ console.error("Error generando QR:", error);
471
+ return "";
472
+ }
473
+ };
474
+ var addLogoToQR = async (qrDataUrl, logoUrl, logoWidth, logoHeight) => {
475
+ return new Promise((resolve) => {
476
+ if (!qrDataUrl || !logoUrl) {
477
+ resolve(qrDataUrl);
478
+ return;
479
+ }
480
+ try {
481
+ const canvas = document.createElement("canvas");
482
+ const ctx = canvas.getContext("2d");
483
+ if (!ctx) {
484
+ resolve(qrDataUrl);
485
+ return;
486
+ }
487
+ const qrImage = new Image();
488
+ qrImage.crossOrigin = "anonymous";
489
+ qrImage.onload = () => {
490
+ canvas.width = qrImage.width;
491
+ canvas.height = qrImage.height;
492
+ ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height);
493
+ const logoImage = new Image();
494
+ logoImage.crossOrigin = "anonymous";
495
+ logoImage.onload = () => {
496
+ const x = (canvas.width - logoWidth) / 2;
497
+ const y = (canvas.height - logoHeight) / 2;
498
+ ctx.fillStyle = "#FFFFFF";
499
+ ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10);
500
+ ctx.drawImage(logoImage, x, y, logoWidth, logoHeight);
501
+ const finalQrDataUrl = canvas.toDataURL("image/png");
502
+ resolve(finalQrDataUrl);
503
+ };
504
+ logoImage.onerror = () => {
505
+ console.error("Error cargando el logo");
506
+ resolve(qrDataUrl);
507
+ };
508
+ logoImage.src = logoUrl;
509
+ };
510
+ qrImage.onerror = () => {
511
+ console.error("Error cargando el QR");
512
+ resolve("");
513
+ };
514
+ qrImage.src = qrDataUrl;
515
+ } catch (error) {
516
+ console.error("Error procesando el QR con logo:", error);
517
+ resolve(qrDataUrl);
518
+ }
519
+ });
520
+ };
521
+
522
+ // src/components/core/QR.tsx
523
+ var styles8 = StyleSheet8.create({
524
+ qrContainer: {
525
+ display: "flex",
526
+ alignItems: "center",
527
+ justifyContent: "center",
528
+ margin: 10
529
+ }
530
+ });
531
+ var errorLevelMap = {
532
+ 0: "L",
533
+ 1: "M",
534
+ 2: "Q",
535
+ 3: "H"
536
+ };
537
+ var QR = ({
538
+ value,
539
+ size = 150,
455
540
  style,
456
- dotType = "square",
457
- cornerSquareType = "square",
458
- cornerDotType = "square",
459
- cornerSquareColor,
460
- cornerDotColor,
461
- logoBG = colorDataBG,
462
- logoText,
463
- moveText = 0,
464
- textColor = colorData,
465
- fontSize = 12,
466
- fontFamily = "Helvetica",
467
- textBackgroundColor = colorDataBG,
468
- textPadding = 1,
469
- textBold = true
541
+ colorDark = "#000000",
542
+ colorLight = "#ffffff",
543
+ margin = 0,
544
+ logo = "",
545
+ logoWidth = 30,
546
+ logoHeight = 30,
547
+ errorCorrectionLevel = "M"
470
548
  }) => {
471
- const [qrDataURL, setQrDataURL] = useState(null);
472
- const actualLogoWidth = logoWidth || Math.floor(size * 0.2);
473
- const actualLogoHeight = logoHeight || actualLogoWidth;
549
+ const [qrDataUrl, setQrDataUrl] = useState("");
474
550
  useEffect(() => {
475
- if (typeof window === "undefined") return;
476
- const generateQRCode = async () => {
551
+ const generateQR = async () => {
477
552
  try {
478
- const qrCode = new QRCodeStyling({
479
- width: size,
480
- height: size,
481
- type: "canvas",
482
- data: url,
483
- dotsOptions: {
484
- color: colorData,
485
- type: dotType
486
- },
487
- cornersSquareOptions: {
488
- color: cornerSquareColor || colorData,
489
- type: cornerSquareType
490
- },
491
- cornersDotOptions: {
492
- color: cornerDotColor || colorData,
493
- type: cornerDotType
494
- },
495
- backgroundOptions: {
496
- color: colorDataBG
497
- },
498
- qrOptions: {
499
- errorCorrectionLevel
500
- },
501
- margin
553
+ const baseQrDataUrl = await generateQRAsBase64({
554
+ value,
555
+ size,
556
+ colorDark,
557
+ colorLight,
558
+ margin,
559
+ errorCorrectionLevel: typeof errorCorrectionLevel === "number" ? errorLevelMap[errorCorrectionLevel] || "M" : errorCorrectionLevel
502
560
  });
503
- const container = document.createElement("div");
504
- container.style.position = "absolute";
505
- container.style.top = "-9999px";
506
- container.style.left = "-9999px";
507
- document.body.appendChild(container);
508
- qrCode.append(container);
509
- setTimeout(() => {
510
- try {
511
- const qrCanvas = container.querySelector("canvas");
512
- if (qrCanvas) {
513
- const canvas = document.createElement("canvas");
514
- canvas.width = size;
515
- canvas.height = size;
516
- const ctx = canvas.getContext("2d");
517
- if (ctx) {
518
- ctx.drawImage(qrCanvas, 0, 0);
519
- const dataURL = canvas.toDataURL("image/png");
520
- setQrDataURL(dataURL);
521
- }
522
- }
523
- document.body.removeChild(container);
524
- } catch (error) {
525
- console.error("Error capturing QR code:", error);
526
- }
527
- }, 100);
561
+ if (logo && logoWidth && logoHeight) {
562
+ const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight);
563
+ setQrDataUrl(qrWithLogo);
564
+ } else {
565
+ setQrDataUrl(baseQrDataUrl);
566
+ }
528
567
  } catch (error) {
529
- console.error("Error generating QR code:", error);
568
+ console.error("Error generando QR:", error);
569
+ const fallbackUrl2 = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(
570
+ value
571
+ )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace("#", ""))}&bgcolor=${encodeURIComponent(
572
+ colorLight.replace("#", "")
573
+ )}`;
574
+ setQrDataUrl(fallbackUrl2);
530
575
  }
531
576
  };
532
- generateQRCode();
533
- }, [
534
- url,
535
- size,
536
- colorData,
537
- colorDataBG,
538
- margin,
539
- errorCorrectionLevel,
540
- dotType,
541
- cornerSquareType,
542
- cornerDotType,
543
- cornerSquareColor,
544
- cornerDotColor,
545
- logoBG
546
- ]);
547
- if (!qrDataURL) return null;
548
- const centerPosition = size / 2;
549
- const logoContainerSize = Math.max(actualLogoWidth, actualLogoHeight) + 10;
550
- return /* @__PURE__ */ React8.createElement(View5, { style: { width: size, height: size, position: "relative", ...style } }, /* @__PURE__ */ React8.createElement(Image2, { src: qrDataURL || "/placeholder.svg", style: { width: size, height: size } }), logo && /* @__PURE__ */ React8.createElement(
551
- View5,
552
- {
553
- style: {
554
- position: "absolute",
555
- width: logoContainerSize,
556
- height: logoContainerSize,
557
- backgroundColor: logoBG || colorDataBG,
558
- left: centerPosition - logoContainerSize / 2,
559
- top: centerPosition - logoContainerSize / 2,
560
- borderRadius: 100,
561
- border: `5px solid ${colorData}`,
562
- padding: 0
563
- }
564
- },
565
- /* @__PURE__ */ React8.createElement(
566
- Image2,
567
- {
568
- src: logo || "/placeholder.svg",
569
- style: {
570
- objectFit: "contain",
571
- width: actualLogoWidth,
572
- height: actualLogoHeight || actualLogoWidth
573
- }
574
- }
575
- )
576
- ), !logo && logoText && /* @__PURE__ */ React8.createElement(
577
- View5,
578
- {
579
- style: {
580
- position: "absolute",
581
- backgroundColor: textBackgroundColor,
582
- padding: textPadding,
583
- borderRadius: 4,
584
- left: moveText + centerPosition - 20,
585
- // Approximate center
586
- top: centerPosition - 10
587
- // Approximate center
588
- }
589
- },
590
- /* @__PURE__ */ React8.createElement(
591
- Text5,
592
- {
593
- style: {
594
- color: textColor,
595
- fontSize,
596
- fontFamily,
597
- fontWeight: textBold ? "bold" : "normal"
598
- }
599
- },
600
- logoText
601
- )
602
- ));
577
+ generateQR();
578
+ }, [value, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel]);
579
+ const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(
580
+ value
581
+ )}&size=${size}x${size}`;
582
+ return /* @__PURE__ */ React8.createElement(View5, { style: [styles8.qrContainer, style] }, /* @__PURE__ */ React8.createElement(Image3, { src: qrDataUrl || fallbackUrl, style: { width: size, height: size } }));
603
583
  };
604
584
  var QR_default = QR;
605
585
 
606
586
  // src/components/core/Lista.tsx
607
587
  import React9 from "react";
608
- import { View as View6, Text as Text6, StyleSheet as StyleSheet8 } from "@react-pdf/renderer";
609
- var styles8 = StyleSheet8.create({
588
+ import { View as View6, Text as Text5, StyleSheet as StyleSheet9 } from "@react-pdf/renderer";
589
+ var styles9 = StyleSheet9.create({
610
590
  ul: {
611
591
  marginBottom: 10,
612
592
  paddingLeft: 15
@@ -676,7 +656,7 @@ var UL = ({ children, style, type = "disc" }) => {
676
656
  }
677
657
  return child;
678
658
  });
679
- return /* @__PURE__ */ React9.createElement(View6, { style: [styles8.ul, style] }, childrenWithBullets);
659
+ return /* @__PURE__ */ React9.createElement(View6, { style: [styles9.ul, style] }, childrenWithBullets);
680
660
  };
681
661
  var OL = ({ children, style, type = "decimal", start = 1 }) => {
682
662
  const childrenWithNumbers = React9.Children.map(children, (child, index) => {
@@ -690,7 +670,7 @@ var OL = ({ children, style, type = "decimal", start = 1 }) => {
690
670
  }
691
671
  return child;
692
672
  });
693
- return /* @__PURE__ */ React9.createElement(View6, { style: [styles8.ol, style] }, childrenWithNumbers);
673
+ return /* @__PURE__ */ React9.createElement(View6, { style: [styles9.ol, style] }, childrenWithNumbers);
694
674
  };
695
675
  var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1, start = 1, value }) => {
696
676
  let marker;
@@ -700,11 +680,11 @@ var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1,
700
680
  } else {
701
681
  marker = getBulletPoint(bulletType);
702
682
  }
703
- return /* @__PURE__ */ React9.createElement(View6, { style: [styles8.li, style] }, /* @__PURE__ */ React9.createElement(Text6, { style: styles8.bulletPoint }, marker), /* @__PURE__ */ React9.createElement(View6, { style: styles8.itemContent }, typeof children === "string" ? /* @__PURE__ */ React9.createElement(Text6, null, children) : children));
683
+ return /* @__PURE__ */ React9.createElement(View6, { style: [styles9.li, style] }, /* @__PURE__ */ React9.createElement(Text5, { style: styles9.bulletPoint }, marker), /* @__PURE__ */ React9.createElement(View6, { style: styles9.itemContent }, typeof children === "string" ? /* @__PURE__ */ React9.createElement(Text5, null, children) : children));
704
684
  };
705
685
 
706
686
  // src/components/core/index.tsx
707
- import { View as View7, Text as Text7, StyleSheet as StyleSheet9, Font } from "@react-pdf/renderer";
687
+ import { View as View7, Text as Text6, StyleSheet as StyleSheet10, Font } from "@react-pdf/renderer";
708
688
 
709
689
  // src/functions/decodeBase64Pdf.ts
710
690
  var decodeBase64Pdf = (base64, fileName) => {
@@ -796,11 +776,11 @@ export {
796
776
  Small,
797
777
  Span,
798
778
  Strong,
799
- StyleSheet9 as StyleSheet,
779
+ StyleSheet10 as StyleSheet,
800
780
  Table,
801
781
  Tbody,
802
782
  Td,
803
- Text7 as Text,
783
+ Text6 as Text,
804
784
  Th,
805
785
  Thead,
806
786
  Tr,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-pdf-levelup",
3
- "version": "2.0.21",
3
+ "version": "2.0.26",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -20,9 +20,9 @@
20
20
  },
21
21
  "peerDependencies": {
22
22
  "@react-pdf/renderer": "^4.3.0",
23
+ "qrcode": "^1.5.4",
23
24
  "react": "^18",
24
- "react-dom": "^18",
25
- "qr-code-styling": "^1.9.2"
25
+ "react-dom": "^18"
26
26
  },
27
27
  "dependencies": {
28
28
  "@babel/standalone": "^7.23.10",
@@ -37,6 +37,7 @@
37
37
  "devDependencies": {
38
38
  "@eslint/js": "^9.21.0",
39
39
  "@react-pdf/types": "^2.9.0",
40
+ "@types/qrcode": "^1.5.5",
40
41
  "@types/react": "^18.2.56",
41
42
  "@types/react-dom": "^18.2.19",
42
43
  "@vitejs/plugin-react": "^4.3.4",