0 && stageH > 0 && (
+ {referenceHeightCm && referenceHeightCm > 0 && (
{(() => {
const marks = [];
- const cmPerStageH = product.printAreaHeightMm / 10; // total cm height of stage
- const pxPerCm = stageH / cmPerStageH;
+ const pxPerCm = DISPLAY / referenceHeightCm;
- for (let cm = 0; cm <= Math.ceil(cmPerStageH); cm += 2) {
+ for (let cm = 0; cm <= Math.ceil(referenceHeightCm); cm += 2) {
const px = cm * pxPerCm;
- if (px > stageH) break;
+ if (px > DISPLAY) break;
marks.push(
(null);
+ const [referenceHeightCm, setReferenceHeightCm] = useState(null);
const stageFrontRef = useRef(null);
const stageBackRef = useRef(null);
@@ -439,14 +443,12 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) {
const activeStageW = activePrintArea.wPct * DISPLAY;
const activeStageH = activePrintArea.hPct * DISPLAY;
- // Calculate cm per pixel for display
- const printAreaWidthPx = activePrintArea.wPct * DISPLAY;
- // printAreaWidthMm is in mm, divide by 10 to get cm
- // printAreaWidthPx is in pixels
- // cmPerPx = cm per pixel
- const mmPerPx = printAreaWidthPx > 0 ? product.printAreaWidthMm / printAreaWidthPx : 0;
- const cmPerPx = mmPerPx > 0 ? mmPerPx / 10 : 0;
+ // Calculate cm per pixel for display using reference size
+ // Reference size maps to full canvas width/height (560px)
+ const cmPerPx = referenceWidthCm && referenceWidthCm > 0 ? referenceWidthCm / DISPLAY : 0;
+ const cmPerPxHeight = referenceHeightCm && referenceHeightCm > 0 ? referenceHeightCm / DISPLAY : 0;
const pxToCm = (px: number) => {
+ if (!cmPerPx || cmPerPx <= 0) return '—';
const cm = px * cmPerPx;
return isNaN(cm) ? '?' : cm.toFixed(2);
};
@@ -748,6 +750,8 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) {
onNodeReady={() => setNodeReadyTick((t) => t + 1)}
scale={canvasScale}
product={product}
+ referenceWidthCm={referenceWidthCm}
+ referenceHeightCm={referenceHeightCm}
/>
{hasBack && (
@@ -766,6 +770,8 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) {
onNodeReady={() => setNodeReadyTick((t) => t + 1)}
scale={canvasScale}
product={product}
+ referenceWidthCm={referenceWidthCm}
+ referenceHeightCm={referenceHeightCm}
/>
)}
>
@@ -855,6 +861,38 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) {
)}
+ {canPersonalize && (
+
+
Reference Size (cm)
+
+
+ )}
+
{canPersonalize && (
@@ -1002,9 +1040,9 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) {
- {elementsFront.length === 0 && elementsBack.length === 0 && (
+ {canPersonalize && (!referenceWidthCm || !referenceHeightCm) && (
+
+ )}
+ {canPersonalize && (elementsFront.length === 0 && elementsBack.length === 0) && (referenceWidthCm && referenceHeightCm) && (
Added to your bag.