@newtil/drawing 0.1.0
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/LICENSE +9 -0
- package/README.md +21 -0
- package/dist/index.cjs +1235 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +255 -0
- package/dist/index.d.ts +255 -0
- package/dist/index.js +1224 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/_styles.ts","../src/i18n.ts","../src/model.ts","../src/render.ts","../src/board.ts","../src/index.ts"],"names":["shape"],"mappings":"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","file":"index.cjs","sourcesContent":["// 자동 생성 — scripts/build-styles.mjs. 직접 고치지 말고 src/styles.css 를 고칠 것\nexport const STYLES: string = \"/* @newtil/drawing — 그림판 팝업. 자기 shadow root 에 주입되므로 호스트 페이지와 서로 안 섞인다 */\\n:host { all: initial; }\\n* { box-sizing: border-box; }\\n\\n.nd-backdrop {\\n position: fixed;\\n inset: 0;\\n z-index: 2147483000;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: rgba(0, 0, 0, 0.45);\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Apple SD Gothic Neo\\\", \\\"Malgun Gothic\\\", sans-serif;\\n font-size: 13px;\\n color: #111;\\n}\\n.nd-dialog {\\n display: flex;\\n flex-direction: column;\\n width: min(96vw, 1280px);\\n height: min(94vh, 900px);\\n background: #fff;\\n border-radius: 12px;\\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);\\n outline: none;\\n overflow: hidden;\\n}\\n\\n/* ─── 툴바 ─── */\\n.nd-toolbar {\\n display: flex;\\n flex-wrap: wrap;\\n align-items: center;\\n gap: 8px;\\n padding: 8px 12px;\\n border-bottom: 1px solid #e5e5e5;\\n background: #fafafa;\\n}\\n.nd-group { display: flex; align-items: center; gap: 2px; }\\n.nd-group + .nd-group { padding-left: 8px; border-left: 1px solid #e0e0e0; }\\n.nd-group--end { margin-left: auto; border-left: 0 !important; }\\n.nd-btn {\\n min-width: 30px;\\n height: 30px;\\n padding: 0 6px;\\n border: 1px solid transparent;\\n border-radius: 6px;\\n background: transparent;\\n color: #333;\\n font: 15px/1 inherit;\\n font-family: inherit;\\n cursor: pointer;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 4px;\\n}\\n.nd-btn svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\\n.nd-btn:hover { background: #ececec; }\\n.nd-btn[aria-pressed=\\\"true\\\"] { background: #e3edf9; border-color: #4a90e2; color: #1a5fb4; }\\n.nd-btn:disabled { opacity: 0.35; cursor: default; }\\n.nd-btn--text { padding: 0 12px; font-size: 13px; font-weight: 600; border: 1px solid #d0d0d0; background: #fff; }\\n.nd-btn--primary { background: #4a90e2; border-color: #4a90e2; color: #fff; }\\n.nd-btn--primary:hover { background: #3b7fd1; }\\n.nd-swatch { width: 22px; min-width: 22px; height: 22px; padding: 0; border-radius: 50%; background: var(--swatch); border: 2px solid #fff; box-shadow: 0 0 0 1px #c8c8c8; }\\n.nd-swatch:hover { background: var(--swatch); }\\n.nd-swatch[aria-pressed=\\\"true\\\"] { box-shadow: 0 0 0 2px #4a90e2; background: var(--swatch); }\\n.nd-color-input { width: 22px; height: 22px; padding: 0; border: 0; background: none; cursor: pointer; }\\n.nd-range { width: 80px; accent-color: #4a90e2; }\\n.nd-label { font-size: 11px; color: #777; margin-left: 4px; white-space: nowrap; }\\n.nd-stroke-preview { display: inline-block; width: 18px; border-radius: 2px; background: #333; }\\n\\n/* ─── 판 ─── */\\n.nd-stage {\\n position: relative;\\n flex: 1;\\n min-height: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 12px;\\n background: #ececec;\\n overflow: hidden;\\n}\\n.nd-canvas {\\n position: relative;\\n background: #fff;\\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);\\n overflow: hidden;\\n}\\n.nd-bg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; user-select: none; }\\n.nd-bg[hidden] { display: none; }\\n.nd-svg { position: absolute; inset: 0; width: 100%; height: 100%; touch-action: none; cursor: crosshair; overflow: visible; }\\n.nd-svg[data-tool=\\\"select\\\"] { cursor: default; }\\n/* 그리는 도구에선 도형이 이벤트를 먹지 않는다. 선택 도구에선 잡기용 투명 굵은 획(.nd-hit)이 맞는다 */\\n.nd-svg [data-shape] * { pointer-events: none; }\\n.nd-svg[data-tool=\\\"select\\\"] [data-shape] .nd-hit { pointer-events: stroke; cursor: move; }\\n.nd-svg[data-tool=\\\"select\\\"] [data-shape] rect.nd-hit,\\n.nd-svg[data-tool=\\\"select\\\"] [data-shape] ellipse.nd-hit,\\n.nd-svg[data-tool=\\\"select\\\"] [data-shape] circle.nd-hit { pointer-events: all; }\\n.nd-selection * { pointer-events: none; }\\n.nd-svg[data-tool=\\\"select\\\"] .nd-handle { pointer-events: all; }\\n.nd-handle[data-handle=\\\"nw\\\"], .nd-handle[data-handle=\\\"se\\\"] { cursor: nwse-resize; }\\n.nd-handle[data-handle=\\\"ne\\\"], .nd-handle[data-handle=\\\"sw\\\"] { cursor: nesw-resize; }\\n.nd-handle[data-handle=\\\"n\\\"], .nd-handle[data-handle=\\\"s\\\"] { cursor: ns-resize; }\\n.nd-handle[data-handle=\\\"e\\\"], .nd-handle[data-handle=\\\"w\\\"] { cursor: ew-resize; }\\n.nd-handle[data-handle=\\\"p1\\\"], .nd-handle[data-handle=\\\"p2\\\"] { cursor: grab; }\\n.nd-rubber { fill: rgba(74, 144, 226, 0.12); stroke: #4a90e2; stroke-width: 1; stroke-dasharray: 4 3; vector-effect: non-scaling-stroke; pointer-events: none; }\\n.nd-hint {\\n position: absolute;\\n inset: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 24px;\\n text-align: center;\\n color: #888;\\n font-size: 14px;\\n pointer-events: none;\\n}\\n.nd-hint[hidden] { display: none; }\\n.nd-notice {\\n position: absolute;\\n top: 16px;\\n left: 50%;\\n transform: translateX(-50%);\\n max-width: 80%;\\n padding: 8px 14px;\\n border-radius: 8px;\\n background: rgba(0, 0, 0, 0.8);\\n color: #fff;\\n font-size: 13px;\\n pointer-events: none;\\n}\\n.nd-notice[hidden] { display: none; }\\n/* 글자 인라인 편집 — 도형 자리에 겹쳐 놓는 textarea */\\n.nd-text-edit {\\n position: absolute;\\n margin: 0;\\n padding: 0;\\n border: 1px dashed #4a90e2;\\n border-radius: 2px;\\n background: rgba(255, 255, 255, 0.85);\\n color: inherit;\\n font-family: inherit;\\n font-weight: bold;\\n line-height: 1.25;\\n resize: none;\\n overflow: hidden;\\n outline: none;\\n white-space: pre;\\n min-width: 40px;\\n}\\n\\n/* ─── 발 ─── */\\n.nd-footer {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 10px 12px;\\n border-top: 1px solid #e5e5e5;\\n background: #fafafa;\\n}\\n.nd-footer .nd-status { color: #888; font-size: 12px; margin-right: auto; }\\n.nd-footer .nd-btn--bg { font-weight: 500; }\\n\";\n","export type Lang = \"ko\" | \"en\";\n\nexport interface Messages {\n title: string;\n toolSelect: string; toolPen: string; toolHighlighter: string; toolLine: string; toolArrow: string; toolArrow2: string;\n toolRect: string; toolEllipse: string; toolText: string; toolBadge: string;\n color: string; customColor: string; strokeWidth: string;\n fillNone: string; fillTranslucent: string; fillSolid: string; dashed: string; opacity: string;\n undo: string; redo: string; delete: string; duplicate: string; bringForward: string; sendBackward: string;\n background: string; clearBackground: string; zoomFit: string;\n done: string; cancel: string; saving: string;\n textPrompt: string; pasteHint: string; discardConfirm: string; exportFailed: string; saveFailed: (reason: string) => string;\n}\n\nexport const ko: Messages = {\n title: \"그림판\",\n toolSelect: \"선택·이동 (V)\", toolPen: \"펜 (P)\", toolHighlighter: \"형광펜 (H)\", toolLine: \"직선 (L)\", toolArrow: \"화살표 (A)\", toolArrow2: \"양쪽 화살표\",\n toolRect: \"사각형 (R)\", toolEllipse: \"타원 (E)\", toolText: \"글자 (T)\", toolBadge: \"번호 배지 (B)\",\n color: \"색\", customColor: \"다른 색…\", strokeWidth: \"선 굵기\",\n fillNone: \"채우기 없음\", fillTranslucent: \"반투명 채우기\", fillSolid: \"채우기\", dashed: \"점선\", opacity: \"투명도\",\n undo: \"되돌리기 (⌘Z)\", redo: \"다시 실행 (⇧⌘Z)\", delete: \"지우기 (Delete)\", duplicate: \"복제 (⌘D)\", bringForward: \"앞으로\", sendBackward: \"뒤로\",\n background: \"배경 이미지…\", clearBackground: \"배경 지우기\", zoomFit: \"화면에 맞춤\",\n done: \"완료\", cancel: \"취소\", saving: \"저장 중…\",\n textPrompt: \"넣을 글자\", pasteHint: \"캡처를 붙여넣거나(⌘V / Ctrl+V) 배경 이미지를 고르세요. 빈 판에 바로 그려도 됩니다.\",\n discardConfirm: \"그린 것을 버릴까요?\", exportFailed: \"그림을 이미지로 만들지 못했습니다.\",\n saveFailed: (reason) => `그림을 저장하지 못했습니다. 다시 시도하거나 취소하세요.\\n\\n${reason}`,\n};\n\nexport const en: Messages = {\n title: \"Drawing\",\n toolSelect: \"Select / move (V)\", toolPen: \"Pen (P)\", toolHighlighter: \"Highlighter (H)\", toolLine: \"Line (L)\", toolArrow: \"Arrow (A)\", toolArrow2: \"Double arrow\",\n toolRect: \"Rectangle (R)\", toolEllipse: \"Ellipse (E)\", toolText: \"Text (T)\", toolBadge: \"Number badge (B)\",\n color: \"Color\", customColor: \"Custom color…\", strokeWidth: \"Stroke width\",\n fillNone: \"No fill\", fillTranslucent: \"Translucent fill\", fillSolid: \"Solid fill\", dashed: \"Dashed\", opacity: \"Opacity\",\n undo: \"Undo (⌘Z)\", redo: \"Redo (⇧⌘Z)\", delete: \"Delete\", duplicate: \"Duplicate (⌘D)\", bringForward: \"Bring forward\", sendBackward: \"Send backward\",\n background: \"Background image…\", clearBackground: \"Clear background\", zoomFit: \"Fit to screen\",\n done: \"Done\", cancel: \"Cancel\", saving: \"Saving…\",\n textPrompt: \"Text\", pasteHint: \"Paste a screenshot (⌘V / Ctrl+V) or pick a background image. You can also draw on the blank board.\",\n discardConfirm: \"Discard the drawing?\", exportFailed: \"Could not render the drawing to an image.\",\n saveFailed: (reason) => `Could not save the drawing. Try again or cancel.\\n\\n${reason}`,\n};\n\nexport function messagesFor(lang?: string): Messages {\n const l = (lang ?? (typeof document !== \"undefined\" ? document.documentElement.lang : \"\") ?? \"\").toLowerCase();\n return l.startsWith(\"ko\") || l === \"\" ? ko : en;\n}\n","/**\n * 그림 데이터 — 편집기(@newtil/editor)가 곁파일로 저장하던 DrawingData v1 과 같은 모양이라 기존 곁파일이 그대로 열린다.\n * 좌표는 항상 \"판 크기(width×height)\" 기준. 화면 확대/축소는 표시일 뿐이다.\n */\n\nexport type ToolName = \"select\" | \"pen\" | \"highlighter\" | \"line\" | \"arrow\" | \"arrow2\" | \"rect\" | \"ellipse\" | \"text\" | \"badge\";\nexport type Fill = \"translucent\" | \"solid\";\n\ninterface ShapeBase {\n id: string;\n color: string;\n stroke: number;\n /** 채우기 — 사각형·타원·배지 */\n fill?: Fill | null;\n /** 점선 */\n dashed?: boolean;\n /** 전체 투명도 0~1. 없으면 1 */\n opacity?: number;\n}\nexport type Shape =\n | (ShapeBase & { type: \"rect\"; x1: number; y1: number; x2: number; y2: number; radius?: number })\n | (ShapeBase & { type: \"ellipse\"; x1: number; y1: number; x2: number; y2: number })\n | (ShapeBase & { type: \"line\" | \"arrow\" | \"arrow2\"; x1: number; y1: number; x2: number; y2: number })\n | (ShapeBase & { type: \"pen\" | \"highlighter\"; points: number[] })\n | (ShapeBase & { type: \"text\"; x: number; y: number; text: string; size: number })\n | (ShapeBase & { type: \"badge\"; x: number; y: number; n: number; size: number });\n\nexport interface Drawing {\n version: 1;\n width: number;\n height: number;\n /** 배경 캡처 — data URL. 없으면 흰 판 */\n background: string | null;\n shapes: Shape[];\n}\n\nexport type Point = { x: number; y: number };\nexport type Box = { x: number; y: number; w: number; h: number };\n\nexport const DEFAULT_SIZE = { width: 800, height: 450 };\n/** 배경 캡처의 긴 변 한도 — 레티나 캡처는 3000px 를 넘어 PNG 가 수 MB 가 된다 */\nexport const MAX_EDGE = 1600;\nexport const TRANSLUCENT = 0.25;\n/** 형광펜 — 굵고 반투명 */\nexport const HIGHLIGHTER_ALPHA = 0.35;\n\nlet seq = 0;\nexport const nextId = (): string => `s${Date.now().toString(36)}${(seq++).toString(36)}`;\n\nexport function emptyDrawing(width = DEFAULT_SIZE.width, height = DEFAULT_SIZE.height): Drawing {\n return { version: 1, width, height, background: null, shapes: [] };\n}\n\nexport function textSize(stroke: number): number { return 14 + stroke * 4; }\nexport function fillOpacity(s: Shape): number { return s.fill === \"solid\" ? 1 : s.fill === \"translucent\" ? TRANSLUCENT : 0; }\nexport function clamp(v: number, lo: number, hi: number): number { return Math.min(hi, Math.max(lo, v)); }\n\nexport function isBoxShape(s: Shape): s is Extract<Shape, { x1: number }> { return \"x1\" in s; }\nexport function isPath(s: Shape): s is Extract<Shape, { points: number[] }> { return \"points\" in s; }\nexport function isLineLike(s: Shape): boolean { return s.type === \"line\" || s.type === \"arrow\" || s.type === \"arrow2\"; }\n\n/** 도형의 바깥 상자 — 선택 표시·손잡이 자리. 글자는 대략(폰트 폭 0.6em 어림) */\nexport function bounds(s: Shape): Box {\n if (isPath(s)) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < s.points.length; i += 2) {\n const x = s.points[i]!, y = s.points[i + 1]!;\n minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y);\n }\n if (!Number.isFinite(minX)) return { x: 0, y: 0, w: 0, h: 0 };\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n if (s.type === \"text\") {\n const lines = s.text.split(\"\\n\");\n const w = Math.max(1, ...lines.map((l) => l.length)) * s.size * 0.6;\n return { x: s.x, y: s.y, w, h: lines.length * s.size * 1.25 };\n }\n if (s.type === \"badge\") {\n const r = s.size;\n return { x: s.x - r, y: s.y - r, w: r * 2, h: r * 2 };\n }\n return { x: Math.min(s.x1, s.x2), y: Math.min(s.y1, s.y2), w: Math.abs(s.x2 - s.x1), h: Math.abs(s.y2 - s.y1) };\n}\n\nexport function moveShape(s: Shape, dx: number, dy: number): void {\n if (isPath(s)) { for (let i = 0; i + 1 < s.points.length; i += 2) { s.points[i]! += dx; s.points[i + 1]! += dy; } }\n else if (s.type === \"text\" || s.type === \"badge\") { s.x += dx; s.y += dy; }\n else { s.x1 += dx; s.x2 += dx; s.y1 += dy; s.y2 += dy; }\n}\n\n/** 화살촉 세 점 */\nexport function arrowHead(x1: number, y1: number, x2: number, y2: number, stroke: number): [number, number][] {\n const len = 8 + stroke * 3, ang = Math.atan2(y2 - y1, x2 - x1), spread = Math.PI / 7;\n return [\n [x2, y2],\n [x2 - len * Math.cos(ang - spread), y2 - len * Math.sin(ang - spread)],\n [x2 - len * Math.cos(ang + spread), y2 - len * Math.sin(ang + spread)],\n ];\n}\n\n/** 펜 점들을 살짝 부드럽게(이웃 평균) — 손떨림을 줄인다. 점이 적으면 그대로 */\nexport function smoothPoints(points: number[]): number[] {\n if (points.length < 8) return points;\n const out: number[] = [points[0]!, points[1]!];\n for (let i = 2; i + 3 < points.length; i += 2) {\n out.push((points[i - 2]! + points[i]! + points[i + 2]!) / 3, (points[i - 1]! + points[i + 1]! + points[i + 3]!) / 3);\n }\n out.push(points[points.length - 2]!, points[points.length - 1]!);\n return out;\n}\n\nexport const FONT = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Apple SD Gothic Neo\", \"Malgun Gothic\", sans-serif';\n","import { FONT, HIGHLIGHTER_ALPHA, arrowHead, bounds, fillOpacity, smoothPoints, type Drawing, type Shape } from \"./model\";\n\n/** 이미지 로드 — data URL 또는 같은 출처 주소. 교차 출처는 캔버스에 못 굽는다(tainted) */\nexport function loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"image load failed\"));\n img.src = src;\n });\n}\n\nexport function blobToDataURL(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result));\n r.onerror = () => reject(r.error ?? new Error(\"read failed\"));\n r.readAsDataURL(blob);\n });\n}\n\n/** 캔버스에 도형 하나 — 화면(SVG)과 같은 규칙으로 굽는다 */\nfunction paintShape(ctx: CanvasRenderingContext2D, s: Shape): void {\n ctx.save();\n ctx.globalAlpha = s.opacity ?? 1;\n ctx.strokeStyle = s.color; ctx.fillStyle = s.color; ctx.lineWidth = s.stroke;\n ctx.setLineDash(s.dashed ? [s.stroke * 3, s.stroke * 2] : []);\n const b = bounds(s);\n switch (s.type) {\n case \"rect\": {\n const r = Math.min(s.radius ?? 0, b.w / 2, b.h / 2);\n ctx.beginPath();\n if (r > 0) ctx.roundRect(b.x, b.y, b.w, b.h, r); else ctx.rect(b.x, b.y, b.w, b.h);\n if (fillOpacity(s) > 0) { ctx.save(); ctx.globalAlpha *= fillOpacity(s); ctx.fill(); ctx.restore(); }\n ctx.stroke();\n break;\n }\n case \"ellipse\":\n ctx.beginPath();\n ctx.ellipse(b.x + b.w / 2, b.y + b.h / 2, b.w / 2, b.h / 2, 0, 0, Math.PI * 2);\n if (fillOpacity(s) > 0) { ctx.save(); ctx.globalAlpha *= fillOpacity(s); ctx.fill(); ctx.restore(); }\n ctx.stroke();\n break;\n case \"line\": case \"arrow\": case \"arrow2\": {\n ctx.lineCap = \"round\";\n ctx.beginPath(); ctx.moveTo(s.x1, s.y1); ctx.lineTo(s.x2, s.y2); ctx.stroke();\n ctx.setLineDash([]);\n const heads: [number, number][][] = [];\n if (s.type !== \"line\") heads.push(arrowHead(s.x1, s.y1, s.x2, s.y2, s.stroke));\n if (s.type === \"arrow2\") heads.push(arrowHead(s.x2, s.y2, s.x1, s.y1, s.stroke));\n for (const [a, b2, c] of heads) { ctx.beginPath(); ctx.moveTo(a![0], a![1]); ctx.lineTo(b2![0], b2![1]); ctx.lineTo(c![0], c![1]); ctx.closePath(); ctx.fill(); }\n break;\n }\n case \"pen\": case \"highlighter\": {\n const pts = s.type === \"pen\" ? smoothPoints(s.points) : s.points;\n if (pts.length < 4) break;\n ctx.lineCap = \"round\"; ctx.lineJoin = \"round\";\n if (s.type === \"highlighter\") { ctx.globalAlpha *= HIGHLIGHTER_ALPHA; ctx.lineWidth = s.stroke * 4; ctx.lineCap = \"butt\"; }\n ctx.beginPath(); ctx.moveTo(pts[0]!, pts[1]!);\n for (let i = 2; i + 1 < pts.length; i += 2) ctx.lineTo(pts[i]!, pts[i + 1]!);\n ctx.stroke();\n break;\n }\n case \"text\": {\n ctx.font = `bold ${s.size}px ${FONT}`;\n ctx.textBaseline = \"top\";\n // 배경이 어떻든 읽히게 흰 테두리를 두르고 색을 채운다(캡처 위 글자의 관례)\n ctx.lineWidth = Math.max(3, s.size / 6); ctx.strokeStyle = \"#ffffff\"; ctx.setLineDash([]);\n s.text.split(\"\\n\").forEach((line, i) => {\n ctx.strokeText(line, s.x, s.y + i * s.size * 1.25);\n ctx.fillText(line, s.x, s.y + i * s.size * 1.25);\n });\n break;\n }\n case \"badge\": {\n // 번호 배지 — 색 원 + 흰 숫자. 따라하기의 ①②③\n ctx.setLineDash([]);\n ctx.beginPath(); ctx.arc(s.x, s.y, s.size, 0, Math.PI * 2); ctx.fill();\n ctx.lineWidth = 2; ctx.strokeStyle = \"#ffffff\"; ctx.stroke();\n ctx.fillStyle = \"#ffffff\"; ctx.font = `bold ${Math.round(s.size * 1.2)}px ${FONT}`; ctx.textAlign = \"center\"; ctx.textBaseline = \"middle\";\n ctx.fillText(String(s.n), s.x, s.y + s.size * 0.05);\n break;\n }\n }\n ctx.restore();\n}\n\n/** 그림 전체를 PNG 로 — 배경 + 도형. 배경이 없으면 흰 판 */\nexport async function renderToPng(data: Drawing): Promise<Blob> {\n const c = document.createElement(\"canvas\");\n c.width = data.width; c.height = data.height;\n const ctx = c.getContext(\"2d\")!;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, c.width, c.height);\n if (data.background) ctx.drawImage(await loadImage(data.background), 0, 0, data.width, data.height);\n for (const s of data.shapes) paintShape(ctx, s);\n return new Promise((resolve, reject) => c.toBlob((b) => (b ? resolve(b) : reject(new Error(\"toBlob failed\"))), \"image/png\"));\n}\n","import { STYLES } from \"./_styles\";\nimport { messagesFor, type Messages } from \"./i18n\";\nimport {\n FONT, HIGHLIGHTER_ALPHA, MAX_EDGE, arrowHead, bounds, clamp, emptyDrawing, fillOpacity, isBoxShape, isLineLike, isPath,\n moveShape, nextId, smoothPoints, textSize, type Box, type Drawing, type Fill, type Point, type Shape, type ToolName,\n} from \"./model\";\nimport { blobToDataURL, loadImage, renderToPng } from \"./render\";\n\n/**\n * 그림판 팝업 — 캡처(배경) 위에 도형을 그리고 PNG + 데이터(재편집용)로 돌려준다.\n *\n * 자기 shadow root 안에 뜬다(스타일 격리). 좌표는 판 크기 기준이고 화면은 scale 로만 줄인다.\n * 선택 도구: 클릭·Shift 클릭·러버밴드로 고르고, 끌어 옮기고, 손잡이(상자 8개 / 선 양 끝)로 고친다. 고른 채로 색·굵기·채우기·점선·투명도를 바꾸면 그 도형들이 바뀐다.\n * 글자는 판 위에서 바로 친다(textarea 겹침), 두 번 클릭해 다시 고친다.\n * 완료 = 굽기 + (있으면) 저장 훅까지 팝업 안에서. 실패하면 이유를 알리고 열어 둔다 — 조용히 다른 형태로 넘기지 않는다.\n */\n\nexport interface OpenOptions {\n /** 다시 고칠 그림. 없으면 빈 판 */\n initial?: Drawing | null;\n /** 시작 배경 — 캡처 파일(Blob) 또는 같은 출처 이미지 주소. initial 이 있으면 무시 */\n background?: Blob | string | null;\n /** 완료 때 부른다 — 저장하고 문서에 넣을 주소 등을 돌려준다. 던지면 팝업이 열린 채 이유를 보인다 */\n save?: (png: Blob, data: Drawing) => Promise<string | void>;\n /** 열 때 잠깐 보일 안내 */\n notice?: string;\n lang?: string;\n messages?: Partial<Messages>;\n /** 팝업을 붙일 자리. 기본 document.body */\n mount?: HTMLElement;\n}\nexport interface OpenResult { data: Drawing; png: Blob; /** save 가 돌려준 값(주소 등) */ saved?: string }\n\nconst COLORS = [\"#ef4444\", \"#f97316\", \"#eab308\", \"#22c55e\", \"#3b82f6\", \"#a855f7\", \"#111111\", \"#ffffff\"];\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\ntype Handle = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\" | \"p1\" | \"p2\";\ntype Drag =\n | { kind: \"draw\"; shape: Shape }\n | { kind: \"move\"; ids: string[]; last: Point; moved: boolean }\n | { kind: \"handle\"; id: string; handle: Handle; start: Box; startShape: Shape }\n | { kind: \"rubber\"; from: Point; to: Point; additive: boolean };\n\nconst ICONS: Record<string, string> = {\n select: '<path d=\"M5 3l14 8-6 2-3 6z\"/>',\n pen: '<path d=\"M4 20l4-1 11-11-3-3L5 16z\"/>',\n highlighter: '<path d=\"M4 20h6M9 15l6-6 3 3-6 6H9z\"/><path d=\"M14 8l2-2 3 3-2 2\"/>',\n line: '<path d=\"M5 19L19 5\"/>',\n arrow: '<path d=\"M5 19L19 5M11 5h8v8\"/>',\n arrow2: '<path d=\"M5 19L19 5M11 5h8v8M13 19H5v-8\"/>',\n rect: '<rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"1\"/>',\n ellipse: '<ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\"/>',\n text: '<path d=\"M5 6h14M12 6v13\"/>',\n badge: '<circle cx=\"12\" cy=\"12\" r=\"8\"/><path d=\"M11 9l2-1v8\"/>',\n undo: '<path d=\"M9 14L4 9l5-5\"/><path d=\"M4 9h10a6 6 0 010 12h-3\"/>',\n redo: '<path d=\"M15 14l5-5-5-5\"/><path d=\"M20 9H10a6 6 0 000 12h3\"/>',\n delete: '<path d=\"M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13\"/>',\n duplicate: '<rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><path d=\"M16 8V5a1 1 0 00-1-1H5a1 1 0 00-1 1v10a1 1 0 001 1h3\"/>',\n forward: '<path d=\"M12 19V5M6 11l6-6 6 6\"/>',\n backward: '<path d=\"M12 5v14M6 13l6 6 6-6\"/>',\n fillNone: '<rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" rx=\"2\"/>',\n fillTranslucent: '<rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" rx=\"2\"/><path d=\"M5 12h14M12 5v14\" opacity=\".5\"/>',\n fillSolid: '<rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" rx=\"2\" fill=\"currentColor\"/>',\n dashed: '<path d=\"M4 12h3M10 12h4M17 12h3\"/>',\n};\nconst icon = (name: string): string => `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">${ICONS[name] ?? \"\"}</svg>`;\n\n/** 배경으로 쓸 캡처 — 긴 변을 MAX_EDGE 로 줄이고 data URL 로 */\nasync function toBackground(src: Blob | string): Promise<{ src: string; width: number; height: number }> {\n const url = typeof src === \"string\" ? src : await blobToDataURL(src);\n const img = await loadImage(url);\n const k = Math.min(1, MAX_EDGE / Math.max(img.naturalWidth, img.naturalHeight));\n const width = Math.max(1, Math.round(img.naturalWidth * k)), height = Math.max(1, Math.round(img.naturalHeight * k));\n // 주소로 온 그림도 data URL 로 굽는다 — 그래야 데이터가 자기 완결적이고(다른 서버로 옮겨도 열린다) 나중에 캔버스에 구울 수 있다\n const c = document.createElement(\"canvas\");\n c.width = width; c.height = height;\n c.getContext(\"2d\")!.drawImage(img, 0, 0, width, height);\n return { src: c.toDataURL(\"image/png\"), width, height };\n}\n\nexport class DrawingBoard {\n private readonly host: HTMLDivElement;\n private readonly backdrop: HTMLDivElement;\n private readonly dialog: HTMLDivElement;\n private readonly stage: HTMLDivElement;\n private readonly canvasEl: HTMLDivElement;\n private readonly bgImg: HTMLImageElement;\n private readonly svg: SVGSVGElement;\n private readonly hintEl: HTMLDivElement;\n private readonly noticeEl: HTMLDivElement;\n private readonly statusEl: HTMLSpanElement;\n private readonly toolBtns = new Map<ToolName, HTMLButtonElement>();\n private readonly colorBtns = new Map<string, HTMLButtonElement>();\n private readonly fillBtns = new Map<string, HTMLButtonElement>();\n private colorInput!: HTMLInputElement;\n private strokeRange!: HTMLInputElement;\n private strokePreview!: HTMLSpanElement;\n private opacityRange!: HTMLInputElement;\n private dashedBtn!: HTMLButtonElement;\n private undoBtn!: HTMLButtonElement;\n private redoBtn!: HTMLButtonElement;\n private deleteBtn!: HTMLButtonElement;\n private dupBtn!: HTMLButtonElement;\n private fwdBtn!: HTMLButtonElement;\n private backBtn!: HTMLButtonElement;\n private doneBtn!: HTMLButtonElement;\n private textEdit: HTMLTextAreaElement | null = null;\n\n private data: Drawing;\n private tool: ToolName = \"arrow\";\n private color = COLORS[0]!;\n private stroke = 4;\n private fill: Fill | null = null;\n private dashed = false;\n private opacity = 1;\n private scale = 1;\n private selected = new Set<string>();\n private drag: (Drag & { pointerId: number }) | null = null;\n /** 두 번 클릭 판정 — pointerdown 을 preventDefault 하면 브라우저가 click/dblclick 을 안 만들어 직접 잰다 */\n private lastDown: { id: string | null; t: number } = { id: null, t: 0 };\n private past: Shape[][] = [];\n private future: Shape[][] = [];\n private dirty = false;\n private saving = false;\n private readonly m: Messages;\n private done!: (result: OpenResult | null) => void;\n private readonly onResize = (): void => this.fit();\n\n constructor(private readonly opts: OpenOptions) {\n this.m = { ...messagesFor(opts.lang), ...(opts.messages ?? {}) };\n this.data = structuredClone(opts.initial ?? emptyDrawing());\n\n this.host = document.createElement(\"div\");\n this.host.className = \"newtil-drawing\";\n const shadow = this.host.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n\n this.backdrop = el(\"div\", \"nd-backdrop\");\n this.dialog = el(\"div\", \"nd-dialog\");\n this.dialog.setAttribute(\"role\", \"dialog\");\n this.dialog.setAttribute(\"aria-label\", this.m.title);\n this.dialog.tabIndex = -1;\n this.backdrop.appendChild(this.dialog);\n shadow.appendChild(this.backdrop);\n\n this.dialog.appendChild(this.buildToolbar());\n\n this.stage = el(\"div\", \"nd-stage\");\n this.canvasEl = el(\"div\", \"nd-canvas\");\n this.bgImg = document.createElement(\"img\");\n this.bgImg.className = \"nd-bg\";\n this.bgImg.draggable = false;\n this.bgImg.alt = \"\";\n this.svg = document.createElementNS(SVG_NS, \"svg\");\n this.svg.classList.add(\"nd-svg\");\n this.hintEl = el(\"div\", \"nd-hint\");\n this.hintEl.textContent = this.m.pasteHint;\n this.canvasEl.append(this.bgImg, this.svg, this.hintEl);\n this.noticeEl = el(\"div\", \"nd-notice\");\n this.noticeEl.hidden = true;\n this.stage.append(this.canvasEl, this.noticeEl);\n this.dialog.appendChild(this.stage);\n\n const foot = el(\"div\", \"nd-footer\");\n this.statusEl = el(\"span\", \"nd-status\");\n const bgBtn = textBtn(this.m.background, () => { void this.pickBackground(); });\n bgBtn.classList.add(\"nd-btn--bg\");\n const cancel = textBtn(this.m.cancel, () => this.cancel());\n this.doneBtn = textBtn(this.m.done, () => { void this.finish(); });\n this.doneBtn.classList.add(\"nd-btn--primary\");\n foot.append(bgBtn, this.statusEl, cancel, this.doneBtn);\n this.dialog.appendChild(foot);\n\n this.svg.addEventListener(\"pointerdown\", this.onPointerDown);\n window.addEventListener(\"pointermove\", this.onPointerMove);\n window.addEventListener(\"pointerup\", this.onPointerUp);\n window.addEventListener(\"pointercancel\", this.onPointerUp);\n this.dialog.addEventListener(\"keydown\", this.onKeyDown);\n this.dialog.addEventListener(\"paste\", this.onPaste);\n this.backdrop.addEventListener(\"pointerdown\", (e) => { if (e.target === this.backdrop) this.cancel(); });\n window.addEventListener(\"resize\", this.onResize);\n }\n\n async open(): Promise<OpenResult | null> {\n (this.opts.mount ?? document.body).appendChild(this.host);\n if (!this.opts.initial && this.opts.background) {\n try { const bg = await toBackground(this.opts.background); this.data.background = bg.src; this.data.width = bg.width; this.data.height = bg.height; } catch { /* 배경 없이 연다 */ }\n }\n this.applyBackground();\n this.render();\n this.setTool(this.tool); this.reflectStyle();\n this.updateButtons();\n if (this.opts.notice) this.showNotice(this.opts.notice);\n requestAnimationFrame(() => { this.fit(); this.dialog.focus(); });\n return new Promise((resolve) => { this.done = resolve; });\n }\n\n // ─── 툴바 ───\n\n private buildToolbar(): HTMLElement {\n const bar = el(\"div\", \"nd-toolbar\");\n const tools: [ToolName, string][] = [\n [\"select\", this.m.toolSelect], [\"pen\", this.m.toolPen], [\"highlighter\", this.m.toolHighlighter], [\"line\", this.m.toolLine],\n [\"arrow\", this.m.toolArrow], [\"arrow2\", this.m.toolArrow2], [\"rect\", this.m.toolRect], [\"ellipse\", this.m.toolEllipse],\n [\"text\", this.m.toolText], [\"badge\", this.m.toolBadge],\n ];\n const g1 = el(\"div\", \"nd-group\");\n for (const [tool, title] of tools) {\n const b = iconBtn(icon(tool), title, () => this.setTool(tool));\n b.dataset[\"tool\"] = tool;\n this.toolBtns.set(tool, b);\n g1.appendChild(b);\n }\n bar.appendChild(g1);\n\n const g2 = el(\"div\", \"nd-group\");\n for (const c of COLORS) {\n const b = iconBtn(\"\", this.m.color, () => this.setColor(c));\n b.classList.add(\"nd-swatch\");\n b.style.setProperty(\"--swatch\", c);\n b.dataset[\"color\"] = c;\n this.colorBtns.set(c, b);\n g2.appendChild(b);\n }\n this.colorInput = document.createElement(\"input\");\n this.colorInput.type = \"color\";\n this.colorInput.className = \"nd-color-input\";\n this.colorInput.title = this.m.customColor;\n this.colorInput.addEventListener(\"input\", () => this.setColor(this.colorInput.value));\n g2.appendChild(this.colorInput);\n bar.appendChild(g2);\n\n const g3 = el(\"div\", \"nd-group\");\n this.strokePreview = el(\"span\", \"nd-stroke-preview\");\n this.strokeRange = range(1, 12, 1, this.m.strokeWidth, () => this.setStroke(Number(this.strokeRange.value)));\n g3.append(this.strokePreview, this.strokeRange);\n bar.appendChild(g3);\n\n const g4 = el(\"div\", \"nd-group\");\n const fills: [Fill | null, string, string][] = [[null, \"fillNone\", this.m.fillNone], [\"translucent\", \"fillTranslucent\", this.m.fillTranslucent], [\"solid\", \"fillSolid\", this.m.fillSolid]];\n for (const [f, ic, title] of fills) {\n const b = iconBtn(icon(ic), title, () => this.setFill(f));\n b.dataset[\"fill\"] = f ?? \"none\";\n this.fillBtns.set(f ?? \"none\", b);\n g4.appendChild(b);\n }\n this.dashedBtn = iconBtn(icon(\"dashed\"), this.m.dashed, () => this.setDashed(!this.dashed));\n this.dashedBtn.dataset[\"action\"] = \"dashed\";\n g4.appendChild(this.dashedBtn);\n const opLabel = el(\"span\", \"nd-label\"); opLabel.textContent = this.m.opacity;\n this.opacityRange = range(10, 100, 5, this.m.opacity, () => this.setOpacity(Number(this.opacityRange.value) / 100));\n g4.append(opLabel, this.opacityRange);\n bar.appendChild(g4);\n\n const g5 = el(\"div\", \"nd-group\");\n this.undoBtn = iconBtn(icon(\"undo\"), this.m.undo, () => this.undo());\n this.redoBtn = iconBtn(icon(\"redo\"), this.m.redo, () => this.redo());\n this.dupBtn = iconBtn(icon(\"duplicate\"), this.m.duplicate, () => this.duplicate());\n this.fwdBtn = iconBtn(icon(\"forward\"), this.m.bringForward, () => this.reorder(1));\n this.backBtn = iconBtn(icon(\"backward\"), this.m.sendBackward, () => this.reorder(-1));\n this.deleteBtn = iconBtn(icon(\"delete\"), this.m.delete, () => this.deleteSelected());\n this.deleteBtn.dataset[\"action\"] = \"delete\";\n g5.append(this.undoBtn, this.redoBtn, this.dupBtn, this.fwdBtn, this.backBtn, this.deleteBtn);\n bar.appendChild(g5);\n\n return bar;\n }\n\n /** 툴바가 지금 값(또는 고른 도형의 값)을 비추게 */\n private reflectStyle(): void {\n for (const [k, b] of this.colorBtns) b.setAttribute(\"aria-pressed\", String(k === this.color));\n this.colorInput.value = /^#[0-9a-f]{6}$/i.test(this.color) ? this.color : \"#000000\";\n this.strokeRange.value = String(this.stroke);\n this.strokePreview.style.height = `${Math.min(12, this.stroke)}px`;\n for (const [k, b] of this.fillBtns) b.setAttribute(\"aria-pressed\", String(k === (this.fill ?? \"none\")));\n this.dashedBtn.setAttribute(\"aria-pressed\", String(this.dashed));\n this.opacityRange.value = String(Math.round(this.opacity * 100));\n }\n\n private fit(): void {\n const r = this.stage.getBoundingClientRect();\n const availW = Math.max(100, r.width - 24), availH = Math.max(100, r.height - 24);\n this.scale = Math.min(1, availW / this.data.width, availH / this.data.height);\n this.canvasEl.style.width = `${Math.round(this.data.width * this.scale)}px`;\n this.canvasEl.style.height = `${Math.round(this.data.height * this.scale)}px`;\n this.svg.setAttribute(\"viewBox\", `0 0 ${this.data.width} ${this.data.height}`);\n this.render();\n }\n\n private applyBackground(): void {\n if (this.data.background) { this.bgImg.src = this.data.background; this.bgImg.hidden = false; }\n else { this.bgImg.removeAttribute(\"src\"); this.bgImg.hidden = true; }\n this.fit();\n this.updateButtons();\n }\n\n private showNotice(text: string): void {\n this.noticeEl.textContent = text;\n this.noticeEl.hidden = false;\n window.setTimeout(() => { this.noticeEl.hidden = true; }, 6000);\n }\n\n // ─── 상태 ───\n\n private setTool(tool: ToolName): void {\n this.commitTextEdit();\n this.tool = tool;\n for (const [t, b] of this.toolBtns) b.setAttribute(\"aria-pressed\", String(t === tool));\n this.svg.dataset[\"tool\"] = tool;\n if (tool !== \"select\") this.select([]);\n }\n private selectedShapes(): Shape[] { return this.data.shapes.filter((s) => this.selected.has(s.id)); }\n /** 고른 도형들에 스타일을 적용 — 고른 게 없으면 다음 도형의 기본값만 바뀐다 */\n private applyStyle(mutate: (s: Shape) => boolean): void {\n const targets = this.selectedShapes();\n if (!targets.length) return;\n let changed = false;\n const snapshot = structuredClone(this.data.shapes);\n for (const s of targets) changed = mutate(s) || changed;\n if (changed) { this.past.push(snapshot); this.future = []; this.dirty = true; this.render(); this.updateButtons(); }\n }\n private setColor(c: string): void { this.color = c; this.applyStyle((s) => (s.color !== c ? ((s.color = c), true) : false)); this.reflectStyle(); }\n private setStroke(w: number): void {\n this.stroke = w;\n this.applyStyle((s) => { if (s.stroke === w) return false; s.stroke = w; if (s.type === \"text\") s.size = textSize(w); if (s.type === \"badge\") s.size = 8 + w * 2; return true; });\n this.reflectStyle();\n }\n private setFill(f: Fill | null): void { this.fill = f; this.applyStyle((s) => ((s.type === \"rect\" || s.type === \"ellipse\") && (s.fill ?? null) !== f ? ((s.fill = f), true) : false)); this.reflectStyle(); }\n private setDashed(d: boolean): void { this.dashed = d; this.applyStyle((s) => (!!s.dashed !== d ? ((s.dashed = d), true) : false)); this.reflectStyle(); }\n private setOpacity(o: number): void { this.opacity = o; this.applyStyle((s) => ((s.opacity ?? 1) !== o ? ((s.opacity = o), true) : false)); this.reflectStyle(); }\n\n private select(ids: string[]): void {\n this.selected = new Set(ids);\n const one = ids.length === 1 ? this.data.shapes.find((s) => s.id === ids[0]) : undefined;\n if (one) { this.color = one.color; this.stroke = one.stroke; this.fill = one.fill ?? null; this.dashed = !!one.dashed; this.opacity = one.opacity ?? 1; this.reflectStyle(); }\n this.render();\n this.updateButtons();\n }\n private commit(): void {\n this.past.push(structuredClone(this.data.shapes));\n if (this.past.length > 200) this.past.shift();\n this.future = [];\n this.dirty = true;\n this.updateButtons();\n }\n private undo(): void {\n this.commitTextEdit();\n const prev = this.past.pop();\n if (!prev) return;\n this.future.push(structuredClone(this.data.shapes));\n this.data.shapes = prev;\n this.select([...this.selected].filter((id) => prev.some((s) => s.id === id)));\n }\n private redo(): void {\n const next = this.future.pop();\n if (!next) return;\n this.past.push(structuredClone(this.data.shapes));\n this.data.shapes = next;\n this.select([...this.selected].filter((id) => next.some((s) => s.id === id)));\n }\n private deleteSelected(): void {\n if (!this.selected.size) return;\n this.commit();\n this.data.shapes = this.data.shapes.filter((s) => !this.selected.has(s.id));\n this.select([]);\n }\n private duplicate(): void {\n const targets = this.selectedShapes();\n if (!targets.length) return;\n this.commit();\n const copies = targets.map((s) => { const c = structuredClone(s); c.id = nextId(); moveShape(c, 16, 16); return c; });\n this.data.shapes.push(...copies);\n this.select(copies.map((c) => c.id));\n }\n /** 앞으로/뒤로 — 고른 도형들의 그리는 순서를 한 칸 옮긴다 */\n private reorder(dir: 1 | -1): void {\n if (!this.selected.size) return;\n const shapes = this.data.shapes;\n const idx = shapes.map((s, i) => (this.selected.has(s.id) ? i : -1)).filter((i) => i >= 0);\n if (dir === 1 && idx[idx.length - 1] === shapes.length - 1) return;\n if (dir === -1 && idx[0] === 0) return;\n this.commit();\n const order = dir === 1 ? [...idx].reverse() : idx;\n for (const i of order) { const j = i + dir; [shapes[i], shapes[j]] = [shapes[j]!, shapes[i]!]; }\n this.render(); this.updateButtons();\n }\n private nudge(dx: number, dy: number): void {\n const targets = this.selectedShapes();\n if (!targets.length) return;\n this.commit();\n for (const s of targets) moveShape(s, dx, dy);\n this.render();\n }\n private updateButtons(): void {\n const n = this.selected.size;\n this.undoBtn.disabled = this.past.length === 0;\n this.redoBtn.disabled = this.future.length === 0;\n this.deleteBtn.disabled = n === 0;\n this.dupBtn.disabled = n === 0;\n this.fwdBtn.disabled = n === 0;\n this.backBtn.disabled = n === 0;\n this.hintEl.hidden = !!this.data.background || this.data.shapes.length > 0;\n this.statusEl.textContent = `${this.data.width}×${this.data.height} · ${Math.round(this.scale * 100)}%` + (n ? ` · ${n}` : \"\");\n }\n\n // ─── 배경 ───\n\n private async pickBackground(): Promise<void> {\n const input = document.createElement(\"input\");\n input.type = \"file\"; input.accept = \"image/*\";\n const file = await new Promise<File | null>((resolve) => {\n input.addEventListener(\"change\", () => resolve(input.files?.[0] ?? null));\n input.click();\n });\n if (file) await this.setBackground(file);\n this.dialog.focus();\n }\n private async setBackground(blob: Blob): Promise<void> {\n try {\n const bg = await toBackground(blob);\n this.commit();\n this.data.background = bg.src; this.data.width = bg.width; this.data.height = bg.height;\n this.applyBackground();\n } catch { /* 이미지가 아니면 무시 */ }\n }\n private onPaste = (e: ClipboardEvent): void => {\n if (this.textEdit) return;\n const file = Array.from(e.clipboardData?.files ?? []).find((f) => f.type.startsWith(\"image/\"));\n if (!file) return;\n e.preventDefault(); e.stopPropagation();\n void this.setBackground(file);\n };\n\n // ─── 포인터 ───\n\n private toPoint(e: { clientX: number; clientY: number }): Point {\n const r = this.svg.getBoundingClientRect();\n const k = r.width > 0 ? this.data.width / r.width : 1; // 실제 그려진 크기 기준\n return { x: clamp((e.clientX - r.left) * k, 0, this.data.width), y: clamp((e.clientY - r.top) * k, 0, this.data.height) };\n }\n private shapeAt(target: EventTarget | null): string | null {\n const g = (target as Element | null)?.closest?.(\"[data-shape]\") as SVGElement | null;\n return g?.dataset[\"shape\"] ?? null;\n }\n private handleAt(target: EventTarget | null): Handle | null {\n const h = (target as Element | null)?.closest?.(\"[data-handle]\") as SVGElement | null;\n return (h?.dataset[\"handle\"] as Handle | undefined) ?? null;\n }\n private onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0 || this.saving) return;\n // 브라우저 기본 포커스 이동을 막는다 — 안 막으면 글자 도구가 띄운 textarea 가 곧바로 blur 돼 빈 글자로 닫힌다\n e.preventDefault();\n this.commitTextEdit();\n const p = this.toPoint(e);\n if (this.tool === \"select\") {\n // 같은 글자를 350ms 안에 다시 누르면 고치기\n const hitId = this.shapeAt(e.target);\n const now = performance.now();\n const dbl = hitId !== null && hitId === this.lastDown.id && now - this.lastDown.t < 350;\n this.lastDown = { id: hitId, t: now };\n if (dbl) {\n const s = this.data.shapes.find((x) => x.id === hitId);\n if (s?.type === \"text\") { this.select([s.id]); this.startTextEdit(s, false); return; }\n }\n const handle = this.handleAt(e.target);\n const only = this.selected.size === 1 ? this.selectedShapes()[0] : undefined;\n if (handle && only) {\n this.commit();\n this.drag = { kind: \"handle\", id: only.id, handle, start: bounds(only), startShape: structuredClone(only), pointerId: e.pointerId };\n this.dialog.focus({ preventScroll: true });\n return;\n }\n const id = this.shapeAt(e.target);\n if (id) {\n if (e.shiftKey) { const next = new Set(this.selected); if (next.has(id)) next.delete(id); else next.add(id); this.select([...next]); }\n else if (!this.selected.has(id)) this.select([id]);\n if (this.selected.has(id)) { this.commit(); this.drag = { kind: \"move\", ids: [...this.selected], last: p, moved: false, pointerId: e.pointerId }; }\n this.dialog.focus({ preventScroll: true });\n return;\n }\n // 빈 곳 — 러버밴드(Shift 면 기존 선택에 더한다)\n if (!e.shiftKey) this.select([]);\n this.drag = { kind: \"rubber\", from: p, to: p, additive: e.shiftKey, pointerId: e.pointerId };\n this.dialog.focus({ preventScroll: true });\n return;\n }\n if (this.tool === \"text\") {\n this.startTextEdit({ id: nextId(), type: \"text\", color: this.color, stroke: this.stroke, x: p.x, y: p.y, text: \"\", size: textSize(this.stroke), opacity: this.opacity }, true);\n return;\n }\n if (this.tool === \"badge\") {\n const n = this.data.shapes.filter((s) => s.type === \"badge\").length + 1;\n this.commit();\n const shape: Shape = { id: nextId(), type: \"badge\", color: this.color, stroke: this.stroke, x: p.x, y: p.y, n, size: 8 + this.stroke * 2, opacity: this.opacity };\n this.data.shapes.push(shape);\n this.render(); this.updateButtons();\n this.dialog.focus({ preventScroll: true });\n return;\n }\n this.dialog.focus({ preventScroll: true });\n const base = { id: nextId(), color: this.color, stroke: this.stroke, dashed: this.dashed || undefined, opacity: this.opacity !== 1 ? this.opacity : undefined };\n const shape: Shape = this.tool === \"pen\" || this.tool === \"highlighter\"\n ? { ...base, type: this.tool, points: [p.x, p.y] }\n : this.tool === \"rect\" || this.tool === \"ellipse\"\n ? { ...base, type: this.tool, x1: p.x, y1: p.y, x2: p.x, y2: p.y, fill: this.fill }\n : { ...base, type: this.tool, x1: p.x, y1: p.y, x2: p.x, y2: p.y };\n this.commit();\n this.data.shapes.push(shape);\n this.drag = { kind: \"draw\", shape, pointerId: e.pointerId };\n this.render();\n };\n private onPointerMove = (e: PointerEvent): void => {\n if (!this.drag || e.pointerId !== this.drag.pointerId) return;\n const p = this.toPoint(e);\n const d = this.drag;\n if (d.kind === \"draw\") {\n const s = d.shape;\n if (isPath(s)) s.points.push(p.x, p.y);\n else if (isBoxShape(s)) {\n // Shift: 정사각형/정원/45° 선\n if (e.shiftKey) { const dx = p.x - s.x1, dy = p.y - s.y1; const m = Math.max(Math.abs(dx), Math.abs(dy)); s.x2 = s.x1 + Math.sign(dx || 1) * m; s.y2 = s.y1 + Math.sign(dy || 1) * m; }\n else { s.x2 = p.x; s.y2 = p.y; }\n }\n } else if (d.kind === \"move\") {\n const dx = p.x - d.last.x, dy = p.y - d.last.y;\n if (dx || dy) { d.moved = true; for (const s of this.data.shapes) if (d.ids.includes(s.id)) moveShape(s, dx, dy); d.last = p; }\n } else if (d.kind === \"handle\") {\n const s = this.data.shapes.find((x) => x.id === d.id);\n if (!s || !isBoxShape(s)) return;\n if (d.handle === \"p1\") { s.x1 = p.x; s.y1 = p.y; }\n else if (d.handle === \"p2\") { s.x2 = p.x; s.y2 = p.y; }\n else {\n const b = d.start;\n let x1 = b.x, y1 = b.y, x2 = b.x + b.w, y2 = b.y + b.h;\n if (d.handle.includes(\"w\")) x1 = p.x; if (d.handle.includes(\"e\")) x2 = p.x;\n if (d.handle.includes(\"n\")) y1 = p.y; if (d.handle.includes(\"s\")) y2 = p.y;\n s.x1 = x1; s.y1 = y1; s.x2 = x2; s.y2 = y2;\n }\n } else {\n d.to = p;\n }\n this.render();\n };\n private onPointerUp = (e: PointerEvent): void => {\n if (!this.drag || e.pointerId !== this.drag.pointerId) return;\n const d = this.drag;\n this.drag = null;\n if (d.kind === \"draw\") {\n const s = d.shape;\n const tiny = isPath(s) ? s.points.length < 4 : isBoxShape(s) ? Math.abs(s.x2 - s.x1) < 2 && Math.abs(s.y2 - s.y1) < 2 : false;\n if (tiny) { this.data.shapes = this.data.shapes.filter((x) => x.id !== s.id); this.past.pop(); }\n else if (s.type === \"pen\") s.points = smoothPoints(s.points);\n } else if (d.kind === \"move\" && !d.moved) {\n this.past.pop(); // 클릭만 — 되돌리기 단계 남기지 않는다\n } else if (d.kind === \"rubber\") {\n const box: Box = { x: Math.min(d.from.x, d.to.x), y: Math.min(d.from.y, d.to.y), w: Math.abs(d.to.x - d.from.x), h: Math.abs(d.to.y - d.from.y) };\n if (box.w > 3 || box.h > 3) {\n const hit = this.data.shapes.filter((s) => { const b = bounds(s); return b.x < box.x + box.w && b.x + b.w > box.x && b.y < box.y + box.h && b.y + b.h > box.y; }).map((s) => s.id);\n this.select(d.additive ? [...new Set([...this.selected, ...hit])] : hit);\n }\n }\n this.render(); this.updateButtons();\n };\n private onKeyDown = (e: KeyboardEvent): void => {\n e.stopPropagation(); // 호스트(편집기) 단축키로 새지 않게\n if (this.textEdit) return; // textarea 가 처리\n const mod = e.metaKey || e.ctrlKey;\n if (e.key === \"Escape\") { e.preventDefault(); if (this.selected.size) this.select([]); else this.cancel(); return; }\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && this.selected.size) { e.preventDefault(); this.deleteSelected(); return; }\n if (mod && e.key.toLowerCase() === \"z\") { e.preventDefault(); if (e.shiftKey) this.redo(); else this.undo(); return; }\n if (mod && e.key.toLowerCase() === \"d\") { e.preventDefault(); this.duplicate(); return; }\n if (mod && e.key.toLowerCase() === \"a\") { e.preventDefault(); this.setTool(\"select\"); this.select(this.data.shapes.map((s) => s.id)); return; }\n if (e.key.startsWith(\"Arrow\") && this.selected.size) {\n e.preventDefault();\n const step = e.shiftKey ? 10 : 1;\n this.nudge(e.key === \"ArrowLeft\" ? -step : e.key === \"ArrowRight\" ? step : 0, e.key === \"ArrowUp\" ? -step : e.key === \"ArrowDown\" ? step : 0);\n return;\n }\n if (e.key === \"]\" && this.selected.size) { this.reorder(1); return; }\n if (e.key === \"[\" && this.selected.size) { this.reorder(-1); return; }\n const tool = ({ v: \"select\", p: \"pen\", h: \"highlighter\", l: \"line\", a: \"arrow\", r: \"rect\", e: \"ellipse\", t: \"text\", b: \"badge\" } as Record<string, ToolName>)[e.key.toLowerCase()];\n if (tool && !mod && !e.altKey) this.setTool(tool);\n };\n\n // ─── 글자 인라인 편집 ───\n\n private startTextEdit(shape: Extract<Shape, { type: \"text\" }>, isNew: boolean): void {\n this.commitTextEdit();\n const ta = document.createElement(\"textarea\");\n ta.className = \"nd-text-edit\";\n ta.value = shape.text;\n ta.rows = 1;\n const place = (): void => {\n ta.style.left = `${shape.x * this.scale - 2}px`;\n ta.style.top = `${shape.y * this.scale - 2}px`;\n ta.style.fontSize = `${shape.size * this.scale}px`;\n ta.style.color = shape.color;\n const lines = ta.value.split(\"\\n\");\n ta.style.width = `${Math.max(40, (Math.max(1, ...lines.map((l) => l.length)) * 0.65 + 1) * shape.size * this.scale)}px`;\n ta.style.height = `${(lines.length * 1.25 + 0.2) * shape.size * this.scale}px`;\n };\n place();\n ta.addEventListener(\"input\", place);\n ta.addEventListener(\"keydown\", (e) => {\n e.stopPropagation();\n if (e.key === \"Escape\") { e.preventDefault(); this.textEdit = null; ta.remove(); if (!isNew) this.render(); this.dialog.focus(); }\n else if (e.key === \"Enter\" && !e.shiftKey) { e.preventDefault(); this.commitTextEdit(); }\n });\n ta.addEventListener(\"blur\", () => this.commitTextEdit());\n this.canvasEl.appendChild(ta);\n this.textEdit = ta;\n (ta as HTMLTextAreaElement & { __shape?: Shape; __isNew?: boolean }).__shape = shape;\n (ta as HTMLTextAreaElement & { __isNew?: boolean }).__isNew = isNew;\n if (!isNew) { this.selected = new Set(); this.render(); } // 편집 중엔 SVG 글자를 숨기지 않고 겹쳐 보인다 — textarea 배경이 가린다\n ta.focus(); ta.select();\n }\n private commitTextEdit(): void {\n const ta = this.textEdit as (HTMLTextAreaElement & { __shape?: Shape; __isNew?: boolean }) | null;\n if (!ta) return;\n this.textEdit = null;\n const shape = ta.__shape as Extract<Shape, { type: \"text\" }> | undefined;\n const text = ta.value.replace(/\\s+$/, \"\");\n ta.remove();\n if (!shape) return;\n if (ta.__isNew) {\n if (text.trim()) { this.commit(); shape.text = text; this.data.shapes.push(shape); this.setTool(\"select\"); this.select([shape.id]); }\n } else if (text.trim() && text !== shape.text) {\n this.commit(); shape.text = text; this.select([shape.id]);\n } else if (!text.trim()) {\n this.commit(); this.data.shapes = this.data.shapes.filter((s) => s.id !== shape.id); this.select([]);\n }\n this.render(); this.updateButtons();\n this.dialog.focus({ preventScroll: true });\n }\n\n // ─── 그리기(SVG) ───\n\n private render(): void {\n while (this.svg.firstChild) this.svg.removeChild(this.svg.firstChild);\n for (const s of this.data.shapes) this.svg.appendChild(this.renderShape(s));\n this.renderSelection();\n if (this.drag?.kind === \"rubber\") {\n const d = this.drag;\n this.svg.appendChild(svgEl(\"rect\", { class: \"nd-rubber\", x: Math.min(d.from.x, d.to.x), y: Math.min(d.from.y, d.to.y), width: Math.abs(d.to.x - d.from.x), height: Math.abs(d.to.y - d.from.y) }));\n }\n }\n\n private renderShape(s: Shape): SVGElement {\n const g = document.createElementNS(SVG_NS, \"g\");\n g.dataset[\"shape\"] = s.id;\n g.setAttribute(\"fill\", \"none\"); g.setAttribute(\"stroke\", s.color); g.setAttribute(\"stroke-width\", String(s.stroke));\n g.setAttribute(\"stroke-linecap\", \"round\"); g.setAttribute(\"stroke-linejoin\", \"round\");\n if ((s.opacity ?? 1) !== 1) g.setAttribute(\"opacity\", String(s.opacity));\n if (s.dashed) g.setAttribute(\"stroke-dasharray\", `${s.stroke * 3} ${s.stroke * 2}`);\n const hitWidth = Math.max(14, s.stroke * 4);\n const b = bounds(s);\n const hit = (elm: SVGElement): SVGElement => { elm.classList.add(\"nd-hit\"); elm.setAttribute(\"stroke\", \"transparent\"); elm.setAttribute(\"stroke-width\", String(hitWidth)); elm.setAttribute(\"stroke-dasharray\", \"none\"); return elm; };\n switch (s.type) {\n case \"rect\": {\n const r = Math.min(s.radius ?? 0, b.w / 2, b.h / 2);\n const shape = svgEl(\"rect\", { x: b.x, y: b.y, width: b.w, height: b.h, rx: r });\n if (fillOpacity(s) > 0) { shape.setAttribute(\"fill\", s.color); shape.setAttribute(\"fill-opacity\", String(fillOpacity(s))); }\n const h = hit(svgEl(\"rect\", { x: b.x, y: b.y, width: b.w, height: b.h, rx: r, fill: fillOpacity(s) > 0 ? s.color : \"none\", \"fill-opacity\": 0 }));\n g.append(h, shape);\n break;\n }\n case \"ellipse\": {\n const attrs = { cx: b.x + b.w / 2, cy: b.y + b.h / 2, rx: b.w / 2, ry: b.h / 2 };\n const shape = svgEl(\"ellipse\", attrs);\n if (fillOpacity(s) > 0) { shape.setAttribute(\"fill\", s.color); shape.setAttribute(\"fill-opacity\", String(fillOpacity(s))); }\n g.append(hit(svgEl(\"ellipse\", { ...attrs, fill: fillOpacity(s) > 0 ? s.color : \"none\", \"fill-opacity\": 0 })), shape);\n break;\n }\n case \"line\": case \"arrow\": case \"arrow2\": {\n g.appendChild(hit(svgEl(\"line\", { x1: s.x1, y1: s.y1, x2: s.x2, y2: s.y2 })));\n g.appendChild(svgEl(\"line\", { x1: s.x1, y1: s.y1, x2: s.x2, y2: s.y2 }));\n const heads: [number, number][][] = [];\n if (s.type !== \"line\") heads.push(arrowHead(s.x1, s.y1, s.x2, s.y2, s.stroke));\n if (s.type === \"arrow2\") heads.push(arrowHead(s.x2, s.y2, s.x1, s.y1, s.stroke));\n for (const h of heads) { const poly = svgEl(\"polygon\", { points: h.map((p) => p.join(\",\")).join(\" \"), fill: s.color, stroke: \"none\" }); g.appendChild(poly); }\n break;\n }\n case \"pen\": case \"highlighter\": {\n const pts: string[] = [];\n for (let i = 0; i + 1 < s.points.length; i += 2) pts.push(`${s.points[i]},${s.points[i + 1]}`);\n const line = svgEl(\"polyline\", { points: pts.join(\" \") });\n if (s.type === \"highlighter\") { line.setAttribute(\"stroke-width\", String(s.stroke * 4)); line.setAttribute(\"stroke-opacity\", String(HIGHLIGHTER_ALPHA)); line.setAttribute(\"stroke-linecap\", \"butt\"); }\n g.append(hit(svgEl(\"polyline\", { points: pts.join(\" \") })), line);\n break;\n }\n case \"text\": {\n g.appendChild(hit(svgEl(\"rect\", { x: b.x - 4, y: b.y - 4, width: b.w + 8, height: b.h + 8, fill: \"transparent\" })));\n const t = svgEl(\"text\", { x: s.x, y: s.y, \"font-size\": s.size, \"font-weight\": \"bold\", \"paint-order\": \"stroke\", \"stroke-width\": Math.max(3, s.size / 6), \"dominant-baseline\": \"hanging\", fill: s.color, stroke: \"#ffffff\", \"font-family\": FONT });\n s.text.split(\"\\n\").forEach((line, i) => { const span = svgEl(\"tspan\", { x: s.x, dy: i === 0 ? 0 : s.size * 1.25 }); span.textContent = line || \" \"; t.appendChild(span); });\n g.appendChild(t);\n break;\n }\n case \"badge\": {\n g.appendChild(hit(svgEl(\"circle\", { cx: s.x, cy: s.y, r: s.size + 4, fill: \"transparent\" })));\n g.appendChild(svgEl(\"circle\", { cx: s.x, cy: s.y, r: s.size, fill: s.color, stroke: \"#ffffff\", \"stroke-width\": 2 }));\n const t = svgEl(\"text\", { x: s.x, y: s.y + s.size * 0.05, \"font-size\": Math.round(s.size * 1.2), \"font-weight\": \"bold\", \"text-anchor\": \"middle\", \"dominant-baseline\": \"central\", fill: \"#ffffff\", stroke: \"none\", \"font-family\": FONT });\n t.textContent = String(s.n);\n g.appendChild(t);\n break;\n }\n }\n return g;\n }\n\n /** 고른 도형의 점선 상자 + 손잡이(하나만 골랐을 때: 상자 8개 / 선 양 끝) */\n private renderSelection(): void {\n const shapes = this.selectedShapes();\n if (!shapes.length) return;\n const sel = document.createElementNS(SVG_NS, \"g\");\n sel.classList.add(\"nd-selection\");\n const pad = 6;\n for (const s of shapes) {\n const b = bounds(s);\n sel.appendChild(svgEl(\"rect\", { x: b.x - pad, y: b.y - pad, width: b.w + pad * 2, height: b.h + pad * 2, fill: \"none\", stroke: \"#4a90e2\", \"stroke-width\": 1.5, \"stroke-dasharray\": \"6 4\", \"vector-effect\": \"non-scaling-stroke\" }));\n }\n if (shapes.length === 1) {\n const s = shapes[0]!;\n const b = bounds(s);\n const handles: [Handle, number, number][] = isLineLike(s) && isBoxShape(s)\n ? [[\"p1\", s.x1, s.y1], [\"p2\", s.x2, s.y2]]\n : s.type === \"rect\" || s.type === \"ellipse\"\n ? [[\"nw\", b.x, b.y], [\"n\", b.x + b.w / 2, b.y], [\"ne\", b.x + b.w, b.y], [\"e\", b.x + b.w, b.y + b.h / 2], [\"se\", b.x + b.w, b.y + b.h], [\"s\", b.x + b.w / 2, b.y + b.h], [\"sw\", b.x, b.y + b.h], [\"w\", b.x, b.y + b.h / 2]]\n : [];\n const r = 6 / Math.max(this.scale, 0.2);\n for (const [h, x, y] of handles) {\n const c = svgEl(\"circle\", { cx: x, cy: y, r, fill: \"#ffffff\", stroke: \"#4a90e2\", \"stroke-width\": 2, \"vector-effect\": \"non-scaling-stroke\", class: \"nd-handle\" });\n c.dataset[\"handle\"] = h;\n sel.appendChild(c);\n }\n }\n this.svg.appendChild(sel);\n }\n\n // ─── 끝내기 ───\n\n private cancel(): void {\n if (this.saving) return;\n this.commitTextEdit();\n if (this.dirty && !window.confirm(this.m.discardConfirm)) { this.dialog.focus(); return; }\n this.close(null);\n }\n private async finish(): Promise<void> {\n if (this.saving) return;\n this.commitTextEdit();\n this.saving = true;\n this.doneBtn.disabled = true;\n this.doneBtn.textContent = this.m.saving;\n try {\n const png = await renderToPng(this.data);\n const saved = this.opts.save ? await this.opts.save(png, this.data) : undefined;\n this.close({ data: this.data, png, saved: saved ?? undefined });\n } catch (e) {\n this.saving = false;\n this.doneBtn.disabled = false;\n this.doneBtn.textContent = this.m.done;\n window.alert(this.m.saveFailed(e instanceof Error ? e.message : String(e)));\n this.dialog.focus();\n }\n }\n private close(result: OpenResult | null): void {\n window.removeEventListener(\"resize\", this.onResize);\n window.removeEventListener(\"pointermove\", this.onPointerMove);\n window.removeEventListener(\"pointerup\", this.onPointerUp);\n window.removeEventListener(\"pointercancel\", this.onPointerUp);\n this.host.remove();\n this.done(result);\n }\n}\n\n// ─── DOM 도우미 ───\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, className: string): HTMLElementTagNameMap[K] {\n const e = document.createElement(tag);\n e.className = className;\n return e;\n}\nfunction svgEl(tag: string, attrs: Record<string, string | number>): SVGElement {\n const e = document.createElementNS(SVG_NS, tag);\n for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, String(v));\n return e;\n}\nfunction iconBtn(html: string, title: string, onClick: () => void): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = \"nd-btn\";\n b.innerHTML = html;\n b.title = title; b.setAttribute(\"aria-label\", title);\n b.addEventListener(\"click\", onClick);\n return b;\n}\nfunction textBtn(label: string, onClick: () => void): HTMLButtonElement {\n const b = iconBtn(\"\", label, onClick);\n b.textContent = label;\n b.classList.add(\"nd-btn--text\");\n return b;\n}\nfunction range(min: number, max: number, step: number, title: string, onInput: () => void): HTMLInputElement {\n const r = document.createElement(\"input\");\n r.type = \"range\"; r.min = String(min); r.max = String(max); r.step = String(step);\n r.className = \"nd-range\"; r.title = title; r.setAttribute(\"aria-label\", title);\n r.addEventListener(\"input\", onInput);\n r.addEventListener(\"pointerdown\", (e) => e.stopPropagation());\n return r;\n}\n\n/** 그림판을 연다 — 완료면 데이터·PNG(·저장 결과), 취소면 null */\nexport function openDrawing(opts: OpenOptions = {}): Promise<OpenResult | null> {\n return new DrawingBoard(opts).open();\n}\n","/**\n * @newtil/drawing — 캡처 위에 화살표·상자·글자를 그리는 그림판. 프레임워크 없음, 순수 DOM, 자기 shadow root 에 뜬다.\n *\n * import { openDrawing } from \"@newtil/drawing\";\n * const r = await openDrawing({ background: file }); // 새로 그리기 → { data, png } | null\n * const r2 = await openDrawing({ initial: r.data }); // 다시 고치기(도형 살아 있음)\n *\n * data(Drawing)는 자기 완결적(배경도 data URL)이라 어디든 저장해 두면 다시 열린다. png 는 독자용 결과물.\n */\nexport { openDrawing, DrawingBoard, type OpenOptions, type OpenResult } from \"./board\";\nexport { renderToPng, blobToDataURL, loadImage } from \"./render\";\nexport { emptyDrawing, bounds, type Drawing, type Shape, type Fill, type ToolName } from \"./model\";\nexport { ko as messagesKo, en as messagesEn, type Messages, type Lang } from \"./i18n\";\nexport const VERSION = \"0.1.0\";\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
type Lang = "ko" | "en";
|
|
2
|
+
interface Messages {
|
|
3
|
+
title: string;
|
|
4
|
+
toolSelect: string;
|
|
5
|
+
toolPen: string;
|
|
6
|
+
toolHighlighter: string;
|
|
7
|
+
toolLine: string;
|
|
8
|
+
toolArrow: string;
|
|
9
|
+
toolArrow2: string;
|
|
10
|
+
toolRect: string;
|
|
11
|
+
toolEllipse: string;
|
|
12
|
+
toolText: string;
|
|
13
|
+
toolBadge: string;
|
|
14
|
+
color: string;
|
|
15
|
+
customColor: string;
|
|
16
|
+
strokeWidth: string;
|
|
17
|
+
fillNone: string;
|
|
18
|
+
fillTranslucent: string;
|
|
19
|
+
fillSolid: string;
|
|
20
|
+
dashed: string;
|
|
21
|
+
opacity: string;
|
|
22
|
+
undo: string;
|
|
23
|
+
redo: string;
|
|
24
|
+
delete: string;
|
|
25
|
+
duplicate: string;
|
|
26
|
+
bringForward: string;
|
|
27
|
+
sendBackward: string;
|
|
28
|
+
background: string;
|
|
29
|
+
clearBackground: string;
|
|
30
|
+
zoomFit: string;
|
|
31
|
+
done: string;
|
|
32
|
+
cancel: string;
|
|
33
|
+
saving: string;
|
|
34
|
+
textPrompt: string;
|
|
35
|
+
pasteHint: string;
|
|
36
|
+
discardConfirm: string;
|
|
37
|
+
exportFailed: string;
|
|
38
|
+
saveFailed: (reason: string) => string;
|
|
39
|
+
}
|
|
40
|
+
declare const ko: Messages;
|
|
41
|
+
declare const en: Messages;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 그림 데이터 — 편집기(@newtil/editor)가 곁파일로 저장하던 DrawingData v1 과 같은 모양이라 기존 곁파일이 그대로 열린다.
|
|
45
|
+
* 좌표는 항상 "판 크기(width×height)" 기준. 화면 확대/축소는 표시일 뿐이다.
|
|
46
|
+
*/
|
|
47
|
+
type ToolName = "select" | "pen" | "highlighter" | "line" | "arrow" | "arrow2" | "rect" | "ellipse" | "text" | "badge";
|
|
48
|
+
type Fill = "translucent" | "solid";
|
|
49
|
+
interface ShapeBase {
|
|
50
|
+
id: string;
|
|
51
|
+
color: string;
|
|
52
|
+
stroke: number;
|
|
53
|
+
/** 채우기 — 사각형·타원·배지 */
|
|
54
|
+
fill?: Fill | null;
|
|
55
|
+
/** 점선 */
|
|
56
|
+
dashed?: boolean;
|
|
57
|
+
/** 전체 투명도 0~1. 없으면 1 */
|
|
58
|
+
opacity?: number;
|
|
59
|
+
}
|
|
60
|
+
type Shape = (ShapeBase & {
|
|
61
|
+
type: "rect";
|
|
62
|
+
x1: number;
|
|
63
|
+
y1: number;
|
|
64
|
+
x2: number;
|
|
65
|
+
y2: number;
|
|
66
|
+
radius?: number;
|
|
67
|
+
}) | (ShapeBase & {
|
|
68
|
+
type: "ellipse";
|
|
69
|
+
x1: number;
|
|
70
|
+
y1: number;
|
|
71
|
+
x2: number;
|
|
72
|
+
y2: number;
|
|
73
|
+
}) | (ShapeBase & {
|
|
74
|
+
type: "line" | "arrow" | "arrow2";
|
|
75
|
+
x1: number;
|
|
76
|
+
y1: number;
|
|
77
|
+
x2: number;
|
|
78
|
+
y2: number;
|
|
79
|
+
}) | (ShapeBase & {
|
|
80
|
+
type: "pen" | "highlighter";
|
|
81
|
+
points: number[];
|
|
82
|
+
}) | (ShapeBase & {
|
|
83
|
+
type: "text";
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
text: string;
|
|
87
|
+
size: number;
|
|
88
|
+
}) | (ShapeBase & {
|
|
89
|
+
type: "badge";
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
n: number;
|
|
93
|
+
size: number;
|
|
94
|
+
});
|
|
95
|
+
interface Drawing {
|
|
96
|
+
version: 1;
|
|
97
|
+
width: number;
|
|
98
|
+
height: number;
|
|
99
|
+
/** 배경 캡처 — data URL. 없으면 흰 판 */
|
|
100
|
+
background: string | null;
|
|
101
|
+
shapes: Shape[];
|
|
102
|
+
}
|
|
103
|
+
type Box = {
|
|
104
|
+
x: number;
|
|
105
|
+
y: number;
|
|
106
|
+
w: number;
|
|
107
|
+
h: number;
|
|
108
|
+
};
|
|
109
|
+
declare function emptyDrawing(width?: number, height?: number): Drawing;
|
|
110
|
+
/** 도형의 바깥 상자 — 선택 표시·손잡이 자리. 글자는 대략(폰트 폭 0.6em 어림) */
|
|
111
|
+
declare function bounds(s: Shape): Box;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 그림판 팝업 — 캡처(배경) 위에 도형을 그리고 PNG + 데이터(재편집용)로 돌려준다.
|
|
115
|
+
*
|
|
116
|
+
* 자기 shadow root 안에 뜬다(스타일 격리). 좌표는 판 크기 기준이고 화면은 scale 로만 줄인다.
|
|
117
|
+
* 선택 도구: 클릭·Shift 클릭·러버밴드로 고르고, 끌어 옮기고, 손잡이(상자 8개 / 선 양 끝)로 고친다. 고른 채로 색·굵기·채우기·점선·투명도를 바꾸면 그 도형들이 바뀐다.
|
|
118
|
+
* 글자는 판 위에서 바로 친다(textarea 겹침), 두 번 클릭해 다시 고친다.
|
|
119
|
+
* 완료 = 굽기 + (있으면) 저장 훅까지 팝업 안에서. 실패하면 이유를 알리고 열어 둔다 — 조용히 다른 형태로 넘기지 않는다.
|
|
120
|
+
*/
|
|
121
|
+
interface OpenOptions {
|
|
122
|
+
/** 다시 고칠 그림. 없으면 빈 판 */
|
|
123
|
+
initial?: Drawing | null;
|
|
124
|
+
/** 시작 배경 — 캡처 파일(Blob) 또는 같은 출처 이미지 주소. initial 이 있으면 무시 */
|
|
125
|
+
background?: Blob | string | null;
|
|
126
|
+
/** 완료 때 부른다 — 저장하고 문서에 넣을 주소 등을 돌려준다. 던지면 팝업이 열린 채 이유를 보인다 */
|
|
127
|
+
save?: (png: Blob, data: Drawing) => Promise<string | void>;
|
|
128
|
+
/** 열 때 잠깐 보일 안내 */
|
|
129
|
+
notice?: string;
|
|
130
|
+
lang?: string;
|
|
131
|
+
messages?: Partial<Messages>;
|
|
132
|
+
/** 팝업을 붙일 자리. 기본 document.body */
|
|
133
|
+
mount?: HTMLElement;
|
|
134
|
+
}
|
|
135
|
+
interface OpenResult {
|
|
136
|
+
data: Drawing;
|
|
137
|
+
png: Blob; /** save 가 돌려준 값(주소 등) */
|
|
138
|
+
saved?: string;
|
|
139
|
+
}
|
|
140
|
+
declare class DrawingBoard {
|
|
141
|
+
private readonly opts;
|
|
142
|
+
private readonly host;
|
|
143
|
+
private readonly backdrop;
|
|
144
|
+
private readonly dialog;
|
|
145
|
+
private readonly stage;
|
|
146
|
+
private readonly canvasEl;
|
|
147
|
+
private readonly bgImg;
|
|
148
|
+
private readonly svg;
|
|
149
|
+
private readonly hintEl;
|
|
150
|
+
private readonly noticeEl;
|
|
151
|
+
private readonly statusEl;
|
|
152
|
+
private readonly toolBtns;
|
|
153
|
+
private readonly colorBtns;
|
|
154
|
+
private readonly fillBtns;
|
|
155
|
+
private colorInput;
|
|
156
|
+
private strokeRange;
|
|
157
|
+
private strokePreview;
|
|
158
|
+
private opacityRange;
|
|
159
|
+
private dashedBtn;
|
|
160
|
+
private undoBtn;
|
|
161
|
+
private redoBtn;
|
|
162
|
+
private deleteBtn;
|
|
163
|
+
private dupBtn;
|
|
164
|
+
private fwdBtn;
|
|
165
|
+
private backBtn;
|
|
166
|
+
private doneBtn;
|
|
167
|
+
private textEdit;
|
|
168
|
+
private data;
|
|
169
|
+
private tool;
|
|
170
|
+
private color;
|
|
171
|
+
private stroke;
|
|
172
|
+
private fill;
|
|
173
|
+
private dashed;
|
|
174
|
+
private opacity;
|
|
175
|
+
private scale;
|
|
176
|
+
private selected;
|
|
177
|
+
private drag;
|
|
178
|
+
/** 두 번 클릭 판정 — pointerdown 을 preventDefault 하면 브라우저가 click/dblclick 을 안 만들어 직접 잰다 */
|
|
179
|
+
private lastDown;
|
|
180
|
+
private past;
|
|
181
|
+
private future;
|
|
182
|
+
private dirty;
|
|
183
|
+
private saving;
|
|
184
|
+
private readonly m;
|
|
185
|
+
private done;
|
|
186
|
+
private readonly onResize;
|
|
187
|
+
constructor(opts: OpenOptions);
|
|
188
|
+
open(): Promise<OpenResult | null>;
|
|
189
|
+
private buildToolbar;
|
|
190
|
+
/** 툴바가 지금 값(또는 고른 도형의 값)을 비추게 */
|
|
191
|
+
private reflectStyle;
|
|
192
|
+
private fit;
|
|
193
|
+
private applyBackground;
|
|
194
|
+
private showNotice;
|
|
195
|
+
private setTool;
|
|
196
|
+
private selectedShapes;
|
|
197
|
+
/** 고른 도형들에 스타일을 적용 — 고른 게 없으면 다음 도형의 기본값만 바뀐다 */
|
|
198
|
+
private applyStyle;
|
|
199
|
+
private setColor;
|
|
200
|
+
private setStroke;
|
|
201
|
+
private setFill;
|
|
202
|
+
private setDashed;
|
|
203
|
+
private setOpacity;
|
|
204
|
+
private select;
|
|
205
|
+
private commit;
|
|
206
|
+
private undo;
|
|
207
|
+
private redo;
|
|
208
|
+
private deleteSelected;
|
|
209
|
+
private duplicate;
|
|
210
|
+
/** 앞으로/뒤로 — 고른 도형들의 그리는 순서를 한 칸 옮긴다 */
|
|
211
|
+
private reorder;
|
|
212
|
+
private nudge;
|
|
213
|
+
private updateButtons;
|
|
214
|
+
private pickBackground;
|
|
215
|
+
private setBackground;
|
|
216
|
+
private onPaste;
|
|
217
|
+
private toPoint;
|
|
218
|
+
private shapeAt;
|
|
219
|
+
private handleAt;
|
|
220
|
+
private onPointerDown;
|
|
221
|
+
private onPointerMove;
|
|
222
|
+
private onPointerUp;
|
|
223
|
+
private onKeyDown;
|
|
224
|
+
private startTextEdit;
|
|
225
|
+
private commitTextEdit;
|
|
226
|
+
private render;
|
|
227
|
+
private renderShape;
|
|
228
|
+
/** 고른 도형의 점선 상자 + 손잡이(하나만 골랐을 때: 상자 8개 / 선 양 끝) */
|
|
229
|
+
private renderSelection;
|
|
230
|
+
private cancel;
|
|
231
|
+
private finish;
|
|
232
|
+
private close;
|
|
233
|
+
}
|
|
234
|
+
/** 그림판을 연다 — 완료면 데이터·PNG(·저장 결과), 취소면 null */
|
|
235
|
+
declare function openDrawing(opts?: OpenOptions): Promise<OpenResult | null>;
|
|
236
|
+
|
|
237
|
+
/** 이미지 로드 — data URL 또는 같은 출처 주소. 교차 출처는 캔버스에 못 굽는다(tainted) */
|
|
238
|
+
declare function loadImage(src: string): Promise<HTMLImageElement>;
|
|
239
|
+
declare function blobToDataURL(blob: Blob): Promise<string>;
|
|
240
|
+
/** 그림 전체를 PNG 로 — 배경 + 도형. 배경이 없으면 흰 판 */
|
|
241
|
+
declare function renderToPng(data: Drawing): Promise<Blob>;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @newtil/drawing — 캡처 위에 화살표·상자·글자를 그리는 그림판. 프레임워크 없음, 순수 DOM, 자기 shadow root 에 뜬다.
|
|
245
|
+
*
|
|
246
|
+
* import { openDrawing } from "@newtil/drawing";
|
|
247
|
+
* const r = await openDrawing({ background: file }); // 새로 그리기 → { data, png } | null
|
|
248
|
+
* const r2 = await openDrawing({ initial: r.data }); // 다시 고치기(도형 살아 있음)
|
|
249
|
+
*
|
|
250
|
+
* data(Drawing)는 자기 완결적(배경도 data URL)이라 어디든 저장해 두면 다시 열린다. png 는 독자용 결과물.
|
|
251
|
+
*/
|
|
252
|
+
|
|
253
|
+
declare const VERSION = "0.1.0";
|
|
254
|
+
|
|
255
|
+
export { type Drawing, DrawingBoard, type Fill, type Lang, type Messages, type OpenOptions, type OpenResult, type Shape, type ToolName, VERSION, blobToDataURL, bounds, emptyDrawing, loadImage, en as messagesEn, ko as messagesKo, openDrawing, renderToPng };
|