react-pdf-levelup 2.0.28 → 2.0.32
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 +7 -21
- package/dist/index.d.ts +7 -21
- package/dist/index.js +135 -154
- package/dist/index.mjs +141 -160
- package/package.json +3 -2
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
|
|
113
|
-
|
|
112
|
+
interface QRProps {
|
|
113
|
+
value: string;
|
|
114
114
|
size?: number;
|
|
115
|
-
|
|
116
|
-
|
|
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<
|
|
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
|
|
113
|
-
|
|
112
|
+
interface QRProps {
|
|
113
|
+
value: string;
|
|
114
114
|
size?: number;
|
|
115
|
-
|
|
116
|
-
|
|
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<
|
|
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,173 +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
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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 = "
|
|
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
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
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 [
|
|
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
|
-
const
|
|
639
|
+
const generateQR = async () => {
|
|
564
640
|
try {
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
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
|
|
641
|
+
const baseQrDataUrl = await generateQRAsBase64({
|
|
642
|
+
value,
|
|
643
|
+
size,
|
|
644
|
+
colorDark,
|
|
645
|
+
colorLight,
|
|
646
|
+
margin,
|
|
647
|
+
errorCorrectionLevel: typeof errorCorrectionLevel === "number" ? errorLevelMap[errorCorrectionLevel] || "M" : errorCorrectionLevel
|
|
589
648
|
});
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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);
|
|
649
|
+
if (logo && logoWidth && logoHeight) {
|
|
650
|
+
const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight);
|
|
651
|
+
setQrDataUrl(qrWithLogo);
|
|
652
|
+
} else {
|
|
653
|
+
setQrDataUrl(baseQrDataUrl);
|
|
654
|
+
}
|
|
615
655
|
} catch (error) {
|
|
616
|
-
console.error("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);
|
|
617
663
|
}
|
|
618
664
|
};
|
|
619
|
-
|
|
620
|
-
}, [
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
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
|
-
));
|
|
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 } }));
|
|
690
671
|
};
|
|
691
672
|
var QR_default = QR;
|
|
692
673
|
|
|
693
674
|
// src/components/core/Lista.tsx
|
|
694
675
|
var import_react10 = __toESM(require("react"));
|
|
695
676
|
var import_renderer9 = require("@react-pdf/renderer");
|
|
696
|
-
var
|
|
677
|
+
var styles9 = import_renderer9.StyleSheet.create({
|
|
697
678
|
ul: {
|
|
698
679
|
marginBottom: 10,
|
|
699
680
|
paddingLeft: 15
|
|
@@ -763,7 +744,7 @@ var UL = ({ children, style, type = "disc" }) => {
|
|
|
763
744
|
}
|
|
764
745
|
return child;
|
|
765
746
|
});
|
|
766
|
-
return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [
|
|
747
|
+
return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles9.ul, style] }, childrenWithBullets);
|
|
767
748
|
};
|
|
768
749
|
var OL = ({ children, style, type = "decimal", start = 1 }) => {
|
|
769
750
|
const childrenWithNumbers = import_react10.default.Children.map(children, (child, index) => {
|
|
@@ -777,7 +758,7 @@ var OL = ({ children, style, type = "decimal", start = 1 }) => {
|
|
|
777
758
|
}
|
|
778
759
|
return child;
|
|
779
760
|
});
|
|
780
|
-
return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [
|
|
761
|
+
return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [styles9.ol, style] }, childrenWithNumbers);
|
|
781
762
|
};
|
|
782
763
|
var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1, start = 1, value }) => {
|
|
783
764
|
let marker;
|
|
@@ -787,7 +768,7 @@ var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1,
|
|
|
787
768
|
} else {
|
|
788
769
|
marker = getBulletPoint(bulletType);
|
|
789
770
|
}
|
|
790
|
-
return /* @__PURE__ */ import_react10.default.createElement(import_renderer9.View, { style: [
|
|
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));
|
|
791
772
|
};
|
|
792
773
|
|
|
793
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(
|
|
83
|
+
return /* @__PURE__ */ React2.createElement(Image2, { src, style: [styles2.image, style] });
|
|
84
84
|
};
|
|
85
85
|
var Img_default = Img;
|
|
86
86
|
|
|
@@ -439,173 +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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
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 = "
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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 [
|
|
472
|
-
const actualLogoWidth = logoWidth || Math.floor(size * 0.2);
|
|
473
|
-
const actualLogoHeight = logoHeight || actualLogoWidth;
|
|
549
|
+
const [qrDataUrl, setQrDataUrl] = useState("");
|
|
474
550
|
useEffect(() => {
|
|
475
|
-
const
|
|
551
|
+
const generateQR = async () => {
|
|
476
552
|
try {
|
|
477
|
-
const
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
|
553
|
+
const baseQrDataUrl = await generateQRAsBase64({
|
|
554
|
+
value,
|
|
555
|
+
size,
|
|
556
|
+
colorDark,
|
|
557
|
+
colorLight,
|
|
558
|
+
margin,
|
|
559
|
+
errorCorrectionLevel: typeof errorCorrectionLevel === "number" ? errorLevelMap[errorCorrectionLevel] || "M" : errorCorrectionLevel
|
|
501
560
|
});
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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);
|
|
561
|
+
if (logo && logoWidth && logoHeight) {
|
|
562
|
+
const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight);
|
|
563
|
+
setQrDataUrl(qrWithLogo);
|
|
564
|
+
} else {
|
|
565
|
+
setQrDataUrl(baseQrDataUrl);
|
|
566
|
+
}
|
|
527
567
|
} catch (error) {
|
|
528
|
-
console.error("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);
|
|
529
575
|
}
|
|
530
576
|
};
|
|
531
|
-
|
|
532
|
-
}, [
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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
|
-
));
|
|
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 } }));
|
|
602
583
|
};
|
|
603
584
|
var QR_default = QR;
|
|
604
585
|
|
|
605
586
|
// src/components/core/Lista.tsx
|
|
606
587
|
import React9 from "react";
|
|
607
|
-
import { View as View6, Text as
|
|
608
|
-
var
|
|
588
|
+
import { View as View6, Text as Text5, StyleSheet as StyleSheet9 } from "@react-pdf/renderer";
|
|
589
|
+
var styles9 = StyleSheet9.create({
|
|
609
590
|
ul: {
|
|
610
591
|
marginBottom: 10,
|
|
611
592
|
paddingLeft: 15
|
|
@@ -675,7 +656,7 @@ var UL = ({ children, style, type = "disc" }) => {
|
|
|
675
656
|
}
|
|
676
657
|
return child;
|
|
677
658
|
});
|
|
678
|
-
return /* @__PURE__ */ React9.createElement(View6, { style: [
|
|
659
|
+
return /* @__PURE__ */ React9.createElement(View6, { style: [styles9.ul, style] }, childrenWithBullets);
|
|
679
660
|
};
|
|
680
661
|
var OL = ({ children, style, type = "decimal", start = 1 }) => {
|
|
681
662
|
const childrenWithNumbers = React9.Children.map(children, (child, index) => {
|
|
@@ -689,7 +670,7 @@ var OL = ({ children, style, type = "decimal", start = 1 }) => {
|
|
|
689
670
|
}
|
|
690
671
|
return child;
|
|
691
672
|
});
|
|
692
|
-
return /* @__PURE__ */ React9.createElement(View6, { style: [
|
|
673
|
+
return /* @__PURE__ */ React9.createElement(View6, { style: [styles9.ol, style] }, childrenWithNumbers);
|
|
693
674
|
};
|
|
694
675
|
var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1, start = 1, value }) => {
|
|
695
676
|
let marker;
|
|
@@ -699,11 +680,11 @@ var LI = ({ children, style, bulletType = "disc", isOrdered = false, index = 1,
|
|
|
699
680
|
} else {
|
|
700
681
|
marker = getBulletPoint(bulletType);
|
|
701
682
|
}
|
|
702
|
-
return /* @__PURE__ */ React9.createElement(View6, { style: [
|
|
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));
|
|
703
684
|
};
|
|
704
685
|
|
|
705
686
|
// src/components/core/index.tsx
|
|
706
|
-
import { View as View7, Text as
|
|
687
|
+
import { View as View7, Text as Text6, StyleSheet as StyleSheet10, Font } from "@react-pdf/renderer";
|
|
707
688
|
|
|
708
689
|
// src/functions/decodeBase64Pdf.ts
|
|
709
690
|
var decodeBase64Pdf = (base64, fileName) => {
|
|
@@ -795,11 +776,11 @@ export {
|
|
|
795
776
|
Small,
|
|
796
777
|
Span,
|
|
797
778
|
Strong,
|
|
798
|
-
|
|
779
|
+
StyleSheet10 as StyleSheet,
|
|
799
780
|
Table,
|
|
800
781
|
Tbody,
|
|
801
782
|
Td,
|
|
802
|
-
|
|
783
|
+
Text6 as Text,
|
|
803
784
|
Th,
|
|
804
785
|
Thead,
|
|
805
786
|
Tr,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-pdf-levelup",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.32",
|
|
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
|
-
"
|
|
23
|
+
"qrcode": "^1.5.4",
|
|
24
24
|
"react": "^18",
|
|
25
25
|
"react-dom": "^18"
|
|
26
26
|
},
|
|
@@ -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",
|