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 +21 -7
- package/dist/index.d.ts +21 -7
- package/dist/index.js +154 -135
- package/dist/index.mjs +160 -141
- package/package.json +2 -3
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
|
|
113
|
-
|
|
112
|
+
interface QRCustomProps {
|
|
113
|
+
url: string;
|
|
114
114
|
size?: number;
|
|
115
|
-
|
|
116
|
-
|
|
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<
|
|
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
|
|
113
|
-
|
|
112
|
+
interface QRCustomProps {
|
|
113
|
+
url: string;
|
|
114
114
|
size?: number;
|
|
115
|
-
|
|
116
|
-
|
|
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<
|
|
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
|
-
|
|
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
|
-
|
|
627
|
-
size =
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
margin = 0,
|
|
632
|
-
logo = "",
|
|
534
|
+
url,
|
|
535
|
+
size = 200,
|
|
536
|
+
colorData = "#000000",
|
|
537
|
+
colorDataBG = "#ffffff",
|
|
538
|
+
logo,
|
|
633
539
|
logoWidth = 30,
|
|
634
|
-
logoHeight
|
|
635
|
-
|
|
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 [
|
|
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
|
|
563
|
+
const generateQRCode = async () => {
|
|
640
564
|
try {
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
size,
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
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
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
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
|
|
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
|
-
|
|
666
|
-
}, [
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
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
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
539
|
-
size =
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
margin = 0,
|
|
544
|
-
logo = "",
|
|
446
|
+
url,
|
|
447
|
+
size = 200,
|
|
448
|
+
colorData = "#000000",
|
|
449
|
+
colorDataBG = "#ffffff",
|
|
450
|
+
logo,
|
|
545
451
|
logoWidth = 30,
|
|
546
|
-
logoHeight
|
|
547
|
-
|
|
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 [
|
|
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
|
|
475
|
+
const generateQRCode = async () => {
|
|
552
476
|
try {
|
|
553
|
-
const
|
|
554
|
-
|
|
555
|
-
size,
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
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
|
|
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
|
-
|
|
578
|
-
}, [
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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
|
|
589
|
-
var
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
|
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
|
-
|
|
798
|
+
StyleSheet9 as StyleSheet,
|
|
780
799
|
Table,
|
|
781
800
|
Tbody,
|
|
782
801
|
Td,
|
|
783
|
-
|
|
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.
|
|
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
|
-
"
|
|
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",
|