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 +7 -21
- package/dist/index.d.ts +7 -21
- package/dist/index.js +135 -155
- package/dist/index.mjs +141 -161
- package/package.json +4 -3
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,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
|
|
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
|
-
|
|
564
|
-
const generateQRCode = async () => {
|
|
639
|
+
const generateQR = async () => {
|
|
565
640
|
try {
|
|
566
|
-
const
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
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
|
|
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
|
-
|
|
621
|
-
}, [
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
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
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
476
|
-
const generateQRCode = async () => {
|
|
551
|
+
const generateQR = async () => {
|
|
477
552
|
try {
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
|
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
|
-
|
|
533
|
-
}, [
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
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
|
|
609
|
-
var
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
|
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
|
-
|
|
779
|
+
StyleSheet10 as StyleSheet,
|
|
800
780
|
Table,
|
|
801
781
|
Tbody,
|
|
802
782
|
Td,
|
|
803
|
-
|
|
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.
|
|
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",
|