embroidery-qc-image 1.0.20 → 1.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"EmbroideryQCImage.d.ts","sourceRoot":"","sources":["../../src/components/EmbroideryQCImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAY,MAAM,UAAU,CAAC;AAChF,OAAO,yBAAyB,CAAC;AAyJjC,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoWD,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAqHvD,CAAC;AAy3BF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,kBAAkB,EAC1B,UAAS,8BAAmC,KAC3C,OAAO,CAAC,IAAI,GAAG,IAAI,CAuBrB,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,kBAAkB,EAC1B,UAAS,8BAAmC,KAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAuBvB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"EmbroideryQCImage.d.ts","sourceRoot":"","sources":["../../src/components/EmbroideryQCImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAY,MAAM,UAAU,CAAC;AAChF,OAAO,yBAAyB,CAAC;AAyJjC,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoWD,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAqHvD,CAAC;AAi6BF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,kBAAkB,EAC1B,UAAS,8BAAmC,KAC3C,OAAO,CAAC,IAAI,GAAG,IAAI,CAuBrB,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,kBAAkB,EAC1B,UAAS,8BAAmC,KAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAuBvB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
package/dist/index.esm.js CHANGED
@@ -728,9 +728,20 @@ const renderSide = (ctx, side, startY, width, scaleFactor, imageRefs) => {
728
728
  ctx.restore();
729
729
  // Compute uniform properties
730
730
  const textPositions = side.positions.filter((p) => p.type === "TEXT");
731
- const uniformProps = computeUniformProperties(textPositions);
731
+ const iconColorPositions = side.positions.filter((p) => p.type === "ICON" && (!p.layer_colors?.length || p.layer_colors.length === 1));
732
+ const iconColorValues = iconColorPositions
733
+ .map((p) => {
734
+ if (p.layer_colors?.length === 1)
735
+ return p.layer_colors[0];
736
+ return p.color ?? null;
737
+ })
738
+ .filter((color) => Boolean(color));
739
+ const uniformProps = computeUniformProperties(textPositions, {
740
+ additionalColorValues: iconColorValues,
741
+ });
742
+ const shouldShowUniformLabels = textPositions.length > 1;
732
743
  // Render uniform labels (only if more than 1 TEXT position)
733
- if (textPositions.length > 1) {
744
+ if (shouldShowUniformLabels) {
734
745
  currentY += renderUniformLabels(ctx, uniformProps, padding, currentY, sideWidth, scaleFactor, imageRefs, textPositions);
735
746
  }
736
747
  // Group text positions by common properties
@@ -763,7 +774,17 @@ const renderSide = (ctx, side, startY, width, scaleFactor, imageRefs) => {
763
774
  currentY += LAYOUT.LINE_GAP * scaleFactor;
764
775
  side.positions.forEach((position) => {
765
776
  if (position.type === "ICON") {
766
- currentY += renderIconPosition(ctx, position, padding, currentY, sideWidth, scaleFactor, imageRefs);
777
+ const layerCount = position.layer_colors?.length ?? 0;
778
+ const iconUsesSingleColor = layerCount === 0 || layerCount === 1;
779
+ const iconColorValue = layerCount === 1
780
+ ? position.layer_colors?.[0] ?? null
781
+ : position.color ?? null;
782
+ const hideColor = shouldShowUniformLabels &&
783
+ uniformProps.isUniform.color &&
784
+ iconColorValue !== null &&
785
+ uniformProps.values.color === iconColorValue &&
786
+ iconUsesSingleColor;
787
+ currentY += renderIconPosition(ctx, position, padding, currentY, sideWidth, scaleFactor, imageRefs, { hideColor });
767
788
  currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;
768
789
  }
769
790
  });
@@ -800,31 +821,37 @@ const groupTextPositions = (textPositions) => {
800
821
  }
801
822
  return groups;
802
823
  };
803
- const computeUniformProperties = (textPositions) => {
804
- if (textPositions.length === 0) {
805
- return {
806
- values: { font: null, shape: null, floral: null, color: null },
807
- isUniform: { font: false, shape: false, floral: false, color: false },
808
- };
809
- }
824
+ const computeUniformProperties = (textPositions, options) => {
825
+ const defaults = {
826
+ values: { font: null, shape: null, floral: null, color: null },
827
+ isUniform: { font: false, shape: false, floral: false, color: false },
828
+ };
810
829
  const fonts = new Set(textPositions.map((p) => p.font));
811
830
  const shapes = new Set(textPositions.map((p) => p.text_shape));
812
831
  const florals = new Set(textPositions.map((p) => p.floral_pattern ?? "None"));
813
- const colors = new Set(textPositions.map((p) => p.character_colors?.length
814
- ? p.character_colors.join(",")
815
- : p.color ?? "None"));
832
+ const colorSources = [
833
+ ...textPositions.map((p) => p.character_colors?.length
834
+ ? p.character_colors.join(",")
835
+ : p.color ?? "None"),
836
+ ...(options?.additionalColorValues?.map((color) => color ?? "None") ?? []),
837
+ ];
838
+ if (textPositions.length === 0 &&
839
+ (!options?.additionalColorValues || options.additionalColorValues.length === 0)) {
840
+ return defaults;
841
+ }
842
+ const colors = new Set(colorSources);
816
843
  return {
817
844
  values: {
818
845
  font: fonts.size === 1 ? [...fonts][0] : null,
819
846
  shape: shapes.size === 1 ? [...shapes][0] : null,
820
847
  floral: florals.size === 1 ? [...florals][0] : null,
821
- color: colors.size === 1 ? [...colors][0] : null,
848
+ color: colorSources.length > 0 && colors.size === 1 ? [...colors][0] : null,
822
849
  },
823
850
  isUniform: {
824
851
  font: fonts.size === 1,
825
852
  shape: shapes.size === 1,
826
853
  floral: florals.size === 1,
827
- color: colors.size === 1,
854
+ color: colorSources.length > 0 && colors.size === 1,
828
855
  },
829
856
  };
830
857
  };
@@ -839,7 +866,7 @@ const renderUniformLabels = (ctx, uniformProps, x, y, maxWidth, scaleFactor, ima
839
866
  let rendered = 0;
840
867
  if (values.font) {
841
868
  const allDefault = textPositions.every((p) => p.is_font_default === true);
842
- const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font}`;
869
+ const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font} (Custom)`;
843
870
  const result = wrapText(ctx, fontLabel, x, cursorY, maxWidth, fontSize + lineGap);
844
871
  cursorY += result.height;
845
872
  rendered++;
@@ -932,7 +959,7 @@ const renderTextPosition = (ctx, position, x, y, maxWidth, displayIndex, showLab
932
959
  if (showLabels.font && position.font) {
933
960
  const fontLabel = position.is_font_default === true
934
961
  ? `Font: ${position.font} (Mặc định)`
935
- : `Font: ${position.font}`;
962
+ : `Font: ${position.font} (Custom)`;
936
963
  const result = wrapText(ctx, fontLabel, x, currentY, maxWidth, otherFontSize + lineGap);
937
964
  currentY += result.height;
938
965
  drawnHeight += result.height;
@@ -962,7 +989,7 @@ const renderTextPosition = (ctx, position, x, y, maxWidth, displayIndex, showLab
962
989
  ctx.restore();
963
990
  return drawnHeight;
964
991
  };
965
- const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRefs) => {
992
+ const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRefs, options) => {
966
993
  const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;
967
994
  const lineGap = LAYOUT.LINE_GAP * scaleFactor;
968
995
  ctx.save();
@@ -995,7 +1022,10 @@ const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRef
995
1022
  : position.color
996
1023
  ? [position.color]
997
1024
  : null;
998
- if (iconColors?.length) {
1025
+ const layerCount = position.layer_colors?.length ?? 0;
1026
+ const hasMultiLayerColors = layerCount > 1;
1027
+ const shouldSkipColorSection = options?.hideColor && !hasMultiLayerColors;
1028
+ if (iconColors?.length && !shouldSkipColorSection) {
999
1029
  const textMaxWidth = Math.max(LAYOUT.MIN_TEXT_WIDTH * scaleFactor, maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor);
1000
1030
  const colorResult = wrapText(ctx, `Màu chỉ: ${iconColors.join(", ")}`, x, cursorY, textMaxWidth, iconFontSize + lineGap);
1001
1031
  const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/EmbroideryQCImage.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { EmbroideryQCConfig, EmbroideryQCImageProps, Position } from \"../types\";\nimport \"./EmbroideryQCImage.css\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst COLOR_MAP: Record<string, string> = {\n \"Army (1394)\": \"#545541\",\n Army: \"#545541\",\n \"Black (8)\": \"#060608\",\n Black: \"#060608\",\n \"Bubblegum (1309)\": \"#E77B9F\",\n Bubblegum: \"#E77B9F\",\n \"Carolina Blue (1274)\": \"#608CC9\",\n \"Carolina Blue\": \"#608CC9\",\n \"Celadon (1098)\": \"#8EAD8D\",\n Celadon: \"#8EAD8D\",\n \"Coffee Bean (1145)\": \"#502B23\",\n \"Coffee Bean\": \"#502B23\",\n \"Daffodil (1180)\": \"#FBE30D\",\n Daffodil: \"#FBE30D\",\n \"Dark Gray (1131)\": \"#2E272E\",\n \"Dark Gray\": \"#2E272E\",\n \"Doe Skin Beige (1344)\": \"#AE9B8B\",\n \"Doe Skin Beige\": \"#AE9B8B\",\n \"Dusty Blue (1373)\": \"#7B90A9\",\n \"Dusty Blue\": \"#7B90A9\",\n \"Forest Green (1397)\": \"#073020\",\n \"Forest Green\": \"#073020\",\n \"Gold (1425)\": \"#D2920A\",\n Gold: \"#D2920A\",\n \"Gray (1118)\": \"#9999A3\",\n Gray: \"#9999A3\",\n \"Ivory (1072)\": \"#E3DAC9\",\n Ivory: \"#E3DAC9\",\n \"Lavender (1032)\": \"#9274B6\",\n Lavender: \"#9274B6\",\n \"Light Denim (1133)\": \"#366696\",\n \"Light Denim\": \"#366696\",\n \"Light Salmon (1018)\": \"#E0A793\",\n \"Light Salmon\": \"#E0A793\",\n \"Maroon (1374)\": \"#480C1C\",\n Maroon: \"#480C1C\",\n \"Navy Blue (1044)\": \"#04072A\",\n \"Navy Blue\": \"#04072A\",\n \"Olive Green (1157)\": \"#625E1F\",\n \"Olive Green\": \"#625E1F\",\n \"Orange (1278)\": \"#D45D03\",\n Orange: \"#D45D03\",\n \"Peach Blush (1053)\": \"#E2C0B6\",\n \"Peach Blush\": \"#E2C0B6\",\n \"Pink (1148)\": \"#EFAFBF\",\n Pink: \"#EFAFBF\",\n \"Purple (1412)\": \"#37196F\",\n Purple: \"#37196F\",\n \"Red (1037)\": \"#9D000B\",\n Red: \"#9D000B\",\n \"Silver Sage (1396)\": \"#424F45\",\n \"Silver Sage\": \"#424F45\",\n \"Summer Sky (1432)\": \"#65A8D2\",\n \"Summer Sky\": \"#65A8D2\",\n \"Terra Cotta (1477)\": \"#AE3111\",\n \"Terra Cotta\": \"#AE3111\",\n \"Sand (1055)\": \"#D2C2AB\",\n Sand: \"#D2C2AB\",\n \"White (9)\": \"#D8D7DC\",\n White: \"#D8D7DC\",\n};\n\nconst DEFAULT_ERROR_COLOR = \"#CC1F1A\";\nconst DEFAULT_WARNING_COLOR = \"#FF8C00\";\n\nconst BASE_URLS = {\n FONT: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\",\n ICON: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\",\n FLORAL:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\",\n THREAD_COLOR:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\",\n};\n\nconst LAYOUT = {\n // Font families\n HEADER_FONT_FAMILY: \"Times New Roman\",\n FONT_FAMILY: \"Arial\",\n\n // Font sizes (base values, will be multiplied by scaleFactor)\n HEADER_FONT_SIZE: 220,\n TEXT_FONT_SIZE: 200,\n OTHER_FONT_SIZE: 160,\n\n // Colors\n HEADER_COLOR: \"#000000\",\n LABEL_COLOR: \"#444444\",\n BACKGROUND_COLOR: \"#FFFFFF\",\n\n // Text alignment\n TEXT_ALIGN: \"left\" as CanvasTextAlign,\n TEXT_BASELINE: \"top\" as CanvasTextBaseline,\n\n // Spacing\n LINE_GAP: 40,\n PADDING: 40,\n SECTION_SPACING: 60,\n ELEMENT_SPACING: 100,\n SWATCH_SPACING: 25,\n FLORAL_SPACING: 300,\n\n // Visual styling\n SWATCH_HEIGHT_RATIO: 2.025,\n UNDERLINE_POSITION: 0.9,\n UNDERLINE_WIDTH: 10,\n\n // Swatch reserved space\n SWATCH_RESERVED_SPACE: 1000,\n MIN_TEXT_WIDTH: 400,\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nconst loadFont = (fontName: string): Promise<void> => {\n return new Promise((resolve) => {\n const fontUrl = `${BASE_URLS.FONT}/${encodeURIComponent(fontName)}.woff2`;\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\n\n fontFace\n .load()\n .then((loadedFont) => {\n document.fonts.add(loadedFont);\n resolve();\n })\n .catch(() => {\n console.warn(`Could not load font ${fontName} from CDN`);\n resolve();\n });\n });\n};\n\nconst getImageUrl = (\n type: \"icon\" | \"floral\" | \"threadColor\",\n value: string | number\n): string => {\n if (type === \"icon\") return `${BASE_URLS.ICON}/Icon ${value}.png`;\n if (type === \"floral\") return `${BASE_URLS.FLORAL}/${value}.png`;\n return `${BASE_URLS.THREAD_COLOR}/${value}.png`;\n};\n\ntype ImageMapRef = {\n current: Map<string, HTMLImageElement>;\n};\n\nexport interface EmbroideryQCImageRenderOptions {\n width?: number;\n height?: number;\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n}\n\nconst getProxyUrl = (url: string): string =>\n `https://proxy-img.c8p.workers.dev?url=${encodeURIComponent(url)}`;\n\nconst ensureImage = (existing?: HTMLImageElement | null): HTMLImageElement => {\n if (existing && existing.crossOrigin === \"anonymous\") {\n return existing;\n }\n\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.decoding = \"async\";\n return img;\n};\n\nconst loadImage = (url: string, imageRefs: ImageMapRef, onLoad: () => void) => {\n const existing = imageRefs.current.get(url);\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\"\n ) {\n return;\n }\n\n const img = ensureImage(existing);\n imageRefs.current.set(url, img);\n\n let attemptedProxy = existing?.dataset?.proxyUsed === \"true\";\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n };\n\n img.onload = () => {\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n img.src = getProxyUrl(url);\n return;\n }\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.src = attemptedProxy ? getProxyUrl(url) : url;\n};\n\nconst loadImageAsync = (\n url: string,\n imageRefs: ImageMapRef,\n cacheKey?: string\n): Promise<HTMLImageElement> => {\n const key = cacheKey ?? url;\n const existing = imageRefs.current.get(key) ?? imageRefs.current.get(url);\n\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\" &&\n existing.dataset?.proxyUsed !== undefined\n ) {\n if (existing !== imageRefs.current.get(key)) {\n imageRefs.current.set(key, existing);\n }\n if (existing !== imageRefs.current.get(url)) {\n imageRefs.current.set(url, existing);\n }\n return Promise.resolve(existing);\n }\n\n return new Promise((resolve) => {\n const target = ensureImage(existing);\n if (target !== existing) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n let attemptedProxy = target.dataset.proxyUsed === \"true\";\n\n const finalize = () => {\n target.onload = null;\n target.onerror = null;\n if (target.complete && target.naturalWidth > 0) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n resolve(target);\n };\n\n target.onload = finalize;\n target.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n target.src = getProxyUrl(url);\n return;\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n finalize();\n };\n\n const desiredSrc = attemptedProxy ? getProxyUrl(url) : url;\n\n if (target.src !== desiredSrc) {\n target.src = desiredSrc;\n } else if (target.complete && target.naturalWidth > 0) {\n finalize();\n }\n });\n};\n\nconst preloadFonts = async (config: EmbroideryQCConfig) => {\n if (config.error_message || !config.sides?.length) return;\n\n const fonts = new Set<string>();\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fonts.add(position.font);\n }\n });\n });\n\n if (fonts.size === 0) return;\n\n await Promise.all([...fonts].map((font) => loadFont(font)));\n};\n\nconst preloadImages = async (\n config: EmbroideryQCConfig,\n imageRefs: ImageMapRef\n) => {\n const entries: Array<{ url: string; cacheKey?: string }> = [];\n const seen = new Set<string>();\n\n if (config.image_url) {\n entries.push({ url: config.image_url, cacheKey: \"mockup\" });\n seen.add(config.image_url);\n }\n\n if (!config.sides?.length) {\n await Promise.all(\n entries.map(({ url, cacheKey }) =>\n loadImageAsync(url, imageRefs, cacheKey)\n )\n );\n return;\n }\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n const iconUrl = getImageUrl(\"icon\", position.icon);\n if (!seen.has(iconUrl)) {\n entries.push({ url: iconUrl });\n seen.add(iconUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.layer_colors?.forEach((color) => {\n const colorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(colorUrl)) {\n entries.push({ url: colorUrl });\n seen.add(colorUrl);\n }\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n const floralUrl = getImageUrl(\"floral\", position.floral_pattern);\n if (!seen.has(floralUrl)) {\n entries.push({ url: floralUrl });\n seen.add(floralUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.character_colors?.forEach((color) => {\n const characterColorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(characterColorUrl)) {\n entries.push({ url: characterColorUrl });\n seen.add(characterColorUrl);\n }\n });\n }\n });\n });\n\n if (entries.length === 0) return;\n\n await Promise.all(\n entries.map(({ url, cacheKey }) => loadImageAsync(url, imageRefs, cacheKey))\n );\n};\n\nconst wrapText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): { height: number; lastLineWidth: number; lastLineY: number } => {\n const words = text.split(\" \");\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line) => {\n ctx.fillText(line, x, currentY);\n currentY += lineHeight;\n });\n\n return {\n height: lines.length * lineHeight,\n lastLineWidth: ctx.measureText(lines[lines.length - 1]).width,\n lastLineY: y + (lines.length - 1) * lineHeight,\n };\n};\n\nconst buildWrappedLines = (\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] => {\n const words = text.split(\" \").filter((word) => word.length > 0);\n if (words.length === 0) return [\"\"];\n\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = `${currentLine} ${words[i]}`;\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n\n lines.push(currentLine);\n return lines;\n};\n\nconst wrapTextMultiColor = (\n ctx: CanvasRenderingContext2D,\n text: string,\n colors: string[],\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): number => {\n const words = text.split(\" \");\n const lines: string[] = [];\n const lineStartIndices: number[] = [0];\n let currentLine = words[0];\n let currentCharIndex = words[0].length;\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n lineStartIndices.push(currentCharIndex + 1);\n currentLine = words[i];\n currentCharIndex += words[i].length + 1;\n } else {\n currentLine = testLine;\n currentCharIndex += words[i].length + 1;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line, lineIdx) => {\n let currentX = x;\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const globalCharIdx = startCharIdx + i;\n const colorIndex = globalCharIdx % colors.length;\n const color = colors[colorIndex];\n ctx.fillStyle = COLOR_MAP[color] || LAYOUT.LABEL_COLOR;\n ctx.fillText(char, currentX, currentY);\n currentX += ctx.measureText(char).width;\n }\n currentY += lineHeight;\n });\n\n return lines.length * lineHeight;\n};\n\nconst drawSwatches = (\n ctx: CanvasRenderingContext2D,\n colors: string[],\n startX: number,\n startY: number,\n swatchHeight: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n) => {\n let swatchX = startX;\n colors.forEach((color) => {\n const url = getImageUrl(\"threadColor\", color);\n const img = imageRefs.current.get(url);\n if (img && img.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(swatchHeight * ratio));\n ctx.drawImage(img, swatchX, startY, swatchW, swatchHeight);\n swatchX += swatchW + LAYOUT.SWATCH_SPACING * scaleFactor;\n }\n });\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\n config,\n className = \"\",\n style = {},\n}) => {\n const [canvasSize] = useState({ width: 4200, height: 4800 });\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\n const [imagesLoaded, setImagesLoaded] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\n\n // Load fonts\n useEffect(() => {\n const loadFonts = async () => {\n if (config.error_message || !config.sides?.length) return;\n\n const fontsToLoad = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fontsToLoad.add(position.font);\n }\n });\n });\n\n for (const fontName of fontsToLoad) {\n if (!loadedFonts.has(fontName)) {\n try {\n await loadFont(fontName);\n setLoadedFonts((prev) => new Set(prev).add(fontName));\n } catch (error) {\n console.warn(`Could not load font ${fontName}:`, error);\n }\n }\n }\n };\n\n loadFonts();\n }, [config.sides, loadedFonts]);\n\n // Load images\n useEffect(() => {\n if (config.error_message || !config.sides?.length) return;\n\n const incrementCounter = () => setImagesLoaded((prev) => prev + 1);\n\n // Load mockup\n if (config.image_url) {\n loadImage(config.image_url, imageRefs, incrementCounter);\n }\n\n // Load all other images\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n loadImage(\n getImageUrl(\"icon\", position.icon),\n imageRefs,\n incrementCounter\n );\n }\n position.layer_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n loadImage(\n getImageUrl(\"floral\", position.floral_pattern),\n imageRefs,\n incrementCounter\n );\n }\n if (position.color) {\n loadImage(\n getImageUrl(\"threadColor\", position.color),\n imageRefs,\n incrementCounter\n );\n }\n position.character_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n });\n });\n }, [config]);\n\n // Render canvas\n useEffect(() => {\n const renderCanvas = () => {\n if (!canvasRef.current) return;\n renderEmbroideryCanvas(canvasRef.current, config, canvasSize, imageRefs);\n };\n\n const timer = setTimeout(renderCanvas, 100);\n return () => clearTimeout(timer);\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\n\n return (\n <div\n className={`render-embroidery${className ? ` ${className}` : \"\"}`}\n style={style}\n >\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\n </div>\n );\n};\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\nconst renderEmbroideryCanvas = (\n canvas: HTMLCanvasElement,\n config: EmbroideryQCConfig,\n canvasSize: { width: number; height: number },\n imageRefs: ImageMapRef\n) => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = canvasSize.width;\n canvas.height = canvasSize.height;\n\n ctx.fillStyle = LAYOUT.BACKGROUND_COLOR;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (config.error_message) {\n renderErrorState(ctx, canvas, config.error_message);\n return;\n }\n\n if (!config.sides?.length) return;\n\n ctx.textAlign = LAYOUT.TEXT_ALIGN;\n ctx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n // Calculate warning height (with scaleFactor = 1 for measurement)\n let warningHeight = 0;\n let warningLineHeight = 0;\n let warningLineCount = 0;\n if (config.warning_message) {\n const measureWarningCanvas = document.createElement(\"canvas\");\n measureWarningCanvas.width = canvas.width;\n measureWarningCanvas.height = canvas.height;\n const measureWarningCtx = measureWarningCanvas.getContext(\"2d\");\n if (measureWarningCtx) {\n measureWarningCtx.textAlign = \"left\";\n measureWarningCtx.textBaseline = \"top\";\n measureWarningCtx.font = `${LAYOUT.HEADER_FONT_SIZE * 0.7}px ${LAYOUT.FONT_FAMILY}`;\n const warningLines = buildWrappedLines(\n measureWarningCtx,\n `Note: ${config.warning_message.trim()}`,\n canvas.width - LAYOUT.PADDING * 4\n );\n warningLineCount = warningLines.length;\n warningLineHeight = LAYOUT.HEADER_FONT_SIZE * 0.7 + LAYOUT.LINE_GAP;\n warningHeight = warningLineCount * warningLineHeight + LAYOUT.PADDING;\n }\n }\n\n if (config.image_url) {\n const mockupImage = imageRefs.current.get(config.image_url);\n if (mockupImage) {\n imageRefs.current.set(\"mockup\", mockupImage);\n }\n }\n\n const floralAssets: HTMLImageElement[] = [];\n const seenFlorals = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.floral_pattern) {\n const url = getImageUrl(\"floral\", position.floral_pattern);\n if (!seenFlorals.has(url)) {\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalWidth > 0) {\n floralAssets.push(img);\n seenFlorals.add(url);\n }\n }\n }\n });\n });\n\n const measureCanvas = document.createElement(\"canvas\");\n measureCanvas.width = canvas.width;\n measureCanvas.height = canvas.height;\n const measureCtx = measureCanvas.getContext(\"2d\");\n if (!measureCtx) return;\n\n measureCtx.textAlign = LAYOUT.TEXT_ALIGN;\n measureCtx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n let measureY = LAYOUT.PADDING;\n const measureSpacing = LAYOUT.ELEMENT_SPACING;\n \n // Add warning text height (without bottom padding, no spacing)\n if (config.warning_message) {\n const warningTextHeight = warningHeight - LAYOUT.PADDING;\n measureY += warningTextHeight;\n }\n\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n measureCtx,\n side,\n measureY,\n canvas.width,\n 1,\n imageRefs\n );\n measureY += sideHeight + measureSpacing;\n });\n\n const scaleFactor = Math.max(\n 0.5,\n Math.min(1, (canvas.height - LAYOUT.PADDING - warningHeight) / measureY)\n );\n\n drawMockupAndFlorals(ctx, canvas, floralAssets, imageRefs);\n\n // Render warning with scaleFactor and get actual height\n let actualWarningHeight = 0;\n if (config.warning_message) {\n actualWarningHeight = renderWarning(ctx, canvas, config.warning_message, scaleFactor);\n }\n\n // Calculate currentY: padding top + actual warning height (no spacing)\n let currentY = LAYOUT.PADDING * scaleFactor;\n if (config.warning_message && actualWarningHeight > 0) {\n currentY += actualWarningHeight;\n }\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n ctx,\n side,\n currentY,\n canvas.width,\n scaleFactor,\n imageRefs\n );\n currentY += sideHeight + measureSpacing * scaleFactor;\n });\n};\n\nconst renderErrorState = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string\n) => {\n const sanitizedMessage = message.trim() || \"Đã xảy ra lỗi\";\n const horizontalPadding = LAYOUT.PADDING * 3;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE;\n const minFontSize = 60;\n const centerX = canvas.width / 2;\n\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_ERROR_COLOR;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `bold ${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const totalHeight = lines.length * lineHeight;\n const startY = Math.max(\n LAYOUT.PADDING * 2,\n canvas.height / 2 - totalHeight / 2\n );\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, centerX, y);\n });\n\n ctx.restore();\n};\n\nconst renderWarning = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string,\n scaleFactor: number = 1\n): number => {\n const sanitizedMessage = `Note: ${message.trim()}`;\n const horizontalPadding = LAYOUT.PADDING * 2 * scaleFactor;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE * 0.7 * scaleFactor;\n const minFontSize = 50 * scaleFactor;\n const leftX = LAYOUT.PADDING * scaleFactor;\n\n ctx.save();\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_WARNING_COLOR;\n ctx.font = `${baseFontSize}px ${LAYOUT.FONT_FAMILY}`;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP * scaleFactor;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * scaleFactor * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const startY = LAYOUT.PADDING * scaleFactor;\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, leftX, y);\n });\n\n ctx.restore();\n \n // Return the actual height of the warning (number of lines * lineHeight)\n return lines.length * lineHeight;\n};\n\nconst drawMockupAndFlorals = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n floralAssets: HTMLImageElement[],\n imageRefs: ImageMapRef\n) => {\n const mockupImg = imageRefs.current.get(\"mockup\");\n if (!mockupImg?.complete || !mockupImg.naturalWidth) return;\n\n const margin = LAYOUT.PADDING;\n const maxWidth = Math.min(1800, canvas.width * 0.375);\n const maxHeight = canvas.height * 0.375;\n const scale = Math.min(\n maxWidth / mockupImg.naturalWidth,\n maxHeight / mockupImg.naturalHeight\n );\n const width = Math.max(1, Math.floor(mockupImg.naturalWidth * scale));\n const height = Math.max(1, Math.floor(mockupImg.naturalHeight * scale));\n const x = canvas.width - margin - width;\n const y = canvas.height - margin - height;\n\n ctx.drawImage(mockupImg, x, y, width, height);\n\n // Draw florals\n if (floralAssets.length > 0) {\n const floralH = Math.min(900, height);\n let currentX = x - LAYOUT.FLORAL_SPACING;\n\n for (let i = floralAssets.length - 1; i >= 0; i--) {\n const img = floralAssets[i];\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\n const w = Math.max(1, Math.floor(floralH * ratio));\n currentX -= w;\n ctx.drawImage(img, currentX, y + height - floralH, w, floralH);\n currentX -= LAYOUT.FLORAL_SPACING;\n }\n }\n};\n\nconst renderSide = (\n ctx: CanvasRenderingContext2D,\n side: any,\n startY: number,\n width: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n let currentY = startY;\n const padding = LAYOUT.PADDING * scaleFactor;\n const sideWidth = width - 2 * padding;\n\n // Draw header\n ctx.save();\n const headerFontSize = LAYOUT.HEADER_FONT_SIZE * scaleFactor;\n ctx.font = `bold ${headerFontSize}px ${LAYOUT.HEADER_FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.HEADER_COLOR;\n\n const headerResult = wrapText(\n ctx,\n side.print_side.toUpperCase(),\n padding,\n currentY,\n sideWidth,\n headerFontSize\n );\n\n // Draw underline\n const underlineY =\n headerResult.lastLineY + headerFontSize * LAYOUT.UNDERLINE_POSITION;\n ctx.strokeStyle = LAYOUT.HEADER_COLOR;\n ctx.lineWidth = LAYOUT.UNDERLINE_WIDTH * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(padding, underlineY);\n ctx.lineTo(padding + headerResult.lastLineWidth, underlineY);\n ctx.stroke();\n\n currentY += headerResult.height + LAYOUT.SECTION_SPACING * scaleFactor;\n ctx.restore();\n\n // Compute uniform properties\n const textPositions = side.positions.filter(\n (p: Position) => p.type === \"TEXT\"\n );\n const uniformProps = computeUniformProperties(textPositions);\n\n // Render uniform labels (only if more than 1 TEXT position)\n if (textPositions.length > 1) {\n currentY += renderUniformLabels(\n ctx,\n uniformProps,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n textPositions\n );\n }\n\n // Group text positions by common properties\n const textGroups = groupTextPositions(textPositions);\n\n // Render text positions (with proper spacing between groups)\n let textCounter = 1;\n textGroups.forEach((group, groupIndex) => {\n group.forEach((position, index) => {\n // Add extra spacing between different groups\n if (index === 0 && groupIndex !== 0) {\n currentY += LAYOUT.SECTION_SPACING * scaleFactor;\n }\n\n // If only 1 TEXT position, show all labels (no uniform labels rendered)\n const showLabels =\n textPositions.length === 1\n ? { font: true, shape: true, floral: true, color: true }\n : {\n font: !uniformProps.isUniform.font,\n shape: !uniformProps.isUniform.shape,\n floral: !uniformProps.isUniform.floral,\n color: !uniformProps.isUniform.color,\n };\n const height = renderTextPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n textCounter,\n showLabels,\n scaleFactor,\n imageRefs\n );\n if (height > 0) {\n currentY += height + LAYOUT.PADDING * scaleFactor;\n textCounter++;\n }\n });\n });\n\n // Render icon positions\n currentY += LAYOUT.LINE_GAP * scaleFactor;\n side.positions.forEach((position: Position) => {\n if (position.type === \"ICON\") {\n currentY += renderIconPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs\n );\n currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;\n }\n });\n\n return currentY - startY;\n};\n\nconst groupTextPositions = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n): Array<Array<Position & { type: \"TEXT\" }>> => {\n const groups: Array<Array<Position & { type: \"TEXT\" }>> = [];\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\n let currentProps: any = null;\n\n textPositions.forEach((position) => {\n const posProps = {\n font: position.font,\n text_shape: position.text_shape,\n color: position.color,\n character_colors: position.character_colors?.join(\",\"),\n };\n\n if (\n !currentGroup ||\n currentProps.font !== posProps.font ||\n currentProps.text_shape !== posProps.text_shape ||\n currentProps.color !== posProps.color ||\n currentProps.character_colors !== posProps.character_colors\n ) {\n if (currentGroup) {\n groups.push(currentGroup);\n }\n currentGroup = [position];\n currentProps = posProps;\n } else {\n currentGroup.push(position);\n }\n });\n\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n return groups;\n};\n\nconst computeUniformProperties = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n) => {\n if (textPositions.length === 0) {\n return {\n values: { font: null, shape: null, floral: null, color: null },\n isUniform: { font: false, shape: false, floral: false, color: false },\n };\n }\n\n const fonts = new Set(textPositions.map((p) => p.font));\n const shapes = new Set(textPositions.map((p) => p.text_shape));\n const florals = new Set(textPositions.map((p) => p.floral_pattern ?? \"None\"));\n const colors = new Set(\n textPositions.map((p) =>\n p.character_colors?.length\n ? p.character_colors.join(\",\")\n : p.color ?? \"None\"\n )\n );\n\n return {\n values: {\n font: fonts.size === 1 ? [...fonts][0] : null,\n shape: shapes.size === 1 ? [...shapes][0] : null,\n floral: florals.size === 1 ? [...florals][0] : null,\n color: colors.size === 1 ? [...colors][0] : null,\n },\n isUniform: {\n font: fonts.size === 1,\n shape: shapes.size === 1,\n floral: florals.size === 1,\n color: colors.size === 1,\n },\n };\n};\n\nconst renderUniformLabels = (\n ctx: CanvasRenderingContext2D,\n uniformProps: ReturnType<typeof computeUniformProperties>,\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n textPositions: Array<Position & { type: \"TEXT\" }>\n): number => {\n const { values } = uniformProps;\n const fontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n let rendered = 0;\n\n if (values.font) {\n const allDefault = textPositions.every((p) => p.is_font_default === true);\n const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font}`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.shape && values.shape !== \"None\") {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${values.shape}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.color && values.color !== \"None\") {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${values.color}`,\n x,\n cursorY,\n textMaxWidth,\n fontSize + lineGap\n );\n\n const swatchH = Math.floor(fontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\n const colors = values.color.includes(\",\")\n ? values.color.split(\",\").map((s) => s.trim())\n : [values.color];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.floral && values.floral !== \"None\") {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${values.floral}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (rendered > 0) cursorY += LAYOUT.SECTION_SPACING * scaleFactor;\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst renderTextPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"TEXT\" },\n x: number,\n y: number,\n maxWidth: number,\n displayIndex: number,\n showLabels: {\n font: boolean;\n shape: boolean;\n floral: boolean;\n color: boolean;\n },\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n ctx.save();\n\n const textFontSize = LAYOUT.TEXT_FONT_SIZE * scaleFactor;\n const otherFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n let currentY = y;\n let drawnHeight = 0;\n\n // Draw label\n const textLabel = `Text ${displayIndex}: `;\n ctx.font = `bold ${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const labelWidth = ctx.measureText(textLabel).width;\n ctx.fillText(textLabel, x, currentY);\n\n const textMaxWidth = maxWidth - labelWidth;\n\n // Get display text (handle empty/null/undefined)\n const isEmptyText = !position.text || position.text.trim() === \"\";\n\n // Draw text content\n if (isEmptyText) {\n ctx.font = `${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n \"(không có text)\",\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.floral_pattern) {\n // Khi có floral_pattern, dùng màu mặc định như label\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.character_colors?.length) {\n ctx.font = `${textFontSize}px ${position.font}`;\n const textHeight = wrapTextMultiColor(\n ctx,\n position.text,\n position.character_colors,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textHeight;\n drawnHeight += textHeight;\n } else {\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n }\n\n // Draw additional labels (skip when text is empty)\n if (!isEmptyText) {\n currentY += lineGap;\n ctx.font = `${otherFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n if (showLabels.shape && position.text_shape) {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${position.text_shape}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.font && position.font) {\n const fontLabel =\n position.is_font_default === true\n ? `Font: ${position.font} (Mặc định)`\n : `Font: ${position.font}`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.color) {\n const colorValue = position.character_colors?.join(\", \") || position.color;\n if (colorValue) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${colorValue}`,\n x,\n currentY,\n textMaxWidth,\n otherFontSize + lineGap\n );\n\n const swatchH = Math.floor(otherFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n result.lastLineY + Math.floor(otherFontSize / 2 - swatchH / 2);\n const colors = position.character_colors || [position.color!];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n if (showLabels.floral && position.floral_pattern) {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${position.floral_pattern}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n ctx.restore();\n return drawnHeight;\n};\n\nconst renderIconPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"ICON\" },\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${iconFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n const iconText =\n position.note ? `Icon: ${position.note}` :\n position.icon === 0\n ? `Icon: (icon mặc định theo file thêu)`\n : `Icon: ${position.icon}`;\n const iconResult = wrapText(\n ctx,\n iconText,\n x,\n cursorY,\n maxWidth,\n iconFontSize + lineGap\n );\n\n // Draw icon image\n if (position.icon !== 0) {\n const url = getImageUrl(\"icon\", position.icon);\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(iconFontSize * ratio));\n const iconX =\n x +\n Math.ceil(iconResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const iconY =\n iconResult.lastLineY + Math.floor(iconFontSize / 2 - iconFontSize / 2);\n ctx.drawImage(img, iconX, iconY, swatchW, iconFontSize);\n }\n }\n\n cursorY += iconResult.height;\n\n // Draw color swatches (prefer layer_colors, fallback to single color)\n const iconColors = position.layer_colors?.length\n ? position.layer_colors\n : position.color\n ? [position.color]\n : null;\n\n if (iconColors?.length) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const colorResult = wrapText(\n ctx,\n `Màu chỉ: ${iconColors.join(\", \")}`,\n x,\n cursorY,\n textMaxWidth,\n iconFontSize + lineGap\n );\n\n const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(colorResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n colorResult.lastLineY + Math.floor(iconFontSize / 2 - swatchH / 2);\n\n drawSwatches(ctx, iconColors, swatchX, swatchY, swatchH, scaleFactor, imageRefs);\n cursorY += colorResult.height;\n }\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst prepareExportCanvas = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<HTMLCanvasElement | null> => {\n const { width = 4200, height = 4800 } = options;\n\n const canvas = document.createElement(\"canvas\");\n const imageRefs: ImageMapRef = {\n current: new Map<string, HTMLImageElement>(),\n };\n\n await preloadFonts(config);\n await preloadImages(config, imageRefs);\n\n renderEmbroideryCanvas(canvas, config, { width, height }, imageRefs);\n\n if (!canvas.width || !canvas.height) {\n return null;\n }\n\n return canvas;\n};\n\nexport const generateEmbroideryQCImageBlob = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<Blob | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageBlob requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n }\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas || typeof canvas.toBlob !== \"function\") {\n return null;\n }\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((result) => resolve(result), mimeType, quality);\n });\n\n return blob;\n};\n\nexport const generateEmbroideryQCImageData = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<string | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageData requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n };\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas) {\n return null;\n }\n\n if (mimeType === \"image/png\" || typeof quality === \"undefined\") {\n return canvas.toDataURL(mimeType);\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n\nexport default EmbroideryQCImage;\n"],"names":["_jsx"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/EmbroideryQCImage.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { EmbroideryQCConfig, EmbroideryQCImageProps, Position } from \"../types\";\nimport \"./EmbroideryQCImage.css\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst COLOR_MAP: Record<string, string> = {\n \"Army (1394)\": \"#545541\",\n Army: \"#545541\",\n \"Black (8)\": \"#060608\",\n Black: \"#060608\",\n \"Bubblegum (1309)\": \"#E77B9F\",\n Bubblegum: \"#E77B9F\",\n \"Carolina Blue (1274)\": \"#608CC9\",\n \"Carolina Blue\": \"#608CC9\",\n \"Celadon (1098)\": \"#8EAD8D\",\n Celadon: \"#8EAD8D\",\n \"Coffee Bean (1145)\": \"#502B23\",\n \"Coffee Bean\": \"#502B23\",\n \"Daffodil (1180)\": \"#FBE30D\",\n Daffodil: \"#FBE30D\",\n \"Dark Gray (1131)\": \"#2E272E\",\n \"Dark Gray\": \"#2E272E\",\n \"Doe Skin Beige (1344)\": \"#AE9B8B\",\n \"Doe Skin Beige\": \"#AE9B8B\",\n \"Dusty Blue (1373)\": \"#7B90A9\",\n \"Dusty Blue\": \"#7B90A9\",\n \"Forest Green (1397)\": \"#073020\",\n \"Forest Green\": \"#073020\",\n \"Gold (1425)\": \"#D2920A\",\n Gold: \"#D2920A\",\n \"Gray (1118)\": \"#9999A3\",\n Gray: \"#9999A3\",\n \"Ivory (1072)\": \"#E3DAC9\",\n Ivory: \"#E3DAC9\",\n \"Lavender (1032)\": \"#9274B6\",\n Lavender: \"#9274B6\",\n \"Light Denim (1133)\": \"#366696\",\n \"Light Denim\": \"#366696\",\n \"Light Salmon (1018)\": \"#E0A793\",\n \"Light Salmon\": \"#E0A793\",\n \"Maroon (1374)\": \"#480C1C\",\n Maroon: \"#480C1C\",\n \"Navy Blue (1044)\": \"#04072A\",\n \"Navy Blue\": \"#04072A\",\n \"Olive Green (1157)\": \"#625E1F\",\n \"Olive Green\": \"#625E1F\",\n \"Orange (1278)\": \"#D45D03\",\n Orange: \"#D45D03\",\n \"Peach Blush (1053)\": \"#E2C0B6\",\n \"Peach Blush\": \"#E2C0B6\",\n \"Pink (1148)\": \"#EFAFBF\",\n Pink: \"#EFAFBF\",\n \"Purple (1412)\": \"#37196F\",\n Purple: \"#37196F\",\n \"Red (1037)\": \"#9D000B\",\n Red: \"#9D000B\",\n \"Silver Sage (1396)\": \"#424F45\",\n \"Silver Sage\": \"#424F45\",\n \"Summer Sky (1432)\": \"#65A8D2\",\n \"Summer Sky\": \"#65A8D2\",\n \"Terra Cotta (1477)\": \"#AE3111\",\n \"Terra Cotta\": \"#AE3111\",\n \"Sand (1055)\": \"#D2C2AB\",\n Sand: \"#D2C2AB\",\n \"White (9)\": \"#D8D7DC\",\n White: \"#D8D7DC\",\n};\n\nconst DEFAULT_ERROR_COLOR = \"#CC1F1A\";\nconst DEFAULT_WARNING_COLOR = \"#FF8C00\";\n\nconst BASE_URLS = {\n FONT: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\",\n ICON: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\",\n FLORAL:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\",\n THREAD_COLOR:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\",\n};\n\nconst LAYOUT = {\n // Font families\n HEADER_FONT_FAMILY: \"Times New Roman\",\n FONT_FAMILY: \"Arial\",\n\n // Font sizes (base values, will be multiplied by scaleFactor)\n HEADER_FONT_SIZE: 220,\n TEXT_FONT_SIZE: 200,\n OTHER_FONT_SIZE: 160,\n\n // Colors\n HEADER_COLOR: \"#000000\",\n LABEL_COLOR: \"#444444\",\n BACKGROUND_COLOR: \"#FFFFFF\",\n\n // Text alignment\n TEXT_ALIGN: \"left\" as CanvasTextAlign,\n TEXT_BASELINE: \"top\" as CanvasTextBaseline,\n\n // Spacing\n LINE_GAP: 40,\n PADDING: 40,\n SECTION_SPACING: 60,\n ELEMENT_SPACING: 100,\n SWATCH_SPACING: 25,\n FLORAL_SPACING: 300,\n\n // Visual styling\n SWATCH_HEIGHT_RATIO: 2.025,\n UNDERLINE_POSITION: 0.9,\n UNDERLINE_WIDTH: 10,\n\n // Swatch reserved space\n SWATCH_RESERVED_SPACE: 1000,\n MIN_TEXT_WIDTH: 400,\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nconst loadFont = (fontName: string): Promise<void> => {\n return new Promise((resolve) => {\n const fontUrl = `${BASE_URLS.FONT}/${encodeURIComponent(fontName)}.woff2`;\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\n\n fontFace\n .load()\n .then((loadedFont) => {\n document.fonts.add(loadedFont);\n resolve();\n })\n .catch(() => {\n console.warn(`Could not load font ${fontName} from CDN`);\n resolve();\n });\n });\n};\n\nconst getImageUrl = (\n type: \"icon\" | \"floral\" | \"threadColor\",\n value: string | number\n): string => {\n if (type === \"icon\") return `${BASE_URLS.ICON}/Icon ${value}.png`;\n if (type === \"floral\") return `${BASE_URLS.FLORAL}/${value}.png`;\n return `${BASE_URLS.THREAD_COLOR}/${value}.png`;\n};\n\ntype ImageMapRef = {\n current: Map<string, HTMLImageElement>;\n};\n\nexport interface EmbroideryQCImageRenderOptions {\n width?: number;\n height?: number;\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n}\n\nconst getProxyUrl = (url: string): string =>\n `https://proxy-img.c8p.workers.dev?url=${encodeURIComponent(url)}`;\n\nconst ensureImage = (existing?: HTMLImageElement | null): HTMLImageElement => {\n if (existing && existing.crossOrigin === \"anonymous\") {\n return existing;\n }\n\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.decoding = \"async\";\n return img;\n};\n\nconst loadImage = (url: string, imageRefs: ImageMapRef, onLoad: () => void) => {\n const existing = imageRefs.current.get(url);\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\"\n ) {\n return;\n }\n\n const img = ensureImage(existing);\n imageRefs.current.set(url, img);\n\n let attemptedProxy = existing?.dataset?.proxyUsed === \"true\";\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n };\n\n img.onload = () => {\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n img.src = getProxyUrl(url);\n return;\n }\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.src = attemptedProxy ? getProxyUrl(url) : url;\n};\n\nconst loadImageAsync = (\n url: string,\n imageRefs: ImageMapRef,\n cacheKey?: string\n): Promise<HTMLImageElement> => {\n const key = cacheKey ?? url;\n const existing = imageRefs.current.get(key) ?? imageRefs.current.get(url);\n\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\" &&\n existing.dataset?.proxyUsed !== undefined\n ) {\n if (existing !== imageRefs.current.get(key)) {\n imageRefs.current.set(key, existing);\n }\n if (existing !== imageRefs.current.get(url)) {\n imageRefs.current.set(url, existing);\n }\n return Promise.resolve(existing);\n }\n\n return new Promise((resolve) => {\n const target = ensureImage(existing);\n if (target !== existing) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n let attemptedProxy = target.dataset.proxyUsed === \"true\";\n\n const finalize = () => {\n target.onload = null;\n target.onerror = null;\n if (target.complete && target.naturalWidth > 0) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n resolve(target);\n };\n\n target.onload = finalize;\n target.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n target.src = getProxyUrl(url);\n return;\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n finalize();\n };\n\n const desiredSrc = attemptedProxy ? getProxyUrl(url) : url;\n\n if (target.src !== desiredSrc) {\n target.src = desiredSrc;\n } else if (target.complete && target.naturalWidth > 0) {\n finalize();\n }\n });\n};\n\nconst preloadFonts = async (config: EmbroideryQCConfig) => {\n if (config.error_message || !config.sides?.length) return;\n\n const fonts = new Set<string>();\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fonts.add(position.font);\n }\n });\n });\n\n if (fonts.size === 0) return;\n\n await Promise.all([...fonts].map((font) => loadFont(font)));\n};\n\nconst preloadImages = async (\n config: EmbroideryQCConfig,\n imageRefs: ImageMapRef\n) => {\n const entries: Array<{ url: string; cacheKey?: string }> = [];\n const seen = new Set<string>();\n\n if (config.image_url) {\n entries.push({ url: config.image_url, cacheKey: \"mockup\" });\n seen.add(config.image_url);\n }\n\n if (!config.sides?.length) {\n await Promise.all(\n entries.map(({ url, cacheKey }) =>\n loadImageAsync(url, imageRefs, cacheKey)\n )\n );\n return;\n }\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n const iconUrl = getImageUrl(\"icon\", position.icon);\n if (!seen.has(iconUrl)) {\n entries.push({ url: iconUrl });\n seen.add(iconUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.layer_colors?.forEach((color) => {\n const colorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(colorUrl)) {\n entries.push({ url: colorUrl });\n seen.add(colorUrl);\n }\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n const floralUrl = getImageUrl(\"floral\", position.floral_pattern);\n if (!seen.has(floralUrl)) {\n entries.push({ url: floralUrl });\n seen.add(floralUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.character_colors?.forEach((color) => {\n const characterColorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(characterColorUrl)) {\n entries.push({ url: characterColorUrl });\n seen.add(characterColorUrl);\n }\n });\n }\n });\n });\n\n if (entries.length === 0) return;\n\n await Promise.all(\n entries.map(({ url, cacheKey }) => loadImageAsync(url, imageRefs, cacheKey))\n );\n};\n\nconst wrapText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): { height: number; lastLineWidth: number; lastLineY: number } => {\n const words = text.split(\" \");\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line) => {\n ctx.fillText(line, x, currentY);\n currentY += lineHeight;\n });\n\n return {\n height: lines.length * lineHeight,\n lastLineWidth: ctx.measureText(lines[lines.length - 1]).width,\n lastLineY: y + (lines.length - 1) * lineHeight,\n };\n};\n\nconst buildWrappedLines = (\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] => {\n const words = text.split(\" \").filter((word) => word.length > 0);\n if (words.length === 0) return [\"\"];\n\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = `${currentLine} ${words[i]}`;\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n\n lines.push(currentLine);\n return lines;\n};\n\nconst wrapTextMultiColor = (\n ctx: CanvasRenderingContext2D,\n text: string,\n colors: string[],\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): number => {\n const words = text.split(\" \");\n const lines: string[] = [];\n const lineStartIndices: number[] = [0];\n let currentLine = words[0];\n let currentCharIndex = words[0].length;\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n lineStartIndices.push(currentCharIndex + 1);\n currentLine = words[i];\n currentCharIndex += words[i].length + 1;\n } else {\n currentLine = testLine;\n currentCharIndex += words[i].length + 1;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line, lineIdx) => {\n let currentX = x;\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const globalCharIdx = startCharIdx + i;\n const colorIndex = globalCharIdx % colors.length;\n const color = colors[colorIndex];\n ctx.fillStyle = COLOR_MAP[color] || LAYOUT.LABEL_COLOR;\n ctx.fillText(char, currentX, currentY);\n currentX += ctx.measureText(char).width;\n }\n currentY += lineHeight;\n });\n\n return lines.length * lineHeight;\n};\n\nconst drawSwatches = (\n ctx: CanvasRenderingContext2D,\n colors: string[],\n startX: number,\n startY: number,\n swatchHeight: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n) => {\n let swatchX = startX;\n colors.forEach((color) => {\n const url = getImageUrl(\"threadColor\", color);\n const img = imageRefs.current.get(url);\n if (img && img.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(swatchHeight * ratio));\n ctx.drawImage(img, swatchX, startY, swatchW, swatchHeight);\n swatchX += swatchW + LAYOUT.SWATCH_SPACING * scaleFactor;\n }\n });\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\n config,\n className = \"\",\n style = {},\n}) => {\n const [canvasSize] = useState({ width: 4200, height: 4800 });\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\n const [imagesLoaded, setImagesLoaded] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\n\n // Load fonts\n useEffect(() => {\n const loadFonts = async () => {\n if (config.error_message || !config.sides?.length) return;\n\n const fontsToLoad = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fontsToLoad.add(position.font);\n }\n });\n });\n\n for (const fontName of fontsToLoad) {\n if (!loadedFonts.has(fontName)) {\n try {\n await loadFont(fontName);\n setLoadedFonts((prev) => new Set(prev).add(fontName));\n } catch (error) {\n console.warn(`Could not load font ${fontName}:`, error);\n }\n }\n }\n };\n\n loadFonts();\n }, [config.sides, loadedFonts]);\n\n // Load images\n useEffect(() => {\n if (config.error_message || !config.sides?.length) return;\n\n const incrementCounter = () => setImagesLoaded((prev) => prev + 1);\n\n // Load mockup\n if (config.image_url) {\n loadImage(config.image_url, imageRefs, incrementCounter);\n }\n\n // Load all other images\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n loadImage(\n getImageUrl(\"icon\", position.icon),\n imageRefs,\n incrementCounter\n );\n }\n position.layer_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n loadImage(\n getImageUrl(\"floral\", position.floral_pattern),\n imageRefs,\n incrementCounter\n );\n }\n if (position.color) {\n loadImage(\n getImageUrl(\"threadColor\", position.color),\n imageRefs,\n incrementCounter\n );\n }\n position.character_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n });\n });\n }, [config]);\n\n // Render canvas\n useEffect(() => {\n const renderCanvas = () => {\n if (!canvasRef.current) return;\n renderEmbroideryCanvas(canvasRef.current, config, canvasSize, imageRefs);\n };\n\n const timer = setTimeout(renderCanvas, 100);\n return () => clearTimeout(timer);\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\n\n return (\n <div\n className={`render-embroidery${className ? ` ${className}` : \"\"}`}\n style={style}\n >\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\n </div>\n );\n};\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\nconst renderEmbroideryCanvas = (\n canvas: HTMLCanvasElement,\n config: EmbroideryQCConfig,\n canvasSize: { width: number; height: number },\n imageRefs: ImageMapRef\n) => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = canvasSize.width;\n canvas.height = canvasSize.height;\n\n ctx.fillStyle = LAYOUT.BACKGROUND_COLOR;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (config.error_message) {\n renderErrorState(ctx, canvas, config.error_message);\n return;\n }\n\n if (!config.sides?.length) return;\n\n ctx.textAlign = LAYOUT.TEXT_ALIGN;\n ctx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n // Calculate warning height (with scaleFactor = 1 for measurement)\n let warningHeight = 0;\n let warningLineHeight = 0;\n let warningLineCount = 0;\n if (config.warning_message) {\n const measureWarningCanvas = document.createElement(\"canvas\");\n measureWarningCanvas.width = canvas.width;\n measureWarningCanvas.height = canvas.height;\n const measureWarningCtx = measureWarningCanvas.getContext(\"2d\");\n if (measureWarningCtx) {\n measureWarningCtx.textAlign = \"left\";\n measureWarningCtx.textBaseline = \"top\";\n measureWarningCtx.font = `${LAYOUT.HEADER_FONT_SIZE * 0.7}px ${LAYOUT.FONT_FAMILY}`;\n const warningLines = buildWrappedLines(\n measureWarningCtx,\n `Note: ${config.warning_message.trim()}`,\n canvas.width - LAYOUT.PADDING * 4\n );\n warningLineCount = warningLines.length;\n warningLineHeight = LAYOUT.HEADER_FONT_SIZE * 0.7 + LAYOUT.LINE_GAP;\n warningHeight = warningLineCount * warningLineHeight + LAYOUT.PADDING;\n }\n }\n\n if (config.image_url) {\n const mockupImage = imageRefs.current.get(config.image_url);\n if (mockupImage) {\n imageRefs.current.set(\"mockup\", mockupImage);\n }\n }\n\n const floralAssets: HTMLImageElement[] = [];\n const seenFlorals = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.floral_pattern) {\n const url = getImageUrl(\"floral\", position.floral_pattern);\n if (!seenFlorals.has(url)) {\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalWidth > 0) {\n floralAssets.push(img);\n seenFlorals.add(url);\n }\n }\n }\n });\n });\n\n const measureCanvas = document.createElement(\"canvas\");\n measureCanvas.width = canvas.width;\n measureCanvas.height = canvas.height;\n const measureCtx = measureCanvas.getContext(\"2d\");\n if (!measureCtx) return;\n\n measureCtx.textAlign = LAYOUT.TEXT_ALIGN;\n measureCtx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n let measureY = LAYOUT.PADDING;\n const measureSpacing = LAYOUT.ELEMENT_SPACING;\n \n // Add warning text height (without bottom padding, no spacing)\n if (config.warning_message) {\n const warningTextHeight = warningHeight - LAYOUT.PADDING;\n measureY += warningTextHeight;\n }\n\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n measureCtx,\n side,\n measureY,\n canvas.width,\n 1,\n imageRefs\n );\n measureY += sideHeight + measureSpacing;\n });\n\n const scaleFactor = Math.max(\n 0.5,\n Math.min(1, (canvas.height - LAYOUT.PADDING - warningHeight) / measureY)\n );\n\n drawMockupAndFlorals(ctx, canvas, floralAssets, imageRefs);\n\n // Render warning with scaleFactor and get actual height\n let actualWarningHeight = 0;\n if (config.warning_message) {\n actualWarningHeight = renderWarning(ctx, canvas, config.warning_message, scaleFactor);\n }\n\n // Calculate currentY: padding top + actual warning height (no spacing)\n let currentY = LAYOUT.PADDING * scaleFactor;\n if (config.warning_message && actualWarningHeight > 0) {\n currentY += actualWarningHeight;\n }\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n ctx,\n side,\n currentY,\n canvas.width,\n scaleFactor,\n imageRefs\n );\n currentY += sideHeight + measureSpacing * scaleFactor;\n });\n};\n\nconst renderErrorState = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string\n) => {\n const sanitizedMessage = message.trim() || \"Đã xảy ra lỗi\";\n const horizontalPadding = LAYOUT.PADDING * 3;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE;\n const minFontSize = 60;\n const centerX = canvas.width / 2;\n\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_ERROR_COLOR;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `bold ${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const totalHeight = lines.length * lineHeight;\n const startY = Math.max(\n LAYOUT.PADDING * 2,\n canvas.height / 2 - totalHeight / 2\n );\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, centerX, y);\n });\n\n ctx.restore();\n};\n\nconst renderWarning = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string,\n scaleFactor: number = 1\n): number => {\n const sanitizedMessage = `Note: ${message.trim()}`;\n const horizontalPadding = LAYOUT.PADDING * 2 * scaleFactor;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE * 0.7 * scaleFactor;\n const minFontSize = 50 * scaleFactor;\n const leftX = LAYOUT.PADDING * scaleFactor;\n\n ctx.save();\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_WARNING_COLOR;\n ctx.font = `${baseFontSize}px ${LAYOUT.FONT_FAMILY}`;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP * scaleFactor;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * scaleFactor * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const startY = LAYOUT.PADDING * scaleFactor;\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, leftX, y);\n });\n\n ctx.restore();\n \n // Return the actual height of the warning (number of lines * lineHeight)\n return lines.length * lineHeight;\n};\n\nconst drawMockupAndFlorals = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n floralAssets: HTMLImageElement[],\n imageRefs: ImageMapRef\n) => {\n const mockupImg = imageRefs.current.get(\"mockup\");\n if (!mockupImg?.complete || !mockupImg.naturalWidth) return;\n\n const margin = LAYOUT.PADDING;\n const maxWidth = Math.min(1800, canvas.width * 0.375);\n const maxHeight = canvas.height * 0.375;\n const scale = Math.min(\n maxWidth / mockupImg.naturalWidth,\n maxHeight / mockupImg.naturalHeight\n );\n const width = Math.max(1, Math.floor(mockupImg.naturalWidth * scale));\n const height = Math.max(1, Math.floor(mockupImg.naturalHeight * scale));\n const x = canvas.width - margin - width;\n const y = canvas.height - margin - height;\n\n ctx.drawImage(mockupImg, x, y, width, height);\n\n // Draw florals\n if (floralAssets.length > 0) {\n const floralH = Math.min(900, height);\n let currentX = x - LAYOUT.FLORAL_SPACING;\n\n for (let i = floralAssets.length - 1; i >= 0; i--) {\n const img = floralAssets[i];\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\n const w = Math.max(1, Math.floor(floralH * ratio));\n currentX -= w;\n ctx.drawImage(img, currentX, y + height - floralH, w, floralH);\n currentX -= LAYOUT.FLORAL_SPACING;\n }\n }\n};\n\nconst renderSide = (\n ctx: CanvasRenderingContext2D,\n side: any,\n startY: number,\n width: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n let currentY = startY;\n const padding = LAYOUT.PADDING * scaleFactor;\n const sideWidth = width - 2 * padding;\n\n // Draw header\n ctx.save();\n const headerFontSize = LAYOUT.HEADER_FONT_SIZE * scaleFactor;\n ctx.font = `bold ${headerFontSize}px ${LAYOUT.HEADER_FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.HEADER_COLOR;\n\n const headerResult = wrapText(\n ctx,\n side.print_side.toUpperCase(),\n padding,\n currentY,\n sideWidth,\n headerFontSize\n );\n\n // Draw underline\n const underlineY =\n headerResult.lastLineY + headerFontSize * LAYOUT.UNDERLINE_POSITION;\n ctx.strokeStyle = LAYOUT.HEADER_COLOR;\n ctx.lineWidth = LAYOUT.UNDERLINE_WIDTH * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(padding, underlineY);\n ctx.lineTo(padding + headerResult.lastLineWidth, underlineY);\n ctx.stroke();\n\n currentY += headerResult.height + LAYOUT.SECTION_SPACING * scaleFactor;\n ctx.restore();\n\n // Compute uniform properties\n const textPositions = side.positions.filter(\n (p: Position) => p.type === \"TEXT\"\n );\n const iconColorPositions = side.positions.filter(\n (p: Position): p is Position & { type: \"ICON\" } =>\n p.type === \"ICON\" && (!p.layer_colors?.length || p.layer_colors.length === 1)\n );\n const iconColorValues = iconColorPositions\n .map((p: Position & { type: \"ICON\" }) => {\n if (p.layer_colors?.length === 1) return p.layer_colors[0];\n return p.color ?? null;\n })\n .filter((color: string | null): color is string => Boolean(color));\n const uniformProps = computeUniformProperties(textPositions, {\n additionalColorValues: iconColorValues,\n });\n const shouldShowUniformLabels = textPositions.length > 1;\n\n // Render uniform labels (only if more than 1 TEXT position)\n if (shouldShowUniformLabels) {\n currentY += renderUniformLabels(\n ctx,\n uniformProps,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n textPositions\n );\n }\n\n // Group text positions by common properties\n const textGroups = groupTextPositions(textPositions);\n\n // Render text positions (with proper spacing between groups)\n let textCounter = 1;\n textGroups.forEach((group, groupIndex) => {\n group.forEach((position, index) => {\n // Add extra spacing between different groups\n if (index === 0 && groupIndex !== 0) {\n currentY += LAYOUT.SECTION_SPACING * scaleFactor;\n }\n\n // If only 1 TEXT position, show all labels (no uniform labels rendered)\n const showLabels =\n textPositions.length === 1\n ? { font: true, shape: true, floral: true, color: true }\n : {\n font: !uniformProps.isUniform.font,\n shape: !uniformProps.isUniform.shape,\n floral: !uniformProps.isUniform.floral,\n color: !uniformProps.isUniform.color,\n };\n const height = renderTextPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n textCounter,\n showLabels,\n scaleFactor,\n imageRefs\n );\n if (height > 0) {\n currentY += height + LAYOUT.PADDING * scaleFactor;\n textCounter++;\n }\n });\n });\n\n // Render icon positions\n currentY += LAYOUT.LINE_GAP * scaleFactor;\n side.positions.forEach((position: Position) => {\n if (position.type === \"ICON\") {\n const layerCount = position.layer_colors?.length ?? 0;\n const iconUsesSingleColor =\n layerCount === 0 || layerCount === 1;\n const iconColorValue =\n layerCount === 1\n ? position.layer_colors?.[0] ?? null\n : position.color ?? null;\n const hideColor =\n shouldShowUniformLabels &&\n uniformProps.isUniform.color &&\n iconColorValue !== null &&\n uniformProps.values.color === iconColorValue &&\n iconUsesSingleColor;\n currentY += renderIconPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n { hideColor }\n );\n currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;\n }\n });\n\n return currentY - startY;\n};\n\nconst groupTextPositions = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n): Array<Array<Position & { type: \"TEXT\" }>> => {\n const groups: Array<Array<Position & { type: \"TEXT\" }>> = [];\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\n let currentProps: any = null;\n\n textPositions.forEach((position) => {\n const posProps = {\n font: position.font,\n text_shape: position.text_shape,\n color: position.color,\n character_colors: position.character_colors?.join(\",\"),\n };\n\n if (\n !currentGroup ||\n currentProps.font !== posProps.font ||\n currentProps.text_shape !== posProps.text_shape ||\n currentProps.color !== posProps.color ||\n currentProps.character_colors !== posProps.character_colors\n ) {\n if (currentGroup) {\n groups.push(currentGroup);\n }\n currentGroup = [position];\n currentProps = posProps;\n } else {\n currentGroup.push(position);\n }\n });\n\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n return groups;\n};\n\nconst computeUniformProperties = (\n textPositions: Array<Position & { type: \"TEXT\" }>,\n options?: { additionalColorValues?: string[] }\n) => {\n const defaults = {\n values: { font: null, shape: null, floral: null, color: null },\n isUniform: { font: false, shape: false, floral: false, color: false },\n };\n\n const fonts = new Set(textPositions.map((p) => p.font));\n const shapes = new Set(textPositions.map((p) => p.text_shape));\n const florals = new Set(textPositions.map((p) => p.floral_pattern ?? \"None\"));\n const colorSources = [\n ...textPositions.map((p) =>\n p.character_colors?.length\n ? p.character_colors.join(\",\")\n : p.color ?? \"None\"\n ),\n ...(options?.additionalColorValues?.map((color) => color ?? \"None\") ?? []),\n ];\n\n if (\n textPositions.length === 0 &&\n (!options?.additionalColorValues || options.additionalColorValues.length === 0)\n ) {\n return defaults;\n }\n\n const colors = new Set(colorSources);\n\n return {\n values: {\n font: fonts.size === 1 ? [...fonts][0] : null,\n shape: shapes.size === 1 ? [...shapes][0] : null,\n floral: florals.size === 1 ? [...florals][0] : null,\n color: colorSources.length > 0 && colors.size === 1 ? [...colors][0] : null,\n },\n isUniform: {\n font: fonts.size === 1,\n shape: shapes.size === 1,\n floral: florals.size === 1,\n color: colorSources.length > 0 && colors.size === 1,\n },\n };\n};\n\nconst renderUniformLabels = (\n ctx: CanvasRenderingContext2D,\n uniformProps: ReturnType<typeof computeUniformProperties>,\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n textPositions: Array<Position & { type: \"TEXT\" }>\n): number => {\n const { values } = uniformProps;\n const fontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n let rendered = 0;\n\n if (values.font) {\n const allDefault = textPositions.every((p) => p.is_font_default === true);\n const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font} (Custom)`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.shape && values.shape !== \"None\") {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${values.shape}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.color && values.color !== \"None\") {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${values.color}`,\n x,\n cursorY,\n textMaxWidth,\n fontSize + lineGap\n );\n\n const swatchH = Math.floor(fontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\n const colors = values.color.includes(\",\")\n ? values.color.split(\",\").map((s) => s.trim())\n : [values.color];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.floral && values.floral !== \"None\") {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${values.floral}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (rendered > 0) cursorY += LAYOUT.SECTION_SPACING * scaleFactor;\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst renderTextPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"TEXT\" },\n x: number,\n y: number,\n maxWidth: number,\n displayIndex: number,\n showLabels: {\n font: boolean;\n shape: boolean;\n floral: boolean;\n color: boolean;\n },\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n ctx.save();\n\n const textFontSize = LAYOUT.TEXT_FONT_SIZE * scaleFactor;\n const otherFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n let currentY = y;\n let drawnHeight = 0;\n\n // Draw label\n const textLabel = `Text ${displayIndex}: `;\n ctx.font = `bold ${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const labelWidth = ctx.measureText(textLabel).width;\n ctx.fillText(textLabel, x, currentY);\n\n const textMaxWidth = maxWidth - labelWidth;\n\n // Get display text (handle empty/null/undefined)\n const isEmptyText = !position.text || position.text.trim() === \"\";\n\n // Draw text content\n if (isEmptyText) {\n ctx.font = `${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n \"(không có text)\",\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.floral_pattern) {\n // Khi có floral_pattern, dùng màu mặc định như label\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.character_colors?.length) {\n ctx.font = `${textFontSize}px ${position.font}`;\n const textHeight = wrapTextMultiColor(\n ctx,\n position.text,\n position.character_colors,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textHeight;\n drawnHeight += textHeight;\n } else {\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n }\n\n // Draw additional labels (skip when text is empty)\n if (!isEmptyText) {\n currentY += lineGap;\n ctx.font = `${otherFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n if (showLabels.shape && position.text_shape) {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${position.text_shape}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.font && position.font) {\n const fontLabel =\n position.is_font_default === true\n ? `Font: ${position.font} (Mặc định)`\n : `Font: ${position.font} (Custom)`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.color) {\n const colorValue = position.character_colors?.join(\", \") || position.color;\n if (colorValue) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${colorValue}`,\n x,\n currentY,\n textMaxWidth,\n otherFontSize + lineGap\n );\n\n const swatchH = Math.floor(otherFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n result.lastLineY + Math.floor(otherFontSize / 2 - swatchH / 2);\n const colors = position.character_colors || [position.color!];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n if (showLabels.floral && position.floral_pattern) {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${position.floral_pattern}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n ctx.restore();\n return drawnHeight;\n};\n\nconst renderIconPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"ICON\" },\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n options?: { hideColor?: boolean }\n): number => {\n const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${iconFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n const iconText =\n position.note ? `Icon: ${position.note}` :\n position.icon === 0\n ? `Icon: (icon mặc định theo file thêu)`\n : `Icon: ${position.icon}`;\n const iconResult = wrapText(\n ctx,\n iconText,\n x,\n cursorY,\n maxWidth,\n iconFontSize + lineGap\n );\n\n // Draw icon image\n if (position.icon !== 0) {\n const url = getImageUrl(\"icon\", position.icon);\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(iconFontSize * ratio));\n const iconX =\n x +\n Math.ceil(iconResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const iconY =\n iconResult.lastLineY + Math.floor(iconFontSize / 2 - iconFontSize / 2);\n ctx.drawImage(img, iconX, iconY, swatchW, iconFontSize);\n }\n }\n\n cursorY += iconResult.height;\n\n // Draw color swatches (prefer layer_colors, fallback to single color)\n const iconColors = position.layer_colors?.length\n ? position.layer_colors\n : position.color\n ? [position.color]\n : null;\n const layerCount = position.layer_colors?.length ?? 0;\n const hasMultiLayerColors = layerCount > 1;\n const shouldSkipColorSection = options?.hideColor && !hasMultiLayerColors;\n\n if (iconColors?.length && !shouldSkipColorSection) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const colorResult = wrapText(\n ctx,\n `Màu chỉ: ${iconColors.join(\", \")}`,\n x,\n cursorY,\n textMaxWidth,\n iconFontSize + lineGap\n );\n\n const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(colorResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n colorResult.lastLineY + Math.floor(iconFontSize / 2 - swatchH / 2);\n\n drawSwatches(ctx, iconColors, swatchX, swatchY, swatchH, scaleFactor, imageRefs);\n cursorY += colorResult.height;\n }\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst prepareExportCanvas = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<HTMLCanvasElement | null> => {\n const { width = 4200, height = 4800 } = options;\n\n const canvas = document.createElement(\"canvas\");\n const imageRefs: ImageMapRef = {\n current: new Map<string, HTMLImageElement>(),\n };\n\n await preloadFonts(config);\n await preloadImages(config, imageRefs);\n\n renderEmbroideryCanvas(canvas, config, { width, height }, imageRefs);\n\n if (!canvas.width || !canvas.height) {\n return null;\n }\n\n return canvas;\n};\n\nexport const generateEmbroideryQCImageBlob = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<Blob | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageBlob requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n }\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas || typeof canvas.toBlob !== \"function\") {\n return null;\n }\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((result) => resolve(result), mimeType, quality);\n });\n\n return blob;\n};\n\nexport const generateEmbroideryQCImageData = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<string | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageData requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n };\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas) {\n return null;\n }\n\n if (mimeType === \"image/png\" || typeof quality === \"undefined\") {\n return canvas.toDataURL(mimeType);\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n\nexport default EmbroideryQCImage;\n"],"names":["_jsx"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.js CHANGED
@@ -730,9 +730,20 @@ const renderSide = (ctx, side, startY, width, scaleFactor, imageRefs) => {
730
730
  ctx.restore();
731
731
  // Compute uniform properties
732
732
  const textPositions = side.positions.filter((p) => p.type === "TEXT");
733
- const uniformProps = computeUniformProperties(textPositions);
733
+ const iconColorPositions = side.positions.filter((p) => p.type === "ICON" && (!p.layer_colors?.length || p.layer_colors.length === 1));
734
+ const iconColorValues = iconColorPositions
735
+ .map((p) => {
736
+ if (p.layer_colors?.length === 1)
737
+ return p.layer_colors[0];
738
+ return p.color ?? null;
739
+ })
740
+ .filter((color) => Boolean(color));
741
+ const uniformProps = computeUniformProperties(textPositions, {
742
+ additionalColorValues: iconColorValues,
743
+ });
744
+ const shouldShowUniformLabels = textPositions.length > 1;
734
745
  // Render uniform labels (only if more than 1 TEXT position)
735
- if (textPositions.length > 1) {
746
+ if (shouldShowUniformLabels) {
736
747
  currentY += renderUniformLabels(ctx, uniformProps, padding, currentY, sideWidth, scaleFactor, imageRefs, textPositions);
737
748
  }
738
749
  // Group text positions by common properties
@@ -765,7 +776,17 @@ const renderSide = (ctx, side, startY, width, scaleFactor, imageRefs) => {
765
776
  currentY += LAYOUT.LINE_GAP * scaleFactor;
766
777
  side.positions.forEach((position) => {
767
778
  if (position.type === "ICON") {
768
- currentY += renderIconPosition(ctx, position, padding, currentY, sideWidth, scaleFactor, imageRefs);
779
+ const layerCount = position.layer_colors?.length ?? 0;
780
+ const iconUsesSingleColor = layerCount === 0 || layerCount === 1;
781
+ const iconColorValue = layerCount === 1
782
+ ? position.layer_colors?.[0] ?? null
783
+ : position.color ?? null;
784
+ const hideColor = shouldShowUniformLabels &&
785
+ uniformProps.isUniform.color &&
786
+ iconColorValue !== null &&
787
+ uniformProps.values.color === iconColorValue &&
788
+ iconUsesSingleColor;
789
+ currentY += renderIconPosition(ctx, position, padding, currentY, sideWidth, scaleFactor, imageRefs, { hideColor });
769
790
  currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;
770
791
  }
771
792
  });
@@ -802,31 +823,37 @@ const groupTextPositions = (textPositions) => {
802
823
  }
803
824
  return groups;
804
825
  };
805
- const computeUniformProperties = (textPositions) => {
806
- if (textPositions.length === 0) {
807
- return {
808
- values: { font: null, shape: null, floral: null, color: null },
809
- isUniform: { font: false, shape: false, floral: false, color: false },
810
- };
811
- }
826
+ const computeUniformProperties = (textPositions, options) => {
827
+ const defaults = {
828
+ values: { font: null, shape: null, floral: null, color: null },
829
+ isUniform: { font: false, shape: false, floral: false, color: false },
830
+ };
812
831
  const fonts = new Set(textPositions.map((p) => p.font));
813
832
  const shapes = new Set(textPositions.map((p) => p.text_shape));
814
833
  const florals = new Set(textPositions.map((p) => p.floral_pattern ?? "None"));
815
- const colors = new Set(textPositions.map((p) => p.character_colors?.length
816
- ? p.character_colors.join(",")
817
- : p.color ?? "None"));
834
+ const colorSources = [
835
+ ...textPositions.map((p) => p.character_colors?.length
836
+ ? p.character_colors.join(",")
837
+ : p.color ?? "None"),
838
+ ...(options?.additionalColorValues?.map((color) => color ?? "None") ?? []),
839
+ ];
840
+ if (textPositions.length === 0 &&
841
+ (!options?.additionalColorValues || options.additionalColorValues.length === 0)) {
842
+ return defaults;
843
+ }
844
+ const colors = new Set(colorSources);
818
845
  return {
819
846
  values: {
820
847
  font: fonts.size === 1 ? [...fonts][0] : null,
821
848
  shape: shapes.size === 1 ? [...shapes][0] : null,
822
849
  floral: florals.size === 1 ? [...florals][0] : null,
823
- color: colors.size === 1 ? [...colors][0] : null,
850
+ color: colorSources.length > 0 && colors.size === 1 ? [...colors][0] : null,
824
851
  },
825
852
  isUniform: {
826
853
  font: fonts.size === 1,
827
854
  shape: shapes.size === 1,
828
855
  floral: florals.size === 1,
829
- color: colors.size === 1,
856
+ color: colorSources.length > 0 && colors.size === 1,
830
857
  },
831
858
  };
832
859
  };
@@ -841,7 +868,7 @@ const renderUniformLabels = (ctx, uniformProps, x, y, maxWidth, scaleFactor, ima
841
868
  let rendered = 0;
842
869
  if (values.font) {
843
870
  const allDefault = textPositions.every((p) => p.is_font_default === true);
844
- const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font}`;
871
+ const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font} (Custom)`;
845
872
  const result = wrapText(ctx, fontLabel, x, cursorY, maxWidth, fontSize + lineGap);
846
873
  cursorY += result.height;
847
874
  rendered++;
@@ -934,7 +961,7 @@ const renderTextPosition = (ctx, position, x, y, maxWidth, displayIndex, showLab
934
961
  if (showLabels.font && position.font) {
935
962
  const fontLabel = position.is_font_default === true
936
963
  ? `Font: ${position.font} (Mặc định)`
937
- : `Font: ${position.font}`;
964
+ : `Font: ${position.font} (Custom)`;
938
965
  const result = wrapText(ctx, fontLabel, x, currentY, maxWidth, otherFontSize + lineGap);
939
966
  currentY += result.height;
940
967
  drawnHeight += result.height;
@@ -964,7 +991,7 @@ const renderTextPosition = (ctx, position, x, y, maxWidth, displayIndex, showLab
964
991
  ctx.restore();
965
992
  return drawnHeight;
966
993
  };
967
- const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRefs) => {
994
+ const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRefs, options) => {
968
995
  const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;
969
996
  const lineGap = LAYOUT.LINE_GAP * scaleFactor;
970
997
  ctx.save();
@@ -997,7 +1024,10 @@ const renderIconPosition = (ctx, position, x, y, maxWidth, scaleFactor, imageRef
997
1024
  : position.color
998
1025
  ? [position.color]
999
1026
  : null;
1000
- if (iconColors?.length) {
1027
+ const layerCount = position.layer_colors?.length ?? 0;
1028
+ const hasMultiLayerColors = layerCount > 1;
1029
+ const shouldSkipColorSection = options?.hideColor && !hasMultiLayerColors;
1030
+ if (iconColors?.length && !shouldSkipColorSection) {
1001
1031
  const textMaxWidth = Math.max(LAYOUT.MIN_TEXT_WIDTH * scaleFactor, maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor);
1002
1032
  const colorResult = wrapText(ctx, `Màu chỉ: ${iconColors.join(", ")}`, x, cursorY, textMaxWidth, iconFontSize + lineGap);
1003
1033
  const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/EmbroideryQCImage.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { EmbroideryQCConfig, EmbroideryQCImageProps, Position } from \"../types\";\nimport \"./EmbroideryQCImage.css\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst COLOR_MAP: Record<string, string> = {\n \"Army (1394)\": \"#545541\",\n Army: \"#545541\",\n \"Black (8)\": \"#060608\",\n Black: \"#060608\",\n \"Bubblegum (1309)\": \"#E77B9F\",\n Bubblegum: \"#E77B9F\",\n \"Carolina Blue (1274)\": \"#608CC9\",\n \"Carolina Blue\": \"#608CC9\",\n \"Celadon (1098)\": \"#8EAD8D\",\n Celadon: \"#8EAD8D\",\n \"Coffee Bean (1145)\": \"#502B23\",\n \"Coffee Bean\": \"#502B23\",\n \"Daffodil (1180)\": \"#FBE30D\",\n Daffodil: \"#FBE30D\",\n \"Dark Gray (1131)\": \"#2E272E\",\n \"Dark Gray\": \"#2E272E\",\n \"Doe Skin Beige (1344)\": \"#AE9B8B\",\n \"Doe Skin Beige\": \"#AE9B8B\",\n \"Dusty Blue (1373)\": \"#7B90A9\",\n \"Dusty Blue\": \"#7B90A9\",\n \"Forest Green (1397)\": \"#073020\",\n \"Forest Green\": \"#073020\",\n \"Gold (1425)\": \"#D2920A\",\n Gold: \"#D2920A\",\n \"Gray (1118)\": \"#9999A3\",\n Gray: \"#9999A3\",\n \"Ivory (1072)\": \"#E3DAC9\",\n Ivory: \"#E3DAC9\",\n \"Lavender (1032)\": \"#9274B6\",\n Lavender: \"#9274B6\",\n \"Light Denim (1133)\": \"#366696\",\n \"Light Denim\": \"#366696\",\n \"Light Salmon (1018)\": \"#E0A793\",\n \"Light Salmon\": \"#E0A793\",\n \"Maroon (1374)\": \"#480C1C\",\n Maroon: \"#480C1C\",\n \"Navy Blue (1044)\": \"#04072A\",\n \"Navy Blue\": \"#04072A\",\n \"Olive Green (1157)\": \"#625E1F\",\n \"Olive Green\": \"#625E1F\",\n \"Orange (1278)\": \"#D45D03\",\n Orange: \"#D45D03\",\n \"Peach Blush (1053)\": \"#E2C0B6\",\n \"Peach Blush\": \"#E2C0B6\",\n \"Pink (1148)\": \"#EFAFBF\",\n Pink: \"#EFAFBF\",\n \"Purple (1412)\": \"#37196F\",\n Purple: \"#37196F\",\n \"Red (1037)\": \"#9D000B\",\n Red: \"#9D000B\",\n \"Silver Sage (1396)\": \"#424F45\",\n \"Silver Sage\": \"#424F45\",\n \"Summer Sky (1432)\": \"#65A8D2\",\n \"Summer Sky\": \"#65A8D2\",\n \"Terra Cotta (1477)\": \"#AE3111\",\n \"Terra Cotta\": \"#AE3111\",\n \"Sand (1055)\": \"#D2C2AB\",\n Sand: \"#D2C2AB\",\n \"White (9)\": \"#D8D7DC\",\n White: \"#D8D7DC\",\n};\n\nconst DEFAULT_ERROR_COLOR = \"#CC1F1A\";\nconst DEFAULT_WARNING_COLOR = \"#FF8C00\";\n\nconst BASE_URLS = {\n FONT: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\",\n ICON: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\",\n FLORAL:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\",\n THREAD_COLOR:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\",\n};\n\nconst LAYOUT = {\n // Font families\n HEADER_FONT_FAMILY: \"Times New Roman\",\n FONT_FAMILY: \"Arial\",\n\n // Font sizes (base values, will be multiplied by scaleFactor)\n HEADER_FONT_SIZE: 220,\n TEXT_FONT_SIZE: 200,\n OTHER_FONT_SIZE: 160,\n\n // Colors\n HEADER_COLOR: \"#000000\",\n LABEL_COLOR: \"#444444\",\n BACKGROUND_COLOR: \"#FFFFFF\",\n\n // Text alignment\n TEXT_ALIGN: \"left\" as CanvasTextAlign,\n TEXT_BASELINE: \"top\" as CanvasTextBaseline,\n\n // Spacing\n LINE_GAP: 40,\n PADDING: 40,\n SECTION_SPACING: 60,\n ELEMENT_SPACING: 100,\n SWATCH_SPACING: 25,\n FLORAL_SPACING: 300,\n\n // Visual styling\n SWATCH_HEIGHT_RATIO: 2.025,\n UNDERLINE_POSITION: 0.9,\n UNDERLINE_WIDTH: 10,\n\n // Swatch reserved space\n SWATCH_RESERVED_SPACE: 1000,\n MIN_TEXT_WIDTH: 400,\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nconst loadFont = (fontName: string): Promise<void> => {\n return new Promise((resolve) => {\n const fontUrl = `${BASE_URLS.FONT}/${encodeURIComponent(fontName)}.woff2`;\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\n\n fontFace\n .load()\n .then((loadedFont) => {\n document.fonts.add(loadedFont);\n resolve();\n })\n .catch(() => {\n console.warn(`Could not load font ${fontName} from CDN`);\n resolve();\n });\n });\n};\n\nconst getImageUrl = (\n type: \"icon\" | \"floral\" | \"threadColor\",\n value: string | number\n): string => {\n if (type === \"icon\") return `${BASE_URLS.ICON}/Icon ${value}.png`;\n if (type === \"floral\") return `${BASE_URLS.FLORAL}/${value}.png`;\n return `${BASE_URLS.THREAD_COLOR}/${value}.png`;\n};\n\ntype ImageMapRef = {\n current: Map<string, HTMLImageElement>;\n};\n\nexport interface EmbroideryQCImageRenderOptions {\n width?: number;\n height?: number;\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n}\n\nconst getProxyUrl = (url: string): string =>\n `https://proxy-img.c8p.workers.dev?url=${encodeURIComponent(url)}`;\n\nconst ensureImage = (existing?: HTMLImageElement | null): HTMLImageElement => {\n if (existing && existing.crossOrigin === \"anonymous\") {\n return existing;\n }\n\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.decoding = \"async\";\n return img;\n};\n\nconst loadImage = (url: string, imageRefs: ImageMapRef, onLoad: () => void) => {\n const existing = imageRefs.current.get(url);\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\"\n ) {\n return;\n }\n\n const img = ensureImage(existing);\n imageRefs.current.set(url, img);\n\n let attemptedProxy = existing?.dataset?.proxyUsed === \"true\";\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n };\n\n img.onload = () => {\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n img.src = getProxyUrl(url);\n return;\n }\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.src = attemptedProxy ? getProxyUrl(url) : url;\n};\n\nconst loadImageAsync = (\n url: string,\n imageRefs: ImageMapRef,\n cacheKey?: string\n): Promise<HTMLImageElement> => {\n const key = cacheKey ?? url;\n const existing = imageRefs.current.get(key) ?? imageRefs.current.get(url);\n\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\" &&\n existing.dataset?.proxyUsed !== undefined\n ) {\n if (existing !== imageRefs.current.get(key)) {\n imageRefs.current.set(key, existing);\n }\n if (existing !== imageRefs.current.get(url)) {\n imageRefs.current.set(url, existing);\n }\n return Promise.resolve(existing);\n }\n\n return new Promise((resolve) => {\n const target = ensureImage(existing);\n if (target !== existing) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n let attemptedProxy = target.dataset.proxyUsed === \"true\";\n\n const finalize = () => {\n target.onload = null;\n target.onerror = null;\n if (target.complete && target.naturalWidth > 0) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n resolve(target);\n };\n\n target.onload = finalize;\n target.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n target.src = getProxyUrl(url);\n return;\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n finalize();\n };\n\n const desiredSrc = attemptedProxy ? getProxyUrl(url) : url;\n\n if (target.src !== desiredSrc) {\n target.src = desiredSrc;\n } else if (target.complete && target.naturalWidth > 0) {\n finalize();\n }\n });\n};\n\nconst preloadFonts = async (config: EmbroideryQCConfig) => {\n if (config.error_message || !config.sides?.length) return;\n\n const fonts = new Set<string>();\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fonts.add(position.font);\n }\n });\n });\n\n if (fonts.size === 0) return;\n\n await Promise.all([...fonts].map((font) => loadFont(font)));\n};\n\nconst preloadImages = async (\n config: EmbroideryQCConfig,\n imageRefs: ImageMapRef\n) => {\n const entries: Array<{ url: string; cacheKey?: string }> = [];\n const seen = new Set<string>();\n\n if (config.image_url) {\n entries.push({ url: config.image_url, cacheKey: \"mockup\" });\n seen.add(config.image_url);\n }\n\n if (!config.sides?.length) {\n await Promise.all(\n entries.map(({ url, cacheKey }) =>\n loadImageAsync(url, imageRefs, cacheKey)\n )\n );\n return;\n }\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n const iconUrl = getImageUrl(\"icon\", position.icon);\n if (!seen.has(iconUrl)) {\n entries.push({ url: iconUrl });\n seen.add(iconUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.layer_colors?.forEach((color) => {\n const colorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(colorUrl)) {\n entries.push({ url: colorUrl });\n seen.add(colorUrl);\n }\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n const floralUrl = getImageUrl(\"floral\", position.floral_pattern);\n if (!seen.has(floralUrl)) {\n entries.push({ url: floralUrl });\n seen.add(floralUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.character_colors?.forEach((color) => {\n const characterColorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(characterColorUrl)) {\n entries.push({ url: characterColorUrl });\n seen.add(characterColorUrl);\n }\n });\n }\n });\n });\n\n if (entries.length === 0) return;\n\n await Promise.all(\n entries.map(({ url, cacheKey }) => loadImageAsync(url, imageRefs, cacheKey))\n );\n};\n\nconst wrapText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): { height: number; lastLineWidth: number; lastLineY: number } => {\n const words = text.split(\" \");\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line) => {\n ctx.fillText(line, x, currentY);\n currentY += lineHeight;\n });\n\n return {\n height: lines.length * lineHeight,\n lastLineWidth: ctx.measureText(lines[lines.length - 1]).width,\n lastLineY: y + (lines.length - 1) * lineHeight,\n };\n};\n\nconst buildWrappedLines = (\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] => {\n const words = text.split(\" \").filter((word) => word.length > 0);\n if (words.length === 0) return [\"\"];\n\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = `${currentLine} ${words[i]}`;\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n\n lines.push(currentLine);\n return lines;\n};\n\nconst wrapTextMultiColor = (\n ctx: CanvasRenderingContext2D,\n text: string,\n colors: string[],\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): number => {\n const words = text.split(\" \");\n const lines: string[] = [];\n const lineStartIndices: number[] = [0];\n let currentLine = words[0];\n let currentCharIndex = words[0].length;\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n lineStartIndices.push(currentCharIndex + 1);\n currentLine = words[i];\n currentCharIndex += words[i].length + 1;\n } else {\n currentLine = testLine;\n currentCharIndex += words[i].length + 1;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line, lineIdx) => {\n let currentX = x;\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const globalCharIdx = startCharIdx + i;\n const colorIndex = globalCharIdx % colors.length;\n const color = colors[colorIndex];\n ctx.fillStyle = COLOR_MAP[color] || LAYOUT.LABEL_COLOR;\n ctx.fillText(char, currentX, currentY);\n currentX += ctx.measureText(char).width;\n }\n currentY += lineHeight;\n });\n\n return lines.length * lineHeight;\n};\n\nconst drawSwatches = (\n ctx: CanvasRenderingContext2D,\n colors: string[],\n startX: number,\n startY: number,\n swatchHeight: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n) => {\n let swatchX = startX;\n colors.forEach((color) => {\n const url = getImageUrl(\"threadColor\", color);\n const img = imageRefs.current.get(url);\n if (img && img.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(swatchHeight * ratio));\n ctx.drawImage(img, swatchX, startY, swatchW, swatchHeight);\n swatchX += swatchW + LAYOUT.SWATCH_SPACING * scaleFactor;\n }\n });\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\n config,\n className = \"\",\n style = {},\n}) => {\n const [canvasSize] = useState({ width: 4200, height: 4800 });\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\n const [imagesLoaded, setImagesLoaded] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\n\n // Load fonts\n useEffect(() => {\n const loadFonts = async () => {\n if (config.error_message || !config.sides?.length) return;\n\n const fontsToLoad = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fontsToLoad.add(position.font);\n }\n });\n });\n\n for (const fontName of fontsToLoad) {\n if (!loadedFonts.has(fontName)) {\n try {\n await loadFont(fontName);\n setLoadedFonts((prev) => new Set(prev).add(fontName));\n } catch (error) {\n console.warn(`Could not load font ${fontName}:`, error);\n }\n }\n }\n };\n\n loadFonts();\n }, [config.sides, loadedFonts]);\n\n // Load images\n useEffect(() => {\n if (config.error_message || !config.sides?.length) return;\n\n const incrementCounter = () => setImagesLoaded((prev) => prev + 1);\n\n // Load mockup\n if (config.image_url) {\n loadImage(config.image_url, imageRefs, incrementCounter);\n }\n\n // Load all other images\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n loadImage(\n getImageUrl(\"icon\", position.icon),\n imageRefs,\n incrementCounter\n );\n }\n position.layer_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n loadImage(\n getImageUrl(\"floral\", position.floral_pattern),\n imageRefs,\n incrementCounter\n );\n }\n if (position.color) {\n loadImage(\n getImageUrl(\"threadColor\", position.color),\n imageRefs,\n incrementCounter\n );\n }\n position.character_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n });\n });\n }, [config]);\n\n // Render canvas\n useEffect(() => {\n const renderCanvas = () => {\n if (!canvasRef.current) return;\n renderEmbroideryCanvas(canvasRef.current, config, canvasSize, imageRefs);\n };\n\n const timer = setTimeout(renderCanvas, 100);\n return () => clearTimeout(timer);\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\n\n return (\n <div\n className={`render-embroidery${className ? ` ${className}` : \"\"}`}\n style={style}\n >\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\n </div>\n );\n};\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\nconst renderEmbroideryCanvas = (\n canvas: HTMLCanvasElement,\n config: EmbroideryQCConfig,\n canvasSize: { width: number; height: number },\n imageRefs: ImageMapRef\n) => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = canvasSize.width;\n canvas.height = canvasSize.height;\n\n ctx.fillStyle = LAYOUT.BACKGROUND_COLOR;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (config.error_message) {\n renderErrorState(ctx, canvas, config.error_message);\n return;\n }\n\n if (!config.sides?.length) return;\n\n ctx.textAlign = LAYOUT.TEXT_ALIGN;\n ctx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n // Calculate warning height (with scaleFactor = 1 for measurement)\n let warningHeight = 0;\n let warningLineHeight = 0;\n let warningLineCount = 0;\n if (config.warning_message) {\n const measureWarningCanvas = document.createElement(\"canvas\");\n measureWarningCanvas.width = canvas.width;\n measureWarningCanvas.height = canvas.height;\n const measureWarningCtx = measureWarningCanvas.getContext(\"2d\");\n if (measureWarningCtx) {\n measureWarningCtx.textAlign = \"left\";\n measureWarningCtx.textBaseline = \"top\";\n measureWarningCtx.font = `${LAYOUT.HEADER_FONT_SIZE * 0.7}px ${LAYOUT.FONT_FAMILY}`;\n const warningLines = buildWrappedLines(\n measureWarningCtx,\n `Note: ${config.warning_message.trim()}`,\n canvas.width - LAYOUT.PADDING * 4\n );\n warningLineCount = warningLines.length;\n warningLineHeight = LAYOUT.HEADER_FONT_SIZE * 0.7 + LAYOUT.LINE_GAP;\n warningHeight = warningLineCount * warningLineHeight + LAYOUT.PADDING;\n }\n }\n\n if (config.image_url) {\n const mockupImage = imageRefs.current.get(config.image_url);\n if (mockupImage) {\n imageRefs.current.set(\"mockup\", mockupImage);\n }\n }\n\n const floralAssets: HTMLImageElement[] = [];\n const seenFlorals = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.floral_pattern) {\n const url = getImageUrl(\"floral\", position.floral_pattern);\n if (!seenFlorals.has(url)) {\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalWidth > 0) {\n floralAssets.push(img);\n seenFlorals.add(url);\n }\n }\n }\n });\n });\n\n const measureCanvas = document.createElement(\"canvas\");\n measureCanvas.width = canvas.width;\n measureCanvas.height = canvas.height;\n const measureCtx = measureCanvas.getContext(\"2d\");\n if (!measureCtx) return;\n\n measureCtx.textAlign = LAYOUT.TEXT_ALIGN;\n measureCtx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n let measureY = LAYOUT.PADDING;\n const measureSpacing = LAYOUT.ELEMENT_SPACING;\n \n // Add warning text height (without bottom padding, no spacing)\n if (config.warning_message) {\n const warningTextHeight = warningHeight - LAYOUT.PADDING;\n measureY += warningTextHeight;\n }\n\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n measureCtx,\n side,\n measureY,\n canvas.width,\n 1,\n imageRefs\n );\n measureY += sideHeight + measureSpacing;\n });\n\n const scaleFactor = Math.max(\n 0.5,\n Math.min(1, (canvas.height - LAYOUT.PADDING - warningHeight) / measureY)\n );\n\n drawMockupAndFlorals(ctx, canvas, floralAssets, imageRefs);\n\n // Render warning with scaleFactor and get actual height\n let actualWarningHeight = 0;\n if (config.warning_message) {\n actualWarningHeight = renderWarning(ctx, canvas, config.warning_message, scaleFactor);\n }\n\n // Calculate currentY: padding top + actual warning height (no spacing)\n let currentY = LAYOUT.PADDING * scaleFactor;\n if (config.warning_message && actualWarningHeight > 0) {\n currentY += actualWarningHeight;\n }\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n ctx,\n side,\n currentY,\n canvas.width,\n scaleFactor,\n imageRefs\n );\n currentY += sideHeight + measureSpacing * scaleFactor;\n });\n};\n\nconst renderErrorState = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string\n) => {\n const sanitizedMessage = message.trim() || \"Đã xảy ra lỗi\";\n const horizontalPadding = LAYOUT.PADDING * 3;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE;\n const minFontSize = 60;\n const centerX = canvas.width / 2;\n\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_ERROR_COLOR;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `bold ${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const totalHeight = lines.length * lineHeight;\n const startY = Math.max(\n LAYOUT.PADDING * 2,\n canvas.height / 2 - totalHeight / 2\n );\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, centerX, y);\n });\n\n ctx.restore();\n};\n\nconst renderWarning = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string,\n scaleFactor: number = 1\n): number => {\n const sanitizedMessage = `Note: ${message.trim()}`;\n const horizontalPadding = LAYOUT.PADDING * 2 * scaleFactor;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE * 0.7 * scaleFactor;\n const minFontSize = 50 * scaleFactor;\n const leftX = LAYOUT.PADDING * scaleFactor;\n\n ctx.save();\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_WARNING_COLOR;\n ctx.font = `${baseFontSize}px ${LAYOUT.FONT_FAMILY}`;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP * scaleFactor;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * scaleFactor * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const startY = LAYOUT.PADDING * scaleFactor;\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, leftX, y);\n });\n\n ctx.restore();\n \n // Return the actual height of the warning (number of lines * lineHeight)\n return lines.length * lineHeight;\n};\n\nconst drawMockupAndFlorals = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n floralAssets: HTMLImageElement[],\n imageRefs: ImageMapRef\n) => {\n const mockupImg = imageRefs.current.get(\"mockup\");\n if (!mockupImg?.complete || !mockupImg.naturalWidth) return;\n\n const margin = LAYOUT.PADDING;\n const maxWidth = Math.min(1800, canvas.width * 0.375);\n const maxHeight = canvas.height * 0.375;\n const scale = Math.min(\n maxWidth / mockupImg.naturalWidth,\n maxHeight / mockupImg.naturalHeight\n );\n const width = Math.max(1, Math.floor(mockupImg.naturalWidth * scale));\n const height = Math.max(1, Math.floor(mockupImg.naturalHeight * scale));\n const x = canvas.width - margin - width;\n const y = canvas.height - margin - height;\n\n ctx.drawImage(mockupImg, x, y, width, height);\n\n // Draw florals\n if (floralAssets.length > 0) {\n const floralH = Math.min(900, height);\n let currentX = x - LAYOUT.FLORAL_SPACING;\n\n for (let i = floralAssets.length - 1; i >= 0; i--) {\n const img = floralAssets[i];\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\n const w = Math.max(1, Math.floor(floralH * ratio));\n currentX -= w;\n ctx.drawImage(img, currentX, y + height - floralH, w, floralH);\n currentX -= LAYOUT.FLORAL_SPACING;\n }\n }\n};\n\nconst renderSide = (\n ctx: CanvasRenderingContext2D,\n side: any,\n startY: number,\n width: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n let currentY = startY;\n const padding = LAYOUT.PADDING * scaleFactor;\n const sideWidth = width - 2 * padding;\n\n // Draw header\n ctx.save();\n const headerFontSize = LAYOUT.HEADER_FONT_SIZE * scaleFactor;\n ctx.font = `bold ${headerFontSize}px ${LAYOUT.HEADER_FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.HEADER_COLOR;\n\n const headerResult = wrapText(\n ctx,\n side.print_side.toUpperCase(),\n padding,\n currentY,\n sideWidth,\n headerFontSize\n );\n\n // Draw underline\n const underlineY =\n headerResult.lastLineY + headerFontSize * LAYOUT.UNDERLINE_POSITION;\n ctx.strokeStyle = LAYOUT.HEADER_COLOR;\n ctx.lineWidth = LAYOUT.UNDERLINE_WIDTH * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(padding, underlineY);\n ctx.lineTo(padding + headerResult.lastLineWidth, underlineY);\n ctx.stroke();\n\n currentY += headerResult.height + LAYOUT.SECTION_SPACING * scaleFactor;\n ctx.restore();\n\n // Compute uniform properties\n const textPositions = side.positions.filter(\n (p: Position) => p.type === \"TEXT\"\n );\n const uniformProps = computeUniformProperties(textPositions);\n\n // Render uniform labels (only if more than 1 TEXT position)\n if (textPositions.length > 1) {\n currentY += renderUniformLabels(\n ctx,\n uniformProps,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n textPositions\n );\n }\n\n // Group text positions by common properties\n const textGroups = groupTextPositions(textPositions);\n\n // Render text positions (with proper spacing between groups)\n let textCounter = 1;\n textGroups.forEach((group, groupIndex) => {\n group.forEach((position, index) => {\n // Add extra spacing between different groups\n if (index === 0 && groupIndex !== 0) {\n currentY += LAYOUT.SECTION_SPACING * scaleFactor;\n }\n\n // If only 1 TEXT position, show all labels (no uniform labels rendered)\n const showLabels =\n textPositions.length === 1\n ? { font: true, shape: true, floral: true, color: true }\n : {\n font: !uniformProps.isUniform.font,\n shape: !uniformProps.isUniform.shape,\n floral: !uniformProps.isUniform.floral,\n color: !uniformProps.isUniform.color,\n };\n const height = renderTextPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n textCounter,\n showLabels,\n scaleFactor,\n imageRefs\n );\n if (height > 0) {\n currentY += height + LAYOUT.PADDING * scaleFactor;\n textCounter++;\n }\n });\n });\n\n // Render icon positions\n currentY += LAYOUT.LINE_GAP * scaleFactor;\n side.positions.forEach((position: Position) => {\n if (position.type === \"ICON\") {\n currentY += renderIconPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs\n );\n currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;\n }\n });\n\n return currentY - startY;\n};\n\nconst groupTextPositions = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n): Array<Array<Position & { type: \"TEXT\" }>> => {\n const groups: Array<Array<Position & { type: \"TEXT\" }>> = [];\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\n let currentProps: any = null;\n\n textPositions.forEach((position) => {\n const posProps = {\n font: position.font,\n text_shape: position.text_shape,\n color: position.color,\n character_colors: position.character_colors?.join(\",\"),\n };\n\n if (\n !currentGroup ||\n currentProps.font !== posProps.font ||\n currentProps.text_shape !== posProps.text_shape ||\n currentProps.color !== posProps.color ||\n currentProps.character_colors !== posProps.character_colors\n ) {\n if (currentGroup) {\n groups.push(currentGroup);\n }\n currentGroup = [position];\n currentProps = posProps;\n } else {\n currentGroup.push(position);\n }\n });\n\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n return groups;\n};\n\nconst computeUniformProperties = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n) => {\n if (textPositions.length === 0) {\n return {\n values: { font: null, shape: null, floral: null, color: null },\n isUniform: { font: false, shape: false, floral: false, color: false },\n };\n }\n\n const fonts = new Set(textPositions.map((p) => p.font));\n const shapes = new Set(textPositions.map((p) => p.text_shape));\n const florals = new Set(textPositions.map((p) => p.floral_pattern ?? \"None\"));\n const colors = new Set(\n textPositions.map((p) =>\n p.character_colors?.length\n ? p.character_colors.join(\",\")\n : p.color ?? \"None\"\n )\n );\n\n return {\n values: {\n font: fonts.size === 1 ? [...fonts][0] : null,\n shape: shapes.size === 1 ? [...shapes][0] : null,\n floral: florals.size === 1 ? [...florals][0] : null,\n color: colors.size === 1 ? [...colors][0] : null,\n },\n isUniform: {\n font: fonts.size === 1,\n shape: shapes.size === 1,\n floral: florals.size === 1,\n color: colors.size === 1,\n },\n };\n};\n\nconst renderUniformLabels = (\n ctx: CanvasRenderingContext2D,\n uniformProps: ReturnType<typeof computeUniformProperties>,\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n textPositions: Array<Position & { type: \"TEXT\" }>\n): number => {\n const { values } = uniformProps;\n const fontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n let rendered = 0;\n\n if (values.font) {\n const allDefault = textPositions.every((p) => p.is_font_default === true);\n const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font}`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.shape && values.shape !== \"None\") {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${values.shape}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.color && values.color !== \"None\") {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${values.color}`,\n x,\n cursorY,\n textMaxWidth,\n fontSize + lineGap\n );\n\n const swatchH = Math.floor(fontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\n const colors = values.color.includes(\",\")\n ? values.color.split(\",\").map((s) => s.trim())\n : [values.color];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.floral && values.floral !== \"None\") {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${values.floral}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (rendered > 0) cursorY += LAYOUT.SECTION_SPACING * scaleFactor;\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst renderTextPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"TEXT\" },\n x: number,\n y: number,\n maxWidth: number,\n displayIndex: number,\n showLabels: {\n font: boolean;\n shape: boolean;\n floral: boolean;\n color: boolean;\n },\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n ctx.save();\n\n const textFontSize = LAYOUT.TEXT_FONT_SIZE * scaleFactor;\n const otherFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n let currentY = y;\n let drawnHeight = 0;\n\n // Draw label\n const textLabel = `Text ${displayIndex}: `;\n ctx.font = `bold ${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const labelWidth = ctx.measureText(textLabel).width;\n ctx.fillText(textLabel, x, currentY);\n\n const textMaxWidth = maxWidth - labelWidth;\n\n // Get display text (handle empty/null/undefined)\n const isEmptyText = !position.text || position.text.trim() === \"\";\n\n // Draw text content\n if (isEmptyText) {\n ctx.font = `${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n \"(không có text)\",\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.floral_pattern) {\n // Khi có floral_pattern, dùng màu mặc định như label\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.character_colors?.length) {\n ctx.font = `${textFontSize}px ${position.font}`;\n const textHeight = wrapTextMultiColor(\n ctx,\n position.text,\n position.character_colors,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textHeight;\n drawnHeight += textHeight;\n } else {\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n }\n\n // Draw additional labels (skip when text is empty)\n if (!isEmptyText) {\n currentY += lineGap;\n ctx.font = `${otherFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n if (showLabels.shape && position.text_shape) {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${position.text_shape}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.font && position.font) {\n const fontLabel =\n position.is_font_default === true\n ? `Font: ${position.font} (Mặc định)`\n : `Font: ${position.font}`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.color) {\n const colorValue = position.character_colors?.join(\", \") || position.color;\n if (colorValue) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${colorValue}`,\n x,\n currentY,\n textMaxWidth,\n otherFontSize + lineGap\n );\n\n const swatchH = Math.floor(otherFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n result.lastLineY + Math.floor(otherFontSize / 2 - swatchH / 2);\n const colors = position.character_colors || [position.color!];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n if (showLabels.floral && position.floral_pattern) {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${position.floral_pattern}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n ctx.restore();\n return drawnHeight;\n};\n\nconst renderIconPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"ICON\" },\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${iconFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n const iconText =\n position.note ? `Icon: ${position.note}` :\n position.icon === 0\n ? `Icon: (icon mặc định theo file thêu)`\n : `Icon: ${position.icon}`;\n const iconResult = wrapText(\n ctx,\n iconText,\n x,\n cursorY,\n maxWidth,\n iconFontSize + lineGap\n );\n\n // Draw icon image\n if (position.icon !== 0) {\n const url = getImageUrl(\"icon\", position.icon);\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(iconFontSize * ratio));\n const iconX =\n x +\n Math.ceil(iconResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const iconY =\n iconResult.lastLineY + Math.floor(iconFontSize / 2 - iconFontSize / 2);\n ctx.drawImage(img, iconX, iconY, swatchW, iconFontSize);\n }\n }\n\n cursorY += iconResult.height;\n\n // Draw color swatches (prefer layer_colors, fallback to single color)\n const iconColors = position.layer_colors?.length\n ? position.layer_colors\n : position.color\n ? [position.color]\n : null;\n\n if (iconColors?.length) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const colorResult = wrapText(\n ctx,\n `Màu chỉ: ${iconColors.join(\", \")}`,\n x,\n cursorY,\n textMaxWidth,\n iconFontSize + lineGap\n );\n\n const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(colorResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n colorResult.lastLineY + Math.floor(iconFontSize / 2 - swatchH / 2);\n\n drawSwatches(ctx, iconColors, swatchX, swatchY, swatchH, scaleFactor, imageRefs);\n cursorY += colorResult.height;\n }\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst prepareExportCanvas = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<HTMLCanvasElement | null> => {\n const { width = 4200, height = 4800 } = options;\n\n const canvas = document.createElement(\"canvas\");\n const imageRefs: ImageMapRef = {\n current: new Map<string, HTMLImageElement>(),\n };\n\n await preloadFonts(config);\n await preloadImages(config, imageRefs);\n\n renderEmbroideryCanvas(canvas, config, { width, height }, imageRefs);\n\n if (!canvas.width || !canvas.height) {\n return null;\n }\n\n return canvas;\n};\n\nexport const generateEmbroideryQCImageBlob = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<Blob | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageBlob requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n }\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas || typeof canvas.toBlob !== \"function\") {\n return null;\n }\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((result) => resolve(result), mimeType, quality);\n });\n\n return blob;\n};\n\nexport const generateEmbroideryQCImageData = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<string | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageData requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n };\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas) {\n return null;\n }\n\n if (mimeType === \"image/png\" || typeof quality === \"undefined\") {\n return canvas.toDataURL(mimeType);\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n\nexport default EmbroideryQCImage;\n"],"names":["useState","useRef","useEffect","_jsx"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/EmbroideryQCImage.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { EmbroideryQCConfig, EmbroideryQCImageProps, Position } from \"../types\";\nimport \"./EmbroideryQCImage.css\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst COLOR_MAP: Record<string, string> = {\n \"Army (1394)\": \"#545541\",\n Army: \"#545541\",\n \"Black (8)\": \"#060608\",\n Black: \"#060608\",\n \"Bubblegum (1309)\": \"#E77B9F\",\n Bubblegum: \"#E77B9F\",\n \"Carolina Blue (1274)\": \"#608CC9\",\n \"Carolina Blue\": \"#608CC9\",\n \"Celadon (1098)\": \"#8EAD8D\",\n Celadon: \"#8EAD8D\",\n \"Coffee Bean (1145)\": \"#502B23\",\n \"Coffee Bean\": \"#502B23\",\n \"Daffodil (1180)\": \"#FBE30D\",\n Daffodil: \"#FBE30D\",\n \"Dark Gray (1131)\": \"#2E272E\",\n \"Dark Gray\": \"#2E272E\",\n \"Doe Skin Beige (1344)\": \"#AE9B8B\",\n \"Doe Skin Beige\": \"#AE9B8B\",\n \"Dusty Blue (1373)\": \"#7B90A9\",\n \"Dusty Blue\": \"#7B90A9\",\n \"Forest Green (1397)\": \"#073020\",\n \"Forest Green\": \"#073020\",\n \"Gold (1425)\": \"#D2920A\",\n Gold: \"#D2920A\",\n \"Gray (1118)\": \"#9999A3\",\n Gray: \"#9999A3\",\n \"Ivory (1072)\": \"#E3DAC9\",\n Ivory: \"#E3DAC9\",\n \"Lavender (1032)\": \"#9274B6\",\n Lavender: \"#9274B6\",\n \"Light Denim (1133)\": \"#366696\",\n \"Light Denim\": \"#366696\",\n \"Light Salmon (1018)\": \"#E0A793\",\n \"Light Salmon\": \"#E0A793\",\n \"Maroon (1374)\": \"#480C1C\",\n Maroon: \"#480C1C\",\n \"Navy Blue (1044)\": \"#04072A\",\n \"Navy Blue\": \"#04072A\",\n \"Olive Green (1157)\": \"#625E1F\",\n \"Olive Green\": \"#625E1F\",\n \"Orange (1278)\": \"#D45D03\",\n Orange: \"#D45D03\",\n \"Peach Blush (1053)\": \"#E2C0B6\",\n \"Peach Blush\": \"#E2C0B6\",\n \"Pink (1148)\": \"#EFAFBF\",\n Pink: \"#EFAFBF\",\n \"Purple (1412)\": \"#37196F\",\n Purple: \"#37196F\",\n \"Red (1037)\": \"#9D000B\",\n Red: \"#9D000B\",\n \"Silver Sage (1396)\": \"#424F45\",\n \"Silver Sage\": \"#424F45\",\n \"Summer Sky (1432)\": \"#65A8D2\",\n \"Summer Sky\": \"#65A8D2\",\n \"Terra Cotta (1477)\": \"#AE3111\",\n \"Terra Cotta\": \"#AE3111\",\n \"Sand (1055)\": \"#D2C2AB\",\n Sand: \"#D2C2AB\",\n \"White (9)\": \"#D8D7DC\",\n White: \"#D8D7DC\",\n};\n\nconst DEFAULT_ERROR_COLOR = \"#CC1F1A\";\nconst DEFAULT_WARNING_COLOR = \"#FF8C00\";\n\nconst BASE_URLS = {\n FONT: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\",\n ICON: \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\",\n FLORAL:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\",\n THREAD_COLOR:\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\",\n};\n\nconst LAYOUT = {\n // Font families\n HEADER_FONT_FAMILY: \"Times New Roman\",\n FONT_FAMILY: \"Arial\",\n\n // Font sizes (base values, will be multiplied by scaleFactor)\n HEADER_FONT_SIZE: 220,\n TEXT_FONT_SIZE: 200,\n OTHER_FONT_SIZE: 160,\n\n // Colors\n HEADER_COLOR: \"#000000\",\n LABEL_COLOR: \"#444444\",\n BACKGROUND_COLOR: \"#FFFFFF\",\n\n // Text alignment\n TEXT_ALIGN: \"left\" as CanvasTextAlign,\n TEXT_BASELINE: \"top\" as CanvasTextBaseline,\n\n // Spacing\n LINE_GAP: 40,\n PADDING: 40,\n SECTION_SPACING: 60,\n ELEMENT_SPACING: 100,\n SWATCH_SPACING: 25,\n FLORAL_SPACING: 300,\n\n // Visual styling\n SWATCH_HEIGHT_RATIO: 2.025,\n UNDERLINE_POSITION: 0.9,\n UNDERLINE_WIDTH: 10,\n\n // Swatch reserved space\n SWATCH_RESERVED_SPACE: 1000,\n MIN_TEXT_WIDTH: 400,\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nconst loadFont = (fontName: string): Promise<void> => {\n return new Promise((resolve) => {\n const fontUrl = `${BASE_URLS.FONT}/${encodeURIComponent(fontName)}.woff2`;\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\n\n fontFace\n .load()\n .then((loadedFont) => {\n document.fonts.add(loadedFont);\n resolve();\n })\n .catch(() => {\n console.warn(`Could not load font ${fontName} from CDN`);\n resolve();\n });\n });\n};\n\nconst getImageUrl = (\n type: \"icon\" | \"floral\" | \"threadColor\",\n value: string | number\n): string => {\n if (type === \"icon\") return `${BASE_URLS.ICON}/Icon ${value}.png`;\n if (type === \"floral\") return `${BASE_URLS.FLORAL}/${value}.png`;\n return `${BASE_URLS.THREAD_COLOR}/${value}.png`;\n};\n\ntype ImageMapRef = {\n current: Map<string, HTMLImageElement>;\n};\n\nexport interface EmbroideryQCImageRenderOptions {\n width?: number;\n height?: number;\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n}\n\nconst getProxyUrl = (url: string): string =>\n `https://proxy-img.c8p.workers.dev?url=${encodeURIComponent(url)}`;\n\nconst ensureImage = (existing?: HTMLImageElement | null): HTMLImageElement => {\n if (existing && existing.crossOrigin === \"anonymous\") {\n return existing;\n }\n\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.decoding = \"async\";\n return img;\n};\n\nconst loadImage = (url: string, imageRefs: ImageMapRef, onLoad: () => void) => {\n const existing = imageRefs.current.get(url);\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\"\n ) {\n return;\n }\n\n const img = ensureImage(existing);\n imageRefs.current.set(url, img);\n\n let attemptedProxy = existing?.dataset?.proxyUsed === \"true\";\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n };\n\n img.onload = () => {\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n img.src = getProxyUrl(url);\n return;\n }\n img.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n cleanup();\n onLoad();\n };\n\n img.src = attemptedProxy ? getProxyUrl(url) : url;\n};\n\nconst loadImageAsync = (\n url: string,\n imageRefs: ImageMapRef,\n cacheKey?: string\n): Promise<HTMLImageElement> => {\n const key = cacheKey ?? url;\n const existing = imageRefs.current.get(key) ?? imageRefs.current.get(url);\n\n if (\n existing?.complete &&\n existing.naturalWidth > 0 &&\n existing.crossOrigin === \"anonymous\" &&\n existing.dataset?.proxyUsed !== undefined\n ) {\n if (existing !== imageRefs.current.get(key)) {\n imageRefs.current.set(key, existing);\n }\n if (existing !== imageRefs.current.get(url)) {\n imageRefs.current.set(url, existing);\n }\n return Promise.resolve(existing);\n }\n\n return new Promise((resolve) => {\n const target = ensureImage(existing);\n if (target !== existing) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n let attemptedProxy = target.dataset.proxyUsed === \"true\";\n\n const finalize = () => {\n target.onload = null;\n target.onerror = null;\n if (target.complete && target.naturalWidth > 0) {\n imageRefs.current.set(key, target);\n imageRefs.current.set(url, target);\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n resolve(target);\n };\n\n target.onload = finalize;\n target.onerror = () => {\n if (!attemptedProxy) {\n attemptedProxy = true;\n target.src = getProxyUrl(url);\n return;\n }\n target.dataset.proxyUsed = attemptedProxy ? \"true\" : \"false\";\n finalize();\n };\n\n const desiredSrc = attemptedProxy ? getProxyUrl(url) : url;\n\n if (target.src !== desiredSrc) {\n target.src = desiredSrc;\n } else if (target.complete && target.naturalWidth > 0) {\n finalize();\n }\n });\n};\n\nconst preloadFonts = async (config: EmbroideryQCConfig) => {\n if (config.error_message || !config.sides?.length) return;\n\n const fonts = new Set<string>();\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fonts.add(position.font);\n }\n });\n });\n\n if (fonts.size === 0) return;\n\n await Promise.all([...fonts].map((font) => loadFont(font)));\n};\n\nconst preloadImages = async (\n config: EmbroideryQCConfig,\n imageRefs: ImageMapRef\n) => {\n const entries: Array<{ url: string; cacheKey?: string }> = [];\n const seen = new Set<string>();\n\n if (config.image_url) {\n entries.push({ url: config.image_url, cacheKey: \"mockup\" });\n seen.add(config.image_url);\n }\n\n if (!config.sides?.length) {\n await Promise.all(\n entries.map(({ url, cacheKey }) =>\n loadImageAsync(url, imageRefs, cacheKey)\n )\n );\n return;\n }\n\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n const iconUrl = getImageUrl(\"icon\", position.icon);\n if (!seen.has(iconUrl)) {\n entries.push({ url: iconUrl });\n seen.add(iconUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.layer_colors?.forEach((color) => {\n const colorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(colorUrl)) {\n entries.push({ url: colorUrl });\n seen.add(colorUrl);\n }\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n const floralUrl = getImageUrl(\"floral\", position.floral_pattern);\n if (!seen.has(floralUrl)) {\n entries.push({ url: floralUrl });\n seen.add(floralUrl);\n }\n }\n\n if (position.color) {\n const threadUrl = getImageUrl(\"threadColor\", position.color);\n if (!seen.has(threadUrl)) {\n entries.push({ url: threadUrl });\n seen.add(threadUrl);\n }\n }\n\n position.character_colors?.forEach((color) => {\n const characterColorUrl = getImageUrl(\"threadColor\", color);\n if (!seen.has(characterColorUrl)) {\n entries.push({ url: characterColorUrl });\n seen.add(characterColorUrl);\n }\n });\n }\n });\n });\n\n if (entries.length === 0) return;\n\n await Promise.all(\n entries.map(({ url, cacheKey }) => loadImageAsync(url, imageRefs, cacheKey))\n );\n};\n\nconst wrapText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): { height: number; lastLineWidth: number; lastLineY: number } => {\n const words = text.split(\" \");\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line) => {\n ctx.fillText(line, x, currentY);\n currentY += lineHeight;\n });\n\n return {\n height: lines.length * lineHeight,\n lastLineWidth: ctx.measureText(lines[lines.length - 1]).width,\n lastLineY: y + (lines.length - 1) * lineHeight,\n };\n};\n\nconst buildWrappedLines = (\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] => {\n const words = text.split(\" \").filter((word) => word.length > 0);\n if (words.length === 0) return [\"\"];\n\n const lines: string[] = [];\n let currentLine = words[0];\n\n for (let i = 1; i < words.length; i++) {\n const testLine = `${currentLine} ${words[i]}`;\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = words[i];\n } else {\n currentLine = testLine;\n }\n }\n\n lines.push(currentLine);\n return lines;\n};\n\nconst wrapTextMultiColor = (\n ctx: CanvasRenderingContext2D,\n text: string,\n colors: string[],\n x: number,\n y: number,\n maxWidth: number,\n lineHeight: number\n): number => {\n const words = text.split(\" \");\n const lines: string[] = [];\n const lineStartIndices: number[] = [0];\n let currentLine = words[0];\n let currentCharIndex = words[0].length;\n\n for (let i = 1; i < words.length; i++) {\n const testLine = currentLine + \" \" + words[i];\n if (ctx.measureText(testLine).width > maxWidth && currentLine.length > 0) {\n lines.push(currentLine);\n lineStartIndices.push(currentCharIndex + 1);\n currentLine = words[i];\n currentCharIndex += words[i].length + 1;\n } else {\n currentLine = testLine;\n currentCharIndex += words[i].length + 1;\n }\n }\n lines.push(currentLine);\n\n let currentY = y;\n lines.forEach((line, lineIdx) => {\n let currentX = x;\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const globalCharIdx = startCharIdx + i;\n const colorIndex = globalCharIdx % colors.length;\n const color = colors[colorIndex];\n ctx.fillStyle = COLOR_MAP[color] || LAYOUT.LABEL_COLOR;\n ctx.fillText(char, currentX, currentY);\n currentX += ctx.measureText(char).width;\n }\n currentY += lineHeight;\n });\n\n return lines.length * lineHeight;\n};\n\nconst drawSwatches = (\n ctx: CanvasRenderingContext2D,\n colors: string[],\n startX: number,\n startY: number,\n swatchHeight: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n) => {\n let swatchX = startX;\n colors.forEach((color) => {\n const url = getImageUrl(\"threadColor\", color);\n const img = imageRefs.current.get(url);\n if (img && img.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(swatchHeight * ratio));\n ctx.drawImage(img, swatchX, startY, swatchW, swatchHeight);\n swatchX += swatchW + LAYOUT.SWATCH_SPACING * scaleFactor;\n }\n });\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\n config,\n className = \"\",\n style = {},\n}) => {\n const [canvasSize] = useState({ width: 4200, height: 4800 });\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\n const [imagesLoaded, setImagesLoaded] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\n\n // Load fonts\n useEffect(() => {\n const loadFonts = async () => {\n if (config.error_message || !config.sides?.length) return;\n\n const fontsToLoad = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.font) {\n fontsToLoad.add(position.font);\n }\n });\n });\n\n for (const fontName of fontsToLoad) {\n if (!loadedFonts.has(fontName)) {\n try {\n await loadFont(fontName);\n setLoadedFonts((prev) => new Set(prev).add(fontName));\n } catch (error) {\n console.warn(`Could not load font ${fontName}:`, error);\n }\n }\n }\n };\n\n loadFonts();\n }, [config.sides, loadedFonts]);\n\n // Load images\n useEffect(() => {\n if (config.error_message || !config.sides?.length) return;\n\n const incrementCounter = () => setImagesLoaded((prev) => prev + 1);\n\n // Load mockup\n if (config.image_url) {\n loadImage(config.image_url, imageRefs, incrementCounter);\n }\n\n // Load all other images\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"ICON\") {\n if (position.icon !== 0) {\n loadImage(\n getImageUrl(\"icon\", position.icon),\n imageRefs,\n incrementCounter\n );\n }\n position.layer_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n\n if (position.type === \"TEXT\") {\n if (position.floral_pattern) {\n loadImage(\n getImageUrl(\"floral\", position.floral_pattern),\n imageRefs,\n incrementCounter\n );\n }\n if (position.color) {\n loadImage(\n getImageUrl(\"threadColor\", position.color),\n imageRefs,\n incrementCounter\n );\n }\n position.character_colors?.forEach((color) => {\n loadImage(\n getImageUrl(\"threadColor\", color),\n imageRefs,\n incrementCounter\n );\n });\n }\n });\n });\n }, [config]);\n\n // Render canvas\n useEffect(() => {\n const renderCanvas = () => {\n if (!canvasRef.current) return;\n renderEmbroideryCanvas(canvasRef.current, config, canvasSize, imageRefs);\n };\n\n const timer = setTimeout(renderCanvas, 100);\n return () => clearTimeout(timer);\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\n\n return (\n <div\n className={`render-embroidery${className ? ` ${className}` : \"\"}`}\n style={style}\n >\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\n </div>\n );\n};\n\n// ============================================================================\n// RENDERING FUNCTIONS\n// ============================================================================\n\nconst renderEmbroideryCanvas = (\n canvas: HTMLCanvasElement,\n config: EmbroideryQCConfig,\n canvasSize: { width: number; height: number },\n imageRefs: ImageMapRef\n) => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = canvasSize.width;\n canvas.height = canvasSize.height;\n\n ctx.fillStyle = LAYOUT.BACKGROUND_COLOR;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (config.error_message) {\n renderErrorState(ctx, canvas, config.error_message);\n return;\n }\n\n if (!config.sides?.length) return;\n\n ctx.textAlign = LAYOUT.TEXT_ALIGN;\n ctx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n // Calculate warning height (with scaleFactor = 1 for measurement)\n let warningHeight = 0;\n let warningLineHeight = 0;\n let warningLineCount = 0;\n if (config.warning_message) {\n const measureWarningCanvas = document.createElement(\"canvas\");\n measureWarningCanvas.width = canvas.width;\n measureWarningCanvas.height = canvas.height;\n const measureWarningCtx = measureWarningCanvas.getContext(\"2d\");\n if (measureWarningCtx) {\n measureWarningCtx.textAlign = \"left\";\n measureWarningCtx.textBaseline = \"top\";\n measureWarningCtx.font = `${LAYOUT.HEADER_FONT_SIZE * 0.7}px ${LAYOUT.FONT_FAMILY}`;\n const warningLines = buildWrappedLines(\n measureWarningCtx,\n `Note: ${config.warning_message.trim()}`,\n canvas.width - LAYOUT.PADDING * 4\n );\n warningLineCount = warningLines.length;\n warningLineHeight = LAYOUT.HEADER_FONT_SIZE * 0.7 + LAYOUT.LINE_GAP;\n warningHeight = warningLineCount * warningLineHeight + LAYOUT.PADDING;\n }\n }\n\n if (config.image_url) {\n const mockupImage = imageRefs.current.get(config.image_url);\n if (mockupImage) {\n imageRefs.current.set(\"mockup\", mockupImage);\n }\n }\n\n const floralAssets: HTMLImageElement[] = [];\n const seenFlorals = new Set<string>();\n config.sides.forEach((side) => {\n side.positions.forEach((position) => {\n if (position.type === \"TEXT\" && position.floral_pattern) {\n const url = getImageUrl(\"floral\", position.floral_pattern);\n if (!seenFlorals.has(url)) {\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalWidth > 0) {\n floralAssets.push(img);\n seenFlorals.add(url);\n }\n }\n }\n });\n });\n\n const measureCanvas = document.createElement(\"canvas\");\n measureCanvas.width = canvas.width;\n measureCanvas.height = canvas.height;\n const measureCtx = measureCanvas.getContext(\"2d\");\n if (!measureCtx) return;\n\n measureCtx.textAlign = LAYOUT.TEXT_ALIGN;\n measureCtx.textBaseline = LAYOUT.TEXT_BASELINE;\n\n let measureY = LAYOUT.PADDING;\n const measureSpacing = LAYOUT.ELEMENT_SPACING;\n \n // Add warning text height (without bottom padding, no spacing)\n if (config.warning_message) {\n const warningTextHeight = warningHeight - LAYOUT.PADDING;\n measureY += warningTextHeight;\n }\n\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n measureCtx,\n side,\n measureY,\n canvas.width,\n 1,\n imageRefs\n );\n measureY += sideHeight + measureSpacing;\n });\n\n const scaleFactor = Math.max(\n 0.5,\n Math.min(1, (canvas.height - LAYOUT.PADDING - warningHeight) / measureY)\n );\n\n drawMockupAndFlorals(ctx, canvas, floralAssets, imageRefs);\n\n // Render warning with scaleFactor and get actual height\n let actualWarningHeight = 0;\n if (config.warning_message) {\n actualWarningHeight = renderWarning(ctx, canvas, config.warning_message, scaleFactor);\n }\n\n // Calculate currentY: padding top + actual warning height (no spacing)\n let currentY = LAYOUT.PADDING * scaleFactor;\n if (config.warning_message && actualWarningHeight > 0) {\n currentY += actualWarningHeight;\n }\n config.sides.forEach((side) => {\n const sideHeight = renderSide(\n ctx,\n side,\n currentY,\n canvas.width,\n scaleFactor,\n imageRefs\n );\n currentY += sideHeight + measureSpacing * scaleFactor;\n });\n};\n\nconst renderErrorState = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string\n) => {\n const sanitizedMessage = message.trim() || \"Đã xảy ra lỗi\";\n const horizontalPadding = LAYOUT.PADDING * 3;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE;\n const minFontSize = 60;\n const centerX = canvas.width / 2;\n\n ctx.save();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_ERROR_COLOR;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `bold ${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const totalHeight = lines.length * lineHeight;\n const startY = Math.max(\n LAYOUT.PADDING * 2,\n canvas.height / 2 - totalHeight / 2\n );\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, centerX, y);\n });\n\n ctx.restore();\n};\n\nconst renderWarning = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n message: string,\n scaleFactor: number = 1\n): number => {\n const sanitizedMessage = `Note: ${message.trim()}`;\n const horizontalPadding = LAYOUT.PADDING * 2 * scaleFactor;\n const maxWidth = canvas.width - horizontalPadding * 2;\n const baseFontSize = LAYOUT.HEADER_FONT_SIZE * 0.7 * scaleFactor;\n const minFontSize = 50 * scaleFactor;\n const leftX = LAYOUT.PADDING * scaleFactor;\n\n ctx.save();\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = DEFAULT_WARNING_COLOR;\n ctx.font = `${baseFontSize}px ${LAYOUT.FONT_FAMILY}`;\n\n let fontSize = baseFontSize;\n let lineGap = LAYOUT.LINE_GAP * scaleFactor;\n let lineHeight = fontSize + lineGap;\n\n const adjustMetrics = () => {\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n lineGap = LAYOUT.LINE_GAP * scaleFactor * (fontSize / baseFontSize);\n lineHeight = fontSize + lineGap;\n };\n\n adjustMetrics();\n let lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n let longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n\n while (longestLineWidth > maxWidth && fontSize > minFontSize) {\n fontSize = Math.max(minFontSize, Math.floor(fontSize * 0.9));\n adjustMetrics();\n lines = buildWrappedLines(ctx, sanitizedMessage, maxWidth);\n longestLineWidth = Math.max(\n ...lines.map((line) => ctx.measureText(line).width)\n );\n }\n\n const startY = LAYOUT.PADDING * scaleFactor;\n\n lines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, leftX, y);\n });\n\n ctx.restore();\n \n // Return the actual height of the warning (number of lines * lineHeight)\n return lines.length * lineHeight;\n};\n\nconst drawMockupAndFlorals = (\n ctx: CanvasRenderingContext2D,\n canvas: HTMLCanvasElement,\n floralAssets: HTMLImageElement[],\n imageRefs: ImageMapRef\n) => {\n const mockupImg = imageRefs.current.get(\"mockup\");\n if (!mockupImg?.complete || !mockupImg.naturalWidth) return;\n\n const margin = LAYOUT.PADDING;\n const maxWidth = Math.min(1800, canvas.width * 0.375);\n const maxHeight = canvas.height * 0.375;\n const scale = Math.min(\n maxWidth / mockupImg.naturalWidth,\n maxHeight / mockupImg.naturalHeight\n );\n const width = Math.max(1, Math.floor(mockupImg.naturalWidth * scale));\n const height = Math.max(1, Math.floor(mockupImg.naturalHeight * scale));\n const x = canvas.width - margin - width;\n const y = canvas.height - margin - height;\n\n ctx.drawImage(mockupImg, x, y, width, height);\n\n // Draw florals\n if (floralAssets.length > 0) {\n const floralH = Math.min(900, height);\n let currentX = x - LAYOUT.FLORAL_SPACING;\n\n for (let i = floralAssets.length - 1; i >= 0; i--) {\n const img = floralAssets[i];\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\n const w = Math.max(1, Math.floor(floralH * ratio));\n currentX -= w;\n ctx.drawImage(img, currentX, y + height - floralH, w, floralH);\n currentX -= LAYOUT.FLORAL_SPACING;\n }\n }\n};\n\nconst renderSide = (\n ctx: CanvasRenderingContext2D,\n side: any,\n startY: number,\n width: number,\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n let currentY = startY;\n const padding = LAYOUT.PADDING * scaleFactor;\n const sideWidth = width - 2 * padding;\n\n // Draw header\n ctx.save();\n const headerFontSize = LAYOUT.HEADER_FONT_SIZE * scaleFactor;\n ctx.font = `bold ${headerFontSize}px ${LAYOUT.HEADER_FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.HEADER_COLOR;\n\n const headerResult = wrapText(\n ctx,\n side.print_side.toUpperCase(),\n padding,\n currentY,\n sideWidth,\n headerFontSize\n );\n\n // Draw underline\n const underlineY =\n headerResult.lastLineY + headerFontSize * LAYOUT.UNDERLINE_POSITION;\n ctx.strokeStyle = LAYOUT.HEADER_COLOR;\n ctx.lineWidth = LAYOUT.UNDERLINE_WIDTH * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(padding, underlineY);\n ctx.lineTo(padding + headerResult.lastLineWidth, underlineY);\n ctx.stroke();\n\n currentY += headerResult.height + LAYOUT.SECTION_SPACING * scaleFactor;\n ctx.restore();\n\n // Compute uniform properties\n const textPositions = side.positions.filter(\n (p: Position) => p.type === \"TEXT\"\n );\n const iconColorPositions = side.positions.filter(\n (p: Position): p is Position & { type: \"ICON\" } =>\n p.type === \"ICON\" && (!p.layer_colors?.length || p.layer_colors.length === 1)\n );\n const iconColorValues = iconColorPositions\n .map((p: Position & { type: \"ICON\" }) => {\n if (p.layer_colors?.length === 1) return p.layer_colors[0];\n return p.color ?? null;\n })\n .filter((color: string | null): color is string => Boolean(color));\n const uniformProps = computeUniformProperties(textPositions, {\n additionalColorValues: iconColorValues,\n });\n const shouldShowUniformLabels = textPositions.length > 1;\n\n // Render uniform labels (only if more than 1 TEXT position)\n if (shouldShowUniformLabels) {\n currentY += renderUniformLabels(\n ctx,\n uniformProps,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n textPositions\n );\n }\n\n // Group text positions by common properties\n const textGroups = groupTextPositions(textPositions);\n\n // Render text positions (with proper spacing between groups)\n let textCounter = 1;\n textGroups.forEach((group, groupIndex) => {\n group.forEach((position, index) => {\n // Add extra spacing between different groups\n if (index === 0 && groupIndex !== 0) {\n currentY += LAYOUT.SECTION_SPACING * scaleFactor;\n }\n\n // If only 1 TEXT position, show all labels (no uniform labels rendered)\n const showLabels =\n textPositions.length === 1\n ? { font: true, shape: true, floral: true, color: true }\n : {\n font: !uniformProps.isUniform.font,\n shape: !uniformProps.isUniform.shape,\n floral: !uniformProps.isUniform.floral,\n color: !uniformProps.isUniform.color,\n };\n const height = renderTextPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n textCounter,\n showLabels,\n scaleFactor,\n imageRefs\n );\n if (height > 0) {\n currentY += height + LAYOUT.PADDING * scaleFactor;\n textCounter++;\n }\n });\n });\n\n // Render icon positions\n currentY += LAYOUT.LINE_GAP * scaleFactor;\n side.positions.forEach((position: Position) => {\n if (position.type === \"ICON\") {\n const layerCount = position.layer_colors?.length ?? 0;\n const iconUsesSingleColor =\n layerCount === 0 || layerCount === 1;\n const iconColorValue =\n layerCount === 1\n ? position.layer_colors?.[0] ?? null\n : position.color ?? null;\n const hideColor =\n shouldShowUniformLabels &&\n uniformProps.isUniform.color &&\n iconColorValue !== null &&\n uniformProps.values.color === iconColorValue &&\n iconUsesSingleColor;\n currentY += renderIconPosition(\n ctx,\n position as any,\n padding,\n currentY,\n sideWidth,\n scaleFactor,\n imageRefs,\n { hideColor }\n );\n currentY += (LAYOUT.LINE_GAP / 3) * scaleFactor;\n }\n });\n\n return currentY - startY;\n};\n\nconst groupTextPositions = (\n textPositions: Array<Position & { type: \"TEXT\" }>\n): Array<Array<Position & { type: \"TEXT\" }>> => {\n const groups: Array<Array<Position & { type: \"TEXT\" }>> = [];\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\n let currentProps: any = null;\n\n textPositions.forEach((position) => {\n const posProps = {\n font: position.font,\n text_shape: position.text_shape,\n color: position.color,\n character_colors: position.character_colors?.join(\",\"),\n };\n\n if (\n !currentGroup ||\n currentProps.font !== posProps.font ||\n currentProps.text_shape !== posProps.text_shape ||\n currentProps.color !== posProps.color ||\n currentProps.character_colors !== posProps.character_colors\n ) {\n if (currentGroup) {\n groups.push(currentGroup);\n }\n currentGroup = [position];\n currentProps = posProps;\n } else {\n currentGroup.push(position);\n }\n });\n\n if (currentGroup) {\n groups.push(currentGroup);\n }\n\n return groups;\n};\n\nconst computeUniformProperties = (\n textPositions: Array<Position & { type: \"TEXT\" }>,\n options?: { additionalColorValues?: string[] }\n) => {\n const defaults = {\n values: { font: null, shape: null, floral: null, color: null },\n isUniform: { font: false, shape: false, floral: false, color: false },\n };\n\n const fonts = new Set(textPositions.map((p) => p.font));\n const shapes = new Set(textPositions.map((p) => p.text_shape));\n const florals = new Set(textPositions.map((p) => p.floral_pattern ?? \"None\"));\n const colorSources = [\n ...textPositions.map((p) =>\n p.character_colors?.length\n ? p.character_colors.join(\",\")\n : p.color ?? \"None\"\n ),\n ...(options?.additionalColorValues?.map((color) => color ?? \"None\") ?? []),\n ];\n\n if (\n textPositions.length === 0 &&\n (!options?.additionalColorValues || options.additionalColorValues.length === 0)\n ) {\n return defaults;\n }\n\n const colors = new Set(colorSources);\n\n return {\n values: {\n font: fonts.size === 1 ? [...fonts][0] : null,\n shape: shapes.size === 1 ? [...shapes][0] : null,\n floral: florals.size === 1 ? [...florals][0] : null,\n color: colorSources.length > 0 && colors.size === 1 ? [...colors][0] : null,\n },\n isUniform: {\n font: fonts.size === 1,\n shape: shapes.size === 1,\n floral: florals.size === 1,\n color: colorSources.length > 0 && colors.size === 1,\n },\n };\n};\n\nconst renderUniformLabels = (\n ctx: CanvasRenderingContext2D,\n uniformProps: ReturnType<typeof computeUniformProperties>,\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n textPositions: Array<Position & { type: \"TEXT\" }>\n): number => {\n const { values } = uniformProps;\n const fontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${fontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n let rendered = 0;\n\n if (values.font) {\n const allDefault = textPositions.every((p) => p.is_font_default === true);\n const fontLabel = allDefault ? `Font: ${values.font} (Mặc định)` : `Font: ${values.font} (Custom)`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.shape && values.shape !== \"None\") {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${values.shape}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.color && values.color !== \"None\") {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${values.color}`,\n x,\n cursorY,\n textMaxWidth,\n fontSize + lineGap\n );\n\n const swatchH = Math.floor(fontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\n const colors = values.color.includes(\",\")\n ? values.color.split(\",\").map((s) => s.trim())\n : [values.color];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (values.floral && values.floral !== \"None\") {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${values.floral}`,\n x,\n cursorY,\n maxWidth,\n fontSize + lineGap\n );\n cursorY += result.height;\n rendered++;\n }\n\n if (rendered > 0) cursorY += LAYOUT.SECTION_SPACING * scaleFactor;\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst renderTextPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"TEXT\" },\n x: number,\n y: number,\n maxWidth: number,\n displayIndex: number,\n showLabels: {\n font: boolean;\n shape: boolean;\n floral: boolean;\n color: boolean;\n },\n scaleFactor: number,\n imageRefs: ImageMapRef\n): number => {\n ctx.save();\n\n const textFontSize = LAYOUT.TEXT_FONT_SIZE * scaleFactor;\n const otherFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n let currentY = y;\n let drawnHeight = 0;\n\n // Draw label\n const textLabel = `Text ${displayIndex}: `;\n ctx.font = `bold ${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const labelWidth = ctx.measureText(textLabel).width;\n ctx.fillText(textLabel, x, currentY);\n\n const textMaxWidth = maxWidth - labelWidth;\n\n // Get display text (handle empty/null/undefined)\n const isEmptyText = !position.text || position.text.trim() === \"\";\n\n // Draw text content\n if (isEmptyText) {\n ctx.font = `${textFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n \"(không có text)\",\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.floral_pattern) {\n // Khi có floral_pattern, dùng màu mặc định như label\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n } else if (position.character_colors?.length) {\n ctx.font = `${textFontSize}px ${position.font}`;\n const textHeight = wrapTextMultiColor(\n ctx,\n position.text,\n position.character_colors,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textHeight;\n drawnHeight += textHeight;\n } else {\n ctx.font = `${textFontSize}px ${position.font}`;\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || LAYOUT.LABEL_COLOR;\n const textResult = wrapText(\n ctx,\n position.text,\n x + labelWidth,\n currentY,\n textMaxWidth,\n textFontSize\n );\n currentY += textResult.height;\n drawnHeight += textResult.height;\n }\n\n // Draw additional labels (skip when text is empty)\n if (!isEmptyText) {\n currentY += lineGap;\n ctx.font = `${otherFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n if (showLabels.shape && position.text_shape) {\n const result = wrapText(\n ctx,\n `Kiểu chữ: ${position.text_shape}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.font && position.font) {\n const fontLabel =\n position.is_font_default === true\n ? `Font: ${position.font} (Mặc định)`\n : `Font: ${position.font} (Custom)`;\n const result = wrapText(\n ctx,\n fontLabel,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n\n if (showLabels.color) {\n const colorValue = position.character_colors?.join(\", \") || position.color;\n if (colorValue) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const result = wrapText(\n ctx,\n `Màu chỉ: ${colorValue}`,\n x,\n currentY,\n textMaxWidth,\n otherFontSize + lineGap\n );\n\n const swatchH = Math.floor(otherFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(result.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n result.lastLineY + Math.floor(otherFontSize / 2 - swatchH / 2);\n const colors = position.character_colors || [position.color!];\n\n drawSwatches(\n ctx,\n colors,\n swatchX,\n swatchY,\n swatchH,\n scaleFactor,\n imageRefs\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n if (showLabels.floral && position.floral_pattern) {\n const result = wrapText(\n ctx,\n `Mẫu hoa: ${position.floral_pattern}`,\n x,\n currentY,\n maxWidth,\n otherFontSize + lineGap\n );\n currentY += result.height;\n drawnHeight += result.height;\n }\n }\n\n ctx.restore();\n return drawnHeight;\n};\n\nconst renderIconPosition = (\n ctx: CanvasRenderingContext2D,\n position: Position & { type: \"ICON\" },\n x: number,\n y: number,\n maxWidth: number,\n scaleFactor: number,\n imageRefs: ImageMapRef,\n options?: { hideColor?: boolean }\n): number => {\n const iconFontSize = LAYOUT.OTHER_FONT_SIZE * scaleFactor;\n const lineGap = LAYOUT.LINE_GAP * scaleFactor;\n\n ctx.save();\n ctx.font = `${iconFontSize}px ${LAYOUT.FONT_FAMILY}`;\n ctx.fillStyle = LAYOUT.LABEL_COLOR;\n\n let cursorY = y;\n const iconText =\n position.note ? `Icon: ${position.note}` :\n position.icon === 0\n ? `Icon: (icon mặc định theo file thêu)`\n : `Icon: ${position.icon}`;\n const iconResult = wrapText(\n ctx,\n iconText,\n x,\n cursorY,\n maxWidth,\n iconFontSize + lineGap\n );\n\n // Draw icon image\n if (position.icon !== 0) {\n const url = getImageUrl(\"icon\", position.icon);\n const img = imageRefs.current.get(url);\n if (img?.complete && img.naturalHeight > 0) {\n const ratio = img.naturalWidth / img.naturalHeight;\n const swatchW = Math.max(1, Math.floor(iconFontSize * ratio));\n const iconX =\n x +\n Math.ceil(iconResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const iconY =\n iconResult.lastLineY + Math.floor(iconFontSize / 2 - iconFontSize / 2);\n ctx.drawImage(img, iconX, iconY, swatchW, iconFontSize);\n }\n }\n\n cursorY += iconResult.height;\n\n // Draw color swatches (prefer layer_colors, fallback to single color)\n const iconColors = position.layer_colors?.length\n ? position.layer_colors\n : position.color\n ? [position.color]\n : null;\n const layerCount = position.layer_colors?.length ?? 0;\n const hasMultiLayerColors = layerCount > 1;\n const shouldSkipColorSection = options?.hideColor && !hasMultiLayerColors;\n\n if (iconColors?.length && !shouldSkipColorSection) {\n const textMaxWidth = Math.max(\n LAYOUT.MIN_TEXT_WIDTH * scaleFactor,\n maxWidth - LAYOUT.SWATCH_RESERVED_SPACE * scaleFactor\n );\n const colorResult = wrapText(\n ctx,\n `Màu chỉ: ${iconColors.join(\", \")}`,\n x,\n cursorY,\n textMaxWidth,\n iconFontSize + lineGap\n );\n\n const swatchH = Math.floor(iconFontSize * LAYOUT.SWATCH_HEIGHT_RATIO);\n const swatchX =\n x +\n Math.ceil(colorResult.lastLineWidth) +\n LAYOUT.ELEMENT_SPACING * scaleFactor;\n const swatchY =\n colorResult.lastLineY + Math.floor(iconFontSize / 2 - swatchH / 2);\n\n drawSwatches(ctx, iconColors, swatchX, swatchY, swatchH, scaleFactor, imageRefs);\n cursorY += colorResult.height;\n }\n\n ctx.restore();\n return cursorY - y;\n};\n\nconst prepareExportCanvas = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<HTMLCanvasElement | null> => {\n const { width = 4200, height = 4800 } = options;\n\n const canvas = document.createElement(\"canvas\");\n const imageRefs: ImageMapRef = {\n current: new Map<string, HTMLImageElement>(),\n };\n\n await preloadFonts(config);\n await preloadImages(config, imageRefs);\n\n renderEmbroideryCanvas(canvas, config, { width, height }, imageRefs);\n\n if (!canvas.width || !canvas.height) {\n return null;\n }\n\n return canvas;\n};\n\nexport const generateEmbroideryQCImageBlob = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<Blob | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageBlob requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n }\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas || typeof canvas.toBlob !== \"function\") {\n return null;\n }\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((result) => resolve(result), mimeType, quality);\n });\n\n return blob;\n};\n\nexport const generateEmbroideryQCImageData = async (\n config: EmbroideryQCConfig,\n options: EmbroideryQCImageRenderOptions = {}\n): Promise<string | null> => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"generateEmbroideryQCImageData requires a browser environment.\"\n );\n }\n\n if (!config) {\n throw new Error(\"config is required\");\n };\n\n const { mimeType = \"image/png\", quality } = options;\n\n const canvas = await prepareExportCanvas(config, options);\n if (!canvas) {\n return null;\n }\n\n if (mimeType === \"image/png\" || typeof quality === \"undefined\") {\n return canvas.toDataURL(mimeType);\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n\nexport default EmbroideryQCImage;\n"],"names":["useState","useRef","useEffect","_jsx"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "embroidery-qc-image",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "React component for rendering embroidery QC images",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",