"use client"; import React from "react"; import { getFullImageUrl } from "@/lib/api/client"; import { WatermarkConfig } from "@/types/report"; interface Props { watermark: WatermarkConfig; /** 캔버스/페이지 너비 (px) */ width: number; /** 캔버스/페이지 높이 (px) */ height: number; } /** * 워터마크 레이어 공용 컴포넌트 * * ReportDesignerCanvas 와 ReportPreviewModal 양쪽에서 사용. * imageUrl 이 "data:" 로 시작하면 그대로 사용하고, * 서버 경로인 경우 getFullImageUrl 로 변환한다. */ export function WatermarkLayer({ watermark, width, height }: Props) { const baseStyle: React.CSSProperties = { position: "absolute", top: 0, left: 0, width: "100%", height: "100%", pointerEvents: "none", overflow: "hidden", zIndex: 1, }; const rotation = watermark.rotation ?? -45; const resolveImageSrc = (url: string): string => (url.startsWith("data:") ? url : getFullImageUrl(url)); const renderContent = (tileFontSize?: number) => { if (watermark.type === "text") { return ( {watermark.text || "WATERMARK"} ); } if (watermark.imageUrl) { return null; // 이미지는 각 스타일 블록에서 직접 렌더링 } return null; }; // 대각선 스타일 if (watermark.style === "diagonal") { return (
{watermark.type === "text" ? renderContent() : watermark.imageUrl && ( watermark )}
); } // 중앙 스타일 if (watermark.style === "center") { return (
{watermark.type === "text" ? renderContent() : watermark.imageUrl && ( watermark )}
); } // 타일 스타일 if (watermark.style === "tile") { const tileRotation = watermark.rotation ?? -30; const tileSize = watermark.type === "text" ? (watermark.fontSize || 48) * 4 : 150; const cols = Math.ceil(width / tileSize) + 2; const rows = Math.ceil(height / tileSize) + 2; return (
{Array.from({ length: rows * cols }).map((_, index) => (
{watermark.type === "text" ? renderContent(watermark.fontSize || 24) : watermark.imageUrl && ( watermark )}
))}
); } return null; }