embroidery-qc-image 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -10
- package/dist/components/EmbroideryQCImage.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.esm.js +1 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,13 +25,12 @@ const exampleConfig = {
|
|
|
25
25
|
positions: [
|
|
26
26
|
{
|
|
27
27
|
type: "TEXT" as const,
|
|
28
|
-
text: "Brian
|
|
28
|
+
text: "Brian",
|
|
29
29
|
text_shape: "No Curved",
|
|
30
30
|
color: null,
|
|
31
31
|
font: "Brittany",
|
|
32
32
|
floral_pattern: null,
|
|
33
33
|
character_colors: ["Pink (1148)", "Lavender (1032)"],
|
|
34
|
-
change_character_to_heart: true,
|
|
35
34
|
},
|
|
36
35
|
{
|
|
37
36
|
type: "TEXT" as const,
|
|
@@ -41,11 +40,10 @@ const exampleConfig = {
|
|
|
41
40
|
font: "Arial",
|
|
42
41
|
character_colors: null,
|
|
43
42
|
floral_pattern: "P61",
|
|
44
|
-
change_character_to_heart: null,
|
|
45
43
|
},
|
|
46
44
|
{
|
|
47
45
|
type: "ICON" as const,
|
|
48
|
-
icon:
|
|
46
|
+
icon: 1,
|
|
49
47
|
layer_colors: ["White (9)", "Red (1037)"],
|
|
50
48
|
},
|
|
51
49
|
],
|
|
@@ -60,7 +58,6 @@ const exampleConfig = {
|
|
|
60
58
|
color: "Terra Cotta (1477)",
|
|
61
59
|
font: "Blackmate",
|
|
62
60
|
character_colors: null,
|
|
63
|
-
change_character_to_heart: true,
|
|
64
61
|
},
|
|
65
62
|
{
|
|
66
63
|
type: "TEXT" as const,
|
|
@@ -69,7 +66,6 @@ const exampleConfig = {
|
|
|
69
66
|
color: "Terra Cotta (1477)",
|
|
70
67
|
font: "Millie",
|
|
71
68
|
character_colors: null,
|
|
72
|
-
change_character_to_heart: true,
|
|
73
69
|
},
|
|
74
70
|
],
|
|
75
71
|
},
|
|
@@ -121,13 +117,12 @@ interface TextPosition {
|
|
|
121
117
|
color?: string | null; // Optional: Color for entire text
|
|
122
118
|
font?: string | null; // Optional: Font name
|
|
123
119
|
character_colors?: string[] | null; // Optional: Array of colors for alternating characters
|
|
124
|
-
change_character_to_heart?: boolean | null; // Optional: Replace <3 with ❤
|
|
125
120
|
floral_pattern?: string | null; // Optional: Floral pattern name
|
|
126
121
|
}
|
|
127
122
|
|
|
128
123
|
interface IconPosition {
|
|
129
124
|
type: 'ICON';
|
|
130
|
-
icon:
|
|
125
|
+
icon: number; // Icon number (e.g., 1, 2, 3...). Use 0 for default icon from embroidery file
|
|
131
126
|
layer_colors: string[]; // Array of colors for icon layers
|
|
132
127
|
}
|
|
133
128
|
```
|
|
@@ -140,7 +135,6 @@ interface IconPosition {
|
|
|
140
135
|
- ✅ Font loading from CDN with automatic fallback
|
|
141
136
|
- ✅ Multiple print sides (Chest, Sleeve, etc.)
|
|
142
137
|
- ✅ Floral pattern support with inline display
|
|
143
|
-
- ✅ Heart emoji conversion (<3 → ❤)
|
|
144
138
|
- ✅ Automatic font scaling to fit canvas (only scales down, never up)
|
|
145
139
|
- ✅ Smart layout with uniform property grouping
|
|
146
140
|
- ✅ Color swatches displayed inline with labels
|
|
@@ -177,9 +171,13 @@ Supported format: WOFF2
|
|
|
177
171
|
|
|
178
172
|
Icons are loaded from:
|
|
179
173
|
```
|
|
180
|
-
https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons/{
|
|
174
|
+
https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons/Icon {IconNumber}.png
|
|
181
175
|
```
|
|
182
176
|
|
|
177
|
+
Example: `icon: 1` → loads `Icon 1.png`
|
|
178
|
+
|
|
179
|
+
**Special case**: Use `icon: 0` to display "icon mặc định theo file thêu" (default icon from embroidery file) without loading any image.
|
|
180
|
+
|
|
183
181
|
## Floral Patterns
|
|
184
182
|
|
|
185
183
|
Floral patterns are loaded from:
|
|
@@ -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,sBAAsB,EAAY,MAAM,UAAU,CAAC;AAC5D,OAAO,yBAAyB,CAAC;AA2EjC,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"EmbroideryQCImage.d.ts","sourceRoot":"","sources":["../../src/components/EmbroideryQCImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAY,MAAM,UAAU,CAAC;AAC5D,OAAO,yBAAyB,CAAC;AA2EjC,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAm8BvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.esm.js
CHANGED
|
@@ -601,10 +601,7 @@ const EmbroideryQCImage = ({ config, className = "", style = {}, }) => {
|
|
|
601
601
|
let currentYCursor = y;
|
|
602
602
|
let drawnHeight = 0; // accumulate only when something is actually drawn
|
|
603
603
|
// Text value with unified font size
|
|
604
|
-
|
|
605
|
-
if (position.change_character_to_heart && displayText.includes("<3")) {
|
|
606
|
-
displayText = displayText.replace(/<3/g, "❤");
|
|
607
|
-
}
|
|
604
|
+
const displayText = position.text;
|
|
608
605
|
ctx.textAlign = "left";
|
|
609
606
|
ctx.textBaseline = "top";
|
|
610
607
|
// Label for text line
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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\";\r\nimport { EmbroideryQCImageProps, Position } from \"../types\";\r\nimport \"./EmbroideryQCImage.css\";\r\n\r\n// Color mapping\r\nconst COLOR_MAP: Record<string, string> = {\r\n \"Army (1394)\": \"#4B5320\",\r\n Army: \"#4B5320\",\r\n \"Black (8)\": \"#000000\",\r\n Black: \"#000000\",\r\n \"Bubblegum (1309)\": \"#FFC1CC\",\r\n Bubblegum: \"#FFC1CC\",\r\n \"Carolina Blue (1274)\": \"#7BAFD4\",\r\n \"Carolina Blue\": \"#7BAFD4\",\r\n \"Celadon (1098)\": \"#ACE1AF\",\r\n Celadon: \"#ACE1AF\",\r\n \"Coffee Bean (1145)\": \"#6F4E37\",\r\n \"Coffee Bean\": \"#6F4E37\",\r\n \"Daffodil (1180)\": \"#FFFF31\",\r\n Daffodil: \"#FFFF31\",\r\n \"Dark Gray (1131)\": \"#A9A9A9\",\r\n \"Dark Gray\": \"#A9A9A9\",\r\n \"Doe Skin Beige (1344)\": \"#F5E6D3\",\r\n \"Doe Skin Beige\": \"#F5E6D3\",\r\n \"Dusty Blue (1373)\": \"#6699CC\",\r\n \"Dusty Blue\": \"#6699CC\",\r\n \"Forest Green (1397)\": \"#228B22\",\r\n \"Forest Green\": \"#228B22\",\r\n \"Gold (1425)\": \"#FFD700\",\r\n Gold: \"#FFD700\",\r\n \"Gray (1118)\": \"#808080\",\r\n Gray: \"#808080\",\r\n \"Ivory (1072)\": \"#FFFFF0\",\r\n Ivory: \"#FFFFF0\",\r\n \"Lavender (1032)\": \"#E6E6FA\",\r\n Lavender: \"#E6E6FA\",\r\n \"Light Denim (1133)\": \"#B0C4DE\",\r\n \"Light Denim\": \"#B0C4DE\",\r\n \"Light Salmon (1018)\": \"#FFA07A\",\r\n \"Light Salmon\": \"#FFA07A\",\r\n \"Maroon (1374)\": \"#800000\",\r\n Maroon: \"#800000\",\r\n \"Navy Blue (1044)\": \"#000080\",\r\n \"Navy Blue\": \"#000080\",\r\n \"Olive Green (1157)\": \"#556B2F\",\r\n \"Olive Green\": \"#556B2F\",\r\n \"Orange (1278)\": \"#FFA500\",\r\n Orange: \"#FFA500\",\r\n \"Peach Blush (1053)\": \"#FFCCCB\",\r\n \"Peach Blush\": \"#FFCCCB\",\r\n \"Pink (1148)\": \"#FFC0CB\",\r\n Pink: \"#FFC0CB\",\r\n \"Purple (1412)\": \"#800080\",\r\n Purple: \"#800080\",\r\n \"Red (1037)\": \"#FF0000\",\r\n Red: \"#FF0000\",\r\n \"Silver Sage (1396)\": \"#A8A8A8\",\r\n \"Silver Sage\": \"#A8A8A8\",\r\n \"Summer Sky (1432)\": \"#87CEEB\",\r\n \"Summer Sky\": \"#87CEEB\",\r\n \"Terra Cotta (1477)\": \"#E2725B\",\r\n \"Terra Cotta\": \"#E2725B\",\r\n \"Sand (1055)\": \"#F4A460\",\r\n Sand: \"#F4A460\",\r\n \"White (9)\": \"#FFFFFF\",\r\n White: \"#FFFFFF\",\r\n};\r\n\r\nconst FONT_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\";\r\nconst ICON_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\";\r\nconst FLORAL_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\";\r\nconst THREAD_COLOR_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\";\r\n\r\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\r\n config,\r\n className = \"\",\r\n style = {},\r\n}) => {\r\n const [canvasSize] = useState({ width: 4200, height: 4800 });\r\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\r\n const [imagesLoaded, setImagesLoaded] = useState(0);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\r\n\r\n // Load fonts\r\n useEffect(() => {\r\n const loadFonts = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n const fontsToLoad = new Set<string>();\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.font) {\r\n fontsToLoad.add(position.font);\r\n }\r\n });\r\n });\r\n\r\n for (const fontName of fontsToLoad) {\r\n if (loadedFonts.has(fontName)) continue;\r\n\r\n try {\r\n await loadFont(fontName);\r\n setLoadedFonts((prev) => new Set(prev).add(fontName));\r\n } catch (error) {\r\n console.warn(`Could not load font ${fontName}:`, error);\r\n }\r\n }\r\n };\r\n\r\n loadFonts();\r\n }, [config.sides, loadedFonts]);\r\n\r\n // Load images\r\n useEffect(() => {\r\n const loadImages = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n // Load mockup image (not background). It will be drawn at bottom-right.\r\n if (config.image_url) {\r\n // Try with CORS first. If it fails (no CORS headers), retry without CORS\r\n const loadMockup = (useCors: boolean) => {\r\n const img = new Image();\r\n if (useCors) img.crossOrigin = \"anonymous\";\r\n img.onload = () => {\r\n imageRefs.current.set(\"mockup\", img);\r\n setImagesLoaded((prev) => prev + 1);\r\n };\r\n img.onerror = () => {\r\n if (useCors) {\r\n // Retry without CORS; canvas may become tainted on export\r\n loadMockup(false);\r\n }\r\n };\r\n img.src = config.image_url as string;\r\n };\r\n loadMockup(true);\r\n }\r\n\r\n // Load icons\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"ICON\" && position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n if (!imageRefs.current.has(iconUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = iconUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(iconUrl, img);\r\n }\r\n }\r\n\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!imageRefs.current.has(floralUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = floralUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(floralUrl, img);\r\n }\r\n }\r\n\r\n // Load thread color images for TEXT positions\r\n if (position.type === \"TEXT\") {\r\n // Load color image if position has color\r\n if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n }\r\n\r\n // Load character color images\r\n if (\r\n position.character_colors &&\r\n position.character_colors.length > 0\r\n ) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load thread color images for ICON positions\r\n if (position.type === \"ICON\" && position.layer_colors) {\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n loadImages();\r\n }, [config]);\r\n\r\n // Render canvas\r\n useEffect(() => {\r\n const renderCanvas = () => {\r\n if (!canvasRef.current || !config.sides || config.sides.length === 0) {\r\n return;\r\n }\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Clear with white background\r\n ctx.fillStyle = \"#FFFFFF\";\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Collect floral images (for later drawing)\r\n const floralAssets: HTMLImageElement[] = [];\r\n const seenFlorals = new Set<string>();\r\n if (config.sides) {\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!seenFlorals.has(floralUrl)) {\r\n const img = imageRefs.current.get(floralUrl);\r\n if (img && img.complete && img.naturalWidth > 0) {\r\n floralAssets.push(img);\r\n seenFlorals.add(floralUrl);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Helper function to draw mockup and florals\r\n const drawMockupAndFlorals = () => {\r\n const mockupImg = imageRefs.current.get(\"mockup\");\r\n const margin = 40; // small padding\r\n let mockupBox: { x: number; y: number; w: number; h: number } | null =\r\n null;\r\n if (mockupImg && mockupImg.complete && mockupImg.naturalWidth > 0) {\r\n const maxTargetWidth = Math.min(1800, canvas.width * 0.375);\r\n const maxTargetHeight = canvas.height * 0.375;\r\n const scale = Math.min(\r\n maxTargetWidth / mockupImg.naturalWidth,\r\n maxTargetHeight / mockupImg.naturalHeight\r\n );\r\n const targetWidth = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalWidth * scale)\r\n );\r\n const targetHeight = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalHeight * scale)\r\n );\r\n const targetX = canvas.width - margin - targetWidth;\r\n const targetY = canvas.height - margin - targetHeight;\r\n mockupBox = {\r\n x: targetX,\r\n y: targetY,\r\n w: targetWidth,\r\n h: targetHeight,\r\n };\r\n ctx.drawImage(mockupImg, targetX, targetY, targetWidth, targetHeight);\r\n }\r\n\r\n // Draw florals to the left of mockup\r\n if (mockupBox && floralAssets.length > 0) {\r\n const spacing = 300;\r\n const targetHeight = mockupBox.h;\r\n const floralFixedH = Math.min(900, targetHeight);\r\n let currentX = mockupBox.x - spacing;\r\n for (let i = floralAssets.length - 1; i >= 0; i--) {\r\n const img = floralAssets[i];\r\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\r\n const h = floralFixedH;\r\n const w = Math.max(1, Math.floor(h * ratio));\r\n currentX -= w;\r\n const y = mockupBox.y + (targetHeight - h);\r\n ctx.drawImage(img, currentX, y, w, h);\r\n currentX -= spacing;\r\n }\r\n }\r\n };\r\n\r\n // New approach: Draw images first (bottom layer), then text on top\r\n // This allows text to overlay images when needed\r\n\r\n // Pass 1: Measure actual height with original size (use offscreen canvas for measurement)\r\n const measureCanvas = document.createElement(\"canvas\");\r\n measureCanvas.width = canvas.width;\r\n measureCanvas.height = canvas.height;\r\n const measureCtx = measureCanvas.getContext(\"2d\");\r\n if (!measureCtx) return;\r\n\r\n // Set up measurement context\r\n measureCtx.font = ctx.font;\r\n measureCtx.textAlign = ctx.textAlign;\r\n measureCtx.textBaseline = ctx.textBaseline;\r\n\r\n let measureY = 40;\r\n const measureSpacing = 100;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n measureCtx,\r\n side,\r\n measureY,\r\n canvas.width,\r\n 1\r\n );\r\n measureY += sideHeight + measureSpacing;\r\n });\r\n const totalMeasuredHeight = measureY; // Total height used\r\n\r\n // Calculate scale factor - only scale down when necessary\r\n // Keep original font sizes (no scale up) - font size is the maximum\r\n const topPadding = 40;\r\n // No bottom padding - content can go to bottom, mockup will overlay\r\n const targetContentHeight = canvas.height - topPadding;\r\n\r\n // Only scale down if content exceeds canvas height\r\n // Never scale up - preserve original font sizes\r\n let scaleFactor = 1;\r\n if (totalMeasuredHeight > targetContentHeight) {\r\n // Scale down to fit exactly\r\n scaleFactor = targetContentHeight / totalMeasuredHeight;\r\n scaleFactor = Math.max(0.5, scaleFactor); // Minimum scale to prevent tiny fonts\r\n }\r\n // If content fits, keep scaleFactor = 1 (original font sizes)\r\n\r\n // Draw mockup and florals first (bottom layer)\r\n drawMockupAndFlorals();\r\n\r\n // Draw content on top (top layer) - text will overlay images if needed\r\n let currentY = topPadding * scaleFactor;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n ctx,\r\n side,\r\n currentY,\r\n canvas.width,\r\n scaleFactor\r\n );\r\n currentY += sideHeight + measureSpacing * scaleFactor;\r\n });\r\n };\r\n\r\n // Delay rendering to ensure fonts and images are loaded\r\n const timer = setTimeout(renderCanvas, 100);\r\n return () => clearTimeout(timer);\r\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\r\n\r\n // Helper function to wrap and draw text with word wrapping\r\n // Returns: { height: number, lastLineWidth: number, lastLineY: number }\r\n const fillTextWrapped = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): { height: number; lastLineWidth: number; lastLineY: number } => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n let currentLine = words[0];\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line) => {\r\n ctx.fillText(line, x, currentY);\r\n currentY += lineHeight;\r\n });\r\n\r\n const lastLineWidth = ctx.measureText(lines[lines.length - 1]).width;\r\n const lastLineY = y + (lines.length - 1) * lineHeight;\r\n\r\n return {\r\n height: lines.length * lineHeight,\r\n lastLineWidth,\r\n lastLineY,\r\n };\r\n };\r\n\r\n // Helper to wrap and draw multi-color text (for character_colors)\r\n const fillTextWrappedMultiColor = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n colors: string[],\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): number => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n const lineStartIndices: number[] = [0];\r\n let currentLine = words[0];\r\n let currentCharIndex = words[0].length;\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n lineStartIndices.push(currentCharIndex + 1); // +1 for space\r\n currentLine = word;\r\n currentCharIndex += word.length + 1;\r\n } else {\r\n currentLine = testLine;\r\n currentCharIndex += word.length + 1;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line, lineIdx) => {\r\n let currentX = x;\r\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const globalCharIdx = startCharIdx + i;\r\n const colorIndex = globalCharIdx % colors.length;\r\n const color = colors[colorIndex];\r\n ctx.fillStyle = COLOR_MAP[color] || \"#000000\";\r\n ctx.fillText(char, currentX, currentY);\r\n currentX += ctx.measureText(char).width;\r\n }\r\n currentY += lineHeight;\r\n });\r\n\r\n return lines.length * lineHeight;\r\n };\r\n\r\n const renderSide = (\r\n ctx: CanvasRenderingContext2D,\r\n side: any,\r\n startY: number,\r\n width: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n let currentY = startY;\r\n const padding = 40 * scaleFactor;\r\n const sideWidth = width - 2 * padding;\r\n const sectionHeight = 200 * scaleFactor;\r\n\r\n // No background section anymore - just white background\r\n\r\n // Group positions by common properties for optimization\r\n const textGroups: Array<{\r\n positions: Array<Position & { type: \"TEXT\" }>;\r\n properties: any;\r\n }> = [];\r\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\r\n let currentProps: any = null;\r\n\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") {\r\n if (\r\n !currentGroup ||\r\n currentProps.font !== position.font ||\r\n currentProps.text_shape !== position.text_shape ||\r\n currentProps.color !== position.color ||\r\n currentProps.character_colors?.join(\",\") !==\r\n position.character_colors?.join(\",\")\r\n ) {\r\n // Start new group\r\n if (currentGroup) {\r\n textGroups.push({\r\n positions: currentGroup,\r\n properties: currentProps,\r\n });\r\n }\r\n currentGroup = [position];\r\n currentProps = {\r\n font: position.font,\r\n text_shape: position.text_shape,\r\n color: position.color,\r\n character_colors: position.character_colors,\r\n };\r\n } else {\r\n currentGroup.push(position);\r\n }\r\n }\r\n });\r\n\r\n if (currentGroup) {\r\n textGroups.push({ positions: currentGroup, properties: currentProps });\r\n }\r\n\r\n // Draw side header\r\n ctx.save();\r\n const headerFontSize = 200 * scaleFactor;\r\n ctx.font = `bold ${headerFontSize}px Times New Roman`;\r\n ctx.fillStyle = \"#000000\";\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n const headerResult = fillTextWrapped(\r\n ctx,\r\n side.print_side.toUpperCase(),\r\n padding,\r\n currentY,\r\n sideWidth,\r\n headerFontSize\r\n );\r\n currentY += headerResult.height + 50 * scaleFactor;\r\n ctx.restore();\r\n\r\n // Compute side-level uniform properties across all TEXT positions\r\n const allTextPositions: Array<Position & { type: \"TEXT\" }> = [];\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") allTextPositions.push(position as any);\r\n });\r\n\r\n const sideFonts = new Set(allTextPositions.map((p) => (p as any).font));\r\n const sideShapes = new Set(\r\n allTextPositions.map((p) => (p as any).text_shape)\r\n );\r\n const sideFlorals = new Set(\r\n allTextPositions.map((p) => (p as any).floral_pattern ?? \"None\")\r\n );\r\n const colorKeyOf = (p: any) =>\r\n p.character_colors && p.character_colors.length > 0\r\n ? p.character_colors.join(\",\")\r\n : p.color ?? \"None\";\r\n const sideColors = new Set(allTextPositions.map((p) => colorKeyOf(p)));\r\n\r\n const sideUniform = {\r\n font: sideFonts.size === 1,\r\n shape: sideShapes.size === 1,\r\n floral: sideFlorals.size === 1,\r\n color: sideColors.size === 1,\r\n };\r\n\r\n // Render side-level labels once for uniform properties\r\n currentY += renderSideUniformLabels(\r\n ctx,\r\n {\r\n font: sideUniform.font ? [...sideFonts][0] : null,\r\n shape: sideUniform.shape ? [...sideShapes][0] : null,\r\n floral: sideUniform.floral ? [...sideFlorals][0] : null,\r\n color: sideUniform.color ? [...sideColors][0] : null,\r\n },\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n\r\n // Render text groups first\r\n let sideTextCounter = 1;\r\n textGroups.forEach((group, groupIndex) => {\r\n group.positions.forEach((position, index) => {\r\n if (index === 0 && groupIndex !== 0) currentY += 50 * scaleFactor;\r\n const drawnHeight = renderText(\r\n ctx,\r\n position,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n sideTextCounter,\r\n {\r\n font: !sideUniform.font,\r\n shape: !sideUniform.shape,\r\n floral: !sideUniform.floral,\r\n color: !sideUniform.color,\r\n },\r\n scaleFactor\r\n );\r\n sideTextCounter += 1;\r\n // add padding only if something was actually drawn\r\n if (drawnHeight > 0) {\r\n currentY += drawnHeight + 40 * scaleFactor;\r\n }\r\n });\r\n });\r\n\r\n // Render ICON titles/values (no images here)\r\n currentY += 30 * scaleFactor; // minimal spacing before icon labels\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"ICON\") {\r\n currentY += renderIconLabels(\r\n ctx,\r\n position as any,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n currentY += 10 * scaleFactor;\r\n }\r\n });\r\n\r\n return Math.max(currentY - startY, sectionHeight);\r\n };\r\n\r\n const renderSideUniformLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n values: {\r\n font: string | null;\r\n shape: string | null;\r\n floral: string | null;\r\n color: string | null;\r\n },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 20 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n let rendered = 0;\r\n if (values.font) {\r\n const fontText = `Font: ${values.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.shape && values.shape !== \"None\") {\r\n const shapeText = `Kiểu chữ: ${values.shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.color && values.color !== \"None\") {\r\n const colorText = `Màu chỉ: ${values.color}`;\r\n // Reserve space for swatches (estimate: max 5 swatches × 200px each = 1000px)\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n // Draw swatches inline for side-level color, preserving aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor;\r\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n const colorTokens = values.color.includes(\",\")\r\n ? values.color.split(\",\").map((s) => s.trim())\r\n : [values.color];\r\n colorTokens.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.floral && values.floral !== \"None\") {\r\n const floralText = `Mẫu hoa: ${values.floral}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (rendered > 0) cursorY += 50 * scaleFactor; // extra gap before first text line\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const renderText = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"TEXT\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n displayIndex: number,\r\n showLabels: {\r\n font: boolean;\r\n shape: boolean;\r\n floral: boolean;\r\n color: boolean;\r\n },\r\n scaleFactor: number = 1\r\n ): number => {\r\n ctx.save();\r\n\r\n // Info labels\r\n // Unified font sizing for labels and content (side title uses its own larger size)\r\n const infoLineGap = 30 * scaleFactor;\r\n const labelFontFamily = \"Arial\";\r\n // Use a unified content font size for both labels and text content\r\n const fontSize = 180 * scaleFactor;\r\n const infoFontSize = fontSize;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let currentYCursor = y;\r\n let drawnHeight = 0; // accumulate only when something is actually drawn\r\n\r\n // Text value with unified font size\r\n let displayText = position.text;\r\n if (position.change_character_to_heart && displayText.includes(\"<3\")) {\r\n displayText = displayText.replace(/<3/g, \"❤\");\r\n }\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n\r\n // Label for text line\r\n const textLabel = `Text ${displayIndex}: `;\r\n ctx.font = `bold ${fontSize}px ${labelFontFamily}`;\r\n const labelWidth = ctx.measureText(textLabel).width;\r\n ctx.fillStyle = \"#444444\";\r\n ctx.fillText(textLabel, x, currentYCursor);\r\n\r\n // Calculate available width for text content\r\n const textMaxWidth = maxWidth - labelWidth;\r\n\r\n // Handle character_colors (alternating colors)\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n // Switch to content font\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n const textHeight = fillTextWrappedMultiColor(\r\n ctx,\r\n displayText,\r\n position.character_colors,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textHeight;\r\n drawnHeight += textHeight;\r\n } else {\r\n // No color specified\r\n // Draw text in content font, black (non-bold)\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || \"#000000\";\r\n const textResult = fillTextWrapped(\r\n ctx,\r\n displayText,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textResult.height;\r\n drawnHeight += textResult.height;\r\n }\r\n\r\n // After text, print Kiểu chữ (when not uniform), then Font and Color as needed\r\n currentYCursor += infoLineGap;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.fillStyle = \"#444444\";\r\n if (showLabels.shape && position.text_shape) {\r\n const shapeLabelAfter = `Kiểu chữ: ${position.text_shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeLabelAfter,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.font && position.font) {\r\n const fontLabel = `Font: ${position.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontLabel,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.color) {\r\n let colorLabelValue = \"None\";\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n colorLabelValue = position.character_colors.join(\", \");\r\n } else if (position.color) {\r\n colorLabelValue = position.color;\r\n }\r\n if (colorLabelValue !== \"None\") {\r\n const colorLabel = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorLabel,\r\n x,\r\n currentYCursor,\r\n textMaxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n\r\n // Draw color swatch images inline with Color label for TEXT, preserve aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(infoFontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n result.lastLineY + Math.floor(infoFontSize / 2 - swatchH / 2);\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n } else if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n }\r\n }\r\n\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n }\r\n\r\n // Show floral label after color block when not uniform at side level\r\n if (showLabels.floral && position.floral_pattern) {\r\n const floralText = `Mẫu hoa: ${position.floral_pattern}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n\r\n // (Floral per-position label is printed above the text when needed; avoid duplicate after text)\r\n\r\n ctx.restore();\r\n return drawnHeight;\r\n };\r\n\r\n const renderIconLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"ICON\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 30 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n const iconText = position.icon === 0 \r\n ? `Icon: icon mặc định theo file thêu` \r\n : `Icon: ${position.icon}`;\r\n const iconResult = fillTextWrapped(\r\n ctx,\r\n iconText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n // draw icon image inline with text, preserve aspect ratio; match line height\r\n if (position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n const img = imageRefs.current.get(iconUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const swatchH = fontSize;\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n // Put icon on last line of wrapped text\r\n const iconX =\r\n x + Math.ceil(iconResult.lastLineWidth) + 100 * scaleFactor;\r\n const iconY =\r\n iconResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n ctx.drawImage(img, iconX, iconY, swatchW, swatchH);\r\n }\r\n }\r\n cursorY += iconResult.height;\r\n\r\n // Draw color line only when there are layer colors\r\n if (position.layer_colors && position.layer_colors.length > 0) {\r\n const colorLabelValue = position.layer_colors.join(\", \");\r\n const colorText = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const colorResult = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n\r\n // Draw color swatch images (only for icon)\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025); // 75% of previous size\r\n let swatchX =\r\n x + Math.ceil(colorResult.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n colorResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor; // spacing between swatches\r\n }\r\n });\r\n cursorY += colorResult.height;\r\n }\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const loadFont = (fontName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Try to load from CDN\r\n const fontUrl = `${FONT_BASE_URL}/${encodeURIComponent(fontName)}.woff2`;\r\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\r\n\r\n fontFace\r\n .load()\r\n .then((loadedFont) => {\r\n document.fonts.add(loadedFont);\r\n resolve();\r\n })\r\n .catch(() => {\r\n // Font loading failed, will use fallback\r\n console.warn(`Could not load font ${fontName} from CDN`);\r\n resolve(); // Still resolve to not block rendering\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div className={`render-embroidery${className ? ` ${className}` : \"\"}`} style={style}>\r\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmbroideryQCImage;\r\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\";\r\nimport { EmbroideryQCImageProps, Position } from \"../types\";\r\nimport \"./EmbroideryQCImage.css\";\r\n\r\n// Color mapping\r\nconst COLOR_MAP: Record<string, string> = {\r\n \"Army (1394)\": \"#4B5320\",\r\n Army: \"#4B5320\",\r\n \"Black (8)\": \"#000000\",\r\n Black: \"#000000\",\r\n \"Bubblegum (1309)\": \"#FFC1CC\",\r\n Bubblegum: \"#FFC1CC\",\r\n \"Carolina Blue (1274)\": \"#7BAFD4\",\r\n \"Carolina Blue\": \"#7BAFD4\",\r\n \"Celadon (1098)\": \"#ACE1AF\",\r\n Celadon: \"#ACE1AF\",\r\n \"Coffee Bean (1145)\": \"#6F4E37\",\r\n \"Coffee Bean\": \"#6F4E37\",\r\n \"Daffodil (1180)\": \"#FFFF31\",\r\n Daffodil: \"#FFFF31\",\r\n \"Dark Gray (1131)\": \"#A9A9A9\",\r\n \"Dark Gray\": \"#A9A9A9\",\r\n \"Doe Skin Beige (1344)\": \"#F5E6D3\",\r\n \"Doe Skin Beige\": \"#F5E6D3\",\r\n \"Dusty Blue (1373)\": \"#6699CC\",\r\n \"Dusty Blue\": \"#6699CC\",\r\n \"Forest Green (1397)\": \"#228B22\",\r\n \"Forest Green\": \"#228B22\",\r\n \"Gold (1425)\": \"#FFD700\",\r\n Gold: \"#FFD700\",\r\n \"Gray (1118)\": \"#808080\",\r\n Gray: \"#808080\",\r\n \"Ivory (1072)\": \"#FFFFF0\",\r\n Ivory: \"#FFFFF0\",\r\n \"Lavender (1032)\": \"#E6E6FA\",\r\n Lavender: \"#E6E6FA\",\r\n \"Light Denim (1133)\": \"#B0C4DE\",\r\n \"Light Denim\": \"#B0C4DE\",\r\n \"Light Salmon (1018)\": \"#FFA07A\",\r\n \"Light Salmon\": \"#FFA07A\",\r\n \"Maroon (1374)\": \"#800000\",\r\n Maroon: \"#800000\",\r\n \"Navy Blue (1044)\": \"#000080\",\r\n \"Navy Blue\": \"#000080\",\r\n \"Olive Green (1157)\": \"#556B2F\",\r\n \"Olive Green\": \"#556B2F\",\r\n \"Orange (1278)\": \"#FFA500\",\r\n Orange: \"#FFA500\",\r\n \"Peach Blush (1053)\": \"#FFCCCB\",\r\n \"Peach Blush\": \"#FFCCCB\",\r\n \"Pink (1148)\": \"#FFC0CB\",\r\n Pink: \"#FFC0CB\",\r\n \"Purple (1412)\": \"#800080\",\r\n Purple: \"#800080\",\r\n \"Red (1037)\": \"#FF0000\",\r\n Red: \"#FF0000\",\r\n \"Silver Sage (1396)\": \"#A8A8A8\",\r\n \"Silver Sage\": \"#A8A8A8\",\r\n \"Summer Sky (1432)\": \"#87CEEB\",\r\n \"Summer Sky\": \"#87CEEB\",\r\n \"Terra Cotta (1477)\": \"#E2725B\",\r\n \"Terra Cotta\": \"#E2725B\",\r\n \"Sand (1055)\": \"#F4A460\",\r\n Sand: \"#F4A460\",\r\n \"White (9)\": \"#FFFFFF\",\r\n White: \"#FFFFFF\",\r\n};\r\n\r\nconst FONT_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\";\r\nconst ICON_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\";\r\nconst FLORAL_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\";\r\nconst THREAD_COLOR_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\";\r\n\r\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\r\n config,\r\n className = \"\",\r\n style = {},\r\n}) => {\r\n const [canvasSize] = useState({ width: 4200, height: 4800 });\r\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\r\n const [imagesLoaded, setImagesLoaded] = useState(0);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\r\n\r\n // Load fonts\r\n useEffect(() => {\r\n const loadFonts = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n const fontsToLoad = new Set<string>();\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.font) {\r\n fontsToLoad.add(position.font);\r\n }\r\n });\r\n });\r\n\r\n for (const fontName of fontsToLoad) {\r\n if (loadedFonts.has(fontName)) continue;\r\n\r\n try {\r\n await loadFont(fontName);\r\n setLoadedFonts((prev) => new Set(prev).add(fontName));\r\n } catch (error) {\r\n console.warn(`Could not load font ${fontName}:`, error);\r\n }\r\n }\r\n };\r\n\r\n loadFonts();\r\n }, [config.sides, loadedFonts]);\r\n\r\n // Load images\r\n useEffect(() => {\r\n const loadImages = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n // Load mockup image (not background). It will be drawn at bottom-right.\r\n if (config.image_url) {\r\n // Try with CORS first. If it fails (no CORS headers), retry without CORS\r\n const loadMockup = (useCors: boolean) => {\r\n const img = new Image();\r\n if (useCors) img.crossOrigin = \"anonymous\";\r\n img.onload = () => {\r\n imageRefs.current.set(\"mockup\", img);\r\n setImagesLoaded((prev) => prev + 1);\r\n };\r\n img.onerror = () => {\r\n if (useCors) {\r\n // Retry without CORS; canvas may become tainted on export\r\n loadMockup(false);\r\n }\r\n };\r\n img.src = config.image_url as string;\r\n };\r\n loadMockup(true);\r\n }\r\n\r\n // Load icons\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"ICON\" && position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n if (!imageRefs.current.has(iconUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = iconUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(iconUrl, img);\r\n }\r\n }\r\n\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!imageRefs.current.has(floralUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = floralUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(floralUrl, img);\r\n }\r\n }\r\n\r\n // Load thread color images for TEXT positions\r\n if (position.type === \"TEXT\") {\r\n // Load color image if position has color\r\n if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n }\r\n\r\n // Load character color images\r\n if (\r\n position.character_colors &&\r\n position.character_colors.length > 0\r\n ) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load thread color images for ICON positions\r\n if (position.type === \"ICON\" && position.layer_colors) {\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n loadImages();\r\n }, [config]);\r\n\r\n // Render canvas\r\n useEffect(() => {\r\n const renderCanvas = () => {\r\n if (!canvasRef.current || !config.sides || config.sides.length === 0) {\r\n return;\r\n }\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Clear with white background\r\n ctx.fillStyle = \"#FFFFFF\";\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Collect floral images (for later drawing)\r\n const floralAssets: HTMLImageElement[] = [];\r\n const seenFlorals = new Set<string>();\r\n if (config.sides) {\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!seenFlorals.has(floralUrl)) {\r\n const img = imageRefs.current.get(floralUrl);\r\n if (img && img.complete && img.naturalWidth > 0) {\r\n floralAssets.push(img);\r\n seenFlorals.add(floralUrl);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Helper function to draw mockup and florals\r\n const drawMockupAndFlorals = () => {\r\n const mockupImg = imageRefs.current.get(\"mockup\");\r\n const margin = 40; // small padding\r\n let mockupBox: { x: number; y: number; w: number; h: number } | null =\r\n null;\r\n if (mockupImg && mockupImg.complete && mockupImg.naturalWidth > 0) {\r\n const maxTargetWidth = Math.min(1800, canvas.width * 0.375);\r\n const maxTargetHeight = canvas.height * 0.375;\r\n const scale = Math.min(\r\n maxTargetWidth / mockupImg.naturalWidth,\r\n maxTargetHeight / mockupImg.naturalHeight\r\n );\r\n const targetWidth = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalWidth * scale)\r\n );\r\n const targetHeight = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalHeight * scale)\r\n );\r\n const targetX = canvas.width - margin - targetWidth;\r\n const targetY = canvas.height - margin - targetHeight;\r\n mockupBox = {\r\n x: targetX,\r\n y: targetY,\r\n w: targetWidth,\r\n h: targetHeight,\r\n };\r\n ctx.drawImage(mockupImg, targetX, targetY, targetWidth, targetHeight);\r\n }\r\n\r\n // Draw florals to the left of mockup\r\n if (mockupBox && floralAssets.length > 0) {\r\n const spacing = 300;\r\n const targetHeight = mockupBox.h;\r\n const floralFixedH = Math.min(900, targetHeight);\r\n let currentX = mockupBox.x - spacing;\r\n for (let i = floralAssets.length - 1; i >= 0; i--) {\r\n const img = floralAssets[i];\r\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\r\n const h = floralFixedH;\r\n const w = Math.max(1, Math.floor(h * ratio));\r\n currentX -= w;\r\n const y = mockupBox.y + (targetHeight - h);\r\n ctx.drawImage(img, currentX, y, w, h);\r\n currentX -= spacing;\r\n }\r\n }\r\n };\r\n\r\n // New approach: Draw images first (bottom layer), then text on top\r\n // This allows text to overlay images when needed\r\n\r\n // Pass 1: Measure actual height with original size (use offscreen canvas for measurement)\r\n const measureCanvas = document.createElement(\"canvas\");\r\n measureCanvas.width = canvas.width;\r\n measureCanvas.height = canvas.height;\r\n const measureCtx = measureCanvas.getContext(\"2d\");\r\n if (!measureCtx) return;\r\n\r\n // Set up measurement context\r\n measureCtx.font = ctx.font;\r\n measureCtx.textAlign = ctx.textAlign;\r\n measureCtx.textBaseline = ctx.textBaseline;\r\n\r\n let measureY = 40;\r\n const measureSpacing = 100;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n measureCtx,\r\n side,\r\n measureY,\r\n canvas.width,\r\n 1\r\n );\r\n measureY += sideHeight + measureSpacing;\r\n });\r\n const totalMeasuredHeight = measureY; // Total height used\r\n\r\n // Calculate scale factor - only scale down when necessary\r\n // Keep original font sizes (no scale up) - font size is the maximum\r\n const topPadding = 40;\r\n // No bottom padding - content can go to bottom, mockup will overlay\r\n const targetContentHeight = canvas.height - topPadding;\r\n\r\n // Only scale down if content exceeds canvas height\r\n // Never scale up - preserve original font sizes\r\n let scaleFactor = 1;\r\n if (totalMeasuredHeight > targetContentHeight) {\r\n // Scale down to fit exactly\r\n scaleFactor = targetContentHeight / totalMeasuredHeight;\r\n scaleFactor = Math.max(0.5, scaleFactor); // Minimum scale to prevent tiny fonts\r\n }\r\n // If content fits, keep scaleFactor = 1 (original font sizes)\r\n\r\n // Draw mockup and florals first (bottom layer)\r\n drawMockupAndFlorals();\r\n\r\n // Draw content on top (top layer) - text will overlay images if needed\r\n let currentY = topPadding * scaleFactor;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n ctx,\r\n side,\r\n currentY,\r\n canvas.width,\r\n scaleFactor\r\n );\r\n currentY += sideHeight + measureSpacing * scaleFactor;\r\n });\r\n };\r\n\r\n // Delay rendering to ensure fonts and images are loaded\r\n const timer = setTimeout(renderCanvas, 100);\r\n return () => clearTimeout(timer);\r\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\r\n\r\n // Helper function to wrap and draw text with word wrapping\r\n // Returns: { height: number, lastLineWidth: number, lastLineY: number }\r\n const fillTextWrapped = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): { height: number; lastLineWidth: number; lastLineY: number } => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n let currentLine = words[0];\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line) => {\r\n ctx.fillText(line, x, currentY);\r\n currentY += lineHeight;\r\n });\r\n\r\n const lastLineWidth = ctx.measureText(lines[lines.length - 1]).width;\r\n const lastLineY = y + (lines.length - 1) * lineHeight;\r\n\r\n return {\r\n height: lines.length * lineHeight,\r\n lastLineWidth,\r\n lastLineY,\r\n };\r\n };\r\n\r\n // Helper to wrap and draw multi-color text (for character_colors)\r\n const fillTextWrappedMultiColor = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n colors: string[],\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): number => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n const lineStartIndices: number[] = [0];\r\n let currentLine = words[0];\r\n let currentCharIndex = words[0].length;\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n lineStartIndices.push(currentCharIndex + 1); // +1 for space\r\n currentLine = word;\r\n currentCharIndex += word.length + 1;\r\n } else {\r\n currentLine = testLine;\r\n currentCharIndex += word.length + 1;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line, lineIdx) => {\r\n let currentX = x;\r\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const globalCharIdx = startCharIdx + i;\r\n const colorIndex = globalCharIdx % colors.length;\r\n const color = colors[colorIndex];\r\n ctx.fillStyle = COLOR_MAP[color] || \"#000000\";\r\n ctx.fillText(char, currentX, currentY);\r\n currentX += ctx.measureText(char).width;\r\n }\r\n currentY += lineHeight;\r\n });\r\n\r\n return lines.length * lineHeight;\r\n };\r\n\r\n const renderSide = (\r\n ctx: CanvasRenderingContext2D,\r\n side: any,\r\n startY: number,\r\n width: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n let currentY = startY;\r\n const padding = 40 * scaleFactor;\r\n const sideWidth = width - 2 * padding;\r\n const sectionHeight = 200 * scaleFactor;\r\n\r\n // No background section anymore - just white background\r\n\r\n // Group positions by common properties for optimization\r\n const textGroups: Array<{\r\n positions: Array<Position & { type: \"TEXT\" }>;\r\n properties: any;\r\n }> = [];\r\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\r\n let currentProps: any = null;\r\n\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") {\r\n if (\r\n !currentGroup ||\r\n currentProps.font !== position.font ||\r\n currentProps.text_shape !== position.text_shape ||\r\n currentProps.color !== position.color ||\r\n currentProps.character_colors?.join(\",\") !==\r\n position.character_colors?.join(\",\")\r\n ) {\r\n // Start new group\r\n if (currentGroup) {\r\n textGroups.push({\r\n positions: currentGroup,\r\n properties: currentProps,\r\n });\r\n }\r\n currentGroup = [position];\r\n currentProps = {\r\n font: position.font,\r\n text_shape: position.text_shape,\r\n color: position.color,\r\n character_colors: position.character_colors,\r\n };\r\n } else {\r\n currentGroup.push(position);\r\n }\r\n }\r\n });\r\n\r\n if (currentGroup) {\r\n textGroups.push({ positions: currentGroup, properties: currentProps });\r\n }\r\n\r\n // Draw side header\r\n ctx.save();\r\n const headerFontSize = 200 * scaleFactor;\r\n ctx.font = `bold ${headerFontSize}px Times New Roman`;\r\n ctx.fillStyle = \"#000000\";\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n const headerResult = fillTextWrapped(\r\n ctx,\r\n side.print_side.toUpperCase(),\r\n padding,\r\n currentY,\r\n sideWidth,\r\n headerFontSize\r\n );\r\n currentY += headerResult.height + 50 * scaleFactor;\r\n ctx.restore();\r\n\r\n // Compute side-level uniform properties across all TEXT positions\r\n const allTextPositions: Array<Position & { type: \"TEXT\" }> = [];\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") allTextPositions.push(position as any);\r\n });\r\n\r\n const sideFonts = new Set(allTextPositions.map((p) => (p as any).font));\r\n const sideShapes = new Set(\r\n allTextPositions.map((p) => (p as any).text_shape)\r\n );\r\n const sideFlorals = new Set(\r\n allTextPositions.map((p) => (p as any).floral_pattern ?? \"None\")\r\n );\r\n const colorKeyOf = (p: any) =>\r\n p.character_colors && p.character_colors.length > 0\r\n ? p.character_colors.join(\",\")\r\n : p.color ?? \"None\";\r\n const sideColors = new Set(allTextPositions.map((p) => colorKeyOf(p)));\r\n\r\n const sideUniform = {\r\n font: sideFonts.size === 1,\r\n shape: sideShapes.size === 1,\r\n floral: sideFlorals.size === 1,\r\n color: sideColors.size === 1,\r\n };\r\n\r\n // Render side-level labels once for uniform properties\r\n currentY += renderSideUniformLabels(\r\n ctx,\r\n {\r\n font: sideUniform.font ? [...sideFonts][0] : null,\r\n shape: sideUniform.shape ? [...sideShapes][0] : null,\r\n floral: sideUniform.floral ? [...sideFlorals][0] : null,\r\n color: sideUniform.color ? [...sideColors][0] : null,\r\n },\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n\r\n // Render text groups first\r\n let sideTextCounter = 1;\r\n textGroups.forEach((group, groupIndex) => {\r\n group.positions.forEach((position, index) => {\r\n if (index === 0 && groupIndex !== 0) currentY += 50 * scaleFactor;\r\n const drawnHeight = renderText(\r\n ctx,\r\n position,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n sideTextCounter,\r\n {\r\n font: !sideUniform.font,\r\n shape: !sideUniform.shape,\r\n floral: !sideUniform.floral,\r\n color: !sideUniform.color,\r\n },\r\n scaleFactor\r\n );\r\n sideTextCounter += 1;\r\n // add padding only if something was actually drawn\r\n if (drawnHeight > 0) {\r\n currentY += drawnHeight + 40 * scaleFactor;\r\n }\r\n });\r\n });\r\n\r\n // Render ICON titles/values (no images here)\r\n currentY += 30 * scaleFactor; // minimal spacing before icon labels\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"ICON\") {\r\n currentY += renderIconLabels(\r\n ctx,\r\n position as any,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n currentY += 10 * scaleFactor;\r\n }\r\n });\r\n\r\n return Math.max(currentY - startY, sectionHeight);\r\n };\r\n\r\n const renderSideUniformLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n values: {\r\n font: string | null;\r\n shape: string | null;\r\n floral: string | null;\r\n color: string | null;\r\n },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 20 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n let rendered = 0;\r\n if (values.font) {\r\n const fontText = `Font: ${values.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.shape && values.shape !== \"None\") {\r\n const shapeText = `Kiểu chữ: ${values.shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.color && values.color !== \"None\") {\r\n const colorText = `Màu chỉ: ${values.color}`;\r\n // Reserve space for swatches (estimate: max 5 swatches × 200px each = 1000px)\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n // Draw swatches inline for side-level color, preserving aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor;\r\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n const colorTokens = values.color.includes(\",\")\r\n ? values.color.split(\",\").map((s) => s.trim())\r\n : [values.color];\r\n colorTokens.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.floral && values.floral !== \"None\") {\r\n const floralText = `Mẫu hoa: ${values.floral}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (rendered > 0) cursorY += 50 * scaleFactor; // extra gap before first text line\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const renderText = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"TEXT\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n displayIndex: number,\r\n showLabels: {\r\n font: boolean;\r\n shape: boolean;\r\n floral: boolean;\r\n color: boolean;\r\n },\r\n scaleFactor: number = 1\r\n ): number => {\r\n ctx.save();\r\n\r\n // Info labels\r\n // Unified font sizing for labels and content (side title uses its own larger size)\r\n const infoLineGap = 30 * scaleFactor;\r\n const labelFontFamily = \"Arial\";\r\n // Use a unified content font size for both labels and text content\r\n const fontSize = 180 * scaleFactor;\r\n const infoFontSize = fontSize;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let currentYCursor = y;\r\n let drawnHeight = 0; // accumulate only when something is actually drawn\r\n\r\n // Text value with unified font size\r\n const displayText = position.text;\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n\r\n // Label for text line\r\n const textLabel = `Text ${displayIndex}: `;\r\n ctx.font = `bold ${fontSize}px ${labelFontFamily}`;\r\n const labelWidth = ctx.measureText(textLabel).width;\r\n ctx.fillStyle = \"#444444\";\r\n ctx.fillText(textLabel, x, currentYCursor);\r\n\r\n // Calculate available width for text content\r\n const textMaxWidth = maxWidth - labelWidth;\r\n\r\n // Handle character_colors (alternating colors)\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n // Switch to content font\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n const textHeight = fillTextWrappedMultiColor(\r\n ctx,\r\n displayText,\r\n position.character_colors,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textHeight;\r\n drawnHeight += textHeight;\r\n } else {\r\n // No color specified\r\n // Draw text in content font, black (non-bold)\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || \"#000000\";\r\n const textResult = fillTextWrapped(\r\n ctx,\r\n displayText,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textResult.height;\r\n drawnHeight += textResult.height;\r\n }\r\n\r\n // After text, print Kiểu chữ (when not uniform), then Font and Color as needed\r\n currentYCursor += infoLineGap;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.fillStyle = \"#444444\";\r\n if (showLabels.shape && position.text_shape) {\r\n const shapeLabelAfter = `Kiểu chữ: ${position.text_shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeLabelAfter,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.font && position.font) {\r\n const fontLabel = `Font: ${position.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontLabel,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.color) {\r\n let colorLabelValue = \"None\";\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n colorLabelValue = position.character_colors.join(\", \");\r\n } else if (position.color) {\r\n colorLabelValue = position.color;\r\n }\r\n if (colorLabelValue !== \"None\") {\r\n const colorLabel = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorLabel,\r\n x,\r\n currentYCursor,\r\n textMaxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n\r\n // Draw color swatch images inline with Color label for TEXT, preserve aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(infoFontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n result.lastLineY + Math.floor(infoFontSize / 2 - swatchH / 2);\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n } else if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n }\r\n }\r\n\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n }\r\n\r\n // Show floral label after color block when not uniform at side level\r\n if (showLabels.floral && position.floral_pattern) {\r\n const floralText = `Mẫu hoa: ${position.floral_pattern}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n\r\n // (Floral per-position label is printed above the text when needed; avoid duplicate after text)\r\n\r\n ctx.restore();\r\n return drawnHeight;\r\n };\r\n\r\n const renderIconLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"ICON\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 30 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n const iconText = position.icon === 0 \r\n ? `Icon: icon mặc định theo file thêu` \r\n : `Icon: ${position.icon}`;\r\n const iconResult = fillTextWrapped(\r\n ctx,\r\n iconText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n // draw icon image inline with text, preserve aspect ratio; match line height\r\n if (position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n const img = imageRefs.current.get(iconUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const swatchH = fontSize;\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n // Put icon on last line of wrapped text\r\n const iconX =\r\n x + Math.ceil(iconResult.lastLineWidth) + 100 * scaleFactor;\r\n const iconY =\r\n iconResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n ctx.drawImage(img, iconX, iconY, swatchW, swatchH);\r\n }\r\n }\r\n cursorY += iconResult.height;\r\n\r\n // Draw color line only when there are layer colors\r\n if (position.layer_colors && position.layer_colors.length > 0) {\r\n const colorLabelValue = position.layer_colors.join(\", \");\r\n const colorText = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const colorResult = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n\r\n // Draw color swatch images (only for icon)\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025); // 75% of previous size\r\n let swatchX =\r\n x + Math.ceil(colorResult.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n colorResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor; // spacing between swatches\r\n }\r\n });\r\n cursorY += colorResult.height;\r\n }\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const loadFont = (fontName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Try to load from CDN\r\n const fontUrl = `${FONT_BASE_URL}/${encodeURIComponent(fontName)}.woff2`;\r\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\r\n\r\n fontFace\r\n .load()\r\n .then((loadedFont) => {\r\n document.fonts.add(loadedFont);\r\n resolve();\r\n })\r\n .catch(() => {\r\n // Font loading failed, will use fallback\r\n console.warn(`Could not load font ${fontName} from CDN`);\r\n resolve(); // Still resolve to not block rendering\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div className={`render-embroidery${className ? ` ${className}` : \"\"}`} style={style}>\r\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmbroideryQCImage;\r\n"],"names":["_jsx"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index.js
CHANGED
|
@@ -603,10 +603,7 @@ const EmbroideryQCImage = ({ config, className = "", style = {}, }) => {
|
|
|
603
603
|
let currentYCursor = y;
|
|
604
604
|
let drawnHeight = 0; // accumulate only when something is actually drawn
|
|
605
605
|
// Text value with unified font size
|
|
606
|
-
|
|
607
|
-
if (position.change_character_to_heart && displayText.includes("<3")) {
|
|
608
|
-
displayText = displayText.replace(/<3/g, "❤");
|
|
609
|
-
}
|
|
606
|
+
const displayText = position.text;
|
|
610
607
|
ctx.textAlign = "left";
|
|
611
608
|
ctx.textBaseline = "top";
|
|
612
609
|
// Label for text line
|
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\";\r\nimport { EmbroideryQCImageProps, Position } from \"../types\";\r\nimport \"./EmbroideryQCImage.css\";\r\n\r\n// Color mapping\r\nconst COLOR_MAP: Record<string, string> = {\r\n \"Army (1394)\": \"#4B5320\",\r\n Army: \"#4B5320\",\r\n \"Black (8)\": \"#000000\",\r\n Black: \"#000000\",\r\n \"Bubblegum (1309)\": \"#FFC1CC\",\r\n Bubblegum: \"#FFC1CC\",\r\n \"Carolina Blue (1274)\": \"#7BAFD4\",\r\n \"Carolina Blue\": \"#7BAFD4\",\r\n \"Celadon (1098)\": \"#ACE1AF\",\r\n Celadon: \"#ACE1AF\",\r\n \"Coffee Bean (1145)\": \"#6F4E37\",\r\n \"Coffee Bean\": \"#6F4E37\",\r\n \"Daffodil (1180)\": \"#FFFF31\",\r\n Daffodil: \"#FFFF31\",\r\n \"Dark Gray (1131)\": \"#A9A9A9\",\r\n \"Dark Gray\": \"#A9A9A9\",\r\n \"Doe Skin Beige (1344)\": \"#F5E6D3\",\r\n \"Doe Skin Beige\": \"#F5E6D3\",\r\n \"Dusty Blue (1373)\": \"#6699CC\",\r\n \"Dusty Blue\": \"#6699CC\",\r\n \"Forest Green (1397)\": \"#228B22\",\r\n \"Forest Green\": \"#228B22\",\r\n \"Gold (1425)\": \"#FFD700\",\r\n Gold: \"#FFD700\",\r\n \"Gray (1118)\": \"#808080\",\r\n Gray: \"#808080\",\r\n \"Ivory (1072)\": \"#FFFFF0\",\r\n Ivory: \"#FFFFF0\",\r\n \"Lavender (1032)\": \"#E6E6FA\",\r\n Lavender: \"#E6E6FA\",\r\n \"Light Denim (1133)\": \"#B0C4DE\",\r\n \"Light Denim\": \"#B0C4DE\",\r\n \"Light Salmon (1018)\": \"#FFA07A\",\r\n \"Light Salmon\": \"#FFA07A\",\r\n \"Maroon (1374)\": \"#800000\",\r\n Maroon: \"#800000\",\r\n \"Navy Blue (1044)\": \"#000080\",\r\n \"Navy Blue\": \"#000080\",\r\n \"Olive Green (1157)\": \"#556B2F\",\r\n \"Olive Green\": \"#556B2F\",\r\n \"Orange (1278)\": \"#FFA500\",\r\n Orange: \"#FFA500\",\r\n \"Peach Blush (1053)\": \"#FFCCCB\",\r\n \"Peach Blush\": \"#FFCCCB\",\r\n \"Pink (1148)\": \"#FFC0CB\",\r\n Pink: \"#FFC0CB\",\r\n \"Purple (1412)\": \"#800080\",\r\n Purple: \"#800080\",\r\n \"Red (1037)\": \"#FF0000\",\r\n Red: \"#FF0000\",\r\n \"Silver Sage (1396)\": \"#A8A8A8\",\r\n \"Silver Sage\": \"#A8A8A8\",\r\n \"Summer Sky (1432)\": \"#87CEEB\",\r\n \"Summer Sky\": \"#87CEEB\",\r\n \"Terra Cotta (1477)\": \"#E2725B\",\r\n \"Terra Cotta\": \"#E2725B\",\r\n \"Sand (1055)\": \"#F4A460\",\r\n Sand: \"#F4A460\",\r\n \"White (9)\": \"#FFFFFF\",\r\n White: \"#FFFFFF\",\r\n};\r\n\r\nconst FONT_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\";\r\nconst ICON_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\";\r\nconst FLORAL_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\";\r\nconst THREAD_COLOR_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\";\r\n\r\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\r\n config,\r\n className = \"\",\r\n style = {},\r\n}) => {\r\n const [canvasSize] = useState({ width: 4200, height: 4800 });\r\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\r\n const [imagesLoaded, setImagesLoaded] = useState(0);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\r\n\r\n // Load fonts\r\n useEffect(() => {\r\n const loadFonts = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n const fontsToLoad = new Set<string>();\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.font) {\r\n fontsToLoad.add(position.font);\r\n }\r\n });\r\n });\r\n\r\n for (const fontName of fontsToLoad) {\r\n if (loadedFonts.has(fontName)) continue;\r\n\r\n try {\r\n await loadFont(fontName);\r\n setLoadedFonts((prev) => new Set(prev).add(fontName));\r\n } catch (error) {\r\n console.warn(`Could not load font ${fontName}:`, error);\r\n }\r\n }\r\n };\r\n\r\n loadFonts();\r\n }, [config.sides, loadedFonts]);\r\n\r\n // Load images\r\n useEffect(() => {\r\n const loadImages = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n // Load mockup image (not background). It will be drawn at bottom-right.\r\n if (config.image_url) {\r\n // Try with CORS first. If it fails (no CORS headers), retry without CORS\r\n const loadMockup = (useCors: boolean) => {\r\n const img = new Image();\r\n if (useCors) img.crossOrigin = \"anonymous\";\r\n img.onload = () => {\r\n imageRefs.current.set(\"mockup\", img);\r\n setImagesLoaded((prev) => prev + 1);\r\n };\r\n img.onerror = () => {\r\n if (useCors) {\r\n // Retry without CORS; canvas may become tainted on export\r\n loadMockup(false);\r\n }\r\n };\r\n img.src = config.image_url as string;\r\n };\r\n loadMockup(true);\r\n }\r\n\r\n // Load icons\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"ICON\" && position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n if (!imageRefs.current.has(iconUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = iconUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(iconUrl, img);\r\n }\r\n }\r\n\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!imageRefs.current.has(floralUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = floralUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(floralUrl, img);\r\n }\r\n }\r\n\r\n // Load thread color images for TEXT positions\r\n if (position.type === \"TEXT\") {\r\n // Load color image if position has color\r\n if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n }\r\n\r\n // Load character color images\r\n if (\r\n position.character_colors &&\r\n position.character_colors.length > 0\r\n ) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load thread color images for ICON positions\r\n if (position.type === \"ICON\" && position.layer_colors) {\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n loadImages();\r\n }, [config]);\r\n\r\n // Render canvas\r\n useEffect(() => {\r\n const renderCanvas = () => {\r\n if (!canvasRef.current || !config.sides || config.sides.length === 0) {\r\n return;\r\n }\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Clear with white background\r\n ctx.fillStyle = \"#FFFFFF\";\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Collect floral images (for later drawing)\r\n const floralAssets: HTMLImageElement[] = [];\r\n const seenFlorals = new Set<string>();\r\n if (config.sides) {\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!seenFlorals.has(floralUrl)) {\r\n const img = imageRefs.current.get(floralUrl);\r\n if (img && img.complete && img.naturalWidth > 0) {\r\n floralAssets.push(img);\r\n seenFlorals.add(floralUrl);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Helper function to draw mockup and florals\r\n const drawMockupAndFlorals = () => {\r\n const mockupImg = imageRefs.current.get(\"mockup\");\r\n const margin = 40; // small padding\r\n let mockupBox: { x: number; y: number; w: number; h: number } | null =\r\n null;\r\n if (mockupImg && mockupImg.complete && mockupImg.naturalWidth > 0) {\r\n const maxTargetWidth = Math.min(1800, canvas.width * 0.375);\r\n const maxTargetHeight = canvas.height * 0.375;\r\n const scale = Math.min(\r\n maxTargetWidth / mockupImg.naturalWidth,\r\n maxTargetHeight / mockupImg.naturalHeight\r\n );\r\n const targetWidth = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalWidth * scale)\r\n );\r\n const targetHeight = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalHeight * scale)\r\n );\r\n const targetX = canvas.width - margin - targetWidth;\r\n const targetY = canvas.height - margin - targetHeight;\r\n mockupBox = {\r\n x: targetX,\r\n y: targetY,\r\n w: targetWidth,\r\n h: targetHeight,\r\n };\r\n ctx.drawImage(mockupImg, targetX, targetY, targetWidth, targetHeight);\r\n }\r\n\r\n // Draw florals to the left of mockup\r\n if (mockupBox && floralAssets.length > 0) {\r\n const spacing = 300;\r\n const targetHeight = mockupBox.h;\r\n const floralFixedH = Math.min(900, targetHeight);\r\n let currentX = mockupBox.x - spacing;\r\n for (let i = floralAssets.length - 1; i >= 0; i--) {\r\n const img = floralAssets[i];\r\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\r\n const h = floralFixedH;\r\n const w = Math.max(1, Math.floor(h * ratio));\r\n currentX -= w;\r\n const y = mockupBox.y + (targetHeight - h);\r\n ctx.drawImage(img, currentX, y, w, h);\r\n currentX -= spacing;\r\n }\r\n }\r\n };\r\n\r\n // New approach: Draw images first (bottom layer), then text on top\r\n // This allows text to overlay images when needed\r\n\r\n // Pass 1: Measure actual height with original size (use offscreen canvas for measurement)\r\n const measureCanvas = document.createElement(\"canvas\");\r\n measureCanvas.width = canvas.width;\r\n measureCanvas.height = canvas.height;\r\n const measureCtx = measureCanvas.getContext(\"2d\");\r\n if (!measureCtx) return;\r\n\r\n // Set up measurement context\r\n measureCtx.font = ctx.font;\r\n measureCtx.textAlign = ctx.textAlign;\r\n measureCtx.textBaseline = ctx.textBaseline;\r\n\r\n let measureY = 40;\r\n const measureSpacing = 100;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n measureCtx,\r\n side,\r\n measureY,\r\n canvas.width,\r\n 1\r\n );\r\n measureY += sideHeight + measureSpacing;\r\n });\r\n const totalMeasuredHeight = measureY; // Total height used\r\n\r\n // Calculate scale factor - only scale down when necessary\r\n // Keep original font sizes (no scale up) - font size is the maximum\r\n const topPadding = 40;\r\n // No bottom padding - content can go to bottom, mockup will overlay\r\n const targetContentHeight = canvas.height - topPadding;\r\n\r\n // Only scale down if content exceeds canvas height\r\n // Never scale up - preserve original font sizes\r\n let scaleFactor = 1;\r\n if (totalMeasuredHeight > targetContentHeight) {\r\n // Scale down to fit exactly\r\n scaleFactor = targetContentHeight / totalMeasuredHeight;\r\n scaleFactor = Math.max(0.5, scaleFactor); // Minimum scale to prevent tiny fonts\r\n }\r\n // If content fits, keep scaleFactor = 1 (original font sizes)\r\n\r\n // Draw mockup and florals first (bottom layer)\r\n drawMockupAndFlorals();\r\n\r\n // Draw content on top (top layer) - text will overlay images if needed\r\n let currentY = topPadding * scaleFactor;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n ctx,\r\n side,\r\n currentY,\r\n canvas.width,\r\n scaleFactor\r\n );\r\n currentY += sideHeight + measureSpacing * scaleFactor;\r\n });\r\n };\r\n\r\n // Delay rendering to ensure fonts and images are loaded\r\n const timer = setTimeout(renderCanvas, 100);\r\n return () => clearTimeout(timer);\r\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\r\n\r\n // Helper function to wrap and draw text with word wrapping\r\n // Returns: { height: number, lastLineWidth: number, lastLineY: number }\r\n const fillTextWrapped = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): { height: number; lastLineWidth: number; lastLineY: number } => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n let currentLine = words[0];\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line) => {\r\n ctx.fillText(line, x, currentY);\r\n currentY += lineHeight;\r\n });\r\n\r\n const lastLineWidth = ctx.measureText(lines[lines.length - 1]).width;\r\n const lastLineY = y + (lines.length - 1) * lineHeight;\r\n\r\n return {\r\n height: lines.length * lineHeight,\r\n lastLineWidth,\r\n lastLineY,\r\n };\r\n };\r\n\r\n // Helper to wrap and draw multi-color text (for character_colors)\r\n const fillTextWrappedMultiColor = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n colors: string[],\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): number => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n const lineStartIndices: number[] = [0];\r\n let currentLine = words[0];\r\n let currentCharIndex = words[0].length;\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n lineStartIndices.push(currentCharIndex + 1); // +1 for space\r\n currentLine = word;\r\n currentCharIndex += word.length + 1;\r\n } else {\r\n currentLine = testLine;\r\n currentCharIndex += word.length + 1;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line, lineIdx) => {\r\n let currentX = x;\r\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const globalCharIdx = startCharIdx + i;\r\n const colorIndex = globalCharIdx % colors.length;\r\n const color = colors[colorIndex];\r\n ctx.fillStyle = COLOR_MAP[color] || \"#000000\";\r\n ctx.fillText(char, currentX, currentY);\r\n currentX += ctx.measureText(char).width;\r\n }\r\n currentY += lineHeight;\r\n });\r\n\r\n return lines.length * lineHeight;\r\n };\r\n\r\n const renderSide = (\r\n ctx: CanvasRenderingContext2D,\r\n side: any,\r\n startY: number,\r\n width: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n let currentY = startY;\r\n const padding = 40 * scaleFactor;\r\n const sideWidth = width - 2 * padding;\r\n const sectionHeight = 200 * scaleFactor;\r\n\r\n // No background section anymore - just white background\r\n\r\n // Group positions by common properties for optimization\r\n const textGroups: Array<{\r\n positions: Array<Position & { type: \"TEXT\" }>;\r\n properties: any;\r\n }> = [];\r\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\r\n let currentProps: any = null;\r\n\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") {\r\n if (\r\n !currentGroup ||\r\n currentProps.font !== position.font ||\r\n currentProps.text_shape !== position.text_shape ||\r\n currentProps.color !== position.color ||\r\n currentProps.character_colors?.join(\",\") !==\r\n position.character_colors?.join(\",\")\r\n ) {\r\n // Start new group\r\n if (currentGroup) {\r\n textGroups.push({\r\n positions: currentGroup,\r\n properties: currentProps,\r\n });\r\n }\r\n currentGroup = [position];\r\n currentProps = {\r\n font: position.font,\r\n text_shape: position.text_shape,\r\n color: position.color,\r\n character_colors: position.character_colors,\r\n };\r\n } else {\r\n currentGroup.push(position);\r\n }\r\n }\r\n });\r\n\r\n if (currentGroup) {\r\n textGroups.push({ positions: currentGroup, properties: currentProps });\r\n }\r\n\r\n // Draw side header\r\n ctx.save();\r\n const headerFontSize = 200 * scaleFactor;\r\n ctx.font = `bold ${headerFontSize}px Times New Roman`;\r\n ctx.fillStyle = \"#000000\";\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n const headerResult = fillTextWrapped(\r\n ctx,\r\n side.print_side.toUpperCase(),\r\n padding,\r\n currentY,\r\n sideWidth,\r\n headerFontSize\r\n );\r\n currentY += headerResult.height + 50 * scaleFactor;\r\n ctx.restore();\r\n\r\n // Compute side-level uniform properties across all TEXT positions\r\n const allTextPositions: Array<Position & { type: \"TEXT\" }> = [];\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") allTextPositions.push(position as any);\r\n });\r\n\r\n const sideFonts = new Set(allTextPositions.map((p) => (p as any).font));\r\n const sideShapes = new Set(\r\n allTextPositions.map((p) => (p as any).text_shape)\r\n );\r\n const sideFlorals = new Set(\r\n allTextPositions.map((p) => (p as any).floral_pattern ?? \"None\")\r\n );\r\n const colorKeyOf = (p: any) =>\r\n p.character_colors && p.character_colors.length > 0\r\n ? p.character_colors.join(\",\")\r\n : p.color ?? \"None\";\r\n const sideColors = new Set(allTextPositions.map((p) => colorKeyOf(p)));\r\n\r\n const sideUniform = {\r\n font: sideFonts.size === 1,\r\n shape: sideShapes.size === 1,\r\n floral: sideFlorals.size === 1,\r\n color: sideColors.size === 1,\r\n };\r\n\r\n // Render side-level labels once for uniform properties\r\n currentY += renderSideUniformLabels(\r\n ctx,\r\n {\r\n font: sideUniform.font ? [...sideFonts][0] : null,\r\n shape: sideUniform.shape ? [...sideShapes][0] : null,\r\n floral: sideUniform.floral ? [...sideFlorals][0] : null,\r\n color: sideUniform.color ? [...sideColors][0] : null,\r\n },\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n\r\n // Render text groups first\r\n let sideTextCounter = 1;\r\n textGroups.forEach((group, groupIndex) => {\r\n group.positions.forEach((position, index) => {\r\n if (index === 0 && groupIndex !== 0) currentY += 50 * scaleFactor;\r\n const drawnHeight = renderText(\r\n ctx,\r\n position,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n sideTextCounter,\r\n {\r\n font: !sideUniform.font,\r\n shape: !sideUniform.shape,\r\n floral: !sideUniform.floral,\r\n color: !sideUniform.color,\r\n },\r\n scaleFactor\r\n );\r\n sideTextCounter += 1;\r\n // add padding only if something was actually drawn\r\n if (drawnHeight > 0) {\r\n currentY += drawnHeight + 40 * scaleFactor;\r\n }\r\n });\r\n });\r\n\r\n // Render ICON titles/values (no images here)\r\n currentY += 30 * scaleFactor; // minimal spacing before icon labels\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"ICON\") {\r\n currentY += renderIconLabels(\r\n ctx,\r\n position as any,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n currentY += 10 * scaleFactor;\r\n }\r\n });\r\n\r\n return Math.max(currentY - startY, sectionHeight);\r\n };\r\n\r\n const renderSideUniformLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n values: {\r\n font: string | null;\r\n shape: string | null;\r\n floral: string | null;\r\n color: string | null;\r\n },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 20 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n let rendered = 0;\r\n if (values.font) {\r\n const fontText = `Font: ${values.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.shape && values.shape !== \"None\") {\r\n const shapeText = `Kiểu chữ: ${values.shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.color && values.color !== \"None\") {\r\n const colorText = `Màu chỉ: ${values.color}`;\r\n // Reserve space for swatches (estimate: max 5 swatches × 200px each = 1000px)\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n // Draw swatches inline for side-level color, preserving aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor;\r\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n const colorTokens = values.color.includes(\",\")\r\n ? values.color.split(\",\").map((s) => s.trim())\r\n : [values.color];\r\n colorTokens.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.floral && values.floral !== \"None\") {\r\n const floralText = `Mẫu hoa: ${values.floral}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (rendered > 0) cursorY += 50 * scaleFactor; // extra gap before first text line\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const renderText = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"TEXT\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n displayIndex: number,\r\n showLabels: {\r\n font: boolean;\r\n shape: boolean;\r\n floral: boolean;\r\n color: boolean;\r\n },\r\n scaleFactor: number = 1\r\n ): number => {\r\n ctx.save();\r\n\r\n // Info labels\r\n // Unified font sizing for labels and content (side title uses its own larger size)\r\n const infoLineGap = 30 * scaleFactor;\r\n const labelFontFamily = \"Arial\";\r\n // Use a unified content font size for both labels and text content\r\n const fontSize = 180 * scaleFactor;\r\n const infoFontSize = fontSize;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let currentYCursor = y;\r\n let drawnHeight = 0; // accumulate only when something is actually drawn\r\n\r\n // Text value with unified font size\r\n let displayText = position.text;\r\n if (position.change_character_to_heart && displayText.includes(\"<3\")) {\r\n displayText = displayText.replace(/<3/g, \"❤\");\r\n }\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n\r\n // Label for text line\r\n const textLabel = `Text ${displayIndex}: `;\r\n ctx.font = `bold ${fontSize}px ${labelFontFamily}`;\r\n const labelWidth = ctx.measureText(textLabel).width;\r\n ctx.fillStyle = \"#444444\";\r\n ctx.fillText(textLabel, x, currentYCursor);\r\n\r\n // Calculate available width for text content\r\n const textMaxWidth = maxWidth - labelWidth;\r\n\r\n // Handle character_colors (alternating colors)\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n // Switch to content font\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n const textHeight = fillTextWrappedMultiColor(\r\n ctx,\r\n displayText,\r\n position.character_colors,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textHeight;\r\n drawnHeight += textHeight;\r\n } else {\r\n // No color specified\r\n // Draw text in content font, black (non-bold)\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || \"#000000\";\r\n const textResult = fillTextWrapped(\r\n ctx,\r\n displayText,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textResult.height;\r\n drawnHeight += textResult.height;\r\n }\r\n\r\n // After text, print Kiểu chữ (when not uniform), then Font and Color as needed\r\n currentYCursor += infoLineGap;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.fillStyle = \"#444444\";\r\n if (showLabels.shape && position.text_shape) {\r\n const shapeLabelAfter = `Kiểu chữ: ${position.text_shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeLabelAfter,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.font && position.font) {\r\n const fontLabel = `Font: ${position.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontLabel,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.color) {\r\n let colorLabelValue = \"None\";\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n colorLabelValue = position.character_colors.join(\", \");\r\n } else if (position.color) {\r\n colorLabelValue = position.color;\r\n }\r\n if (colorLabelValue !== \"None\") {\r\n const colorLabel = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorLabel,\r\n x,\r\n currentYCursor,\r\n textMaxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n\r\n // Draw color swatch images inline with Color label for TEXT, preserve aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(infoFontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n result.lastLineY + Math.floor(infoFontSize / 2 - swatchH / 2);\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n } else if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n }\r\n }\r\n\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n }\r\n\r\n // Show floral label after color block when not uniform at side level\r\n if (showLabels.floral && position.floral_pattern) {\r\n const floralText = `Mẫu hoa: ${position.floral_pattern}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n\r\n // (Floral per-position label is printed above the text when needed; avoid duplicate after text)\r\n\r\n ctx.restore();\r\n return drawnHeight;\r\n };\r\n\r\n const renderIconLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"ICON\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 30 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n const iconText = position.icon === 0 \r\n ? `Icon: icon mặc định theo file thêu` \r\n : `Icon: ${position.icon}`;\r\n const iconResult = fillTextWrapped(\r\n ctx,\r\n iconText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n // draw icon image inline with text, preserve aspect ratio; match line height\r\n if (position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n const img = imageRefs.current.get(iconUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const swatchH = fontSize;\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n // Put icon on last line of wrapped text\r\n const iconX =\r\n x + Math.ceil(iconResult.lastLineWidth) + 100 * scaleFactor;\r\n const iconY =\r\n iconResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n ctx.drawImage(img, iconX, iconY, swatchW, swatchH);\r\n }\r\n }\r\n cursorY += iconResult.height;\r\n\r\n // Draw color line only when there are layer colors\r\n if (position.layer_colors && position.layer_colors.length > 0) {\r\n const colorLabelValue = position.layer_colors.join(\", \");\r\n const colorText = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const colorResult = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n\r\n // Draw color swatch images (only for icon)\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025); // 75% of previous size\r\n let swatchX =\r\n x + Math.ceil(colorResult.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n colorResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor; // spacing between swatches\r\n }\r\n });\r\n cursorY += colorResult.height;\r\n }\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const loadFont = (fontName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Try to load from CDN\r\n const fontUrl = `${FONT_BASE_URL}/${encodeURIComponent(fontName)}.woff2`;\r\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\r\n\r\n fontFace\r\n .load()\r\n .then((loadedFont) => {\r\n document.fonts.add(loadedFont);\r\n resolve();\r\n })\r\n .catch(() => {\r\n // Font loading failed, will use fallback\r\n console.warn(`Could not load font ${fontName} from CDN`);\r\n resolve(); // Still resolve to not block rendering\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div className={`render-embroidery${className ? ` ${className}` : \"\"}`} style={style}>\r\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmbroideryQCImage;\r\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\";\r\nimport { EmbroideryQCImageProps, Position } from \"../types\";\r\nimport \"./EmbroideryQCImage.css\";\r\n\r\n// Color mapping\r\nconst COLOR_MAP: Record<string, string> = {\r\n \"Army (1394)\": \"#4B5320\",\r\n Army: \"#4B5320\",\r\n \"Black (8)\": \"#000000\",\r\n Black: \"#000000\",\r\n \"Bubblegum (1309)\": \"#FFC1CC\",\r\n Bubblegum: \"#FFC1CC\",\r\n \"Carolina Blue (1274)\": \"#7BAFD4\",\r\n \"Carolina Blue\": \"#7BAFD4\",\r\n \"Celadon (1098)\": \"#ACE1AF\",\r\n Celadon: \"#ACE1AF\",\r\n \"Coffee Bean (1145)\": \"#6F4E37\",\r\n \"Coffee Bean\": \"#6F4E37\",\r\n \"Daffodil (1180)\": \"#FFFF31\",\r\n Daffodil: \"#FFFF31\",\r\n \"Dark Gray (1131)\": \"#A9A9A9\",\r\n \"Dark Gray\": \"#A9A9A9\",\r\n \"Doe Skin Beige (1344)\": \"#F5E6D3\",\r\n \"Doe Skin Beige\": \"#F5E6D3\",\r\n \"Dusty Blue (1373)\": \"#6699CC\",\r\n \"Dusty Blue\": \"#6699CC\",\r\n \"Forest Green (1397)\": \"#228B22\",\r\n \"Forest Green\": \"#228B22\",\r\n \"Gold (1425)\": \"#FFD700\",\r\n Gold: \"#FFD700\",\r\n \"Gray (1118)\": \"#808080\",\r\n Gray: \"#808080\",\r\n \"Ivory (1072)\": \"#FFFFF0\",\r\n Ivory: \"#FFFFF0\",\r\n \"Lavender (1032)\": \"#E6E6FA\",\r\n Lavender: \"#E6E6FA\",\r\n \"Light Denim (1133)\": \"#B0C4DE\",\r\n \"Light Denim\": \"#B0C4DE\",\r\n \"Light Salmon (1018)\": \"#FFA07A\",\r\n \"Light Salmon\": \"#FFA07A\",\r\n \"Maroon (1374)\": \"#800000\",\r\n Maroon: \"#800000\",\r\n \"Navy Blue (1044)\": \"#000080\",\r\n \"Navy Blue\": \"#000080\",\r\n \"Olive Green (1157)\": \"#556B2F\",\r\n \"Olive Green\": \"#556B2F\",\r\n \"Orange (1278)\": \"#FFA500\",\r\n Orange: \"#FFA500\",\r\n \"Peach Blush (1053)\": \"#FFCCCB\",\r\n \"Peach Blush\": \"#FFCCCB\",\r\n \"Pink (1148)\": \"#FFC0CB\",\r\n Pink: \"#FFC0CB\",\r\n \"Purple (1412)\": \"#800080\",\r\n Purple: \"#800080\",\r\n \"Red (1037)\": \"#FF0000\",\r\n Red: \"#FF0000\",\r\n \"Silver Sage (1396)\": \"#A8A8A8\",\r\n \"Silver Sage\": \"#A8A8A8\",\r\n \"Summer Sky (1432)\": \"#87CEEB\",\r\n \"Summer Sky\": \"#87CEEB\",\r\n \"Terra Cotta (1477)\": \"#E2725B\",\r\n \"Terra Cotta\": \"#E2725B\",\r\n \"Sand (1055)\": \"#F4A460\",\r\n Sand: \"#F4A460\",\r\n \"White (9)\": \"#FFFFFF\",\r\n White: \"#FFFFFF\",\r\n};\r\n\r\nconst FONT_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/fonts\";\r\nconst ICON_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/icons\";\r\nconst FLORAL_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/florals\";\r\nconst THREAD_COLOR_BASE_URL =\r\n \"https://s3.hn-1.cloud.cmctelecom.vn/god-system-images/embroidery/thread-colors\";\r\n\r\nconst EmbroideryQCImage: React.FC<EmbroideryQCImageProps> = ({\r\n config,\r\n className = \"\",\r\n style = {},\r\n}) => {\r\n const [canvasSize] = useState({ width: 4200, height: 4800 });\r\n const [loadedFonts, setLoadedFonts] = useState<Set<string>>(new Set());\r\n const [imagesLoaded, setImagesLoaded] = useState(0);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const imageRefs = useRef<Map<string, HTMLImageElement>>(new Map());\r\n\r\n // Load fonts\r\n useEffect(() => {\r\n const loadFonts = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n const fontsToLoad = new Set<string>();\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.font) {\r\n fontsToLoad.add(position.font);\r\n }\r\n });\r\n });\r\n\r\n for (const fontName of fontsToLoad) {\r\n if (loadedFonts.has(fontName)) continue;\r\n\r\n try {\r\n await loadFont(fontName);\r\n setLoadedFonts((prev) => new Set(prev).add(fontName));\r\n } catch (error) {\r\n console.warn(`Could not load font ${fontName}:`, error);\r\n }\r\n }\r\n };\r\n\r\n loadFonts();\r\n }, [config.sides, loadedFonts]);\r\n\r\n // Load images\r\n useEffect(() => {\r\n const loadImages = async () => {\r\n if (!config.sides || config.sides.length === 0) return;\r\n\r\n // Load mockup image (not background). It will be drawn at bottom-right.\r\n if (config.image_url) {\r\n // Try with CORS first. If it fails (no CORS headers), retry without CORS\r\n const loadMockup = (useCors: boolean) => {\r\n const img = new Image();\r\n if (useCors) img.crossOrigin = \"anonymous\";\r\n img.onload = () => {\r\n imageRefs.current.set(\"mockup\", img);\r\n setImagesLoaded((prev) => prev + 1);\r\n };\r\n img.onerror = () => {\r\n if (useCors) {\r\n // Retry without CORS; canvas may become tainted on export\r\n loadMockup(false);\r\n }\r\n };\r\n img.src = config.image_url as string;\r\n };\r\n loadMockup(true);\r\n }\r\n\r\n // Load icons\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"ICON\" && position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n if (!imageRefs.current.has(iconUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = iconUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(iconUrl, img);\r\n }\r\n }\r\n\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!imageRefs.current.has(floralUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = floralUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(floralUrl, img);\r\n }\r\n }\r\n\r\n // Load thread color images for TEXT positions\r\n if (position.type === \"TEXT\") {\r\n // Load color image if position has color\r\n if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n }\r\n\r\n // Load character color images\r\n if (\r\n position.character_colors &&\r\n position.character_colors.length > 0\r\n ) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load thread color images for ICON positions\r\n if (position.type === \"ICON\" && position.layer_colors) {\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n if (!imageRefs.current.has(threadColorUrl)) {\r\n const img = new Image();\r\n img.crossOrigin = \"anonymous\";\r\n img.src = threadColorUrl;\r\n img.onload = () => setImagesLoaded((prev) => prev + 1);\r\n imageRefs.current.set(threadColorUrl, img);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n loadImages();\r\n }, [config]);\r\n\r\n // Render canvas\r\n useEffect(() => {\r\n const renderCanvas = () => {\r\n if (!canvasRef.current || !config.sides || config.sides.length === 0) {\r\n return;\r\n }\r\n\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Clear with white background\r\n ctx.fillStyle = \"#FFFFFF\";\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Collect floral images (for later drawing)\r\n const floralAssets: HTMLImageElement[] = [];\r\n const seenFlorals = new Set<string>();\r\n if (config.sides) {\r\n config.sides.forEach((side) => {\r\n side.positions.forEach((position) => {\r\n if (position.type === \"TEXT\" && position.floral_pattern) {\r\n const floralUrl = `${FLORAL_BASE_URL}/${position.floral_pattern}.png`;\r\n if (!seenFlorals.has(floralUrl)) {\r\n const img = imageRefs.current.get(floralUrl);\r\n if (img && img.complete && img.naturalWidth > 0) {\r\n floralAssets.push(img);\r\n seenFlorals.add(floralUrl);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Helper function to draw mockup and florals\r\n const drawMockupAndFlorals = () => {\r\n const mockupImg = imageRefs.current.get(\"mockup\");\r\n const margin = 40; // small padding\r\n let mockupBox: { x: number; y: number; w: number; h: number } | null =\r\n null;\r\n if (mockupImg && mockupImg.complete && mockupImg.naturalWidth > 0) {\r\n const maxTargetWidth = Math.min(1800, canvas.width * 0.375);\r\n const maxTargetHeight = canvas.height * 0.375;\r\n const scale = Math.min(\r\n maxTargetWidth / mockupImg.naturalWidth,\r\n maxTargetHeight / mockupImg.naturalHeight\r\n );\r\n const targetWidth = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalWidth * scale)\r\n );\r\n const targetHeight = Math.max(\r\n 1,\r\n Math.floor(mockupImg.naturalHeight * scale)\r\n );\r\n const targetX = canvas.width - margin - targetWidth;\r\n const targetY = canvas.height - margin - targetHeight;\r\n mockupBox = {\r\n x: targetX,\r\n y: targetY,\r\n w: targetWidth,\r\n h: targetHeight,\r\n };\r\n ctx.drawImage(mockupImg, targetX, targetY, targetWidth, targetHeight);\r\n }\r\n\r\n // Draw florals to the left of mockup\r\n if (mockupBox && floralAssets.length > 0) {\r\n const spacing = 300;\r\n const targetHeight = mockupBox.h;\r\n const floralFixedH = Math.min(900, targetHeight);\r\n let currentX = mockupBox.x - spacing;\r\n for (let i = floralAssets.length - 1; i >= 0; i--) {\r\n const img = floralAssets[i];\r\n const ratio = img.naturalWidth / Math.max(1, img.naturalHeight);\r\n const h = floralFixedH;\r\n const w = Math.max(1, Math.floor(h * ratio));\r\n currentX -= w;\r\n const y = mockupBox.y + (targetHeight - h);\r\n ctx.drawImage(img, currentX, y, w, h);\r\n currentX -= spacing;\r\n }\r\n }\r\n };\r\n\r\n // New approach: Draw images first (bottom layer), then text on top\r\n // This allows text to overlay images when needed\r\n\r\n // Pass 1: Measure actual height with original size (use offscreen canvas for measurement)\r\n const measureCanvas = document.createElement(\"canvas\");\r\n measureCanvas.width = canvas.width;\r\n measureCanvas.height = canvas.height;\r\n const measureCtx = measureCanvas.getContext(\"2d\");\r\n if (!measureCtx) return;\r\n\r\n // Set up measurement context\r\n measureCtx.font = ctx.font;\r\n measureCtx.textAlign = ctx.textAlign;\r\n measureCtx.textBaseline = ctx.textBaseline;\r\n\r\n let measureY = 40;\r\n const measureSpacing = 100;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n measureCtx,\r\n side,\r\n measureY,\r\n canvas.width,\r\n 1\r\n );\r\n measureY += sideHeight + measureSpacing;\r\n });\r\n const totalMeasuredHeight = measureY; // Total height used\r\n\r\n // Calculate scale factor - only scale down when necessary\r\n // Keep original font sizes (no scale up) - font size is the maximum\r\n const topPadding = 40;\r\n // No bottom padding - content can go to bottom, mockup will overlay\r\n const targetContentHeight = canvas.height - topPadding;\r\n\r\n // Only scale down if content exceeds canvas height\r\n // Never scale up - preserve original font sizes\r\n let scaleFactor = 1;\r\n if (totalMeasuredHeight > targetContentHeight) {\r\n // Scale down to fit exactly\r\n scaleFactor = targetContentHeight / totalMeasuredHeight;\r\n scaleFactor = Math.max(0.5, scaleFactor); // Minimum scale to prevent tiny fonts\r\n }\r\n // If content fits, keep scaleFactor = 1 (original font sizes)\r\n\r\n // Draw mockup and florals first (bottom layer)\r\n drawMockupAndFlorals();\r\n\r\n // Draw content on top (top layer) - text will overlay images if needed\r\n let currentY = topPadding * scaleFactor;\r\n config.sides.forEach((side) => {\r\n const sideHeight = renderSide(\r\n ctx,\r\n side,\r\n currentY,\r\n canvas.width,\r\n scaleFactor\r\n );\r\n currentY += sideHeight + measureSpacing * scaleFactor;\r\n });\r\n };\r\n\r\n // Delay rendering to ensure fonts and images are loaded\r\n const timer = setTimeout(renderCanvas, 100);\r\n return () => clearTimeout(timer);\r\n }, [config, canvasSize, loadedFonts, imagesLoaded]);\r\n\r\n // Helper function to wrap and draw text with word wrapping\r\n // Returns: { height: number, lastLineWidth: number, lastLineY: number }\r\n const fillTextWrapped = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): { height: number; lastLineWidth: number; lastLineY: number } => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n let currentLine = words[0];\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line) => {\r\n ctx.fillText(line, x, currentY);\r\n currentY += lineHeight;\r\n });\r\n\r\n const lastLineWidth = ctx.measureText(lines[lines.length - 1]).width;\r\n const lastLineY = y + (lines.length - 1) * lineHeight;\r\n\r\n return {\r\n height: lines.length * lineHeight,\r\n lastLineWidth,\r\n lastLineY,\r\n };\r\n };\r\n\r\n // Helper to wrap and draw multi-color text (for character_colors)\r\n const fillTextWrappedMultiColor = (\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n colors: string[],\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n lineHeight: number\r\n ): number => {\r\n const words = text.split(\" \");\r\n const lines: string[] = [];\r\n const lineStartIndices: number[] = [0];\r\n let currentLine = words[0];\r\n let currentCharIndex = words[0].length;\r\n\r\n for (let i = 1; i < words.length; i++) {\r\n const word = words[i];\r\n const testLine = currentLine + \" \" + word;\r\n const metrics = ctx.measureText(testLine);\r\n if (metrics.width > maxWidth && currentLine.length > 0) {\r\n lines.push(currentLine);\r\n lineStartIndices.push(currentCharIndex + 1); // +1 for space\r\n currentLine = word;\r\n currentCharIndex += word.length + 1;\r\n } else {\r\n currentLine = testLine;\r\n currentCharIndex += word.length + 1;\r\n }\r\n }\r\n lines.push(currentLine);\r\n\r\n let currentY = y;\r\n lines.forEach((line, lineIdx) => {\r\n let currentX = x;\r\n const startCharIdx = lineIdx > 0 ? lineStartIndices[lineIdx] : 0;\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const globalCharIdx = startCharIdx + i;\r\n const colorIndex = globalCharIdx % colors.length;\r\n const color = colors[colorIndex];\r\n ctx.fillStyle = COLOR_MAP[color] || \"#000000\";\r\n ctx.fillText(char, currentX, currentY);\r\n currentX += ctx.measureText(char).width;\r\n }\r\n currentY += lineHeight;\r\n });\r\n\r\n return lines.length * lineHeight;\r\n };\r\n\r\n const renderSide = (\r\n ctx: CanvasRenderingContext2D,\r\n side: any,\r\n startY: number,\r\n width: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n let currentY = startY;\r\n const padding = 40 * scaleFactor;\r\n const sideWidth = width - 2 * padding;\r\n const sectionHeight = 200 * scaleFactor;\r\n\r\n // No background section anymore - just white background\r\n\r\n // Group positions by common properties for optimization\r\n const textGroups: Array<{\r\n positions: Array<Position & { type: \"TEXT\" }>;\r\n properties: any;\r\n }> = [];\r\n let currentGroup: Array<Position & { type: \"TEXT\" }> | null = null;\r\n let currentProps: any = null;\r\n\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") {\r\n if (\r\n !currentGroup ||\r\n currentProps.font !== position.font ||\r\n currentProps.text_shape !== position.text_shape ||\r\n currentProps.color !== position.color ||\r\n currentProps.character_colors?.join(\",\") !==\r\n position.character_colors?.join(\",\")\r\n ) {\r\n // Start new group\r\n if (currentGroup) {\r\n textGroups.push({\r\n positions: currentGroup,\r\n properties: currentProps,\r\n });\r\n }\r\n currentGroup = [position];\r\n currentProps = {\r\n font: position.font,\r\n text_shape: position.text_shape,\r\n color: position.color,\r\n character_colors: position.character_colors,\r\n };\r\n } else {\r\n currentGroup.push(position);\r\n }\r\n }\r\n });\r\n\r\n if (currentGroup) {\r\n textGroups.push({ positions: currentGroup, properties: currentProps });\r\n }\r\n\r\n // Draw side header\r\n ctx.save();\r\n const headerFontSize = 200 * scaleFactor;\r\n ctx.font = `bold ${headerFontSize}px Times New Roman`;\r\n ctx.fillStyle = \"#000000\";\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n const headerResult = fillTextWrapped(\r\n ctx,\r\n side.print_side.toUpperCase(),\r\n padding,\r\n currentY,\r\n sideWidth,\r\n headerFontSize\r\n );\r\n currentY += headerResult.height + 50 * scaleFactor;\r\n ctx.restore();\r\n\r\n // Compute side-level uniform properties across all TEXT positions\r\n const allTextPositions: Array<Position & { type: \"TEXT\" }> = [];\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"TEXT\") allTextPositions.push(position as any);\r\n });\r\n\r\n const sideFonts = new Set(allTextPositions.map((p) => (p as any).font));\r\n const sideShapes = new Set(\r\n allTextPositions.map((p) => (p as any).text_shape)\r\n );\r\n const sideFlorals = new Set(\r\n allTextPositions.map((p) => (p as any).floral_pattern ?? \"None\")\r\n );\r\n const colorKeyOf = (p: any) =>\r\n p.character_colors && p.character_colors.length > 0\r\n ? p.character_colors.join(\",\")\r\n : p.color ?? \"None\";\r\n const sideColors = new Set(allTextPositions.map((p) => colorKeyOf(p)));\r\n\r\n const sideUniform = {\r\n font: sideFonts.size === 1,\r\n shape: sideShapes.size === 1,\r\n floral: sideFlorals.size === 1,\r\n color: sideColors.size === 1,\r\n };\r\n\r\n // Render side-level labels once for uniform properties\r\n currentY += renderSideUniformLabels(\r\n ctx,\r\n {\r\n font: sideUniform.font ? [...sideFonts][0] : null,\r\n shape: sideUniform.shape ? [...sideShapes][0] : null,\r\n floral: sideUniform.floral ? [...sideFlorals][0] : null,\r\n color: sideUniform.color ? [...sideColors][0] : null,\r\n },\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n\r\n // Render text groups first\r\n let sideTextCounter = 1;\r\n textGroups.forEach((group, groupIndex) => {\r\n group.positions.forEach((position, index) => {\r\n if (index === 0 && groupIndex !== 0) currentY += 50 * scaleFactor;\r\n const drawnHeight = renderText(\r\n ctx,\r\n position,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n sideTextCounter,\r\n {\r\n font: !sideUniform.font,\r\n shape: !sideUniform.shape,\r\n floral: !sideUniform.floral,\r\n color: !sideUniform.color,\r\n },\r\n scaleFactor\r\n );\r\n sideTextCounter += 1;\r\n // add padding only if something was actually drawn\r\n if (drawnHeight > 0) {\r\n currentY += drawnHeight + 40 * scaleFactor;\r\n }\r\n });\r\n });\r\n\r\n // Render ICON titles/values (no images here)\r\n currentY += 30 * scaleFactor; // minimal spacing before icon labels\r\n side.positions.forEach((position: Position) => {\r\n if (position.type === \"ICON\") {\r\n currentY += renderIconLabels(\r\n ctx,\r\n position as any,\r\n padding,\r\n currentY,\r\n sideWidth,\r\n scaleFactor\r\n );\r\n currentY += 10 * scaleFactor;\r\n }\r\n });\r\n\r\n return Math.max(currentY - startY, sectionHeight);\r\n };\r\n\r\n const renderSideUniformLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n values: {\r\n font: string | null;\r\n shape: string | null;\r\n floral: string | null;\r\n color: string | null;\r\n },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 20 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n let rendered = 0;\r\n if (values.font) {\r\n const fontText = `Font: ${values.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.shape && values.shape !== \"None\") {\r\n const shapeText = `Kiểu chữ: ${values.shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.color && values.color !== \"None\") {\r\n const colorText = `Màu chỉ: ${values.color}`;\r\n // Reserve space for swatches (estimate: max 5 swatches × 200px each = 1000px)\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n // Draw swatches inline for side-level color, preserving aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor;\r\n const swatchY = result.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n const colorTokens = values.color.includes(\",\")\r\n ? values.color.split(\",\").map((s) => s.trim())\r\n : [values.color];\r\n colorTokens.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (values.floral && values.floral !== \"None\") {\r\n const floralText = `Mẫu hoa: ${values.floral}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n cursorY += result.height;\r\n rendered++;\r\n }\r\n if (rendered > 0) cursorY += 50 * scaleFactor; // extra gap before first text line\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const renderText = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"TEXT\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n displayIndex: number,\r\n showLabels: {\r\n font: boolean;\r\n shape: boolean;\r\n floral: boolean;\r\n color: boolean;\r\n },\r\n scaleFactor: number = 1\r\n ): number => {\r\n ctx.save();\r\n\r\n // Info labels\r\n // Unified font sizing for labels and content (side title uses its own larger size)\r\n const infoLineGap = 30 * scaleFactor;\r\n const labelFontFamily = \"Arial\";\r\n // Use a unified content font size for both labels and text content\r\n const fontSize = 180 * scaleFactor;\r\n const infoFontSize = fontSize;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let currentYCursor = y;\r\n let drawnHeight = 0; // accumulate only when something is actually drawn\r\n\r\n // Text value with unified font size\r\n const displayText = position.text;\r\n\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n\r\n // Label for text line\r\n const textLabel = `Text ${displayIndex}: `;\r\n ctx.font = `bold ${fontSize}px ${labelFontFamily}`;\r\n const labelWidth = ctx.measureText(textLabel).width;\r\n ctx.fillStyle = \"#444444\";\r\n ctx.fillText(textLabel, x, currentYCursor);\r\n\r\n // Calculate available width for text content\r\n const textMaxWidth = maxWidth - labelWidth;\r\n\r\n // Handle character_colors (alternating colors)\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n // Switch to content font\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n const textHeight = fillTextWrappedMultiColor(\r\n ctx,\r\n displayText,\r\n position.character_colors,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textHeight;\r\n drawnHeight += textHeight;\r\n } else {\r\n // No color specified\r\n // Draw text in content font, black (non-bold)\r\n ctx.font = `${fontSize}px ${position.font}`;\r\n ctx.fillStyle = COLOR_MAP[position.color ?? \"None\"] || \"#000000\";\r\n const textResult = fillTextWrapped(\r\n ctx,\r\n displayText,\r\n x + labelWidth,\r\n currentYCursor,\r\n textMaxWidth,\r\n fontSize\r\n );\r\n currentYCursor += textResult.height;\r\n drawnHeight += textResult.height;\r\n }\r\n\r\n // After text, print Kiểu chữ (when not uniform), then Font and Color as needed\r\n currentYCursor += infoLineGap;\r\n ctx.font = `${infoFontSize}px ${labelFontFamily}`;\r\n ctx.fillStyle = \"#444444\";\r\n if (showLabels.shape && position.text_shape) {\r\n const shapeLabelAfter = `Kiểu chữ: ${position.text_shape}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n shapeLabelAfter,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.font && position.font) {\r\n const fontLabel = `Font: ${position.font}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n fontLabel,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n if (showLabels.color) {\r\n let colorLabelValue = \"None\";\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n colorLabelValue = position.character_colors.join(\", \");\r\n } else if (position.color) {\r\n colorLabelValue = position.color;\r\n }\r\n if (colorLabelValue !== \"None\") {\r\n const colorLabel = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const result = fillTextWrapped(\r\n ctx,\r\n colorLabel,\r\n x,\r\n currentYCursor,\r\n textMaxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n\r\n // Draw color swatch images inline with Color label for TEXT, preserve aspect ratio; 75% of previous size\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(infoFontSize * 2.025);\r\n let swatchX = x + Math.ceil(result.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n result.lastLineY + Math.floor(infoFontSize / 2 - swatchH / 2);\r\n if (position.character_colors && position.character_colors.length > 0) {\r\n position.character_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor;\r\n }\r\n });\r\n } else if (position.color) {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${position.color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n }\r\n }\r\n\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n }\r\n\r\n // Show floral label after color block when not uniform at side level\r\n if (showLabels.floral && position.floral_pattern) {\r\n const floralText = `Mẫu hoa: ${position.floral_pattern}`;\r\n const result = fillTextWrapped(\r\n ctx,\r\n floralText,\r\n x,\r\n currentYCursor,\r\n maxWidth,\r\n infoFontSize + infoLineGap\r\n );\r\n currentYCursor += result.height;\r\n drawnHeight += result.height;\r\n }\r\n\r\n // (Floral per-position label is printed above the text when needed; avoid duplicate after text)\r\n\r\n ctx.restore();\r\n return drawnHeight;\r\n };\r\n\r\n const renderIconLabels = (\r\n ctx: CanvasRenderingContext2D,\r\n position: Position & { type: \"ICON\" },\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n scaleFactor: number = 1\r\n ): number => {\r\n const labelFontFamily = \"Arial\";\r\n const fontSize = 180 * scaleFactor;\r\n const lineGap = 30 * scaleFactor;\r\n ctx.save();\r\n ctx.font = `${fontSize}px ${labelFontFamily}`;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"#444444\";\r\n\r\n let cursorY = y;\r\n const iconText = position.icon === 0 \r\n ? `Icon: icon mặc định theo file thêu` \r\n : `Icon: ${position.icon}`;\r\n const iconResult = fillTextWrapped(\r\n ctx,\r\n iconText,\r\n x,\r\n cursorY,\r\n maxWidth,\r\n fontSize + lineGap\r\n );\r\n // draw icon image inline with text, preserve aspect ratio; match line height\r\n if (position.icon !== 0) {\r\n const iconUrl = `${ICON_BASE_URL}/Icon ${position.icon}.png`;\r\n const img = imageRefs.current.get(iconUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const swatchH = fontSize;\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n // Put icon on last line of wrapped text\r\n const iconX =\r\n x + Math.ceil(iconResult.lastLineWidth) + 100 * scaleFactor;\r\n const iconY =\r\n iconResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n ctx.drawImage(img, iconX, iconY, swatchW, swatchH);\r\n }\r\n }\r\n cursorY += iconResult.height;\r\n\r\n // Draw color line only when there are layer colors\r\n if (position.layer_colors && position.layer_colors.length > 0) {\r\n const colorLabelValue = position.layer_colors.join(\", \");\r\n const colorText = `Màu chỉ: ${colorLabelValue}`;\r\n // Reserve space for swatches\r\n const swatchReserved = 1000 * scaleFactor;\r\n const textMaxWidth = Math.max(\r\n 400 * scaleFactor,\r\n maxWidth - swatchReserved\r\n );\r\n const colorResult = fillTextWrapped(\r\n ctx,\r\n colorText,\r\n x,\r\n cursorY,\r\n textMaxWidth,\r\n fontSize + lineGap\r\n );\r\n\r\n // Draw color swatch images (only for icon)\r\n // Position swatches after the last line of wrapped text\r\n const swatchH = Math.floor(fontSize * 2.025); // 75% of previous size\r\n let swatchX =\r\n x + Math.ceil(colorResult.lastLineWidth) + 100 * scaleFactor; // spacing after text\r\n const swatchY =\r\n colorResult.lastLineY + Math.floor(fontSize / 2 - swatchH / 2);\r\n position.layer_colors.forEach((color) => {\r\n const threadColorUrl = `${THREAD_COLOR_BASE_URL}/${color}.png`;\r\n const img = imageRefs.current.get(threadColorUrl);\r\n if (img && img.complete && img.naturalHeight > 0) {\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const swatchW = Math.max(1, Math.floor(swatchH * ratio));\r\n ctx.drawImage(img, swatchX, swatchY, swatchW, swatchH);\r\n swatchX += swatchW + 25 * scaleFactor; // spacing between swatches\r\n }\r\n });\r\n cursorY += colorResult.height;\r\n }\r\n\r\n ctx.restore();\r\n return cursorY - y;\r\n };\r\n\r\n const loadFont = (fontName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Try to load from CDN\r\n const fontUrl = `${FONT_BASE_URL}/${encodeURIComponent(fontName)}.woff2`;\r\n const fontFace = new FontFace(fontName, `url(${fontUrl})`);\r\n\r\n fontFace\r\n .load()\r\n .then((loadedFont) => {\r\n document.fonts.add(loadedFont);\r\n resolve();\r\n })\r\n .catch(() => {\r\n // Font loading failed, will use fallback\r\n console.warn(`Could not load font ${fontName} from CDN`);\r\n resolve(); // Still resolve to not block rendering\r\n });\r\n });\r\n };\r\n\r\n return (\r\n <div className={`render-embroidery${className ? ` ${className}` : \"\"}`} style={style}>\r\n <canvas ref={canvasRef} className=\"render-embroidery-canvas\" />\r\n </div>\r\n );\r\n};\r\n\r\nexport default EmbroideryQCImage;\r\n"],"names":["useState","useRef","useEffect","_jsx"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B"}
|