pdf-catalog-generator 3.1.0 → 3.1.3
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.js +4 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1005,26 +1005,6 @@ renderer.Font.registerEmojiSource({
|
|
|
1005
1005
|
format: "png",
|
|
1006
1006
|
url: "https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/"
|
|
1007
1007
|
});
|
|
1008
|
-
function normalizeImageSource(imageSource) {
|
|
1009
|
-
if (imageSource.startsWith("data:")) {
|
|
1010
|
-
return imageSource;
|
|
1011
|
-
}
|
|
1012
|
-
if (imageSource.startsWith("http://") || imageSource.startsWith("https://")) {
|
|
1013
|
-
return imageSource;
|
|
1014
|
-
}
|
|
1015
|
-
let mimeType = "image/png";
|
|
1016
|
-
const base64Start = imageSource.substring(0, 20).toLowerCase();
|
|
1017
|
-
if (base64Start.includes("ivborw0kggo") || imageSource.startsWith("iVBORw0KGgo")) {
|
|
1018
|
-
mimeType = "image/png";
|
|
1019
|
-
} else if (base64Start.includes("/9j/4aaq") || imageSource.startsWith("/9j/4AAQ")) {
|
|
1020
|
-
mimeType = "image/jpeg";
|
|
1021
|
-
} else if (base64Start.includes("r0lgodlh") || imageSource.startsWith("R0lGODlh")) {
|
|
1022
|
-
mimeType = "image/gif";
|
|
1023
|
-
} else if (base64Start.includes("uklgr") || imageSource.startsWith("UklGR")) {
|
|
1024
|
-
mimeType = "image/webp";
|
|
1025
|
-
}
|
|
1026
|
-
return `data:${mimeType};base64,${imageSource}`;
|
|
1027
|
-
}
|
|
1028
1008
|
async function generateProductCatalog(config) {
|
|
1029
1009
|
const { products, companyLogo, companyName, template = "template1" } = config;
|
|
1030
1010
|
let TemplateComponent;
|
|
@@ -1055,7 +1035,7 @@ async function generateProductCatalog(config) {
|
|
|
1055
1035
|
Template4_default,
|
|
1056
1036
|
{
|
|
1057
1037
|
products,
|
|
1058
|
-
companyLogo
|
|
1038
|
+
companyLogo,
|
|
1059
1039
|
companyName
|
|
1060
1040
|
}
|
|
1061
1041
|
) }) });
|
|
@@ -1069,7 +1049,7 @@ async function generateProductCatalog(config) {
|
|
|
1069
1049
|
Template,
|
|
1070
1050
|
{
|
|
1071
1051
|
products,
|
|
1072
|
-
companyLogo
|
|
1052
|
+
companyLogo,
|
|
1073
1053
|
companyName
|
|
1074
1054
|
}
|
|
1075
1055
|
) }) });
|
|
@@ -1079,9 +1059,8 @@ async function generateProductCatalog(config) {
|
|
|
1079
1059
|
}
|
|
1080
1060
|
const doc = /* @__PURE__ */ jsxRuntime.jsx(renderer.Document, { children: /* @__PURE__ */ jsxRuntime.jsxs(renderer.Page, { size: "A4", style: styles7.page, children: [
|
|
1081
1061
|
/* @__PURE__ */ jsxRuntime.jsxs(renderer.View, { style: styles7.header, children: [
|
|
1082
|
-
companyLogo && /* @__PURE__ */ jsxRuntime.jsx(renderer.View, { style: styles7.logoSection, children: /* @__PURE__ */ jsxRuntime.jsx(renderer.Image, { style: styles7.logo, src:
|
|
1083
|
-
/* @__PURE__ */ jsxRuntime.jsx(renderer.View, { style: styles7.storeNameSection, children: /* @__PURE__ */ jsxRuntime.jsx(renderer.Text, { style: styles7.storeName, children: companyName }) })
|
|
1084
|
-
/* @__PURE__ */ jsxRuntime.jsx(renderer.View, { break: true })
|
|
1062
|
+
companyLogo && /* @__PURE__ */ jsxRuntime.jsx(renderer.View, { style: styles7.logoSection, children: /* @__PURE__ */ jsxRuntime.jsx(renderer.Image, { style: styles7.logo, src: companyLogo }) }),
|
|
1063
|
+
/* @__PURE__ */ jsxRuntime.jsx(renderer.View, { style: styles7.storeNameSection, children: /* @__PURE__ */ jsxRuntime.jsx(renderer.Text, { style: styles7.storeName, children: companyName }) })
|
|
1085
1064
|
] }),
|
|
1086
1065
|
/* @__PURE__ */ jsxRuntime.jsx(TemplateComponent, { products })
|
|
1087
1066
|
] }) });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/fieldHelpers.ts","../src/utils/templateHelpers.tsx","../src/templates/Template1.tsx","../src/templates/Template2.tsx","../src/templates/Template3.tsx","../src/templates/Template4.tsx","../src/templates/Template5.tsx","../src/templates/Template6.tsx","../src/generator.tsx","../src/parser.ts"],"names":["StyleSheet","styles","jsx","View","jsxs","Text","Link","Image","Fragment","getImage2Url","Font","doc","Document","Page","blob","pdf","arrayBuffer","XLSX"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,SAAS,gBAAgB,SAAA,EAA2B;AAEzD,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAGvF,EAAA,IAAI,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AAG9C,EAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA;AAGxD,EAAA,SAAA,GAAY,UACT,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,MAAA,OAAO,KAAK,WAAA,EAAY;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAClE,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,OAAO,SAAA;AACT;AAMO,SAAS,SAAS,KAAA,EAAqB;AAC5C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,WAAA,CACd,OAAA,EACA,QAAA,GAAW,sEAAA,EACH;AAER,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,UAAA,EAAY,KAAA,EAAO,SAAS,SAAS,CAAA;AAExF,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAMO,SAAS,iBAAiB,OAAA,EAAmD;AAElF,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,UAAA,EAAY,KAAA,EAAO,SAAS,SAAS,CAAA;AAExF,EAAA,OAAO,MAAA,CAAO,QAAQ,OAAO,CAAA,CAC1B,OAAO,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAExB,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,KAAA;AAEtC,IAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,GAAA,EAAK,KAAwB,CAAC,CAAA;AAC1D;AAKO,SAAS,aAAA,CACd,OAAA,EACA,SAAA,EACA,QAAA,EACG;AACH,EAAA,MAAM,KAAA,GAAQ,QAAQ,SAAS,CAAA;AAC/B,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,GAAK,KAAA,GAAc,QAAA;AAC1C;AAKO,SAAS,aAAA,CAAc,OAAA,EAAsB,QAAA,GAAW,SAAA,EAAmB;AAChF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,cAAc,OAAA,EAA8C;AAC1E,EAAA,MAAM,cAAc,CAAC,OAAA,EAAS,SAAS,MAAA,EAAQ,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAEzE,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,eAAe,OAAA,EAAqC;AAClE,EAAA,MAAM,eAAe,CAAC,QAAA,EAAU,UAAU,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAE5E,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,OAAA,EAAqC;AAChE,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAA,EAAO,YAAA,EAAc,cAAc,MAAM,CAAA;AAEpF,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,oBAAoB,OAAA,EAAqC;AACvE,EAAA,MAAM,UAAA,GAAa,CAAC,aAAA,EAAe,aAAA,EAAe,WAAW,SAAA,EAAW,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAE9F,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AC5KO,IAAM,uBAAA,GAA0B;AAAA,EACrC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAuBO,SAAS,oBAAA,CACd,OAAA,EACA,OAAA,GAKI,EAAC,EACY;AACjB,EAAA,MAAM,EAAE,gBAAA,EAAkB,aAAA,GAAgB,IAAG,GAAI,OAAA;AAGjD,EAAA,MAAM,QAAA,GAAW,YAAY,OAAO,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,oBAAoB,OAAO,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AAGjC,EAAA,MAAM,mBAAA,GAAsB;AAAA,IAC1B,GAAG,uBAAA;AAAA,IACH,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa;AAAA,GAC7C;AAGA,EAAA,IAAI,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAO,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAEnE,IAAA,IAAI,oBAAoB,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,GAAG,OAAO,KAAA;AAE5D,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,KAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,IAAI,gBAAA,KAAqB,MAAA,IAAa,aAAA,CAAc,MAAA,GAAS,gBAAA,EAAkB;AAC7E,IAAA,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,IAAM,kBAAA,GAAqBA,oBAAW,MAAA,CAAO;AAAA,EAClD,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa,CAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA;AAEhB,CAAC;AAUM,SAAS,mBAAA,CACd,QACAC,OAAAA,EAMA;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,cAAA,GAAiBA,OAAAA,EAAQ,SAAA,IAAa,EAAE,cAAc,CAAA,EAAE;AAC9D,EAAA,MAAM,QAAA,GAAWA,OAAAA,EAAQ,GAAA,IAAO,kBAAA,CAAmB,SAAA;AACnD,EAAA,MAAM,UAAA,GAAaA,OAAAA,EAAQ,KAAA,IAAS,kBAAA,CAAmB,WAAA;AACvD,EAAA,MAAM,UAAA,GAAaA,OAAAA,EAAQ,KAAA,IAAS,kBAAA,CAAmB,WAAA;AAEvD,EAAA,uBACEC,cAAA,CAACC,aAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EACV,iBAAO,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBACtBC,eAAA,CAACD,aAAA,EAAA,EAAe,OAAO,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAAC,eAAA,CAACC,aAAA,EAAA,EAAK,OAAO,UAAA,EAAa,QAAA,EAAA;AAAA,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA;AAAA,mCAC/CA,aAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EAAa,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,GAAA,EAAA,EAF/B,GAGX,CACD,CAAA,EACH,CAAA;AAEJ;AAUO,SAAS,YAAA,CAAa,QAAuB,KAAA,EAAY;AAC9D,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,IAAA;AAC5B,EAAA,uBAAOD,eAAA,CAACC,iBAAK,KAAA,EAAc,QAAA,EAAA;AAAA,IAAA,SAAA;AAAA,IAAG;AAAA,GAAA,EAAO,CAAA;AACvC;AAWO,SAAS,WAAA,CACd,KAAA,EACA,KAAA,EACA,MAAA,GAAiB,MAAA,EACjB;AACA,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAE3B,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,CAAA,CAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AAChF,EAAA,uBAAOH,cAAA,CAACG,aAAA,EAAA,EAAK,KAAA,EAAe,QAAA,EAAA,SAAA,EAAU,CAAA;AACxC;AAYO,SAAS,eAAA,CACd,IAAA,EACA,KAAA,EACA,UAAA,GAAqB,WACrB,QAAA,EACA;AACA,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAE9C,EAAA,uBACED,eAAA,CAACE,aAAA,EAAA,EAAK,GAAA,EAAK,IAAA,EAAM,KAAA,EACd,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,mCACAD,aAAA,EAAA,EAAK,KAAA,EAAO,EAAE,gBAAA,EAAkB,CAAA,IAAM,QAAA,EAAA,UAAA,EAAW;AAAA,GAAA,EACpD,CAAA;AAEJ;AA0BO,IAAM,uBAAA,GAA0C;AAAA,EACrD,gBAAA,EAAkB,MAAA;AAAA;AAAA,EAClB,UAAA,EAAY,IAAA;AAAA,EACZ,eAAA,EAAiB,IAAA;AAAA,EACjB,SAAA,EAAW,IAAA;AAAA,EACX,aAAA,EAAe,IAAA;AAAA,EACf,WAAA,EAAa,MAAA;AAAA,EACb,aAAA,EAAe;AACjB;AAKO,SAAS,mBAAA,CACd,MAAA,GAAkC,EAAC,EACnB;AAChB,EAAA,OAAO;AAAA,IACL,GAAG,uBAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AC9QA,IAAM,MAAA,GAASL,oBAAW,MAAA,CAAO;AAAA,EAC/B,gBAAA,EAAkB;AAAA,IAChB,aAAA,EAAe,KAAA;AAAA,IACf,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,cAAA,EAAgB,EAAA;AAAA,IAChB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW,GAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,CAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc,EAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,eAAA,EAAiB,OAAA;AAAA,IACjB,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA,IACb,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB;AAAA;AAEpB,CAAC,CAAA;AAED,IAAM,SAAA,GAAqC,CAAC,EAAE,QAAA,EAAS,KAAM;AAC3D,EAAA,uBACEE,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,gBAAA,EACjB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AAEhC,IAAA,MAAM,MAAA,GAAS,qBAAqB,OAAO,CAAA;AAE3C,IAAA,uBACEC,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAO,OAAO,cAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAD,eAACK,cAAA,EAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,GAAA,EAAK,OAAO,QAAA,EAAU,CAAA;AAAA,sBAGlDH,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAO,OAAO,eAAA,EAClB,QAAA,EAAA;AAAA,wBAAAD,eAACG,aAAAA,EAAA,EAAK,OAAO,MAAA,CAAO,YAAA,EAAe,iBAAO,KAAA,EAAM,CAAA;AAAA,QAC/C,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,WAAW;AAAA,OAAA,EACjD,CAAA;AAAA,MAGC,MAAA,CAAO,WAAA,oBACNH,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,kBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,WAAA,EAAY,CAAA;AAAA,MAI7D,mBAAA,CAAoB,OAAO,aAAa,CAAA;AAAA,MAGxC,eAAA;AAAA,QACC,MAAA,CAAO,IAAA;AAAA,QACP,MAAA,CAAO,SAAA;AAAA,QACP,SAAA;AAAA,QACA,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,YAAY;AAAA;AAC/C,KAAA,EAAA,EAxBS,KAyBX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;ACxGf,IAAMJ,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,gBAAA,EAAkB;AAAA,IAChB,aAAA,EAAe,KAAA;AAAA,IACf,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAA;AAAA,IACT,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,CAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA,IACb,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB;AAAA;AAEpB,CAAC,CAAA;AAED,IAAM,SAAA,GAAqC,CAAC,EAAE,QAAA,EAAS,KAAM;AAC3D,EAAA,uBACEE,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,OAAAA,CAAO,gBAAA,EACjB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AAEhC,IAAA,MAAM,MAAA,GAAS,qBAAqB,OAAO,CAAA;AAE3C,IAAA,uBACEG,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAOF,QAAO,cAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,mBAAA,EAClB,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACK,gBAAA,EAAM,KAAA,EAAON,QAAO,KAAA,EAAO,GAAA,EAAK,OAAO,QAAA,EAAU,CAAA;AAAA,QACjD,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQA,OAAAA,CAAO,WAAW;AAAA,OAAA,EACjD,CAAA;AAAA,sBAGAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,kBAAA,EAElB,QAAA,EAAA;AAAA,wBAAAG,eAAAA;AAAA,UAACD,aAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,KAAA;AAAA,cACf,cAAA,EAAgB;AAAA,aAClB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,eAACG,aAAAA,EAAA,EAAK,OAAOJ,OAAAA,CAAO,YAAA,EAAe,iBAAO,KAAA,EAAM,CAAA;AAAA,cAC/C,WAAA,CAAY,MAAA,CAAO,KAAA,EAAOA,OAAAA,CAAO,YAAY;AAAA;AAAA;AAAA,SAChD;AAAA,QAGC,MAAA,CAAO,WAAA,oBACNC,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,kBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,WAAA,EAAY,CAAA;AAAA,QAI7D,mBAAA,CAAoB,OAAO,aAAa,CAAA;AAAA,QAGxC,eAAA,CAAgB,MAAA,CAAO,IAAA,EAAMA,OAAAA,CAAO,SAAS;AAAA,OAAA,EAChD;AAAA,KAAA,EAAA,EA/BS,KAgCX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;AC5Hf,IAAMA,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,KAAA;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,aAAa,EAAC;AAAA,EACd,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,CAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA,IACb,SAAA,EAAW,EAAA;AAAA,IACX,cAAA,EAAgB;AAAA;AAEpB,CAAC,CAAA;AAGD,IAAM,yBAAA,GAA4BA,oBAAW,MAAA,CAAO;AAAA,EAClD,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa,CAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA;AAEhB,CAAC,CAAA;AAED,IAAM,SAAA,GAAqC,CAAC,EAAE,QAAA,EAAS,KAAM;AAC3D,EAAA,uBACEE,cAAAA,CAAAM,mBAAA,EAAA,EACG,mBAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAEhC,IAAA,MAAM,SAAS,oBAAA,CAAqB,OAAA,EAAS,EAAE,gBAAA,EAAkB,GAAG,CAAA;AAEpE,IAAA,uBACEJ,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAOF,QAAO,cAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAACK,gBAAA,EAAM,KAAA,EAAON,QAAO,KAAA,EAAO,GAAA,EAAK,OAAO,QAAA,EAAU,CAAA;AAAA,sBAGlDG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,iBAAA,EAElB,QAAA,EAAA;AAAA,wBAAAC,eAACG,aAAAA,EAAA,EAAK,OAAOJ,OAAAA,CAAO,YAAA,EAAe,iBAAO,KAAA,EAAM,CAAA;AAAA,wBAGhDG,eAAAA;AAAA,UAACD,aAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,KAAA;AAAA,cACf,cAAA,EAAgB;AAAA,aAClB;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,WAAA,CAAY,MAAA,CAAO,KAAA,EAAOF,OAAAA,CAAO,YAAY,CAAA;AAAA,cAC7C,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQA,OAAAA,CAAO,WAAW;AAAA;AAAA;AAAA,SACjD;AAAA,QAGC,MAAA,CAAO,WAAA,oBACNC,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,kBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,WAAA,EAAY,CAAA;AAAA,QAI7D,mBAAA,CAAoB,OAAO,aAAA,EAAe;AAAA,UACzC,KAAK,yBAAA,CAA0B,SAAA;AAAA,UAC/B,OAAO,yBAAA,CAA0B,WAAA;AAAA,UACjC,OAAO,yBAAA,CAA0B;AAAA,SAClC,CAAA;AAAA,QAGA,eAAA,CAAgB,MAAA,CAAO,IAAA,EAAMA,OAAAA,CAAO,SAAS;AAAA,OAAA,EAChD,CAAA;AAAA,sBAGAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAK,IAAA,EAAC;AAAA,KAAA,EAAA,EAtCH,KAuCX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;AC3If,IAAMF,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,SAAA;AAAA,IACjB,OAAA,EAAS,EAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,eAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,eAAA,EAAiB,SAAA;AAAA,IACjB,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU,KAAA;AAAA,IACV,QAAA,EAAU,KAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAEZ,CAAC,CAAA;AAGD,IAAM,qBAAA,GAAwBA,oBAAW,MAAA,CAAO;AAAA,EAC9C,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,QAAA,EAAU,MAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,KAAA,EAAO,KAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY;AAAA;AAEhB,CAAC,CAAA;AAMD,SAAS,sBAAsB,MAAA,EAAqC;AAClE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,uBACEE,eAACC,aAAAA,EAAA,EAAK,OAAO,qBAAA,CAAsB,eAAA,EAChC,iBAAO,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,sBACtBC,eAAAA,CAACD,eAAA,EAAe,KAAA,EAAO,sBAAsB,WAAA,EAC3C,QAAA,EAAA;AAAA,oBAAAC,eAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAO,sBAAsB,UAAA,EAChC,QAAA,EAAA;AAAA,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,MAAE;AAAA,KAAA,EACxB,CAAA;AAAA,oBACAH,eAACG,aAAAA,EAAA,EAAK,OAAO,qBAAA,CAAsB,UAAA,EAChC,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EACf;AAAA,GAAA,EAAA,EANS,GAOX,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,IAAM,YAAqC,CAAC;AAAA,EAC1C,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,KAAM;AACJ,EAAA,uBACEH,eAAAM,mBAAAA,EAAA,EACG,mBAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAGhC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA;AAAA,MACxC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA;AAAA;AAAA,QAEV,CAAC,CAAC,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,QAEnF,KAAA,KAAU,MAAA,IACV,KAAA,KAAU,IAAA,IACV,KAAA,KAAU;AAAA;AAAA,KACd;AAEA,IAAA,MAAM,MAAA,GAAS,qBAAqB,OAAO,CAAA;AAE3C,IAAA,uBACEJ,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAOF,QAAO,IAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,MAAA,EAClB,QAAA,EAAA;AAAA,wBAAAC,eAACG,aAAAA,EAAA,EAAK,OAAOJ,OAAAA,CAAO,WAAA,EAAc,yBAAe,EAAA,EAAG,CAAA;AAAA,QACnD,WAAA,oBAAeC,cAAAA,CAACK,cAAAA,EAAA,EAAM,KAAA,EAAON,OAAAA,CAAO,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa;AAAA,OAAA,EACpE,CAAA;AAAA,sBAGAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,gBAAA,EAElB,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACK,gBAAA,EAAM,KAAA,EAAON,QAAO,YAAA,EAAc,GAAA,EAAK,OAAO,QAAA,EAAU,CAAA;AAAA,QAGxD,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClBC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,OAAAA,CAAO,UAAA,EACjB,QAAA,EAAA,qBAAA,CAAsB,SAAS,CAAA,EAClC;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAGAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAK,IAAA,EAAC;AAAA,KAAA,EAAA,EArBH,KAsBX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;ACtJf,IAAMF,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,iBAAA,EAAmB,EAAA;AAAA,IACnB,UAAA,EAAY,EAAA;AAAA,IACZ,aAAA,EAAe,EAAA;AAAA,IACf,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,SAAA;AAAA,IACnB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,EAAA;AAAA,IACR,WAAA,EAAa,EAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,iBAAA,EAAmB,EAAA;AAAA,IACnB,aAAA,EAAe,EAAA;AAAA,IACf,GAAA,EAAK;AAAA,GACP;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,GAAA,EAAK;AAAA,GACP;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,CAAA;AAAA,IACN,eAAA,EAAiB,SAAA;AAAA,IACjB,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc,EAAA;AAAA,IACd,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,SAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,GAAA,EAAK;AAAA,GACP;AAAA,EACA,SAAA,EAAW;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,YAAA,EAAc,CAAA;AAAA,IACd,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,SAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAKD,SAAS,aAAa,OAAA,EAAqC;AACzD,EAAA,MAAM,eAAe,CAAC,QAAA,EAAU,WAAA,EAAa,MAAA,EAAQ,UAAU,UAAU,CAAA;AAEzE,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,YAAqC,CAAC;AAAA,EAC1C,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEE,eAAAM,mBAAAA,EAAA,EACG,mBAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAChC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,aAAA,EAAc,GAAI,qBAAqB,OAAO,CAAA;AAGvE,IAAA,MAAM,SAAA,GAAY,aAAa,OAAO,CAAA;AACtC,IAAA,MAAM,cAAc,SAAA,IAAa,QAAA;AAEjC,IAAA,uBACEJ,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAOF,QAAO,IAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,MAAA,EACjB,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCC,eAACK,cAAAA,EAAA,EAAM,OAAON,OAAAA,CAAO,IAAA,EAAM,KAAK,WAAA,EAAa,CAAA;AAAA,wBAE/CC,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,aAAc,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EAChD,CAAA;AAAA,sBAGAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,gBAAA,EAElB,QAAA,EAAA;AAAA,wBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,YAAA,EAClB,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,YAAA,EAClB,QAAA,kBAAAC,cAAAA,CAACK,cAAAA,EAAA,EAAM,KAAA,EAAON,OAAAA,CAAO,YAAA,EAAc,GAAA,EAAK,UAAU,CAAA,EACpD,CAAA;AAAA,0BACAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,YAAA,EAClB,QAAA,kBAAAC,cAAAA,CAACK,cAAAA,EAAA,EAAM,KAAA,EAAON,OAAAA,CAAO,YAAA,EAAc,GAAA,EAAK,aAAa,CAAA,EACvD;AAAA,SAAA,EACF,CAAA;AAAA,wBAGAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,cAAA,EACjB,QAAA,EAAA;AAAA,UAAA,KAAA,oBAASC,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,cAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAEnDC,eAACC,aAAAA,EAAA,EAAK,OAAOF,OAAAA,CAAO,sBAAA,EACjB,8BAAoB,aAAA,EAAe;AAAA,YAClC,KAAKA,OAAAA,CAAO,SAAA;AAAA,YACZ,OAAOA,OAAAA,CAAO,WAAA;AAAA,YACd,OAAOA,OAAAA,CAAO;AAAA,WACf,CAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAK,IAAA,EAAC;AAAA,KAAA,EAAA,EAlCH,KAmCX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;ACxKf,IAAMF,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,cAAA,EAAgB,QAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,eAAA,EAAiB,SAAA;AAAA,IACjB,OAAA,EAAS,EAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA;AAAA,IACP,mBAAA,EAAqB,CAAA;AAAA,IACrB,sBAAA,EAAwB,CAAA;AAAA,IACxB,WAAA,EAAa,MAAA;AAAA,IACb,aAAA,EAAe,GAAA;AAAA,IACf,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,EAAA;AAAA,IACd,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,MAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,GAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,UAAA;AAAA,IAChB,iBAAA,EAAmB,EAAA;AAAA,IACnB,KAAA,EAAO;AAAA,GACT;AAAA,EACA,aAAA,EAAe;AAAA,IACb,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,EAAA;AAAA,IACb,eAAA,EAAiB,MAAA;AAAA;AAAA,IACjB,OAAA,EAAS,CAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,aAAA,EAAe,CAAA;AAAA,IACf,aAAA,EAAe;AAAA,GACjB;AAAA;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAKD,SAASS,cAAa,OAAA,EAAqC;AACzD,EAAA,MAAM,eAAe,CAAC,QAAA,EAAU,WAAA,EAAa,MAAA,EAAQ,UAAU,UAAU,CAAA;AAEzE,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,YAAqC,CAAC;AAAA,EAC1C,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEP,eAAAM,mBAAAA,EAAA,EACG,mBAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAChC,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,aAAA,EAAc,GAAI,qBAAqB,OAAO,CAAA;AAGvE,IAAA,MAAM,SAAA,GAAYC,cAAa,OAAO,CAAA;AACtC,IAAA,MAAM,cAAc,SAAA,IAAa,QAAA;AAEjC,IAAA,uBACEL,eAAAA,CAACD,aAAAA,EAAA,EAAiB,KAAA,EAAOF,QAAO,IAAA,EAE9B,QAAA,EAAA;AAAA,sBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,UAAA,EAClB,QAAA,EAAA;AAAA,wBAAAC,eAACK,cAAAA,EAAA,EAAM,OAAON,OAAAA,CAAO,SAAA,EAAW,KAAK,QAAA,EAAU,CAAA;AAAA,wBAG/CG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,YAAA,EAClB,QAAA,EAAA;AAAA,0BAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,WAAA,EACjB,QAAA,EAAA;AAAA,YAAA,WAAA,oBAAeC,eAACK,cAAAA,EAAA,EAAM,OAAON,OAAAA,CAAO,QAAA,EAAU,KAAK,WAAA,EAAa,CAAA;AAAA,4BACjEC,eAACG,aAAAA,EAAA,EAAK,OAAOJ,OAAAA,CAAO,YAAA,EAChB,mBAAS,gBAAA,EACb;AAAA,WAAA,EACF,CAAA;AAAA,UAEC,oBAAoB,aAAA,EAAe;AAAA,YAClC,KAAKA,OAAAA,CAAO,QAAA;AAAA,YACZ,OAAOA,OAAAA,CAAO,UAAA;AAAA,YACd,OAAOA,OAAAA,CAAO;AAAA,WACf;AAAA,SAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,WAAA,EAClB,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,mBAAA,EAClB,QAAA,kBAAAC,cAAAA,CAACK,cAAAA,EAAA,EAAM,KAAA,EAAON,OAAAA,CAAO,UAAA,EAAY,GAAA,EAAK,aAAa,CAAA,EACrD,CAAA;AAAA,wBAGAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,OAAAA,CAAO,MAAA,EAClB,QAAA,kBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,aAAA,EACjB,QAAA,EAAA;AAAA,UAAA,WAAA,oBAAeC,eAACK,cAAAA,EAAA,EAAM,OAAON,OAAAA,CAAO,UAAA,EAAY,KAAK,WAAA,EAAa,CAAA;AAAA,0BACnEC,cAAAA,CAACG,aAAAA,EAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,YAAa,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EAC/C,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAK,IAAA,EAAC;AAAA,KAAA,EAAA,EApCH,KAqCX,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ;ACnMf,IAAMF,OAAAA,GAASD,oBAAW,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,QAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,QAAA;AAAA,IACd,OAAA,EAAS,EAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AAAA,EACA,kBAAkB,EAAC;AAAA,EACnB,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,EAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW;AAAA;AAEf,CAAC,CAAA;AAGDU,aAAA,CAAK,mBAAA,CAAoB;AAAA,EACvB,MAAA,EAAQ,KAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAC,CAAA;AAQD,SAAS,qBAAqB,WAAA,EAA6B;AAEzD,EAAA,IAAI,WAAA,CAAY,UAAA,CAAW,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAY,UAAA,CAAW,SAAS,KAAK,WAAA,CAAY,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3E,IAAA,OAAO,WAAA;AAAA,EACT;AAIA,EAAA,IAAI,QAAA,GAAW,WAAA;AAOf,EAAA,MAAM,cAAc,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,EAAE,EAAE,WAAA,EAAY;AAC7D,EAAA,IAAI,YAAY,QAAA,CAAS,aAAa,KAAK,WAAA,CAAY,UAAA,CAAW,aAAa,CAAA,EAAG;AAChF,IAAA,QAAA,GAAW,WAAA;AAAA,EACb,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,UAAU,KAAK,WAAA,CAAY,UAAA,CAAW,UAAU,CAAA,EAAG;AACjF,IAAA,QAAA,GAAW,YAAA;AAAA,EACb,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,UAAU,KAAK,WAAA,CAAY,UAAA,CAAW,UAAU,CAAA,EAAG;AACjF,IAAA,QAAA,GAAW,WAAA;AAAA,EACb,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,OAAO,KAAK,WAAA,CAAY,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3E,IAAA,QAAA,GAAW,YAAA;AAAA,EACb;AAEA,EAAA,OAAO,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA;AAC/C;AAOA,eAAsB,uBAAuB,MAAA,EAA4C;AACvF,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,WAAA,EAAa,QAAA,GAAW,aAAY,GAAI,MAAA;AAGvE,EAAA,IAAI,iBAAA;AACJ,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,GAAoB,iBAAA;AACpB,MAAA;AAAA,IACF;AACE,MAAA,iBAAA,GAAoB,iBAAA;AAAA;AAIxB,EAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,IAAA,MAAMC,IAAAA,mBACJT,cAAAA,CAACU,iBAAA,EAAA,EACC,QAAA,kBAAAV,cAAAA,CAACW,aAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,KAAA,EAAOZ,OAAAA,CAAO,IAAA,EAC5B,QAAA,kBAAAC,cAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,WAAA,EAAa,WAAA,GAAc,oBAAA,CAAqB,WAAW,CAAA,GAAI,MAAA;AAAA,QAC/D;AAAA;AAAA,OAEJ,CAAA,EACF,CAAA;AAGF,IAAA,MAAMY,KAAAA,GAAO,MAAMC,YAAA,CAAIJ,IAAG,EAAE,MAAA,EAAO;AACnC,IAAA,MAAMK,YAAAA,GAAc,MAAMF,KAAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,OAAO,IAAI,WAAWE,YAAW,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,WAAA,EAAa;AACxD,IAAA,MAAM,QAAA,GAAW,QAAA,KAAa,WAAA,GAAc,iBAAA,GAAY,iBAAA;AACxD,IAAA,MAAML,IAAAA,mBACJT,cAAAA,CAACU,iBAAA,EAAA,EACC,0BAAAV,cAAAA,CAACW,aAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,WAAA,EAAY,WAAA,EAAY,KAAA,EAAOZ,OAAAA,CAAO,MACpD,QAAA,kBAAAC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,WAAA,EAAa,WAAA,GAAc,oBAAA,CAAqB,WAAW,CAAA,GAAI,MAAA;AAAA,QAC/D;AAAA;AAAA,OAEJ,CAAA,EACF,CAAA;AAGF,IAAA,MAAMY,KAAAA,GAAO,MAAMC,YAAA,CAAIJ,IAAG,EAAE,MAAA,EAAO;AACnC,IAAA,MAAMK,YAAAA,GAAc,MAAMF,KAAAA,CAAK,WAAA,EAAY;AAC3C,IAAA,OAAO,IAAI,WAAWE,YAAW,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,GAAA,mBACJd,cAAAA,CAACU,iBAAA,EAAA,EACC,QAAA,kBAAAR,eAAAA,CAACS,aAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,KAAA,EAAOZ,OAAAA,CAAO,IAAA,EAC5B,QAAA,EAAA;AAAA,oBAAAG,eAAAA,CAACD,aAAAA,EAAA,EAAK,KAAA,EAAOF,QAAO,MAAA,EACjB,QAAA,EAAA;AAAA,MAAA,WAAA,oBACCC,cAAAA,CAACC,aAAAA,EAAA,EAAK,KAAA,EAAOF,OAAAA,CAAO,aAClB,QAAA,kBAAAC,cAAAA,CAACK,cAAAA,EAAA,EAAM,OAAON,OAAAA,CAAO,IAAA,EAAM,KAAK,oBAAA,CAAqB,WAAW,GAAG,CAAA,EACrE,CAAA;AAAA,sBAEFC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAOF,OAAAA,CAAO,gBAAA,EAClB,QAAA,kBAAAC,cAAAA,CAACG,eAAA,EAAK,KAAA,EAAOJ,OAAAA,CAAO,SAAA,EAAY,uBAAY,CAAA,EAC9C,CAAA;AAAA,sBACAC,cAAAA,CAACC,aAAAA,EAAA,EAAK,OAAK,IAAA,EAAC;AAAA,KAAA,EACd,CAAA;AAAA,oBACAD,cAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAA,EAA2B;AAAA,GAAA,EAChD,CAAA,EACF,CAAA;AAIF,EAAA,MAAM,IAAA,GAAO,MAAMa,YAAA,CAAI,GAAG,EAAE,MAAA,EAAO;AACnC,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,EAAY;AAC3C,EAAA,OAAO,IAAI,WAAW,WAAW,CAAA;AACnC;AC3JO,SAAS,eAAe,MAAA,EAA0D;AACvF,EAAA,MAAM,QAAA,GAAgBE,qBAAK,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,MAAA,YAAkB,MAAA,GAAS,QAAA,GAAW,OAAA;AAAA,IAC5C,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAYA,eAAA,CAAA,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAE/C,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,SAAA,EAAkC;AAC7D,EAAA,MAAM,QAAA,GAAgBA,qBAAK,SAAA,EAAW;AAAA,IACpC,IAAA,EAAM,QAAA;AAAA,IACN,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAYA,eAAA,CAAA,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAE/C,EAAA,OAAO,IAAA;AACT;AAqBO,SAAS,eAAe,MAAA,EAA0D;AACvF,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,IAAA,SAAA,GAAY,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,EACrC,CAAA,MAAA,IAAW,kBAAkB,WAAA,EAAa;AACxC,IAAA,SAAA,GAAY,IAAI,WAAA,CAAY,OAAO,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EACpD,CAAA,MAAO;AAEL,IAAA,SAAA,GAAY,IAAI,WAAA,CAAY,OAAO,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,aAAa,SAAS,CAAA;AAC/B;AAMO,SAAS,UAAU,IAAA,EAA4B;AACpD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,IAAA;AACT","file":"index.js","sourcesContent":["import type { ProductData } from '../types';\n\n/**\n * Format field name to human-readable label\n * Examples:\n * - \"designNumber\" -> \"Design Number\"\n * - \"gsm\" -> \"GSM\"\n * - \"fabric_finish\" -> \"Fabric Finish\"\n * - \"PRODUCT_ID\" -> \"Product ID\"\n */\nexport function formatFieldName(fieldName: string): string {\n // Handle common acronyms\n const acronyms = ['gsm', 'slub', 'id', 'sku', 'url', 'api', 'pdf', 'html', 'css', 'rgb'];\n\n // Replace underscores and hyphens with spaces\n let formatted = fieldName.replace(/[_-]/g, ' ');\n\n // Split camelCase\n formatted = formatted.replace(/([a-z])([A-Z])/g, '$1 $2');\n\n // Capitalize each word\n formatted = formatted\n .split(' ')\n .map((word) => {\n const lowerWord = word.toLowerCase();\n // Keep acronyms in uppercase\n if (acronyms.includes(lowerWord)) {\n return word.toUpperCase();\n }\n // Capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n\n return formatted;\n}\n\n/**\n * Check if a value should be displayed\n * Filters out null, undefined, empty strings, and empty arrays\n */\nexport function hasValue(value: any): boolean {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n return true;\n}\n\n/**\n * Get image URL from product, trying common field names\n * Returns fallback if no image found\n */\nexport function getImageUrl(\n product: ProductData,\n fallback = 'https://cloud-flz4zi76g-hack-club-bot.vercel.app/0image_fallback.jpg',\n): string {\n // Try common image field names (case-insensitive)\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n for (const field of imageFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Get display fields for a product, excluding image fields\n * Returns array of [key, value] tuples for fields with values\n */\nexport function getDisplayFields(product: ProductData): [string, string | number][] {\n // Fields to exclude from detail display\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n return Object.entries(product)\n .filter(([key, value]) => {\n // Exclude image fields\n if (imageFields.includes(key)) return false;\n // Exclude fields without values\n if (!hasValue(value)) return false;\n return true;\n })\n .map(([key, value]) => [key, value as string | number]);\n}\n\n/**\n * Get a specific field value with fallback\n */\nexport function getFieldValue<T = string | number>(\n product: ProductData,\n fieldName: string,\n fallback: T,\n): T {\n const value = product[fieldName];\n return hasValue(value) ? (value as T) : fallback;\n}\n\n/**\n * Try to find a \"title\" field (case-insensitive, various names)\n */\nexport function getTitleField(product: ProductData, fallback = 'Product'): string {\n const titleFields = [\n 'Title',\n 'title',\n 'Name',\n 'name',\n 'ProductName',\n 'productName',\n 'product_name',\n ];\n\n for (const field of titleFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Try to find a \"price\" field\n */\nexport function getPriceField(product: ProductData): string | number | null {\n const priceFields = ['Price', 'price', 'Cost', 'cost', 'Amount', 'amount'];\n\n for (const field of priceFields) {\n const value = product[field];\n if (hasValue(value)) {\n return value as string | number;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"rating\" field\n */\nexport function getRatingField(product: ProductData): number | null {\n const ratingFields = ['Rating', 'rating', 'Stars', 'stars', 'Score', 'score'];\n\n for (const field of ratingFields) {\n const value = product[field];\n if (typeof value === 'number' && value >= 0) {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"link\" field\n */\nexport function getLinkField(product: ProductData): string | null {\n const linkFields = ['Link', 'link', 'URL', 'url', 'ProductUrl', 'productUrl', 'href'];\n\n for (const field of linkFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"description\" field\n */\nexport function getDescriptionField(product: ProductData): string | null {\n const descFields = ['Description', 'description', 'Details', 'details', 'Info', 'info', 'desc'];\n\n for (const field of descFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n","import { Link, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData } from '../types';\nimport {\n formatFieldName,\n getDescriptionField,\n getImageUrl,\n getLinkField,\n getPriceField,\n getRatingField,\n getTitleField,\n} from './fieldHelpers';\n\n/**\n * List of known field names (lowercase) that should be excluded from dynamic field display\n * These are the common fields that templates typically handle specially\n */\nexport const KNOWN_FIELD_NAMES_LOWER = [\n 'image',\n 'imageurl',\n 'img',\n 'photo',\n 'picture',\n 'title',\n 'name',\n 'productname',\n 'description',\n 'details',\n 'info',\n 'desc',\n 'price',\n 'cost',\n 'amount',\n 'rating',\n 'stars',\n 'score',\n 'link',\n 'url',\n 'producturl',\n 'href',\n 'image2',\n 'imageurl2',\n 'img2',\n 'photo2',\n 'picture2',\n] as const;\n\n/**\n * Extracted product fields for template rendering\n */\nexport interface ExtractedFields {\n imageUrl: string;\n title: string;\n rating: number | null;\n description: string | null;\n price: string | number | null;\n link: string | null;\n dynamicFields: [string, string | number][];\n}\n\n/**\n * Extract all fields from a product for template rendering\n * This centralizes the field extraction logic used by all templates\n *\n * @param product - Product data to extract fields from\n * @param options - Optional configuration\n * @returns Extracted fields ready for rendering\n */\nexport function extractProductFields(\n product: ProductData,\n options: {\n /** Maximum number of dynamic fields to return (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Additional field names to exclude from dynamic fields */\n excludeFields?: string[];\n } = {},\n): ExtractedFields {\n const { maxDynamicFields, excludeFields = [] } = options;\n\n // Extract well-known fields\n const imageUrl = getImageUrl(product);\n const title = getTitleField(product);\n const rating = getRatingField(product);\n const description = getDescriptionField(product);\n const price = getPriceField(product);\n const link = getLinkField(product);\n\n // Build exclusion list\n const excludedFieldsLower = [\n ...KNOWN_FIELD_NAMES_LOWER,\n ...excludeFields.map((f) => f.toLowerCase()),\n ];\n\n // Extract dynamic fields\n let dynamicFields = Object.entries(product).filter(([key, value]) => {\n // Exclude known fields (case-insensitive)\n if (excludedFieldsLower.includes(key.toLowerCase())) return false;\n // Exclude empty values\n if (value === undefined || value === null || value === '') return false;\n return true;\n }) as [string, string | number][];\n\n // Limit dynamic fields if requested\n if (maxDynamicFields !== undefined && dynamicFields.length > maxDynamicFields) {\n dynamicFields = dynamicFields.slice(0, maxDynamicFields);\n }\n\n return {\n imageUrl,\n title,\n rating,\n description,\n price,\n link,\n dynamicFields,\n };\n}\n\n/**\n * Common styles for dynamic field rows\n * Can be extended or overridden by individual templates\n */\nexport const dynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 4,\n fontSize: 9,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\n/**\n * Render dynamic fields as rows with formatted labels\n * This is the common pattern used across all templates\n *\n * @param fields - Array of [key, value] tuples to render\n * @param styles - Optional custom styles (will merge with default styles)\n * @returns React component rendering the fields\n */\nexport function renderDynamicFields(\n fields: [string, string | number][],\n styles?: {\n container?: any;\n row?: any;\n label?: any;\n value?: any;\n },\n) {\n if (fields.length === 0) return null;\n\n const containerStyle = styles?.container || { marginBottom: 8 };\n const rowStyle = styles?.row || dynamicFieldStyles.detailRow;\n const labelStyle = styles?.label || dynamicFieldStyles.detailLabel;\n const valueStyle = styles?.value || dynamicFieldStyles.detailValue;\n\n return (\n <View style={containerStyle}>\n {fields.map(([key, value]) => (\n <View key={key} style={rowStyle}>\n <Text style={labelStyle}>{formatFieldName(key)}:</Text>\n <Text style={valueStyle}>{String(value)}</Text>\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Render a rating with star emoji\n * Common pattern across templates\n *\n * @param rating - Rating value (null if not present)\n * @param style - Style to apply to the text\n * @returns React component or null\n */\nexport function renderRating(rating: number | null, style: any) {\n if (rating === null) return null;\n return <Text style={style}>⭐ {rating}</Text>;\n}\n\n/**\n * Render a price field with formatting\n * Common pattern across templates\n *\n * @param price - Price value (null if not present)\n * @param style - Style to apply to the text\n * @param prefix - Optional prefix (default: \"Rs. \")\n * @returns React component or null\n */\nexport function renderPrice(\n price: string | number | null,\n style: any,\n prefix: string = 'Rs. ',\n) {\n if (price === null) return null;\n\n const priceText = typeof price === 'number' ? `${prefix}${price}` : String(price);\n return <Text style={style}>{priceText}</Text>;\n}\n\n/**\n * Render a \"Buy Now\" button/link\n * Common pattern across templates\n *\n * @param link - Link URL (null if not present)\n * @param style - Style to apply to the link\n * @param buttonText - Text to display (default: \"Buy Now\")\n * @param children - Optional children to render inside the link (e.g., price)\n * @returns React component or null\n */\nexport function renderBuyButton(\n link: string | null,\n style: any,\n buttonText: string = 'Buy Now',\n children?: React.ReactNode,\n) {\n if (!link || typeof link !== 'string') return null;\n\n return (\n <Link src={link} style={style}>\n {children}\n <Text style={{ marginHorizontal: 5 }}>{buttonText}</Text>\n </Link>\n );\n}\n\n/**\n * Template builder configuration\n * Used to create new templates with standard patterns\n */\nexport interface TemplateConfig {\n /** Maximum dynamic fields to show (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Whether to show rating with stars */\n showRating?: boolean;\n /** Whether to show description */\n showDescription?: boolean;\n /** Whether to show price */\n showPrice?: boolean;\n /** Whether to show buy button/link */\n showBuyButton?: boolean;\n /** Custom price prefix */\n pricePrefix?: string;\n /** Custom buy button text */\n buyButtonText?: string;\n}\n\n/**\n * Default template configuration\n */\nexport const DEFAULT_TEMPLATE_CONFIG: TemplateConfig = {\n maxDynamicFields: undefined, // No limit\n showRating: true,\n showDescription: true,\n showPrice: true,\n showBuyButton: true,\n pricePrefix: 'Rs. ',\n buyButtonText: 'Buy Now',\n};\n\n/**\n * Merge template configurations\n */\nexport function mergeTemplateConfig(\n config: Partial<TemplateConfig> = {},\n): TemplateConfig {\n return {\n ...DEFAULT_TEMPLATE_CONFIG,\n ...config,\n };\n}\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginVertical: 50,\n marginHorizontal: 20,\n },\n productSection: {\n width: '48%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n minHeight: 350,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n },\n productTitleBox: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productTitle: {\n fontSize: 14,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n fontWeight: 'bold',\n },\n productPrice: {\n fontSize: 12,\n color: '#2EB62C',\n marginTop: 4,\n marginBottom: 4,\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n textAlign: 'justify',\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: 'white',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template1: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image - always show */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Title and Rating row */}\n <View style={styles.productTitleBox}>\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description if available */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic additional fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Price and Buy Button */}\n {renderBuyButton(\n fields.link,\n styles.buyButton,\n 'Buy Now',\n renderPrice(fields.price, styles.productPrice),\n )}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template1;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n margin: 10,\n },\n productSection: {\n width: '100%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productSectionText: {\n width: '50%',\n padding: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n productSectionImage: {\n width: '50%',\n padding: 10,\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n padding: 3,\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n },\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template2: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image Section */}\n <View style={styles.productSectionImage}>\n <Image style={styles.image} src={fields.imageUrl} />\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Text Section */}\n <View style={styles.productSectionText}>\n {/* Title and Price */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderPrice(fields.price, styles.productPrice)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template2;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productSection: {\n width: '100%',\n height: '100vh',\n padding: 20,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n objectFit: 'contain',\n marginBottom: 10,\n },\n productDetailsBox: {\n backgroundColor: '#FDFD96',\n width: '50%',\n position: 'absolute',\n bottom: 10,\n right: 10,\n textAlign: 'justify',\n padding: 20,\n borderRadius: 8,\n maxHeight: '40%',\n overflow: 'hidden',\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {},\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\n// Custom styles for compact dynamic fields in overlay\nconst compactDynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 3,\n fontSize: 8,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\nconst Template3: React.FC<TemplateProps> = ({ products }) => {\n return (\n <>\n {products.map((product, index) => {\n // Extract all fields, limit to 5 for space-constrained overlay\n const fields = extractProductFields(product, { maxDynamicFields: 5 });\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Full background image */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Details overlay box */}\n <View style={styles.productDetailsBox}>\n {/* Title */}\n <Text style={styles.productTitle}>{fields.title}</Text>\n\n {/* Price and Rating */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n {renderPrice(fields.price, styles.productPrice)}\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields - compact, max 5 */}\n {renderDynamicFields(fields.dynamicFields, {\n row: compactDynamicFieldStyles.detailRow,\n label: compactDynamicFieldStyles.detailLabel,\n value: compactDynamicFieldStyles.detailValue,\n })}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n\n {/* Page break */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template3;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n },\n header: {\n backgroundColor: '#2C2C2C',\n padding: 15,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n companyName: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 2,\n },\n brandLogo: {\n width: 60,\n height: 60,\n objectFit: 'contain',\n },\n productContainer: {\n width: '100%',\n flex: 1,\n position: 'relative',\n padding: 20,\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n detailsBox: {\n position: 'absolute',\n bottom: 30,\n right: 30,\n backgroundColor: '#FFFFFF',\n padding: 15,\n borderRadius: 4,\n minWidth: '30%',\n maxWidth: '65%',\n border: '1px solid #E0E0E0',\n },\n});\n\n// Column-based styles for flexible 2-column layout\nconst template4ColumnStyles = StyleSheet.create({\n fieldsContainer: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n fieldColumn: {\n display: 'flex',\n flexDirection: 'column',\n width: '48%',\n marginBottom: 8,\n },\n fieldLabel: {\n fontWeight: 'bold',\n color: '#333333',\n fontSize: 9,\n marginBottom: 2,\n },\n fieldValue: {\n color: '#555555',\n fontSize: 9,\n flexShrink: 1,\n },\n});\n\n/**\n * Render fields in a responsive 2-column layout\n * Fields automatically flow into columns based on available space\n */\nfunction renderFieldsInColumns(fields: [string, string | number][]) {\n if (fields.length === 0) return null;\n\n return (\n <View style={template4ColumnStyles.fieldsContainer}>\n {fields.map(([key, value]) => (\n <View key={key} style={template4ColumnStyles.fieldColumn}>\n <Text style={template4ColumnStyles.fieldLabel}>\n {formatFieldName(key)}:\n </Text>\n <Text style={template4ColumnStyles.fieldValue}>\n {String(value)}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\nconst Template4: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName = 'BANG TEXTILES & CLOTHING PVT. LTD.',\n}) => {\n return (\n <>\n {products.map((product, index) => {\n // Template4 shows ALL fields (not just dynamic ones)\n // Extract all fields except images\n const allFields = Object.entries(product).filter(\n ([key, value]) =>\n // Only exclude image fields\n !['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'].includes(key) &&\n // Exclude empty values\n value !== undefined &&\n value !== null &&\n value !== '',\n ) as [string, string | number][];\n\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.page}>\n {/* Header with brand logo */}\n <View style={styles.header}>\n <Text style={styles.companyName}>{companyName || ''}</Text>\n {companyLogo && <Image style={styles.brandLogo} src={companyLogo} />}\n </View>\n\n {/* Product section */}\n <View style={styles.productContainer}>\n {/* Product Image - always render, using fallback if needed */}\n <Image style={styles.productImage} src={fields.imageUrl} />\n\n {/* Details box - only render if there are fields to show */}\n {allFields.length > 0 && (\n <View style={styles.detailsBox}>\n {renderFieldsInColumns(allFields)}\n </View>\n )}\n </View>\n\n {/* Page break after each product */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template4;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n backgroundColor: '#FFFFFF',\n flexDirection: 'column',\n },\n header: {\n height: 80,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 30,\n paddingTop: 20,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n marginBottom: 10,\n },\n logo: {\n height: 50,\n marginRight: 20,\n objectFit: 'contain',\n },\n companyName: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333333',\n letterSpacing: 1,\n },\n contentContainer: {\n flex: 1,\n flexDirection: 'row',\n paddingHorizontal: 30,\n paddingBottom: 30,\n gap: 20,\n },\n imageSection: {\n flex: 2,\n flexDirection: 'row',\n gap: 15,\n },\n imageWrapper: {\n flex: 1,\n height: '100%',\n backgroundColor: '#F9F9F9',\n borderRadius: 4,\n overflow: 'hidden',\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n detailsSection: {\n flex: 1,\n backgroundColor: '#F5F5F5',\n padding: 20,\n borderRadius: 8,\n justifyContent: 'center',\n },\n productTitle: {\n fontSize: 18,\n fontWeight: 'bold',\n color: '#222222',\n marginBottom: 15,\n borderBottomWidth: 2,\n borderBottomColor: '#333333',\n paddingBottom: 5,\n },\n dynamicFieldsContainer: {\n gap: 8,\n },\n detailRow: {\n flexDirection: 'row',\n marginBottom: 6,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n paddingBottom: 4,\n },\n detailLabel: {\n fontSize: 10,\n fontWeight: 'bold',\n color: '#555555',\n width: '40%',\n },\n detailValue: {\n fontSize: 10,\n color: '#333333',\n flex: 1,\n flexWrap: 'wrap',\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template5: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image if 2nd not present\n\n return (\n <View key={index} style={styles.page}>\n {/* Header Section */}\n <View style={styles.header}>\n {companyLogo && (\n <Image style={styles.logo} src={companyLogo} />\n )}\n <Text style={styles.companyName}>{companyName}</Text>\n </View>\n\n {/* Main Content Area */}\n <View style={styles.contentContainer}>\n {/* Dual Images Section */}\n <View style={styles.imageSection}>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={imageUrl} />\n </View>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={secondImage} />\n </View>\n </View>\n\n {/* Product Details Side Panel */}\n <View style={styles.detailsSection}>\n {title && <Text style={styles.productTitle}>{title}</Text>}\n \n <View style={styles.dynamicFieldsContainer}>\n {renderDynamicFields(dynamicFields, {\n row: styles.detailRow,\n label: styles.detailLabel,\n value: styles.detailValue,\n })}\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template5;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n flexDirection: 'row',\n backgroundColor: '#FFFFFF',\n },\n leftColumn: {\n width: '50%',\n height: '100%',\n position: 'relative',\n borderRightWidth: 1,\n borderRightColor: '#E0E0E0',\n },\n rightColumn: {\n width: '50%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n },\n imageFull: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n rightImageContainer: {\n flex: 1,\n width: '100%',\n position: 'relative',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n rightImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n specsOverlay: {\n position: 'absolute',\n bottom: 40, // Lifted slightly from absolute bottom\n right: 0,\n backgroundColor: '#FFFFFF',\n padding: 15,\n width: '65%', // Takes up a good chunk of the corner\n borderTopLeftRadius: 4,\n borderBottomLeftRadius: 4,\n shadowColor: '#000',\n shadowOpacity: 0.2,\n shadowRadius: 3,\n borderWidth: 1,\n borderColor: '#EEEEEE',\n },\n specsHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n paddingBottom: 5,\n },\n miniLogo: {\n width: 20,\n height: 20,\n objectFit: 'contain',\n marginRight: 8,\n },\n designNumber: {\n fontSize: 12,\n fontWeight: 'bold',\n color: '#000',\n },\n footer: {\n height: 100,\n backgroundColor: '#1A1A1A',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingHorizontal: 30,\n width: '100%',\n },\n footerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n footerLogo: {\n width: 40,\n height: 40,\n objectFit: 'contain',\n marginRight: 15,\n backgroundColor: '#FFF', // White background for logo visibility\n padding: 2,\n borderRadius: 2,\n },\n footerText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 1,\n textTransform: 'uppercase',\n },\n // Custom styles for dynamic fields in the overlay\n fieldRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n fieldLabel: {\n fontSize: 9,\n fontWeight: 'bold',\n color: '#333',\n width: '40%',\n },\n fieldValue: {\n fontSize: 9,\n color: '#555',\n flex: 1,\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template6: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image\n\n return (\n <View key={index} style={styles.page}>\n {/* Left Column: Fabric/Detail Image + Specs Overlay */}\n <View style={styles.leftColumn}>\n <Image style={styles.imageFull} src={imageUrl} />\n \n {/* Specifications Overlay */}\n <View style={styles.specsOverlay}>\n <View style={styles.specsHeader}>\n {companyLogo && <Image style={styles.miniLogo} src={companyLogo} />}\n <Text style={styles.designNumber}>\n {title || 'Specifications'}\n </Text>\n </View>\n \n {renderDynamicFields(dynamicFields, {\n row: styles.fieldRow,\n label: styles.fieldLabel,\n value: styles.fieldValue,\n })}\n </View>\n </View>\n\n {/* Right Column: Shirt/Usage Image + Footer */}\n <View style={styles.rightColumn}>\n <View style={styles.rightImageContainer}>\n <Image style={styles.rightImage} src={secondImage} />\n </View>\n \n {/* Footer */}\n <View style={styles.footer}>\n <View style={styles.footerContent}>\n {companyLogo && <Image style={styles.footerLogo} src={companyLogo} />}\n <Text style={styles.footerText}>{companyName}</Text>\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template6;\n","import { Document, Font, Image, Page, pdf, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport { Template1, Template2, Template3, Template4, Template5, Template6 } from './templates';\nimport type { CatalogConfig } from './types';\n\n// Create styles\nconst styles = StyleSheet.create({\n page: {\n flexDirection: 'column',\n backgroundColor: '#FFFFFF',\n },\n header: {\n height: '100vh',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n alignContent: 'center',\n padding: 10,\n marginBottom: 5,\n },\n logoSection: {\n width: '80%',\n },\n storeNameSection: {},\n logo: {\n marginRight: 10,\n objectFit: 'contain',\n },\n storeName: {\n fontSize: 35,\n flexGrow: 1,\n transform: 'rotate(-90deg)',\n },\n});\n\n// Register emoji support\nFont.registerEmojiSource({\n format: 'png',\n url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n});\n\n/**\n * Normalize image source for react-pdf Image component\n * Handles URLs, data URIs, and plain base64 strings\n * @param imageSource Image source string (URL, data URI, or base64)\n * @returns Normalized image source string\n */\nfunction normalizeImageSource(imageSource: string): string {\n // If already a data URI, return as-is\n if (imageSource.startsWith('data:')) {\n return imageSource;\n }\n\n // If it's a URL, return as-is\n if (imageSource.startsWith('http://') || imageSource.startsWith('https://')) {\n return imageSource;\n }\n\n // Otherwise, assume it's a base64 string and convert to data URI\n // Try to detect image type from common base64 patterns\n let mimeType = 'image/png'; // default\n\n // Check for common base64 image signatures\n // PNG: starts with iVBORw0KGgo\n // JPEG: starts with /9j/4AAQ\n // GIF: starts with R0lGODlh\n // WebP: starts with UklGR\n const base64Start = imageSource.substring(0, 20).toLowerCase();\n if (base64Start.includes('ivborw0kggo') || imageSource.startsWith('iVBORw0KGgo')) {\n mimeType = 'image/png';\n } else if (base64Start.includes('/9j/4aaq') || imageSource.startsWith('/9j/4AAQ')) {\n mimeType = 'image/jpeg';\n } else if (base64Start.includes('r0lgodlh') || imageSource.startsWith('R0lGODlh')) {\n mimeType = 'image/gif';\n } else if (base64Start.includes('uklgr') || imageSource.startsWith('UklGR')) {\n mimeType = 'image/webp';\n }\n\n return `data:${mimeType};base64,${imageSource}`;\n}\n\n/**\n * Generate product catalog PDF\n * @param config Configuration with products, company info, and template choice\n * @returns Promise<Uint8Array> PDF as Uint8Array (works in both Node.js and browser)\n */\nexport async function generateProductCatalog(config: CatalogConfig): Promise<Uint8Array> {\n const { products, companyLogo, companyName, template = 'template1' } = config;\n\n // Select template component\n let TemplateComponent;\n switch (template) {\n case 'template1':\n TemplateComponent = Template1;\n break;\n case 'template2':\n TemplateComponent = Template2;\n break;\n case 'template3':\n TemplateComponent = Template3;\n break;\n case 'template4':\n TemplateComponent = Template4;\n break;\n case 'template5':\n TemplateComponent = Template5;\n break;\n case 'template6':\n TemplateComponent = Template6;\n break;\n default:\n TemplateComponent = Template1;\n }\n\n // Template4 handles its own page layout with headers on each page\n if (template === 'template4') {\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <Template4\n products={products as any}\n companyLogo={companyLogo ? normalizeImageSource(companyLogo) : undefined}\n companyName={companyName}\n />\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Template5 & Template6 require landscape orientation and handle their own layout\n if (template === 'template5' || template === 'template6') {\n const Template = template === 'template5' ? Template5 : Template6;\n const doc = (\n <Document>\n <Page size=\"A4\" orientation=\"landscape\" style={styles.page}>\n <Template\n products={products as any}\n companyLogo={companyLogo ? normalizeImageSource(companyLogo) : undefined}\n companyName={companyName}\n />\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Create PDF document for other templates\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <View style={styles.header}>\n {companyLogo && (\n <View style={styles.logoSection}>\n <Image style={styles.logo} src={normalizeImageSource(companyLogo)} />\n </View>\n )}\n <View style={styles.storeNameSection}>\n <Text style={styles.storeName}>{companyName}</Text>\n </View>\n <View break></View>\n </View>\n <TemplateComponent products={products as any} />\n </Page>\n </Document>\n );\n\n // Generate PDF and return as Uint8Array\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n}\n","import * as XLSX from 'xlsx';\nimport type { ProductData } from './types';\n\n/**\n * Parse Excel file buffer to product data\n * @param buffer - Excel file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.xlsx');\n * const products = parseExcelFile(buffer);\n *\n * @example\n * // Browser/React\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseExcelFile(arrayBuffer);\n */\nexport function parseExcelFile(buffer: Buffer): ProductData[];\nexport function parseExcelFile(buffer: ArrayBuffer): ProductData[];\nexport function parseExcelFile(buffer: Uint8Array): ProductData[];\nexport function parseExcelFile(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n const workbook = XLSX.read(buffer, {\n type: buffer instanceof Buffer ? 'buffer' : 'array',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV string to product data\n */\nexport function parseCSVFile(csvString: string): ProductData[] {\n const workbook = XLSX.read(csvString, {\n type: 'string',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV buffer to product data\n * @param buffer - CSV file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.csv');\n * const products = parseCSVBuffer(buffer);\n *\n * @example\n * // Browser\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseCSVBuffer(arrayBuffer);\n */\nexport function parseCSVBuffer(buffer: Buffer): ProductData[];\nexport function parseCSVBuffer(buffer: ArrayBuffer): ProductData[];\nexport function parseCSVBuffer(buffer: Uint8Array): ProductData[];\nexport function parseCSVBuffer(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n let csvString: string;\n\n if (buffer instanceof Buffer) {\n csvString = buffer.toString('utf-8');\n } else if (buffer instanceof ArrayBuffer) {\n csvString = new TextDecoder('utf-8').decode(buffer);\n } else {\n // Uint8Array\n csvString = new TextDecoder('utf-8').decode(buffer);\n }\n\n return parseCSVFile(csvString);\n}\n\n/**\n * Parse and validate product data from JSON\n * Note: No fields are mandatory. Data is passed through as-is.\n */\nexport function parseJSON(data: any[]): ProductData[] {\n if (!Array.isArray(data)) {\n throw new Error('JSON data must be an array of products');\n }\n\n return data as ProductData[];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/fieldHelpers.ts","../src/utils/templateHelpers.tsx","../src/templates/Template1.tsx","../src/templates/Template2.tsx","../src/templates/Template3.tsx","../src/templates/Template4.tsx","../src/templates/Template5.tsx","../src/templates/Template6.tsx","../src/generator.tsx","../src/parser.ts"],"names":["StyleSheet","styles","jsx","View","jsxs","Text","Link","Image","Fragment","getImage2Url","Font","doc","Document","Page","blob","pdf","arrayBuffer","XLSX"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProductData } from '../types';\n\n/**\n * Format field name to human-readable label\n * Examples:\n * - \"designNumber\" -> \"Design Number\"\n * - \"gsm\" -> \"GSM\"\n * - \"fabric_finish\" -> \"Fabric Finish\"\n * - \"PRODUCT_ID\" -> \"Product ID\"\n */\nexport function formatFieldName(fieldName: string): string {\n // Handle common acronyms\n const acronyms = ['gsm', 'slub', 'id', 'sku', 'url', 'api', 'pdf', 'html', 'css', 'rgb'];\n\n // Replace underscores and hyphens with spaces\n let formatted = fieldName.replace(/[_-]/g, ' ');\n\n // Split camelCase\n formatted = formatted.replace(/([a-z])([A-Z])/g, '$1 $2');\n\n // Capitalize each word\n formatted = formatted\n .split(' ')\n .map((word) => {\n const lowerWord = word.toLowerCase();\n // Keep acronyms in uppercase\n if (acronyms.includes(lowerWord)) {\n return word.toUpperCase();\n }\n // Capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n\n return formatted;\n}\n\n/**\n * Check if a value should be displayed\n * Filters out null, undefined, empty strings, and empty arrays\n */\nexport function hasValue(value: any): boolean {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n return true;\n}\n\n/**\n * Get image URL from product, trying common field names\n * Returns fallback if no image found\n */\nexport function getImageUrl(\n product: ProductData,\n fallback = 'https://cloud-flz4zi76g-hack-club-bot.vercel.app/0image_fallback.jpg',\n): string {\n // Try common image field names (case-insensitive)\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n for (const field of imageFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Get display fields for a product, excluding image fields\n * Returns array of [key, value] tuples for fields with values\n */\nexport function getDisplayFields(product: ProductData): [string, string | number][] {\n // Fields to exclude from detail display\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n return Object.entries(product)\n .filter(([key, value]) => {\n // Exclude image fields\n if (imageFields.includes(key)) return false;\n // Exclude fields without values\n if (!hasValue(value)) return false;\n return true;\n })\n .map(([key, value]) => [key, value as string | number]);\n}\n\n/**\n * Get a specific field value with fallback\n */\nexport function getFieldValue<T = string | number>(\n product: ProductData,\n fieldName: string,\n fallback: T,\n): T {\n const value = product[fieldName];\n return hasValue(value) ? (value as T) : fallback;\n}\n\n/**\n * Try to find a \"title\" field (case-insensitive, various names)\n */\nexport function getTitleField(product: ProductData, fallback = 'Product'): string {\n const titleFields = [\n 'Title',\n 'title',\n 'Name',\n 'name',\n 'ProductName',\n 'productName',\n 'product_name',\n ];\n\n for (const field of titleFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Try to find a \"price\" field\n */\nexport function getPriceField(product: ProductData): string | number | null {\n const priceFields = ['Price', 'price', 'Cost', 'cost', 'Amount', 'amount'];\n\n for (const field of priceFields) {\n const value = product[field];\n if (hasValue(value)) {\n return value as string | number;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"rating\" field\n */\nexport function getRatingField(product: ProductData): number | null {\n const ratingFields = ['Rating', 'rating', 'Stars', 'stars', 'Score', 'score'];\n\n for (const field of ratingFields) {\n const value = product[field];\n if (typeof value === 'number' && value >= 0) {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"link\" field\n */\nexport function getLinkField(product: ProductData): string | null {\n const linkFields = ['Link', 'link', 'URL', 'url', 'ProductUrl', 'productUrl', 'href'];\n\n for (const field of linkFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"description\" field\n */\nexport function getDescriptionField(product: ProductData): string | null {\n const descFields = ['Description', 'description', 'Details', 'details', 'Info', 'info', 'desc'];\n\n for (const field of descFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n","import { Link, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData } from '../types';\nimport {\n formatFieldName,\n getDescriptionField,\n getImageUrl,\n getLinkField,\n getPriceField,\n getRatingField,\n getTitleField,\n} from './fieldHelpers';\n\n/**\n * List of known field names (lowercase) that should be excluded from dynamic field display\n * These are the common fields that templates typically handle specially\n */\nexport const KNOWN_FIELD_NAMES_LOWER = [\n 'image',\n 'imageurl',\n 'img',\n 'photo',\n 'picture',\n 'title',\n 'name',\n 'productname',\n 'description',\n 'details',\n 'info',\n 'desc',\n 'price',\n 'cost',\n 'amount',\n 'rating',\n 'stars',\n 'score',\n 'link',\n 'url',\n 'producturl',\n 'href',\n 'image2',\n 'imageurl2',\n 'img2',\n 'photo2',\n 'picture2',\n] as const;\n\n/**\n * Extracted product fields for template rendering\n */\nexport interface ExtractedFields {\n imageUrl: string;\n title: string;\n rating: number | null;\n description: string | null;\n price: string | number | null;\n link: string | null;\n dynamicFields: [string, string | number][];\n}\n\n/**\n * Extract all fields from a product for template rendering\n * This centralizes the field extraction logic used by all templates\n *\n * @param product - Product data to extract fields from\n * @param options - Optional configuration\n * @returns Extracted fields ready for rendering\n */\nexport function extractProductFields(\n product: ProductData,\n options: {\n /** Maximum number of dynamic fields to return (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Additional field names to exclude from dynamic fields */\n excludeFields?: string[];\n } = {},\n): ExtractedFields {\n const { maxDynamicFields, excludeFields = [] } = options;\n\n // Extract well-known fields\n const imageUrl = getImageUrl(product);\n const title = getTitleField(product);\n const rating = getRatingField(product);\n const description = getDescriptionField(product);\n const price = getPriceField(product);\n const link = getLinkField(product);\n\n // Build exclusion list\n const excludedFieldsLower = [\n ...KNOWN_FIELD_NAMES_LOWER,\n ...excludeFields.map((f) => f.toLowerCase()),\n ];\n\n // Extract dynamic fields\n let dynamicFields = Object.entries(product).filter(([key, value]) => {\n // Exclude known fields (case-insensitive)\n if (excludedFieldsLower.includes(key.toLowerCase())) return false;\n // Exclude empty values\n if (value === undefined || value === null || value === '') return false;\n return true;\n }) as [string, string | number][];\n\n // Limit dynamic fields if requested\n if (maxDynamicFields !== undefined && dynamicFields.length > maxDynamicFields) {\n dynamicFields = dynamicFields.slice(0, maxDynamicFields);\n }\n\n return {\n imageUrl,\n title,\n rating,\n description,\n price,\n link,\n dynamicFields,\n };\n}\n\n/**\n * Common styles for dynamic field rows\n * Can be extended or overridden by individual templates\n */\nexport const dynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 4,\n fontSize: 9,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\n/**\n * Render dynamic fields as rows with formatted labels\n * This is the common pattern used across all templates\n *\n * @param fields - Array of [key, value] tuples to render\n * @param styles - Optional custom styles (will merge with default styles)\n * @returns React component rendering the fields\n */\nexport function renderDynamicFields(\n fields: [string, string | number][],\n styles?: {\n container?: any;\n row?: any;\n label?: any;\n value?: any;\n },\n) {\n if (fields.length === 0) return null;\n\n const containerStyle = styles?.container || { marginBottom: 8 };\n const rowStyle = styles?.row || dynamicFieldStyles.detailRow;\n const labelStyle = styles?.label || dynamicFieldStyles.detailLabel;\n const valueStyle = styles?.value || dynamicFieldStyles.detailValue;\n\n return (\n <View style={containerStyle}>\n {fields.map(([key, value]) => (\n <View key={key} style={rowStyle}>\n <Text style={labelStyle}>{formatFieldName(key)}:</Text>\n <Text style={valueStyle}>{String(value)}</Text>\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Render a rating with star emoji\n * Common pattern across templates\n *\n * @param rating - Rating value (null if not present)\n * @param style - Style to apply to the text\n * @returns React component or null\n */\nexport function renderRating(rating: number | null, style: any) {\n if (rating === null) return null;\n return <Text style={style}>⭐ {rating}</Text>;\n}\n\n/**\n * Render a price field with formatting\n * Common pattern across templates\n *\n * @param price - Price value (null if not present)\n * @param style - Style to apply to the text\n * @param prefix - Optional prefix (default: \"Rs. \")\n * @returns React component or null\n */\nexport function renderPrice(\n price: string | number | null,\n style: any,\n prefix: string = 'Rs. ',\n) {\n if (price === null) return null;\n\n const priceText = typeof price === 'number' ? `${prefix}${price}` : String(price);\n return <Text style={style}>{priceText}</Text>;\n}\n\n/**\n * Render a \"Buy Now\" button/link\n * Common pattern across templates\n *\n * @param link - Link URL (null if not present)\n * @param style - Style to apply to the link\n * @param buttonText - Text to display (default: \"Buy Now\")\n * @param children - Optional children to render inside the link (e.g., price)\n * @returns React component or null\n */\nexport function renderBuyButton(\n link: string | null,\n style: any,\n buttonText: string = 'Buy Now',\n children?: React.ReactNode,\n) {\n if (!link || typeof link !== 'string') return null;\n\n return (\n <Link src={link} style={style}>\n {children}\n <Text style={{ marginHorizontal: 5 }}>{buttonText}</Text>\n </Link>\n );\n}\n\n/**\n * Template builder configuration\n * Used to create new templates with standard patterns\n */\nexport interface TemplateConfig {\n /** Maximum dynamic fields to show (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Whether to show rating with stars */\n showRating?: boolean;\n /** Whether to show description */\n showDescription?: boolean;\n /** Whether to show price */\n showPrice?: boolean;\n /** Whether to show buy button/link */\n showBuyButton?: boolean;\n /** Custom price prefix */\n pricePrefix?: string;\n /** Custom buy button text */\n buyButtonText?: string;\n}\n\n/**\n * Default template configuration\n */\nexport const DEFAULT_TEMPLATE_CONFIG: TemplateConfig = {\n maxDynamicFields: undefined, // No limit\n showRating: true,\n showDescription: true,\n showPrice: true,\n showBuyButton: true,\n pricePrefix: 'Rs. ',\n buyButtonText: 'Buy Now',\n};\n\n/**\n * Merge template configurations\n */\nexport function mergeTemplateConfig(\n config: Partial<TemplateConfig> = {},\n): TemplateConfig {\n return {\n ...DEFAULT_TEMPLATE_CONFIG,\n ...config,\n };\n}\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginVertical: 50,\n marginHorizontal: 20,\n },\n productSection: {\n width: '48%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n minHeight: 350,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n },\n productTitleBox: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productTitle: {\n fontSize: 14,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n fontWeight: 'bold',\n },\n productPrice: {\n fontSize: 12,\n color: '#2EB62C',\n marginTop: 4,\n marginBottom: 4,\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n textAlign: 'justify',\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: 'white',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template1: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image - always show */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Title and Rating row */}\n <View style={styles.productTitleBox}>\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description if available */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic additional fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Price and Buy Button */}\n {renderBuyButton(\n fields.link,\n styles.buyButton,\n 'Buy Now',\n renderPrice(fields.price, styles.productPrice),\n )}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template1;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n margin: 10,\n },\n productSection: {\n width: '100%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productSectionText: {\n width: '50%',\n padding: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n productSectionImage: {\n width: '50%',\n padding: 10,\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n padding: 3,\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n },\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template2: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image Section */}\n <View style={styles.productSectionImage}>\n <Image style={styles.image} src={fields.imageUrl} />\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Text Section */}\n <View style={styles.productSectionText}>\n {/* Title and Price */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderPrice(fields.price, styles.productPrice)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template2;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productSection: {\n width: '100%',\n height: '100vh',\n padding: 20,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n objectFit: 'contain',\n marginBottom: 10,\n },\n productDetailsBox: {\n backgroundColor: '#FDFD96',\n width: '50%',\n position: 'absolute',\n bottom: 10,\n right: 10,\n textAlign: 'justify',\n padding: 20,\n borderRadius: 8,\n maxHeight: '40%',\n overflow: 'hidden',\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {},\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\n// Custom styles for compact dynamic fields in overlay\nconst compactDynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 3,\n fontSize: 8,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\nconst Template3: React.FC<TemplateProps> = ({ products }) => {\n return (\n <>\n {products.map((product, index) => {\n // Extract all fields, limit to 5 for space-constrained overlay\n const fields = extractProductFields(product, { maxDynamicFields: 5 });\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Full background image */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Details overlay box */}\n <View style={styles.productDetailsBox}>\n {/* Title */}\n <Text style={styles.productTitle}>{fields.title}</Text>\n\n {/* Price and Rating */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n {renderPrice(fields.price, styles.productPrice)}\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields - compact, max 5 */}\n {renderDynamicFields(fields.dynamicFields, {\n row: compactDynamicFieldStyles.detailRow,\n label: compactDynamicFieldStyles.detailLabel,\n value: compactDynamicFieldStyles.detailValue,\n })}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n\n {/* Page break */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template3;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n },\n header: {\n backgroundColor: '#2C2C2C',\n padding: 15,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n companyName: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 2,\n },\n brandLogo: {\n width: 60,\n height: 60,\n objectFit: 'contain',\n },\n productContainer: {\n width: '100%',\n flex: 1,\n position: 'relative',\n padding: 20,\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n detailsBox: {\n position: 'absolute',\n bottom: 30,\n right: 30,\n backgroundColor: '#FFFFFF',\n padding: 15,\n borderRadius: 4,\n minWidth: '30%',\n maxWidth: '65%',\n border: '1px solid #E0E0E0',\n },\n});\n\n// Column-based styles for flexible 2-column layout\nconst template4ColumnStyles = StyleSheet.create({\n fieldsContainer: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n fieldColumn: {\n display: 'flex',\n flexDirection: 'column',\n width: '48%',\n marginBottom: 8,\n },\n fieldLabel: {\n fontWeight: 'bold',\n color: '#333333',\n fontSize: 9,\n marginBottom: 2,\n },\n fieldValue: {\n color: '#555555',\n fontSize: 9,\n flexShrink: 1,\n },\n});\n\n/**\n * Render fields in a responsive 2-column layout\n * Fields automatically flow into columns based on available space\n */\nfunction renderFieldsInColumns(fields: [string, string | number][]) {\n if (fields.length === 0) return null;\n\n return (\n <View style={template4ColumnStyles.fieldsContainer}>\n {fields.map(([key, value]) => (\n <View key={key} style={template4ColumnStyles.fieldColumn}>\n <Text style={template4ColumnStyles.fieldLabel}>\n {formatFieldName(key)}:\n </Text>\n <Text style={template4ColumnStyles.fieldValue}>\n {String(value)}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\nconst Template4: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName = 'BANG TEXTILES & CLOTHING PVT. LTD.',\n}) => {\n return (\n <>\n {products.map((product, index) => {\n // Template4 shows ALL fields (not just dynamic ones)\n // Extract all fields except images\n const allFields = Object.entries(product).filter(\n ([key, value]) =>\n // Only exclude image fields\n !['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'].includes(key) &&\n // Exclude empty values\n value !== undefined &&\n value !== null &&\n value !== '',\n ) as [string, string | number][];\n\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.page}>\n {/* Header with brand logo */}\n <View style={styles.header}>\n <Text style={styles.companyName}>{companyName || ''}</Text>\n {companyLogo && <Image style={styles.brandLogo} src={companyLogo} />}\n </View>\n\n {/* Product section */}\n <View style={styles.productContainer}>\n {/* Product Image - always render, using fallback if needed */}\n <Image style={styles.productImage} src={fields.imageUrl} />\n\n {/* Details box - only render if there are fields to show */}\n {allFields.length > 0 && (\n <View style={styles.detailsBox}>\n {renderFieldsInColumns(allFields)}\n </View>\n )}\n </View>\n\n {/* Page break after each product */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template4;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n backgroundColor: '#FFFFFF',\n flexDirection: 'column',\n },\n header: {\n height: 80,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 30,\n paddingTop: 20,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n marginBottom: 10,\n },\n logo: {\n height: 50,\n marginRight: 20,\n objectFit: 'contain',\n },\n companyName: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333333',\n letterSpacing: 1,\n },\n contentContainer: {\n flex: 1,\n flexDirection: 'row',\n paddingHorizontal: 30,\n paddingBottom: 30,\n gap: 20,\n },\n imageSection: {\n flex: 2,\n flexDirection: 'row',\n gap: 15,\n },\n imageWrapper: {\n flex: 1,\n height: '100%',\n backgroundColor: '#F9F9F9',\n borderRadius: 4,\n overflow: 'hidden',\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n detailsSection: {\n flex: 1,\n backgroundColor: '#F5F5F5',\n padding: 20,\n borderRadius: 8,\n justifyContent: 'center',\n },\n productTitle: {\n fontSize: 18,\n fontWeight: 'bold',\n color: '#222222',\n marginBottom: 15,\n borderBottomWidth: 2,\n borderBottomColor: '#333333',\n paddingBottom: 5,\n },\n dynamicFieldsContainer: {\n gap: 8,\n },\n detailRow: {\n flexDirection: 'row',\n marginBottom: 6,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n paddingBottom: 4,\n },\n detailLabel: {\n fontSize: 10,\n fontWeight: 'bold',\n color: '#555555',\n width: '40%',\n },\n detailValue: {\n fontSize: 10,\n color: '#333333',\n flex: 1,\n flexWrap: 'wrap',\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template5: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image if 2nd not present\n\n return (\n <View key={index} style={styles.page}>\n {/* Header Section */}\n <View style={styles.header}>\n {companyLogo && (\n <Image style={styles.logo} src={companyLogo} />\n )}\n <Text style={styles.companyName}>{companyName}</Text>\n </View>\n\n {/* Main Content Area */}\n <View style={styles.contentContainer}>\n {/* Dual Images Section */}\n <View style={styles.imageSection}>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={imageUrl} />\n </View>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={secondImage} />\n </View>\n </View>\n\n {/* Product Details Side Panel */}\n <View style={styles.detailsSection}>\n {title && <Text style={styles.productTitle}>{title}</Text>}\n \n <View style={styles.dynamicFieldsContainer}>\n {renderDynamicFields(dynamicFields, {\n row: styles.detailRow,\n label: styles.detailLabel,\n value: styles.detailValue,\n })}\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template5;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n flexDirection: 'row',\n backgroundColor: '#FFFFFF',\n },\n leftColumn: {\n width: '50%',\n height: '100%',\n position: 'relative',\n borderRightWidth: 1,\n borderRightColor: '#E0E0E0',\n },\n rightColumn: {\n width: '50%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n },\n imageFull: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n rightImageContainer: {\n flex: 1,\n width: '100%',\n position: 'relative',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n rightImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n specsOverlay: {\n position: 'absolute',\n bottom: 40, // Lifted slightly from absolute bottom\n right: 0,\n backgroundColor: '#FFFFFF',\n padding: 15,\n width: '65%', // Takes up a good chunk of the corner\n borderTopLeftRadius: 4,\n borderBottomLeftRadius: 4,\n shadowColor: '#000',\n shadowOpacity: 0.2,\n shadowRadius: 3,\n borderWidth: 1,\n borderColor: '#EEEEEE',\n },\n specsHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n paddingBottom: 5,\n },\n miniLogo: {\n width: 20,\n height: 20,\n objectFit: 'contain',\n marginRight: 8,\n },\n designNumber: {\n fontSize: 12,\n fontWeight: 'bold',\n color: '#000',\n },\n footer: {\n height: 100,\n backgroundColor: '#1A1A1A',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingHorizontal: 30,\n width: '100%',\n },\n footerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n footerLogo: {\n width: 40,\n height: 40,\n objectFit: 'contain',\n marginRight: 15,\n backgroundColor: '#FFF', // White background for logo visibility\n padding: 2,\n borderRadius: 2,\n },\n footerText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 1,\n textTransform: 'uppercase',\n },\n // Custom styles for dynamic fields in the overlay\n fieldRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n fieldLabel: {\n fontSize: 9,\n fontWeight: 'bold',\n color: '#333',\n width: '40%',\n },\n fieldValue: {\n fontSize: 9,\n color: '#555',\n flex: 1,\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template6: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image\n\n return (\n <View key={index} style={styles.page}>\n {/* Left Column: Fabric/Detail Image + Specs Overlay */}\n <View style={styles.leftColumn}>\n <Image style={styles.imageFull} src={imageUrl} />\n \n {/* Specifications Overlay */}\n <View style={styles.specsOverlay}>\n <View style={styles.specsHeader}>\n {companyLogo && <Image style={styles.miniLogo} src={companyLogo} />}\n <Text style={styles.designNumber}>\n {title || 'Specifications'}\n </Text>\n </View>\n \n {renderDynamicFields(dynamicFields, {\n row: styles.fieldRow,\n label: styles.fieldLabel,\n value: styles.fieldValue,\n })}\n </View>\n </View>\n\n {/* Right Column: Shirt/Usage Image + Footer */}\n <View style={styles.rightColumn}>\n <View style={styles.rightImageContainer}>\n <Image style={styles.rightImage} src={secondImage} />\n </View>\n \n {/* Footer */}\n <View style={styles.footer}>\n <View style={styles.footerContent}>\n {companyLogo && <Image style={styles.footerLogo} src={companyLogo} />}\n <Text style={styles.footerText}>{companyName}</Text>\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template6;\n","import { Document, Font, Image, Page, pdf, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport PoweredByTeziApp from './components/PoweredByTeziApp';\nimport { Template1, Template2, Template3, Template4, Template5, Template6 } from './templates';\nimport type { CatalogConfig } from './types';\n\n// Create styles\nconst styles = StyleSheet.create({\n page: {\n flexDirection: 'column',\n backgroundColor: '#FFFFFF',\n },\n header: {\n height: '100vh',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n alignContent: 'center',\n padding: 10,\n marginBottom: 5,\n },\n logoSection: {\n width: '80%',\n },\n storeNameSection: {},\n logo: {\n marginRight: 10,\n objectFit: 'contain',\n },\n storeName: {\n fontSize: 35,\n flexGrow: 1,\n transform: 'rotate(-90deg)',\n },\n});\n\n// Register emoji support\nFont.registerEmojiSource({\n format: 'png',\n url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n});\n\n/**\n * Normalize image source for react-pdf Image component\n * Handles URLs, data URIs, and plain base64 strings\n * @param imageSource Image source string (URL, data URI, or base64)\n * @returns Normalized image source string\n */\nfunction normalizeImageSource(imageSource: string): string {\n // If already a data URI, return as-is\n if (imageSource.startsWith('data:')) {\n return imageSource;\n }\n\n // If it's a URL, return as-is\n if (imageSource.startsWith('http://') || imageSource.startsWith('https://')) {\n return imageSource;\n }\n\n // Otherwise, assume it's a base64 string and convert to data URI\n // Try to detect image type from common base64 patterns\n let mimeType = 'image/png'; // default\n\n // Check for common base64 image signatures\n // PNG: starts with iVBORw0KGgo\n // JPEG: starts with /9j/4AAQ\n // GIF: starts with R0lGODlh\n // WebP: starts with UklGR\n const base64Start = imageSource.substring(0, 20).toLowerCase();\n if (base64Start.includes('ivborw0kggo') || imageSource.startsWith('iVBORw0KGgo')) {\n mimeType = 'image/png';\n } else if (base64Start.includes('/9j/4aaq') || imageSource.startsWith('/9j/4AAQ')) {\n mimeType = 'image/jpeg';\n } else if (base64Start.includes('r0lgodlh') || imageSource.startsWith('R0lGODlh')) {\n mimeType = 'image/gif';\n } else if (base64Start.includes('uklgr') || imageSource.startsWith('UklGR')) {\n mimeType = 'image/webp';\n }\n\n return `data:${mimeType};base64,${imageSource}`;\n}\n\n/**\n * Generate product catalog PDF\n * @param config Configuration with products, company info, and template choice\n * @returns Promise<Uint8Array> PDF as Uint8Array (works in both Node.js and browser)\n */\nexport async function generateProductCatalog(config: CatalogConfig): Promise<Uint8Array> {\n const { products, companyLogo, companyName, template = 'template1' } = config;\n\n // Select template component\n let TemplateComponent;\n switch (template) {\n case 'template1':\n TemplateComponent = Template1;\n break;\n case 'template2':\n TemplateComponent = Template2;\n break;\n case 'template3':\n TemplateComponent = Template3;\n break;\n case 'template4':\n TemplateComponent = Template4;\n break;\n case 'template5':\n TemplateComponent = Template5;\n break;\n case 'template6':\n TemplateComponent = Template6;\n break;\n default:\n TemplateComponent = Template1;\n }\n\n // Template4 handles its own page layout with headers on each page\n if (template === 'template4') {\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <Template4\n products={products as any}\n companyLogo={companyLogo}\n companyName={companyName}\n />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Template5 & Template6 require landscape orientation and handle their own layout\n if (template === 'template5' || template === 'template6') {\n const Template = template === 'template5' ? Template5 : Template6;\n const doc = (\n <Document>\n <Page size=\"A4\" orientation=\"landscape\" style={styles.page}>\n <Template\n products={products as any}\n companyLogo={companyLogo}\n companyName={companyName}\n />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Create PDF document for other templates\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <View style={styles.header}>\n {companyLogo && (\n <View style={styles.logoSection}>\n <Image style={styles.logo} src={companyLogo} />\n </View>\n )}\n <View style={styles.storeNameSection}>\n <Text style={styles.storeName}>{companyName}</Text>\n </View>\n </View>\n <TemplateComponent products={products as any} />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n // Generate PDF and return as Uint8Array\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n}\n","import * as XLSX from 'xlsx';\nimport type { ProductData } from './types';\n\n/**\n * Parse Excel file buffer to product data\n * @param buffer - Excel file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.xlsx');\n * const products = parseExcelFile(buffer);\n *\n * @example\n * // Browser/React\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseExcelFile(arrayBuffer);\n */\nexport function parseExcelFile(buffer: Buffer): ProductData[];\nexport function parseExcelFile(buffer: ArrayBuffer): ProductData[];\nexport function parseExcelFile(buffer: Uint8Array): ProductData[];\nexport function parseExcelFile(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n const workbook = XLSX.read(buffer, {\n type: buffer instanceof Buffer ? 'buffer' : 'array',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV string to product data\n */\nexport function parseCSVFile(csvString: string): ProductData[] {\n const workbook = XLSX.read(csvString, {\n type: 'string',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV buffer to product data\n * @param buffer - CSV file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.csv');\n * const products = parseCSVBuffer(buffer);\n *\n * @example\n * // Browser\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseCSVBuffer(arrayBuffer);\n */\nexport function parseCSVBuffer(buffer: Buffer): ProductData[];\nexport function parseCSVBuffer(buffer: ArrayBuffer): ProductData[];\nexport function parseCSVBuffer(buffer: Uint8Array): ProductData[];\nexport function parseCSVBuffer(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n let csvString: string;\n\n if (buffer instanceof Buffer) {\n csvString = buffer.toString('utf-8');\n } else if (buffer instanceof ArrayBuffer) {\n csvString = new TextDecoder('utf-8').decode(buffer);\n } else {\n // Uint8Array\n csvString = new TextDecoder('utf-8').decode(buffer);\n }\n\n return parseCSVFile(csvString);\n}\n\n/**\n * Parse and validate product data from JSON\n * Note: No fields are mandatory. Data is passed through as-is.\n */\nexport function parseJSON(data: any[]): ProductData[] {\n if (!Array.isArray(data)) {\n throw new Error('JSON data must be an array of products');\n }\n\n return data as ProductData[];\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -983,26 +983,6 @@ Font.registerEmojiSource({
|
|
|
983
983
|
format: "png",
|
|
984
984
|
url: "https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/"
|
|
985
985
|
});
|
|
986
|
-
function normalizeImageSource(imageSource) {
|
|
987
|
-
if (imageSource.startsWith("data:")) {
|
|
988
|
-
return imageSource;
|
|
989
|
-
}
|
|
990
|
-
if (imageSource.startsWith("http://") || imageSource.startsWith("https://")) {
|
|
991
|
-
return imageSource;
|
|
992
|
-
}
|
|
993
|
-
let mimeType = "image/png";
|
|
994
|
-
const base64Start = imageSource.substring(0, 20).toLowerCase();
|
|
995
|
-
if (base64Start.includes("ivborw0kggo") || imageSource.startsWith("iVBORw0KGgo")) {
|
|
996
|
-
mimeType = "image/png";
|
|
997
|
-
} else if (base64Start.includes("/9j/4aaq") || imageSource.startsWith("/9j/4AAQ")) {
|
|
998
|
-
mimeType = "image/jpeg";
|
|
999
|
-
} else if (base64Start.includes("r0lgodlh") || imageSource.startsWith("R0lGODlh")) {
|
|
1000
|
-
mimeType = "image/gif";
|
|
1001
|
-
} else if (base64Start.includes("uklgr") || imageSource.startsWith("UklGR")) {
|
|
1002
|
-
mimeType = "image/webp";
|
|
1003
|
-
}
|
|
1004
|
-
return `data:${mimeType};base64,${imageSource}`;
|
|
1005
|
-
}
|
|
1006
986
|
async function generateProductCatalog(config) {
|
|
1007
987
|
const { products, companyLogo, companyName, template = "template1" } = config;
|
|
1008
988
|
let TemplateComponent;
|
|
@@ -1033,7 +1013,7 @@ async function generateProductCatalog(config) {
|
|
|
1033
1013
|
Template4_default,
|
|
1034
1014
|
{
|
|
1035
1015
|
products,
|
|
1036
|
-
companyLogo
|
|
1016
|
+
companyLogo,
|
|
1037
1017
|
companyName
|
|
1038
1018
|
}
|
|
1039
1019
|
) }) });
|
|
@@ -1047,7 +1027,7 @@ async function generateProductCatalog(config) {
|
|
|
1047
1027
|
Template,
|
|
1048
1028
|
{
|
|
1049
1029
|
products,
|
|
1050
|
-
companyLogo
|
|
1030
|
+
companyLogo,
|
|
1051
1031
|
companyName
|
|
1052
1032
|
}
|
|
1053
1033
|
) }) });
|
|
@@ -1057,9 +1037,8 @@ async function generateProductCatalog(config) {
|
|
|
1057
1037
|
}
|
|
1058
1038
|
const doc = /* @__PURE__ */ jsx(Document, { children: /* @__PURE__ */ jsxs(Page, { size: "A4", style: styles7.page, children: [
|
|
1059
1039
|
/* @__PURE__ */ jsxs(View, { style: styles7.header, children: [
|
|
1060
|
-
companyLogo && /* @__PURE__ */ jsx(View, { style: styles7.logoSection, children: /* @__PURE__ */ jsx(Image, { style: styles7.logo, src:
|
|
1061
|
-
/* @__PURE__ */ jsx(View, { style: styles7.storeNameSection, children: /* @__PURE__ */ jsx(Text, { style: styles7.storeName, children: companyName }) })
|
|
1062
|
-
/* @__PURE__ */ jsx(View, { break: true })
|
|
1040
|
+
companyLogo && /* @__PURE__ */ jsx(View, { style: styles7.logoSection, children: /* @__PURE__ */ jsx(Image, { style: styles7.logo, src: companyLogo }) }),
|
|
1041
|
+
/* @__PURE__ */ jsx(View, { style: styles7.storeNameSection, children: /* @__PURE__ */ jsx(Text, { style: styles7.storeName, children: companyName }) })
|
|
1063
1042
|
] }),
|
|
1064
1043
|
/* @__PURE__ */ jsx(TemplateComponent, { products })
|
|
1065
1044
|
] }) });
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/fieldHelpers.ts","../src/utils/templateHelpers.tsx","../src/templates/Template1.tsx","../src/templates/Template2.tsx","../src/templates/Template3.tsx","../src/templates/Template4.tsx","../src/templates/Template5.tsx","../src/templates/Template6.tsx","../src/generator.tsx","../src/parser.ts"],"names":["styles","StyleSheet","jsx","View","jsxs","Text","Image","Fragment","getImage2Url","doc","blob","arrayBuffer"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ProductData } from '../types';\n\n/**\n * Format field name to human-readable label\n * Examples:\n * - \"designNumber\" -> \"Design Number\"\n * - \"gsm\" -> \"GSM\"\n * - \"fabric_finish\" -> \"Fabric Finish\"\n * - \"PRODUCT_ID\" -> \"Product ID\"\n */\nexport function formatFieldName(fieldName: string): string {\n // Handle common acronyms\n const acronyms = ['gsm', 'slub', 'id', 'sku', 'url', 'api', 'pdf', 'html', 'css', 'rgb'];\n\n // Replace underscores and hyphens with spaces\n let formatted = fieldName.replace(/[_-]/g, ' ');\n\n // Split camelCase\n formatted = formatted.replace(/([a-z])([A-Z])/g, '$1 $2');\n\n // Capitalize each word\n formatted = formatted\n .split(' ')\n .map((word) => {\n const lowerWord = word.toLowerCase();\n // Keep acronyms in uppercase\n if (acronyms.includes(lowerWord)) {\n return word.toUpperCase();\n }\n // Capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n\n return formatted;\n}\n\n/**\n * Check if a value should be displayed\n * Filters out null, undefined, empty strings, and empty arrays\n */\nexport function hasValue(value: any): boolean {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n return true;\n}\n\n/**\n * Get image URL from product, trying common field names\n * Returns fallback if no image found\n */\nexport function getImageUrl(\n product: ProductData,\n fallback = 'https://cloud-flz4zi76g-hack-club-bot.vercel.app/0image_fallback.jpg',\n): string {\n // Try common image field names (case-insensitive)\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n for (const field of imageFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Get display fields for a product, excluding image fields\n * Returns array of [key, value] tuples for fields with values\n */\nexport function getDisplayFields(product: ProductData): [string, string | number][] {\n // Fields to exclude from detail display\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n return Object.entries(product)\n .filter(([key, value]) => {\n // Exclude image fields\n if (imageFields.includes(key)) return false;\n // Exclude fields without values\n if (!hasValue(value)) return false;\n return true;\n })\n .map(([key, value]) => [key, value as string | number]);\n}\n\n/**\n * Get a specific field value with fallback\n */\nexport function getFieldValue<T = string | number>(\n product: ProductData,\n fieldName: string,\n fallback: T,\n): T {\n const value = product[fieldName];\n return hasValue(value) ? (value as T) : fallback;\n}\n\n/**\n * Try to find a \"title\" field (case-insensitive, various names)\n */\nexport function getTitleField(product: ProductData, fallback = 'Product'): string {\n const titleFields = [\n 'Title',\n 'title',\n 'Name',\n 'name',\n 'ProductName',\n 'productName',\n 'product_name',\n ];\n\n for (const field of titleFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Try to find a \"price\" field\n */\nexport function getPriceField(product: ProductData): string | number | null {\n const priceFields = ['Price', 'price', 'Cost', 'cost', 'Amount', 'amount'];\n\n for (const field of priceFields) {\n const value = product[field];\n if (hasValue(value)) {\n return value as string | number;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"rating\" field\n */\nexport function getRatingField(product: ProductData): number | null {\n const ratingFields = ['Rating', 'rating', 'Stars', 'stars', 'Score', 'score'];\n\n for (const field of ratingFields) {\n const value = product[field];\n if (typeof value === 'number' && value >= 0) {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"link\" field\n */\nexport function getLinkField(product: ProductData): string | null {\n const linkFields = ['Link', 'link', 'URL', 'url', 'ProductUrl', 'productUrl', 'href'];\n\n for (const field of linkFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"description\" field\n */\nexport function getDescriptionField(product: ProductData): string | null {\n const descFields = ['Description', 'description', 'Details', 'details', 'Info', 'info', 'desc'];\n\n for (const field of descFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n","import { Link, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData } from '../types';\nimport {\n formatFieldName,\n getDescriptionField,\n getImageUrl,\n getLinkField,\n getPriceField,\n getRatingField,\n getTitleField,\n} from './fieldHelpers';\n\n/**\n * List of known field names (lowercase) that should be excluded from dynamic field display\n * These are the common fields that templates typically handle specially\n */\nexport const KNOWN_FIELD_NAMES_LOWER = [\n 'image',\n 'imageurl',\n 'img',\n 'photo',\n 'picture',\n 'title',\n 'name',\n 'productname',\n 'description',\n 'details',\n 'info',\n 'desc',\n 'price',\n 'cost',\n 'amount',\n 'rating',\n 'stars',\n 'score',\n 'link',\n 'url',\n 'producturl',\n 'href',\n 'image2',\n 'imageurl2',\n 'img2',\n 'photo2',\n 'picture2',\n] as const;\n\n/**\n * Extracted product fields for template rendering\n */\nexport interface ExtractedFields {\n imageUrl: string;\n title: string;\n rating: number | null;\n description: string | null;\n price: string | number | null;\n link: string | null;\n dynamicFields: [string, string | number][];\n}\n\n/**\n * Extract all fields from a product for template rendering\n * This centralizes the field extraction logic used by all templates\n *\n * @param product - Product data to extract fields from\n * @param options - Optional configuration\n * @returns Extracted fields ready for rendering\n */\nexport function extractProductFields(\n product: ProductData,\n options: {\n /** Maximum number of dynamic fields to return (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Additional field names to exclude from dynamic fields */\n excludeFields?: string[];\n } = {},\n): ExtractedFields {\n const { maxDynamicFields, excludeFields = [] } = options;\n\n // Extract well-known fields\n const imageUrl = getImageUrl(product);\n const title = getTitleField(product);\n const rating = getRatingField(product);\n const description = getDescriptionField(product);\n const price = getPriceField(product);\n const link = getLinkField(product);\n\n // Build exclusion list\n const excludedFieldsLower = [\n ...KNOWN_FIELD_NAMES_LOWER,\n ...excludeFields.map((f) => f.toLowerCase()),\n ];\n\n // Extract dynamic fields\n let dynamicFields = Object.entries(product).filter(([key, value]) => {\n // Exclude known fields (case-insensitive)\n if (excludedFieldsLower.includes(key.toLowerCase())) return false;\n // Exclude empty values\n if (value === undefined || value === null || value === '') return false;\n return true;\n }) as [string, string | number][];\n\n // Limit dynamic fields if requested\n if (maxDynamicFields !== undefined && dynamicFields.length > maxDynamicFields) {\n dynamicFields = dynamicFields.slice(0, maxDynamicFields);\n }\n\n return {\n imageUrl,\n title,\n rating,\n description,\n price,\n link,\n dynamicFields,\n };\n}\n\n/**\n * Common styles for dynamic field rows\n * Can be extended or overridden by individual templates\n */\nexport const dynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 4,\n fontSize: 9,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\n/**\n * Render dynamic fields as rows with formatted labels\n * This is the common pattern used across all templates\n *\n * @param fields - Array of [key, value] tuples to render\n * @param styles - Optional custom styles (will merge with default styles)\n * @returns React component rendering the fields\n */\nexport function renderDynamicFields(\n fields: [string, string | number][],\n styles?: {\n container?: any;\n row?: any;\n label?: any;\n value?: any;\n },\n) {\n if (fields.length === 0) return null;\n\n const containerStyle = styles?.container || { marginBottom: 8 };\n const rowStyle = styles?.row || dynamicFieldStyles.detailRow;\n const labelStyle = styles?.label || dynamicFieldStyles.detailLabel;\n const valueStyle = styles?.value || dynamicFieldStyles.detailValue;\n\n return (\n <View style={containerStyle}>\n {fields.map(([key, value]) => (\n <View key={key} style={rowStyle}>\n <Text style={labelStyle}>{formatFieldName(key)}:</Text>\n <Text style={valueStyle}>{String(value)}</Text>\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Render a rating with star emoji\n * Common pattern across templates\n *\n * @param rating - Rating value (null if not present)\n * @param style - Style to apply to the text\n * @returns React component or null\n */\nexport function renderRating(rating: number | null, style: any) {\n if (rating === null) return null;\n return <Text style={style}>⭐ {rating}</Text>;\n}\n\n/**\n * Render a price field with formatting\n * Common pattern across templates\n *\n * @param price - Price value (null if not present)\n * @param style - Style to apply to the text\n * @param prefix - Optional prefix (default: \"Rs. \")\n * @returns React component or null\n */\nexport function renderPrice(\n price: string | number | null,\n style: any,\n prefix: string = 'Rs. ',\n) {\n if (price === null) return null;\n\n const priceText = typeof price === 'number' ? `${prefix}${price}` : String(price);\n return <Text style={style}>{priceText}</Text>;\n}\n\n/**\n * Render a \"Buy Now\" button/link\n * Common pattern across templates\n *\n * @param link - Link URL (null if not present)\n * @param style - Style to apply to the link\n * @param buttonText - Text to display (default: \"Buy Now\")\n * @param children - Optional children to render inside the link (e.g., price)\n * @returns React component or null\n */\nexport function renderBuyButton(\n link: string | null,\n style: any,\n buttonText: string = 'Buy Now',\n children?: React.ReactNode,\n) {\n if (!link || typeof link !== 'string') return null;\n\n return (\n <Link src={link} style={style}>\n {children}\n <Text style={{ marginHorizontal: 5 }}>{buttonText}</Text>\n </Link>\n );\n}\n\n/**\n * Template builder configuration\n * Used to create new templates with standard patterns\n */\nexport interface TemplateConfig {\n /** Maximum dynamic fields to show (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Whether to show rating with stars */\n showRating?: boolean;\n /** Whether to show description */\n showDescription?: boolean;\n /** Whether to show price */\n showPrice?: boolean;\n /** Whether to show buy button/link */\n showBuyButton?: boolean;\n /** Custom price prefix */\n pricePrefix?: string;\n /** Custom buy button text */\n buyButtonText?: string;\n}\n\n/**\n * Default template configuration\n */\nexport const DEFAULT_TEMPLATE_CONFIG: TemplateConfig = {\n maxDynamicFields: undefined, // No limit\n showRating: true,\n showDescription: true,\n showPrice: true,\n showBuyButton: true,\n pricePrefix: 'Rs. ',\n buyButtonText: 'Buy Now',\n};\n\n/**\n * Merge template configurations\n */\nexport function mergeTemplateConfig(\n config: Partial<TemplateConfig> = {},\n): TemplateConfig {\n return {\n ...DEFAULT_TEMPLATE_CONFIG,\n ...config,\n };\n}\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginVertical: 50,\n marginHorizontal: 20,\n },\n productSection: {\n width: '48%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n minHeight: 350,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n },\n productTitleBox: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productTitle: {\n fontSize: 14,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n fontWeight: 'bold',\n },\n productPrice: {\n fontSize: 12,\n color: '#2EB62C',\n marginTop: 4,\n marginBottom: 4,\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n textAlign: 'justify',\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: 'white',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template1: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image - always show */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Title and Rating row */}\n <View style={styles.productTitleBox}>\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description if available */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic additional fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Price and Buy Button */}\n {renderBuyButton(\n fields.link,\n styles.buyButton,\n 'Buy Now',\n renderPrice(fields.price, styles.productPrice),\n )}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template1;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n margin: 10,\n },\n productSection: {\n width: '100%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productSectionText: {\n width: '50%',\n padding: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n productSectionImage: {\n width: '50%',\n padding: 10,\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n padding: 3,\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n },\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template2: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image Section */}\n <View style={styles.productSectionImage}>\n <Image style={styles.image} src={fields.imageUrl} />\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Text Section */}\n <View style={styles.productSectionText}>\n {/* Title and Price */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderPrice(fields.price, styles.productPrice)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template2;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productSection: {\n width: '100%',\n height: '100vh',\n padding: 20,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n objectFit: 'contain',\n marginBottom: 10,\n },\n productDetailsBox: {\n backgroundColor: '#FDFD96',\n width: '50%',\n position: 'absolute',\n bottom: 10,\n right: 10,\n textAlign: 'justify',\n padding: 20,\n borderRadius: 8,\n maxHeight: '40%',\n overflow: 'hidden',\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {},\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\n// Custom styles for compact dynamic fields in overlay\nconst compactDynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 3,\n fontSize: 8,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\nconst Template3: React.FC<TemplateProps> = ({ products }) => {\n return (\n <>\n {products.map((product, index) => {\n // Extract all fields, limit to 5 for space-constrained overlay\n const fields = extractProductFields(product, { maxDynamicFields: 5 });\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Full background image */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Details overlay box */}\n <View style={styles.productDetailsBox}>\n {/* Title */}\n <Text style={styles.productTitle}>{fields.title}</Text>\n\n {/* Price and Rating */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n {renderPrice(fields.price, styles.productPrice)}\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields - compact, max 5 */}\n {renderDynamicFields(fields.dynamicFields, {\n row: compactDynamicFieldStyles.detailRow,\n label: compactDynamicFieldStyles.detailLabel,\n value: compactDynamicFieldStyles.detailValue,\n })}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n\n {/* Page break */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template3;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n },\n header: {\n backgroundColor: '#2C2C2C',\n padding: 15,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n companyName: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 2,\n },\n brandLogo: {\n width: 60,\n height: 60,\n objectFit: 'contain',\n },\n productContainer: {\n width: '100%',\n flex: 1,\n position: 'relative',\n padding: 20,\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n detailsBox: {\n position: 'absolute',\n bottom: 30,\n right: 30,\n backgroundColor: '#FFFFFF',\n padding: 15,\n borderRadius: 4,\n minWidth: '30%',\n maxWidth: '65%',\n border: '1px solid #E0E0E0',\n },\n});\n\n// Column-based styles for flexible 2-column layout\nconst template4ColumnStyles = StyleSheet.create({\n fieldsContainer: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n fieldColumn: {\n display: 'flex',\n flexDirection: 'column',\n width: '48%',\n marginBottom: 8,\n },\n fieldLabel: {\n fontWeight: 'bold',\n color: '#333333',\n fontSize: 9,\n marginBottom: 2,\n },\n fieldValue: {\n color: '#555555',\n fontSize: 9,\n flexShrink: 1,\n },\n});\n\n/**\n * Render fields in a responsive 2-column layout\n * Fields automatically flow into columns based on available space\n */\nfunction renderFieldsInColumns(fields: [string, string | number][]) {\n if (fields.length === 0) return null;\n\n return (\n <View style={template4ColumnStyles.fieldsContainer}>\n {fields.map(([key, value]) => (\n <View key={key} style={template4ColumnStyles.fieldColumn}>\n <Text style={template4ColumnStyles.fieldLabel}>\n {formatFieldName(key)}:\n </Text>\n <Text style={template4ColumnStyles.fieldValue}>\n {String(value)}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\nconst Template4: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName = 'BANG TEXTILES & CLOTHING PVT. LTD.',\n}) => {\n return (\n <>\n {products.map((product, index) => {\n // Template4 shows ALL fields (not just dynamic ones)\n // Extract all fields except images\n const allFields = Object.entries(product).filter(\n ([key, value]) =>\n // Only exclude image fields\n !['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'].includes(key) &&\n // Exclude empty values\n value !== undefined &&\n value !== null &&\n value !== '',\n ) as [string, string | number][];\n\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.page}>\n {/* Header with brand logo */}\n <View style={styles.header}>\n <Text style={styles.companyName}>{companyName || ''}</Text>\n {companyLogo && <Image style={styles.brandLogo} src={companyLogo} />}\n </View>\n\n {/* Product section */}\n <View style={styles.productContainer}>\n {/* Product Image - always render, using fallback if needed */}\n <Image style={styles.productImage} src={fields.imageUrl} />\n\n {/* Details box - only render if there are fields to show */}\n {allFields.length > 0 && (\n <View style={styles.detailsBox}>\n {renderFieldsInColumns(allFields)}\n </View>\n )}\n </View>\n\n {/* Page break after each product */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template4;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n backgroundColor: '#FFFFFF',\n flexDirection: 'column',\n },\n header: {\n height: 80,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 30,\n paddingTop: 20,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n marginBottom: 10,\n },\n logo: {\n height: 50,\n marginRight: 20,\n objectFit: 'contain',\n },\n companyName: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333333',\n letterSpacing: 1,\n },\n contentContainer: {\n flex: 1,\n flexDirection: 'row',\n paddingHorizontal: 30,\n paddingBottom: 30,\n gap: 20,\n },\n imageSection: {\n flex: 2,\n flexDirection: 'row',\n gap: 15,\n },\n imageWrapper: {\n flex: 1,\n height: '100%',\n backgroundColor: '#F9F9F9',\n borderRadius: 4,\n overflow: 'hidden',\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n detailsSection: {\n flex: 1,\n backgroundColor: '#F5F5F5',\n padding: 20,\n borderRadius: 8,\n justifyContent: 'center',\n },\n productTitle: {\n fontSize: 18,\n fontWeight: 'bold',\n color: '#222222',\n marginBottom: 15,\n borderBottomWidth: 2,\n borderBottomColor: '#333333',\n paddingBottom: 5,\n },\n dynamicFieldsContainer: {\n gap: 8,\n },\n detailRow: {\n flexDirection: 'row',\n marginBottom: 6,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n paddingBottom: 4,\n },\n detailLabel: {\n fontSize: 10,\n fontWeight: 'bold',\n color: '#555555',\n width: '40%',\n },\n detailValue: {\n fontSize: 10,\n color: '#333333',\n flex: 1,\n flexWrap: 'wrap',\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template5: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image if 2nd not present\n\n return (\n <View key={index} style={styles.page}>\n {/* Header Section */}\n <View style={styles.header}>\n {companyLogo && (\n <Image style={styles.logo} src={companyLogo} />\n )}\n <Text style={styles.companyName}>{companyName}</Text>\n </View>\n\n {/* Main Content Area */}\n <View style={styles.contentContainer}>\n {/* Dual Images Section */}\n <View style={styles.imageSection}>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={imageUrl} />\n </View>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={secondImage} />\n </View>\n </View>\n\n {/* Product Details Side Panel */}\n <View style={styles.detailsSection}>\n {title && <Text style={styles.productTitle}>{title}</Text>}\n \n <View style={styles.dynamicFieldsContainer}>\n {renderDynamicFields(dynamicFields, {\n row: styles.detailRow,\n label: styles.detailLabel,\n value: styles.detailValue,\n })}\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template5;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n flexDirection: 'row',\n backgroundColor: '#FFFFFF',\n },\n leftColumn: {\n width: '50%',\n height: '100%',\n position: 'relative',\n borderRightWidth: 1,\n borderRightColor: '#E0E0E0',\n },\n rightColumn: {\n width: '50%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n },\n imageFull: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n rightImageContainer: {\n flex: 1,\n width: '100%',\n position: 'relative',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n rightImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n specsOverlay: {\n position: 'absolute',\n bottom: 40, // Lifted slightly from absolute bottom\n right: 0,\n backgroundColor: '#FFFFFF',\n padding: 15,\n width: '65%', // Takes up a good chunk of the corner\n borderTopLeftRadius: 4,\n borderBottomLeftRadius: 4,\n shadowColor: '#000',\n shadowOpacity: 0.2,\n shadowRadius: 3,\n borderWidth: 1,\n borderColor: '#EEEEEE',\n },\n specsHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n paddingBottom: 5,\n },\n miniLogo: {\n width: 20,\n height: 20,\n objectFit: 'contain',\n marginRight: 8,\n },\n designNumber: {\n fontSize: 12,\n fontWeight: 'bold',\n color: '#000',\n },\n footer: {\n height: 100,\n backgroundColor: '#1A1A1A',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingHorizontal: 30,\n width: '100%',\n },\n footerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n footerLogo: {\n width: 40,\n height: 40,\n objectFit: 'contain',\n marginRight: 15,\n backgroundColor: '#FFF', // White background for logo visibility\n padding: 2,\n borderRadius: 2,\n },\n footerText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 1,\n textTransform: 'uppercase',\n },\n // Custom styles for dynamic fields in the overlay\n fieldRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n fieldLabel: {\n fontSize: 9,\n fontWeight: 'bold',\n color: '#333',\n width: '40%',\n },\n fieldValue: {\n fontSize: 9,\n color: '#555',\n flex: 1,\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template6: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image\n\n return (\n <View key={index} style={styles.page}>\n {/* Left Column: Fabric/Detail Image + Specs Overlay */}\n <View style={styles.leftColumn}>\n <Image style={styles.imageFull} src={imageUrl} />\n \n {/* Specifications Overlay */}\n <View style={styles.specsOverlay}>\n <View style={styles.specsHeader}>\n {companyLogo && <Image style={styles.miniLogo} src={companyLogo} />}\n <Text style={styles.designNumber}>\n {title || 'Specifications'}\n </Text>\n </View>\n \n {renderDynamicFields(dynamicFields, {\n row: styles.fieldRow,\n label: styles.fieldLabel,\n value: styles.fieldValue,\n })}\n </View>\n </View>\n\n {/* Right Column: Shirt/Usage Image + Footer */}\n <View style={styles.rightColumn}>\n <View style={styles.rightImageContainer}>\n <Image style={styles.rightImage} src={secondImage} />\n </View>\n \n {/* Footer */}\n <View style={styles.footer}>\n <View style={styles.footerContent}>\n {companyLogo && <Image style={styles.footerLogo} src={companyLogo} />}\n <Text style={styles.footerText}>{companyName}</Text>\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template6;\n","import { Document, Font, Image, Page, pdf, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport { Template1, Template2, Template3, Template4, Template5, Template6 } from './templates';\nimport type { CatalogConfig } from './types';\n\n// Create styles\nconst styles = StyleSheet.create({\n page: {\n flexDirection: 'column',\n backgroundColor: '#FFFFFF',\n },\n header: {\n height: '100vh',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n alignContent: 'center',\n padding: 10,\n marginBottom: 5,\n },\n logoSection: {\n width: '80%',\n },\n storeNameSection: {},\n logo: {\n marginRight: 10,\n objectFit: 'contain',\n },\n storeName: {\n fontSize: 35,\n flexGrow: 1,\n transform: 'rotate(-90deg)',\n },\n});\n\n// Register emoji support\nFont.registerEmojiSource({\n format: 'png',\n url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n});\n\n/**\n * Normalize image source for react-pdf Image component\n * Handles URLs, data URIs, and plain base64 strings\n * @param imageSource Image source string (URL, data URI, or base64)\n * @returns Normalized image source string\n */\nfunction normalizeImageSource(imageSource: string): string {\n // If already a data URI, return as-is\n if (imageSource.startsWith('data:')) {\n return imageSource;\n }\n\n // If it's a URL, return as-is\n if (imageSource.startsWith('http://') || imageSource.startsWith('https://')) {\n return imageSource;\n }\n\n // Otherwise, assume it's a base64 string and convert to data URI\n // Try to detect image type from common base64 patterns\n let mimeType = 'image/png'; // default\n\n // Check for common base64 image signatures\n // PNG: starts with iVBORw0KGgo\n // JPEG: starts with /9j/4AAQ\n // GIF: starts with R0lGODlh\n // WebP: starts with UklGR\n const base64Start = imageSource.substring(0, 20).toLowerCase();\n if (base64Start.includes('ivborw0kggo') || imageSource.startsWith('iVBORw0KGgo')) {\n mimeType = 'image/png';\n } else if (base64Start.includes('/9j/4aaq') || imageSource.startsWith('/9j/4AAQ')) {\n mimeType = 'image/jpeg';\n } else if (base64Start.includes('r0lgodlh') || imageSource.startsWith('R0lGODlh')) {\n mimeType = 'image/gif';\n } else if (base64Start.includes('uklgr') || imageSource.startsWith('UklGR')) {\n mimeType = 'image/webp';\n }\n\n return `data:${mimeType};base64,${imageSource}`;\n}\n\n/**\n * Generate product catalog PDF\n * @param config Configuration with products, company info, and template choice\n * @returns Promise<Uint8Array> PDF as Uint8Array (works in both Node.js and browser)\n */\nexport async function generateProductCatalog(config: CatalogConfig): Promise<Uint8Array> {\n const { products, companyLogo, companyName, template = 'template1' } = config;\n\n // Select template component\n let TemplateComponent;\n switch (template) {\n case 'template1':\n TemplateComponent = Template1;\n break;\n case 'template2':\n TemplateComponent = Template2;\n break;\n case 'template3':\n TemplateComponent = Template3;\n break;\n case 'template4':\n TemplateComponent = Template4;\n break;\n case 'template5':\n TemplateComponent = Template5;\n break;\n case 'template6':\n TemplateComponent = Template6;\n break;\n default:\n TemplateComponent = Template1;\n }\n\n // Template4 handles its own page layout with headers on each page\n if (template === 'template4') {\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <Template4\n products={products as any}\n companyLogo={companyLogo ? normalizeImageSource(companyLogo) : undefined}\n companyName={companyName}\n />\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Template5 & Template6 require landscape orientation and handle their own layout\n if (template === 'template5' || template === 'template6') {\n const Template = template === 'template5' ? Template5 : Template6;\n const doc = (\n <Document>\n <Page size=\"A4\" orientation=\"landscape\" style={styles.page}>\n <Template\n products={products as any}\n companyLogo={companyLogo ? normalizeImageSource(companyLogo) : undefined}\n companyName={companyName}\n />\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Create PDF document for other templates\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <View style={styles.header}>\n {companyLogo && (\n <View style={styles.logoSection}>\n <Image style={styles.logo} src={normalizeImageSource(companyLogo)} />\n </View>\n )}\n <View style={styles.storeNameSection}>\n <Text style={styles.storeName}>{companyName}</Text>\n </View>\n <View break></View>\n </View>\n <TemplateComponent products={products as any} />\n </Page>\n </Document>\n );\n\n // Generate PDF and return as Uint8Array\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n}\n","import * as XLSX from 'xlsx';\nimport type { ProductData } from './types';\n\n/**\n * Parse Excel file buffer to product data\n * @param buffer - Excel file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.xlsx');\n * const products = parseExcelFile(buffer);\n *\n * @example\n * // Browser/React\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseExcelFile(arrayBuffer);\n */\nexport function parseExcelFile(buffer: Buffer): ProductData[];\nexport function parseExcelFile(buffer: ArrayBuffer): ProductData[];\nexport function parseExcelFile(buffer: Uint8Array): ProductData[];\nexport function parseExcelFile(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n const workbook = XLSX.read(buffer, {\n type: buffer instanceof Buffer ? 'buffer' : 'array',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV string to product data\n */\nexport function parseCSVFile(csvString: string): ProductData[] {\n const workbook = XLSX.read(csvString, {\n type: 'string',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV buffer to product data\n * @param buffer - CSV file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.csv');\n * const products = parseCSVBuffer(buffer);\n *\n * @example\n * // Browser\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseCSVBuffer(arrayBuffer);\n */\nexport function parseCSVBuffer(buffer: Buffer): ProductData[];\nexport function parseCSVBuffer(buffer: ArrayBuffer): ProductData[];\nexport function parseCSVBuffer(buffer: Uint8Array): ProductData[];\nexport function parseCSVBuffer(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n let csvString: string;\n\n if (buffer instanceof Buffer) {\n csvString = buffer.toString('utf-8');\n } else if (buffer instanceof ArrayBuffer) {\n csvString = new TextDecoder('utf-8').decode(buffer);\n } else {\n // Uint8Array\n csvString = new TextDecoder('utf-8').decode(buffer);\n }\n\n return parseCSVFile(csvString);\n}\n\n/**\n * Parse and validate product data from JSON\n * Note: No fields are mandatory. Data is passed through as-is.\n */\nexport function parseJSON(data: any[]): ProductData[] {\n if (!Array.isArray(data)) {\n throw new Error('JSON data must be an array of products');\n }\n\n return data as ProductData[];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/fieldHelpers.ts","../src/utils/templateHelpers.tsx","../src/templates/Template1.tsx","../src/templates/Template2.tsx","../src/templates/Template3.tsx","../src/templates/Template4.tsx","../src/templates/Template5.tsx","../src/templates/Template6.tsx","../src/generator.tsx","../src/parser.ts"],"names":["styles","StyleSheet","jsx","View","jsxs","Text","Image","Fragment","getImage2Url","doc","blob","arrayBuffer"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ProductData } from '../types';\n\n/**\n * Format field name to human-readable label\n * Examples:\n * - \"designNumber\" -> \"Design Number\"\n * - \"gsm\" -> \"GSM\"\n * - \"fabric_finish\" -> \"Fabric Finish\"\n * - \"PRODUCT_ID\" -> \"Product ID\"\n */\nexport function formatFieldName(fieldName: string): string {\n // Handle common acronyms\n const acronyms = ['gsm', 'slub', 'id', 'sku', 'url', 'api', 'pdf', 'html', 'css', 'rgb'];\n\n // Replace underscores and hyphens with spaces\n let formatted = fieldName.replace(/[_-]/g, ' ');\n\n // Split camelCase\n formatted = formatted.replace(/([a-z])([A-Z])/g, '$1 $2');\n\n // Capitalize each word\n formatted = formatted\n .split(' ')\n .map((word) => {\n const lowerWord = word.toLowerCase();\n // Keep acronyms in uppercase\n if (acronyms.includes(lowerWord)) {\n return word.toUpperCase();\n }\n // Capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n\n return formatted;\n}\n\n/**\n * Check if a value should be displayed\n * Filters out null, undefined, empty strings, and empty arrays\n */\nexport function hasValue(value: any): boolean {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n return true;\n}\n\n/**\n * Get image URL from product, trying common field names\n * Returns fallback if no image found\n */\nexport function getImageUrl(\n product: ProductData,\n fallback = 'https://cloud-flz4zi76g-hack-club-bot.vercel.app/0image_fallback.jpg',\n): string {\n // Try common image field names (case-insensitive)\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n for (const field of imageFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Get display fields for a product, excluding image fields\n * Returns array of [key, value] tuples for fields with values\n */\nexport function getDisplayFields(product: ProductData): [string, string | number][] {\n // Fields to exclude from detail display\n const imageFields = ['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'];\n\n return Object.entries(product)\n .filter(([key, value]) => {\n // Exclude image fields\n if (imageFields.includes(key)) return false;\n // Exclude fields without values\n if (!hasValue(value)) return false;\n return true;\n })\n .map(([key, value]) => [key, value as string | number]);\n}\n\n/**\n * Get a specific field value with fallback\n */\nexport function getFieldValue<T = string | number>(\n product: ProductData,\n fieldName: string,\n fallback: T,\n): T {\n const value = product[fieldName];\n return hasValue(value) ? (value as T) : fallback;\n}\n\n/**\n * Try to find a \"title\" field (case-insensitive, various names)\n */\nexport function getTitleField(product: ProductData, fallback = 'Product'): string {\n const titleFields = [\n 'Title',\n 'title',\n 'Name',\n 'name',\n 'ProductName',\n 'productName',\n 'product_name',\n ];\n\n for (const field of titleFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return fallback;\n}\n\n/**\n * Try to find a \"price\" field\n */\nexport function getPriceField(product: ProductData): string | number | null {\n const priceFields = ['Price', 'price', 'Cost', 'cost', 'Amount', 'amount'];\n\n for (const field of priceFields) {\n const value = product[field];\n if (hasValue(value)) {\n return value as string | number;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"rating\" field\n */\nexport function getRatingField(product: ProductData): number | null {\n const ratingFields = ['Rating', 'rating', 'Stars', 'stars', 'Score', 'score'];\n\n for (const field of ratingFields) {\n const value = product[field];\n if (typeof value === 'number' && value >= 0) {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"link\" field\n */\nexport function getLinkField(product: ProductData): string | null {\n const linkFields = ['Link', 'link', 'URL', 'url', 'ProductUrl', 'productUrl', 'href'];\n\n for (const field of linkFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n\n/**\n * Try to find a \"description\" field\n */\nexport function getDescriptionField(product: ProductData): string | null {\n const descFields = ['Description', 'description', 'Details', 'details', 'Info', 'info', 'desc'];\n\n for (const field of descFields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n\n return null;\n}\n","import { Link, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData } from '../types';\nimport {\n formatFieldName,\n getDescriptionField,\n getImageUrl,\n getLinkField,\n getPriceField,\n getRatingField,\n getTitleField,\n} from './fieldHelpers';\n\n/**\n * List of known field names (lowercase) that should be excluded from dynamic field display\n * These are the common fields that templates typically handle specially\n */\nexport const KNOWN_FIELD_NAMES_LOWER = [\n 'image',\n 'imageurl',\n 'img',\n 'photo',\n 'picture',\n 'title',\n 'name',\n 'productname',\n 'description',\n 'details',\n 'info',\n 'desc',\n 'price',\n 'cost',\n 'amount',\n 'rating',\n 'stars',\n 'score',\n 'link',\n 'url',\n 'producturl',\n 'href',\n 'image2',\n 'imageurl2',\n 'img2',\n 'photo2',\n 'picture2',\n] as const;\n\n/**\n * Extracted product fields for template rendering\n */\nexport interface ExtractedFields {\n imageUrl: string;\n title: string;\n rating: number | null;\n description: string | null;\n price: string | number | null;\n link: string | null;\n dynamicFields: [string, string | number][];\n}\n\n/**\n * Extract all fields from a product for template rendering\n * This centralizes the field extraction logic used by all templates\n *\n * @param product - Product data to extract fields from\n * @param options - Optional configuration\n * @returns Extracted fields ready for rendering\n */\nexport function extractProductFields(\n product: ProductData,\n options: {\n /** Maximum number of dynamic fields to return (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Additional field names to exclude from dynamic fields */\n excludeFields?: string[];\n } = {},\n): ExtractedFields {\n const { maxDynamicFields, excludeFields = [] } = options;\n\n // Extract well-known fields\n const imageUrl = getImageUrl(product);\n const title = getTitleField(product);\n const rating = getRatingField(product);\n const description = getDescriptionField(product);\n const price = getPriceField(product);\n const link = getLinkField(product);\n\n // Build exclusion list\n const excludedFieldsLower = [\n ...KNOWN_FIELD_NAMES_LOWER,\n ...excludeFields.map((f) => f.toLowerCase()),\n ];\n\n // Extract dynamic fields\n let dynamicFields = Object.entries(product).filter(([key, value]) => {\n // Exclude known fields (case-insensitive)\n if (excludedFieldsLower.includes(key.toLowerCase())) return false;\n // Exclude empty values\n if (value === undefined || value === null || value === '') return false;\n return true;\n }) as [string, string | number][];\n\n // Limit dynamic fields if requested\n if (maxDynamicFields !== undefined && dynamicFields.length > maxDynamicFields) {\n dynamicFields = dynamicFields.slice(0, maxDynamicFields);\n }\n\n return {\n imageUrl,\n title,\n rating,\n description,\n price,\n link,\n dynamicFields,\n };\n}\n\n/**\n * Common styles for dynamic field rows\n * Can be extended or overridden by individual templates\n */\nexport const dynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 4,\n fontSize: 9,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\n/**\n * Render dynamic fields as rows with formatted labels\n * This is the common pattern used across all templates\n *\n * @param fields - Array of [key, value] tuples to render\n * @param styles - Optional custom styles (will merge with default styles)\n * @returns React component rendering the fields\n */\nexport function renderDynamicFields(\n fields: [string, string | number][],\n styles?: {\n container?: any;\n row?: any;\n label?: any;\n value?: any;\n },\n) {\n if (fields.length === 0) return null;\n\n const containerStyle = styles?.container || { marginBottom: 8 };\n const rowStyle = styles?.row || dynamicFieldStyles.detailRow;\n const labelStyle = styles?.label || dynamicFieldStyles.detailLabel;\n const valueStyle = styles?.value || dynamicFieldStyles.detailValue;\n\n return (\n <View style={containerStyle}>\n {fields.map(([key, value]) => (\n <View key={key} style={rowStyle}>\n <Text style={labelStyle}>{formatFieldName(key)}:</Text>\n <Text style={valueStyle}>{String(value)}</Text>\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Render a rating with star emoji\n * Common pattern across templates\n *\n * @param rating - Rating value (null if not present)\n * @param style - Style to apply to the text\n * @returns React component or null\n */\nexport function renderRating(rating: number | null, style: any) {\n if (rating === null) return null;\n return <Text style={style}>⭐ {rating}</Text>;\n}\n\n/**\n * Render a price field with formatting\n * Common pattern across templates\n *\n * @param price - Price value (null if not present)\n * @param style - Style to apply to the text\n * @param prefix - Optional prefix (default: \"Rs. \")\n * @returns React component or null\n */\nexport function renderPrice(\n price: string | number | null,\n style: any,\n prefix: string = 'Rs. ',\n) {\n if (price === null) return null;\n\n const priceText = typeof price === 'number' ? `${prefix}${price}` : String(price);\n return <Text style={style}>{priceText}</Text>;\n}\n\n/**\n * Render a \"Buy Now\" button/link\n * Common pattern across templates\n *\n * @param link - Link URL (null if not present)\n * @param style - Style to apply to the link\n * @param buttonText - Text to display (default: \"Buy Now\")\n * @param children - Optional children to render inside the link (e.g., price)\n * @returns React component or null\n */\nexport function renderBuyButton(\n link: string | null,\n style: any,\n buttonText: string = 'Buy Now',\n children?: React.ReactNode,\n) {\n if (!link || typeof link !== 'string') return null;\n\n return (\n <Link src={link} style={style}>\n {children}\n <Text style={{ marginHorizontal: 5 }}>{buttonText}</Text>\n </Link>\n );\n}\n\n/**\n * Template builder configuration\n * Used to create new templates with standard patterns\n */\nexport interface TemplateConfig {\n /** Maximum dynamic fields to show (useful for space-constrained layouts) */\n maxDynamicFields?: number;\n /** Whether to show rating with stars */\n showRating?: boolean;\n /** Whether to show description */\n showDescription?: boolean;\n /** Whether to show price */\n showPrice?: boolean;\n /** Whether to show buy button/link */\n showBuyButton?: boolean;\n /** Custom price prefix */\n pricePrefix?: string;\n /** Custom buy button text */\n buyButtonText?: string;\n}\n\n/**\n * Default template configuration\n */\nexport const DEFAULT_TEMPLATE_CONFIG: TemplateConfig = {\n maxDynamicFields: undefined, // No limit\n showRating: true,\n showDescription: true,\n showPrice: true,\n showBuyButton: true,\n pricePrefix: 'Rs. ',\n buyButtonText: 'Buy Now',\n};\n\n/**\n * Merge template configurations\n */\nexport function mergeTemplateConfig(\n config: Partial<TemplateConfig> = {},\n): TemplateConfig {\n return {\n ...DEFAULT_TEMPLATE_CONFIG,\n ...config,\n };\n}\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginVertical: 50,\n marginHorizontal: 20,\n },\n productSection: {\n width: '48%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n minHeight: 350,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n },\n productTitleBox: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productTitle: {\n fontSize: 14,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n fontWeight: 'bold',\n },\n productPrice: {\n fontSize: 12,\n color: '#2EB62C',\n marginTop: 4,\n marginBottom: 4,\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n textAlign: 'justify',\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: 'white',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template1: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image - always show */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Title and Rating row */}\n <View style={styles.productTitleBox}>\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description if available */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic additional fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Price and Buy Button */}\n {renderBuyButton(\n fields.link,\n styles.buyButton,\n 'Buy Now',\n renderPrice(fields.price, styles.productPrice),\n )}\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template1;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n margin: 10,\n },\n productSection: {\n width: '100%',\n padding: 10,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n productSectionText: {\n width: '50%',\n padding: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n productSectionImage: {\n width: '50%',\n padding: 10,\n borderRadius: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n image: {\n height: 200,\n objectFit: 'contain',\n marginBottom: 10,\n padding: 3,\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n },\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\nconst Template2: React.FC<TemplateProps> = ({ products }) => {\n return (\n <View style={styles.productContainer}>\n {products.map((product, index) => {\n // Extract all fields using the helper\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Image Section */}\n <View style={styles.productSectionImage}>\n <Image style={styles.image} src={fields.imageUrl} />\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Text Section */}\n <View style={styles.productSectionText}>\n {/* Title and Price */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n <Text style={styles.productTitle}>{fields.title}</Text>\n {renderPrice(fields.price, styles.productPrice)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields */}\n {renderDynamicFields(fields.dynamicFields)}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n </View>\n );\n })}\n </View>\n );\n};\n\nexport default Template2;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport {\n extractProductFields,\n renderBuyButton,\n renderDynamicFields,\n renderPrice,\n renderRating,\n} from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n productSection: {\n width: '100%',\n height: '100vh',\n padding: 20,\n marginBottom: 10,\n backgroundColor: '#f2f2f2',\n borderRadius: 5,\n display: 'flex',\n justifyContent: 'space-between',\n },\n image: {\n width: '100%',\n objectFit: 'contain',\n marginBottom: 10,\n },\n productDetailsBox: {\n backgroundColor: '#FDFD96',\n width: '50%',\n position: 'absolute',\n bottom: 10,\n right: 10,\n textAlign: 'justify',\n padding: 20,\n borderRadius: 8,\n maxHeight: '40%',\n overflow: 'hidden',\n },\n productTitle: {\n fontSize: 20,\n fontWeight: 'bold',\n marginBottom: 4,\n },\n productRate: {},\n productPrice: {\n fontSize: 16,\n color: '#43B446',\n marginTop: 4,\n marginBottom: 4,\n alignSelf: 'flex-end',\n },\n productDescription: {\n fontSize: 10,\n color: '#555555',\n marginBottom: 10,\n },\n buyButton: {\n fontSize: 12,\n padding: 8,\n backgroundColor: '#ccf9ff',\n color: 'black',\n textAlign: 'center',\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#000000',\n marginTop: 10,\n textDecoration: 'none',\n },\n});\n\n// Custom styles for compact dynamic fields in overlay\nconst compactDynamicFieldStyles = StyleSheet.create({\n detailRow: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 3,\n fontSize: 8,\n },\n detailLabel: {\n fontWeight: 'bold',\n color: '#333333',\n marginRight: 5,\n minWidth: 70,\n },\n detailValue: {\n color: '#555555',\n flexShrink: 1,\n },\n});\n\nconst Template3: React.FC<TemplateProps> = ({ products }) => {\n return (\n <>\n {products.map((product, index) => {\n // Extract all fields, limit to 5 for space-constrained overlay\n const fields = extractProductFields(product, { maxDynamicFields: 5 });\n\n return (\n <View key={index} style={styles.productSection}>\n {/* Full background image */}\n <Image style={styles.image} src={fields.imageUrl} />\n\n {/* Details overlay box */}\n <View style={styles.productDetailsBox}>\n {/* Title */}\n <Text style={styles.productTitle}>{fields.title}</Text>\n\n {/* Price and Rating */}\n <View\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n }}\n >\n {renderPrice(fields.price, styles.productPrice)}\n {renderRating(fields.rating, styles.productRate)}\n </View>\n\n {/* Description */}\n {fields.description && (\n <Text style={styles.productDescription}>{fields.description}</Text>\n )}\n\n {/* Dynamic Fields - compact, max 5 */}\n {renderDynamicFields(fields.dynamicFields, {\n row: compactDynamicFieldStyles.detailRow,\n label: compactDynamicFieldStyles.detailLabel,\n value: compactDynamicFieldStyles.detailValue,\n })}\n\n {/* Buy Button */}\n {renderBuyButton(fields.link, styles.buyButton)}\n </View>\n\n {/* Page break */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template3;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport type { TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n },\n header: {\n backgroundColor: '#2C2C2C',\n padding: 15,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n companyName: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 2,\n },\n brandLogo: {\n width: 60,\n height: 60,\n objectFit: 'contain',\n },\n productContainer: {\n width: '100%',\n flex: 1,\n position: 'relative',\n padding: 20,\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n detailsBox: {\n position: 'absolute',\n bottom: 30,\n right: 30,\n backgroundColor: '#FFFFFF',\n padding: 15,\n borderRadius: 4,\n minWidth: '30%',\n maxWidth: '65%',\n border: '1px solid #E0E0E0',\n },\n});\n\n// Column-based styles for flexible 2-column layout\nconst template4ColumnStyles = StyleSheet.create({\n fieldsContainer: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n fieldColumn: {\n display: 'flex',\n flexDirection: 'column',\n width: '48%',\n marginBottom: 8,\n },\n fieldLabel: {\n fontWeight: 'bold',\n color: '#333333',\n fontSize: 9,\n marginBottom: 2,\n },\n fieldValue: {\n color: '#555555',\n fontSize: 9,\n flexShrink: 1,\n },\n});\n\n/**\n * Render fields in a responsive 2-column layout\n * Fields automatically flow into columns based on available space\n */\nfunction renderFieldsInColumns(fields: [string, string | number][]) {\n if (fields.length === 0) return null;\n\n return (\n <View style={template4ColumnStyles.fieldsContainer}>\n {fields.map(([key, value]) => (\n <View key={key} style={template4ColumnStyles.fieldColumn}>\n <Text style={template4ColumnStyles.fieldLabel}>\n {formatFieldName(key)}:\n </Text>\n <Text style={template4ColumnStyles.fieldValue}>\n {String(value)}\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\nconst Template4: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName = 'BANG TEXTILES & CLOTHING PVT. LTD.',\n}) => {\n return (\n <>\n {products.map((product, index) => {\n // Template4 shows ALL fields (not just dynamic ones)\n // Extract all fields except images\n const allFields = Object.entries(product).filter(\n ([key, value]) =>\n // Only exclude image fields\n !['Image', 'image', 'ImageUrl', 'imageUrl', 'img', 'photo', 'picture'].includes(key) &&\n // Exclude empty values\n value !== undefined &&\n value !== null &&\n value !== '',\n ) as [string, string | number][];\n\n const fields = extractProductFields(product);\n\n return (\n <View key={index} style={styles.page}>\n {/* Header with brand logo */}\n <View style={styles.header}>\n <Text style={styles.companyName}>{companyName || ''}</Text>\n {companyLogo && <Image style={styles.brandLogo} src={companyLogo} />}\n </View>\n\n {/* Product section */}\n <View style={styles.productContainer}>\n {/* Product Image - always render, using fallback if needed */}\n <Image style={styles.productImage} src={fields.imageUrl} />\n\n {/* Details box - only render if there are fields to show */}\n {allFields.length > 0 && (\n <View style={styles.detailsBox}>\n {renderFieldsInColumns(allFields)}\n </View>\n )}\n </View>\n\n {/* Page break after each product */}\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template4;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n position: 'relative',\n backgroundColor: '#FFFFFF',\n flexDirection: 'column',\n },\n header: {\n height: 80,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 30,\n paddingTop: 20,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n marginBottom: 10,\n },\n logo: {\n height: 50,\n marginRight: 20,\n objectFit: 'contain',\n },\n companyName: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333333',\n letterSpacing: 1,\n },\n contentContainer: {\n flex: 1,\n flexDirection: 'row',\n paddingHorizontal: 30,\n paddingBottom: 30,\n gap: 20,\n },\n imageSection: {\n flex: 2,\n flexDirection: 'row',\n gap: 15,\n },\n imageWrapper: {\n flex: 1,\n height: '100%',\n backgroundColor: '#F9F9F9',\n borderRadius: 4,\n overflow: 'hidden',\n },\n productImage: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n detailsSection: {\n flex: 1,\n backgroundColor: '#F5F5F5',\n padding: 20,\n borderRadius: 8,\n justifyContent: 'center',\n },\n productTitle: {\n fontSize: 18,\n fontWeight: 'bold',\n color: '#222222',\n marginBottom: 15,\n borderBottomWidth: 2,\n borderBottomColor: '#333333',\n paddingBottom: 5,\n },\n dynamicFieldsContainer: {\n gap: 8,\n },\n detailRow: {\n flexDirection: 'row',\n marginBottom: 6,\n borderBottomWidth: 1,\n borderBottomColor: '#E0E0E0',\n paddingBottom: 4,\n },\n detailLabel: {\n fontSize: 10,\n fontWeight: 'bold',\n color: '#555555',\n width: '40%',\n },\n detailValue: {\n fontSize: 10,\n color: '#333333',\n flex: 1,\n flexWrap: 'wrap',\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template5: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image if 2nd not present\n\n return (\n <View key={index} style={styles.page}>\n {/* Header Section */}\n <View style={styles.header}>\n {companyLogo && (\n <Image style={styles.logo} src={companyLogo} />\n )}\n <Text style={styles.companyName}>{companyName}</Text>\n </View>\n\n {/* Main Content Area */}\n <View style={styles.contentContainer}>\n {/* Dual Images Section */}\n <View style={styles.imageSection}>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={imageUrl} />\n </View>\n <View style={styles.imageWrapper}>\n <Image style={styles.productImage} src={secondImage} />\n </View>\n </View>\n\n {/* Product Details Side Panel */}\n <View style={styles.detailsSection}>\n {title && <Text style={styles.productTitle}>{title}</Text>}\n \n <View style={styles.dynamicFieldsContainer}>\n {renderDynamicFields(dynamicFields, {\n row: styles.detailRow,\n label: styles.detailLabel,\n value: styles.detailValue,\n })}\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template5;\n","import { Image, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport type { ProductData, TemplateProps } from '../types';\nimport { formatFieldName } from '../utils/fieldHelpers';\nimport { extractProductFields, renderDynamicFields } from '../utils/templateHelpers';\n\nconst styles = StyleSheet.create({\n page: {\n width: '100%',\n height: '100%',\n flexDirection: 'row',\n backgroundColor: '#FFFFFF',\n },\n leftColumn: {\n width: '50%',\n height: '100%',\n position: 'relative',\n borderRightWidth: 1,\n borderRightColor: '#E0E0E0',\n },\n rightColumn: {\n width: '50%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n },\n imageFull: {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n rightImageContainer: {\n flex: 1,\n width: '100%',\n position: 'relative',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n rightImage: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n specsOverlay: {\n position: 'absolute',\n bottom: 40, // Lifted slightly from absolute bottom\n right: 0,\n backgroundColor: '#FFFFFF',\n padding: 15,\n width: '65%', // Takes up a good chunk of the corner\n borderTopLeftRadius: 4,\n borderBottomLeftRadius: 4,\n shadowColor: '#000',\n shadowOpacity: 0.2,\n shadowRadius: 3,\n borderWidth: 1,\n borderColor: '#EEEEEE',\n },\n specsHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n paddingBottom: 5,\n },\n miniLogo: {\n width: 20,\n height: 20,\n objectFit: 'contain',\n marginRight: 8,\n },\n designNumber: {\n fontSize: 12,\n fontWeight: 'bold',\n color: '#000',\n },\n footer: {\n height: 100,\n backgroundColor: '#1A1A1A',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingHorizontal: 30,\n width: '100%',\n },\n footerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n footerLogo: {\n width: 40,\n height: 40,\n objectFit: 'contain',\n marginRight: 15,\n backgroundColor: '#FFF', // White background for logo visibility\n padding: 2,\n borderRadius: 2,\n },\n footerText: {\n color: '#FFFFFF',\n fontSize: 14,\n fontWeight: 'bold',\n letterSpacing: 1,\n textTransform: 'uppercase',\n },\n // Custom styles for dynamic fields in the overlay\n fieldRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n fieldLabel: {\n fontSize: 9,\n fontWeight: 'bold',\n color: '#333',\n width: '40%',\n },\n fieldValue: {\n fontSize: 9,\n color: '#555',\n flex: 1,\n },\n});\n\n/**\n * Get secondary image URL from product\n */\nfunction getImage2Url(product: ProductData): string | null {\n const image2Fields = ['image2', 'imageurl2', 'img2', 'photo2', 'picture2'];\n \n for (const field of image2Fields) {\n const value = product[field];\n if (value && typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n \n return null;\n}\n\nconst Template6: React.FC<TemplateProps> = ({\n products,\n companyLogo,\n companyName,\n}) => {\n return (\n <>\n {products.map((product, index) => {\n const { imageUrl, title, dynamicFields } = extractProductFields(product);\n \n // Handle secondary image logic\n const image2Url = getImage2Url(product);\n const secondImage = image2Url || imageUrl; // Fallback to primary image\n\n return (\n <View key={index} style={styles.page}>\n {/* Left Column: Fabric/Detail Image + Specs Overlay */}\n <View style={styles.leftColumn}>\n <Image style={styles.imageFull} src={imageUrl} />\n \n {/* Specifications Overlay */}\n <View style={styles.specsOverlay}>\n <View style={styles.specsHeader}>\n {companyLogo && <Image style={styles.miniLogo} src={companyLogo} />}\n <Text style={styles.designNumber}>\n {title || 'Specifications'}\n </Text>\n </View>\n \n {renderDynamicFields(dynamicFields, {\n row: styles.fieldRow,\n label: styles.fieldLabel,\n value: styles.fieldValue,\n })}\n </View>\n </View>\n\n {/* Right Column: Shirt/Usage Image + Footer */}\n <View style={styles.rightColumn}>\n <View style={styles.rightImageContainer}>\n <Image style={styles.rightImage} src={secondImage} />\n </View>\n \n {/* Footer */}\n <View style={styles.footer}>\n <View style={styles.footerContent}>\n {companyLogo && <Image style={styles.footerLogo} src={companyLogo} />}\n <Text style={styles.footerText}>{companyName}</Text>\n </View>\n </View>\n </View>\n <View break></View>\n </View>\n );\n })}\n </>\n );\n};\n\nexport default Template6;\n","import { Document, Font, Image, Page, pdf, StyleSheet, Text, View } from '@react-pdf/renderer';\nimport React from 'react';\nimport PoweredByTeziApp from './components/PoweredByTeziApp';\nimport { Template1, Template2, Template3, Template4, Template5, Template6 } from './templates';\nimport type { CatalogConfig } from './types';\n\n// Create styles\nconst styles = StyleSheet.create({\n page: {\n flexDirection: 'column',\n backgroundColor: '#FFFFFF',\n },\n header: {\n height: '100vh',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n alignContent: 'center',\n padding: 10,\n marginBottom: 5,\n },\n logoSection: {\n width: '80%',\n },\n storeNameSection: {},\n logo: {\n marginRight: 10,\n objectFit: 'contain',\n },\n storeName: {\n fontSize: 35,\n flexGrow: 1,\n transform: 'rotate(-90deg)',\n },\n});\n\n// Register emoji support\nFont.registerEmojiSource({\n format: 'png',\n url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n});\n\n/**\n * Normalize image source for react-pdf Image component\n * Handles URLs, data URIs, and plain base64 strings\n * @param imageSource Image source string (URL, data URI, or base64)\n * @returns Normalized image source string\n */\nfunction normalizeImageSource(imageSource: string): string {\n // If already a data URI, return as-is\n if (imageSource.startsWith('data:')) {\n return imageSource;\n }\n\n // If it's a URL, return as-is\n if (imageSource.startsWith('http://') || imageSource.startsWith('https://')) {\n return imageSource;\n }\n\n // Otherwise, assume it's a base64 string and convert to data URI\n // Try to detect image type from common base64 patterns\n let mimeType = 'image/png'; // default\n\n // Check for common base64 image signatures\n // PNG: starts with iVBORw0KGgo\n // JPEG: starts with /9j/4AAQ\n // GIF: starts with R0lGODlh\n // WebP: starts with UklGR\n const base64Start = imageSource.substring(0, 20).toLowerCase();\n if (base64Start.includes('ivborw0kggo') || imageSource.startsWith('iVBORw0KGgo')) {\n mimeType = 'image/png';\n } else if (base64Start.includes('/9j/4aaq') || imageSource.startsWith('/9j/4AAQ')) {\n mimeType = 'image/jpeg';\n } else if (base64Start.includes('r0lgodlh') || imageSource.startsWith('R0lGODlh')) {\n mimeType = 'image/gif';\n } else if (base64Start.includes('uklgr') || imageSource.startsWith('UklGR')) {\n mimeType = 'image/webp';\n }\n\n return `data:${mimeType};base64,${imageSource}`;\n}\n\n/**\n * Generate product catalog PDF\n * @param config Configuration with products, company info, and template choice\n * @returns Promise<Uint8Array> PDF as Uint8Array (works in both Node.js and browser)\n */\nexport async function generateProductCatalog(config: CatalogConfig): Promise<Uint8Array> {\n const { products, companyLogo, companyName, template = 'template1' } = config;\n\n // Select template component\n let TemplateComponent;\n switch (template) {\n case 'template1':\n TemplateComponent = Template1;\n break;\n case 'template2':\n TemplateComponent = Template2;\n break;\n case 'template3':\n TemplateComponent = Template3;\n break;\n case 'template4':\n TemplateComponent = Template4;\n break;\n case 'template5':\n TemplateComponent = Template5;\n break;\n case 'template6':\n TemplateComponent = Template6;\n break;\n default:\n TemplateComponent = Template1;\n }\n\n // Template4 handles its own page layout with headers on each page\n if (template === 'template4') {\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <Template4\n products={products as any}\n companyLogo={companyLogo}\n companyName={companyName}\n />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Template5 & Template6 require landscape orientation and handle their own layout\n if (template === 'template5' || template === 'template6') {\n const Template = template === 'template5' ? Template5 : Template6;\n const doc = (\n <Document>\n <Page size=\"A4\" orientation=\"landscape\" style={styles.page}>\n <Template\n products={products as any}\n companyLogo={companyLogo}\n companyName={companyName}\n />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n // Create PDF document for other templates\n const doc = (\n <Document>\n <Page size=\"A4\" style={styles.page}>\n <View style={styles.header}>\n {companyLogo && (\n <View style={styles.logoSection}>\n <Image style={styles.logo} src={companyLogo} />\n </View>\n )}\n <View style={styles.storeNameSection}>\n <Text style={styles.storeName}>{companyName}</Text>\n </View>\n </View>\n <TemplateComponent products={products as any} />\n {/* <PoweredByTeziApp /> */}\n </Page>\n </Document>\n );\n\n // Generate PDF and return as Uint8Array\n const blob = await pdf(doc).toBlob();\n const arrayBuffer = await blob.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n}\n","import * as XLSX from 'xlsx';\nimport type { ProductData } from './types';\n\n/**\n * Parse Excel file buffer to product data\n * @param buffer - Excel file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.xlsx');\n * const products = parseExcelFile(buffer);\n *\n * @example\n * // Browser/React\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseExcelFile(arrayBuffer);\n */\nexport function parseExcelFile(buffer: Buffer): ProductData[];\nexport function parseExcelFile(buffer: ArrayBuffer): ProductData[];\nexport function parseExcelFile(buffer: Uint8Array): ProductData[];\nexport function parseExcelFile(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n const workbook = XLSX.read(buffer, {\n type: buffer instanceof Buffer ? 'buffer' : 'array',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV string to product data\n */\nexport function parseCSVFile(csvString: string): ProductData[] {\n const workbook = XLSX.read(csvString, {\n type: 'string',\n cellDates: true,\n });\n\n const sheetName = workbook.SheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const data = XLSX.utils.sheet_to_json(worksheet) as ProductData[];\n\n return data;\n}\n\n/**\n * Parse CSV buffer to product data\n * @param buffer - CSV file as Buffer (Node.js), ArrayBuffer, or Uint8Array (browser)\n * @returns Array of parsed product data\n * @example\n * // Node.js\n * import fs from 'fs';\n * const buffer = fs.readFileSync('products.csv');\n * const products = parseCSVBuffer(buffer);\n *\n * @example\n * // Browser\n * const file = event.target.files[0];\n * const arrayBuffer = await file.arrayBuffer();\n * const products = parseCSVBuffer(arrayBuffer);\n */\nexport function parseCSVBuffer(buffer: Buffer): ProductData[];\nexport function parseCSVBuffer(buffer: ArrayBuffer): ProductData[];\nexport function parseCSVBuffer(buffer: Uint8Array): ProductData[];\nexport function parseCSVBuffer(buffer: Buffer | ArrayBuffer | Uint8Array): ProductData[] {\n let csvString: string;\n\n if (buffer instanceof Buffer) {\n csvString = buffer.toString('utf-8');\n } else if (buffer instanceof ArrayBuffer) {\n csvString = new TextDecoder('utf-8').decode(buffer);\n } else {\n // Uint8Array\n csvString = new TextDecoder('utf-8').decode(buffer);\n }\n\n return parseCSVFile(csvString);\n}\n\n/**\n * Parse and validate product data from JSON\n * Note: No fields are mandatory. Data is passed through as-is.\n */\nexport function parseJSON(data: any[]): ProductData[] {\n if (!Array.isArray(data)) {\n throw new Error('JSON data must be an array of products');\n }\n\n return data as ProductData[];\n}\n"]}
|