react-pdf-levelup 2.0.26 → 2.0.28

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