{
  "version": 3,
  "sources": ["../src/full.js", "../src/utils/url.js", "../src/serialize/inline.js", "../src/serialize/block.js", "../src/serialize/font-size.js", "../src/table/model.js", "../src/serialize/table.js", "../src/table/render.js", "../src/features/registry.js", "../src/features/page-break/page-break.js", "../src/features/page-break/index.js", "../src/features/image/image.js", "../src/shared/drag-resize.js", "../src/features/image/controls.js", "../src/features/image/index.js", "../src/features/video/video.js", "../src/features/video/controls.js", "../src/features/video/index.js", "../src/features/audio/audio.js", "../src/features/audio/index.js", "../src/features/file/file.js", "../src/features/file/index.js", "../src/features/code-block/highlight.js", "../src/inline-format.js", "../src/editing.js", "../src/features/code-block/controls.js", "../src/features/code-block/index.js", "../src/features/bookmark/bookmark.js", "../src/features/bookmark/controls.js", "../src/features/bookmark/index.js", "../src/features/index.js", "../src/serialize/document.js", "../src/serialize/markdown.js", "../src/constants/colors.js", "../src/serialize/html.js", "../src/ui/icons.js", "../src/ui/slash-menu.js", "../src/ui/emoji-picker.js", "../src/ui/table-size-picker.js", "../src/shared/block-types.js", "../src/shared/palettes.js", "../src/ui/format-toolbar.js", "../src/table/ops.js", "../src/table/fit.js", "../src/paste/excel-format.js", "../src/paste/paste-html.js", "../src/table/clipboard.js", "../src/table/table-controls.js", "../src/upload/s3-uploader.js", "../src/upload/file-validation.js", "../src/ui/floating-menu.js", "../src/ui/side-menu.js", "../src/columns/column-controls.js", "../src/ui/link-toolbar.js", "../src/ui/file-panel.js", "../src/errors/lumir-error.js", "../src/locale.js", "../src/editor/blocks.js", "../src/editor/error-toast.js", "../src/editor/upload-overlay.js", "../src/editor/dom-ops.js", "../src/editor/blur-highlight.js", "../src/editor/media-detect.js", "../src/editor/history.js", "../src/editor/placeholder.js", "../src/editor/caret-nav.js", "../src/editor/block-select.js", "../src/editor/cross-block-selection.js", "../src/editor/cross-block-select.js", "../src/editor/cross-block-range.js", "../src/editor/cross-block-edit.js", "../src/editor.js", "../src/compat.js", "../src/utils/cn.js", "../src/styles/font-size-consts.js", "../src/react.js"],
  "sourcesContent": ["\"use client\";\r\n/**\r\n * \uBC30\uD3EC \uB8E8\uD2B8(\".\") \uC5D4\uD2B8\uB9AC \u2014 \uAD6C @lumir-company/editor \uB8E8\uD2B8 \uD45C\uBA74\uACFC 1:1 \uD638\uD658.\r\n *\r\n * \uC18C\uBE44\uCC98(Lumir-ERP \uB4F1)\uB294 `import(\"@lumir-company/editor\").then(m => m.LumirEditor)` \uB85C\r\n * \uB8E8\uD2B8\uC5D0\uC11C React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uAC00\uC838\uAC00\uBBC0\uB85C, \uB8E8\uD2B8\uAC00 React \uB798\uD37C\uB97C \uD3EC\uD568\uD574\uC57C \uD55C\uB2E4.\r\n * react-free \uCF54\uC5B4\uB9CC \uD544\uC694\uD558\uBA74 \"./core\" \uC11C\uBE0C\uD328\uC2A4\uB97C \uC0AC\uC6A9\uD55C\uB2E4(react \uBBF8\uB85C\uB4DC).\r\n *\r\n *   \uB8E8\uD2B8(\".\")   = core \uC804\uCCB4 + LumirEditor/FloatingMenu(react) + \uAD6C \uC804\uC6A9 \uC2A4\uD141\r\n *   \"./core\"    = react-free \uC720\uD2F8/\uC9C1\uB82C\uD654/mountLumirEditor\r\n *   \"./react\"   = \uB8E8\uD2B8\uC640 \uB3D9\uC77C \uD45C\uBA74(\uAD6C vanilla \uC11C\uBE0C\uD328\uC2A4 \uD558\uC704\uD638\uD658)\r\n */\r\nexport * from \"./index.js\";\r\nexport { LumirEditor, FloatingMenu, FontSizeButton, default } from \"./react.js\";\r\n\r\n/**\r\n * \uD638\uD658 \uC2A4\uD141 \u2014 \uAD6C \uD328\uD0A4\uC9C0\uC758 BlockNote \uCEE4\uC2A4\uD140 \uC2A4\uD0C0\uC77C \uC2A4\uD399/\uC2A4\uD0A4\uB9C8 export.\r\n * vanilla \uC5D0\uB294 BlockNote \uB7F0\uD0C0\uC784\uC774 \uC5C6\uC5B4 \uC2E4\uCCB4\uAC00 \uC5C6\uB2E4. import \uAC00 undefined \uB85C \uAE68\uC9C0\uC9C0 \uC54A\uB3C4\uB85D\r\n * \uB9C8\uCEE4 \uAC1D\uCCB4\uB97C \uB454\uB2E4(\uC2A4\uD0A4\uB9C8 \uC870\uB9BD \uB4F1 \uC2E4\uC81C \uC0AC\uC6A9\uC740 \uBD88\uAC00 \u2014 fontSize \uB294 \uC5D0\uB514\uD130\uC5D0 \uB0B4\uC7A5\uB428).\r\n */\r\nexport const FontSize = { __compat: \"lumir-editor\", note: \"fontSize style is built-in; spec object is a stub\" };\r\nexport const EditorSchema = { __compat: \"lumir-editor\", note: \"schema is internal; stub for import compatibility\" };\r\n", "/**\r\n * URL \uC2A4\uD0B4 \uC911\uD654(neutralize) \u2014 \uB80C\uB354/\uB0B4\uBCF4\uB0B4\uAE30 \uACBD\uACC4 \uACF5\uC6A9 \uBC29\uC5B4(XSS).\r\n *\r\n * \uC815\uCC45(blocklist): \uC704\uD5D8 \uC2A4\uD0B4\uB9CC \uCC28\uB2E8\uD558\uACE0 \uB098\uBA38\uC9C0(\uC0C1\uB300\uACBD\uB85C\u00B7mailto\u00B7tel\u00B7http(s)\u00B7blob\u00B7data:image)\uB294 \uBCF4\uC874.\r\n *  - javascript: / vbscript: -> \"\" (\uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589 \uBCA1\uD130)\r\n *  - data:<image \uC678> (\uC608: data:text/html) -> \"\" \u2014 data:image/* \uB294 \uD5C8\uC6A9(\uBD99\uC5EC\uB123\uAE30/\uC774\uBBF8\uC9C0 \uC815\uD569)\r\n *  - \uC81C\uC5B4\uBB38\uC790(\uD0ED/\uAC1C\uD589 \uB4F1)\uB294 \uBE0C\uB77C\uC6B0\uC800\uAC00 URL \uD30C\uC2F1 \uC2DC \uC81C\uAC70\uD574 \uC6B0\uD68C\uAC00 \uAC00\uB2A5\uD558\uBBC0\uB85C \uC120\uC81C\uAC70.\r\n *\r\n * \uB300\uD654\uD615 \uC785\uB825(link-toolbar)\uC758 allowlist(SAFE_URL)\uBCF4\uB2E4 \uB290\uC2A8\uD558\uC9C0\uB9CC, \uC800\uC7A5 JSON\u00B7\uB9C8\uD06C\uB2E4\uC6B4\u00B7\uBD99\uC5EC\uB123\uAE30\uB85C\r\n * \uC720\uC785\uB418\uB294 \uB9C1\uD06C\uC758 \uC0C1\uB300\uACBD\uB85C \uB4F1 \uC815\uC0C1 \uAC12\uC744 \uBCF4\uC874\uD558\uBA74\uC11C \uC54C\uB824\uC9C4 \uC575\uCEE4 XSS\uB97C \uCC28\uB2E8\uD55C\uB2E4.\r\n */\r\n\r\n/** \uC81C\uC5B4\uBB38\uC790(0x00-0x1F, 0x7F) \uC81C\uAC70 \u2014 \uBE0C\uB77C\uC6B0\uC800 URL \uD30C\uC11C\uAC00 \uBB34\uC2DC\uD558\uBBC0\uB85C \uC2A4\uD0B4 \uAC80\uC0AC \uC804\uC5D0 \uC81C\uAC70. */\r\nfunction stripControlChars(str) {\r\n  let out = \"\";\r\n  for (let i = 0; i < str.length; i++) {\r\n    const code = str.charCodeAt(i);\r\n    if (code <= 31 || code === 127) continue;\r\n    out += str[i];\r\n  }\r\n  return out;\r\n}\r\n\r\nexport function neutralizeUrl(url) {\r\n  const s = stripControlChars(String(url == null ? \"\" : url)).trim();\r\n  if (!s) return \"\";\r\n  if (/^(?:javascript|vbscript):/i.test(s)) return \"\";\r\n  if (/^data:(?!image\\/)/i.test(s)) return \"\"; // data:image/* \uB9CC \uD5C8\uC6A9\r\n  return s;\r\n}\r\n\r\n/**\r\n * \uC784\uBCA0\uB4DC \uC81C\uACF5\uC790 \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8 \u2014 YouTube/Vimeo \uB9CC. watch/\uACF5\uC720 URL \u2192 \uC548\uC804\uD55C embed URL \uB85C \uBCC0\uD658.\r\n * \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8 \uBC16(\uB610\uB294 \uD30C\uC2F1 \uC2E4\uD328)\uC774\uBA74 null \u2192 \uD638\uCD9C\uBD80\uB294 \uCE74\uB4DC/\uB9C1\uD06C\uB85C \uD3F4\uBC31(\uC784\uC758 URL iframe \uAE08\uC9C0: \uD074\uB9AD\uC7AC\uD0B9\u00B7XSS \uBC29\uC5B4).\r\n * @returns {{ provider:string, id:string, embedUrl:string, ratio:string } | null}\r\n */\r\nexport function resolveEmbed(url) {\r\n  const s = stripControlChars(String(url == null ? \"\" : url)).trim();\r\n  if (!s) return null;\r\n  let m;\r\n  // YouTube: youtu.be/ID \u00B7 youtube.com/watch?v=ID \u00B7 /embed/ID \u00B7 /shorts/ID (\uB3C4\uBA54\uC778 \uC815\uD655 \uB9E4\uCE6D)\r\n  m = s.match(/^(?:https?:\\/\\/)?(?:www\\.|m\\.)?(?:youtube\\.com\\/(?:watch\\?(?:[^#]*&)?v=|embed\\/|shorts\\/|live\\/)|youtu\\.be\\/)([A-Za-z0-9_-]{6,})/i);\r\n  if (m) return { provider: \"youtube\", id: m[1], embedUrl: `https://www.youtube.com/embed/${m[1]}`, ratio: \"16:9\" };\r\n  // Vimeo: vimeo.com/ID \u00B7 player.vimeo.com/video/ID\r\n  m = s.match(/^(?:https?:\\/\\/)?(?:www\\.)?(?:player\\.)?vimeo\\.com\\/(?:video\\/)?(\\d{6,})/i);\r\n  if (m) return { provider: \"vimeo\", id: m[1], embedUrl: `https://player.vimeo.com/video/${m[1]}`, ratio: \"16:9\" };\r\n  return null;\r\n}\r\n\r\n/** embedUrl \uD638\uC2A4\uD2B8\uAC00 \uD5C8\uC6A9 \uC81C\uACF5\uC790\uC778\uC9C0 \u2014 \uB80C\uB354 \uC9C1\uC804 iframe src \uCD5C\uC885 \uBC29\uC5B4(\uC800\uC7A5 JSON \uBCC0\uC870 \uB300\uBE44). */\r\nexport function isAllowedEmbedUrl(embedUrl) {\r\n  const s = stripControlChars(String(embedUrl == null ? \"\" : embedUrl)).trim();\r\n  return /^https:\\/\\/(?:www\\.youtube\\.com\\/embed\\/|player\\.vimeo\\.com\\/video\\/)/i.test(s);\r\n}\r\n", "/**\r\n * \uC778\uB77C\uC778 \uCF58\uD150\uCE20 \uC9C1\uB82C\uD654 (P0-\u2460)\r\n * BlockNote inline content(styled-text \uBC30\uC5F4) \u2194 contenteditable HTML \uC591\uBC29\uD5A5 \uBCC0\uD658.\r\n *\r\n * BlockNote \uD615\uC2DD:\r\n *   \uD14D\uC2A4\uD2B8: { type:\"text\", text, styles:{ bold?, italic?, underline?, strike?, code?,\r\n *            textColor?, backgroundColor?, fontSize? } }\r\n *   \uB9C1\uD06C:   { type:\"link\", href, content:[<\uD14D\uC2A4\uD2B8>] }\r\n *   \uAE30\uBCF8\uC0C9(textColor/backgroundColor === \"default\")\uC740 styles\uC5D0 \uC800\uC7A5\uD558\uC9C0 \uC54A\uB294\uB2E4.\r\n *\r\n * \uC778\uB77C\uC778 \uD0DC\uADF8 \uADDC\uC57D(\uC0D8\uD50C block-editor.html\uC758 cleanInline\uACFC \uC815\uD569 + lumir \uD655\uC7A5):\r\n *   bold=<strong>, italic=<em>, underline=<u>, strike=<s>, code=<code>,\r\n *   textColor=<span data-text-color>, backgroundColor=<span data-background-color>,\r\n *   fontSize=<span data-font-size style=\"font-size:..\">, link=<a href>.\r\n *\r\n * \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uBCF4\uC99D: \uC815\uADDC\uD654\uB41C \uC785\uB825(\uC778\uC811 \uB3D9\uC77C\uC2A4\uD0C0\uC77C run \uC5C6\uC74C, \uBE48 \uD14D\uC2A4\uD2B8 run \uC5C6\uC74C)\uC5D0 \uB300\uD574\r\n *   inlineContentToHtml \u2192 htmlToInlineContent \uAC00 \uD56D\uB4F1(deep-equal).\r\n *\r\n * \uC8FC\uC758: fontSize\uB294 \uC5EC\uAE30\uC11C styles.fontSize\uB85C \uB2E4\uB8EC\uB2E4. \uC800\uC7A5 JSON\uC758 \"\uD615\uC81C\uD0A4\" \uBCC0\uD658\r\n *   (lower/liftFontSize)\uC740 \uBB38\uC11C \uACBD\uACC4(\uC9C1\uB82C\uD654 \uB808\uC774\uC5B4 \uC0C1\uC704, P0-\u2463)\uC5D0\uC11C \uC801\uC6A9\uD55C\uB2E4.\r\n */\r\n\r\nimport { neutralizeUrl } from \"../utils/url.js\";\r\n\r\nconst DEFAULT_COLOR = \"default\";\r\n\r\nfunction escapeHtml(s) {\r\n  return String(s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n}\r\nfunction escapeAttr(s) {\r\n  return String(s).replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\r\n}\r\n\r\n/** styled-text \uD55C \uD56D\uBAA9 \u2192 HTML. \uC911\uCCA9 \uC21C\uC11C \uACE0\uC815(\uC678\u2192\uB0B4): textColor > bg > fontSize > bold > italic > underline > strike > code */\r\nfunction styledTextToHtml(node) {\r\n  // HardBreak: \uBAA8\uB378\uC758 \"\\n\"(\uC904\uBC14\uAFC8)\uC744 <br>\uB85C \uB80C\uB354(\uB77C\uC6B4\uB4DC\uD2B8\uB9BD: walkInline\uC5D0\uC11C <br>\u2192\"\\n\")\r\n  let html = escapeHtml(node && node.text != null ? node.text : \"\").replace(/\\n/g, \"<br>\");\r\n  const s = (node && node.styles) || {};\r\n  if (s.code) html = `<code>${html}</code>`;\r\n  if (s.strike) html = `<s>${html}</s>`;\r\n  if (s.underline) html = `<u>${html}</u>`;\r\n  if (s.italic) html = `<em>${html}</em>`;\r\n  if (s.bold) html = `<strong>${html}</strong>`;\r\n  if (s.fontSize)\r\n    html = `<span data-font-size=\"${escapeAttr(s.fontSize)}\" style=\"font-size:${escapeAttr(s.fontSize)}\">${html}</span>`;\r\n  if (s.backgroundColor && s.backgroundColor !== DEFAULT_COLOR)\r\n    html = `<span data-background-color=\"${escapeAttr(s.backgroundColor)}\">${html}</span>`;\r\n  if (s.textColor && s.textColor !== DEFAULT_COLOR)\r\n    html = `<span data-text-color=\"${escapeAttr(s.textColor)}\">${html}</span>`;\r\n  return html;\r\n}\r\n\r\n/** \uC778\uB77C\uC778 \uCCB4\uD06C\uBC15\uC2A4(\uD45C \uC140 \uC6D0\uC790) \u2192 HTML. contenteditable=false \uB3C5\uB9BD span, \uD14D\uC2A4\uD2B8 \uC790\uC2DD \uC5C6\uC74C. */\r\nfunction checkboxToHtml(node) {\r\n  const on = !!(node && node.checked);\r\n  const v = on ? \"true\" : \"false\";\r\n  return (\r\n    `<span class=\"lumir-cell-check${on ? \" checked\" : \"\"}\" role=\"checkbox\"` +\r\n    ` aria-checked=\"${v}\" contenteditable=\"false\" data-lumir-checkbox=\"1\" data-checked=\"${v}\"></span>`\r\n  );\r\n}\r\n\r\n/** \uC140 \uB0B4 \uC21C\uC11C\uBAA9\uB85D/\uBD88\uB81B\uBAA9\uB85D \uB9C8\uCEE4(\uC778\uB77C\uC778 \uC6D0\uC790). \uBC88\uD638\uB294 \uC704\uCE58 \uAE30\uBC18\uC774\uB77C \uBBF8\uC800\uC7A5 \u2014 CSS \uCE74\uC6B4\uD130\uB85C \uD45C\uC2DC. */\r\nfunction olItemToHtml() {\r\n  return `<span class=\"lumir-cell-ol\" contenteditable=\"false\" data-lumir-ol=\"1\"></span>`;\r\n}\r\nfunction ulItemToHtml() {\r\n  return `<span class=\"lumir-cell-ul\" contenteditable=\"false\" data-lumir-ul=\"1\"></span>`;\r\n}\r\n\r\nfunction inlineNodeToHtml(node) {\r\n  if (node && node.type === \"checkbox\") return checkboxToHtml(node);\r\n  if (node && node.type === \"olItem\") return olItemToHtml();\r\n  if (node && node.type === \"ulItem\") return ulItemToHtml();\r\n  if (node && node.type === \"link\") {\r\n    const inner = (node.content || []).map(styledTextToHtml).join(\"\");\r\n    return `<a href=\"${escapeAttr(neutralizeUrl(node.href))}\">${inner}</a>`;\r\n  }\r\n  return styledTextToHtml(node);\r\n}\r\n\r\n/** BlockNote inline content \uBC30\uC5F4 \u2192 contenteditable HTML \uBB38\uC790\uC5F4 */\r\nexport function inlineContentToHtml(content) {\r\n  if (!Array.isArray(content)) return \"\";\r\n  return content.map(inlineNodeToHtml).join(\"\");\r\n}\r\n\r\nconst TAG_MARK = {\r\n  strong: \"bold\",\r\n  b: \"bold\",\r\n  em: \"italic\",\r\n  i: \"italic\",\r\n  u: \"underline\",\r\n  s: \"strike\",\r\n  strike: \"strike\",\r\n  del: \"strike\",\r\n  code: \"code\",\r\n};\r\n\r\nfunction readSpanStyles(el, styles) {\r\n  const tc = el.getAttribute(\"data-text-color\");\r\n  if (tc) styles.textColor = tc;\r\n  const bc = el.getAttribute(\"data-background-color\");\r\n  if (bc) styles.backgroundColor = bc;\r\n  const fs = el.getAttribute(\"data-font-size\") || (el.style && el.style.fontSize) || \"\";\r\n  if (fs) styles.fontSize = fs;\r\n}\r\n\r\nfunction sameStyles(a, b) {\r\n  const ak = Object.keys(a);\r\n  const bk = Object.keys(b);\r\n  if (ak.length !== bk.length) return false;\r\n  return ak.every((k) => a[k] === b[k]);\r\n}\r\n\r\n/** \uC778\uC811\uD55C \uB3D9\uC77C-\uC2A4\uD0C0\uC77C \uD14D\uC2A4\uD2B8 run \uBCD1\uD569(BlockNote \uC815\uADDC\uD654\uC640 \uC815\uD569) */\r\nfunction mergeAdjacentText(items) {\r\n  const out = [];\r\n  for (const it of items) {\r\n    const prev = out[out.length - 1];\r\n    if (prev && prev.type === \"text\" && it.type === \"text\" && sameStyles(prev.styles, it.styles)) {\r\n      prev.text += it.text;\r\n    } else {\r\n      out.push(it);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction walkInline(parent, styles, out, collapseWs) {\r\n  parent.childNodes.forEach((child) => {\r\n    if (child.nodeType === 3) {\r\n      // text node \u2014 ZWSP(\uCE90\uB7FF \uC575\uCEE4 \u200B)\uB294 \uC9C1\uB82C\uD654\uC5D0\uC11C \uC81C\uAC70(\uC778\uB77C\uC778 \uCF54\uB4DC \uD0C8\uCD9C\uC6A9 \uBCF4\uC870 \uBB38\uC790)\r\n      let text = child.nodeValue.replace(/\u200B/g, \"\");\r\n      // \uBD99\uC5EC\uB123\uAE30 \uACBD\uB85C(collapseWs)\uC5D0\uC11C\uB9CC: \uC678\uBD80(\uC6CC\uB4DC \uB4F1) HTML\uC740 \uC18C\uC2A4 \uC815\uB82C\uC6A9 \uAC1C\uD589\uC774 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uC5D0 \uB0A8\uC544,\r\n      // \uD558\uB4DC\uBE0C\uB808\uC774\uD06C(<br>=\\n)\uC640 \uACB9\uCCD0 \uC774\uC911 \uC904\uBC14\uAFC8\uC774 \uB418\uAC70\uB098 \uBC88\uD638/\uBCF8\uBB38\uC774 \uAC08\uB77C\uC9C4\uB2E4. HTML \uB80C\uB354 \uADDC\uCE59\uB300\uB85C\r\n      // \uAC1C\uD589(+\uC778\uC811 \uACF5\uBC31)\uC744 \uB2E8\uC77C \uACF5\uBC31\uC73C\uB85C \uC811\uB294\uB2E4. (\uC5D0\uB514\uD130 \uC790\uCCB4 \uC9C1\uB82C\uD654\u00B7\uCF54\uB4DC\uBE14\uB85D\uC758 \\n\uC740 \uBCF4\uC874\uD574\uC57C \uD558\uBBC0\uB85C \uBBF8\uC801\uC6A9)\r\n      if (collapseWs) text = text.replace(/[ \\t]*\\r?\\n[ \\t\\r\\n]*/g, \" \");\r\n      if (text) out.push({ type: \"text\", text, styles: { ...styles } });\r\n    } else if (child.nodeType === 1) {\r\n      // element\r\n      const tag = child.tagName.toLowerCase();\r\n      // \uC778\uB77C\uC778 \uC6D0\uC790(\uD45C \uC140 \uCCB4\uD06C\uBC15\uC2A4/\uC21C\uC11C\u00B7\uBD88\uB81B \uB9C8\uCEE4): \uC790\uC2DD \uC7AC\uADC0 \uC5C6\uC774 \uB178\uB4DC\uB85C \uD68C\uC218(\uB77C\uC6B4\uB4DC\uD2B8\uB9BD). span \uC77C\uBC18 \uCC98\uB9AC\uBCF4\uB2E4 \uBA3C\uC800.\r\n      if (child.getAttribute && child.getAttribute(\"data-lumir-checkbox\")) {\r\n        out.push({ type: \"checkbox\", checked: child.getAttribute(\"data-checked\") === \"true\" });\r\n        return; // forEach \uCF5C\uBC31 return = \uC774 child \uAC74\uB108\uB700(\uB0B4\uBD80 \uBBF8\uD0D0\uC0C9)\r\n      }\r\n      if (child.getAttribute && child.getAttribute(\"data-lumir-ol\")) {\r\n        out.push({ type: \"olItem\" });\r\n        return;\r\n      }\r\n      if (child.getAttribute && child.getAttribute(\"data-lumir-ul\")) {\r\n        out.push({ type: \"ulItem\" });\r\n        return;\r\n      }\r\n      if (tag === \"a\") {\r\n        const inner = [];\r\n        walkInline(child, styles, inner, collapseWs);\r\n        out.push({\r\n          type: \"link\",\r\n          href: child.getAttribute(\"href\") || \"\",\r\n          content: mergeAdjacentText(inner),\r\n        });\r\n      } else if (tag === \"br\") {\r\n        // HardBreak caret\uC6A9 \uBCF4\uC870 <br>(filler)\uB294 \uC9C1\uB82C\uD654\uC5D0\uC11C \uC81C\uC678(\uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uBB34\uC624\uC5FC)\r\n        if (child.hasAttribute && child.hasAttribute(\"data-lumir-br-filler\")) return;\r\n        out.push({ type: \"text\", text: \"\\n\", styles: { ...styles } });\r\n      } else {\r\n        const next = { ...styles };\r\n        const mark = TAG_MARK[tag];\r\n        if (mark) next[mark] = true;\r\n        if (tag === \"span\") readSpanStyles(child, next);\r\n        walkInline(child, next, out, collapseWs);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * contenteditable HTML(\uBB38\uC790\uC5F4 \uB610\uB294 \uCEE8\uD14C\uC774\uB108 Element) \u2192 BlockNote inline content \uBC30\uC5F4.\r\n * \uBB38\uC790\uC5F4\uC744 \uB118\uAE30\uBA74 DOM(document) \uD658\uACBD\uC774 \uD544\uC694\uD558\uB2E4.\r\n */\r\nexport function htmlToInlineContent(html, opts) {\r\n  let container;\r\n  if (typeof html === \"string\") {\r\n    if (typeof document === \"undefined\") {\r\n      throw new Error(\"htmlToInlineContent: \uBB38\uC790\uC5F4 \uD30C\uC2F1\uC5D0\uB294 DOM(document)\uC774 \uD544\uC694\uD569\uB2C8\uB2E4\");\r\n    }\r\n    container = document.createElement(\"div\");\r\n    container.innerHTML = html;\r\n  } else {\r\n    container = html; // \uC774\uBBF8 Element\r\n  }\r\n  const out = [];\r\n  walkInline(container, {}, out, !!(opts && opts.collapseWhitespace));\r\n  return mergeAdjacentText(out);\r\n}\r\n", "/**\r\n * \uBE14\uB85D \uC9C1\uB82C\uD654 (P0-\u2461 / P1-\u2460) \u2014 \uBAA8\uB4E0 \uCF58\uD150\uCE20\uD615 \uBE14\uB85D\uC744 \uADE0\uC77C \uCC98\uB9AC.\r\n * BlockNote \uBE14\uB85D `{id,type,props,content,children}` \u2194 DOM `.block` \uC694\uC18C.\r\n *\r\n * \uC124\uACC4: \uD0C0\uC785\uBCC4 props \uC2A4\uD0A4\uB9C8\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uACE0 **props/children\uC744 verbatim \uBCF4\uC874**\r\n *   (\uC694\uC18C \uAC1D\uCCB4\uC5D0 `__props`/`__children`\uB85C \uBCF4\uAD00) \u2192 paragraph/heading/\uB9AC\uC2A4\uD2B8/quote/codeBlock\r\n *   \uB4F1 \uBAA8\uB4E0 \uD0C0\uC785\uC774 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uCDA9\uC2E4(EC1). content(\uC8FC \uD3B8\uC9D1 \uB370\uC774\uD130)\uB9CC DOM(.content)\uC5D0 \uB454\uB2E4.\r\n *\r\n * \uD45C(table)\uB294 document.js\uAC00 \uBCC4\uB3C4 \uCC98\uB9AC(\uB77C\uC774\uBE0C <table> \uB80C\uB354).\r\n */\r\n\r\nimport { inlineContentToHtml, htmlToInlineContent } from \"./inline.js\";\r\n\r\nexport const LIST_TYPES = new Set([\"bulletListItem\", \"numberedListItem\", \"checkListItem\"]);\r\n\r\n/** \uBE14\uB85D\uC758 \uC9C1\uC18D \uC790\uC2DD `.content` \uC694\uC18C */\r\nexport function directContent(el) {\r\n  return Array.from(el.children).find((c) => c.classList && c.classList.contains(\"content\")) || null;\r\n}\r\n\r\n/**\r\n * \uD3B8\uC9D1/\uB80C\uB354\uC6A9 .block \uC694\uC18C \uBE4C\uB354. opts: { id?, props?, children?, innerHTML? }\r\n * (\uD3B8\uC9D1 \uB3D9\uC791\uC5D0\uC11C HTML \uBB38\uC790\uC5F4\uB85C \uC0C8 \uBE14\uB85D\uC744 \uB9CC\uB4E4 \uB54C\uB3C4 \uC0AC\uC6A9)\r\n */\r\nexport function makeBlockElement(type, opts) {\r\n  if (typeof document === \"undefined\") throw new Error(\"makeBlockElement: DOM(document) \uD544\uC694\");\r\n  opts = opts || {};\r\n  type = type || \"paragraph\";\r\n  const props = opts.props || {};\r\n\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = type;\r\n  el.dataset.contentType = type; // BlockNote data-content-type \uBCC4\uCE6D \u2014 \uC18C\uBE44\uCC98 CSS([data-content-type=\u2026]) \uD638\uD658\r\n  if (opts.id != null) el.dataset.id = String(opts.id);\r\n  el.__props = opts.props ? { ...opts.props } : undefined; // verbatim\r\n  el.__children = Array.isArray(opts.children) ? opts.children : [];\r\n\r\n  // \uB80C\uB354 \uD78C\uD2B8(\uC9C1\uB82C\uD654\uC5D4 \uC601\uD5A5 \uC5C6\uC74C \u2014 \uC77D\uAE30\uB294 \uD56D\uC0C1 __props\uC5D0\uC11C)\r\n  if (props.level != null) el.dataset.level = String(props.level);\r\n  // \uBC88\uD638\uBAA9\uB85D \uC2DC\uC791\uAC12(A7): counter-reset \uC73C\uB85C \uCCAB \uD56D\uBAA9 \uCE74\uC6B4\uD130\uB97C start-1 \uB85C \uB9DE\uCDA4(\uC774\uD6C4 increment \uB85C start \uAC00 \uB428)\r\n  if (type === \"numberedListItem\" && props.start != null && Number(props.start) > 1)\r\n    el.style.counterReset = \"ln \" + (Number(props.start) - 1);\r\n  if (props.textAlignment && props.textAlignment !== \"left\") el.dataset.textAlignment = props.textAlignment;\r\n  if (props.textColor && props.textColor !== \"default\") el.dataset.textColor = props.textColor;\r\n  if (props.backgroundColor && props.backgroundColor !== \"default\") el.dataset.backgroundColor = props.backgroundColor;\r\n\r\n  // \uD1A0\uAE00(\uC811\uC744 \uC218 \uC788\uB294) \uBE14\uB85D \u2014 heading(isToggleable, blocknote \uD638\uD658) / toggleListItem: \uC88C\uCE21 \uCE90\uB7FF\uC73C\uB85C children \uC811\uAE30\u00B7\uD3BC\uCE58\uAE30\r\n  const isToggle = props.isToggleable === true || type === \"toggleListItem\";\r\n  if (isToggle) {\r\n    el.classList.add(\"lumir-toggle-block\");\r\n    if (props.isToggleable) el.dataset.toggle = \"true\";\r\n    const caret = document.createElement(\"button\");\r\n    caret.type = \"button\";\r\n    caret.className = \"lumir-toggle\";\r\n    caret.setAttribute(\"contenteditable\", \"false\");\r\n    caret.setAttribute(\"aria-label\", \"\uC811\uAE30/\uD3BC\uCE58\uAE30\");\r\n    el.appendChild(caret);\r\n  }\r\n\r\n  if (type === \"checkListItem\") {\r\n    const marker = document.createElement(\"div\");\r\n    marker.className = \"marker\";\r\n    marker.setAttribute(\"contenteditable\", \"false\");\r\n    marker.innerHTML = '<span class=\"check\" role=\"checkbox\"></span>';\r\n    el.appendChild(marker);\r\n    if (props.checked) el.classList.add(\"checked\");\r\n  } else if (type === \"toggleListItem\" || LIST_TYPES.has(type)) {\r\n    el.classList.add(\"list\");\r\n  }\r\n\r\n  const content = document.createElement(\"div\");\r\n  content.className = \"content\";\r\n  content.setAttribute(\"contenteditable\", \"true\");\r\n  content.innerHTML = opts.innerHTML != null ? opts.innerHTML : \"\";\r\n  el.appendChild(content);\r\n  return el;\r\n}\r\n\r\n/** BlockNote \uBE14\uB85D \u2192 DOM `.block` \uC694\uC18C */\r\nexport function blockToElement(block) {\r\n  return makeBlockElement((block && block.type) || \"paragraph\", {\r\n    id: block && block.id,\r\n    props: block && block.props,\r\n    children: block && block.children,\r\n    innerHTML: inlineContentToHtml(Array.isArray(block && block.content) ? block.content : []),\r\n  });\r\n}\r\n\r\n/** DOM `.block` \uC694\uC18C \u2192 BlockNote \uBE14\uB85D */\r\nexport function elementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = el.dataset.type || \"paragraph\";\r\n  if (el.__props !== undefined) block.props = el.__props;\r\n  const contentEl = directContent(el);\r\n  block.content = contentEl ? htmlToInlineContent(contentEl) : [];\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/**\r\n * \uAE00\uC790 \uD06C\uAE30(fontSize) \uC9C1\uB82C\uD654 \uD638\uD658 \uB808\uC774\uC5B4 (P0-\u2463) \u2014 lumir `font-size-serialization.ts` \uC774\uC2DD.\r\n *\r\n * \uC800\uC7A5 JSON\uC5D0\uC11C fontSize\uB294 styles \uB9F5\uC774 \uC544\uB2CC styled-text\uC758 **\uD615\uC81C \uD0A4**\uB85C \uB454\uB2E4.\r\n * (\uAD6C\uBC84\uC804 SDK\uB294 styles\uC5D0 \uC2A4\uD0A4\uB9C8 \uC678 \uD0A4\uAC00 \uC788\uC73C\uBA74 \uD06C\uB798\uC2DC \u2192 \uD615\uC81C \uD0A4\uB294 \uC870\uC6A9\uD788 \uBB34\uC2DC\uB418\uC5B4 \uC548\uC804)\r\n *  - lowerFontSize: \uC800\uC7A5 \uC2DC `styles.fontSize` \u2192 \uD615\uC81C \uD0A4 `fontSize`\r\n *  - liftFontSize:  \uB85C\uB4DC \uC2DC \uD615\uC81C \uD0A4 `fontSize` \u2192 `styles.fontSize`\r\n *\r\n * \uC678\uBD80\uB85C \uB0B4\uBCF4\uB0B4\uB294 \uBAA8\uB4E0 \uACBD\uB85C\uB294 lowerFontSize\uB97C \uAC70\uCCD0\uC57C \uD55C\uB2E4(\uBD88\uBCC0 \uADDC\uCE59).\r\n * \uC785\uB825\uC744 \uBCC0\uD615\uD558\uC9C0 \uC54A\uC73C\uBA70(immutable), \uBCC0\uACBD\uC774 \uC5C6\uC73C\uBA74 \uB3D9\uC77C \uBC30\uC5F4 \uCC38\uC870\uB97C \uBC18\uD658\uD55C\uB2E4.\r\n */\r\n\r\n/** \uBC30\uC5F4 map \uD6C4 \uBCC0\uACBD\uC774 \uC5C6\uC73C\uBA74 \uC6D0\uBCF8 \uCC38\uC870 \uBC18\uD658(\uBD88\uD544\uC694\uD55C \uC7AC\uC0DD\uC131 \uBC29\uC9C0) */\r\nfunction mapPreservingRef(arr, fn) {\r\n  let changed = false;\r\n  const next = arr.map((item) => {\r\n    const mapped = fn(item);\r\n    if (mapped !== item) changed = true;\r\n    return mapped;\r\n  });\r\n  return changed ? next : arr;\r\n}\r\n\r\n/** styled-text \uD55C \uD56D\uBAA9\uC758 fontSize\uB97C styles \u2194 \uD615\uC81C \uD0A4 \uAC04 \uC774\uB3D9 */\r\nfunction mapStyledItem(item, dir) {\r\n  if (!item || typeof item !== \"object\" || item.type !== \"text\") return item;\r\n  if (dir === \"lower\") {\r\n    const fs = item.styles && item.styles.fontSize;\r\n    if (fs == null) return item;\r\n    const { fontSize: _removed, ...restStyles } = item.styles;\r\n    return { ...item, styles: restStyles, fontSize: fs };\r\n  }\r\n  // lift: \uD615\uC81C \uD0A4 \u2192 styles.fontSize (\uB458 \uB2E4 \uC788\uC73C\uBA74 \uD615\uC81C \uD0A4 \uC6B0\uC120)\r\n  const fs = item.fontSize;\r\n  if (fs == null) return item;\r\n  const { fontSize: _lifted, ...rest } = item;\r\n  return { ...rest, styles: { ...(item.styles || {}), fontSize: fs } };\r\n}\r\n\r\n/** \uC778\uB77C\uC778 \uD56D\uBAA9 \u2014 link\uB294 \uC911\uCCA9 content\uB97C \uC7AC\uADC0 */\r\nfunction mapInlineItem(node, dir) {\r\n  if (!node || typeof node !== \"object\") return node;\r\n  if (node.type === \"link\" && Array.isArray(node.content)) {\r\n    const content = mapPreservingRef(node.content, (n) => mapStyledItem(n, dir));\r\n    return content === node.content ? node : { ...node, content };\r\n  }\r\n  return mapStyledItem(node, dir);\r\n}\r\n\r\n/** \uD45C \uC140 \u2014 `{type:\"tableCell\", content}` \uAC1D\uCCB4 / \uD3C9\uBB38 \uC778\uB77C\uC778 \uBC30\uC5F4 \uB450 \uD615\uD0DC \uBAA8\uB450 \uCC98\uB9AC */\r\nfunction mapCell(cell, dir) {\r\n  if (cell && typeof cell === \"object\" && cell.type === \"tableCell\") {\r\n    if (!Array.isArray(cell.content)) return cell;\r\n    const content = mapPreservingRef(cell.content, (n) => mapInlineItem(n, dir));\r\n    return content === cell.content ? cell : { ...cell, content };\r\n  }\r\n  if (Array.isArray(cell)) return mapPreservingRef(cell, (n) => mapInlineItem(n, dir));\r\n  return cell;\r\n}\r\n\r\nfunction mapBlock(block, dir) {\r\n  if (!block || typeof block !== \"object\") return block;\r\n  let next = block;\r\n  const content = block.content;\r\n\r\n  if (Array.isArray(content)) {\r\n    const mapped = mapPreservingRef(content, (n) => mapInlineItem(n, dir));\r\n    if (mapped !== content) next = { ...next, content: mapped };\r\n  } else if (\r\n    content &&\r\n    typeof content === \"object\" &&\r\n    content.type === \"tableContent\" &&\r\n    Array.isArray(content.rows)\r\n  ) {\r\n    const rows = mapPreservingRef(content.rows, (row) => {\r\n      if (!row || !Array.isArray(row.cells)) return row;\r\n      const cells = mapPreservingRef(row.cells, (cell) => mapCell(cell, dir));\r\n      return cells === row.cells ? row : { ...row, cells };\r\n    });\r\n    if (rows !== content.rows) next = { ...next, content: { ...content, rows } };\r\n  }\r\n  // content === undefined (image/video \uB4F1) \u2192 \uD1B5\uACFC\r\n\r\n  if (Array.isArray(block.children) && block.children.length > 0) {\r\n    const children = mapPreservingRef(block.children, (b) => mapBlock(b, dir));\r\n    if (children !== block.children) next = { ...next, children };\r\n  }\r\n  return next;\r\n}\r\n\r\n/** \uC800\uC7A5 \uBC29\uD5A5: styles.fontSize \u2192 \uD615\uC81C \uD0A4 fontSize (onContentChange \uCD9C\uB825\uC5D0 \uC801\uC6A9) */\r\nexport function lowerFontSize(blocks) {\r\n  if (!Array.isArray(blocks)) return blocks;\r\n  return mapPreservingRef(blocks, (b) => mapBlock(b, \"lower\"));\r\n}\r\n\r\n/** \uB85C\uB4DC \uBC29\uD5A5: \uD615\uC81C \uD0A4 fontSize \u2192 styles.fontSize (initialContent\uC5D0 \uC801\uC6A9) */\r\nexport function liftFontSize(blocks) {\r\n  if (!Array.isArray(blocks)) return blocks;\r\n  return mapPreservingRef(blocks, (b) => mapBlock(b, \"lift\"));\r\n}\r\n", "/**\r\n * \uD45C \uBAA8\uB378 \uCF54\uC5B4 (P0-\u2462) \u2014 \uC0D8\uD50C `block-editor.html`\uC758 master-cell \uADF8\uB9AC\uB4DC \uBAA8\uB378 \uCC44\uD0DD(D5).\r\n *\r\n * - `G`: 2\uCC28\uC6D0 \uC2AC\uB86F \uBC30\uC5F4. `G[r][c]`\uB294 master \uC140 \uAC1D\uCCB4\uC758 **\uCC38\uC870**. \uBCD1\uD569 \uC140\uC740 \uAC19\uC740 \uCC38\uC870\uAC00\r\n *   \uC5EC\uB7EC \uC2AC\uB86F\uC744 \uCC44\uC6B4\uB2E4.\r\n * - master\uC758 `r/c/rowspan/colspan`\uC740 \uC9C1\uC811 \uC4F0\uC9C0 \uC54A\uACE0 `normalize(model)`\uAC00 G \uBD84\uD3EC\uC5D0\uC11C\r\n *   \uB9E4\uBC88 \uC7AC\uACC4\uC0B0\uD55C\uB2E4(\uC0D8\uD50C \u00A73.1 \uBD88\uBCC0 \uADDC\uCE59).\r\n * - \uC9C1\uB82C\uD654 \uCE5C\uD654: master\uB294 \uC140 inline content(BlockNote \uBC30\uC5F4)\uC640 \uC140 props\uB97C \uADF8\uB300\uB85C \uBCF4\uAD00\r\n *   (DOM html \uBB38\uC790\uC5F4 \uBCC0\uD658\uC740 \uB80C\uB354 \uB808\uC774\uC5B4 P3\uC5D0\uC11C inline.js\uB85C \uCC98\uB9AC).\r\n */\r\n\r\nlet uid = 0;\r\n\r\n/** \uC0C8 master \uC140. over\uB85C content/props \uCD08\uAE30\uD654 \uAC00\uB2A5. */\r\nexport function newMaster(over) {\r\n  return { id: ++uid, content: [], r: 0, c: 0, rowspan: 1, colspan: 1, ...(over || {}) };\r\n}\r\n\r\n/** G \uC2AC\uB86F \uBD84\uD3EC\uB85C\uBD80\uD130 \uAC01 master\uC758 r/c/rowspan/colspan \uC7AC\uACC4\uC0B0 */\r\nexport function normalize(model) {\r\n  const G = model.G;\r\n  const seen = new Map();\r\n  for (let r = 0; r < G.length; r++) {\r\n    for (let c = 0; c < G[r].length; c++) {\r\n      const cell = G[r][c];\r\n      if (!cell) continue;\r\n      if (!seen.has(cell)) {\r\n        seen.set(cell, { minR: r, minC: c, maxR: r, maxC: c });\r\n      } else {\r\n        const b = seen.get(cell);\r\n        b.minR = Math.min(b.minR, r);\r\n        b.minC = Math.min(b.minC, c);\r\n        b.maxR = Math.max(b.maxR, r);\r\n        b.maxC = Math.max(b.maxC, c);\r\n      }\r\n    }\r\n  }\r\n  seen.forEach((b, cell) => {\r\n    cell.r = b.minR;\r\n    cell.c = b.minC;\r\n    cell.rowspan = b.maxR - b.minR + 1;\r\n    cell.colspan = b.maxC - b.minC + 1;\r\n  });\r\n  return model;\r\n}\r\n\r\n/** \uC2AC\uB86F \uADF8\uB9AC\uB4DC G\uB85C \uBAA8\uB378 \uC0DD\uC131(\uBE48 \uC2AC\uB86F\uC740 \uC0C8 master\uB85C \uCC44\uC6C0) + normalize */\r\nexport function newModelFromG(G, extra) {\r\n  let cols = 0;\r\n  G.forEach((r) => (cols = Math.max(cols, r.length)));\r\n  G.forEach((r) => {\r\n    for (let c = 0; c < cols; c++) if (!r[c]) r[c] = newMaster();\r\n  });\r\n  const model = { G, columnWidths: new Array(cols).fill(null), ...(extra || {}) };\r\n  normalize(model);\r\n  return model;\r\n}\r\n\r\n/** rows\u00D7cols \uBE48 \uD45C \uBAA8\uB378 */\r\nexport function newTableModel(rows, cols) {\r\n  const G = [];\r\n  for (let r = 0; r < rows; r++) {\r\n    const row = [];\r\n    for (let c = 0; c < cols; c++) row.push(newMaster());\r\n    G.push(row);\r\n  }\r\n  return newModelFromG(G);\r\n}\r\n", "/**\r\n * \uD45C \uC9C1\uB82C\uD654 (P0-\u2462): \uD45C \uBAA8\uB378 \u2194 BlockNote `tableContent`.\r\n *\r\n * BlockNote \uD615\uC2DD(ground truth, lumir table-cell-props \uD14C\uC2A4\uD2B8 \uAE30\uC900):\r\n *   content = { type:\"tableContent\", columnWidths:(number|null)[], headerRows?, headerCols?,\r\n *               rows:[ { cells:[ { type:\"tableCell\", props, content:[inline] } ] } ] }\r\n *   cell.props = { colspan, rowspan, backgroundColor?, textColor?, textAlignment?,\r\n *                  verticalAlignment?, rowHeight? }   // va/rowHeight\uB294 lumir \uD655\uC7A5 attr\r\n *\r\n * \uC21C\uC218 JSON \uBCC0\uD658(\uC140 content=\uC778\uB77C\uC778 \uBC30\uC5F4; DOM \uBD88\uD544\uC694). \uC140 props\uB294 **\uC788\uB294 \uADF8\uB300\uB85C \uBCF4\uC874**\uD574\r\n * \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uCDA9\uC2E4\uB3C4(EC3) \uD655\uBCF4. colspan/rowspan\uC740 \uADF8\uB9AC\uB4DC \uAD6C\uC870\uB85C \uC655\uBCF5(normalize \uC7AC\uACC4\uC0B0).\r\n *\r\n * (NOTE) BlockNote\uC758 \uAE30\uBCF8 props \uD3EC\uD568 \uAD00\uB840(\uC608: backgroundColor:\"default\" \uD56D\uC0C1 \uD3EC\uD568 \uC5EC\uBD80)\uB294\r\n *   P0-\u2464\uC5D0\uC11C \uC2E4\uC81C fixture\uB85C \uAC80\uC99D\u00B7\uBCF4\uC815. \uD604\uC7AC\uB294 \"\uC18C\uC2A4\uC5D0 \uC788\uC73C\uBA74 \uBCF4\uC874, \uC5C6\uC73C\uBA74 \uC0DD\uB7B5\" \uC815\uCC45.\r\n */\r\n\r\nimport { newMaster, newModelFromG } from \"../table/model.js\";\r\n\r\n// \uC140\uC5D0\uC11C \uADF8\uB300\uB85C \uC655\uBCF5\uD558\uB294 prop \uD0A4(colspan/rowspan\uC740 \uADF8\uB9AC\uB4DC\uB85C \uBCC4\uB3C4 \uCC98\uB9AC)\r\nconst CELL_PROP_KEYS = [\"backgroundColor\", \"textColor\", \"textAlignment\", \"verticalAlignment\", \"rowHeight\"];\r\n\r\nfunction masterToCell(m) {\r\n  const props = { colspan: m.colspan || 1, rowspan: m.rowspan || 1 };\r\n  for (const k of CELL_PROP_KEYS) {\r\n    if (m[k] !== undefined) props[k] = m[k];\r\n  }\r\n  return { type: \"tableCell\", props, content: Array.isArray(m.content) ? m.content : [] };\r\n}\r\n\r\n/** \uD45C \uBAA8\uB378 \u2192 BlockNote tableContent */\r\nexport function modelToTableContent(model) {\r\n  const G = model.G;\r\n  const rows = [];\r\n  for (let r = 0; r < G.length; r++) {\r\n    const cells = [];\r\n    for (let c = 0; c < G[r].length; c++) {\r\n      const m = G[r][c];\r\n      if (!m) continue;\r\n      if (m.r !== r || m.c !== c) continue; // master \uC88C\uC0C1\uB2E8\uC5D0\uC11C\uB9CC emit(\uBCD1\uD569 \uC2AC\uB86F \uC0DD\uB7B5)\r\n      cells.push(masterToCell(m));\r\n    }\r\n    rows.push({ cells });\r\n  }\r\n  const content = {\r\n    type: \"tableContent\",\r\n    columnWidths: (model.columnWidths || []).slice(),\r\n    rows,\r\n  };\r\n  if (model.headerRows != null) content.headerRows = model.headerRows;\r\n  if (model.headerCols != null) content.headerCols = model.headerCols;\r\n  return content;\r\n}\r\n\r\n/** BlockNote tableContent \u2192 \uD45C \uBAA8\uB378 */\r\nexport function tableContentToModel(content) {\r\n  const rows = (content && content.rows) || [];\r\n  const G = [];\r\n  const occupied = {};\r\n  for (let r = 0; r < rows.length; r++) {\r\n    G[r] = G[r] || [];\r\n    let c = 0;\r\n    const cells = rows[r].cells || [];\r\n    for (const cell of cells) {\r\n      while (occupied[r + \"_\" + c]) c++;\r\n      const props = cell.props || {};\r\n      const colspan = props.colspan || 1;\r\n      const rowspan = props.rowspan || 1;\r\n      const master = newMaster({ content: Array.isArray(cell.content) ? cell.content : [] });\r\n      for (const k of CELL_PROP_KEYS) {\r\n        if (props[k] !== undefined) master[k] = props[k];\r\n      }\r\n      for (let dr = 0; dr < rowspan; dr++) {\r\n        for (let dc = 0; dc < colspan; dc++) {\r\n          const rr = r + dr;\r\n          const cc = c + dc;\r\n          G[rr] = G[rr] || [];\r\n          G[rr][cc] = master;\r\n          if (!(dr === 0 && dc === 0)) occupied[rr + \"_\" + cc] = true;\r\n        }\r\n      }\r\n      c += colspan;\r\n    }\r\n  }\r\n  const model = newModelFromG(G);\r\n  if (content && Array.isArray(content.columnWidths)) {\r\n    // \uC5F4 \uC218\uC640 \uAE38\uC774\uAC00 \uB2E4\uB974\uBA74(\uB808\uAC70\uC2DC/\uC190\uC0C1 JSON) \uC5F4 \uC218\uC5D0 \uB9DE\uCDB0 \uC815\uD569(\uCD08\uACFC\uBD84 \uC808\uB2E8\u00B7\uBD80\uC871\uBD84 null \uD328\uB529). \uC77C\uCE58 \uC2DC \uADF8\uB300\uB85C.\r\n    const cols = model.G[0] ? model.G[0].length : 0;\r\n    const src = content.columnWidths;\r\n    model.columnWidths = src.length === cols ? src.slice() : Array.from({ length: cols }, (_, i) => (i < src.length ? src[i] : null));\r\n  }\r\n  if (content && content.headerRows != null) model.headerRows = content.headerRows;\r\n  if (content && content.headerCols != null) model.headerCols = content.headerCols;\r\n  return model;\r\n}\r\n", "/**\r\n * \uD45C DOM \uB80C\uB354/\uC2F1\uD06C (P0-\u2464a / P3) \u2014 \uD45C \uBAA8\uB378 \u2192 \uB77C\uC774\uBE0C `<table>` DOM, \uB77C\uC774\uBE0C \uD3B8\uC9D1 \u2192 \uBAA8\uB378.content.\r\n * \uC0D8\uD50C renderTable/syncFromDOM \uD328\uD134(D5). \uC140\uC740 contenteditable.\r\n *  - renderTableElement(model): \uC0C8 <table> \uC0DD\uC131\r\n *  - rerenderTable(table): \uAE30\uC874 <table>\uC744 \uC81C\uC790\uB9AC \uC7AC\uAD6C\uCD95(\uAD6C\uC870 \uC5F0\uC0B0 \uD6C4)\r\n *  - syncModelFromTableDom(table): \uC140 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uBAA8\uB378\uB85C \uD68C\uC218\r\n */\r\n\r\nimport { inlineContentToHtml, htmlToInlineContent } from \"../serialize/inline.js\";\r\n\r\n/** colgroup + tbody\uB97C table \uC548\uC5D0 (\uC7AC)\uAD6C\uCD95 */\r\nfunction buildTable(table, model) {\r\n  while (table.firstChild) table.removeChild(table.firstChild);\r\n  const G = model.G || [];\r\n  const rows = G.length;\r\n  const cols = rows && G[0] ? G[0].length : 0;\r\n\r\n  const colgroup = document.createElement(\"colgroup\");\r\n  for (let c = 0; c < cols; c++) {\r\n    const col = document.createElement(\"col\");\r\n    const w = model.columnWidths && model.columnWidths[c];\r\n    if (w) col.style.width = w + \"px\";\r\n    colgroup.appendChild(col);\r\n  }\r\n  table.appendChild(colgroup);\r\n\r\n  const tbody = document.createElement(\"tbody\");\r\n  for (let r = 0; r < rows; r++) {\r\n    const tr = document.createElement(\"tr\");\r\n    for (let c = 0; c < cols; c++) {\r\n      const m = G[r][c];\r\n      if (!m || m.r !== r || m.c !== c) continue; // master \uC88C\uC0C1\uB2E8\uC5D0\uC11C\uB9CC\r\n      const td = document.createElement(\"td\");\r\n      td.className = \"lumir-cell\";\r\n      td.setAttribute(\"contenteditable\", \"true\");\r\n      // \uC811\uADFC\uC131: \uBA38\uB9AC\uD589/\uC5F4 \uC140\uC5D0 ARIA \uC5ED\uD560 \uBD80\uC5EC(\uD0DC\uADF8\uB294 <td> \uC720\uC9C0 \u2014 \uC140 \uC120\uD0DD\uC790/\uD3B8\uC9D1 \uD750\uB984 \uBD88\uBCC0).\r\n      if ((model.headerRows || 0) > m.r) td.setAttribute(\"role\", \"columnheader\");\r\n      else if ((model.headerCols || 0) > m.c) td.setAttribute(\"role\", \"rowheader\");\r\n      if (m.colspan > 1) td.colSpan = m.colspan;\r\n      if (m.rowspan > 1) td.rowSpan = m.rowspan;\r\n      if (m.textAlignment) td.style.textAlign = m.textAlignment;\r\n      if (m.verticalAlignment) td.style.verticalAlign = m.verticalAlignment;\r\n      if (m.backgroundColor) td.dataset.backgroundColor = m.backgroundColor;\r\n      if (m.textColor) td.dataset.textColor = m.textColor;\r\n      if (m.rowHeight) {\r\n        td.dataset.rowHeight = String(m.rowHeight);\r\n        tr.style.height = m.rowHeight + \"px\";\r\n      }\r\n      td.dataset.r = String(m.r);\r\n      td.dataset.c = String(m.c);\r\n      td.__master = m;\r\n      td.innerHTML = inlineContentToHtml(m.content);\r\n      tr.appendChild(td);\r\n    }\r\n    tbody.appendChild(tr);\r\n  }\r\n  table.appendChild(tbody);\r\n\r\n  // \uBA38\uB9AC\uD589/\uC5F4 \uC2A4\uD0C0\uC77C \uD074\uB798\uC2A4(CSS\uAC00 \uCCAB \uD589/\uC5F4 \uAC15\uC870)\r\n  table.classList.toggle(\"hr\", (model.headerRows || 0) > 0);\r\n  table.classList.toggle(\"hc\", (model.headerCols || 0) > 0);\r\n  // compact: \uC5F4\uC774 \uB9CE\uC544 \uC5F4\uD3ED\uC774 \uAE30\uBCF8\uCD5C\uC18C(40=CSS td min-width) \uBBF8\uB9CC\uC73C\uB85C \uB20C\uB9B0 \uC0C1\uD0DC \u2192 CSS min-width\uB97C \uB0AE\uCDA4(\uBAA8\uB378=\uB80C\uB354 \uC815\uD569).\r\n  table.classList.toggle(\"lumir-tbl--compact\", (model.columnWidths || []).some((w) => w && w < 40));\r\n}\r\n\r\n/** \uD45C \uBAA8\uB378 \u2192 \uC0C8 `<table class=\"lumir-tbl\">` */\r\nexport function renderTableElement(model) {\r\n  if (typeof document === \"undefined\") throw new Error(\"renderTableElement: DOM(document) \uD544\uC694\");\r\n  const table = document.createElement(\"table\");\r\n  table.className = \"lumir-tbl\";\r\n  table.__model = model;\r\n  buildTable(table, model);\r\n  return table;\r\n}\r\n\r\n/** \uAE30\uC874 `<table>`\uC744 \uBAA8\uB378\uB85C \uC81C\uC790\uB9AC \uC7AC\uAD6C\uCD95(\uAD6C\uC870 \uC5F0\uC0B0 \uD6C4 \uD638\uCD9C) */\r\nexport function rerenderTable(table) {\r\n  if (!table || !table.__model) return;\r\n  buildTable(table, table.__model);\r\n}\r\n\r\n/** \uB77C\uC774\uBE0C `<table>` \uC140 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uBAA8\uB378 master.content\uB85C \uD68C\uC218(\uC0D8\uD50C syncFromDOM) */\r\nexport function syncModelFromTableDom(tableEl) {\r\n  if (!tableEl || !tableEl.querySelectorAll) return;\r\n  tableEl.querySelectorAll(\"td.lumir-cell\").forEach((td) => {\r\n    if (td.__master) td.__master.content = htmlToInlineContent(td);\r\n  });\r\n}\r\n", "/**\r\n * \uAE30\uB2A5(\uBE14\uB85D/\uD655\uC7A5) \uC2A4\uD399 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \u2014 \uC5D4\uC9C4(core/serialize)\uC740 \uACC4\uCE35 \uC720\uC9C0, \uBE14\uB85D/\uD655\uC7A5\uC740 \uC218\uC9C1 \uC2AC\uB77C\uC774\uC2A4.\r\n *\r\n * \uAC01 \uAE30\uB2A5\uC740 features/<name>/index.js \uC5D0\uC11C \uC2A4\uD399 \uAC1D\uCCB4\uB97C default export \uD55C\uB2E4:\r\n *   {\r\n *     name: string,\r\n *     blocks?: { [type]: { toElement(block)->HTMLElement, fromElement(el)->block } },  // \uCEE4\uC2A4\uD140 \uBE14\uB85D \uC9C1\uB82C\uD654\r\n *     slash?: (ctx) => SlashItem[],   // \uC2AC\uB798\uC2DC \uBA54\uB274 \uAE30\uC5EC(ctx: \uC5D0\uB514\uD130 \uCEE8\uD14D\uC2A4\uD2B8)\r\n *     // (\uD655\uC7A5 \uC608\uC815) paste?, controls?(editorEl, ctx), inlineStyles?, api?\r\n *   }\r\n *\r\n * buildRegistry \uAC00 \uC2A4\uD399\uB4E4\uC744 \uC9C1\uB82C\uD654 lookup(toEl/fromEl)\uC73C\uB85C \uD569\uCE58\uACE0,\r\n * gatherSlash(ctx) \uB85C \uC2AC\uB798\uC2DC \uD56D\uBAA9\uC744 \uC218\uC9D1\uD55C\uB2E4.\r\n * \uC9C1\uB82C\uD654 lookup \uC740 serialize/document.js(\uD569\uC131 \uB8E8\uD2B8)\uAC00, \uC2AC\uB798\uC2DC\uB294 editor.js(\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130)\uAC00 \uC18C\uBE44.\r\n *\r\n * \uACF5\uC874 \uC804\uB7B5: \uBBF8\uC774\uC804 \uAE30\uB2A5\uC740 \uAE30\uC874 \uBC30\uC120 \uC720\uC9C0 \u2192 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uACB0\uACFC\uC640 \uBCD1\uD569(\uB3D9\uC791 \uB3D9\uC77C). \uD55C \uAE30\uB2A5\uC529 \uC774\uC804.\r\n */\r\n\r\nexport function buildRegistry(features) {\r\n  const list = Array.isArray(features) ? features.filter(Boolean) : [];\r\n  const toEl = {};\r\n  const fromEl = {};\r\n  for (const f of list) {\r\n    if (!f || !f.blocks) continue;\r\n    for (const type of Object.keys(f.blocks)) {\r\n      const spec = f.blocks[type];\r\n      if (spec && typeof spec.toElement === \"function\") toEl[type] = spec.toElement;\r\n      if (spec && typeof spec.fromElement === \"function\") fromEl[type] = spec.fromElement;\r\n    }\r\n  }\r\n  return {\r\n    features: list,\r\n    toEl,\r\n    fromEl,\r\n    /** \uBAA8\uB4E0 \uAE30\uB2A5\uC758 \uC2AC\uB798\uC2DC \uD56D\uBAA9 \uC218\uC9D1(ctx: \uC5D0\uB514\uD130\uAC00 \uC8FC\uC785\uD558\uB294 \uCEE8\uD14D\uC2A4\uD2B8) */\r\n    gatherSlash(ctx) {\r\n      const out = [];\r\n      for (const f of list) {\r\n        if (f && typeof f.slash === \"function\") {\r\n          const items = f.slash(ctx);\r\n          if (Array.isArray(items)) out.push(...items);\r\n        }\r\n      }\r\n      return out;\r\n    },\r\n    /** \uBAA8\uB4E0 \uAE30\uB2A5\uC758 \uC778\uD130\uB799\uC158 \uCEE8\uD2B8\uB864\uB7EC \uBD80\uCC29. controls(editorEl, ctx)\uB294 { destroy, refresh? } \uD578\uB4E4 \uBC18\uD658 \u2192 \uD578\uB4E4 \uBC30\uC5F4 \uBC18\uD658 */\r\n    attachControls(editorEl, ctx) {\r\n      const handles = [];\r\n      for (const f of list) {\r\n        if (f && typeof f.controls === \"function\") {\r\n          const h = f.controls(editorEl, ctx);\r\n          if (h) handles.push(h);\r\n        }\r\n      }\r\n      return handles;\r\n    },\r\n    /** \uBAA8\uB4E0 \uAE30\uB2A5\uC758 \uBD99\uC5EC\uB123\uAE30 \uADDC\uCE59 \uC218\uC9D1. paste(ctx) => [{ match(text,html), handle(text,html)->bool }] */\r\n    gatherPaste(ctx) {\r\n      const out = [];\r\n      for (const f of list) {\r\n        if (f && typeof f.paste === \"function\") {\r\n          const rules = f.paste(ctx);\r\n          if (Array.isArray(rules)) out.push(...rules);\r\n        }\r\n      }\r\n      return out;\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD398\uC774\uC9C0 \uB098\uB204\uAE30 \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654 (BlockNote `pageBreak`).\r\n * { type:\"pageBreak\", props:{}, content:[], children:[] }\r\n * \uD3B8\uC9D1 \uD654\uBA74=\uC218\uD3C9 \uAD6C\uBD84\uC120, \uC778\uC1C4/PDF=\uD398\uC774\uC9C0 \uAD6C\uBD84.\r\n */\r\n\r\nexport function pageBreakBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"pageBreakBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"pageBreak\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = {};\r\n  el.__children = [];\r\n\r\n  const hr = document.createElement(\"div\");\r\n  hr.className = \"lumir-page-break\";\r\n  hr.setAttribute(\"contenteditable\", \"false\");\r\n  hr.setAttribute(\"aria-label\", \"\uD398\uC774\uC9C0 \uB098\uB204\uAE30\");\r\n  el.appendChild(hr);\r\n  return el;\r\n}\r\n\r\nexport function pageBreakElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"pageBreak\";\r\n  block.props = {};\r\n  // void \uBE14\uB85D \u2192 content \uD0A4 \uC5C6\uC74C\r\n  block.children = [];\r\n  return block;\r\n}\r\n", "/**\r\n * \uD398\uC774\uC9C0 \uB098\uB204\uAE30 \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654 + \uC2AC\uB798\uC2DC \uD56D\uBAA9\uC744 \uD55C \uD3F4\uB354\uC5D0\uC11C \uC18C\uC720.\r\n * (CSS: ./page-break.css, style.css \uC5D0\uC11C @import)\r\n */\r\nimport { pageBreakBlockToElement, pageBreakElementToBlock } from \"./page-break.js\";\r\n\r\nexport default {\r\n  name: \"pageBreak\",\r\n  blocks: {\r\n    pageBreak: { toElement: pageBreakBlockToElement, fromElement: pageBreakElementToBlock },\r\n  },\r\n  slash: (ctx) => {\r\n    const SM = (ctx.locale && ctx.locale.slashMenu) || {};\r\n    return [\r\n      {\r\n        type: \"pageBreak\",\r\n        label: SM.pageBreak || \"\uD398\uC774\uC9C0 \uB098\uB204\uAE30\",\r\n        kw: \"page break separator divider \uD398\uC774\uC9C0 \uB098\uB204\uAE30 \uAD6C\uBD84 hr\",\r\n        group: SM.groupBasic || \"\uAE30\uBCF8 \uBE14\uB85D\",\r\n        ico: \"\u2014\",\r\n        sub: \"\uD398\uC774\uC9C0 \uAD6C\uBD84\uC120\",\r\n        action: () => ctx.insertBlocks([{ type: \"pageBreak\", props: {}, content: [], children: [] }]),\r\n      },\r\n    ];\r\n  },\r\n};\r\n", "/**\r\n * \uC774\uBBF8\uC9C0 \uBE14\uB85D (P5-\u2461) \u2014 BlockNote `image` \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654.\r\n * \uBE14\uB85D JSON: { type:\"image\", props:{ url, caption?, previewWidth?, name?, textAlignment?, showPreview? }, content:[], children:[] }\r\n * props\uB294 verbatim \uBCF4\uC874(__props) \u2192 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD. \uB9AC\uC0AC\uC774\uC988\uB294 ./controls.js(attachImageControls)\uAC00 previewWidth \uAC31\uC2E0.\r\n *  - textAlignment(A6): \uC774\uBBF8\uC9C0 \uBE14\uB85D \uC815\uB82C(left/center/right)\r\n *  - showPreview(A6): false\uBA74 \uC378\uB124\uC77C \uB300\uC2E0 \uD30C\uC77C\uBA85 \uCE74\uB4DC\uB9CC \uD45C\uC2DC\r\n *  - name(A6): \uD30C\uC77C\uBA85(\uBBF8\uB9AC\uBCF4\uAE30 \uB054 \uCE74\uB4DC\u00B7alt \uB300\uCCB4)\r\n */\r\n\r\nimport { neutralizeUrl } from \"../../utils/url.js\";\r\n\r\nexport function imageBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"imageBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"image\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block && block.props ? { ...block.props } : {};\r\n  el.__children = block && Array.isArray(block.children) ? block.children : [];\r\n\r\n  const props = el.__props;\r\n  const wrap = document.createElement(\"div\");\r\n  wrap.className = \"lumir-image\";\r\n  wrap.setAttribute(\"contenteditable\", \"false\");\r\n  if (props.textAlignment && props.textAlignment !== \"left\") wrap.dataset.align = props.textAlignment; // A6 \uC815\uB82C\r\n\r\n  const showPreview = props.showPreview !== false; // \uAE30\uBCF8 true\r\n\r\n  if (props.url && showPreview) {\r\n    const inner = document.createElement(\"div\");\r\n    inner.className = \"lumir-image-inner\";\r\n    if (props.previewWidth) inner.style.width = props.previewWidth + \"px\";\r\n    const img = document.createElement(\"img\");\r\n    img.src = neutralizeUrl(props.url);\r\n    img.alt = props.caption || props.name || \"\";\r\n    img.draggable = false;\r\n    inner.appendChild(img);\r\n    inner.insertAdjacentHTML(\"beforeend\", '<div class=\"lumir-image-handle left\"></div><div class=\"lumir-image-handle right\"></div>');\r\n    wrap.appendChild(inner);\r\n    if (props.caption) {\r\n      const cap = document.createElement(\"div\");\r\n      cap.className = \"lumir-image-caption\";\r\n      cap.textContent = props.caption;\r\n      wrap.appendChild(cap);\r\n    }\r\n  } else if (props.url && !showPreview) {\r\n    // A6: \uBBF8\uB9AC\uBCF4\uAE30 \uB054 \u2192 \uD30C\uC77C\uBA85 \uCE74\uB4DC(\uD074\uB9AD \uC2DC \uC6D0\uBCF8 \uB9C1\uD06C)\r\n    const card = document.createElement(\"a\");\r\n    card.className = \"lumir-image-namecard\";\r\n    card.href = neutralizeUrl(props.url);\r\n    card.target = \"_blank\";\r\n    card.rel = \"noopener noreferrer\";\r\n    card.textContent = props.name || props.caption || props.url;\r\n    wrap.appendChild(card);\r\n  } else {\r\n    const ph = document.createElement(\"div\");\r\n    ph.className = \"lumir-image-placeholder\";\r\n    ph.textContent = \"\uC774\uBBF8\uC9C0 URL \uC5C6\uC74C\";\r\n    wrap.appendChild(ph);\r\n  }\r\n  el.appendChild(wrap);\r\n  return el;\r\n}\r\n\r\nexport function imageElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"image\";\r\n  block.props = el.__props || {};\r\n  // \uD30C\uC77C\uD615 \uBE14\uB85D(image/video/audio/file)\uC740 blocknote \uAD6C\uC870\uC0C1 content \uD0A4\uAC00 \uC5C6\uB2E4(no content).\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/**\r\n * \uACF5\uC720 \uB4DC\uB798\uADF8-\uB9AC\uC0AC\uC774\uC988 \uD504\uB9AC\uBBF8\uD2F0\uBE0C \u2014 \uB9C8\uC6B0\uC2A4 \uB4DC\uB798\uADF8\uB85C \uD55C \uCD95(x/y) \uAC12\uC744 clamp \uBC94\uC704 \uB0B4\uC5D0\uC11C \uAC31\uC2E0.\r\n * \uAE30\uB2A5(image/video \uB4F1)\uC774 \"\uC5B4\uB5A4 \uD578\uB4E4\u00B7\uC5B4\uB5A4 prop\"\uC778\uC9C0\uB9CC \uC815\uD558\uACE0 \uC800\uC218\uC900 \uB4DC\uB798\uADF8 \uB8E8\uD504\uB294 \uC5EC\uAE30\uC11C \uCC98\uB9AC.\r\n *\r\n *   startDragResize(e, { axis:\"x\"|\"y\", startVal, min, max, sign:\u00B11, onMove(v), onEnd() })\r\n */\r\nexport function startDragResize(e, opts) {\r\n  const axis = opts.axis === \"y\" ? \"y\" : \"x\";\r\n  const sign = opts.sign === -1 ? -1 : 1;\r\n  const startCoord = axis === \"x\" ? e.clientX : e.clientY;\r\n  const clamp = (v) => Math.max(opts.min, Math.min(v, opts.max));\r\n  function move(ev) {\r\n    const cur = axis === \"x\" ? ev.clientX : ev.clientY;\r\n    opts.onMove(clamp(opts.startVal + sign * (cur - startCoord)));\r\n  }\r\n  function up() {\r\n    document.removeEventListener(\"mousemove\", move);\r\n    document.removeEventListener(\"mouseup\", up);\r\n    if (opts.onEnd) opts.onEnd();\r\n  }\r\n  document.addEventListener(\"mousemove\", move);\r\n  document.addEventListener(\"mouseup\", up);\r\n}\r\n", "/** \uC774\uBBF8\uC9C0 \uB9AC\uC0AC\uC774\uC988 \uCEE8\uD2B8\uB864\uB7EC \u2014 \uC88C/\uC6B0 \uD578\uB4E4 \uB4DC\uB798\uADF8\uB85C previewWidth \uAC31\uC2E0(\uC9C1\uB82C\uD654 \uC815\uD569). */\r\nimport { startDragResize } from \"../../shared/drag-resize.js\";\r\n\r\nconst MIN_W = 100, MAX_W = 1200;\r\n\r\nexport function attachImageControls(editorEl, ctx) {\r\n  const onChange = (ctx && ctx.onChange) || (() => {});\r\n  const isEditable = () => (ctx && typeof ctx.isEditable === \"function\" ? ctx.isEditable() : true);\r\n  function onMousedown(e) {\r\n    if (!isEditable()) return; // \uC77D\uAE30\uC804\uC6A9\uC5D0\uC120 \uB9AC\uC0AC\uC774\uC988 \uBE44\uD65C\uC131\r\n    const h = e.target.closest && e.target.closest(\".lumir-image-handle\");\r\n    if (!h) return;\r\n    e.preventDefault();\r\n    const block = h.closest(\".block\");\r\n    const inner = h.closest(\".lumir-image-inner\");\r\n    if (!block || !inner) return;\r\n    if (!block.__props) block.__props = {};\r\n    const measured = inner.getBoundingClientRect ? Math.round(inner.getBoundingClientRect().width) : 0;\r\n    const startW = block.__props.previewWidth || measured || 320;\r\n    startDragResize(e, {\r\n      axis: \"x\", startVal: startW, min: MIN_W, max: MAX_W, sign: h.classList.contains(\"left\") ? -1 : 1,\r\n      onMove: (w) => { block.__props.previewWidth = w; inner.style.width = w + \"px\"; },\r\n      onEnd: onChange,\r\n    });\r\n  }\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n  return { destroy: () => editorEl.removeEventListener(\"mousedown\", onMousedown) };\r\n}\r\n", "/** \uC774\uBBF8\uC9C0 \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654 + \uC2AC\uB798\uC2DC(\uD30C\uC77C \uC120\uD0DD \uC5C5\uB85C\uB4DC) + \uB9AC\uC0AC\uC774\uC988 \uCEE8\uD2B8\uB864. */\r\nimport { imageBlockToElement, imageElementToBlock } from \"./image.js\";\r\nimport { attachImageControls } from \"./controls.js\";\r\n\r\nexport default {\r\n  name: \"image\",\r\n  blocks: { image: { toElement: imageBlockToElement, fromElement: imageElementToBlock } },\r\n  controls: (editorEl, ctx) => attachImageControls(editorEl, ctx),\r\n  slash: (ctx) => {\r\n    // \uC5C5\uB85C\uB354(uploadFile/s3Upload) \uBBF8\uC124\uC815 \uC2DC \uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC \uC2AC\uB798\uC2DC \uC228\uAE40(\uBE44\uB514\uC624/\uC624\uB514\uC624\uC640 \uB3D9\uC77C \uC815\uCC45).\r\n    if (!ctx.hasUploader) return [];\r\n    const SM = (ctx.locale && ctx.locale.slashMenu) || {};\r\n    return [\r\n      {\r\n        type: \"image\",\r\n        label: SM.image || \"\uC774\uBBF8\uC9C0\",\r\n        kw: \"image \uC774\uBBF8\uC9C0 \uADF8\uB9BC \uC0AC\uC9C4 picture\",\r\n        group: SM.groupMedia || \"\uBBF8\uB514\uC5B4\",\r\n        ico: \"\uD83D\uDDBC\",\r\n        sub: \"\uC774\uBBF8\uC9C0 \uD30C\uC77C \uC5C5\uB85C\uB4DC\",\r\n        action: () => ctx.openImagePicker && ctx.openImagePicker(),\r\n      },\r\n    ];\r\n  },\r\n};\r\n", "/**\r\n * \uBE44\uB514\uC624 \uBE14\uB85D (P5-\u2463) \u2014 BlockNote `video` \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654.\r\n * { type:\"video\", props:{ url, previewWidth? }, content:[], children:[] }\r\n * \uB9AC\uC0AC\uC774\uC988\uB294 ./controls.js(attachVideoControls)\uAC00 \uCC98\uB9AC(.lumir-video-handle). nodownload\u00B7\uC6B0\uD074\uB9AD \uCC28\uB2E8.\r\n */\r\n\r\nimport { neutralizeUrl } from \"../../utils/url.js\";\r\n\r\nexport function videoBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"videoBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"video\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block && block.props ? { ...block.props } : {};\r\n  el.__children = block && Array.isArray(block.children) ? block.children : [];\r\n\r\n  const props = el.__props;\r\n  const wrap = document.createElement(\"div\");\r\n  wrap.className = \"lumir-video\";\r\n  wrap.setAttribute(\"contenteditable\", \"false\");\r\n\r\n  if (props.url) {\r\n    const inner = document.createElement(\"div\");\r\n    inner.className = \"lumir-video-inner\";\r\n    if (props.previewWidth) inner.style.width = props.previewWidth + \"px\";\r\n    const v = document.createElement(\"video\");\r\n    v.src = neutralizeUrl(props.url);\r\n    v.controls = true;\r\n    v.setAttribute(\"controlsList\", \"nodownload\");\r\n    v.setAttribute(\"playsinline\", \"\");\r\n    if (props.previewHeight) v.style.height = props.previewHeight + \"px\";\r\n    v.addEventListener(\"contextmenu\", (e) => e.preventDefault());\r\n    inner.appendChild(v);\r\n    inner.insertAdjacentHTML(\"beforeend\", '<div class=\"lumir-video-handle left\"></div><div class=\"lumir-video-handle right\"></div><div class=\"lumir-video-handle bottom\"></div>');\r\n    wrap.appendChild(inner);\r\n  } else {\r\n    const ph = document.createElement(\"div\");\r\n    ph.className = \"lumir-video-placeholder\";\r\n    ph.textContent = \"\uBE44\uB514\uC624 URL \uC5C6\uC74C\";\r\n    wrap.appendChild(ph);\r\n  }\r\n  el.appendChild(wrap);\r\n  return el;\r\n}\r\n\r\nexport function videoElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"video\";\r\n  block.props = el.__props || {};\r\n  // \uD30C\uC77C\uD615 \uBE14\uB85D: blocknote \uAD6C\uC870\uC0C1 content \uD0A4 \uC5C6\uC74C(no content)\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/** \uBE44\uB514\uC624 \uB9AC\uC0AC\uC774\uC988 \uCEE8\uD2B8\uB864\uB7EC \u2014 \uC88C/\uC6B0 \uD578\uB4E4=previewWidth, \uD558\uB2E8 \uD578\uB4E4=previewHeight. */\r\nimport { startDragResize } from \"../../shared/drag-resize.js\";\r\n\r\nconst MIN_W = 100, MAX_W = 1200, MIN_H = 120, MAX_H = 600;\r\n\r\nexport function attachVideoControls(editorEl, ctx) {\r\n  const onChange = (ctx && ctx.onChange) || (() => {});\r\n  const isEditable = () => (ctx && typeof ctx.isEditable === \"function\" ? ctx.isEditable() : true);\r\n  function onMousedown(e) {\r\n    if (!isEditable()) return; // \uC77D\uAE30\uC804\uC6A9\uC5D0\uC120 \uB9AC\uC0AC\uC774\uC988 \uBE44\uD65C\uC131\r\n    const h = e.target.closest && e.target.closest(\".lumir-video-handle\");\r\n    if (!h) return;\r\n    e.preventDefault();\r\n    const block = h.closest(\".block\");\r\n    const inner = h.closest(\".lumir-video-inner\");\r\n    if (!block || !inner) return;\r\n    if (!block.__props) block.__props = {};\r\n    if (h.classList.contains(\"bottom\")) {\r\n      const video = inner.querySelector(\"video\");\r\n      const measuredH = video && video.getBoundingClientRect ? Math.round(video.getBoundingClientRect().height) : 0;\r\n      const startH = block.__props.previewHeight || measuredH || 360;\r\n      startDragResize(e, {\r\n        axis: \"y\", startVal: startH, min: MIN_H, max: MAX_H, sign: 1,\r\n        onMove: (hh) => { block.__props.previewHeight = hh; if (video) video.style.height = hh + \"px\"; },\r\n        onEnd: onChange,\r\n      });\r\n      return;\r\n    }\r\n    const measured = inner.getBoundingClientRect ? Math.round(inner.getBoundingClientRect().width) : 0;\r\n    const startW = block.__props.previewWidth || measured || 320;\r\n    startDragResize(e, {\r\n      axis: \"x\", startVal: startW, min: MIN_W, max: MAX_W, sign: h.classList.contains(\"left\") ? -1 : 1,\r\n      onMove: (w) => { block.__props.previewWidth = w; inner.style.width = w + \"px\"; },\r\n      onEnd: onChange,\r\n    });\r\n  }\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n  return { destroy: () => editorEl.removeEventListener(\"mousedown\", onMousedown) };\r\n}\r\n", "/** \uBE44\uB514\uC624 \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654 + \uB9AC\uC0AC\uC774\uC988 \uCEE8\uD2B8\uB864. (\uC0BD\uC785\uC740 \uC5C5\uB85C\uB4DC/\uD30C\uC77C\uD328\uB110/\uBD99\uC5EC\uB123\uAE30 \uACBD\uB85C) */\r\nimport { videoBlockToElement, videoElementToBlock } from \"./video.js\";\r\nimport { attachVideoControls } from \"./controls.js\";\r\n\r\nexport default {\r\n  name: \"video\",\r\n  blocks: { video: { toElement: videoBlockToElement, fromElement: videoElementToBlock } },\r\n  controls: (editorEl, ctx) => attachVideoControls(editorEl, ctx),\r\n  // \uBE44\uB514\uC624 \uC2AC\uB798\uC2DC \u2014 allowVideoUpload \uC2DC\uC5D0\uB9CC \uB178\uCD9C(blocknote \uB3D9\uC791 \uC77C\uCE58). \uACF5\uC6A9 \uD30C\uC77C \uC120\uD0DD\uAE30 \uC0AC\uC6A9.\r\n  slash: (ctx) => {\r\n    if (!(ctx.opts && ctx.opts.allowVideoUpload)) return [];\r\n    const SM = (ctx.locale && ctx.locale.slashMenu) || {};\r\n    return [\r\n      {\r\n        type: \"video\",\r\n        label: SM.video || \"\uBE44\uB514\uC624\",\r\n        kw: \"video \uBE44\uB514\uC624 \uB3D9\uC601\uC0C1 movie mp4\",\r\n        group: SM.groupMedia || \"\uBBF8\uB514\uC5B4\",\r\n        ico: \"\uD83C\uDFAC\",\r\n        sub: \"\uB3D9\uC601\uC0C1 \uD30C\uC77C \uC5C5\uB85C\uB4DC\",\r\n        action: () => ctx.openImagePicker && ctx.openImagePicker(),\r\n      },\r\n    ];\r\n  },\r\n};\r\n", "/**\r\n * \uC624\uB514\uC624 \uBE14\uB85D (FP-4) \u2014 BlockNote `audio` \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654.\r\n * { type:\"audio\", props:{ url, name? }, content:[], children:[] }\r\n * <audio controls controlsList=nodownload>. \uC6B0\uD074\uB9AD \uCC28\uB2E8.\r\n */\r\n\r\nimport { neutralizeUrl } from \"../../utils/url.js\";\r\n\r\nexport function audioBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"audioBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"audio\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block && block.props ? { ...block.props } : {};\r\n  el.__children = block && Array.isArray(block.children) ? block.children : [];\r\n\r\n  const props = el.__props;\r\n  const wrap = document.createElement(\"div\");\r\n  wrap.className = \"lumir-audio\";\r\n  wrap.setAttribute(\"contenteditable\", \"false\");\r\n\r\n  if (props.url) {\r\n    const a = document.createElement(\"audio\");\r\n    a.src = neutralizeUrl(props.url);\r\n    a.controls = true;\r\n    a.setAttribute(\"controlsList\", \"nodownload\");\r\n    a.addEventListener(\"contextmenu\", (e) => e.preventDefault());\r\n    wrap.appendChild(a);\r\n  } else {\r\n    const ph = document.createElement(\"div\");\r\n    ph.className = \"lumir-audio-placeholder\";\r\n    ph.textContent = \"\uC624\uB514\uC624 URL \uC5C6\uC74C\";\r\n    wrap.appendChild(ph);\r\n  }\r\n  el.appendChild(wrap);\r\n  return el;\r\n}\r\n\r\nexport function audioElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"audio\";\r\n  block.props = el.__props || {};\r\n  // \uD30C\uC77C\uD615 \uBE14\uB85D: blocknote \uAD6C\uC870\uC0C1 content \uD0A4 \uC5C6\uC74C(no content)\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/** \uC624\uB514\uC624 \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654. (\uC0BD\uC785\uC740 \uC5C5\uB85C\uB4DC/\uD30C\uC77C\uD328\uB110/\uBD99\uC5EC\uB123\uAE30 \uACBD\uB85C, \uC790\uCCB4 \uC2AC\uB798\uC2DC \uC5C6\uC74C) */\r\nimport { audioBlockToElement, audioElementToBlock } from \"./audio.js\";\r\n\r\nexport default {\r\n  name: \"audio\",\r\n  blocks: { audio: { toElement: audioBlockToElement, fromElement: audioElementToBlock } },\r\n};\r\n", "/**\r\n * \uD30C\uC77C \uBE14\uB85D (FP-4) \u2014 BlockNote `file` \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654.\r\n * { type:\"file\", props:{ url, name? }, content:[], children:[] }\r\n * \uD30C\uC77C\uBA85 + \uB2E4\uC6B4\uB85C\uB4DC \uB9C1\uD06C \uCE74\uB4DC. (url \uC5C6\uC73C\uBA74 placeholder)\r\n */\r\n\r\nimport { neutralizeUrl } from \"../../utils/url.js\";\r\n\r\nfunction esc(s) {\r\n  return String(s == null ? \"\" : s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\r\n}\r\n\r\nexport function fileBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"fileBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"file\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block && block.props ? { ...block.props } : {};\r\n  el.__children = block && Array.isArray(block.children) ? block.children : [];\r\n\r\n  const props = el.__props;\r\n  const wrap = document.createElement(\"div\");\r\n  wrap.className = \"lumir-file\";\r\n  wrap.setAttribute(\"contenteditable\", \"false\");\r\n\r\n  if (props.url) {\r\n    const name = props.name || String(props.url).split(\"/\").pop() || \"\uD30C\uC77C\";\r\n    wrap.innerHTML =\r\n      '<span class=\"lf-icon\">\uD83D\uDCC4</span>' +\r\n      `<span class=\"lf-name\">${esc(name)}</span>` +\r\n      `<a class=\"lf-download\" href=\"${esc(neutralizeUrl(props.url))}\" download target=\"_blank\" rel=\"noopener noreferrer\">\uB2E4\uC6B4\uB85C\uB4DC</a>`;\r\n  } else {\r\n    wrap.innerHTML = '<div class=\"lumir-file-placeholder\">\uD30C\uC77C \uC5C6\uC74C</div>';\r\n  }\r\n  el.appendChild(wrap);\r\n  return el;\r\n}\r\n\r\nexport function fileElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"file\";\r\n  block.props = el.__props || {};\r\n  // \uD30C\uC77C\uD615 \uBE14\uB85D: blocknote \uAD6C\uC870\uC0C1 content \uD0A4 \uC5C6\uC74C(no content)\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/** \uD30C\uC77C \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654\uB9CC(\uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uC720\uC9C0). \uC2AC\uB798\uC2DC \uC81C\uC678(blocknote \uB3D9\uC791 \uC77C\uCE58). */\r\nimport { fileBlockToElement, fileElementToBlock } from \"./file.js\";\r\n\r\nexport default {\r\n  name: \"file\",\r\n  blocks: { file: { toElement: fileBlockToElement, fromElement: fileElementToBlock } },\r\n  // \uC2AC\uB798\uC2DC \uC5C6\uC74C \u2014 \uC77C\uBC18 \uD30C\uC77C\uC740 blocknote\uB3C4 \uC2AC\uB798\uC2DC \uBBF8\uB178\uCD9C(\uD30C\uC77C \uBE14\uB85D \uB80C\uB354/\uC9C1\uB82C\uD654\uB9CC \uC720\uC9C0)\r\n};\r\n", "/**\r\n * \uACBD\uB7C9 \uC790\uCCB4 \uAD6C\uBB38\uAC15\uC870 \uD1A0\uD06C\uB098\uC774\uC800 (A1, \uBB34\uC758\uC874).\r\n *\r\n * \uC678\uBD80 \uD558\uC774\uB77C\uC774\uD130(Shiki/highlight.js) \uC5C6\uC774 \uC815\uADDC\uC2DD 1\uD328\uC2A4\uB85C \uD1A0\uD070\uC744 \uBD84\uB958\uD574\r\n * <span class=\"tok-*\">\uB85C \uAC10\uC2FC HTML \uBB38\uC790\uC5F4\uC744 \uB9CC\uB4E0\uB2E4. \uC815\uD655\uB3C4\uB294 \uC81C\uD55C\uC801(\uD0A4\uC6CC\uB4DC \uC9D1\uD569 \uAE30\uBC18,\r\n * \uBB38\uB9E5 \uBB34\uC2DC)\uC774\uC9C0\uB9CC \uC758\uC874\uC131 0\uC744 \uC720\uC9C0\uD55C\uB2E4.\r\n *\r\n * \uBAA8\uB4DC: \"markup\"(html/xml/svg) \u00B7 \"code\"(\uADF8 \uC678, C\uD615 + hash \uC8FC\uC11D \uC635\uC158).\r\n * \uC5B8\uC5B4 \uBBF8\uC9C0\uC815(\"\" \uB610\uB294 \"text\")\uC740 \uAC15\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4(\uC784\uC758 \uD14D\uC2A4\uD2B8 \uC624\uC0C9 \uBC29\uC9C0).\r\n *\r\n * \uBCF4\uC548: \uD1A0\uD070 \uD14D\uC2A4\uD2B8\uB294 \uD56D\uC0C1 HTML \uC774\uC2A4\uCF00\uC774\uD504 \uD6C4 span\uC73C\uB85C \uAC10\uC2FC\uB2E4(\uCF54\uB4DC \uB0B4\uC6A9\uC5D0 \uC758\uD55C \uB9C8\uD06C\uC5C5 \uC8FC\uC785 \uBD88\uAC00).\r\n */\r\n\r\nfunction esc(s) {\r\n  return String(s == null ? \"\" : s)\r\n    .replace(/&/g, \"&amp;\")\r\n    .replace(/</g, \"&lt;\")\r\n    .replace(/>/g, \"&gt;\");\r\n}\r\n\r\n// \uACF5\uD1B5(C\uD615) \uD0A4\uC6CC\uB4DC \u2014 JS/TS/Java/C/C++/C#/Go/Rust \uB4F1 \uD569\uC9D1\uD569(\uBB38\uB9E5 \uBB34\uC2DC, lossy)\r\nconst KW_C = (\r\n  \"const let var function return if else for while do switch case break continue \" +\r\n  \"new class extends super this typeof instanceof in of try catch finally throw \" +\r\n  \"async await yield import export from default delete void static get set \" +\r\n  \"interface type enum implements public private protected readonly namespace declare as keyof infer \" +\r\n  \"int long short char float double bool boolean string void struct union template typename \" +\r\n  \"package func go defer chan map range select fn let mut impl trait pub use mod match where unsafe\"\r\n).split(/\\s+/);\r\n\r\nconst KW_PY = (\r\n  \"def class return if elif else for while import from as pass break continue lambda yield \" +\r\n  \"with try except finally raise global nonlocal assert del is not and or in async await\"\r\n).split(/\\s+/);\r\n\r\nconst KW_SQL = (\r\n  \"select from where insert into update delete create table drop alter add column join left right \" +\r\n  \"inner outer full on group by order having limit offset as and or not null values set distinct union all \" +\r\n  \"primary key foreign references default index view trigger procedure function begin end\"\r\n).split(/\\s+/);\r\n\r\nconst KW_SH = (\r\n  \"if then fi else elif for do done while until case esac function in select return local export readonly \" +\r\n  \"echo cd exit set unset source\"\r\n).split(/\\s+/);\r\n\r\nconst BOOLS = new Set([\"true\", \"false\", \"null\", \"undefined\", \"None\", \"True\", \"False\", \"nil\", \"NaN\", \"void\"]);\r\n\r\n// \uC5B8\uC5B4 \u2192 { kw, mode, hash, ci(\uB300\uC18C\uBB38\uC790\uBB34\uC2DC \uD0A4\uC6CC\uB4DC) }\r\nconst LANGS = {\r\n  javascript: { kw: KW_C, mode: \"code\" },\r\n  js: { kw: KW_C, mode: \"code\" },\r\n  typescript: { kw: KW_C, mode: \"code\" },\r\n  ts: { kw: KW_C, mode: \"code\" },\r\n  jsx: { kw: KW_C, mode: \"code\" },\r\n  tsx: { kw: KW_C, mode: \"code\" },\r\n  json: { kw: [], mode: \"code\" },\r\n  java: { kw: KW_C, mode: \"code\" },\r\n  c: { kw: KW_C, mode: \"code\" },\r\n  cpp: { kw: KW_C, mode: \"code\" },\r\n  csharp: { kw: KW_C, mode: \"code\" },\r\n  go: { kw: KW_C, mode: \"code\" },\r\n  rust: { kw: KW_C, mode: \"code\" },\r\n  php: { kw: KW_C, mode: \"code\", hash: true },\r\n  python: { kw: KW_PY, mode: \"code\", hash: true },\r\n  ruby: { kw: KW_PY, mode: \"code\", hash: true },\r\n  bash: { kw: KW_SH, mode: \"code\", hash: true },\r\n  shell: { kw: KW_SH, mode: \"code\", hash: true },\r\n  sh: { kw: KW_SH, mode: \"code\", hash: true },\r\n  yaml: { kw: [], mode: \"code\", hash: true },\r\n  toml: { kw: [], mode: \"code\", hash: true },\r\n  sql: { kw: KW_SQL, mode: \"code\", ci: true },\r\n  css: { kw: [], mode: \"code\" },\r\n  scss: { kw: [], mode: \"code\" },\r\n  html: { kw: [], mode: \"markup\" },\r\n  xml: { kw: [], mode: \"markup\" },\r\n  svg: { kw: [], mode: \"markup\" },\r\n  markdown: { kw: [], mode: \"code\" },\r\n  text: null,\r\n  \"\": null,\r\n};\r\n\r\n/** \uC9C0\uC6D0 \uC5B8\uC5B4(\uB4DC\uB86D\uB2E4\uC6B4 \uD45C\uC2DC\uC6A9) \u2014 value/label */\r\nexport const CODE_LANGUAGES = [\r\n  { value: \"\", label: \"\uD14D\uC2A4\uD2B8\" },\r\n  { value: \"javascript\", label: \"JavaScript\" },\r\n  { value: \"typescript\", label: \"TypeScript\" },\r\n  { value: \"jsx\", label: \"JSX\" },\r\n  { value: \"tsx\", label: \"TSX\" },\r\n  { value: \"json\", label: \"JSON\" },\r\n  { value: \"html\", label: \"HTML\" },\r\n  { value: \"xml\", label: \"XML\" },\r\n  { value: \"css\", label: \"CSS\" },\r\n  { value: \"python\", label: \"Python\" },\r\n  { value: \"java\", label: \"Java\" },\r\n  { value: \"c\", label: \"C\" },\r\n  { value: \"cpp\", label: \"C++\" },\r\n  { value: \"csharp\", label: \"C#\" },\r\n  { value: \"go\", label: \"Go\" },\r\n  { value: \"rust\", label: \"Rust\" },\r\n  { value: \"php\", label: \"PHP\" },\r\n  { value: \"ruby\", label: \"Ruby\" },\r\n  { value: \"sql\", label: \"SQL\" },\r\n  { value: \"bash\", label: \"Bash\" },\r\n  { value: \"yaml\", label: \"YAML\" },\r\n  { value: \"markdown\", label: \"Markdown\" },\r\n];\r\n\r\nfunction span(cls, text) {\r\n  return `<span class=\"tok-${cls}\">${esc(text)}</span>`;\r\n}\r\n\r\nfunction highlightCode(code, cfg) {\r\n  const kwSet = new Set(cfg.ci ? cfg.kw.map((k) => k.toLowerCase()) : cfg.kw);\r\n  const comment = cfg.hash ? \"(\\\\/\\\\/[^\\\\n]*|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/|#[^\\\\n]*)\" : \"(\\\\/\\\\/[^\\\\n]*|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)\";\r\n  const re = new RegExp(\r\n    comment + // 1 comment\r\n      \"|(\\\"(?:[^\\\"\\\\\\\\]|\\\\\\\\.)*\\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'|`(?:[^`\\\\\\\\]|\\\\\\\\.)*`)\" + // 2 string\r\n      \"|(\\\\b\\\\d[\\\\w.]*\\\\b)\" + // 3 number\r\n      \"|([A-Za-z_$][\\\\w$]*)\", // 4 word\r\n    \"g\"\r\n  );\r\n  let out = \"\";\r\n  let last = 0;\r\n  let m;\r\n  while ((m = re.exec(code))) {\r\n    if (m.index > last) out += esc(code.slice(last, m.index));\r\n    if (m[1] != null) out += span(\"com\", m[1]);\r\n    else if (m[2] != null) out += span(\"str\", m[2]);\r\n    else if (m[3] != null) out += span(\"num\", m[3]);\r\n    else if (m[4] != null) {\r\n      const w = m[4];\r\n      const key = cfg.ci ? w.toLowerCase() : w;\r\n      if (BOOLS.has(w)) out += span(\"bool\", w);\r\n      else if (kwSet.has(key)) out += span(\"kw\", w);\r\n      else out += esc(w);\r\n    }\r\n    last = re.lastIndex;\r\n  }\r\n  if (last < code.length) out += esc(code.slice(last));\r\n  return out;\r\n}\r\n\r\nfunction highlightMarkup(code) {\r\n  const re = /(<!--[\\s\\S]*?-->)|(<\\/?[A-Za-z][\\w:-]*)|(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')|([A-Za-z_:][\\w:-]*)(?=\\s*=)|(\\/?>)/g;\r\n  let out = \"\";\r\n  let last = 0;\r\n  let m;\r\n  while ((m = re.exec(code))) {\r\n    if (m.index > last) out += esc(code.slice(last, m.index));\r\n    if (m[1] != null) out += span(\"com\", m[1]);\r\n    else if (m[2] != null) out += span(\"kw\", m[2]);\r\n    else if (m[3] != null) out += span(\"str\", m[3]);\r\n    else if (m[4] != null) out += span(\"attr\", m[4]);\r\n    else if (m[5] != null) out += span(\"kw\", m[5]);\r\n    last = re.lastIndex;\r\n  }\r\n  if (last < code.length) out += esc(code.slice(last));\r\n  return out;\r\n}\r\n\r\n/**\r\n * \uCF54\uB4DC \uBB38\uC790\uC5F4 \u2192 \uAC15\uC870 HTML. lang \uBBF8\uC9C0\uC6D0/\uBBF8\uC9C0\uC815\uC774\uBA74 \uC774\uC2A4\uCF00\uC774\uD504\uB9CC(\uAC15\uC870 \uC5C6\uC74C).\r\n * \uC904\uBC14\uAFC8(\"\\n\")\uC740 \uBCF4\uC874(codeBlock .content\uB294 white-space:pre-wrap).\r\n */\r\nexport function highlightToHtml(code, lang) {\r\n  const cfg = LANGS[String(lang || \"\").toLowerCase()];\r\n  if (!cfg) return esc(code); // \uBBF8\uC9C0\uC815/\uBBF8\uC9C0\uC6D0 \u2192 \uAC15\uC870 \uC548 \uD568(\uC548\uC804)\r\n  return cfg.mode === \"markup\" ? highlightMarkup(code) : highlightCode(code, cfg);\r\n}\r\n", "/**\r\n * \uC778\uB77C\uC778 \uC11C\uC2DD \uC5D4\uC9C4 (P2-\u2460) \u2014 execCommand \uBBF8\uC0AC\uC6A9.\r\n * \uC120\uD0DD \uC601\uC5ED\uC744 **\uBB38\uC790 \uB2E8\uC704 \uBAA8\uB378**\uB85C \uBCC0\uD658\uD574 \uB9C8\uD06C\uB97C \uC801\uC6A9/\uD1A0\uAE00\uD55C \uB4A4 \uB2E4\uC2DC \uB80C\uB354\uD55C\uB2E4.\r\n * \uC9C1\uB82C\uD654(inline.js)\uC640 \uC644\uBCBD \uC815\uD569\uD558\uBA70 \uB9C1\uD06C/\uC911\uCCA9 \uB9C8\uD06C\uB97C \uBCF4\uC874\uD55C\uB2E4.\r\n *\r\n *  - applyInlineMark(content, type, value?): \uD604\uC7AC \uC120\uD0DD\uC5D0 \uB9C8\uD06C \uC801\uC6A9/\uD1A0\uAE00. \uBCC0\uACBD \uC2DC true.\r\n *      \u00B7 boolean \uB9C8\uD06C(bold/italic/underline/strike/code): value \uC0DD\uB7B5 \u2192 \uD1A0\uAE00.\r\n *      \u00B7 \uAC12 \uB9C8\uD06C(textColor/backgroundColor/fontSize): value \uC9C0\uC815 \u2192 \uC124\uC815, null/\"default\" \u2192 \uD574\uC81C.\r\n *  - readActiveMarks(content): \uD604\uC7AC \uC120\uD0DD\uC758 \uD65C\uC131 \uB9C8\uD06C(\uD234\uBC14 \uD45C\uC2DC\uC6A9).\r\n *  - setSelection(content, start, end): \uBB38\uC790 \uC624\uD504\uC14B\uC73C\uB85C \uC120\uD0DD \uBCF5\uC6D0(\uD14C\uC2A4\uD2B8/\uB0B4\uBD80\uC6A9).\r\n *\r\n * \uC624\uD504\uC14B\uC740 DOM Range \uAE30\uC900 UTF-16 \uB2E8\uC704(= range.toString().length).\r\n */\r\n\r\nimport { inlineContentToHtml, htmlToInlineContent } from \"./serialize/inline.js\";\r\n\r\nconst BOOLEAN_MARKS = [\"bold\", \"italic\", \"underline\", \"strike\", \"code\"];\r\nconst VALUE_MARKS = [\"textColor\", \"backgroundColor\", \"fontSize\"];\r\n\r\nfunction sameStyles(a, b) {\r\n  const ak = Object.keys(a);\r\n  const bk = Object.keys(b);\r\n  if (ak.length !== bk.length) return false;\r\n  return ak.every((k) => a[k] === b[k]);\r\n}\r\n\r\n/**\r\n * \uC778\uB77C\uC778 \uBC30\uC5F4 \u2192 \uBB38\uC790 \uBC30\uC5F4 [{ch, styles, href?}] (UTF-16 \uB2E8\uC704).\r\n * text/link\uAC00 \uC544\uB2CC \uC778\uB77C\uC778 \uC6D0\uC790(\uC608: checkbox)\uB294 1\uC720\uB2DB { atom } \uC73C\uB85C \uBCF4\uC874\uD55C\uB2E4 \u2014\r\n * \uC11C\uC2DD \uC801\uC6A9 \uC2DC char \uBC30\uC5F4\uC744 \uB2E4\uC2DC \uC778\uB77C\uC778\uC73C\uB85C \uB418\uB3CC\uB9B4 \uB54C \uC720\uC2E4\uB418\uC9C0 \uC54A\uB3C4\uB85D(\uD68C\uADC0 \uBC29\uC9C0).\r\n */\r\nfunction inlineToChars(arr) {\r\n  const out = [];\r\n  for (const node of arr || []) {\r\n    if (node && node.type === \"link\") {\r\n      const href = node.href || \"\";\r\n      for (const t of node.content || []) {\r\n        const text = t.text || \"\";\r\n        const st = t.styles || {};\r\n        for (let i = 0; i < text.length; i++) out.push({ ch: text[i], styles: { ...st }, href });\r\n      }\r\n    } else if (node && node.type === \"text\") {\r\n      const text = node.text || \"\";\r\n      const st = node.styles || {};\r\n      for (let i = 0; i < text.length; i++) out.push({ ch: text[i], styles: { ...st } });\r\n    } else if (node && node.type) {\r\n      out.push({ atom: { ...node } }); // \uC778\uB77C\uC778 \uC6D0\uC790(checkbox \uB4F1) \u2014 1\uC720\uB2DB \uBCF4\uC874, \uC11C\uC2DD \uBBF8\uC801\uC6A9\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction groupTextRuns(chars) {\r\n  const runs = [];\r\n  for (const c of chars) {\r\n    const prev = runs[runs.length - 1];\r\n    if (prev && sameStyles(prev.styles, c.styles)) prev.text += c.ch;\r\n    else runs.push({ type: \"text\", text: c.ch, styles: { ...c.styles } });\r\n  }\r\n  return runs;\r\n}\r\n\r\n/** \uBB38\uC790 \uBC30\uC5F4 \u2192 \uC778\uB77C\uC778 \uBC30\uC5F4 (\uB3D9\uC77C href\uB294 link\uB85C \uBB36\uACE0, \uADF8 \uC548/\uBC16\uC744 \uC2A4\uD0C0\uC77C run\uC73C\uB85C \uADF8\uB8F9, \uC6D0\uC790\uB294 \uADF8\uB300\uB85C \uBC29\uCD9C) */\r\nfunction charsToInline(chars) {\r\n  const out = [];\r\n  let i = 0;\r\n  while (i < chars.length) {\r\n    const c = chars[i];\r\n    if (c.atom) { out.push(c.atom); i++; continue; } // \uC778\uB77C\uC778 \uC6D0\uC790(checkbox \uB4F1) \uBCF4\uC874\r\n    const href = c.href;\r\n    if (href !== undefined) {\r\n      const lc = [];\r\n      while (i < chars.length && !chars[i].atom && chars[i].href === href) {\r\n        lc.push(chars[i]);\r\n        i++;\r\n      }\r\n      out.push({ type: \"link\", href, content: groupTextRuns(lc) });\r\n    } else {\r\n      const tc = [];\r\n      while (i < chars.length && !chars[i].atom && chars[i].href === undefined) {\r\n        tc.push(chars[i]);\r\n        i++;\r\n      }\r\n      for (const r of groupTextRuns(tc)) out.push(r);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction applyToChars(chars, start, end, type, value, forceBool) {\r\n  if (start > end) {\r\n    const t = start;\r\n    start = end;\r\n    end = t;\r\n  }\r\n  const slice = chars.slice(start, end).filter((c) => !c.atom); // \uC6D0\uC790(checkbox)\uB294 \uC11C\uC2DD \uB300\uC0C1 \uC544\uB2D8\r\n  if (!slice.length) return false;\r\n  if (BOOLEAN_MARKS.includes(type) && value === undefined) {\r\n    // forceBool \uC9C0\uC815 \uC2DC(\uD06C\uB85C\uC2A4\uBE14\uB85D \uC77C\uAD04 \uD1A0\uAE00) \uC9C0\uC5ED \uACC4\uC0B0 \uB300\uC2E0 \uAC15\uC81C: true=\uC801\uC6A9, false=\uD574\uC81C.\r\n    const allHave = forceBool === undefined ? slice.every((c) => c.styles[type]) : !forceBool;\r\n    for (const c of slice) {\r\n      if (allHave) delete c.styles[type];\r\n      else c.styles[type] = true;\r\n    }\r\n  } else {\r\n    for (const c of slice) {\r\n      if (value == null || value === \"default\") delete c.styles[type];\r\n      else c.styles[type] = value;\r\n    }\r\n  }\r\n  return true;\r\n}\r\n\r\n// --- DOM \uC624\uD504\uC14B ---\r\n// \uC720\uB2DB = (ZWSP \uC81C\uC678 \uD14D\uC2A4\uD2B8 \uBB38\uC790) + (\uC778\uB77C\uC778 \uC6D0\uC790 1) + (\uD558\uB4DC\uBE0C\uB808\uC774\uD06C <br> 1, filler \uC81C\uC678).\r\n// inlineToChars/htmlToInlineContent \uC5F4\uAC70 \uADDC\uCE59\uACFC \uC815\uD569(\uCCB4\uD06C\uBC15\uC2A4=1\uB178\uB4DC, <br>\u2192\"\\n\"=1\uBB38\uC790, ZWSP \uC81C\uAC70, filler <br> \uBB34\uC2DC).\r\nconst ZWSP = \"\u200B\";\r\n// \uC778\uB77C\uC778 \uC6D0\uC790(\uD45C \uC140 \uCCB4\uD06C\uBC15\uC2A4/\uC21C\uC11C\u00B7\uBD88\uB81B \uB9C8\uCEE4) \u2014 inlineToChars\uAC00 1\uC720\uB2DB\uC73C\uB85C \uBCF4\uC874\uD558\uBBC0\uB85C \uC624\uD504\uC14B\uB3C4 1\uC720\uB2DB\uC73C\uB85C \uC138\uC57C \uC815\uD569.\r\nfunction isAtomEl(n) {\r\n  return (\r\n    n && n.nodeType === 1 && n.hasAttribute &&\r\n    (n.hasAttribute(\"data-lumir-checkbox\") || n.hasAttribute(\"data-lumir-ol\") || n.hasAttribute(\"data-lumir-ul\"))\r\n  );\r\n}\r\nfunction isHardBr(n) {\r\n  return n && n.nodeType === 1 && n.tagName === \"BR\" && !(n.hasAttribute && n.hasAttribute(\"data-lumir-br-filler\"));\r\n}\r\nfunction isUnitEl(n) {\r\n  return isAtomEl(n) || isHardBr(n); // 1\uC720\uB2DB\uC73C\uB85C \uC138\uB294 \uC694\uC18C(\uC6D0\uC790 + \uD558\uB4DC\uBE0C\uB808\uC774\uD06C)\r\n}\r\nfunction indexInParent(n) {\r\n  return Array.prototype.indexOf.call(n.parentNode.childNodes, n);\r\n}\r\n\r\n/** DOM \uCE90\uB7FF(container, offset) \u2192 \uC720\uB2DB \uC624\uD504\uC14B. */\r\nexport function caretToOffset(content, container, offset) {\r\n  let count = 0;\r\n  let done = false;\r\n  function walk(node) {\r\n    if (done) return;\r\n    if (node === container && node.nodeType !== 3) {\r\n      const lim = Math.min(offset, node.childNodes.length); // \uC694\uC18C \uCEE8\uD14C\uC774\uB108: \uC55E offset\uAC1C \uC790\uC2DD\uB9CC \uC18C\uBE44\r\n      for (let i = 0; i < lim; i++) { walk(node.childNodes[i]); if (done) return; }\r\n      done = true;\r\n      return;\r\n    }\r\n    if (node.nodeType === 3) {\r\n      const s = node.nodeValue;\r\n      const lim = node === container ? offset : s.length;\r\n      for (let i = 0; i < lim; i++) if (s[i] !== ZWSP) count++;\r\n      if (node === container) done = true;\r\n      return;\r\n    }\r\n    if (isUnitEl(node)) { count += 1; return; }\r\n    for (const kid of node.childNodes) { walk(kid); if (done) return; }\r\n  }\r\n  walk(content);\r\n  return count;\r\n}\r\n\r\n/** \uC720\uB2DB \uC624\uD504\uC14B \u2192 DOM \uCE90\uB7FF(node, offset). */\r\nexport function offsetToCaret(content, target) {\r\n  let total = 0;\r\n  let result = null;\r\n  function walk(node) {\r\n    if (result) return;\r\n    if (node.nodeType === 3) {\r\n      const s = node.nodeValue;\r\n      for (let i = 0; i < s.length; i++) {\r\n        if (s[i] === ZWSP) continue;\r\n        if (total === target) { result = { node, offset: i }; return; }\r\n        total++;\r\n      }\r\n      return;\r\n    }\r\n    if (isUnitEl(node)) {\r\n      if (total === target) { result = { node: node.parentNode, offset: indexInParent(node) }; return; } // \uC720\uB2DB \uC55E\r\n      total++;\r\n      if (total === target) { result = { node: node.parentNode, offset: indexInParent(node) + 1 }; return; } // \uC720\uB2DB \uB4A4\r\n      return;\r\n    }\r\n    for (const kid of node.childNodes) { walk(kid); if (result) return; }\r\n  }\r\n  walk(content);\r\n  if (result) return result;\r\n  return { node: content, offset: content.childNodes.length };\r\n}\r\n\r\nexport function setSelection(content, start, end) {\r\n  const a = offsetToCaret(content, start);\r\n  const b = offsetToCaret(content, end);\r\n  const r = document.createRange();\r\n  try {\r\n    r.setStart(a.node, a.offset);\r\n    r.setEnd(b.node, b.offset);\r\n  } catch (_) {\r\n    r.selectNodeContents(content);\r\n  }\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\n\r\nfunction currentRangeIn(content) {\r\n  const s = window.getSelection();\r\n  if (!s || !s.rangeCount) return null;\r\n  const r = s.getRangeAt(0);\r\n  if (!content.contains(r.startContainer) || !content.contains(r.endContainer)) return null;\r\n  return r;\r\n}\r\n\r\n/** \uD604\uC7AC \uC120\uD0DD \uC601\uC5ED\uC5D0 \uC778\uB77C\uC778 \uB9C8\uD06C \uC801\uC6A9/\uD1A0\uAE00. \uBCC0\uACBD\uB418\uBA74 true. */\r\nexport function applyInlineMark(content, type, value) {\r\n  if (!content) return false;\r\n  const r = currentRangeIn(content);\r\n  if (!r || r.collapsed) return false; // collapsed=\uBCF4\uB958(\uCD94\uD6C4 pending marks)\r\n  const start = caretToOffset(content, r.startContainer, r.startOffset);\r\n  const end = caretToOffset(content, r.endContainer, r.endOffset);\r\n  const chars = inlineToChars(htmlToInlineContent(content));\r\n  if (!applyToChars(chars, start, end, type, value)) return false;\r\n  content.innerHTML = inlineContentToHtml(charsToInline(chars));\r\n  setSelection(content, start, end);\r\n  return true;\r\n}\r\n\r\n/** \uD604\uC7AC \uC120\uD0DD \uC601\uC5ED\uC744 \uB9C1\uD06C\uB85C \uAC10\uC2F8\uAE30/\uD574\uC81C. href \uBE44\uBA74 \uD574\uC81C. \uBCC0\uACBD\uB418\uBA74 true. */\r\nexport function applyLink(content, href) {\r\n  if (!content) return false;\r\n  const r = currentRangeIn(content);\r\n  if (!r || r.collapsed) return false;\r\n  const start = caretToOffset(content, r.startContainer, r.startOffset);\r\n  const end = caretToOffset(content, r.endContainer, r.endOffset);\r\n  const a = Math.min(start, end), b = Math.max(start, end);\r\n  const chars = inlineToChars(htmlToInlineContent(content));\r\n  const slice = chars.slice(a, b);\r\n  if (!slice.some((c) => !c.atom)) return false; // \uD14D\uC2A4\uD2B8\uAC00 \uC5C6\uC73C\uBA74(\uC6D0\uC790\uB9CC) \uBCC0\uACBD \uC5C6\uC74C\r\n  for (const c of slice) {\r\n    if (c.atom) continue; // \uC6D0\uC790(checkbox)\uB294 \uB9C1\uD06C \uB300\uC0C1 \uC544\uB2D8\r\n    if (!href) delete c.href; // \uD574\uC81C \u2192 \uC77C\uBC18 \uD14D\uC2A4\uD2B8\r\n    else c.href = href;\r\n  }\r\n  content.innerHTML = inlineContentToHtml(charsToInline(chars));\r\n  setSelection(content, a, b);\r\n  return true;\r\n}\r\n\r\n/**\r\n * \uD604\uC7AC \uCEE4\uC11C(\uB610\uB294 \uC120\uD0DD)\uC5D0 \uC778\uB77C\uC778 \uCF58\uD150\uCE20(text/link \uB178\uB4DC \uBC30\uC5F4)\uB97C \uC0BD\uC785.\r\n * \uC120\uD0DD\uC774 \uC788\uC73C\uBA74 \uB300\uCCB4, collapsed\uBA74 \uC0BD\uC785. \uC0BD\uC785 \uD6C4 \uCE90\uB7FF\uC740 \uC0BD\uC785\uBD84 \uB05D. \uBCC0\uACBD\uB418\uBA74 true.\r\n * (URL \uBD99\uC5EC\uB123\uAE30 \uC2DC \uCEE4\uC11C \uC778\uB77C\uC778 \uB9C1\uD06C\u00B7\uB2E4\uB2E8\uC5B4 \uD14D\uC2A4\uD2B8 \uC790\uB3D9 \uB9C1\uD06C\uD654\uC5D0 \uC0AC\uC6A9 \u2014 inline.js \uC9C1\uB82C\uD654\uC640 \uC815\uD569)\r\n */\r\nexport function insertInlineAtCursor(content, nodes) {\r\n  if (!content || !nodes || !nodes.length) return false;\r\n  const r = currentRangeIn(content);\r\n  if (!r) return false;\r\n  const start = caretToOffset(content, r.startContainer, r.startOffset);\r\n  const end = caretToOffset(content, r.endContainer, r.endOffset);\r\n  const a = Math.min(start, end), b = Math.max(start, end);\r\n  const chars = inlineToChars(htmlToInlineContent(content));\r\n  const ins = inlineToChars(nodes);\r\n  if (!ins.length) return false;\r\n  const next = chars.slice(0, a).concat(ins, chars.slice(b));\r\n  content.innerHTML = inlineContentToHtml(charsToInline(next));\r\n  setSelection(content, a + ins.length, a + ins.length);\r\n  return true;\r\n}\r\n\r\n/** \uD604\uC7AC \uC120\uD0DD\uC758 \uD65C\uC131 \uB9C8\uD06C \uC0C1\uD0DC(\uD234\uBC14 \uD45C\uC2DC\uC6A9). */\r\nexport function readActiveMarks(content) {\r\n  const empty = { bold: false, italic: false, underline: false, strike: false, code: false, textColor: null, backgroundColor: null, fontSize: null };\r\n  if (!content) return empty;\r\n  const r = currentRangeIn(content);\r\n  if (!r) return empty;\r\n  const start = caretToOffset(content, r.startContainer, r.startOffset);\r\n  const end = caretToOffset(content, r.endContainer, r.endOffset);\r\n  const chars = inlineToChars(htmlToInlineContent(content));\r\n  const slice = chars.slice(Math.min(start, end), Math.max(start, end)).filter((c) => !c.atom); // \uC6D0\uC790 \uC81C\uC678\r\n  if (!slice.length) return empty;\r\n  const out = { ...empty };\r\n  for (const m of BOOLEAN_MARKS) out[m] = slice.every((c) => !!c.styles[m]);\r\n  for (const m of VALUE_MARKS) {\r\n    const first = slice[0].styles[m] != null ? slice[0].styles[m] : null;\r\n    out[m] = slice.every((c) => (c.styles[m] != null ? c.styles[m] : null) === first) ? first : null;\r\n  }\r\n  return out;\r\n}\r\n\r\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// \uD06C\uB85C\uC2A4\uBE14\uB85D(\uC5EC\uB7EC .content \uC12C\uC5D0 \uAC78\uCE5C) \uC77C\uAD04 \uC11C\uC2DD \u2014 cross-block-selection\uC774 \uC0B0\uCD9C\uD55C\r\n// covered = [{island, start, end, full}] \uB97C \uBC1B\uC544 \uAC01 \uC12C\uC744 \uB3C5\uB9BD\uC801\uC73C\uB85C \uC7AC\uC791\uC131\uD55C\uB2E4.\r\n// window.getSelection()\uC744 \uC77D\uC9C0 \uC54A\uC73C\uBBC0\uB85C(\uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uB3D9\uC791) \uD06C\uB85C\uC2A4 \uC120\uD0DD\uC5D0 \uC0AC\uC6A9.\r\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * \uD06C\uB85C\uC2A4\uBE14\uB85D \uC77C\uAD04 \uC778\uB77C\uC778 \uB9C8\uD06C \uC801\uC6A9/\uD1A0\uAE00. \uBCC0\uACBD\uB418\uBA74 true.\r\n *  - boolean \uB9C8\uD06C(value \uBBF8\uC9C0\uC815): \uC804 \uBC94\uC704 \uADE0\uC77C \uADDC\uCE59 \u2014 \uCEE4\uBC84\uB41C \uBAA8\uB4E0 \uC12C\uC758 \uBAA8\uB4E0 \uBE44-atom \uBB38\uC790\uAC00\r\n *    \uC774\uBBF8 \uB9C8\uD06C\uB97C \uAC00\uC9C0\uBA74 \uD574\uC81C, \uC544\uB2C8\uBA74 \uC801\uC6A9(BlockNote/Word \uC815\uD569).\r\n *  - \uAC12 \uB9C8\uD06C(textColor/backgroundColor/fontSize): value \uC124\uC815, null/\"default\"\uBA74 \uD574\uC81C.\r\n * \uC120\uD0DD\uC740 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uB294\uB2E4(\uD638\uCD9C\uC790\uAC00 \uD558\uC774\uB77C\uC774\uD2B8\uB97C \uC7AC\uD398\uC778\uD305). \uC624\uD504\uC14B(\uC720\uB2DB \uC218)\uC740 \uC11C\uC2DD \uD6C4\uC5D0\uB3C4 \uBD88\uBCC0.\r\n */\r\nexport function applyInlineMarkAcross(covered, type, value) {\r\n  if (!covered || !covered.length) return false;\r\n  const isBoolToggle = BOOLEAN_MARKS.includes(type) && value === undefined;\r\n  let forceBool;\r\n  if (isBoolToggle) {\r\n    let any = false, allHave = true;\r\n    for (const c of covered) {\r\n      const chars = inlineToChars(htmlToInlineContent(c.island));\r\n      for (const ch of chars.slice(c.start, c.end)) {\r\n        if (ch.atom) continue;\r\n        any = true;\r\n        if (!ch.styles[type]) allHave = false;\r\n      }\r\n    }\r\n    if (!any) return false;\r\n    forceBool = !allHave; // \uC804\uBD80 \uBCF4\uC720 \u2192 \uD574\uC81C(false), \uC544\uB2C8\uBA74 \u2192 \uC801\uC6A9(true)\r\n  }\r\n  let changed = false;\r\n  for (const c of covered) {\r\n    const chars = inlineToChars(htmlToInlineContent(c.island));\r\n    const did = isBoolToggle\r\n      ? applyToChars(chars, c.start, c.end, type, undefined, forceBool)\r\n      : applyToChars(chars, c.start, c.end, type, value);\r\n    if (did) {\r\n      c.island.innerHTML = inlineContentToHtml(charsToInline(chars));\r\n      changed = true;\r\n    }\r\n  }\r\n  return changed;\r\n}\r\n\r\n// \u2500\u2500 Phase 2(\uD06C\uB85C\uC2A4\uBE14\uB85D \uD3B8\uC9D1)\uC6A9 char \uBAA8\uB378 \uD5EC\uD37C \u2014 cross-block-range\uAC00 \uC7AC\uC0AC\uC6A9 \u2500\u2500\r\n/** content(.content \uC12C)\uC758 \uC778\uB77C\uC778\uC744 char \uBC30\uC5F4([{ch,styles,href?}|{atom}])\uB85C. */\r\nexport function contentToChars(content) {\r\n  return inlineToChars(htmlToInlineContent(content));\r\n}\r\n/** char \uBC30\uC5F4\uC744 \uB2E4\uC2DC HTML \uBB38\uC790\uC5F4\uB85C(\uC9C1\uB82C\uD654 \uC815\uD569). */\r\nexport function charsToHtml(chars) {\r\n  return inlineContentToHtml(charsToInline(chars));\r\n}\r\n/** content\uC758 [start,end) \uAD6C\uAC04\uC744 \uC778\uB77C\uC778 \uB178\uB4DC \uBC30\uC5F4(\uC800\uC7A5 \uD3FC)\uB85C \uC798\uB77C \uBC18\uD658(\uBD80\uBD84 \uBCF5\uC0AC\uC6A9). */\r\nexport function sliceContentInline(content, start, end) {\r\n  return charsToInline(inlineToChars(htmlToInlineContent(content)).slice(start, end));\r\n}\r\n\r\n/** \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD\uC758 \uD65C\uC131 \uB9C8\uD06C \uC0C1\uD0DC(\uD234\uBC14 \uD45C\uC2DC\uC6A9) \u2014 covered\uC758 \uBAA8\uB4E0 \uBE44-atom \uBB38\uC790\uB97C \uC885\uD569. */\r\nexport function readActiveMarksAcross(covered) {\r\n  const empty = { bold: false, italic: false, underline: false, strike: false, code: false, textColor: null, backgroundColor: null, fontSize: null };\r\n  if (!covered || !covered.length) return empty;\r\n  const all = [];\r\n  for (const c of covered) {\r\n    const chars = inlineToChars(htmlToInlineContent(c.island));\r\n    for (const ch of chars.slice(c.start, c.end)) if (!ch.atom) all.push(ch);\r\n  }\r\n  if (!all.length) return empty;\r\n  const out = { ...empty };\r\n  for (const m of BOOLEAN_MARKS) out[m] = all.every((c) => !!c.styles[m]);\r\n  for (const m of VALUE_MARKS) {\r\n    const first = all[0].styles[m] != null ? all[0].styles[m] : null;\r\n    out[m] = all.every((c) => (c.styles[m] != null ? c.styles[m] : null) === first) ? first : null;\r\n  }\r\n  return out;\r\n}\r\n", "/**\r\n * \uD3B8\uC9D1 \uB3D9\uC791 (P1-\u2461) \u2014 Enter(\uBE14\uB85D \uBD84\uD560/\uB9AC\uC2A4\uD2B8) \u00B7 Backspace(\uBCD1\uD569/\uD0C0\uC785 \uD574\uC81C), IME \uAC00\uB4DC.\r\n * \uC0D8\uD50C block-editor.html\uC758 handleEnter/handleBackspace \uD328\uD134 \uC774\uC2DD.\r\n *\r\n *  - Enter: codeBlock=\uC904\uBC14\uAFC8, \uBE48 \uB9AC\uC2A4\uD2B8\uD56D\uBAA9=\uBB38\uB2E8\uC73C\uB85C, \uADF8 \uC678=caret\uC5D0\uC11C \uBD84\uD560(\uB9AC\uC2A4\uD2B8\uB294 \uD0C0\uC785 \uC720\uC9C0).\r\n *  - Backspace(\uBE14\uB85D \uC2DC\uC791\u00B7collapsed): \uBE44\uBB38\uB2E8=\uBB38\uB2E8\uC73C\uB85C, \uBB38\uB2E8=\uC774\uC804 \uBE14\uB85D\uC5D0 \uBCD1\uD569(\uC55E\uC774 \uD45C\uBA74 \uB9C8\uC9C0\uB9C9 \uC140\uB85C).\r\n *  - IME \uAC00\uB4DC: e.isComposing \uB610\uB294 \uC5D0\uB514\uD130 \uC870\uD569\uC0C1\uD0DC\uBA74 \uBB34\uC2DC(\uD55C\uAE00 \uC870\uD569 \uBB34\uC190\uC0C1).\r\n *  - \uD45C \uC140(.lumir-tbl \uB0B4\uBD80) keydown\uC740 \uCC98\uB9AC\uD558\uC9C0 \uC54A\uC74C(P3).\r\n *\r\n * \uAD6C\uC870 \uBCC0\uACBD \uD6C4 opts.onChange()\uB85C \uD788\uC2A4\uD1A0\uB9AC \uCEE4\uBC0B/\uC54C\uB9BC\uC744 \uC54C\uB9B0\uB2E4(\uD504\uB85C\uADF8\uB7A8\uC801 DOM \uBCC0\uACBD\uC740 input \uBBF8\uBC1C\uC0DD).\r\n */\r\n\r\nimport { makeBlockElement, directContent, LIST_TYPES } from \"./serialize/block.js\";\r\nimport { applyInlineMark } from \"./inline-format.js\";\r\n\r\nconst BASE_PROPS = () => ({ textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" });\r\nfunction defaultProps(type) {\r\n  if (type === \"checkListItem\") return { ...BASE_PROPS(), checked: false };\r\n  if (type === \"codeBlock\") return { language: \"\" };\r\n  return BASE_PROPS();\r\n}\r\n\r\nfunction focusStart(el) {\r\n  if (!el) return;\r\n  el.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(el);\r\n  r.collapse(true);\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\nfunction focusEnd(el) {\r\n  if (!el) return;\r\n  el.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(el);\r\n  r.collapse(false);\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\nfunction caretAtStart(content) {\r\n  const s = window.getSelection();\r\n  if (!s.rangeCount) return false;\r\n  const a = s.getRangeAt(0);\r\n  const r = a.cloneRange();\r\n  r.selectNodeContents(content);\r\n  r.setEnd(a.startContainer, a.startOffset);\r\n  return r.toString().length === 0;\r\n}\r\n\r\n/**\r\n * content \uD6C4\uD589 \"\\n\" \uD55C \uAC1C \uC81C\uAC70(\uCF54\uB4DC\uBE14\uB85D \uD0C8\uCD9C \uC2DC \uD2B8\uB9AC\uAC70 \uAC1C\uD589 \uC815\uB9AC).\r\n * \uBE0C\uB77C\uC6B0\uC800 Range.insertNode\uB294 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uB97C \uBD84\uD560\uD558\uBA70 \"\\n\" \uB4A4\uC5D0 **\uBE48 \uD14D\uC2A4\uD2B8 \uB178\uB4DC**\uB97C \uB0A8\uAE38 \uC218 \uC788\uB2E4\r\n * \u2192 \uADF8\uB300\uB85C \uB9C8\uC9C0\uB9C9 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uB97C \uBCF4\uBA74 \"\"\uB77C \"\\n\"\uC744 \uBABB \uCC3E\uB294\uB2E4. filler <br>\u00B7\uBE48 \uB178\uB4DC\uB97C \uAC77\uC5B4\uB0B4\uACE0\r\n * normalize()\uB85C \uC778\uC811 \uD14D\uC2A4\uD2B8\uB97C \uBCD1\uD569\uD55C \uB4A4 \uB9C8\uC9C0\uB9C9 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uC758 \uD6C4\uD589 \"\\n\"\uC744 \uD655\uC2E4\uD788 \uC81C\uAC70\uD55C\uB2E4.\r\n */\r\nfunction deleteTrailingNewline(content) {\r\n  content.querySelectorAll(\"br[data-lumir-br-filler]\").forEach((b) => b.remove());\r\n  content.normalize(); // \uC778\uC811/\uBE48 \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uBCD1\uD569 \u2192 \uD6C4\uD589 \"\\n\"\uC774 \uB9C8\uC9C0\uB9C9 \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uB05D\uC5D0 \uC624\uAC8C\r\n  const walker = document.createTreeWalker(content, NodeFilter.SHOW_TEXT, null);\r\n  let last = null, n;\r\n  while ((n = walker.nextNode())) last = n;\r\n  if (last && last.nodeValue.endsWith(\"\\n\")) {\r\n    last.nodeValue = last.nodeValue.slice(0, -1);\r\n    if (last.nodeValue === \"\") last.remove();\r\n  }\r\n}\r\n\r\n/**\r\n * \uCF54\uB4DC\uBE14\uB85D \uD6C4\uD589 \uAC1C\uD589 \uB80C\uB354 \uBCF4\uC815 \u2014 `white-space:pre-wrap`\uC5D0\uC11C \uBB38\uC790\uC5F4 \uB05D\uC758 \uB2E8\uC77C \"\\n\"\uC740\r\n * \uBE48 \uB9C8\uC9C0\uB9C9 \uC904\uC744 \uADF8\uB9AC\uC9C0 \uC54A\uB294 \uBE0C\uB77C\uC6B0\uC800 \uD2B9\uC131\uC774 \uC788\uB2E4(<textarea>\u00B7<pre>\uC640 \uB3D9\uC77C). \uADF8\uB798\uC11C\r\n * \uD14D\uC2A4\uD2B8\uAC00 \"\\n\"\uC73C\uB85C \uB05D\uB098\uBA74 \uC9C1\uB82C\uD654\uC5D0\uC11C \uBB34\uC2DC\uB418\uB294 filler <br>\uB97C \uB05D\uC5D0 \uB367\uB300 \uBE48 \uC904\uC744 \uBCF4\uC774\uAC8C \uD55C\uB2E4.\r\n * (filler <br>\uB294 walkInline\uC5D0\uC11C data-lumir-br-filler\uB85C \uAC78\uB7EC\uC838 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uBB34\uC624\uC5FC)\r\n * \uB0B4\uC6A9\uC5D0 \uD6C4\uD589 \uAC1C\uD589\uC774 \uC5C6\uC73C\uBA74 \uC624\uB798\uB41C filler\uB97C \uC81C\uAC70\uD55C\uB2E4.\r\n */\r\nexport function normalizeCodeTrailingNewline(content) {\r\n  if (!content) return;\r\n  content.querySelectorAll('br[data-lumir-br-filler]').forEach((b) => b.remove());\r\n  if ((content.textContent || \"\").endsWith(\"\\n\")) {\r\n    const filler = document.createElement(\"br\");\r\n    filler.setAttribute(\"data-lumir-br-filler\", \"\");\r\n    content.appendChild(filler);\r\n  }\r\n}\r\n\r\n/**\r\n * \uBD84\uD560 \uD6C4 \uB0A8\uB294 **\uBE48 \uC778\uB77C\uC778 \uC11C\uC2DD \uB798\uD37C**(<code></code>, <strong></strong> \uB4F1) \uC81C\uAC70.\r\n * \uC778\uB77C\uC778 \uCF54\uB4DC/\uBCFC\uB4DC \uB05D\uC5D0\uC11C Enter \uC2DC \uC0C8 \uBE14\uB85D\uC5D0 \uBE48 <code>\uAC00 \uB0A8\uC544 \uB2E4\uC74C \uC785\uB825\uC774 \uCF54\uB4DC\uB85C \uC774\uC5B4\uC9C0\uB294\r\n * \uBB38\uC81C(\uC0AC\uC6A9\uC790 \uCCB4\uAC10: \"\uD558\uB2E8\uC5D0 \uCF54\uB4DC\uBE14\uB7ED \uC790\uB3D9 \uC0DD\uC131\")\uB97C \uB9C9\uB294\uB2E4.\r\n */\r\nfunction removeEmptyInlineWrappers(el) {\r\n  if (!el) return;\r\n  el.querySelectorAll(\"code, strong, b, em, i, u, s, del, span, a\").forEach((n) => {\r\n    if ((n.textContent || \"\") === \"\" && !n.querySelector(\"img, br\")) n.remove();\r\n  });\r\n}\r\n\r\nfunction convertToParagraph(block) {\r\n  const c = directContent(block);\r\n  const html = c ? c.innerHTML : \"\";\r\n  const para = makeBlockElement(\"paragraph\", { innerHTML: html, props: defaultProps(\"paragraph\") });\r\n  block.replaceWith(para);\r\n  focusStart(directContent(para));\r\n  return para;\r\n}\r\n\r\nexport function handleEnter(e, onChange) {\r\n  const sel = window.getSelection();\r\n  if (!sel || !sel.rangeCount) return;\r\n  const content = e.target.closest(\".content\");\r\n  if (!content) return;\r\n  const block = content.closest(\".block\");\r\n  if (!block) return;\r\n  const type = block.dataset.type;\r\n  e.preventDefault();\r\n\r\n  if (type === \"codeBlock\") {\r\n    const r = sel.getRangeAt(0);\r\n    // \uCF54\uB4DC\uBE14\uB85D \uD0C8\uCD9C: \uB9C8\uC9C0\uB9C9 \uBE48 \uC904\uC5D0\uC11C Enter(\uCE90\uB7FF\uC774 \uB0B4\uC6A9 \uB05D + \uC9C1\uC804 \uBB38\uC790 \"\\n\") \u2192 \uCF54\uB4DC\uBE14\uB85D \uBC16 \uD558\uB2E8\uC5D0 \uC0C8 \uBB38\uB2E8.\r\n    // (Enter \uB450 \uBC88: 1\uD68C\uCC28 \"\\n\" \uC0BD\uC785 \u2192 \uBE48 \uB9C8\uC9C0\uB9C9 \uC904, 2\uD68C\uCC28 \uC774 \uC870\uAC74 \uC131\uB9BD \u2192 \uD0C8\uCD9C)\r\n    if (r.collapsed) {\r\n      const beforeR = r.cloneRange();\r\n      beforeR.selectNodeContents(content);\r\n      beforeR.setEnd(r.endContainer, r.endOffset);\r\n      const before = beforeR.toString();\r\n      const afterR = r.cloneRange();\r\n      afterR.selectNodeContents(content);\r\n      afterR.setStart(r.endContainer, r.endOffset);\r\n      const after = afterR.toString();\r\n      if (after === \"\" && before.endsWith(\"\\n\")) {\r\n        deleteTrailingNewline(content); // \uD0C8\uCD9C \uD2B8\uB9AC\uAC70\uC600\uB358 \uB9C8\uC9C0\uB9C9 \"\\n\" \uC81C\uAC70(\uCF54\uB4DC \uBCF8\uBB38 \uBCF4\uC874)\r\n        normalizeCodeTrailingNewline(content); // \uB0A8\uC740 filler <br> \uC815\uB9AC\r\n        const next = makeBlockElement(\"paragraph\", { innerHTML: \"\", props: defaultProps(\"paragraph\") });\r\n        block.after(next);\r\n        focusStart(directContent(next));\r\n        if (onChange) onChange();\r\n        return;\r\n      }\r\n    }\r\n    r.deleteContents();\r\n    const t = document.createTextNode(\"\\n\");\r\n    r.insertNode(t);\r\n    r.setStartAfter(t);\r\n    r.collapse(true);\r\n    sel.removeAllRanges();\r\n    sel.addRange(r);\r\n    normalizeCodeTrailingNewline(content); // \uD6C4\uD589 \uAC1C\uD589\uC774\uBA74 filler <br>\uB85C \uBE48 \uC904 \uB80C\uB354 \uBCF4\uC815\r\n    if (onChange) onChange();\r\n    return;\r\n  }\r\n\r\n  // \uD1A0\uAE00(\uC811\uC744 \uC218 \uC788\uB294) \uD5E4\uB529/\uBAA9\uB85D: Enter \u2192 \uB0B4\uC6A9(children) \uCCAB \uBE14\uB85D\uC73C\uB85C \uC774\uB3D9(\uC81C\uBAA9 \uC785\uB825 \uD6C4 \uBCF8\uBB38 \uC791\uC131).\r\n  const isToggle = block.dataset.toggle === \"true\" || type === \"toggleListItem\";\r\n  if (isToggle) {\r\n    block.classList.remove(\"collapsed\"); // \uC811\uD600 \uC788\uC73C\uBA74 \uD3BC\uCE68\r\n    let kids = block.querySelector(\":scope > .lumir-children\");\r\n    if (!kids) { kids = document.createElement(\"div\"); kids.className = \"lumir-children\"; block.appendChild(kids); }\r\n    // caret \uB4A4 \uD14D\uC2A4\uD2B8(\uC81C\uBAA9 \uBD84\uD560\uBD84)\uB97C \uC0C8 \uCCAB \uC790\uC2DD \uB2E8\uB77D\uC73C\uB85C \uC62E\uAE40\r\n    const r0 = sel.getRangeAt(0);\r\n    const tail0 = r0.cloneRange();\r\n    tail0.selectNodeContents(content);\r\n    tail0.setStart(r0.endContainer, r0.endOffset);\r\n    const frag0 = tail0.extractContents();\r\n    const child = makeBlockElement(\"paragraph\", { innerHTML: \"\", props: defaultProps(\"paragraph\") });\r\n    directContent(child).appendChild(frag0);\r\n    kids.insertBefore(child, kids.firstChild);\r\n    focusStart(directContent(child));\r\n    if (onChange) onChange();\r\n    return;\r\n  }\r\n\r\n  // \uD1A0\uAE00 \uBCF8\uBB38(children)\uC5D0\uC11C \uBE48 \uB9C8\uC9C0\uB9C9 \uC904\uC5D0 Enter \u2192 \uD1A0\uAE00 \uBC16\uC73C\uB85C \uD0C8\uCD9C: \uBE48 \uC790\uC2DD\uC744 \uC81C\uAC70\uD558\uACE0\r\n  // \uD1A0\uAE00 \uBE14\uB85D\uC758 \uB2E4\uC74C \uD615\uC81C\uB85C \uC0C8 \uBB38\uB2E8\uC744 \uB9CC\uB4E0\uB2E4(\"\uC81C\uBAA9\u2192\uBCF8\uBB38\u2192\uBE48 \uC904\uC5D0\uC11C \uD1A0\uAE00 \uBC16 \uD558\uB2E8 \uBE14\uB85D\" \uD750\uB984 \uC644\uACB0).\r\n  const kidsHost = block.parentElement && block.parentElement.classList && block.parentElement.classList.contains(\"lumir-children\") ? block.parentElement : null;\r\n  if (kidsHost && type === \"paragraph\" && !block.nextElementSibling && content.textContent.trim() === \"\" && !content.querySelector(\"img\")) {\r\n    const toggleBlock = kidsHost.closest(\".block\");\r\n    if (toggleBlock) {\r\n      block.remove();\r\n      if (!kidsHost.children.length) kidsHost.remove();\r\n      const next = makeBlockElement(\"paragraph\", { innerHTML: \"\", props: defaultProps(\"paragraph\") });\r\n      toggleBlock.after(next);\r\n      focusStart(directContent(next));\r\n      if (onChange) onChange();\r\n      return;\r\n    }\r\n  }\r\n\r\n  const isList = LIST_TYPES.has(type);\r\n  if (isList && content.textContent.trim() === \"\") {\r\n    convertToParagraph(block); // \uBE48 \uB9AC\uC2A4\uD2B8 \uD56D\uBAA9\uC5D0\uC11C Enter \u2192 \uBB38\uB2E8\r\n    if (onChange) onChange();\r\n    return;\r\n  }\r\n\r\n  // caret\uC5D0\uC11C \uBD84\uD560\r\n  const range = sel.getRangeAt(0);\r\n  const tail = range.cloneRange();\r\n  tail.selectNodeContents(content);\r\n  tail.setStart(range.endContainer, range.endOffset);\r\n  const frag = tail.extractContents();\r\n\r\n  const carryType = isList ? type : \"paragraph\";\r\n  const next = makeBlockElement(carryType, { innerHTML: \"\", props: defaultProps(carryType) });\r\n  const nc = directContent(next);\r\n  nc.appendChild(frag);\r\n  removeEmptyInlineWrappers(nc); // \uC0C8 \uBE14\uB85D\uC758 \uBE48 <code> \uB4F1 \uC81C\uAC70(\uCF54\uB4DC \uC774\uC5B4\uC9D0 \uBC29\uC9C0)\r\n  removeEmptyInlineWrappers(content); // \uC6D0\uBCF8 \uBE14\uB85D\uC758 \uBE48 \uC11C\uC2DD \uB798\uD37C\uB3C4 \uC815\uB9AC\r\n  block.after(next);\r\n  focusStart(nc);\r\n  if (onChange) onChange();\r\n}\r\n\r\n/**\r\n * Shift+Enter: \uBE14\uB85D \uBD84\uD560 \uC5C6\uC774 \uD55C \uC904\uBC14\uAFC8(HardBreak)\uC744 \uC0BD\uC785\uD55C\uB2E4.\r\n * \uBAA8\uB378 \uD45C\uD604\uC740 \uC778\uB77C\uC778 \uD14D\uC2A4\uD2B8 \uB0B4 \"\\n\"(\uC9C1\uB82C\uD654 \uC2DC walkInline\uC5D0\uC11C <br>\u2194\"\\n\" \uB77C\uC6B4\uB4DC\uD2B8\uB9BD).\r\n * codeBlock\uC740 Enter\uC640 \uB3D9\uC77C\uD558\uAC8C \"\\n\"(\uC774\uBBF8 \uC904\uBC14\uAFC8 \uB3D9\uC791)\uC744 \uB123\uACE0, \uADF8 \uC678 \uBE14\uB85D\uC740 <br>\uB97C caret\uC5D0 \uC0BD\uC785.\r\n */\r\nfunction handleHardBreak(e, onChange) {\r\n  const sel = window.getSelection();\r\n  if (!sel || !sel.rangeCount) return;\r\n  const content = e.target.closest(\".content\");\r\n  if (!content) return;\r\n  const block = content.closest(\".block\");\r\n  if (!block) return;\r\n  e.preventDefault();\r\n  const r = sel.getRangeAt(0);\r\n  r.deleteContents();\r\n  if (block.dataset.type === \"codeBlock\") {\r\n    const t = document.createTextNode(\"\\n\");\r\n    r.insertNode(t);\r\n    r.setStartAfter(t);\r\n    r.collapse(true);\r\n    sel.removeAllRanges();\r\n    sel.addRange(r);\r\n    normalizeCodeTrailingNewline(content); // \uD6C4\uD589 \uAC1C\uD589 \uB80C\uB354 \uBCF4\uC815(pre-wrap)\r\n    if (onChange) onChange();\r\n    return;\r\n  } else {\r\n    const br = document.createElement(\"br\");\r\n    r.insertNode(br);\r\n    // insertNode\uAC00 \uB05D \uC624\uD504\uC14B\uC5D0\uC11C \uBE48 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uB97C br \uB4A4\uC5D0 \uB0A8\uAE38 \uC218 \uC788\uC74C \u2192 \uC81C\uAC70(\uB05D \uD310\uC815 \uC815\uD655\uD654)\r\n    while (br.nextSibling && br.nextSibling.nodeType === 3 && br.nextSibling.nodeValue === \"\") br.nextSibling.remove();\r\n    // \uC904 \uB05D(\uB2E4\uC74C \uD615\uC81C \uC5C6\uC74C)\uC774\uBA74 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uD6C4\uD589 <br> \uB4A4 caret\uC744 \uC0C8 \uC904\uC5D0 \uB450\uC9C0 \uBABB\uD574 \uC785\uB825\uC774 br \uC55E\uC73C\uB85C\r\n    // \uB4E4\uC5B4\uAC00\uB294 \uBB38\uC81C\uAC00 \uC788\uB2E4. \uB9C8\uD0B9\uB41C \uBCF4\uC870 <br>(filler)\uB97C \uB367\uB300 caret\uC744 \uC2E4\uC81C br\uACFC filler \uC0AC\uC774\uC5D0 \uB454\uB2E4.\r\n    // filler\uB294 \uC9C1\uB82C\uD654\uC5D0\uC11C \uBB34\uC2DC(walkInline)\uB418\uC5B4 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC744 \uC624\uC5FC\uC2DC\uD0A4\uC9C0 \uC54A\uB294\uB2E4.\r\n    if (!br.nextSibling) {\r\n      const filler = document.createElement(\"br\");\r\n      filler.setAttribute(\"data-lumir-br-filler\", \"\");\r\n      br.after(filler);\r\n    }\r\n    r.setStartAfter(br);\r\n  }\r\n  r.collapse(true);\r\n  sel.removeAllRanges();\r\n  sel.addRange(r);\r\n  if (onChange) onChange();\r\n}\r\n\r\nfunction handleBackspace(e, onChange) {\r\n  const sel = window.getSelection();\r\n  if (!sel || !sel.rangeCount || !sel.isCollapsed) return;\r\n  const content = e.target.closest(\".content\");\r\n  if (!content) return;\r\n  const block = content.closest(\".block\");\r\n  if (!block) return;\r\n  if (!caretAtStart(content)) return;\r\n  e.preventDefault();\r\n\r\n  const type = block.dataset.type;\r\n  if (type !== \"paragraph\") {\r\n    convertToParagraph(block); // \uBE44\uBB38\uB2E8 \u2192 \uBB38\uB2E8(\uD0C0\uC785 \uD574\uC81C)\r\n    if (onChange) onChange();\r\n    return;\r\n  }\r\n\r\n  const prev = block.previousElementSibling;\r\n  if (!prev) {\r\n    // \uD1A0\uAE00 \uBCF8\uBB38 \uCCAB \uC790\uC2DD\uC5D0\uC11C Backspace(\uAC07\uD798 \uD574\uC18C): \uBE48 \uC904\uC774\uBA74 \uC81C\uAC70\uD558\uACE0 \uCE90\uB7FF\uC744 \uD1A0\uAE00 \uC81C\uBAA9 \uB05D\uC73C\uB85C.\r\n    const kidsHost = block.parentElement;\r\n    if (kidsHost && kidsHost.classList && kidsHost.classList.contains(\"lumir-children\")\r\n        && content.textContent.trim() === \"\" && !content.querySelector(\"img\")) {\r\n      const toggleBlock = kidsHost.closest(\".block\");\r\n      const title = toggleBlock && directContent(toggleBlock);\r\n      block.remove();\r\n      if (!kidsHost.children.length) kidsHost.remove();\r\n      if (title) focusEnd(title);\r\n      if (onChange) onChange();\r\n    }\r\n    return;\r\n  }\r\n  if (prev.dataset.type === \"table\") {\r\n    const cells = prev.querySelectorAll(\"td.lumir-cell\");\r\n    if (cells.length) focusEnd(cells[cells.length - 1]);\r\n    return; // \uD45C\uC640\uB294 \uBCD1\uD569\uD558\uC9C0 \uC54A\uC74C\r\n  }\r\n  if (prev.dataset.type === \"columnList\") {\r\n    // \uCEEC\uB7FC \uCEE8\uD14C\uC774\uB108(.content.lumir-columns)\uC5D0\uB294 \uBCD1\uD569\uD558\uC9C0 \uC54A\uC74C \u2014 \uB9C8\uC9C0\uB9C9 \uD3B8\uC9D1\uC601\uC5ED\uC73C\uB85C \uCE90\uB7FF\uB9CC \uC774\uB3D9(M3).\r\n    const conts = prev.querySelectorAll(\".content[contenteditable='true']\");\r\n    if (conts.length) focusEnd(conts[conts.length - 1]);\r\n    return;\r\n  }\r\n  let prevContent = directContent(prev);\r\n  // prev\uAC00 \uC911\uCCA9 children(.lumir-children)\uC744 \uAC00\uC9C0\uBA74 \uC2DC\uAC01\uC801 \uB9D0\uB2E8(\uB9C8\uC9C0\uB9C9 \uC790\uC190 \uBE14\uB85D)\uC758 content\uB85C \uBCD1\uD569(M3).\r\n  const prevKids = prev.querySelector(\":scope > .lumir-children\");\r\n  if (prevKids) {\r\n    const nested = prevKids.querySelectorAll(\".block\");\r\n    const lastNested = nested[nested.length - 1];\r\n    const lc = lastNested && directContent(lastNested);\r\n    if (lc) prevContent = lc;\r\n  }\r\n  if (!prevContent) return;\r\n\r\n  focusEnd(prevContent);\r\n  const j = window.getSelection().getRangeAt(0);\r\n  const moving = document.createRange();\r\n  moving.selectNodeContents(content);\r\n  const frag = moving.extractContents();\r\n  j.insertNode(frag);\r\n  try {\r\n    const r = document.createRange();\r\n    r.setStart(j.startContainer, j.startOffset);\r\n    r.collapse(true);\r\n    const s = window.getSelection();\r\n    s.removeAllRanges();\r\n    s.addRange(r);\r\n  } catch (_) {\r\n    /* caret \uBCF5\uC6D0 best-effort */\r\n  }\r\n  prevContent.normalize();\r\n  block.remove();\r\n  if (onChange) onChange();\r\n}\r\n\r\n/**\r\n * \uC5D0\uB514\uD130 \uC694\uC18C\uC5D0 \uD3B8\uC9D1 \uD0A4 \uD578\uB4E4\uB7EC \uBD80\uCC29. opts: { onChange?, isComposing? }\r\n * \uBC18\uD658: \uD574\uC81C \uD568\uC218.\r\n */\r\n/** \uBE14\uB85D \uD14D\uC2A4\uD2B8 \uC815\uB82C \uC124\uC815(left/center/right/justify). __props\u00B7data-text-alignment \uBC18\uC601. */\r\nexport function setBlockAlignment(block, align) {\r\n  if (!block) return false;\r\n  if (!block.__props) block.__props = { textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" };\r\n  block.__props.textAlignment = align;\r\n  if (align && align !== \"left\") block.dataset.textAlignment = align;\r\n  else block.removeAttribute(\"data-text-alignment\");\r\n  return true;\r\n}\r\n\r\n/** \uD604\uC7AC \uBE14\uB85D\uC744 \uC9C1\uC804 \uD615\uC81C \uBE14\uB85D\uC758 .lumir-children \uC73C\uB85C \uB4E4\uC5EC\uC4F0\uAE30(\uC911\uCCA9) */\r\nexport function indentBlock(block) {\r\n  const prev = block.previousElementSibling;\r\n  if (!prev || !prev.classList || !prev.classList.contains(\"block\")) return false;\r\n  let kids = prev.querySelector(\":scope > .lumir-children\");\r\n  if (!kids) { kids = document.createElement(\"div\"); kids.className = \"lumir-children\"; prev.appendChild(kids); }\r\n  kids.appendChild(block);\r\n  focusEnd(directContent(block));\r\n  return true;\r\n}\r\n/** \uC911\uCCA9 \uBE14\uB85D\uC744 \uBD80\uBAA8 \uBE14\uB85D \uB2E4\uC74C\uC73C\uB85C \uB0B4\uC5B4\uC4F0\uAE30 */\r\nexport function outdentBlock(block) {\r\n  const kids = block.parentElement;\r\n  if (!kids || !kids.classList || !kids.classList.contains(\"lumir-children\")) return false;\r\n  const parentBlock = kids.parentElement;\r\n  if (!parentBlock) return false;\r\n  parentBlock.after(block);\r\n  if (!kids.querySelector(\":scope > .block\")) kids.remove();\r\n  focusEnd(directContent(block));\r\n  return true;\r\n}\r\n\r\nexport function attachEditing(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : null;\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const tabBehavior = opts.tabBehavior === \"prefer-indent\" ? \"prefer-indent\" : \"prefer-navigate-ui\";\r\n  const cross = opts.cross || null; // \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD \uC11C\uC2DD \uD30C\uC0AC\uB4DC\r\n\r\n  function onKeydown(e) {\r\n    if (e.isComposing || isComposing()) return; // IME \uAC00\uB4DC\r\n\r\n    // \uC778\uB77C\uC778 \uC11C\uC2DD \uB2E8\uCD95(Ctrl/Cmd+B/I/U) \u2014 \uBE14\uB85D\u00B7\uD45C \uC140 \uACF5\uD1B5\r\n    const mod = e.metaKey || e.ctrlKey;\r\n    if (mod && !e.altKey) {\r\n      const mk = { b: \"bold\", i: \"italic\", u: \"underline\" }[e.key.toLowerCase()];\r\n      if (mk) {\r\n        // \uD06C\uB85C\uC2A4\uBE14\uB85D(\uC5EC\uB7EC \uC904) \uC120\uD0DD\uC774\uBA74 \uC77C\uAD04 \uC801\uC6A9 \uACBD\uB85C\uB85C \uB77C\uC6B0\uD305.\r\n        if (cross && cross.isActive()) {\r\n          e.preventDefault();\r\n          cross.applyMark(mk);\r\n          return;\r\n        }\r\n        const editable = e.target.closest && e.target.closest(\".content, td.lumir-cell\");\r\n        if (editable && editorEl.contains(editable)) {\r\n          e.preventDefault();\r\n          if (applyInlineMark(editable, mk) && onChange) onChange();\r\n          return;\r\n        }\r\n      }\r\n    }\r\n\r\n    // \uBE14\uB85D \uD0C0\uC785 \uB2E8\uCD95 (blocknote \uC815\uD569) \u2014 Ctrl/Cmd+Alt+0~3=\uBB38\uB2E8/\uC81C\uBAA9, Ctrl/Cmd+Shift+6~9=\uD1A0\uAE00\uBAA9\uB85D/\uBC88\uD638/\uAE00\uBA38\uB9AC/\uD560\uC77C.\r\n    // Shift+\uC22B\uC790\uB294 '&' \uB4F1\uC73C\uB85C \uBC14\uB00C\uBBC0\uB85C e.code(\uBB3C\uB9AC \uD0A4)\uB85C \uD310\uC815. \uD45C \uC140\u00B7\uD45C \uB0B4\uBD80\uB294 \uC81C\uC678.\r\n    if (mod) {\r\n      let conv = null;\r\n      if (e.altKey && !e.shiftKey) {\r\n        conv = { Digit0: { type: \"paragraph\" }, Digit1: { type: \"heading\", level: 1 }, Digit2: { type: \"heading\", level: 2 }, Digit3: { type: \"heading\", level: 3 } }[e.code] || null;\r\n      } else if (e.shiftKey && !e.altKey) {\r\n        conv = { Digit6: { type: \"toggleListItem\" }, Digit7: { type: \"numberedListItem\" }, Digit8: { type: \"bulletListItem\" }, Digit9: { type: \"checkListItem\" } }[e.code] || null;\r\n      }\r\n      if (conv) {\r\n        const content = e.target.closest && e.target.closest(\".content\");\r\n        // \uD45C \uC140\uC5D0\uC11C\uB294 \uBE14\uB85D \uD0C0\uC785 \uBCC0\uD658 \uAE08\uC9C0(\uAC00\uB4DC\uB294 \uC140=e.target \uAE30\uC900; content\uB294 \uD45C \uBE14\uB85D \uB798\uD37C\uB77C .lumir-tbl\uC744 \uC704\uB85C \uBABB \uCC3E\uC74C).\r\n        if (content && editorEl.contains(content) && !(e.target.closest && e.target.closest(\".lumir-tbl\"))) {\r\n          const block = content.closest(\".block\");\r\n          if (block) {\r\n            e.preventDefault();\r\n            changeBlockType(block, conv.type, propsForType(conv.type, conv.level));\r\n            if (onChange) onChange();\r\n            return;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // \uBE14\uB85D \uD3B8\uC9D1(Enter/Backspace) \u2014 \uD45C \uC140\uC740 P3\uC5D0\uC11C \uCC98\uB9AC\r\n    if (e.target.closest && e.target.closest(\".lumir-tbl\")) return;\r\n    const content = e.target.closest && e.target.closest(\".content\");\r\n    if (!content || !editorEl.contains(content)) return;\r\n    if (e.key === \"Tab\" && tabBehavior === \"prefer-indent\" && !e.defaultPrevented) {\r\n      const block = content.closest(\".block\");\r\n      if (block) {\r\n        e.preventDefault();\r\n        const ok = e.shiftKey ? outdentBlock(block) : indentBlock(block);\r\n        if (ok && onChange) onChange();\r\n        return;\r\n      }\r\n    }\r\n    if (e.key === \"Enter\" && !e.shiftKey) handleEnter(e, onChange);\r\n    else if (e.key === \"Enter\" && e.shiftKey) handleHardBreak(e, onChange);\r\n    else if (e.key === \"Backspace\") handleBackspace(e, onChange);\r\n  }\r\n\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  return () => editorEl.removeEventListener(\"keydown\", onKeydown);\r\n}\r\n\r\n// --- \uB9C8\uD06C\uB2E4\uC6B4 \uB2E8\uCD95 (P1-\u2462) ---\r\nconst MD_RULES = [\r\n  { re: /^#\\s$/, type: \"heading\", level: 1 },\r\n  { re: /^##\\s$/, type: \"heading\", level: 2 },\r\n  { re: /^###\\s$/, type: \"heading\", level: 3 },\r\n  { re: /^####\\s$/, type: \"heading\", level: 4 },\r\n  { re: /^#####\\s$/, type: \"heading\", level: 5 },\r\n  { re: /^######\\s$/, type: \"heading\", level: 6 },\r\n  { re: /^[-*]\\s$/, type: \"bulletListItem\" },\r\n  { re: /^1\\.\\s$/, type: \"numberedListItem\" },\r\n  { re: /^\\[\\s?\\]\\s$/, type: \"checkListItem\" },\r\n  { re: /^>\\s$/, type: \"quote\" },\r\n  { re: /^```$/, type: \"codeBlock\" },\r\n];\r\n\r\nexport function propsForType(type, level, isToggle) {\r\n  if (type === \"heading\") {\r\n    const p = { ...BASE_PROPS(), level: level || 1 };\r\n    if (isToggle) p.isToggleable = true; // blocknote \uD1A0\uAE00 \uD5E4\uB529 prop\uBA85\uACFC \uC77C\uCE58\r\n    return p;\r\n  }\r\n  return defaultProps(type);\r\n}\r\n\r\nexport function changeBlockType(block, type, props) {\r\n  const el = makeBlockElement(type, { innerHTML: \"\", props });\r\n  block.replaceWith(el);\r\n  focusStart(directContent(el));\r\n  return el;\r\n}\r\n\r\n/** \uBE14\uB85D \uD0C0\uC785 \uBCC0\uACBD \u2014 \uAE30\uC874 \uC778\uB77C\uC778 \uB0B4\uC6A9 \uBCF4\uC874(\uD234\uBC14/FloatingMenu\uC6A9). */\r\nexport function setBlockType(block, type, level, isToggle) {\r\n  const content = block.querySelector(\":scope > .content\");\r\n  const html = content ? content.innerHTML : \"\";\r\n  const el = makeBlockElement(type, { innerHTML: html, props: propsForType(type, level, isToggle) });\r\n  block.replaceWith(el);\r\n  focusStart(directContent(el));\r\n  return el;\r\n}\r\n\r\n/**\r\n * \uBB38\uB2E8 \uC2DC\uC791\uC758 \uB9C8\uD06C\uB2E4\uC6B4 \uD2B8\uB9AC\uAC70(`# `,`## `,`- `/`* `,`1. `,`[] `,`> `,``` ``` ```) \uAC10\uC9C0 \uC2DC\r\n * \uBE14\uB85D \uD0C0\uC785 \uBCC0\uD658(\uD2B8\uB9AC\uAC70 \uD14D\uC2A4\uD2B8 \uC18C\uAC70). \uBCC0\uD658\uB418\uBA74 true. (\uBB38\uB2E8\uC5D0\uC11C\uB9CC \uB3D9\uC791)\r\n */\r\nexport function tryMarkdown(content, headingLevels) {\r\n  if (!content) return false;\r\n  const block = content.closest && content.closest(\".block\");\r\n  if (!block || block.dataset.type !== \"paragraph\") return false;\r\n  const t = content.textContent;\r\n  for (const r of MD_RULES) {\r\n    if (r.type === \"heading\" && Array.isArray(headingLevels) && !headingLevels.includes(r.level)) continue; // \uD5C8\uC6A9 \uB808\uBCA8\uB9CC\r\n    if (r.re.test(t)) {\r\n      changeBlockType(block, r.type, propsForType(r.type, r.level));\r\n      return true;\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n// --- \uC778\uB77C\uC778 \uB9C8\uD06C\uB2E4\uC6B4 \uC790\uB3D9\uBCC0\uD658 (A4): `**\uAD75\uAC8C**` `*\uAE30\uC6B8\uC784*` `__\uAD75\uAC8C__` `_\uAE30\uC6B8\uC784_` `` `\uCF54\uB4DC` `` `~~\uCDE8\uC18C~~` ---\r\n// \uB2EB\uB294 \uAD6C\uBD84\uC790\uB97C \uB9C9 \uC785\uB825\uD55C \uC2DC\uC810, caret \uBC14\uB85C \uC55E\uC758 \"\uD55C \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uB0B4 \uD3C9\uBB38\" \uD328\uD134\uB9CC \uBCC0\uD658.\r\n// (\uD63C\uD569 \uC778\uB77C\uC778/\uACBD\uACC4 \uAD50\uCC28\uB294 \uC758\uB3C4\uC801\uC73C\uB85C \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC74C \u2014 BlockNote inputrule\uACFC \uB3D9\uC77C \uBC94\uC704)\r\n// lookbehind\uB85C `**x*`(\uAD75\uAC8C \uC785\uB825 \uC911 \uCCAB \uB2EB\uB294 \uBCC4\uD45C)\uC5D0\uC11C \uAE30\uC6B8\uC784\uC774 \uC870\uAE30 \uBCC0\uD658\uB418\uB294 \uAC83\uC744 \uBC29\uC9C0.\r\nconst INLINE_MD_RULES = [\r\n  { tag: \"strong\", re: /\\*\\*([^\\s*](?:[^*]*[^\\s*])?)\\*\\*$/ },\r\n  { tag: \"strong\", re: /(?<!_)__([^\\s_](?:[^_]*[^\\s_])?)__$/ },\r\n  { tag: \"s\", re: /~~([^\\s~](?:[^~]*[^\\s~])?)~~$/ },\r\n  { tag: \"code\", re: /`([^\\s`](?:[^`]*[^\\s`])?)`$/ },\r\n  { tag: \"em\", re: /(?<!\\*)\\*([^\\s*](?:[^*]*[^\\s*])?)\\*$/ },\r\n  { tag: \"em\", re: /(?<!_)_([^\\s_](?:[^_]*[^\\s_])?)_$/ },\r\n];\r\n\r\n/**\r\n * caret \uC55E \uD14D\uC2A4\uD2B8\uC758 \uC644\uC131\uB41C \uC778\uB77C\uC778 \uB9C8\uD06C\uB2E4\uC6B4 \uD328\uD134\uC744 \uB9C8\uD06C \uC694\uC18C\uB85C \uCE58\uD658\uD55C\uB2E4. \uBCC0\uD658\uB418\uBA74 true.\r\n * \uCF54\uB4DC\uBE14\uB85D\uC5D0\uC11C\uB294 \uB3D9\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4(\uCF54\uB4DC \uB0B4\uC6A9 \uBCF4\uC874).\r\n */\r\nexport function tryInlineMarkdown(content) {\r\n  if (!content) return false;\r\n  const block = content.closest && content.closest(\".block\");\r\n  if (!block || block.dataset.type === \"codeBlock\") return false;\r\n  const sel = window.getSelection();\r\n  if (!sel || !sel.rangeCount) return false;\r\n  const range = sel.getRangeAt(0);\r\n  if (!range.collapsed) return false;\r\n  const node = range.endContainer;\r\n  if (!node || node.nodeType !== 3 || !content.contains(node)) return false; // \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uB0B4\uC5D0\uC11C\uB9CC\r\n  const offset = range.endOffset;\r\n  const before = node.nodeValue.slice(0, offset);\r\n  for (const rule of INLINE_MD_RULES) {\r\n    const m = rule.re.exec(before);\r\n    if (!m) continue;\r\n    const start = offset - m[0].length;\r\n    const mark = document.createElement(rule.tag);\r\n    mark.textContent = m[1];\r\n    const r = document.createRange();\r\n    r.setStart(node, start);\r\n    r.setEnd(node, offset);\r\n    r.deleteContents();\r\n    r.insertNode(mark);\r\n    const after = document.createRange();\r\n    after.setStartAfter(mark);\r\n    after.collapse(true);\r\n    sel.removeAllRanges();\r\n    sel.addRange(after);\r\n    return true;\r\n  }\r\n  return false;\r\n}\r\n", "/**\r\n * codeBlock \uAD6C\uBB38\uAC15\uC870 + \uC5B8\uC5B4 \uC120\uD0DD \uCEE8\uD2B8\uB864\uB7EC (A1, \uBB34\uC758\uC874).\r\n *\r\n * \uAC15\uC870\uB294 \"\uC2DC\uAC01 \uC804\uC6A9\"\uC774\uB2E4 \u2014 \uC9C1\uB82C\uD654\uB294 .content\uC758 textContent(htmlToInlineContent) \uAE30\uBC18\uC774\uB77C\r\n * tok span \uC720\uBB34\uC640 \uBB34\uAD00\uD558\uAC8C \uB3D9\uC77C \uACB0\uACFC(\uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uBB34\uC601\uD5A5).\r\n *\r\n * \uB3D9\uC791:\r\n *  - \uB9C8\uC6B4\uD2B8/refresh: \uD3EC\uCEE4\uC2A4\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 codeBlock\uC744 \uAC15\uC870\uD558\uACE0 \uC5B8\uC5B4 \uC140\uB809\uD130\uB97C \uBCF4\uC7A5.\r\n *  - \uD3EC\uCEE4\uC2A4 \uC911: DOM\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC74C(caret/IME \uC548\uC804, \uC0C8 \uC785\uB825\uC740 \uBE14\uB7EC \uC804\uAE4C\uC9C0 \uBB34\uCC44\uC0C9).\r\n *  - \uBE14\uB7EC: \uD574\uB2F9 codeBlock \uC7AC\uAC15\uC870.\r\n *  - \uC77D\uAE30\uC804\uC6A9: \uD56D\uC0C1 \uAC15\uC870(\uD3EC\uCEE4\uC2A4 \uBD88\uAC00).\r\n */\r\nimport { htmlToInlineContent } from \"../../serialize/inline.js\";\r\nimport { highlightToHtml, CODE_LANGUAGES } from \"./highlight.js\";\r\nimport { normalizeCodeTrailingNewline } from \"../../editing.js\";\r\n\r\nfunction contentOf(block) {\r\n  return block.querySelector(\":scope > .content\");\r\n}\r\n\r\n// .content\uC758 \uC2E4\uC81C \uCF54\uB4DC \uD14D\uC2A4\uD2B8(<br>\u2192\"\\n\" \uD3EC\uD568) \uCD94\uCD9C\r\nfunction readCode(content) {\r\n  return htmlToInlineContent(content)\r\n    .map((n) => (n && n.text != null ? n.text : \"\"))\r\n    .join(\"\");\r\n}\r\n\r\nexport function attachCodeHighlight(editorEl, ctx) {\r\n  const onChange = (ctx && ctx.onChange) || (() => {});\r\n\r\n  function highlight(block) {\r\n    const content = contentOf(block);\r\n    if (!content) return;\r\n    if (content.contains(document.activeElement)) return; // \uD3B8\uC9D1(.content) \uD3EC\uCEE4\uC2A4 \uC911\uC5D4 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC74C(caret/IME \uC548\uC804)\r\n    const lang = (block.__props && block.__props.language) || \"\";\r\n    content.innerHTML = highlightToHtml(readCode(content), lang);\r\n    normalizeCodeTrailingNewline(content); // \uD6C4\uD589 \uAC1C\uD589 \uBE48 \uC904 \uB80C\uB354 \uBCF4\uC815(pre-wrap)\r\n  }\r\n\r\n  function ensureSelector(block) {\r\n    let sel = block.querySelector(\":scope > .lumir-code-lang\");\r\n    if (!sel) {\r\n      sel = document.createElement(\"select\");\r\n      sel.className = \"lumir-code-lang\";\r\n      sel.setAttribute(\"contenteditable\", \"false\");\r\n      sel.setAttribute(\"aria-label\", \"\uCF54\uB4DC \uC5B8\uC5B4\");\r\n      for (const { value, label } of CODE_LANGUAGES) {\r\n        const opt = document.createElement(\"option\");\r\n        opt.value = value;\r\n        opt.textContent = label;\r\n        sel.appendChild(opt);\r\n      }\r\n      sel.addEventListener(\"change\", () => {\r\n        if (!block.__props) block.__props = {};\r\n        block.__props.language = sel.value;\r\n        highlight(block);\r\n        onChange();\r\n      });\r\n      sel.addEventListener(\"mousedown\", (e) => e.stopPropagation()); // \uC140\uB809\uD130 \uD074\uB9AD\uC774 \uBE14\uB85D \uC120\uD0DD/\uB4DC\uB798\uADF8\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uAC8C\r\n      block.insertBefore(sel, block.firstChild);\r\n    }\r\n    sel.value = (block.__props && block.__props.language) || \"\";\r\n  }\r\n\r\n  function scan() {\r\n    editorEl.querySelectorAll('.block[data-type=\"codeBlock\"]').forEach((block) => {\r\n      ensureSelector(block);\r\n      highlight(block);\r\n    });\r\n  }\r\n\r\n  function onFocusOut(e) {\r\n    const content = e.target && e.target.closest && e.target.closest(\".content\");\r\n    if (!content) return;\r\n    const block = content.closest('.block[data-type=\"codeBlock\"]');\r\n    if (!block || !editorEl.contains(block)) return;\r\n    // \uD3EC\uCEE4\uC2A4\uAC00 .content\uB97C \uB5A0\uB09C \uB4A4 \uC7AC\uAC15\uC870(highlight \uB0B4\uBD80\uC5D0\uC11C content \uD3EC\uCEE4\uC2A4 \uC7AC\uD655\uC778)\r\n    setTimeout(() => highlight(block), 0);\r\n  }\r\n\r\n  editorEl.addEventListener(\"focusout\", onFocusOut);\r\n  scan();\r\n\r\n  return {\r\n    destroy: () => editorEl.removeEventListener(\"focusout\", onFocusOut),\r\n    refresh: scan,\r\n  };\r\n}\r\n", "/**\r\n * code-block \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 controls-only.\r\n * codeBlock \uC790\uCCB4(\uB80C\uB354/\uC9C1\uB82C\uD654/\uC2AC\uB798\uC2DC)\uB294 \uCF54\uC5B4(serialize/block.js\u00B7editing.js\u00B7slash)\uC5D0 \uC788\uACE0,\r\n * \uC774 \uC2AC\uB77C\uC774\uC2A4\uB294 \"\uAD6C\uBB38\uAC15\uC870 + \uC5B8\uC5B4 \uC120\uD0DD\" \uD655\uC7A5\uB9CC \uCEE8\uD2B8\uB864\uB85C \uAE30\uC5EC\uD55C\uB2E4(A1, \uBB34\uC758\uC874).\r\n */\r\nimport { attachCodeHighlight } from \"./controls.js\";\r\n\r\nexport default {\r\n  name: \"code-block\",\r\n  controls: attachCodeHighlight,\r\n};\r\n", "/**\r\n * \uBD81\uB9C8\uD06C(\uB9C1\uD06C \uCE74\uB4DC / \uC784\uBCA0\uB4DC) \uBE14\uB85D \u2014 \uC778\uB77C\uC778 \uB9C1\uD06C\uC5D0\uC11C \"\uC804\uD658\"\uC73C\uB85C \uC0DD\uC131.\r\n * \uBE14\uB85D JSON: { type:\"bookmark\",\r\n *   props:{ url, mode:\"card\"|\"embed\", title?, description?, image?, site?, favicon?,\r\n *           provider?, embedUrl?, ratio? },\r\n *   content:[], children:[] }\r\n *  - mode=\"card\": \uC378\uB124\uC77C + \uC81C\uBAA9/\uC124\uBA85/\uB3C4\uBA54\uC778 \uCE74\uB4DC(<a target=_blank>). \uBA54\uD0C0\uB294 \uC11C\uBC84(fetchLinkPreview)\uB85C \uCC44\uC6C0.\r\n *  - mode=\"embed\": YouTube/Vimeo \uB9CC iframe(\uC81C\uACF5\uC790 \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8). \uADF8 \uC678/\uBD88\uAC00 \u2192 \uCE74\uB4DC\uB85C \uD3F4\uBC31.\r\n * props \uB294 verbatim \uBCF4\uC874(__props) \u2192 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD. \uCEE4\uC2A4\uD140 \uD0C0\uC785\uC774\uBBC0\uB85C HTML/MD \uB0B4\uBCF4\uB0B4\uAE30\uB294 \uB9C1\uD06C\uB85C degrade.\r\n */\r\n\r\nimport { neutralizeUrl, resolveEmbed, isAllowedEmbedUrl } from \"../../utils/url.js\";\r\n\r\nfunction hostOf(url) {\r\n  try {\r\n    return new URL(url).host.replace(/^www\\./, \"\");\r\n  } catch (_) {\r\n    const m = String(url || \"\").match(/^(?:https?:\\/\\/)?([^/?#]+)/i);\r\n    return m ? m[1].replace(/^www\\./, \"\") : \"\";\r\n  }\r\n}\r\nfunction ratioPct(ratio) {\r\n  const [w, h] = String(ratio || \"16:9\").split(\":\").map((n) => parseFloat(n));\r\n  return w && h ? (h / w) * 100 : 56.25;\r\n}\r\n\r\n/** el.__props \uB97C \uC77D\uC5B4 \uCE74\uB4DC/\uC784\uBCA0\uB4DC \uB0B4\uBD80 DOM \uC744 (\uC7AC)\uAD6C\uCD95. \uBE44\uB3D9\uAE30 \uBA54\uD0C0 \uAC31\uC2E0 \uD6C4\uC5D0\uB3C4 \uC7AC\uC0AC\uC6A9. */\r\nexport function renderBookmarkInner(el) {\r\n  const props = (el && el.__props) || {};\r\n  const wrap = el && el.querySelector(\".lumir-bookmark\");\r\n  if (!wrap) return;\r\n  wrap.innerHTML = \"\";\r\n  const url = neutralizeUrl(props.url);\r\n  const mode = props.mode === \"embed\" ? \"embed\" : \"card\";\r\n\r\n  // \uB9AC\uC0AC\uC774\uC988 \uB798\uD37C \u2014 previewWidth(px) \uC801\uC6A9 + \uC88C/\uC6B0 \uD578\uB4E4(controls.js\uAC00 \uB4DC\uB798\uADF8\uB85C previewWidth \uAC31\uC2E0).\r\n  const inner = document.createElement(\"div\");\r\n  inner.className = \"lumir-bookmark-inner\";\r\n  if (props.previewWidth) inner.style.width = parseInt(props.previewWidth, 10) + \"px\";\r\n\r\n  if (mode === \"embed\") {\r\n    // \uC800\uC7A5\uB41C embedUrl \uC6B0\uC120, \uC5C6\uC73C\uBA74 \uC6D0\uBCF8 url \uC5D0\uC11C \uC7AC\uB3C4\uCD9C \u2014 \uB458 \uB2E4 \uD5C8\uC6A9 \uC81C\uACF5\uC790\uC77C \uB54C\uB9CC iframe.\r\n    let embedUrl = props.embedUrl ? neutralizeUrl(props.embedUrl) : \"\";\r\n    let ratio = props.ratio || \"16:9\";\r\n    if (!embedUrl || !isAllowedEmbedUrl(embedUrl)) {\r\n      const emb = resolveEmbed(url);\r\n      if (emb) { embedUrl = emb.embedUrl; ratio = emb.ratio; }\r\n    }\r\n    if (embedUrl && isAllowedEmbedUrl(embedUrl)) {\r\n      wrap.dataset.mode = \"embed\";\r\n      const frame = document.createElement(\"div\");\r\n      frame.className = \"lumir-bookmark-embed\";\r\n      frame.style.paddingTop = ratioPct(ratio) + \"%\";\r\n      const iframe = document.createElement(\"iframe\");\r\n      iframe.src = embedUrl;\r\n      iframe.setAttribute(\"loading\", \"lazy\");\r\n      iframe.setAttribute(\"allowfullscreen\", \"\");\r\n      iframe.setAttribute(\"referrerpolicy\", \"strict-origin-when-cross-origin\");\r\n      iframe.setAttribute(\"allow\", \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\");\r\n      // sandbox: \uC2A4\uD06C\uB9BD\uD2B8/\uB3D9\uC77C\uCD9C\uCC98(\uD50C\uB808\uC774\uC5B4 \uB3D9\uC791)\u00B7\uD31D\uC5C5\u00B7\uC804\uCCB4\uD654\uBA74 \uD5C8\uC6A9, top-navigation \uB4F1\uC740 \uCC28\uB2E8.\r\n      iframe.setAttribute(\"sandbox\", \"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-presentation\");\r\n      frame.appendChild(iframe);\r\n      inner.appendChild(frame);\r\n      addHandles(inner);\r\n      wrap.appendChild(inner);\r\n      return;\r\n    }\r\n    // \uC784\uBCA0\uB4DC \uBD88\uAC00 \u2192 \uC544\uB798 \uCE74\uB4DC\uB85C \uD3F4\uBC31\r\n  }\r\n\r\n  wrap.dataset.mode = \"card\";\r\n  const a = document.createElement(\"a\");\r\n  a.className = \"lumir-bookmark-card\";\r\n  a.href = url || \"#\";\r\n  a.target = \"_blank\";\r\n  a.rel = \"noopener noreferrer\";\r\n\r\n  const text = document.createElement(\"div\");\r\n  text.className = \"lumir-bookmark-text\";\r\n  const title = document.createElement(\"div\");\r\n  title.className = \"lumir-bookmark-title\";\r\n  title.textContent = props.title || props.url || \"\uB9C1\uD06C\";\r\n  text.appendChild(title);\r\n  if (props.description) {\r\n    const desc = document.createElement(\"div\");\r\n    desc.className = \"lumir-bookmark-desc\";\r\n    desc.textContent = props.description;\r\n    text.appendChild(desc);\r\n  }\r\n  const site = document.createElement(\"div\");\r\n  site.className = \"lumir-bookmark-site\";\r\n  if (props.favicon) {\r\n    const fav = document.createElement(\"img\");\r\n    fav.className = \"lumir-bookmark-fav\";\r\n    fav.src = neutralizeUrl(props.favicon);\r\n    fav.alt = \"\";\r\n    fav.loading = \"lazy\";\r\n    fav.addEventListener(\"error\", () => fav.remove());\r\n    site.appendChild(fav);\r\n  }\r\n  const host = document.createElement(\"span\");\r\n  host.textContent = props.site || hostOf(props.url);\r\n  site.appendChild(host);\r\n  text.appendChild(site);\r\n  a.appendChild(text);\r\n\r\n  if (props.image) {\r\n    const thumb = document.createElement(\"div\");\r\n    thumb.className = \"lumir-bookmark-thumb\";\r\n    const img = document.createElement(\"img\");\r\n    img.src = neutralizeUrl(props.image);\r\n    img.alt = \"\";\r\n    img.loading = \"lazy\";\r\n    img.addEventListener(\"error\", () => thumb.remove());\r\n    thumb.appendChild(img);\r\n    a.appendChild(thumb);\r\n  }\r\n  inner.appendChild(a);\r\n  addHandles(inner);\r\n  wrap.appendChild(inner);\r\n}\r\n\r\n/** \uC88C/\uC6B0 \uB9AC\uC0AC\uC774\uC988 \uD578\uB4E4 \uC0BD\uC785(\uD3ED \uC870\uC808). controls.js(attachBookmarkControls)\uAC00 \uB4DC\uB798\uADF8 \uCC98\uB9AC. */\r\nfunction addHandles(inner) {\r\n  inner.insertAdjacentHTML(\r\n    \"beforeend\",\r\n    '<div class=\"lumir-bookmark-handle left\"></div><div class=\"lumir-bookmark-handle right\"></div>',\r\n  );\r\n}\r\n\r\nexport function bookmarkBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"bookmarkBlockToElement: DOM \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"bookmark\";\r\n  if (block && block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block && block.props ? { ...block.props } : {};\r\n  el.__children = block && Array.isArray(block.children) ? block.children : [];\r\n  const wrap = document.createElement(\"div\");\r\n  wrap.className = \"lumir-bookmark\";\r\n  wrap.setAttribute(\"contenteditable\", \"false\");\r\n  el.appendChild(wrap);\r\n  renderBookmarkInner(el);\r\n  return el;\r\n}\r\n\r\nexport function bookmarkElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"bookmark\";\r\n  block.props = el.__props || {};\r\n  // \uD30C\uC77C\uD615 \uBE14\uB85D\uACFC \uB3D9\uC77C: content \uD0A4 \uC5C6\uC74C(no content).\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n", "/** \uBD81\uB9C8\uD06C(\uCE74\uB4DC/\uC784\uBCA0\uB4DC) \uB9AC\uC0AC\uC774\uC988 \uCEE8\uD2B8\uB864\uB7EC \u2014 \uC88C/\uC6B0 \uD578\uB4E4 \uB4DC\uB798\uADF8\uB85C previewWidth(px) \uAC31\uC2E0.\r\n * \uD3ED\uB9CC \uC870\uC808(\uCE74\uB4DC=\uB192\uC774 \uC790\uB3D9, \uC784\uBCA0\uB4DC=\uBE44\uC728 \uC720\uC9C0). \uC774\uBBF8\uC9C0/\uBE44\uB514\uC624 \uCEE8\uD2B8\uB864\uB7EC\uC640 \uB3D9\uC77C \uD328\uD134. */\r\nimport { startDragResize } from \"../../shared/drag-resize.js\";\r\n\r\nconst MIN_W = 260, MAX_W = 860;\r\n\r\nexport function attachBookmarkControls(editorEl, ctx) {\r\n  const onChange = (ctx && ctx.onChange) || (() => {});\r\n  const isEditable = () => !ctx || typeof ctx.isEditable !== \"function\" || ctx.isEditable();\r\n  function onMousedown(e) {\r\n    if (!isEditable()) return; // \uC77D\uAE30\uC804\uC6A9\uC5D0\uC120 \uB9AC\uC0AC\uC774\uC988 \uBE44\uD65C\uC131\r\n    const h = e.target.closest && e.target.closest(\".lumir-bookmark-handle\");\r\n    if (!h) return;\r\n    e.preventDefault();\r\n    const block = h.closest(\".block\");\r\n    const inner = h.closest(\".lumir-bookmark-inner\");\r\n    if (!block || !inner) return;\r\n    if (!block.__props) block.__props = {};\r\n    const measured = inner.getBoundingClientRect ? Math.round(inner.getBoundingClientRect().width) : 0;\r\n    const startW = block.__props.previewWidth || measured || 480;\r\n    // \uC784\uBCA0\uB4DC iframe\uC740 \uB4DC\uB798\uADF8 \uC911 \uBD80\uBAA8 document\uC758 mousemove\uB97C \uAC00\uB85C\uCC48\uB2E4 \u2192 \uC804\uCCB4 \uD654\uBA74 \uD22C\uBA85 \uC624\uBC84\uB808\uC774\uB85C\r\n    // \uD3EC\uC778\uD130 \uC774\uBCA4\uD2B8\uB97C \uD655\uC2E4\uD788 \uCEA1\uCC98(iframe \uC704\uC5D0\uC11C\uB3C4 \uB4DC\uB798\uADF8 \uC720\uC9C0). jsdom \uB4F1 body \uC5C6\uC73C\uBA74 \uC0DD\uB7B5.\r\n    let shield = null;\r\n    if (typeof document !== \"undefined\" && document.body) {\r\n      shield = document.createElement(\"div\");\r\n      shield.style.cssText = \"position:fixed;inset:0;z-index:99999;cursor:ew-resize;\";\r\n      document.body.appendChild(shield);\r\n    }\r\n    startDragResize(e, {\r\n      axis: \"x\", startVal: startW, min: MIN_W, max: MAX_W, sign: h.classList.contains(\"left\") ? -1 : 1,\r\n      onMove: (w) => { block.__props.previewWidth = w; inner.style.width = w + \"px\"; },\r\n      onEnd: () => { if (shield && shield.parentNode) shield.parentNode.removeChild(shield); onChange(); },\r\n    });\r\n  }\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n  return { destroy: () => editorEl.removeEventListener(\"mousedown\", onMousedown) };\r\n}\r\n", "/** \uBD81\uB9C8\uD06C(\uB9C1\uD06C \uCE74\uB4DC/\uC784\uBCA0\uB4DC) \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \u2014 \uBE14\uB85D \uC9C1\uB82C\uD654\uB9CC \uB4F1\uB85D.\r\n * \uC0DD\uC131\uC740 \uB9C1\uD06C \uD234\uBC14\uC758 \"\uCE74\uB4DC/\uC784\uBCA0\uB4DC \uC804\uD658\"(editor.js) \uACBD\uB85C\uC774\uBA70, \uBD99\uC5EC\uB123\uAE30\uB294 \uAE30\uBCF8 \uC778\uB77C\uC778 \uB9C1\uD06C \uC815\uCC45 \uC720\uC9C0. */\r\nimport { bookmarkBlockToElement, bookmarkElementToBlock } from \"./bookmark.js\";\r\nimport { attachBookmarkControls } from \"./controls.js\";\r\n\r\nexport default {\r\n  name: \"bookmark\",\r\n  blocks: { bookmark: { toElement: bookmarkBlockToElement, fromElement: bookmarkElementToBlock } },\r\n  controls: (editorEl, ctx) => attachBookmarkControls(editorEl, ctx),\r\n};\r\n", "/**\r\n * \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \uB4F1\uB85D \uC9C0\uC810 \u2014 features/<name> \uC2A4\uD399\uC744 \uBAA8\uC740\uB2E4.\r\n * (\uBE14\uB85D/\uD655\uC7A5\uC744 \uD55C \uD3F4\uB354\uC529 \uC774\uC804\uD558\uBA70 \uCD94\uAC00. \uBBF8\uC774\uC804 \uAE30\uB2A5\uC740 \uAE30\uC874 \uBC30\uC120\uACFC \uACF5\uC874)\r\n */\r\nimport { buildRegistry } from \"./registry.js\";\r\nimport pageBreak from \"./page-break/index.js\";\r\nimport image from \"./image/index.js\";\r\nimport video from \"./video/index.js\";\r\nimport audio from \"./audio/index.js\";\r\nimport file from \"./file/index.js\";\r\nimport codeBlock from \"./code-block/index.js\";\r\nimport bookmark from \"./bookmark/index.js\";\r\n\r\nexport const FEATURES = [pageBreak, image, file, video, audio, codeBlock, bookmark];\r\nexport const registry = buildRegistry(FEATURES);\r\n", "/**\r\n * \uBB38\uC11C \uC9C1\uB82C\uD654 (P0-\u2464 \uB370\uC774\uD130 \uD30C\uD2B8): blocks[] \u2194 \uC5D0\uB514\uD130 DOM(.editor \uCEE8\uD14C\uC774\uB108).\r\n * \uBAA8\uB4E0 \uC9C1\uB82C\uD654 \uBAA8\uB4C8\uC744 \uACB0\uD569\uD558\uACE0 fontSize \uD615\uC81C\uD0A4 lift/lower\uB97C \uBB38\uC11C \uACBD\uACC4\uC5D0\uC11C \uC801\uC6A9\uD55C\uB2E4.\r\n *\r\n *  - blocksToDom(blocks, container): \uC800\uC7A5 blocks(\uD615\uC81C\uD0A4 \uD615\uD0DC) \u2192 liftFontSize \u2192 DOM\r\n *  - domToBlocks(container):         DOM \u2192 blocks \u2192 lowerFontSize(\uC800\uC7A5 \uD615\uD0DC)\r\n *\r\n * \uB77C\uC6B4\uB4DC\uD2B8\uB9BD: domToBlocks(blocksToDom(fixture)) === fixture  (EC1/EC2/EC3)\r\n *\r\n * \uD45C \uBE14\uB85D: \uB77C\uC774\uBE0C DOM \uC694\uC18C\uC5D0 `__model`(\uD45C \uBAA8\uB378)\uC744 \uBCF4\uAD00(\uC0D8\uD50C \uBC29\uC2DD). \uD45C \uBE14\uB85D props/children\uC740\r\n *   \uD604\uC7AC verbatim \uBCF4\uC874(__props/__children) \u2014 \uD45C DOM \uB80C\uB354(renderTable)\uC640 props\uC758 DOM attr\r\n *   \uB9E4\uD551(tableAlignment \uB4F1)\uC740 P3\uC5D0\uC11C \uACB0\uD569\uD55C\uB2E4.\r\n */\r\n\r\nimport { blockToElement, elementToBlock } from \"./block.js\";\r\nimport { modelToTableContent, tableContentToModel } from \"./table.js\";\r\nimport { liftFontSize, lowerFontSize } from \"./font-size.js\";\r\nimport { renderTableElement, syncModelFromTableDom } from \"../table/render.js\";\r\nimport { registry } from \"../features/index.js\"; // \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4(\uC2A4\uD399 \uB808\uC9C0\uC2A4\uD2B8\uB9AC) \u2014 \uCEE4\uC2A4\uD140 \uBE14\uB85D \uC9C1\uB82C\uD654 \uD569\uC131\r\n\r\nconst EMPTY_TABLE_CONTENT = { type: \"tableContent\", columnWidths: [], rows: [] };\r\n\r\nfunction tableBlockToElement(block) {\r\n  if (typeof document === \"undefined\") throw new Error(\"tableBlockToElement: DOM(document) \uD544\uC694\");\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"table\";\r\n  el.dataset.contentType = \"table\"; // BlockNote data-content-type \uBCC4\uCE6D(\uC18C\uBE44\uCC98 CSS \uD638\uD658)\r\n  if (block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block.props ? { ...block.props } : undefined; // verbatim \uBCF4\uC874(P3\uC5D0\uC11C DOM attr \uB9E4\uD551)\r\n  if (block.props && block.props.tableAlignment && block.props.tableAlignment !== \"left\") el.dataset.tableAlignment = block.props.tableAlignment; // \uD45C \uC804\uCCB4 \uC815\uB82C(F1)\r\n  el.__model = tableContentToModel(block.content || EMPTY_TABLE_CONTENT);\r\n  el.__children = Array.isArray(block.children) ? block.children : [];\r\n  const content = document.createElement(\"div\");\r\n  content.className = \"content\";\r\n  content.setAttribute(\"contenteditable\", \"false\");\r\n  content.appendChild(renderTableElement(el.__model)); // \uB77C\uC774\uBE0C <table> \uB80C\uB354\r\n  el.appendChild(content);\r\n  return el;\r\n}\r\n\r\nfunction tableElementToBlock(el) {\r\n  const tableEl = el.querySelector(\"table.lumir-tbl\");\r\n  if (tableEl) syncModelFromTableDom(tableEl); // \uB77C\uC774\uBE0C \uC140 \uD3B8\uC9D1 \u2192 \uBAA8\uB378 \uD68C\uC218\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"table\";\r\n  if (el.__props !== undefined) block.props = el.__props;\r\n  block.content = modelToTableContent(el.__model);\r\n  block.children = el.__children || [];\r\n  return block;\r\n}\r\n\r\n// \u2500\u2500 \uBA40\uD2F0\uCEEC\uB7FC (P4): columnList > column > \uC911\uCCA9 \uBE14\uB85D(\uD3B8\uC9D1 \uAC00\uB2A5) \u2500\u2500\r\nconst COL_PARA = () => ({ type: \"paragraph\", props: { textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" }, content: [], children: [] });\r\n\r\n/** \uCEEC\uB7FC \uC0AC\uC774 \uB108\uBE44 \uB9AC\uC0AC\uC774\uC988 \uD578\uB4E4(P9-\u2466) */\r\nfunction makeColResizeHandle() {\r\n  const h = document.createElement(\"div\");\r\n  h.className = \"lumir-col-resize\";\r\n  h.setAttribute(\"contenteditable\", \"false\");\r\n  return h;\r\n}\r\n\r\nfunction columnToElement(col) {\r\n  const c = document.createElement(\"div\");\r\n  c.className = \"lumir-column\";\r\n  c.dataset.type = \"column\";\r\n  if (col && col.id != null) c.dataset.id = String(col.id);\r\n  c.__props = col && col.props ? { ...col.props } : undefined;\r\n  const w = col && col.props && col.props.width;\r\n  c.style.flexGrow = String(w || 1);\r\n  c.style.flexShrink = \"1\";\r\n  c.style.flexBasis = \"0\";\r\n  if (w != null && w !== 1) c.dataset.columnWidth = String(w);\r\n  const kids = col && Array.isArray(col.children) ? col.children : [];\r\n  for (const b of kids) c.appendChild(blockToEl(b));\r\n  if (!c.querySelector(\":scope > .block\")) c.appendChild(blockToEl(COL_PARA())); // \uBE48 \uCEEC\uB7FC \uBC29\uC9C0\r\n  return c;\r\n}\r\nfunction columnListBlockToElement(block) {\r\n  const el = document.createElement(\"div\");\r\n  el.className = \"block\";\r\n  el.dataset.type = \"columnList\";\r\n  el.dataset.contentType = \"columnList\"; // BlockNote data-content-type \uBCC4\uCE6D(\uC18C\uBE44\uCC98 CSS \uD638\uD658)\r\n  if (block.id != null) el.dataset.id = String(block.id);\r\n  el.__props = block.props ? { ...block.props } : undefined;\r\n  const content = document.createElement(\"div\");\r\n  content.className = \"content lumir-columns\";\r\n  if (block.props && block.props.showDivider) content.classList.add(\"with-divider\"); // \uBE14\uB85D\uBCC4 \uAD6C\uBD84\uC120\r\n  content.setAttribute(\"contenteditable\", \"false\");\r\n  // 2\uB2E8\uAE4C\uC9C0\uB9CC \uC9C0\uC6D0: 3\uB2E8 \uC774\uC0C1(\uB808\uAC70\uC2DC/\uC678\uBD80 \uB370\uC774\uD130)\uC740 \uCD08\uACFC \uCEEC\uB7FC\uC758 \uBE14\uB85D\uC744 2\uBC88\uC9F8 \uCEEC\uB7FC\uC73C\uB85C \uBCD1\uD569.\r\n  let cols = Array.isArray(block.children) ? block.children : [];\r\n  if (cols.length > 2) {\r\n    const second = cols[1] || { type: \"column\", props: { width: 1 }, children: [] };\r\n    const merged = { ...second, children: [...(second.children || []), ...cols.slice(2).flatMap((c) => (c && c.children) || [])] };\r\n    cols = [cols[0], merged];\r\n  }\r\n  cols.forEach((col, i) => {\r\n    content.appendChild(columnToElement(col));\r\n    if (i < cols.length - 1) content.appendChild(makeColResizeHandle());\r\n  });\r\n  el.appendChild(content);\r\n  return el;\r\n}\r\nfunction columnElementToBlock(c) {\r\n  const col = {};\r\n  if (c.dataset.id != null) col.id = c.dataset.id;\r\n  col.type = \"column\";\r\n  const w = c.dataset.columnWidth ? parseFloat(c.dataset.columnWidth) : (c.__props && c.__props.width) || 1;\r\n  col.props = { ...(c.__props || {}), width: Number.isFinite(w) ? w : 1 };\r\n  col.children = [...c.children].filter((b) => b.classList && b.classList.contains(\"block\")).map(elToBlock);\r\n  return col;\r\n}\r\nfunction columnListElementToBlock(el) {\r\n  const block = {};\r\n  if (el.dataset.id != null) block.id = el.dataset.id;\r\n  block.type = \"columnList\";\r\n  block.props = el.__props !== undefined ? el.__props : {};\r\n  block.children = [...el.querySelectorAll(\":scope > .content > .lumir-column\")].map(columnElementToBlock);\r\n  return block;\r\n}\r\n\r\nconst CUSTOM_TO_EL = {\r\n  table: tableBlockToElement,\r\n  columnList: columnListBlockToElement,\r\n  ...registry.toEl, // \uC774\uC804\uB41C \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4: pageBreak/image/video/audio/file \uB4F1\r\n};\r\nconst CUSTOM_FROM_EL = {\r\n  table: tableElementToBlock,\r\n  columnList: columnListElementToBlock,\r\n  ...registry.fromEl, // \uC774\uC804\uB41C \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4: pageBreak/image/video/audio/file \uB4F1\r\n};\r\n\r\n/**\r\n * \uCEE4\uC2A4\uD140(\uBE44\uC81C\uB124\uB9AD) \uBE14\uB85D \uD0C0\uC785 \uC9D1\uD569 \u2014 table/columnList + \uC774\uC804\uB41C \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4(image/video/audio/file/bookmark/pageBreak \uB4F1).\r\n * \uBD99\uC5EC\uB123\uAE30 \uC815\uC81C(\uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8)\uC758 \uAD8C\uC704 \uC18C\uC2A4: \uAE30\uB2A5\uC774 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB85C \uC774\uC804\uB3FC\uB3C4 \uC790\uB3D9 \uB3D9\uAE30\uD654\uB41C\uB2E4.\r\n */\r\nexport const CUSTOM_BLOCK_TYPES = new Set(Object.keys(CUSTOM_TO_EL));\r\n\r\nfunction blockToEl(block) {\r\n  const fn = block && CUSTOM_TO_EL[block.type];\r\n  const el = fn ? fn(block) : blockToElement(block);\r\n  // \uC911\uCCA9 children(\uB4E4\uC5EC\uC4F0\uAE30/\uD558\uC704 \uB9AC\uC2A4\uD2B8) \u2014 \uCEE4\uC2A4\uD140(table/columnList \uB4F1)\uC740 \uC790\uCCB4 \uCC98\uB9AC, \uC77C\uBC18 \uBE14\uB85D\uB9CC .lumir-children\uB85C \uB80C\uB354\r\n  if (!fn && block && Array.isArray(block.children) && block.children.length) {\r\n    const kids = document.createElement(\"div\");\r\n    kids.className = \"lumir-children\";\r\n    for (const c of block.children) kids.appendChild(blockToEl(c));\r\n    el.appendChild(kids);\r\n  }\r\n  return el;\r\n}\r\n\r\n/** \uB2E8\uC77C \uBE14\uB85D \u2192 DOM \uC694\uC18C(\uD0C0\uC785\uBCC4 \uB77C\uC6B0\uD305). \uC5D0\uB514\uD130\uC758 \uD504\uB85C\uADF8\uB7A8\uC801 \uBE14\uB85D \uC0BD\uC785\uC6A9. */\r\nexport function renderBlock(block) {\r\n  return blockToEl(block);\r\n}\r\n\r\nexport function elToBlock(el) {\r\n  const fn = CUSTOM_FROM_EL[el.dataset.type];\r\n  const block = fn ? fn(el) : elementToBlock(el);\r\n  if (!fn) {\r\n    // \uC911\uCCA9 children\uC740 DOM(.lumir-children)\uC5D0\uC11C \uC77D\uC5B4 \uD3B8\uC9D1 \uB0B4\uC6A9 \uBC18\uC601 (\uC5C6\uC73C\uBA74 [])\r\n    const kidsEl = el.querySelector(\":scope > .lumir-children\");\r\n    block.children = kidsEl ? [...kidsEl.children].filter((b) => b.classList && b.classList.contains(\"block\")).map(elToBlock) : [];\r\n  }\r\n  return block;\r\n}\r\n\r\n/** \uC800\uC7A5 blocks \u2192 \uC5D0\uB514\uD130 DOM \uCEE8\uD14C\uC774\uB108(.block \uC694\uC18C\uB4E4). fontSize lift \uC801\uC6A9. */\r\nexport function blocksToDom(blocks, container) {\r\n  if (typeof document === \"undefined\") throw new Error(\"blocksToDom: DOM(document) \uD544\uC694\");\r\n  const lifted = liftFontSize(Array.isArray(blocks) ? blocks : []);\r\n  const root = container || document.createElement(\"div\");\r\n  root.innerHTML = \"\";\r\n  for (const b of lifted) root.appendChild(blockToEl(b));\r\n  return root;\r\n}\r\n\r\n/** \uC5D0\uB514\uD130 DOM \uCEE8\uD14C\uC774\uB108 \u2192 \uC800\uC7A5 blocks. fontSize lower \uC801\uC6A9(\uC800\uC7A5 \uD615\uD0DC). */\r\nexport function domToBlocks(container) {\r\n  const out = [];\r\n  const children = container ? container.children : [];\r\n  for (const el of children) {\r\n    if (el.classList && el.classList.contains(\"block\")) out.push(elToBlock(el));\r\n  }\r\n  return lowerFontSize(out);\r\n}\r\n", "/**\r\n * BlockNote \uBE14\uB85D JSON \u2192 Markdown \uBB38\uC790\uC5F4 (A2, lossy export).\r\n *\r\n * BlockNote\uC758 blocksToMarkdownLossy\uC5D0 \uB300\uC751. \uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC744 \uBCF4\uC7A5\uD558\uC9C0 \uC54A\uC73C\uBA70(\uC5D0\uB514\uD130 \uACE0\uC720\r\n * \uC18D\uC131\u00B7\uBCD1\uD569\uC140\u00B7\uC815\uB82C\u00B7\uC0C9\uC740 \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uD45C\uD604 \uBD88\uAC00) \"\uC0AC\uB78C\uC774 \uC77D\uACE0 \uC678\uBD80\uC5D0 \uBD99\uC5EC\uB123\uC744\" \uC6A9\uB3C4\uB2E4.\r\n *\r\n * \uC9C0\uC6D0: paragraph/heading(1~6)/bullet\u00B7numbered\u00B7check \uB9AC\uC2A4\uD2B8/quote/codeBlock/divider/\r\n *       pageBreak/table(GFM)/image/video\u00B7audio\u00B7file(\uB9C1\uD06C)/\r\n *       toggle(\uD5E4\uB529\u00B7\uBAA9\uB85D children)/columnList(\uD3C9\uD0C4\uD654). \uC778\uB77C\uC778: bold/italic/strike/code/link/\r\n *       hardbreak(\"\\n\").\r\n */\r\n\r\nconst LISTISH = new Set([\"bulletListItem\", \"numberedListItem\", \"checkListItem\"]);\r\n\r\nfunction escapeMd(s) {\r\n  return String(s == null ? \"\" : s).replace(/([\\\\`*_[\\]])/g, \"\\\\$1\");\r\n}\r\n\r\n/** \uC778\uB77C\uC778 \uCF58\uD150\uCE20 \uBC30\uC5F4 \u2192 \uB9C8\uD06C\uB2E4\uC6B4. opts.cell=true\uBA74 \uC904\uBC14\uAFC8\uC744 \uACF5\uBC31\uC73C\uB85C(\uD45C \uC140). */\r\nexport function inlineToMarkdown(content, opts) {\r\n  opts = opts || {};\r\n  if (!Array.isArray(content)) return \"\";\r\n  let oln = 0; // \uC140 \uB0B4 \uC21C\uC11C\uBAA9\uB85D \uC11C\uC218(best-effort)\r\n  return content\r\n    .map((node) => {\r\n      if (node && node.type === \"checkbox\") {\r\n        // \uD45C \uC140 \uCCB4\uD06C\uBC15\uC2A4\uB294 GFM \uD0DC\uC2A4\uD06C\uB9AC\uC2A4\uD2B8\uB85C \uD45C\uD604(\uBCA0\uC2A4\uD2B8\uC5D0\uD3EC\uD2B8, MD\u2192checkbox \uC5ED\uD30C\uC2F1\uC740 \uBC94\uC704 \uC678).\r\n        return node.checked ? \"[x]\" : \"[ ]\";\r\n      }\r\n      if (node && node.type === \"olItem\") { oln += 1; return `${oln}. `; }\r\n      if (node && node.type === \"ulItem\") return \"- \";\r\n      if (node && node.type === \"link\") {\r\n        const inner = inlineToMarkdown(node.content || [], opts);\r\n        return `[${inner}](${node.href != null ? node.href : \"\"})`;\r\n      }\r\n      const raw = node && node.text != null ? node.text : \"\";\r\n      const s = (node && node.styles) || {};\r\n      if (s.code) {\r\n        // \uCF54\uB4DC \uB9C8\uD06C: \uC6D0\uBB38 \uC720\uC9C0(\uBC31\uD2F1\uB9CC \uC81C\uAC70), \uB2E4\uB978 \uB9C8\uD06C\uC640 \uACB0\uD569\uD558\uC9C0 \uC54A\uC74C(lossy)\r\n        const inner = String(raw).replace(/`/g, \"\");\r\n        return \"`\" + (opts.cell ? inner.replace(/\\n/g, \" \") : inner) + \"`\";\r\n      }\r\n      let t = escapeMd(raw);\r\n      t = opts.cell ? t.replace(/\\n/g, \" \") : t.replace(/\\n/g, \"  \\n\"); // hardbreak\r\n      if (s.strike) t = `~~${t}~~`;\r\n      if (s.italic) t = `*${t}*`;\r\n      if (s.bold) t = `**${t}**`;\r\n      return t;\r\n    })\r\n    .join(\"\");\r\n}\r\n\r\nfunction codeBlockText(block) {\r\n  return (block.content || []).map((n) => (n && n.text != null ? n.text : \"\")).join(\"\");\r\n}\r\n\r\nfunction tableToMarkdown(block) {\r\n  const tc = block.content;\r\n  if (!tc || !Array.isArray(tc.rows) || !tc.rows.length) return \"\";\r\n  const rows = tc.rows.map((r) =>\r\n    (r.cells || []).map((c) => inlineToMarkdown((c && c.content) || [], { cell: true }).replace(/\\|/g, \"\\\\|\") || \" \")\r\n  );\r\n  const cols = rows.reduce((m, r) => Math.max(m, r.length), 0);\r\n  const pad = (r) => {\r\n    const a = r.slice();\r\n    while (a.length < cols) a.push(\" \");\r\n    return a;\r\n  };\r\n  const line = (cells) => \"| \" + pad(cells).map((c) => c || \" \").join(\" | \") + \" |\";\r\n  const header = line(rows[0]);\r\n  const sep = \"| \" + new Array(cols).fill(\"---\").join(\" | \") + \" |\";\r\n  const body = rows.slice(1).map(line);\r\n  return [header, sep, ...body].join(\"\\n\");\r\n}\r\n\r\nfunction prefixLines(text, prefix) {\r\n  return text\r\n    .split(\"\\n\")\r\n    .map((l) => prefix + l)\r\n    .join(\"\\n\");\r\n}\r\n\r\n// columnList\uC758 \uBAA8\uB4E0 \uC790\uC2DD(\uCEEC\uB7FC) \uBE14\uB85D\uC744 \uD55C \uC904\uAE30\uB85C \uD3C9\uD0C4\uD654\r\nfunction flattenColumns(block) {\r\n  const out = [];\r\n  (block.children || []).forEach((col) => {\r\n    (col.children || []).forEach((b) => out.push(b));\r\n  });\r\n  return out;\r\n}\r\n\r\nfunction renderBlock(block, depth, num) {\r\n  const indent = \"  \".repeat(depth);\r\n  const type = block.type;\r\n  const inline = () => inlineToMarkdown(block.content || []);\r\n  let body = \"\";\r\n\r\n  switch (type) {\r\n    case \"heading\": {\r\n      const level = Math.min(6, Math.max(1, (block.props && block.props.level) || 1));\r\n      body = \"#\".repeat(level) + \" \" + inline();\r\n      break;\r\n    }\r\n    case \"bulletListItem\":\r\n      body = indent + \"- \" + inline();\r\n      break;\r\n    case \"numberedListItem\":\r\n      body = indent + num + \". \" + inline();\r\n      break;\r\n    case \"checkListItem\":\r\n      body = indent + \"- [\" + (block.props && block.props.checked ? \"x\" : \" \") + \"] \" + inline();\r\n      break;\r\n    case \"quote\":\r\n      body = prefixLines(inline() || \"\", \"> \");\r\n      break;\r\n    case \"codeBlock\":\r\n      body = \"```\" + ((block.props && block.props.language) || \"\") + \"\\n\" + codeBlockText(block) + \"\\n```\";\r\n      break;\r\n    case \"divider\":\r\n    case \"pageBreak\":\r\n      body = \"---\";\r\n      break;\r\n    case \"image\": {\r\n      const p = block.props || {};\r\n      body = `![${p.name || p.caption || \"\"}](${p.url || \"\"})`;\r\n      if (p.caption) body += `\\n*${escapeMd(p.caption)}*`;\r\n      break;\r\n    }\r\n    case \"video\":\r\n    case \"audio\":\r\n    case \"file\": {\r\n      const p = block.props || {};\r\n      body = `[${p.name || type}](${p.url || \"\"})`;\r\n      break;\r\n    }\r\n    case \"bookmark\": {\r\n      // \uCEE4\uC2A4\uD140 \uBE14\uB85D \u2192 \uB9C1\uD06C\uB85C degrade(\uCE74\uB4DC/\uC784\uBCA0\uB4DC \uBAA8\uB450).\r\n      const p = block.props || {};\r\n      body = `[${escapeMd(p.title || p.url || \"link\")}](${p.url || \"\"})`;\r\n      break;\r\n    }\r\n    case \"table\":\r\n      body = tableToMarkdown(block);\r\n      break;\r\n    case \"columnList\":\r\n      return renderBlocks(flattenColumns(block), depth); // \uD3C9\uD0C4\uD654(\uD5E4\uB354/\uAD6C\uBD84 \uC5C6\uC74C)\r\n    case \"paragraph\":\r\n    default:\r\n      body = inline();\r\n      break;\r\n  }\r\n\r\n  // children: \uB9AC\uC2A4\uD2B8/\uD1A0\uAE00 \uB4F1 \uC911\uCCA9 \u2192 \uD55C \uB2E8\uACC4 \uB4E4\uC5EC\uC368\uC11C \uC774\uC5B4\uBD99\uC784\r\n  const kids = block.children;\r\n  if (Array.isArray(kids) && kids.length && type !== \"columnList\") {\r\n    const isList = LISTISH.has(type);\r\n    const childMd = renderBlocks(kids, isList ? depth + 1 : depth);\r\n    if (childMd) body += (isList ? \"\\n\" : \"\\n\\n\") + childMd; // \uB9AC\uC2A4\uD2B8=\uD0C0\uC774\uD2B8, \uD1A0\uAE00 \uB4F1=\uBE48 \uC904\r\n  }\r\n  return body;\r\n}\r\n\r\nfunction renderBlocks(blocks, depth) {\r\n  if (!Array.isArray(blocks)) return \"\";\r\n  const parts = [];\r\n  let num = 0;\r\n  for (const b of blocks) {\r\n    if (!b || !b.type) continue;\r\n    if (b.type === \"numberedListItem\") num += 1;\r\n    else num = 0;\r\n    parts.push({ type: b.type, md: renderBlock(b, depth, num || 1) });\r\n  }\r\n  let s = \"\";\r\n  for (let i = 0; i < parts.length; i++) {\r\n    if (i > 0) {\r\n      const a = parts[i - 1].type;\r\n      const c = parts[i].type;\r\n      s += LISTISH.has(a) && LISTISH.has(c) ? \"\\n\" : \"\\n\\n\";\r\n    }\r\n    s += parts[i].md;\r\n  }\r\n  return s;\r\n}\r\n\r\n/** \uBE14\uB85D \uBC30\uC5F4 \u2192 Markdown \uBB38\uC790\uC5F4(\uB05D\uC5D0 \uAC1C\uD589 1\uAC1C). */\r\nexport function blocksToMarkdown(blocks) {\r\n  const body = renderBlocks(blocks || [], 0).replace(/\\s+$/, \"\");\r\n  return body ? body + \"\\n\" : \"\";\r\n}\r\n\r\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \uAC00\uC838\uC624\uAE30(import) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Markdown \uBB38\uC790\uC5F4 \u2192 BlockNote \uBE14\uB85D \uBC30\uC5F4 (A2, lossy). \uB77C\uC778 \uAE30\uBC18 + \uC778\uB77C\uC778 \uC7AC\uADC0 \uD30C\uC11C.\r\n\r\nconst BASE_P = () => ({ textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" });\r\n\r\nfunction mergeAdjacent(items) {\r\n  const out = [];\r\n  for (const it of items) {\r\n    const prev = out[out.length - 1];\r\n    if (prev && prev.type === \"text\" && it.type === \"text\" && JSON.stringify(prev.styles) === JSON.stringify(it.styles))\r\n      prev.text += it.text;\r\n    else out.push(it);\r\n  }\r\n  return out;\r\n}\r\n\r\n// \uC778\uB77C\uC778 \uD328\uD134(\uC2AC\uB77C\uC774\uC2A4 \uC2DC\uC791\uC5D0 \uC575\uCEE4). \uC21C\uC11C: code \u2192 \uAD75\uAC8C(**,__) \u2192 \uCDE8\uC18C \u2192 \uAE30\uC6B8\uC784(*,_) \u2192 \uB9C1\uD06C\r\nconst INLINE_PATTERNS = [\r\n  { re: /^`([^`]+)`/, style: \"code\", raw: true },\r\n  { re: /^\\*\\*([\\s\\S]+?)\\*\\*/, style: \"bold\" },\r\n  { re: /^__([\\s\\S]+?)__/, style: \"bold\" },\r\n  { re: /^~~([\\s\\S]+?)~~/, style: \"strike\" },\r\n  { re: /^\\*([\\s\\S]+?)\\*/, style: \"italic\" },\r\n  { re: /^_([\\s\\S]+?)_/, style: \"italic\" },\r\n  { re: /^\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/, link: true },\r\n];\r\n\r\n/** Markdown \uC778\uB77C\uC778 \uD14D\uC2A4\uD2B8 \u2192 inline content \uBC30\uC5F4. */\r\nexport function parseInlineMarkdown(text) {\r\n  const out = [];\r\n  let buf = \"\";\r\n  let i = 0;\r\n  const flush = () => {\r\n    if (buf) out.push({ type: \"text\", text: buf, styles: {} });\r\n    buf = \"\";\r\n  };\r\n  while (i < text.length) {\r\n    const slice = text.slice(i);\r\n    let hit = null;\r\n    for (const p of INLINE_PATTERNS) {\r\n      const m = p.re.exec(slice);\r\n      if (m) {\r\n        hit = { p, m };\r\n        break;\r\n      }\r\n    }\r\n    if (!hit) {\r\n      buf += text[i];\r\n      i++;\r\n      continue;\r\n    }\r\n    flush();\r\n    const { p, m } = hit;\r\n    if (p.link) {\r\n      out.push({ type: \"link\", href: m[2], content: mergeAdjacent(parseInlineMarkdown(m[1])) });\r\n    } else if (p.raw) {\r\n      out.push({ type: \"text\", text: m[1], styles: { code: true } });\r\n    } else {\r\n      const inner = parseInlineMarkdown(m[1]);\r\n      for (const n of inner) {\r\n        if (n.type === \"text\") n.styles = { ...n.styles, [p.style]: true };\r\n        out.push(n);\r\n      }\r\n    }\r\n    i += m[0].length;\r\n  }\r\n  flush();\r\n  return mergeAdjacent(out);\r\n}\r\n\r\nconst HR_RE = /^(-{3,}|\\*{3,}|_{3,})$/;\r\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/;\r\nconst LIST_RE = /^(\\s*)([-*+]|\\d+\\.)\\s+(.*)$/;\r\nconst FENCE_RE = /^```(.*)$/;\r\n\r\nfunction isBlockStart(line) {\r\n  const t = line.trim();\r\n  return (\r\n    t === \"\" ||\r\n    HR_RE.test(t) ||\r\n    HEADING_RE.test(line) ||\r\n    LIST_RE.test(line) ||\r\n    /^>\\s?/.test(line) ||\r\n    FENCE_RE.test(t) ||\r\n    /^\\|.*\\|$/.test(t)\r\n  );\r\n}\r\n\r\nfunction listItemBlock(marker, rest) {\r\n  let type, props;\r\n  const check = /^\\[([ xX])\\]\\s+(.*)$/.exec(rest);\r\n  if (/^\\d+\\./.test(marker)) {\r\n    type = \"numberedListItem\";\r\n    props = BASE_P();\r\n    const n = parseInt(marker, 10);\r\n    if (n && n !== 1) props.start = n;\r\n  } else if (check) {\r\n    type = \"checkListItem\";\r\n    props = { ...BASE_P(), checked: check[1].toLowerCase() === \"x\" };\r\n    rest = check[2];\r\n  } else {\r\n    type = \"bulletListItem\";\r\n    props = BASE_P();\r\n  }\r\n  return { type, props, content: parseInlineMarkdown(rest), children: [] };\r\n}\r\n\r\nfunction joinParagraph(lines) {\r\n  let s = \"\";\r\n  for (let k = 0; k < lines.length; k++) {\r\n    if (k > 0) s += /\\s{2,}$/.test(lines[k - 1]) ? \"\\n\" : \" \"; // \uC904\uB05D 2\uCE78 = hardbreak\r\n    s += lines[k].replace(/\\s+$/, \"\");\r\n  }\r\n  return s;\r\n}\r\n\r\n/** Markdown \uBB38\uC790\uC5F4 \u2192 BlockNote \uBE14\uB85D \uBC30\uC5F4. */\r\nexport function markdownToBlocks(md) {\r\n  const lines = String(md == null ? \"\" : md).replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n  const blocks = [];\r\n  let i = 0;\r\n  while (i < lines.length) {\r\n    const line = lines[i];\r\n    const trimmed = line.trim();\r\n\r\n    // \uD39C\uC2A4 \uCF54\uB4DC\uBE14\uB85D\r\n    const fence = FENCE_RE.exec(trimmed);\r\n    if (fence) {\r\n      const lang = fence[1].trim();\r\n      const code = [];\r\n      i++;\r\n      while (i < lines.length && !/^```/.test(lines[i].trim())) {\r\n        code.push(lines[i]);\r\n        i++;\r\n      }\r\n      i++; // \uB2EB\uB294 \uD39C\uC2A4\r\n      blocks.push({\r\n        type: \"codeBlock\",\r\n        props: { language: lang },\r\n        content: code.length ? [{ type: \"text\", text: code.join(\"\\n\"), styles: {} }] : [],\r\n        children: [],\r\n      });\r\n      continue;\r\n    }\r\n\r\n    if (trimmed === \"\") {\r\n      i++;\r\n      continue;\r\n    }\r\n\r\n    if (HR_RE.test(trimmed)) {\r\n      blocks.push({ type: \"divider\", props: {}, content: [], children: [] });\r\n      i++;\r\n      continue;\r\n    }\r\n\r\n    const h = HEADING_RE.exec(line);\r\n    if (h) {\r\n      blocks.push({ type: \"heading\", props: { ...BASE_P(), level: h[1].length }, content: parseInlineMarkdown(h[2]), children: [] });\r\n      i++;\r\n      continue;\r\n    }\r\n\r\n    // \uC778\uC6A9(\uC5F0\uC18D > \uBB36\uC74C)\r\n    if (/^>\\s?/.test(line)) {\r\n      const q = [];\r\n      while (i < lines.length && /^>\\s?/.test(lines[i])) {\r\n        q.push(lines[i].replace(/^>\\s?/, \"\"));\r\n        i++;\r\n      }\r\n      blocks.push({ type: \"quote\", props: BASE_P(), content: parseInlineMarkdown(joinParagraph(q)), children: [] });\r\n      continue;\r\n    }\r\n\r\n    // \uD45C(\uD5E4\uB354\uD589 + \uAD6C\uBD84\uD589)\r\n    if (/^\\|.*\\|$/.test(trimmed) && i + 1 < lines.length && /^\\|?[\\s:|-]*-{2,}[\\s:|-]*\\|?$/.test(lines[i + 1].trim())) {\r\n      const splitRow = (l) => l.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\").split(\"|\").map((c) => c.trim());\r\n      const rowsRaw = [splitRow(lines[i])];\r\n      i += 2; // \uD5E4\uB354 + \uAD6C\uBD84\uD589\r\n      while (i < lines.length && /^\\|.*\\|$/.test(lines[i].trim())) {\r\n        rowsRaw.push(splitRow(lines[i]));\r\n        i++;\r\n      }\r\n      const cols = rowsRaw.reduce((m, r) => Math.max(m, r.length), 0);\r\n      const rows = rowsRaw.map((cells) => {\r\n        const padded = cells.slice();\r\n        while (padded.length < cols) padded.push(\"\");\r\n        return {\r\n          cells: padded.map((c) => ({\r\n            type: \"tableCell\",\r\n            props: { colspan: 1, rowspan: 1 },\r\n            content: parseInlineMarkdown(c.replace(/\\\\\\|/g, \"|\")),\r\n          })),\r\n        };\r\n      });\r\n      blocks.push({\r\n        type: \"table\",\r\n        props: {},\r\n        content: { type: \"tableContent\", columnWidths: new Array(cols).fill(null), rows },\r\n        children: [],\r\n      });\r\n      continue;\r\n    }\r\n\r\n    // \uB2E8\uB3C5 \uC774\uBBF8\uC9C0\r\n    const img = /^!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)$/.exec(trimmed);\r\n    if (img) {\r\n      const props = { url: img[2] };\r\n      if (img[1]) {\r\n        props.name = img[1];\r\n        props.caption = img[1];\r\n      }\r\n      blocks.push({ type: \"image\", props, content: [], children: [] });\r\n      i++;\r\n      continue;\r\n    }\r\n\r\n    // \uB9AC\uC2A4\uD2B8(\uC5F0\uC18D \uD56D\uBAA9; \uB4E4\uC5EC\uC4F0\uAE30 2\uCE78\uB2F9 \uD55C \uB2E8\uACC4 \uC911\uCCA9)\r\n    const li = LIST_RE.exec(line);\r\n    if (li) {\r\n      const stack = []; // [{ indent, block }]\r\n      while (i < lines.length && LIST_RE.test(lines[i])) {\r\n        const mm = LIST_RE.exec(lines[i]);\r\n        const indent = mm[1].replace(/\\t/g, \"  \").length;\r\n        const block = listItemBlock(mm[2], mm[3]);\r\n        while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop();\r\n        if (stack.length) stack[stack.length - 1].block.children.push(block);\r\n        else blocks.push(block);\r\n        stack.push({ indent, block });\r\n        i++;\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // \uBB38\uB2E8(\uBE48 \uC904 \uB610\uB294 \uB2E4\uC74C \uBE14\uB85D \uC2DC\uC791 \uC804\uAE4C\uC9C0)\r\n    const para = [line];\r\n    i++;\r\n    while (i < lines.length && lines[i].trim() !== \"\" && !isBlockStart(lines[i])) {\r\n      para.push(lines[i]);\r\n      i++;\r\n    }\r\n    blocks.push({ type: \"paragraph\", props: BASE_P(), content: parseInlineMarkdown(joinParagraph(para)), children: [] });\r\n  }\r\n  return blocks;\r\n}\r\n", "/**\r\n * \uC0C9\uC0C1 \uD314\uB808\uD2B8 (\uD638\uD658) \u2014 kingdoo-editor constants/colors.ts \uC774\uC2DD.\r\n * \uAE30\uC874 \uD504\uB85C\uC81D\uD2B8\uAC00 import { TEXT_COLORS, BACKGROUND_COLORS, getHexFromColorValue } \uD558\uB358 \uAC83\uC744 \uADF8\uB300\uB85C \uC9C0\uC6D0.\r\n */\r\n\r\n/** @typedef {{ name: string, value: string, hex: string }} ColorItem */\r\n\r\nexport const TEXT_COLORS = [\r\n  { name: '\uAE30\uBCF8', value: 'default', hex: '#3f3f3f' },\r\n  { name: '\uD68C\uC0C9', value: 'gray', hex: '#9b9a97' },\r\n  { name: '\uAC08\uC0C9', value: 'brown', hex: '#64473a' },\r\n  { name: '\uBE68\uAC04\uC0C9', value: 'red', hex: '#e03e3e' },\r\n  { name: '\uC8FC\uD669\uC0C9', value: 'orange', hex: '#d9730d' },\r\n  { name: '\uB178\uB780\uC0C9', value: 'yellow', hex: '#dfab01' },\r\n  { name: '\uCD08\uB85D\uC0C9', value: 'green', hex: '#4d6461' },\r\n  { name: '\uD30C\uB780\uC0C9', value: 'blue', hex: '#0b6e99' },\r\n  { name: '\uBCF4\uB77C\uC0C9', value: 'purple', hex: '#6940a5' },\r\n  { name: '\uBD84\uD64D\uC0C9', value: 'pink', hex: '#ad1a72' },\r\n];\r\n\r\nexport const BACKGROUND_COLORS = [\r\n  { name: '\uAE30\uBCF8', value: 'default', hex: 'transparent' },\r\n  { name: '\uD68C\uC0C9', value: 'gray', hex: '#ebeced' },\r\n  { name: '\uAC08\uC0C9', value: 'brown', hex: '#e9e5e3' },\r\n  { name: '\uBE68\uAC04\uC0C9', value: 'red', hex: '#fbe4e4' },\r\n  { name: '\uC8FC\uD669\uC0C9', value: 'orange', hex: '#f6e9d9' },\r\n  { name: '\uB178\uB780\uC0C9', value: 'yellow', hex: '#fbf3db' },\r\n  { name: '\uCD08\uB85D\uC0C9', value: 'green', hex: '#ddedea' },\r\n  { name: '\uD30C\uB780\uC0C9', value: 'blue', hex: '#ddebf1' },\r\n  { name: '\uBCF4\uB77C\uC0C9', value: 'purple', hex: '#eae4f2' },\r\n  { name: '\uBD84\uD64D\uC0C9', value: 'pink', hex: '#f4dfeb' },\r\n];\r\n\r\n/** named value \u2192 hex (type: \"text\" | \"background\") */\r\nexport function getHexFromColorValue(value, type) {\r\n  const list = type === 'background' ? BACKGROUND_COLORS : TEXT_COLORS;\r\n  const found = list.find((c) => c.value === value);\r\n  return found ? found.hex : type === 'background' ? 'transparent' : '#000000';\r\n}\r\n", "/**\r\n * BlockNote \uBE14\uB85D JSON \u2192 \uC678\uBD80 \uC774\uC2DD\uC6A9 HTML (A3).\r\n *\r\n * BlockNote\uC758 blocksToHTMLLossy(ExternalHTMLExporter) + blocksToFullHTML \uB300\uC751.\r\n *  - blocksToHtml(blocks): \uC2DC\uB9E8\uD2F1 HTML \uC870\uAC01(<h1>/<p>/<ul>/<table>/<pre> \u2026). \uC0C9\uC740 \uC2E4\uC81C hex,\r\n *    \uAE00\uC790\uD06C\uAE30\uB294 \uC778\uB77C\uC778 style, \uD1A0\uAE00\uC740 <details>/<summary>, \uD45C\uB294 colspan/rowspan.\r\n *  - blocksToFullHtml(blocks, {title}): \uC704 \uC870\uAC01\uC744 <!doctype html> \uBB38\uC11C\uB85C \uAC10\uC2F8\uACE0 \uCD5C\uC18C \uC2A4\uD0C0\uC77C \uD3EC\uD568.\r\n *\r\n * \uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC744 \uBCF4\uC7A5\uD558\uC9C0 \uC54A\uB294\uB2E4(\uC678\uBD80 \uBCF5\uC0AC/\uACF5\uC720\uC6A9). \uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC740 blocks\u2194DOM(JSON)\uC774 \uB2F4\uB2F9.\r\n */\r\nimport { getHexFromColorValue } from \"../constants/colors.js\";\r\nimport { neutralizeUrl } from \"../utils/url.js\";\r\n\r\nfunction esc(s) {\r\n  return String(s == null ? \"\" : s)\r\n    .replace(/&/g, \"&amp;\")\r\n    .replace(/</g, \"&lt;\")\r\n    .replace(/>/g, \"&gt;\");\r\n}\r\nfunction escAttr(s) {\r\n  return String(s == null ? \"\" : s).replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\r\n}\r\n\r\nconst LIST_TYPES = new Set([\"bulletListItem\", \"numberedListItem\", \"checkListItem\"]);\r\n\r\n/** styled-text \uD55C \uB178\uB4DC \u2192 HTML(\uC678\u2192\uB0B4 \uC911\uCCA9). \uC0C9\uC740 \uC2E4\uC81C hex, fontSize\uB294 style. */\r\nfunction styledToHtml(node) {\r\n  let html = esc(node && node.text != null ? node.text : \"\").replace(/\\n/g, \"<br>\");\r\n  const s = (node && node.styles) || {};\r\n  if (s.code) html = `<code>${html}</code>`;\r\n  if (s.strike) html = `<s>${html}</s>`;\r\n  if (s.underline) html = `<u>${html}</u>`;\r\n  if (s.italic) html = `<em>${html}</em>`;\r\n  if (s.bold) html = `<strong>${html}</strong>`;\r\n  if (s.fontSize) html = `<span style=\"font-size:${escAttr(s.fontSize)}\">${html}</span>`;\r\n  if (s.backgroundColor && s.backgroundColor !== \"default\")\r\n    html = `<span style=\"background-color:${escAttr(getHexFromColorValue(s.backgroundColor, \"background\"))}\">${html}</span>`;\r\n  if (s.textColor && s.textColor !== \"default\")\r\n    html = `<span style=\"color:${escAttr(getHexFromColorValue(s.textColor, \"text\"))}\">${html}</span>`;\r\n  return html;\r\n}\r\n\r\nexport function inlineToHtml(content) {\r\n  if (!Array.isArray(content)) return \"\";\r\n  let oln = 0; // \uC140 \uB0B4 \uC21C\uC11C\uBAA9\uB85D \uC11C\uC218(best-effort \u2014 \uD638\uCD9C\uB2F9=\uCF58\uD150\uCE20 \uBC30\uC5F4\uB2F9 \uB9AC\uC14B)\r\n  return content\r\n    .map((node) => {\r\n      if (node && node.type === \"checkbox\") {\r\n        return `<input type=\"checkbox\" disabled${node.checked ? \" checked\" : \"\"}>`;\r\n      }\r\n      if (node && node.type === \"olItem\") { oln += 1; return `${oln}. `; }\r\n      if (node && node.type === \"ulItem\") return \"\u2022 \";\r\n      if (node && node.type === \"link\") {\r\n        const inner = inlineToHtml(node.content || []);\r\n        return `<a href=\"${escAttr(neutralizeUrl(node.href))}\">${inner}</a>`;\r\n      }\r\n      return styledToHtml(node);\r\n    })\r\n    .join(\"\");\r\n}\r\n\r\nfunction blockStyle(props) {\r\n  const st = [];\r\n  if (props) {\r\n    if (props.textAlignment && props.textAlignment !== \"left\") st.push(`text-align:${props.textAlignment}`);\r\n    if (props.textColor && props.textColor !== \"default\") st.push(`color:${getHexFromColorValue(props.textColor, \"text\")}`);\r\n    if (props.backgroundColor && props.backgroundColor !== \"default\")\r\n      st.push(`background-color:${getHexFromColorValue(props.backgroundColor, \"background\")}`);\r\n  }\r\n  return st.length ? ` style=\"${escAttr(st.join(\";\"))}\"` : \"\";\r\n}\r\n\r\nfunction codeText(block) {\r\n  return (block.content || []).map((n) => (n && n.text != null ? n.text : \"\")).join(\"\");\r\n}\r\n\r\n/** \uC140 props \u2192 style \uC18D\uC131(\uC0C9\u00B7\uC815\uB82C\u00B7\uC138\uB85C\uC815\uB82C). \uAC12\uC774 \uC5C6\uC73C\uBA74 \"\" (\uBB34\uC2A4\uD0C0\uC77C \uD45C\uB294 \uAE30\uC874 \uCD9C\uB825\uACFC \uB3D9\uC77C). */\r\nfunction tableCellStyle(p) {\r\n  const st = [];\r\n  if (p.backgroundColor && p.backgroundColor !== \"default\")\r\n    st.push(`background-color:${getHexFromColorValue(p.backgroundColor, \"background\")}`);\r\n  if (p.textColor && p.textColor !== \"default\") st.push(`color:${getHexFromColorValue(p.textColor, \"text\")}`);\r\n  if (p.textAlignment && p.textAlignment !== \"left\") st.push(`text-align:${p.textAlignment}`);\r\n  if (p.verticalAlignment && p.verticalAlignment !== \"top\") st.push(`vertical-align:${p.verticalAlignment}`);\r\n  return st.length ? ` style=\"${escAttr(st.join(\";\"))}\"` : \"\";\r\n}\r\n\r\n// \uD45C \u2192 HTML(\uBB34\uC190\uC2E4 \uC9C0\uD5A5): colgroup \uD3ED, \uC140 \uC0C9/\uC815\uB82C/\uC138\uB85C\uC815\uB82C, \uD589 \uB192\uC774, \uBA38\uB9AC\uD589/\uC5F4(thead/th scope),\r\n// \uD45C \uC815\uB82C(margin). \uC2A4\uD0C0\uC77C/\uD3ED/\uBA38\uB9AC\uAC00 \uC804\uD600 \uC5C6\uC73C\uBA74 `<table><tbody>\u2026</tbody></table>`\uB85C degrade(\uBD99\uC5EC\uB123\uAE30 \uD30C\uC11C\uC640 \uB300\uCE6D).\r\nfunction tableToHtml(block) {\r\n  const tc = block.content;\r\n  if (!tc || !Array.isArray(tc.rows)) return \"\";\r\n  const headerRows = tc.headerRows || 0;\r\n  const headerCols = tc.headerCols || 0;\r\n  const cw = Array.isArray(tc.columnWidths) ? tc.columnWidths : [];\r\n  const colgroup = cw.some((w) => w)\r\n    ? `<colgroup>${cw.map((w) => (w ? `<col style=\"width:${parseInt(w, 10)}px\">` : \"<col>\")).join(\"\")}</colgroup>`\r\n    : \"\";\r\n\r\n  const renderRow = (r, rowIdx) => {\r\n    const cells = (r.cells || [])\r\n      .map((c, cellIdx) => {\r\n        const p = (c && c.props) || {};\r\n        const span =\r\n          (p.colspan && p.colspan > 1 ? ` colspan=\"${p.colspan}\"` : \"\") +\r\n          (p.rowspan && p.rowspan > 1 ? ` rowspan=\"${p.rowspan}\"` : \"\");\r\n        const isHeaderRow = rowIdx < headerRows;\r\n        const isHeaderCol = cellIdx < headerCols;\r\n        const tag = isHeaderRow || isHeaderCol ? \"th\" : \"td\";\r\n        const scope = isHeaderRow ? ' scope=\"col\"' : isHeaderCol ? ' scope=\"row\"' : \"\";\r\n        return `<${tag}${scope}${span}${tableCellStyle(p)}>${inlineToHtml((c && c.content) || [])}</${tag}>`;\r\n      })\r\n      .join(\"\");\r\n    const rh = (r.cells || []).reduce((h, c) => Math.max(h, (c && c.props && c.props.rowHeight) || 0), 0);\r\n    const trStyle = rh > 0 ? ` style=\"height:${parseInt(rh, 10)}px\"` : \"\";\r\n    return `<tr${trStyle}>${cells}</tr>`;\r\n  };\r\n\r\n  const rowsHtml = tc.rows.map(renderRow);\r\n  let body;\r\n  if (headerRows > 0) {\r\n    const rest = rowsHtml.slice(headerRows).join(\"\");\r\n    body = `<thead>${rowsHtml.slice(0, headerRows).join(\"\")}</thead>` + (rest ? `<tbody>${rest}</tbody>` : \"\");\r\n  } else {\r\n    body = `<tbody>${rowsHtml.join(\"\")}</tbody>`;\r\n  }\r\n\r\n  const ta = block.props && block.props.tableAlignment;\r\n  const tstyle =\r\n    ta === \"center\" ? ' style=\"margin-left:auto;margin-right:auto\"' : ta === \"right\" ? ' style=\"margin-left:auto\"' : \"\";\r\n  return `<table${tstyle}>${colgroup}${body}</table>`;\r\n}\r\n\r\nfunction renderListItem(block) {\r\n  let inner = inlineToHtml(block.content || []);\r\n  if (block.type === \"checkListItem\") {\r\n    const checked = block.props && block.props.checked ? \" checked\" : \"\";\r\n    inner = `<input type=\"checkbox\" disabled${checked}> ${inner}`;\r\n  }\r\n  const kids = Array.isArray(block.children) && block.children.length ? renderBlocks(block.children) : \"\";\r\n  return `<li>${inner}${kids}</li>`;\r\n}\r\n\r\n// \uD1A0\uAE00(heading isToggle / toggleListItem) \u2192 <details><summary>\uC81C\uBAA9</summary>\uBCF8\uBB38</details>\r\nfunction toggleToHtml(block, summaryHtml) {\r\n  const kids = Array.isArray(block.children) && block.children.length ? renderBlocks(block.children) : \"\";\r\n  return `<details open><summary>${summaryHtml}</summary>${kids}</details>`;\r\n}\r\n\r\nfunction renderBlock(block) {\r\n  const type = block.type;\r\n  const p = block.props || {};\r\n  const inline = () => inlineToHtml(block.content || []);\r\n\r\n  switch (type) {\r\n    case \"heading\": {\r\n      const level = Math.min(6, Math.max(1, p.level || 1));\r\n      const h = `<h${level}${blockStyle(p)}>${inline()}</h${level}>`;\r\n      return p.isToggleable ? toggleToHtml(block, h) : h;\r\n    }\r\n    case \"quote\":\r\n      return `<blockquote${blockStyle(p)}>${inline()}</blockquote>`;\r\n    case \"codeBlock\": {\r\n      const cls = p.language ? ` class=\"language-${escAttr(p.language)}\"` : \"\";\r\n      return `<pre><code${cls}>${esc(codeText(block))}</code></pre>`;\r\n    }\r\n    case \"divider\":\r\n    case \"pageBreak\":\r\n      return \"<hr>\";\r\n    case \"image\": {\r\n      const img = `<img src=\"${escAttr(neutralizeUrl(p.url))}\" alt=\"${escAttr(p.name || p.caption || \"\")}\"${\r\n        p.previewWidth ? ` width=\"${parseInt(p.previewWidth, 10) || \"\"}\"` : \"\"\r\n      }>`;\r\n      return p.caption ? `<figure>${img}<figcaption>${esc(p.caption)}</figcaption></figure>` : `<figure>${img}</figure>`;\r\n    }\r\n    case \"video\":\r\n      return `<video controls src=\"${escAttr(neutralizeUrl(p.url))}\"></video>`;\r\n    case \"audio\":\r\n      return `<audio controls src=\"${escAttr(neutralizeUrl(p.url))}\"></audio>`;\r\n    case \"file\":\r\n      return `<a href=\"${escAttr(neutralizeUrl(p.url))}\">${esc(p.name || \"file\")}</a>`;\r\n    case \"bookmark\":\r\n      // \uCEE4\uC2A4\uD140 \uBE14\uB85D \u2192 \uC774\uC2DD\uC6A9 HTML \uC740 \uB9C1\uD06C\uB85C degrade(\uCE74\uB4DC/\uC784\uBCA0\uB4DC \uBAA8\uB450).\r\n      return `<p><a href=\"${escAttr(neutralizeUrl(p.url))}\">${esc(p.title || p.url || \"link\")}</a></p>`;\r\n    case \"table\":\r\n      return tableToHtml(block);\r\n    case \"toggleListItem\":\r\n      return toggleToHtml(block, inline());\r\n    case \"columnList\": {\r\n      const cols = (block.children || [])\r\n        .map((col) => `<div class=\"lumir-column\">${renderBlocks(col.children || [])}</div>`)\r\n        .join(\"\");\r\n      return `<div class=\"lumir-columns\" style=\"display:flex;gap:16px\">${cols}</div>`;\r\n    }\r\n    case \"paragraph\":\r\n    default: {\r\n      const body = inline();\r\n      return `<p${blockStyle(p)}>${body || \"<br>\"}</p>`;\r\n    }\r\n  }\r\n}\r\n\r\nfunction renderBlocks(blocks) {\r\n  if (!Array.isArray(blocks)) return \"\";\r\n  let html = \"\";\r\n  let i = 0;\r\n  while (i < blocks.length) {\r\n    const t = blocks[i].type;\r\n    if (LIST_TYPES.has(t)) {\r\n      const tag = t === \"numberedListItem\" ? \"ol\" : \"ul\";\r\n      const cls = t === \"checkListItem\" ? ' class=\"lumir-checklist\"' : \"\";\r\n      let startAttr = \"\";\r\n      if (t === \"numberedListItem\" && blocks[i].props && blocks[i].props.start && blocks[i].props.start !== 1)\r\n        startAttr = ` start=\"${parseInt(blocks[i].props.start, 10)}\"`;\r\n      let j = i;\r\n      const items = [];\r\n      while (j < blocks.length && blocks[j].type === t) {\r\n        items.push(renderListItem(blocks[j]));\r\n        j++;\r\n      }\r\n      html += `<${tag}${cls}${startAttr}>${items.join(\"\")}</${tag}>`;\r\n      i = j;\r\n    } else {\r\n      html += renderBlock(blocks[i]);\r\n      i++;\r\n    }\r\n  }\r\n  return html;\r\n}\r\n\r\n/** \uBE14\uB85D \uBC30\uC5F4 \u2192 \uC2DC\uB9E8\uD2F1 HTML \uC870\uAC01(\uC678\uBD80 \uC774\uC2DD\uC6A9). */\r\nexport function blocksToHtml(blocks) {\r\n  return renderBlocks(blocks || []);\r\n}\r\n\r\nconst DEFAULT_DOC_STYLE =\r\n  \"body{font-family:ui-sans-serif,system-ui,sans-serif;line-height:1.6;max-width:720px;margin:40px auto;padding:0 16px;color:#1f1f1f}\" +\r\n  \"img{max-width:100%}table{border-collapse:collapse}td,th{border:1px solid #ddd;padding:6px 10px}\" +\r\n  \"pre{background:#f6f5f1;border:1px solid #e7e5e4;border-radius:7px;padding:12px 14px;overflow:auto}\" +\r\n  \"blockquote{border-left:3px solid #ddd;margin:0;padding-left:14px;color:#555}\" +\r\n  \".lumir-checklist{list-style:none;padding-left:1.2em}.lumir-columns>.lumir-column{flex:1}\";\r\n\r\n/** \uBE14\uB85D \uBC30\uC5F4 \u2192 \uB2E8\uB3C5 \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC804\uCCB4 HTML \uBB38\uC11C \uBB38\uC790\uC5F4. */\r\nexport function blocksToFullHtml(blocks, opts) {\r\n  opts = opts || {};\r\n  const title = escAttr(opts.title || \"Document\");\r\n  const style = opts.style != null ? opts.style : DEFAULT_DOC_STYLE;\r\n  return (\r\n    \"<!doctype html>\\n\" +\r\n    `<html lang=\"ko\">\\n<head>\\n<meta charset=\"utf-8\">\\n` +\r\n    `<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\\n` +\r\n    `<title>${title}</title>\\n` +\r\n    (style ? `<style>${style}</style>\\n` : \"\") +\r\n    `</head>\\n<body>\\n${blocksToHtml(blocks)}\\n</body>\\n</html>\\n`\r\n  );\r\n}\r\n", "/**\r\n * SVG \uC544\uC774\uCF58 \uC138\uD2B8 \u2014 kingdoo-editor\uC758 FloatingMenu/Icons.tsx\uC640 \uB3D9\uC77C\uD55C \uACBD\uB85C(Material Design).\r\n * currentColor \uC0C1\uC18D + \uD06C\uAE30\uB294 CSS(svg{width/height})\uB85C \uC81C\uC5B4. \uC11C\uC2DD\uD234\uBC14\u00B7\uD50C\uB85C\uD305\uBA54\uB274\u00B7\uC2AC\uB798\uC2DC \uACF5\uC6A9.\r\n */\r\n\r\nconst svg = (inner, vb = '0 0 24 24') =>\r\n  `<svg viewBox=\"${vb}\" fill=\"currentColor\" aria-hidden=\"true\">${inner}</svg>`;\r\n\r\n// \uD234\uBC14 \uC561\uC158 \uC544\uC774\uCF58\r\nexport const ICON = {\r\n  undo: svg(\r\n    '<path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\"/>',\r\n  ),\r\n  redo: svg(\r\n    '<path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\"/>',\r\n  ),\r\n  bold: svg(\r\n    '<path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/>',\r\n  ),\r\n  italic: svg('<path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/>'),\r\n  underline: svg(\r\n    '<path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/>',\r\n  ),\r\n  strikethrough: svg(\r\n    '<path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"/>',\r\n  ),\r\n  code: svg(\r\n    '<path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/>',\r\n  ),\r\n  alignLeft: svg(\r\n    '<path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/>',\r\n  ),\r\n  alignCenter: svg(\r\n    '<path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/>',\r\n  ),\r\n  alignRight: svg(\r\n    '<path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/>',\r\n  ),\r\n  textColor: svg(\r\n    '<path d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"/>',\r\n  ),\r\n  bgColor: svg(\r\n    '<path d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z\"/><path fill-opacity=\".36\" d=\"M0 20h24v4H0z\"/>',\r\n  ),\r\n  link: svg(\r\n    '<path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/>',\r\n  ),\r\n  image: svg(\r\n    '<path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>',\r\n  ),\r\n  table: svg(\r\n    '<path d=\"M20 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM10 17H5v-2h5v2zm0-4H5v-2h5v2zm0-4H5V7h5v2zm9 8h-7v-2h7v2zm0-4h-7v-2h7v2zm0-4h-7V7h7v2z\"/>',\r\n  ),\r\n  expandMore: svg('<path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"/>'),\r\n  chevronRight: svg(\r\n    '<path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>',\r\n  ),\r\n  chevronLeft: svg('<path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>'),\r\n  outdent: svg(\r\n    '<path d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/>',\r\n  ),\r\n  indent: svg(\r\n    '<path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/>',\r\n  ),\r\n};\r\n\r\n// \uBE14\uB85D \uD0C0\uC785 \uC544\uC774\uCF58(\uC2AC\uB798\uC2DC\u00B7\uBE14\uB85D\uD0C0\uC785 \uB4DC\uB86D\uB2E4\uC6B4). \uC81C\uBAA9(h1~6)\uC740 \uD14D\uC2A4\uD2B8 \uBC30\uC9C0.\r\nexport const BLOCK_ICON = {\r\n  paragraph: svg('<path d=\"M5 5h14v2H5zM5 11h14v2H5zM5 17h10v2H5z\"/>'),\r\n  quote: svg('<path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/>'),\r\n  codeBlock: svg(\r\n    '<path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/>',\r\n  ),\r\n  bulletListItem: svg(\r\n    '<circle cx=\"4\" cy=\"6\" r=\"1.5\"/><circle cx=\"4\" cy=\"12\" r=\"1.5\"/><circle cx=\"4\" cy=\"18\" r=\"1.5\"/><path d=\"M8 5h12v2H8zM8 11h12v2H8zM8 17h12v2H8z\"/>',\r\n  ),\r\n  numberedListItem: svg(\r\n    '<path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/>',\r\n  ),\r\n  checkListItem: svg(\r\n    '<rect x=\"3\" y=\"4\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M4.5 7l1.5 1.5 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M12 6h8v2h-8z\"/><rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M12 16h8v2h-8z\"/>',\r\n  ),\r\n  toggleListItem: svg(\r\n    '<path d=\"M10 6h10v2H10zM10 11h10v2H10zM10 16h10v2H10z\"/><path d=\"M4 8l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\r\n  ),\r\n  image: svg(\r\n    '<path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>',\r\n  ),\r\n  video: svg(\r\n    '<path d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"/>',\r\n  ),\r\n  audio: svg(\r\n    '<path d=\"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z\"/>',\r\n  ),\r\n  file: svg(\r\n    '<path d=\"M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6H6zm7 7V3.5L18.5 9H13z\"/>',\r\n  ),\r\n  emoji: svg(\r\n    '<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/>',\r\n  ),\r\n  pageBreak: svg(\r\n    '<path d=\"M4 11h16v2H4z\"/><path d=\"M6 6h12v1.4H6zM6 16.6h12V18H6z\" fill-opacity=\".4\"/>',\r\n  ),\r\n  table: svg(\r\n    '<path d=\"M20 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM10 17H5v-2h5v2zm0-4H5v-2h5v2zm0-4H5V7h5v2zm9 8h-7v-2h7v2zm0-4h-7v-2h7v2zm0-4h-7V7h7v2z\"/>',\r\n  ),\r\n  columnList: svg(\r\n    '<rect x=\"3\" y=\"4\" width=\"7\" height=\"16\" rx=\"1\"/><rect x=\"14\" y=\"4\" width=\"7\" height=\"16\" rx=\"1\"/>',\r\n  ),\r\n};\r\n\r\n// 2\uB2E8 \uCEEC\uB7FC(\uAD6C\uBD84\uC120) \uBCC0\uD615 \u2014 \uAC00\uC6B4\uB370 \uC138\uB85C \uAD6C\uBD84\uC120 \uD3EC\uD568(columnList\uC640 \uAD6C\uBD84).\r\nexport const COLUMNS_DIVIDER_ICON = svg(\r\n  '<rect x=\"3\" y=\"4\" width=\"7\" height=\"16\" rx=\"1\"/><rect x=\"14\" y=\"4\" width=\"7\" height=\"16\" rx=\"1\"/><rect x=\"11.4\" y=\"3\" width=\"1.2\" height=\"18\"/>',\r\n);\r\n", "/**\r\n * \uC2AC\uB798\uC2DC \uBA54\uB274 (P1-\u2463) \u2014 `/` \uC785\uB825 \uC2DC \uBE14\uB85D \uD0C0\uC785 \uC120\uD0DD \uD31D\uC5C5.\r\n * \uC0D8\uD50C block-editor.html\uC758 \uC2AC\uB798\uC2DC \uD328\uD134 \uC774\uC2DD.\r\n *\r\n *  - \uD2B8\uB9AC\uAC70: \uBB38\uB2E8 \uC2DC\uC791\uC774 `/` + \uACF5\uBC31\uC5C6\uB294 \uC9C8\uC758(`^\\/(\\S*)$`)\uC77C \uB54C \uC5F4\uB9BC/\uD544\uD130.\r\n *  - \uD0A4\uBCF4\uB4DC: ArrowUp/Down \uC774\uB3D9, Enter \uC801\uC6A9, Escape \uB2EB\uAE30 \u2014 **capture \uB2E8\uACC4\uC5D0\uC11C \uAC00\uB85C\uCC44\r\n *    stopPropagation** \u2192 editing.js\uC758 Enter(\uBD84\uD560) \uD578\uB4E4\uB7EC\uBCF4\uB2E4 \uC6B0\uC120(\uBA54\uB274 \uC5F4\uB838\uC744 \uB54C\uB9CC).\r\n *  - \uC801\uC6A9: \uD604\uC7AC \uBB38\uB2E8\uC744 \uC120\uD0DD \uD0C0\uC785\uC73C\uB85C \uBCC0\uD658(`/\uC9C8\uC758` \uD14D\uC2A4\uD2B8 \uC18C\uAC70).\r\n *  - IME \uAC00\uB4DC: \uC870\uD569 \uC911 \uBBF8\uB3D9\uC791.\r\n */\r\n\r\nimport { changeBlockType, propsForType } from \"../editing.js\";\r\nimport { BLOCK_ICON } from \"./icons.js\";\r\n\r\n// [type, level, locale \uD0A4, \uAE30\uBCF8 \uB77C\uBCA8, \uD0A4\uC6CC\uB4DC(\uC601\uBB38 \uBCC4\uCE6D \uD3EC\uD568), \uADF8\uB8F9, \uC544\uC774\uCF58 \uAE00\uB9AC\uD504, \uBD80\uC81C\uBAA9, \uB2E8\uCD95\uD0A4 \uBC30\uC9C0]\r\n// blocknote \uC815\uD569: \uC81C\uBAA9(groupHeading)\uC744 \uBA3C\uC800, \uB098\uBA38\uC9C0(groupBasic)\uB97C \uB4A4\uC5D0.\r\nconst ITEM_DEFS = [\r\n  { type: \"heading\", level: 1, key: \"heading1\", def: \"\uC81C\uBAA91\", kw: \"h1 heading \uC81C\uBAA9 title \uB300\uC81C\uBAA9\", group: \"groupHeading\", ico: \"H1\", sub: \"\uC139\uC158 \uC81C\uBAA9 (\uB300)\", sc: \"Ctrl+Alt+1\" },\r\n  { type: \"heading\", level: 2, key: \"heading2\", def: \"\uC81C\uBAA92\", kw: \"h2 heading \uC81C\uBAA9 title \uC911\uC81C\uBAA9\", group: \"groupHeading\", ico: \"H2\", sub: \"\uC139\uC158 \uC81C\uBAA9 (\uC911)\", sc: \"Ctrl+Alt+2\" },\r\n  { type: \"heading\", level: 3, key: \"heading3\", def: \"\uC81C\uBAA93\", kw: \"h3 heading \uC81C\uBAA9 title subheading\", group: \"groupHeading\", ico: \"H3\", sub: \"\uC139\uC158 \uC81C\uBAA9 (\uC18C)\", sc: \"Ctrl+Alt+3\" },\r\n  { type: \"heading\", level: 4, key: \"heading4\", def: \"\uC81C\uBAA94\", kw: \"h4 heading \uC81C\uBAA9 title \uC18C\uC81C\uBAA9\", group: \"groupHeading\", ico: \"H4\", sub: \"\uD558\uC704 \uC18C\uB2E8\uB77D \uC81C\uBAA9\" },\r\n  { type: \"heading\", level: 5, key: \"heading5\", def: \"\uC81C\uBAA95\", kw: \"h5 heading \uC81C\uBAA9 title \uC18C\uC81C\uBAA9\", group: \"groupHeading\", ico: \"H5\", sub: \"\uC791\uC740 \uD558\uC704 \uC139\uC158 \uC81C\uBAA9\" },\r\n  { type: \"heading\", level: 6, key: \"heading6\", def: \"\uC81C\uBAA96\", kw: \"h6 heading \uC81C\uBAA9 title \uC18C\uC81C\uBAA9\", group: \"groupHeading\", ico: \"H6\", sub: \"\uAC00\uC7A5 \uD558\uC704 \uC218\uC900 \uC81C\uBAA9\" },\r\n  { type: \"heading\", level: 1, isToggle: true, key: \"toggleHeading1\", def: \"\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA91\", kw: \"toggle \uC811\uAE30 \uD1A0\uAE00 heading \uC81C\uBAA9 h1 \uB300\uC81C\uBAA9 collapsible\", group: \"groupHeading\", ico: \"\u25B8H\", sub: \"\uB0B4\uC6A9\uC744 \uC811\uC744 \uC218 \uC788\uB294 \uC139\uC158 \uC81C\uBAA9(\uB300)\" },\r\n  { type: \"heading\", level: 2, isToggle: true, key: \"toggleHeading2\", def: \"\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA92\", kw: \"toggle \uC811\uAE30 \uD1A0\uAE00 heading \uC81C\uBAA9 h2 \uC911\uC81C\uBAA9 collapsible\", group: \"groupHeading\", ico: \"\u25B8H\", sub: \"\uB0B4\uC6A9\uC744 \uC811\uC744 \uC218 \uC788\uB294 \uC139\uC158 \uC81C\uBAA9(\uC911)\" },\r\n  { type: \"heading\", level: 3, isToggle: true, key: \"toggleHeading3\", def: \"\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA93\", kw: \"toggle \uC811\uAE30 \uD1A0\uAE00 heading \uC81C\uBAA9 h3 \uC18C\uC81C\uBAA9 collapsible\", group: \"groupHeading\", ico: \"\u25B8H\", sub: \"\uB0B4\uC6A9\uC744 \uC811\uC744 \uC218 \uC788\uB294 \uC139\uC158 \uC81C\uBAA9(\uC18C)\" },\r\n  { type: \"paragraph\", key: \"paragraph\", def: \"\uD14D\uC2A4\uD2B8\", kw: \"text \uD14D\uC2A4\uD2B8 \uBCF8\uBB38 paragraph p\", group: \"groupBasic\", ico: \"\u00B6\", sub: \"\uC77C\uBC18 \uD14D\uC2A4\uD2B8\", sc: \"Ctrl+Alt+0\" },\r\n  { type: \"bulletListItem\", key: \"bulletListItem\", def: \"\uAE00\uBA38\uB9AC \uAE30\uD638\", kw: \"bullet ul \uAE00\uBA38\uB9AC \uBAA9\uB85D list \uBD88\uB9BF\", group: \"groupBasic\", ico: \"\u2022\", sub: \"\uAC04\uB2E8\uD55C \uAE00\uBA38\uB9AC \uAE30\uD638 \uBAA9\uB85D\", sc: \"Ctrl+Shift+8\" },\r\n  { type: \"numberedListItem\", key: \"numberedListItem\", def: \"\uBC88\uD638 \uB9E4\uAE30\uAE30\", kw: \"number ol \uBC88\uD638 \uBAA9\uB85D list\", group: \"groupBasic\", ico: \"1.\", sub: \"\uBC88\uD638\uAC00 \uB9E4\uACA8\uC9C4 \uBAA9\uB85D\", sc: \"Ctrl+Shift+7\" },\r\n  { type: \"checkListItem\", key: \"checkListItem\", def: \"\uD560 \uC77C\", kw: \"todo check \uCCB4\uD06C \uD560\uC77C task \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\", group: \"groupBasic\", ico: \"\u2611\", sub: \"\uCCB4\uD06C\uBC15\uC2A4\uAC00 \uC788\uB294 \uBAA9\uB85D\", sc: \"Ctrl+Shift+9\" },\r\n  { type: \"toggleListItem\", key: \"toggleList\", def: \"\uC811\uC744 \uC218 \uC788\uB294 \uBAA9\uB85D\", kw: \"toggle \uC811\uAE30 \uD1A0\uAE00 \uBAA9\uB85D list collapsible \uC811\uC744\uC218\uC788\uB294\", group: \"groupBasic\", ico: \"\u25B8\", sub: \"\uC228\uAE38 \uC218 \uC788\uB294 \uD558\uC704 \uD56D\uBAA9 \uBAA9\uB85D\", sc: \"Ctrl+Shift+6\" },\r\n  { type: \"quote\", key: \"quote\", def: \"\uC778\uC6A9\", kw: \"quote \uC778\uC6A9 blockquote\", group: \"groupBasic\", ico: \"\u275D\", sub: \"\uC778\uC6A9\uBB38 \uB610\uB294 \uBC1C\uCDCC\" },\r\n  { type: \"codeBlock\", key: \"codeBlock\", def: \"\uCF54\uB4DC\", kw: \"code \uCF54\uB4DC codeblock \uCF54\uB4DC\uBE14\uB85D\", group: \"groupBasic\", ico: \"</>\", sub: \"\uAD6C\uBB38 \uAC15\uC870 \uCF54\uB4DC \uBE14\uB85D\" },\r\n];\r\nfunction esc(s) {\r\n  return String(s == null ? \"\" : s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n}\r\nfunction buildBaseItems(L) {\r\n  const s = (L && L.slashMenu) || {};\r\n  const g = (k) => s[k] || k;\r\n  return ITEM_DEFS.map((d) => ({ type: d.type, level: d.level, isToggle: d.isToggle, label: s[d.key] || d.def, kw: d.kw, group: g(d.group), ico: d.ico, sub: (s[d.key + \"Sub\"] || d.sub), sc: d.sc }));\r\n}\r\n\r\nexport function attachSlashMenu(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const onApply = typeof opts.onApply === \"function\" ? opts.onApply : () => {};\r\n  const extraItems = Array.isArray(opts.extraItems) ? opts.extraItems : [];\r\n  const headingLevels = Array.isArray(opts.headingLevels) && opts.headingLevels.length ? opts.headingLevels : [1, 2, 3, 4, 5, 6];\r\n  const baseItems = buildBaseItems(opts.locale).filter((it) => it.type !== \"heading\" || headingLevels.includes(it.level));\r\n\r\n  const menu = document.createElement(\"div\");\r\n  menu.className = \"lumir-slash\";\r\n  menu.style.position = \"absolute\";\r\n  menu.style.display = \"none\";\r\n  document.body.appendChild(menu);\r\n\r\n  let open = false;\r\n  let items = [];\r\n  let idx = 0;\r\n  let block = null;\r\n\r\n  function close() {\r\n    open = false;\r\n    block = null;\r\n    menu.style.display = \"none\";\r\n    menu.innerHTML = \"\";\r\n  }\r\n  // \uBDF0\uD3EC\uD2B8 \uC778\uC2DD \uBC30\uCE58 \u2014 \uD558\uB2E8 \uACF5\uAC04 \uC5C6\uC73C\uBA74 \uBE14\uB85D \uC704\uB85C flip, \uC6B0\uCE21 \uB118\uCE58\uBA74 \uC88C\uB85C shift, \uCD5C\uC18C 8px \uC5EC\uBC31 \uD074\uB7A8\uD504.\r\n  function position(b) {\r\n    const content = (b && b.querySelector && b.querySelector(\".content\")) || b;\r\n    const r = content && content.getBoundingClientRect ? content.getBoundingClientRect() : { left: 0, top: 0, bottom: 0 };\r\n    menu.style.display = \"block\"; // \uCE21\uC815 \uC804 \uD45C\uC2DC(offsetWidth/Height \uC720\uD6A8\uD654)\r\n    const mw = menu.offsetWidth || 300;\r\n    const mh = menu.offsetHeight || 0;\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    const vh = (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || 0;\r\n    let left = r.left || 0;\r\n    if (vw && left + mw > vw - 8) left = vw - mw - 8;\r\n    if (left < 8) left = 8;\r\n    let top = (r.bottom || 0) + 4;\r\n    if (vh && mh && top + mh > vh - 8) {\r\n      const up = (r.top || 0) - mh - 4;\r\n      top = up >= 8 ? up : Math.max(8, vh - mh - 8);\r\n    }\r\n    menu.style.left = window.scrollX + left + \"px\";\r\n    menu.style.top = window.scrollY + top + \"px\";\r\n  }\r\n  function render() {\r\n    menu.style.display = open ? \"block\" : \"none\";\r\n    if (!items.length) {\r\n      menu.innerHTML = '<div class=\"lumir-slash-empty\">\uACB0\uACFC \uC5C6\uC74C</div>';\r\n      if (open && block) position(block);\r\n      return;\r\n    }\r\n    let html = \"\";\r\n    let lastGroup = null;\r\n    items.forEach((it, i) => {\r\n      const g = it.group || \"\uAE30\uBCF8 \uBE14\uB85D\";\r\n      if (g !== lastGroup) { html += `<div class=\"lumir-slash-group\">${esc(g)}</div>`; lastGroup = g; }\r\n      // \uC544\uC774\uCF58: \uD56D\uBAA9\uC774 \uC9C1\uC811 SVG(it.ico\uAC00 \"<svg\u2026\")\uB97C \uC8FC\uBA74 \uC6B0\uC120, \uC544\uB2C8\uBA74 \uD0C0\uC785\uBCC4 blocknote SVG(BLOCK_ICON),\r\n      // \uADF8\uB798\uB3C4 \uC5C6\uC73C\uBA74(\uC81C\uBAA9 \uB4F1) \uD14D\uC2A4\uD2B8 \uAE00\uB9AC\uD504. \u2192 \uBAA8\uB4E0 \uC2AC\uB798\uC2DC \uC544\uC774\uCF58\uC774 monochrome SVG\uB85C \uD1B5\uC77C.\r\n      const rawIco = it.ico || \"\";\r\n      const iconInner = (typeof rawIco === \"string\" && rawIco.trim().toLowerCase().startsWith(\"<svg\"))\r\n        ? rawIco\r\n        : (BLOCK_ICON[it.type] || esc(rawIco));\r\n      const ico = `<span class=\"lumir-slash-ico\">${iconInner}</span>`;\r\n      const sub = it.sub ? `<span class=\"lumir-slash-sub\">${esc(it.sub)}</span>` : \"\";\r\n      // \uB2E8\uCD95\uD0A4 \uBC30\uC9C0: blocknote \uD615\uC2DD(CTRL-ALT-1) \u2014 \uD558\uC774\uD508 \uACB0\uD569 + CSS \uB300\uBB38\uC790.\r\n      const sc = it.sc ? `<span class=\"lumir-slash-sc\">${esc(it.sc.replace(/\\s*\\+\\s*/g, \"-\"))}</span>` : \"\";\r\n      html += `<div class=\"lumir-slash-item${i === idx ? \" sel\" : \"\"}\" data-i=\"${i}\">${ico}<span class=\"lumir-slash-body\"><span class=\"lumir-slash-title\">${esc(it.label)}</span>${sub}</span>${sc}</div>`;\r\n    });\r\n    menu.innerHTML = html;\r\n    // \uD06C\uAE30 \uD655\uC815 \uD6C4 \uBDF0\uD3EC\uD2B8 \uC778\uC2DD \uC7AC\uBC30\uCE58(\uB0B4\uC6A9\uC5D0 \uB530\uB77C flip/shift)\r\n    if (open && block) position(block);\r\n    // \uC120\uD0DD \uD56D\uBAA9\uC774 \uBCF4\uC774\uB3C4\uB85D \uC2A4\uD06C\uB864\r\n    const selEl = menu.querySelector(\".lumir-slash-item.sel\");\r\n    if (selEl && selEl.scrollIntoView) selEl.scrollIntoView({ block: \"nearest\" });\r\n  }\r\n  function filter(q) {\r\n    // \uACF5\uBC31 \uBB34\uC2DC \uAC80\uC0C9: \uC9C8\uC758\u00B7\uAC74\uCD08\uB354\uBBF8 \uC591\uCABD\uC5D0\uC11C \uBAA8\uB4E0 \uACF5\uBC31 \uC81C\uAC70 \uD6C4 \uBD80\uBD84\uC77C\uCE58(\"\uC81C\uBAA91\"\u2194\"\uC81C\uBAA9 1\" \uB3D9\uC77C)\r\n    const nq = (q || \"\").toLowerCase().replace(/\\s+/g, \"\");\r\n    items = baseItems.concat(extraItems).filter((it) => {\r\n      if (!nq) return true;\r\n      const hay = (it.label + \" \" + (it.kw || \"\") + \" \" + (it.sub || \"\")).toLowerCase().replace(/\\s+/g, \"\");\r\n      return hay.includes(nq);\r\n    });\r\n    // \uADF8\uB8F9 \uC548\uC815 \uC815\uB82C(\uCCAB \uB4F1\uC7A5 \uC21C\uC11C \uC720\uC9C0 \u2014 \uAC19\uC740 \uADF8\uB8F9\uB07C\uB9AC \uBAA8\uC74C)\r\n    const order = [];\r\n    items.forEach((it) => { const g = it.group || \"\uAE30\uBCF8 \uBE14\uB85D\"; if (!order.includes(g)) order.push(g); });\r\n    items.sort((a, b) => order.indexOf(a.group || \"\uAE30\uBCF8 \uBE14\uB85D\") - order.indexOf(b.group || \"\uAE30\uBCF8 \uBE14\uB85D\"));\r\n    if (idx >= items.length) idx = 0;\r\n    render();\r\n  }\r\n  function apply(it) {\r\n    if (!it || !block) {\r\n      close();\r\n      return;\r\n    }\r\n    if (typeof it.action === \"function\") {\r\n      const b = block;\r\n      const c = b.querySelector && b.querySelector(\".content\");\r\n      if (c) {\r\n        c.innerHTML = \"\"; // \"/\uBA85\uB839\" \uD14D\uC2A4\uD2B8 \uC81C\uAC70\r\n        // \uCE90\uB7FF\uC744 \uBE48 \uBE14\uB85D\uC5D0 \uBCF5\uC6D0 \u2192 \uC561\uC158(\uC774\uBAA8\uC9C0/\uD30C\uC77C \uD328\uB110)\uC774 \uC62C\uBC14\uB978 \uC704\uCE58\u00B7\uC0BD\uC785 \uC9C0\uC810\uC744 \uC7A1\uB3C4\uB85D\r\n        try { const r = document.createRange(); r.selectNodeContents(c); r.collapse(true); const s = window.getSelection(); s.removeAllRanges(); s.addRange(r); c.focus(); } catch (_) {}\r\n      }\r\n      close();\r\n      it.action(b);\r\n      onApply();\r\n      return;\r\n    }\r\n    changeBlockType(block, it.type, propsForType(it.type, it.level, it.isToggle));\r\n    close();\r\n    onApply();\r\n  }\r\n\r\n  function onInput(e) {\r\n    // IME \uC870\uD569 \uC911\uC5D0\uB3C4 \uD544\uD130\uD574\uC57C \uD568(\uD55C\uAE00 \"/\uC81C\uBAA9\" \uC785\uB825 \uC2DC \uBAA9\uB85D \uAC31\uC2E0). \uC870\uD569 \uAC00\uB4DC\uB294\r\n    // Enter/Arrow \uAC00\uB85C\uCC44\uAE30(onKeydownCapture)\uC5D0\uB9CC \uC801\uC6A9 \u2014 \uC5EC\uAE30\uC11C \uB9C9\uC73C\uBA74 \uAC80\uC0C9\uC774 \uC548 \uB428.\r\n    const content = e.target.closest && e.target.closest(\".content\");\r\n    if (!content || !editorEl.contains(content) || (content.closest && content.closest(\".lumir-tbl\"))) {\r\n      if (open) close();\r\n      return;\r\n    }\r\n    const b = content.closest(\".block\");\r\n    if (!b || b.dataset.type !== \"paragraph\") {\r\n      if (open) close();\r\n      return;\r\n    }\r\n    const m = /^\\/(.*)$/.exec(content.textContent); // \uACF5\uBC31 \uD3EC\uD568 \uB2E4\uC911\uC5B4 \uAC80\uC0C9 \uD5C8\uC6A9\r\n    if (m) {\r\n      if (!open) {\r\n        if (isComposing()) return; // \uC870\uD569 \uC911\uC5D4 \uC0C8\uB85C \"\uC5F4\uC9C0\" \uC54A\uC74C(IME \uAC00\uB4DC). \uB2E8, \uC774\uBBF8 \uC5F4\uB824\uC788\uC73C\uBA74 \uC544\uB798 filter\uB294 \uC9C4\uD589 \u2192 \uD55C\uAE00 \uAC80\uC0C9 \uB3D9\uC791\r\n        open = true;\r\n        block = b;\r\n        idx = 0;\r\n        position(b);\r\n      }\r\n      filter(m[1]); // \uC774\uBBF8 \uC5F4\uB824 \uC788\uC73C\uBA74 \uC870\uD569 \uC911\uC5D0\uB3C4 \uD544\uD130(\uD55C\uAE00 /\uC81C\uBAA9)\r\n    } else if (open) {\r\n      close();\r\n    }\r\n  }\r\n\r\n  // capture \uB2E8\uACC4 \u2014 \uBA54\uB274 \uC5F4\uB838\uC744 \uB54C\uB9CC \uAC00\uB85C\uCC44 editing.js(Enter \uBD84\uD560)\uBCF4\uB2E4 \uC6B0\uC120\r\n  function onKeydownCapture(e) {\r\n    if (!open) return;\r\n    if (e.isComposing || isComposing()) return; // IME \uC870\uD569 \uC911 Enter/Arrow\uB294 \uAC00\uB85C\uCC44\uC9C0 \uC54A\uC74C(\uD55C\uAE00 \uAC80\uC0C9 \uC120\uD0DD \uBCF4\uD638)\r\n    if (e.key === \"ArrowDown\") {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      if (items.length) {\r\n        idx = (idx + 1) % items.length;\r\n        render();\r\n      }\r\n    } else if (e.key === \"ArrowUp\") {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      if (items.length) {\r\n        idx = (idx - 1 + items.length) % items.length;\r\n        render();\r\n      }\r\n    } else if (e.key === \"Enter\") {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      if (items.length) apply(items[idx]);\r\n      else close();\r\n    } else if (e.key === \"Escape\") {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      close();\r\n    }\r\n  }\r\n\r\n  function onMousedown(e) {\r\n    const it = e.target.closest && e.target.closest(\".lumir-slash-item\");\r\n    if (it) {\r\n      e.preventDefault();\r\n      apply(items[+it.dataset.i]);\r\n    }\r\n  }\r\n\r\n  editorEl.addEventListener(\"input\", onInput);\r\n  editorEl.addEventListener(\"keydown\", onKeydownCapture, true); // capture\r\n  menu.addEventListener(\"mousedown\", onMousedown);\r\n\r\n  return {\r\n    isOpen: () => open,\r\n    close,\r\n    destroy() {\r\n      editorEl.removeEventListener(\"input\", onInput);\r\n      editorEl.removeEventListener(\"keydown\", onKeydownCapture, true);\r\n      if (menu.parentNode) menu.parentNode.removeChild(menu);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uC774\uBAA8\uC9C0 \uD53C\uCEE4 \u2014 \uC2AC\uB798\uC2DC \"\uC774\uBAA8\uC9C0\"\uC5D0\uC11C \uC5F4\uB9BC. \uAC80\uC0C9(\uACF5\uBC31 \uBB34\uC2DC) + \uADF8\uB9AC\uB4DC, \uD074\uB9AD \uC2DC caret \uC704\uCE58\uC5D0 \uC0BD\uC785.\r\n * \uD31D\uC5C5\uC740 document.body\uC5D0 \uC808\uB300\uBC30\uCE58. \uC120\uD0DD range\uB97C open \uC2DC\uC810\uC5D0 \uC800\uC7A5\uD574 \uC0BD\uC785 \uC2DC \uBCF5\uC6D0.\r\n */\r\n\r\n// \uC790\uC8FC \uC4F0\uB294 \uC774\uBAA8\uC9C0 + \uAC80\uC0C9 \uD0A4\uC6CC\uB4DC(\uD55C/\uC601)\r\nconst EMOJIS = [\r\n  { e: \"\uD83D\uDE00\", k: \"smile grin \uC6C3\uC74C \uBBF8\uC18C\" }, { e: \"\uD83D\uDE03\", k: \"smile \uC6C3\uC74C\" }, { e: \"\uD83D\uDE04\", k: \"laugh \uC6C3\uC74C\" }, { e: \"\uD83D\uDE01\", k: \"grin \uD65C\uC9DD\" },\r\n  { e: \"\uD83D\uDE06\", k: \"laugh \uD558\uD558\" }, { e: \"\uD83D\uDE05\", k: \"sweat \uC9C4\uB540\" }, { e: \"\uD83D\uDE02\", k: \"joy lol \uB208\uBB3C \uC6C3\uC74C\" }, { e: \"\uD83E\uDD23\", k: \"rofl \uD3ED\uC18C\" },\r\n  { e: \"\uD83D\uDE0A\", k: \"blush \uBFCC\uB4EF \uBBF8\uC18C\" }, { e: \"\uD83D\uDE42\", k: \"slight \uBBF8\uC18C\" }, { e: \"\uD83D\uDE09\", k: \"wink \uC719\uD06C\" }, { e: \"\uD83D\uDE0D\", k: \"love heart eyes \uC0AC\uB791 \uD558\uD2B8\" },\r\n  { e: \"\uD83D\uDE18\", k: \"kiss \uBF40\uBF40\" }, { e: \"\uD83D\uDE0E\", k: \"cool \uC120\uAE00\uB77C\uC2A4 \uCFE8\" }, { e: \"\uD83E\uDD29\", k: \"star \uBC18\uC9DD \uAC10\uD0C4\" }, { e: \"\uD83E\uDD73\", k: \"party \uCD95\uD558 \uD30C\uD2F0\" },\r\n  { e: \"\uD83E\uDD14\", k: \"think \uC0DD\uAC01 \uACE0\uBBFC\" }, { e: \"\uD83E\uDD28\", k: \"raised brow \uC758\uC2EC\" }, { e: \"\uD83D\uDE10\", k: \"neutral \uBB34\uD45C\uC815\" }, { e: \"\uD83D\uDE34\", k: \"sleep \uC878\uB9BC \uC7A0\" },\r\n  { e: \"\uD83D\uDE05\", k: \"relief \uC548\uB3C4\" }, { e: \"\uD83D\uDE2D\", k: \"cry sob \uC6B8\uC74C \uB208\uBB3C\" }, { e: \"\uD83D\uDE22\", k: \"cry \uB208\uBB3C\" }, { e: \"\uD83D\uDE24\", k: \"huff \uC529\uC529\" },\r\n  { e: \"\uD83D\uDE21\", k: \"angry \uD654\uB0A8 \uBD84\uB178\" }, { e: \"\uD83E\uDD2F\", k: \"mind blown \uCDA9\uACA9\" }, { e: \"\uD83D\uDE31\", k: \"scream \uB180\uB78C \uBE44\uBA85\" }, { e: \"\uD83D\uDE33\", k: \"flushed \uB2F9\uD669\" },\r\n  { e: \"\uD83E\uDD7A\", k: \"pleading \uBD80\uD0C1 \uC560\uC6D0\" }, { e: \"\uD83D\uDE07\", k: \"angel \uCC9C\uC0AC\" }, { e: \"\uD83E\uDD17\", k: \"hug \uD3EC\uC639\" }, { e: \"\uD83D\uDE43\", k: \"upside \uBC18\uC804\" },\r\n  { e: \"\uD83D\uDC4D\", k: \"thumbs up \uC88B\uC544\uC694 \uAD7F\" }, { e: \"\uD83D\uDC4E\", k: \"thumbs down \uC2EB\uC5B4\uC694\" }, { e: \"\uD83D\uDC4F\", k: \"clap \uBC15\uC218\" }, { e: \"\uD83D\uDE4F\", k: \"pray thanks \uAC10\uC0AC \uBD80\uD0C1\" },\r\n  { e: \"\uD83D\uDE4C\", k: \"raise \uB9CC\uC138\" }, { e: \"\uD83D\uDC4B\", k: \"wave \uC778\uC0AC \uC548\uB155\" }, { e: \"\u270C\uFE0F\", k: \"victory peace \uBE0C\uC774\" }, { e: \"\uD83E\uDD1D\", k: \"handshake \uC545\uC218\" },\r\n  { e: \"\uD83D\uDCAA\", k: \"muscle \uADFC\uC721 \uD798\" }, { e: \"\uD83D\uDC4C\", k: \"ok \uC624\uCF00\uC774\" }, { e: \"\u270B\", k: \"hand \uC190\" }, { e: \"\uD83E\uDD19\", k: \"call \uC804\uD654\" },\r\n  { e: \"\u2764\uFE0F\", k: \"heart love \uD558\uD2B8 \uC0AC\uB791\" }, { e: \"\uD83E\uDDE1\", k: \"orange heart \uC8FC\uD669 \uD558\uD2B8\" }, { e: \"\uD83D\uDC9B\", k: \"yellow heart \uB178\uB791 \uD558\uD2B8\" }, { e: \"\uD83D\uDC9A\", k: \"green heart \uCD08\uB85D \uD558\uD2B8\" },\r\n  { e: \"\uD83D\uDC99\", k: \"blue heart \uD30C\uB791 \uD558\uD2B8\" }, { e: \"\uD83D\uDC9C\", k: \"purple heart \uBCF4\uB77C \uD558\uD2B8\" }, { e: \"\uD83D\uDDA4\", k: \"black heart \uAC80\uC815 \uD558\uD2B8\" }, { e: \"\uD83D\uDC94\", k: \"broken \uC2E4\uC5F0\" },\r\n  { e: \"\uD83D\uDD25\", k: \"fire hot \uBD88 \uB300\uBC15\" }, { e: \"\u2728\", k: \"sparkles \uBC18\uC9DD\" }, { e: \"\u2B50\", k: \"star \uBCC4\" }, { e: \"\uD83C\uDF1F\", k: \"glow \uBC18\uC9DD \uBCC4\" },\r\n  { e: \"\uD83D\uDCAF\", k: \"100 \uBC31\uC810 \uCD5C\uACE0\" }, { e: \"\uD83C\uDF89\", k: \"tada party \uCD95\uD558 \uD30C\uD2F0\" }, { e: \"\uD83C\uDF8A\", k: \"confetti \uCD95\uD558\" }, { e: \"\uD83C\uDF81\", k: \"gift \uC120\uBB3C\" },\r\n  { e: \"\u2705\", k: \"check done \uC644\uB8CC \uCCB4\uD06C\" }, { e: \"\u274C\", k: \"x cross \uCDE8\uC18C \uC5D1\uC2A4\" }, { e: \"\u26A0\uFE0F\", k: \"warning \uACBD\uACE0 \uC8FC\uC758\" }, { e: \"\u2757\", k: \"exclaim \uB290\uB08C\uD45C\" },\r\n  { e: \"\u2753\", k: \"question \uBB3C\uC74C\uD45C\" }, { e: \"\uD83D\uDCA1\", k: \"idea bulb \uC544\uC774\uB514\uC5B4 \uC804\uAD6C\" }, { e: \"\uD83D\uDCCC\", k: \"pin \uD540 \uACE0\uC815\" }, { e: \"\uD83D\uDCCD\", k: \"location \uC704\uCE58\" },\r\n  { e: \"\uD83D\uDD17\", k: \"link \uB9C1\uD06C\" }, { e: \"\uD83D\uDD12\", k: \"lock \uC7A0\uAE08\" }, { e: \"\uD83D\uDD11\", k: \"key \uC5F4\uC1E0\" }, { e: \"\u23F0\", k: \"alarm clock \uC2DC\uAC04 \uC54C\uB78C\" },\r\n  { e: \"\uD83D\uDCC5\", k: \"calendar \uB2EC\uB825 \uC77C\uC815\" }, { e: \"\uD83D\uDCDD\", k: \"memo note \uBA54\uBAA8 \uC791\uC131\" }, { e: \"\uD83D\uDCCE\", k: \"clip \uD074\uB9BD \uCCA8\uBD80\" }, { e: \"\uD83D\uDCC1\", k: \"folder \uD3F4\uB354\" },\r\n  { e: \"\uD83D\uDCBB\", k: \"laptop \uB178\uD2B8\uBD81 \uCEF4\uD4E8\uD130\" }, { e: \"\uD83D\uDCF1\", k: \"phone \uD3F0 \uD734\uB300\uD3F0\" }, { e: \"\uD83D\uDDA5\uFE0F\", k: \"desktop \uB370\uC2A4\uD06C\uD0D1\" }, { e: \"\u2328\uFE0F\", k: \"keyboard \uD0A4\uBCF4\uB4DC\" },\r\n  { e: \"\uD83D\uDCCA\", k: \"chart \uCC28\uD2B8 \uADF8\uB798\uD504\" }, { e: \"\uD83D\uDCC8\", k: \"up \uC0C1\uC2B9 \uADF8\uB798\uD504\" }, { e: \"\uD83D\uDCC9\", k: \"down \uD558\uB77D \uADF8\uB798\uD504\" }, { e: \"\uD83D\uDCB0\", k: \"money \uB3C8 \uBE44\uC6A9\" },\r\n  { e: \"\uD83D\uDE80\", k: \"rocket \uB85C\uCF13 \uCD9C\uC2DC\" }, { e: \"\uD83D\uDEF0\uFE0F\", k: \"satellite \uC704\uC131\" }, { e: \"\uD83C\uDF0D\", k: \"earth \uC9C0\uAD6C \uC138\uACC4\" }, { e: \"\u2600\uFE0F\", k: \"sun \uD574 \uB9D1\uC74C\" },\r\n  { e: \"\uD83C\uDF19\", k: \"moon \uB2EC \uBC24\" }, { e: \"\u26A1\", k: \"bolt \uBC88\uAC1C \uC804\uAE30\" }, { e: \"\u2615\", k: \"coffee \uCEE4\uD53C\" }, { e: \"\uD83C\uDF7A\", k: \"beer \uB9E5\uC8FC\" },\r\n  { e: \"\uD83C\uDFAF\", k: \"target \uBAA9\uD45C \uB2E4\uD2B8\" }, { e: \"\uD83C\uDFC6\", k: \"trophy \uC6B0\uC2B9 \uD2B8\uB85C\uD53C\" }, { e: \"\uD83E\uDD47\", k: \"gold \uAE08\uBA54\uB2EC 1\uB4F1\" }, { e: \"\uD83C\uDFB5\", k: \"music \uC74C\uC545\" },\r\n];\r\n\r\nconst norm = (s) => String(s || \"\").toLowerCase().replace(/\\s+/g, \"\");\r\n\r\nexport function attachEmojiPicker(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  const pop = document.createElement(\"div\");\r\n  pop.className = \"lumir-emoji\";\r\n  pop.style.position = \"absolute\";\r\n  pop.style.display = \"none\";\r\n  document.body.appendChild(pop);\r\n\r\n  let openFlag = false;\r\n  let savedRange = null;\r\n\r\n  function render(filter) {\r\n    const q = norm(filter);\r\n    const items = EMOJIS.filter((x) => !q || norm(x.e + \" \" + x.k).includes(q));\r\n    const grid = items.map((x) => `<button type=\"button\" class=\"lumir-emoji-btn\" data-e=\"${x.e}\" title=\"${x.k}\">${x.e}</button>`).join(\"\");\r\n    pop.innerHTML =\r\n      `<input type=\"text\" class=\"lumir-emoji-search\" placeholder=\"\uC774\uBAA8\uC9C0 \uAC80\uC0C9\u2026\" />` +\r\n      `<div class=\"lumir-emoji-grid\">${grid || '<div class=\"lumir-emoji-empty\">\uACB0\uACFC \uC5C6\uC74C</div>'}</div>`;\r\n  }\r\n\r\n  function position(block) {\r\n    const c = (block.querySelector && block.querySelector(\".content\")) || block;\r\n    const r = c.getBoundingClientRect ? c.getBoundingClientRect() : { left: 0, bottom: 0 };\r\n    pop.style.left = window.scrollX + (r.left || 0) + \"px\";\r\n    pop.style.top = window.scrollY + (r.bottom || 0) + 4 + \"px\";\r\n  }\r\n\r\n  function open(block) {\r\n    openFlag = true;\r\n    position(block);\r\n    render(\"\");\r\n    pop.style.display = \"block\";\r\n    const s = window.getSelection();\r\n    savedRange = s && s.rangeCount ? s.getRangeAt(0).cloneRange() : null;\r\n    const inp = pop.querySelector(\".lumir-emoji-search\");\r\n    if (inp) setTimeout(() => inp.focus(), 0);\r\n  }\r\n  function close() {\r\n    openFlag = false;\r\n    pop.style.display = \"none\";\r\n  }\r\n  function insert(emo) {\r\n    const s = window.getSelection();\r\n    if (savedRange) { s.removeAllRanges(); s.addRange(savedRange); }\r\n    if (s && s.rangeCount) {\r\n      const r = s.getRangeAt(0);\r\n      r.deleteContents();\r\n      const t = document.createTextNode(emo);\r\n      r.insertNode(t);\r\n      r.setStartAfter(t);\r\n      r.collapse(true);\r\n      s.removeAllRanges();\r\n      s.addRange(r);\r\n    }\r\n    onChange();\r\n  }\r\n\r\n  function onPopMousedown(e) {\r\n    const btn = e.target.closest && e.target.closest(\".lumir-emoji-btn\");\r\n    if (btn) { e.preventDefault(); insert(btn.dataset.e); close(); }\r\n  }\r\n  function onPopInput(e) {\r\n    if (e.target.classList && e.target.classList.contains(\"lumir-emoji-search\")) render(e.target.value);\r\n  }\r\n  function onDocMousedown(e) {\r\n    if (openFlag && !pop.contains(e.target)) close();\r\n  }\r\n  pop.addEventListener(\"mousedown\", onPopMousedown);\r\n  pop.addEventListener(\"input\", onPopInput);\r\n  document.addEventListener(\"mousedown\", onDocMousedown, true);\r\n\r\n  return {\r\n    open,\r\n    close,\r\n    isOpen: () => openFlag,\r\n    element: pop,\r\n    destroy() {\r\n      document.removeEventListener(\"mousedown\", onDocMousedown, true);\r\n      if (pop.parentNode) pop.parentNode.removeChild(pop);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD45C \uD06C\uAE30 \uADF8\uB9AC\uB4DC \uD53C\uCEE4 \u2014 \uC2AC\uB798\uC2DC \"\uD45C\"/\uD50C\uB85C\uD305 \uBA54\uB274\uC5D0\uC11C \uC5F4\uB9BC. N\u00D7M \uADF8\uB9AC\uB4DC\uB97C \uD638\uBC84\uD574 \uD06C\uAE30\uB97C \uACE0\uB978\uB2E4.\r\n *  - \uB3D9\uC801 \uD655\uC7A5: \uC120\uD0DD\uC774 \uB9C8\uC9C0\uB9C9 \uD589/\uC5F4\uC5D0 \uB2FF\uC73C\uBA74 \uADF8\uB9AC\uB4DC\uAC00 \uD55C \uCE78\uC529 \uC790\uB78C(\uCD08\uAE30 5\u00D75 \u2192 \uCD5C\uB300 MAX).\r\n *  - \uC5F4 \uC0C1\uD55C: getMaxCols()(\uC5D0\uB514\uD130 \uD3ED \uAE30\uBC18)\uB85C \uC81C\uD55C \u2192 \uD3ED \uCD08\uACFC \uD45C \uC0DD\uC131 \uC608\uBC29(#4/#7 \uC5F0\uACC4).\r\n *  - \uCEE4\uBC0B(\uD074\uB9AD/Enter) \uC2DC onPick(rows, cols). \uD31D\uC5C5\uC740 document.body \uC808\uB300\uBC30\uCE58, open \uC2DC range \uC800\uC7A5.\r\n * \uC774\uBAA8\uC9C0 \uD53C\uCEE4(attachEmojiPicker) \uAD6C\uC870\u00B7\uC218\uBA85\uC8FC\uAE30 \uD328\uD134\uC744 \uB530\uB978\uB2E4.\r\n */\r\n\r\nconst INITIAL = 5; // \uCD08\uAE30(\uADF8\uB9AC\uACE0 \uCD5C\uC18C) \uD45C\uC2DC \uADF8\uB9AC\uB4DC\r\nconst MAX = 20; // \uD558\uB4DC \uC0C1\uD55C\r\n\r\nconst clamp = (v, lo, hi) => Math.max(lo, Math.min(v, hi));\r\n\r\nexport function attachTableSizePicker(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onPick = typeof opts.onPick === \"function\" ? opts.onPick : () => {};\r\n  const getMaxCols = typeof opts.getMaxCols === \"function\" ? opts.getMaxCols : () => MAX;\r\n  const L = (opts.locale && opts.locale.tablePicker) || {};\r\n  const T_ROWS = L.rows || \"\uD589\";\r\n  const T_COLS = L.cols || \"\uC5F4\";\r\n\r\n  const pop = document.createElement(\"div\");\r\n  pop.className = \"lumir-tablepicker\";\r\n  pop.style.position = \"absolute\";\r\n  pop.style.display = \"none\";\r\n  pop.setAttribute(\"contenteditable\", \"false\");\r\n  pop.innerHTML = `<div class=\"tp-grid\"></div><div class=\"tp-label\"></div>`;\r\n  document.body.appendChild(pop);\r\n  const gridEl = pop.querySelector(\".tp-grid\");\r\n  const labelEl = pop.querySelector(\".tp-label\");\r\n\r\n  let openFlag = false;\r\n  let savedRange = null;\r\n  let hovR = 1, hovC = 1;\r\n  let viewR = 0, viewC = 0;\r\n  let maxColsCap = MAX;\r\n\r\n  function ensureGrid() {\r\n    const nr = clamp(hovR + 1, INITIAL, MAX);\r\n    // \uC5F4 \uD558\uD55C(INITIAL)\uC774 \uC0C1\uD55C(maxColsCap)\uC744 \uB118\uC9C0 \uC54A\uB3C4\uB85D \u2014 \uC881\uC740 \uC5D0\uB514\uD130(maxCols<5)\uC5D0\uC11C \uCEA1 \uC704\uBC18 \uBC29\uC9C0.\r\n    const nc = clamp(hovC + 1, Math.min(INITIAL, maxColsCap), maxColsCap);\r\n    if (nr === viewR && nc === viewC) return;\r\n    viewR = nr; viewC = nc;\r\n    gridEl.style.gridTemplateColumns = `repeat(${viewC}, var(--tp-cell, 16px))`;\r\n    let h = \"\";\r\n    for (let r = 1; r <= viewR; r++) for (let c = 1; c <= viewC; c++) h += `<span class=\"tp-cell\" data-r=\"${r}\" data-c=\"${c}\"></span>`;\r\n    gridEl.innerHTML = h;\r\n  }\r\n  function paint() {\r\n    ensureGrid();\r\n    const cells = gridEl.querySelectorAll(\".tp-cell\");\r\n    cells.forEach((el) => {\r\n      const r = +el.dataset.r, c = +el.dataset.c;\r\n      el.classList.toggle(\"on\", r <= hovR && c <= hovC);\r\n    });\r\n    labelEl.textContent = `${hovR}${T_ROWS} \u00D7 ${hovC}${T_COLS}`;\r\n  }\r\n  function setHover(r, c) {\r\n    hovR = clamp(r, 1, MAX);\r\n    hovC = clamp(c, 1, maxColsCap);\r\n    paint();\r\n  }\r\n\r\n  function position() {\r\n    let r = null;\r\n    if (savedRange && savedRange.getBoundingClientRect) {\r\n      const rr = savedRange.getBoundingClientRect();\r\n      if (rr && (rr.width || rr.height || rr.left || rr.top)) r = rr;\r\n    }\r\n    // \uC811\uD78C \uCE90\uB7FF(\uBE48 \uBB38\uB2E8)\uC740 rect\uAC00 0 \u2192 \uCCAB \uBE14\uB85D\uC73C\uB85C \uD3F4\uBC31\uB418\uBA74 \uAE30\uC874 \uD45C \uC88C\uC0C1\uB2E8\uC5D0 \uB72C\uB2E4.\r\n    // \uCE90\uB7FF\uC774 \uB193\uC778 \uBE14\uB85D \uCF58\uD150\uCE20\uC758 rect\uB97C \uC368\uC11C \uC2E4\uC81C \uC0BD\uC785 \uC704\uCE58(\uADF8 \uBB38\uB2E8 \uC544\uB798)\uC5D0 \uBC30\uCE58\uD55C\uB2E4.\r\n    if (!r && savedRange) {\r\n      let node = savedRange.startContainer;\r\n      if (node && node.nodeType === 3) node = node.parentNode;\r\n      const host = node && node.closest ? node.closest(\".content, .block\") : null;\r\n      if (host && host.getBoundingClientRect) {\r\n        const hr = host.getBoundingClientRect();\r\n        if (hr && (hr.width || hr.height || hr.left || hr.top)) r = hr;\r\n      }\r\n    }\r\n    if (!r) {\r\n      // \uCD5C\uD6C4 \uD3F4\uBC31: \uD604\uC7AC \uD3EC\uCEE4\uC2A4\uB41C \uCF58\uD150\uCE20(\uC5C6\uC73C\uBA74 \uCCAB \uBE14\uB85D)\r\n      const b =\r\n        (document.activeElement && document.activeElement.closest && document.activeElement.closest(\".content\")) ||\r\n        editorEl.querySelector(\".block .content\");\r\n      r = b && b.getBoundingClientRect ? b.getBoundingClientRect() : { left: 0, bottom: 0 };\r\n    }\r\n    // \uBDF0\uD3EC\uD2B8 \uD558\uB2E8/\uC6B0\uCE21 \uD074\uB7A8\uD504(\uCE21\uC815 \uD6C4)\r\n    let left = window.scrollX + (r.left || 0);\r\n    let top = window.scrollY + (r.bottom || 0) + 4;\r\n    const pw = pop.offsetWidth || 0, ph = pop.offsetHeight || 0;\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    const vh = (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || 0;\r\n    if (vw && pw && left - window.scrollX + pw > vw - 8) left = window.scrollX + vw - pw - 8;\r\n    if (left < window.scrollX + 8) left = window.scrollX + 8;\r\n    if (vh && ph && top - window.scrollY + ph > vh - 8) top = window.scrollY + Math.max(8, (r.top || 0) - ph - 4);\r\n    pop.style.left = left + \"px\";\r\n    pop.style.top = top + \"px\";\r\n  }\r\n\r\n  function open() {\r\n    openFlag = true;\r\n    const s = window.getSelection();\r\n    savedRange = s && s.rangeCount ? s.getRangeAt(0).cloneRange() : null;\r\n    maxColsCap = clamp(Math.round(getMaxCols()) || MAX, 1, MAX);\r\n    hovR = 1; hovC = 1; viewR = 0; viewC = 0;\r\n    pop.style.display = \"block\";\r\n    paint();\r\n    position();\r\n  }\r\n  function close() {\r\n    openFlag = false;\r\n    pop.style.display = \"none\";\r\n  }\r\n  function commit() {\r\n    const r = hovR, c = clamp(hovC, 1, maxColsCap);\r\n    // caret \uBCF5\uC6D0 \uD6C4 \uC0BD\uC785(\uBE44\uB3D9\uAE30 \uD638\uBC84 \uB3D9\uC548 selection\uC774 \uC720\uC9C0\uB418\uC9C0 \uC54A\uC558\uC744 \uC218 \uC788\uC74C)\r\n    if (savedRange) { const s = window.getSelection(); s.removeAllRanges(); s.addRange(savedRange); }\r\n    close();\r\n    onPick(r, c);\r\n  }\r\n\r\n  function onPopMove(e) {\r\n    const cell = e.target.closest && e.target.closest(\".tp-cell\");\r\n    if (cell) setHover(+cell.dataset.r, +cell.dataset.c);\r\n  }\r\n  function onPopMousedown(e) {\r\n    e.preventDefault(); // \uC5D0\uB514\uD130 caret \uC720\uC9C0(\uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uBC29\uC9C0)\r\n    const cell = e.target.closest && e.target.closest(\".tp-cell\");\r\n    if (cell) { setHover(+cell.dataset.r, +cell.dataset.c); commit(); }\r\n  }\r\n  function onDocMousedown(e) {\r\n    if (openFlag && !pop.contains(e.target)) close();\r\n  }\r\n  function onKeydown(e) {\r\n    if (!openFlag) return;\r\n    switch (e.key) {\r\n      case \"ArrowRight\": e.preventDefault(); setHover(hovR, hovC + 1); break;\r\n      case \"ArrowLeft\": e.preventDefault(); setHover(hovR, hovC - 1); break;\r\n      case \"ArrowDown\": e.preventDefault(); setHover(hovR + 1, hovC); break;\r\n      case \"ArrowUp\": e.preventDefault(); setHover(hovR - 1, hovC); break;\r\n      case \"Enter\": e.preventDefault(); commit(); break;\r\n      case \"Escape\": e.preventDefault(); close(); break;\r\n    }\r\n  }\r\n  pop.addEventListener(\"mousemove\", onPopMove);\r\n  pop.addEventListener(\"mousedown\", onPopMousedown);\r\n  document.addEventListener(\"mousedown\", onDocMousedown, true);\r\n  document.addEventListener(\"keydown\", onKeydown, true);\r\n\r\n  return {\r\n    open,\r\n    close,\r\n    isOpen: () => openFlag,\r\n    element: pop,\r\n    destroy() {\r\n      document.removeEventListener(\"mousedown\", onDocMousedown, true);\r\n      document.removeEventListener(\"keydown\", onKeydown, true);\r\n      if (pop.parentNode) pop.parentNode.removeChild(pop);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uACF5\uC6A9 \uBE14\uB85D \uD0C0\uC785 \uC815\uC758 \u2014 FloatingMenu\u00B7\uC11C\uC2DD \uD31D\uC5C5 \uD234\uBC14\uC758 \uBE14\uB85D \uC720\uD615 select \uACF5\uC720.\r\n * ui \uBAA8\uB4C8\uB07C\uB9AC \uC9C1\uC811 import \uD558\uC9C0 \uC54A\uB3C4\uB85D \uC5EC\uAE30\uB85C \uCD94\uCD9C(\uC21C\uD658\uC758\uC874 \uCC28\uB2E8).\r\n * [option value, locale key, fallback label]\r\n *   value: \"paragraph\" | \"heading:N\" | \"heading:N:toggle\" | \"toggleListItem\" | ...\r\n */\r\nexport const BLOCK_TYPE_DEFS = [\r\n  [\"paragraph\", \"paragraph\", \"\uBCF8\uBB38\"], [\"heading:1\", \"heading1\", \"\uC81C\uBAA91\"], [\"heading:2\", \"heading2\", \"\uC81C\uBAA92\"], [\"heading:3\", \"heading3\", \"\uC81C\uBAA93\"],\r\n  [\"heading:4\", \"heading4\", \"\uC81C\uBAA94\"], [\"heading:5\", \"heading5\", \"\uC81C\uBAA95\"], [\"heading:6\", \"heading6\", \"\uC81C\uBAA96\"],\r\n  [\"heading:1:toggle\", \"toggleHeading1\", \"\uD1A0\uAE00 \uC81C\uBAA9 1\"], [\"heading:2:toggle\", \"toggleHeading2\", \"\uD1A0\uAE00 \uC81C\uBAA9 2\"], [\"heading:3:toggle\", \"toggleHeading3\", \"\uD1A0\uAE00 \uC81C\uBAA9 3\"],\r\n  [\"bulletListItem\", \"bulletListItem\", \"\u2022 \uBAA9\uB85D\"], [\"numberedListItem\", \"numberedListItem\", \"1. \uBAA9\uB85D\"], [\"checkListItem\", \"checkListItem\", \"\u2611 \uCCB4\uD06C\"], [\"toggleListItem\", \"toggleList\", \"\uD1A0\uAE00 \uBAA9\uB85D\"],\r\n  [\"quote\", \"quote\", \"\uC778\uC6A9\"], [\"codeBlock\", \"codeBlock\", \"\uCF54\uB4DC\"],\r\n];\r\n", "/**\r\n * \uACF5\uC6A9 \uC0C9\uC0C1 \uD314\uB808\uD2B8(\uD234\uBC14 \uC2A4\uC640\uCE58\uC6A9) \u2014 FloatingMenu\u00B7\uC11C\uC2DD \uD31D\uC5C5 \uD234\uBC14 \uACF5\uC720.\r\n * [value, displayHex] \uBC30\uC5F4. value \uB294 BlockNote named \uC0C9(default/gray/\u2026), hex \uB294 \uC2A4\uC640\uCE58 \uD45C\uC2DC\uC0C9.\r\n * (\uD45C \uC140 \uC0C9\uC0C1\uC740 table-controls.js \uC758 HEX/TEXT_HEX \uB9F5\uC744 \uBCC4\uB3C4 \uC0AC\uC6A9)\r\n */\r\nexport const TEXT_PALETTE = [\r\n  [\"default\", \"\"], [\"gray\", \"#9b9a97\"], [\"brown\", \"#64473a\"], [\"red\", \"#e03e3e\"], [\"orange\", \"#d9730d\"],\r\n  [\"yellow\", \"#dfab01\"], [\"green\", \"#4d6461\"], [\"blue\", \"#0b6e99\"], [\"purple\", \"#6940a5\"], [\"pink\", \"#ad1a72\"],\r\n];\r\nexport const BG_PALETTE = [\r\n  [\"default\", \"\"], [\"gray\", \"#ebeced\"], [\"brown\", \"#e9e5e3\"], [\"red\", \"#fbe4e4\"], [\"orange\", \"#f6e9d9\"],\r\n  [\"yellow\", \"#fbf3db\"], [\"green\", \"#ddedea\"], [\"blue\", \"#ddebf1\"], [\"purple\", \"#eae4f2\"], [\"pink\", \"#f4dfeb\"],\r\n];\r\n", "/**\r\n * \uC11C\uC2DD \uD234\uBC14 (P2-\u2462, \uD655\uC7A5) \u2014 \uD14D\uC2A4\uD2B8 \uC120\uD0DD \uC2DC \uB728\uB294 \uD31D\uC5C5 \uD234\uBC14.\r\n * \uC6D0\uBCF8 CustomFormattingToolbar \uD328\uB9AC\uD2F0: \uBE14\uB85D \uD0C0\uC785 \u00B7 B/I/U/S/code \u00B7 \uC815\uB82C \u00B7 \uAE00\uC790\uD06C\uAE30 \u00B7 \uC0C9\uC0C1 \u00B7 \uB4E4\uC5EC\uC4F0\uAE30 \u00B7 \uB9C1\uD06C.\r\n *  - \uC77C\uBC18 \uBE14\uB85D(.content) \uC120\uD0DD: \uC804\uCCB4 \uB3C4\uAD6C \uB178\uCD9C.\r\n *  - \uD45C \uC140(td.lumir-cell) \uC120\uD0DD: \uC778\uB77C\uC778 \uB3C4\uAD6C(\uB9C8\uD06C/\uD06C\uAE30/\uC0C9)\uB9CC \u2014 \uBE14\uB85D \uB3C4\uAD6C\uB294 \uD45C \uC804\uC6A9 \uD234\uBC14\uAC00 \uB2F4\uB2F9.\r\n * inline-format \uC5D4\uC9C4(applyInlineMark/readActiveMarks) \uD65C\uC6A9. mousedown preventDefault\uB85C \uC120\uD0DD \uC720\uC9C0.\r\n */\r\n\r\nimport { applyInlineMark, readActiveMarks } from \"../inline-format.js\";\r\nimport { setBlockType, setBlockAlignment, indentBlock, outdentBlock } from \"../editing.js\";\r\nimport { directContent } from \"../serialize/block.js\";\r\nimport { BLOCK_TYPE_DEFS } from \"../shared/block-types.js\";\r\nimport { TEXT_PALETTE, BG_PALETTE } from \"../shared/palettes.js\";\r\nimport { ICON } from \"./icons.js\";\r\n\r\nconst MARK_BTNS = [\r\n  { mark: \"bold\", icon: ICON.bold, title: \"\uAD75\uAC8C\" },\r\n  { mark: \"italic\", icon: ICON.italic, title: \"\uAE30\uC6B8\uC784\" },\r\n  { mark: \"underline\", icon: ICON.underline, title: \"\uBC11\uC904\" },\r\n  { mark: \"strike\", icon: ICON.strikethrough, title: \"\uCDE8\uC18C\uC120\" },\r\n  { mark: \"code\", icon: ICON.code, title: \"\uCF54\uB4DC\" },\r\n];\r\nconst ALIGN_BTNS = [\r\n  { align: \"left\", icon: ICON.alignLeft, title: \"\uC67C\uCABD \uC815\uB82C\" },\r\n  { align: \"center\", icon: ICON.alignCenter, title: \"\uAC00\uC6B4\uB370 \uC815\uB82C\" },\r\n  { align: \"right\", icon: ICON.alignRight, title: \"\uC624\uB978\uCABD \uC815\uB82C\" },\r\n];\r\nconst FS_PRESETS = [10, 12, 14, 16, 18, 20, 24, 28];\r\nconst FS_MIN = 8, FS_MAX = 96, FS_DEFAULT = 14;\r\n\r\nexport function attachFormatToolbar(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  const suppress = typeof opts.suppress === \"function\" ? opts.suppress : () => false;\r\n  const onLink = typeof opts.onLink === \"function\" ? opts.onLink : null;\r\n  const cross = opts.cross || null; // \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD \uC11C\uC2DD \uD30C\uC0AC\uB4DC(\uC788\uC73C\uBA74 \uB2E4\uC911 \uBE14\uB85D \uB77C\uC6B0\uD305)\r\n  const isCross = () => !!(cross && cross.isActive());\r\n  const headingLevels = Array.isArray(opts.headingLevels) && opts.headingLevels.length ? opts.headingLevels : [1, 2, 3, 4, 5, 6];\r\n  const BT = (opts.locale && opts.locale.blockTypes) || {};\r\n  const blockTypeDefs = BLOCK_TYPE_DEFS.filter(([v]) => { const m = v.match(/^heading:(\\d)/); return !m || headingLevels.includes(+m[1]); });\r\n\r\n  const bar = document.createElement(\"div\");\r\n  bar.className = \"lumir-format-toolbar\";\r\n  bar.style.position = \"absolute\";\r\n  bar.style.display = \"none\";\r\n  bar.innerHTML = buildHtml();\r\n  document.body.appendChild(bar);\r\n\r\n  let activeEditable = null;\r\n  let savedRange = null; // \uD234\uBC14 \uC785\uB825/\uC140\uB809\uD2B8 \uD3EC\uCEE4\uC2A4 \uC2DC \uC783\uB294 \uC5D0\uB514\uD130 \uC120\uD0DD\uC744 \uBCF4\uC874\r\n\r\n  function activeBlock() {\r\n    return activeEditable && activeEditable.closest ? activeEditable.closest(\".block\") : null;\r\n  }\r\n  function captureRange() {\r\n    const s = window.getSelection();\r\n    if (!s || !s.rangeCount || !activeEditable) return;\r\n    const r = s.getRangeAt(0);\r\n    if (activeEditable.contains(r.startContainer) && activeEditable.contains(r.endContainer)) savedRange = r.cloneRange();\r\n  }\r\n  function restoreSelection() {\r\n    if (!savedRange) return;\r\n    try {\r\n      const s = window.getSelection();\r\n      s.removeAllRanges();\r\n      s.addRange(savedRange);\r\n    } catch (_) {}\r\n  }\r\n\r\n  function swatch(value, hex, kind) {\r\n    if (value === \"default\") return `<button type=\"button\" class=\"lf-swatch lf-none\" data-color=\"default\" data-kind=\"${kind}\" title=\"\uAE30\uBCF8\"></button>`;\r\n    return `<button type=\"button\" class=\"lf-swatch\" data-color=\"${value}\" data-kind=\"${kind}\" title=\"${value}\" style=\"background:${hex}\"></button>`;\r\n  }\r\n  function buildHtml() {\r\n    const types = `<select class=\"lf-type\" title=\"\uBE14\uB85D \uC720\uD615\">` + blockTypeDefs.map(([v, key, fb]) => `<option value=\"${v}\">${BT[key] || fb}</option>`).join(\"\") + `</select>`;\r\n    const marks = MARK_BTNS.map((b) => `<button type=\"button\" class=\"lf-btn\" data-mark=\"${b.mark}\" title=\"${b.title}\">${b.icon}</button>`).join(\"\");\r\n    const aligns = ALIGN_BTNS.map((b) => `<button type=\"button\" class=\"lf-btn\" data-align=\"${b.align}\" title=\"${b.title}\">${b.icon}</button>`).join(\"\");\r\n    const presets = `<option value=\"default\">\uAE30\uBCF8</option>` + FS_PRESETS.map((s) => `<option value=\"${s}\">${s}</option>`).join(\"\");\r\n    const fs = `<button type=\"button\" class=\"lf-btn lf-fs-step\" data-fs=\"-1\" title=\"\uAE00\uC790 \uC791\uAC8C\">\u2212</button><input type=\"text\" class=\"lf-fs-input\" inputmode=\"numeric\" /><button type=\"button\" class=\"lf-btn lf-fs-step\" data-fs=\"1\" title=\"\uAE00\uC790 \uD06C\uAC8C\">+</button><select class=\"lf-fs-preset\">${presets}</select>`;\r\n    const colorBtns = `<button type=\"button\" class=\"lf-btn lf-color-btn\" data-pop=\"text\" title=\"\uAE00\uC790\uC0C9\">${ICON.textColor}</button><button type=\"button\" class=\"lf-btn lf-color-btn\" data-pop=\"bg\" title=\"\uBC30\uACBD\uC0C9\">${ICON.bgColor}</button>`;\r\n    const textPop = `<div class=\"lf-pop\" data-for=\"text\">` + TEXT_PALETTE.map(([v, h]) => swatch(v, h, \"text\")).join(\"\") + `</div>`;\r\n    const bgPop = `<div class=\"lf-pop\" data-for=\"bg\">` + BG_PALETTE.map(([v, h]) => swatch(v, h, \"bg\")).join(\"\") + `</div>`;\r\n    const nest = `<button type=\"button\" class=\"lf-btn\" data-act=\"outdent\" title=\"\uB0B4\uC5B4\uC4F0\uAE30\">${ICON.outdent}</button><button type=\"button\" class=\"lf-btn\" data-act=\"indent\" title=\"\uB4E4\uC5EC\uC4F0\uAE30\">${ICON.indent}</button>`;\r\n    const link = onLink ? `<button type=\"button\" class=\"lf-btn\" data-act=\"link\" title=\"\uB9C1\uD06C (Ctrl+K)\">${ICON.link}</button>` : \"\";\r\n    const sep = `<span class=\"lf-sep\"></span>`;\r\n    // \uBE14\uB85D \uC804\uC6A9 \uADF8\uB8F9\uC740 lf-block \uD074\uB798\uC2A4\uB85C \uAC10\uC2F8 \uD45C \uC140 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC120 CSS\uB85C \uC228\uAE40\r\n    return (\r\n      `<div class=\"lf-group lf-block\">${types}</div>${sep}` +\r\n      `<div class=\"lf-group\">${marks}</div>${sep}` +\r\n      `<div class=\"lf-group lf-block\">${aligns}</div><span class=\"lf-sep lf-block\"></span>` +\r\n      `<div class=\"lf-group\">${fs}</div>${sep}` +\r\n      `<div class=\"lf-group\" style=\"position:relative\">${colorBtns}${textPop}${bgPop}</div>` +\r\n      `<span class=\"lf-sep lf-block\"></span><div class=\"lf-group lf-block\">${nest}${link}</div>`\r\n    );\r\n  }\r\n\r\n  function closestEditable(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    return el ? el.closest(\".content, td.lumir-cell\") : null;\r\n  }\r\n  function closePops() {\r\n    bar.querySelectorAll(\".lf-pop\").forEach((p) => p.classList.remove(\"open\"));\r\n  }\r\n  function hide() {\r\n    bar.style.display = \"none\";\r\n    closePops();\r\n  }\r\n  function position(rect) {\r\n    bar.style.position = \"absolute\"; // \uC120\uD0DD \uADFC\uCC98 \uBC30\uCE58\uB294 \uBB38\uC11C \uC88C\uD45C(absolute) \uAE30\uC900 \u2014 \uC804\uCCB4\uC120\uD0DD fixed \uBC30\uCE58 \uD6C4 \uBCF5\uC6D0\r\n    // \uC218\uD3C9 \uD074\uB7A8\uD504 \u2014 \uC881\uC740 \uCC3D\uC5D0\uC11C \uD234\uBC14\uAC00 \uBDF0\uD3EC\uD2B8 \uBC16\uC73C\uB85C \uC798\uB9AC\uC9C0 \uC54A\uB3C4\uB85D(\uC6B0\uCE21/\uC88C\uCE21 \uACBD\uACC4 \uC548\uC73C\uB85C).\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    const vh = (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || 0;\r\n    const bw = bar.offsetWidth || 0;\r\n    const bh = bar.offsetHeight || 0;\r\n    let left = window.scrollX + (rect.left || 0);\r\n    if (vw) {\r\n      const maxLeft = window.scrollX + vw - bw - 8;\r\n      if (left > maxLeft) left = maxLeft;\r\n    }\r\n    if (left < window.scrollX + 8) left = window.scrollX + 8;\r\n    // \uC138\uB85C: \uAE30\uBCF8\uC740 \uC120\uD0DD \uC704. \uC704 \uACF5\uAC04 \uC5C6\uC73C\uBA74 \uC120\uD0DD \uC544\uB798\uB85C flip.\r\n    let top = window.scrollY + rect.top - bh - 8;\r\n    if (top < window.scrollY + 4) top = window.scrollY + (rect.bottom || rect.top || 0) + 8;\r\n    // \uC5EC\uB7EC \uC904/\uC804\uCCB4 \uC120\uD0DD \uB4F1 \uD070 \uBC94\uC704: \uD234\uBC14\uAC00 \uBDF0\uD3EC\uD2B8 \uBC16(\uC704\u00B7\uC544\uB798)\uC73C\uB85C \uB098\uAC00\uC9C0 \uC54A\uB3C4\uB85D \uC138\uB85C \uD074\uB7A8\uD504\uD574 \uD56D\uC0C1 \uBCF4\uC774\uAC8C.\r\n    if (vh) {\r\n      const minTop = window.scrollY + 4;\r\n      const maxTop = window.scrollY + vh - bh - 8;\r\n      if (top > maxTop) top = maxTop;\r\n      if (top < minTop) top = minTop;\r\n    }\r\n    bar.style.top = top + \"px\";\r\n    bar.style.left = left + \"px\";\r\n  }\r\n  // Ctrl+A \uC804\uCCB4 \uC120\uD0DD: \uD654\uBA74(\uBDF0\uD3EC\uD2B8) \uC138\uB85C 1/4 \uC9C0\uC810\uC5D0 \uACE0\uC815(position:fixed)\uD558\uB418, \uC5D0\uB514\uD130 \uC138\uB85C \uBC94\uC704\r\n  // (\uCD5C\uC0C1\uB2E8~\uCD5C\uD558\uB2E8)\uB97C \uBC97\uC5B4\uB098\uC9C0 \uC54A\uAC8C \uD074\uB7A8\uD504\uD55C\uB2E4. \uC2A4\uD06C\uB864\uD574\uB3C4(onScroll\uC5D0\uC11C \uC7AC\uD638\uCD9C) \uC774 \uBC94\uC704 \uC548\uC5D0 \uBA38\uBB38\uB2E4.\r\n  const SELECTALL_VIEWPORT_RATIO = 0.25; // \uD654\uBA74 \uC138\uB85C 1/4 \uC9C0\uC810\r\n  function positionForSelectAll() {\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    const vh = (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || 0;\r\n    const er = editorEl.getBoundingClientRect\r\n      ? editorEl.getBoundingClientRect()\r\n      : { left: 0, width: vw, top: 0, bottom: 0 };\r\n    const bw = bar.offsetWidth || 0;\r\n    const bh = bar.offsetHeight || 0;\r\n    bar.style.position = \"fixed\"; // \uBDF0\uD3EC\uD2B8 \uAE30\uC900 \uACE0\uC815\r\n    // \uAC00\uB85C: \uC5D0\uB514\uD130 \uC911\uC559(\uBDF0\uD3EC\uD2B8 \uC88C\uD45C) \u2014 \uBDF0\uD3EC\uD2B8 \uC548\uC73C\uB85C \uD074\uB7A8\uD504\r\n    let left = er.left + (er.width - bw) / 2;\r\n    if (vw) {\r\n      const maxLeft = vw - bw - 8;\r\n      if (left > maxLeft) left = maxLeft;\r\n    }\r\n    if (left < 8) left = 8;\r\n    bar.style.left = left + \"px\";\r\n    // \uC138\uB85C: \uD654\uBA74 1/4 \uC9C0\uC810 \uC9C0\uD5A5, \uB2E8 \uC5D0\uB514\uD130 \uCD5C\uC0C1\uB2E8(er.top) \uC704 / \uCD5C\uD558\uB2E8(er.bottom) \uC544\uB798\uB85C \uC548 \uB098\uAC00\uAC8C \uD074\uB7A8\uD504.\r\n    const pad = 6;\r\n    const lower = er.top + pad; // \uC5D0\uB514\uD130 \uCD5C\uC0C1\uC704 \uACBD\uACC4\r\n    const upper = er.bottom - bh - pad; // \uC5D0\uB514\uD130 \uCD5C\uD558\uC704 \uACBD\uACC4\r\n    let top = vh * SELECTALL_VIEWPORT_RATIO;\r\n    if (top < lower) top = lower;\r\n    if (top > upper) top = upper;\r\n    bar.style.top = top + \"px\";\r\n  }\r\n  function isCell() {\r\n    return !!(activeEditable && activeEditable.classList && activeEditable.classList.contains(\"lumir-cell\"));\r\n  }\r\n  // \uC120\uD0DD \uC9C0\uC810\uC758 \uACC4\uC0B0\uB41C font-size(px) \u2014 \uBA85\uC2DC\uC801 fontSize \uB9C8\uD06C\uAC00 \uC5C6\uC744 \uB54C \uC2E4\uC81C \uD45C\uC2DC \uD06C\uAE30\uB97C \uBCF4\uC5EC\uC8FC\uAE30 \uC704\uD568.\r\n  function computedFsPx() {\r\n    try {\r\n      if (typeof getComputedStyle !== \"function\") return null;\r\n      const s = window.getSelection();\r\n      let node = s && s.rangeCount ? s.getRangeAt(0).startContainer : activeEditable;\r\n      if (node && node.nodeType === 3) node = node.parentElement;\r\n      if (!node || node.nodeType !== 1) node = activeEditable;\r\n      if (!node) return null;\r\n      const cs = getComputedStyle(node);\r\n      const n = cs ? parseInt(cs.fontSize, 10) : NaN;\r\n      return isNaN(n) ? null : n;\r\n    } catch (_) { return null; }\r\n  }\r\n  function renderActive() {\r\n    const crossActive = isCross();\r\n    const marks = crossActive ? cross.readMarks() : readActiveMarks(activeEditable);\r\n    MARK_BTNS.forEach((b) => {\r\n      const el = bar.querySelector(`[data-mark=\"${b.mark}\"]`);\r\n      if (el) el.classList.toggle(\"on\", !!marks[b.mark]);\r\n    });\r\n    // \uBA85\uC2DC\uC801 fontSize\uAC00 \uC788\uC73C\uBA74 \uADF8 \uAC12, \uC5C6\uC73C\uBA74 \uACC4\uC0B0\uB41C \uC2E4\uC81C \uD06C\uAE30(\uAE30\uBCF8/\uC81C\uBAA9 \uD06C\uAE30)\uB97C \uD45C\uAE30.\r\n    // \uD06C\uB85C\uC2A4 \uBAA8\uB4DC\uB294 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC774 \uBE44\uC5B4 computedFsPx\uAC00 \uBD80\uC815\uD655\uD558\uBBC0\uB85C \uBA85\uC2DC\uAC12\uB9CC \uD45C\uAE30.\r\n    const fsPx = marks.fontSize ? parseInt(marks.fontSize, 10) : (crossActive ? null : computedFsPx());\r\n    const px = fsPx && !isNaN(fsPx) ? String(fsPx) : \"\";\r\n    const input = bar.querySelector(\".lf-fs-input\");\r\n    if (input) input.value = px;\r\n    const preset = bar.querySelector(\".lf-fs-preset\");\r\n    if (preset) preset.value = (fsPx && FS_PRESETS.includes(fsPx)) ? String(fsPx) : \"default\";\r\n    // \uBE14\uB85D \uC804\uC6A9 \uB3C4\uAD6C: \uD45C \uC140\u00B7\uD06C\uB85C\uC2A4 \uBAA8\uB4DC\uC5D0\uC120 \uC228\uAE40(\uD06C\uB85C\uC2A4\uB294 \uBE14\uB85D \uD0C0\uC785/\uC815\uB82C/\uB9C1\uD06C \uBBF8\uC9C0\uC6D0 \u2014 v1).\r\n    bar.classList.toggle(\"lf-cell-ctx\", !crossActive && isCell());\r\n    bar.classList.toggle(\"lf-cross-ctx\", crossActive);\r\n    const b = activeBlock();\r\n    if (!crossActive && b && !isCell()) {\r\n      const sel = bar.querySelector(\".lf-type\");\r\n      if (sel) sel.value = b.dataset.type === \"heading\" ? \"heading:\" + (b.dataset.level || \"1\") + (b.dataset.toggle === \"true\" ? \":toggle\" : \"\") : b.dataset.type;\r\n      const al = b.dataset.textAlignment || \"left\";\r\n      ALIGN_BTNS.forEach((x) => { const el = bar.querySelector(`[data-align=\"${x.align}\"]`); if (el) el.classList.toggle(\"on\", al === x.align); });\r\n    }\r\n  }\r\n\r\n  function update() {\r\n    if (isComposing()) return;\r\n    if (document.activeElement && bar.contains(document.activeElement)) return; // \uD234\uBC14 \uC785\uB825 \uC911\uC5D4 \uC720\uC9C0(\uC228\uAE40 \uAE08\uC9C0)\r\n    // \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD: \uB124\uC774\uD2F0\uBE0C range\uAC00 \uBE44\uC5B4 \uC788\uC5B4 \uC544\uB798 \uACBD\uB85C\uB294 hide \uD558\uBBC0\uB85C \uBA3C\uC800 \uCC98\uB9AC.\r\n    if (isCross()) {\r\n      if (cross.isDragging && cross.isDragging()) { hide(); return; } // \uB4DC\uB798\uADF8 \uC911\uC5D4 \uC228\uAE40(\uB9C8\uC6B0\uC2A4\uC5C5\uC5D0 \uD45C\uC2DC)\r\n      if (suppress()) { hide(); return; } // \uD50C\uB85C\uD305 \uBA54\uB274 \uD65C\uC131 \uC2DC \uD31D\uC5C5 \uC5B5\uC81C(\uC774\uC911 \uD234\uBC14 \uBC29\uC9C0)\r\n      bar.style.display = \"flex\";\r\n      renderActive();\r\n      // Ctrl+A \uC804\uCCB4 \uC120\uD0DD \u2192 \uD654\uBA74 1/4 \uC9C0\uC810 \uACE0\uC815(\uC5D0\uB514\uD130 \uBC94\uC704 \uD074\uB7A8\uD504). \uB4DC\uB798\uADF8 \uD06C\uB85C\uC2A4 \uC120\uD0DD \u2192 \uC120\uD0DD \uADFC\uCC98(\uC720\uB2C8\uC628 rect).\r\n      if (cross.isBlockSelect && cross.isBlockSelect()) {\r\n        positionForSelectAll();\r\n      } else {\r\n        const rect = cross.boundingRect();\r\n        if (!rect) { hide(); return; }\r\n        position(rect);\r\n      }\r\n      return;\r\n    }\r\n    const sel = window.getSelection();\r\n    if (!sel || !sel.rangeCount) { hide(); return; }\r\n    const r = sel.getRangeAt(0);\r\n    if (r.collapsed) { hide(); return; }\r\n    const editable = closestEditable(r.startContainer);\r\n    if (!editable || !editorEl.contains(editable) || !editorEl.contains(r.endContainer)) { hide(); return; }\r\n    activeEditable = editable;\r\n    savedRange = r.cloneRange(); // \uD45C\uC2DC \uC2DC\uC810 \uC120\uD0DD \uBCF4\uC874\r\n    // FloatingMenu \uD65C\uC131 \uC2DC \uD3C9\uBB38 \uC120\uD0DD\uC740 \uC5B5\uC81C(\uD45C \uC140 \uC120\uD0DD\uC740 \uC720\uC9C0)\r\n    if (suppress() && !(editable.classList && editable.classList.contains(\"lumir-cell\"))) { hide(); return; }\r\n    bar.style.display = \"flex\";\r\n    renderActive();\r\n    const rect = r.getBoundingClientRect ? r.getBoundingClientRect() : { top: 0, left: 0 };\r\n    position(rect);\r\n  }\r\n\r\n  function currentFs() {\r\n    const marks = isCross() ? cross.readMarks() : readActiveMarks(activeEditable);\r\n    if (marks.fontSize) return parseInt(marks.fontSize, 10);\r\n    return computedFsPx() || FS_DEFAULT;\r\n  }\r\n  function applyFs(px) {\r\n    const val = px == null ? \"default\" : Math.max(FS_MIN, Math.min(FS_MAX, px)) + \"px\";\r\n    if (isCross()) {\r\n      cross.applyMark(\"fontSize\", val);\r\n      renderActive();\r\n      return;\r\n    }\r\n    applyInlineMark(activeEditable, \"fontSize\", val);\r\n    onChange();\r\n    renderActive();\r\n    captureRange(); // innerHTML \uAD50\uCCB4\uB85C \uBB34\uD6A8\uD654\uB41C savedRange \uAC31\uC2E0(\uC5F0\uC18D \uC870\uC791 \uB300\uBE44)\r\n  }\r\n\r\n  // \uC120\uD0DD \uC720\uC9C0: \uD234\uBC14 \uD074\uB9AD \uC2DC \uC5D0\uB514\uD130 blur \uBC29\uC9C0(\uC785\uB825/\uC140\uB809\uD2B8\uB294 \uC81C\uC678)\r\n  bar.addEventListener(\"mousedown\", (e) => {\r\n    if (e.target.closest(\"input, select\")) return;\r\n    e.preventDefault();\r\n  });\r\n\r\n  bar.addEventListener(\"click\", (e) => {\r\n    const crossActive = isCross();\r\n    if (!activeEditable && !crossActive) return;\r\n    const markBtn = e.target.closest(\"[data-mark]\");\r\n    if (markBtn) {\r\n      if (crossActive) cross.applyMark(markBtn.dataset.mark);\r\n      else { applyInlineMark(activeEditable, markBtn.dataset.mark); onChange(); }\r\n      renderActive();\r\n      return;\r\n    }\r\n    const fsBtn = e.target.closest(\"[data-fs]\");\r\n    if (fsBtn) { applyFs(currentFs() + parseInt(fsBtn.dataset.fs, 10)); return; }\r\n    const popBtn = e.target.closest(\"[data-pop]\");\r\n    if (popBtn) {\r\n      const p = bar.querySelector(`.lf-pop[data-for=\"${popBtn.dataset.pop}\"]`);\r\n      const wasOpen = p.classList.contains(\"open\");\r\n      closePops();\r\n      if (!wasOpen) p.classList.add(\"open\");\r\n      return;\r\n    }\r\n    const sw = e.target.closest(\".lf-swatch\");\r\n    if (sw) {\r\n      const kind = sw.dataset.kind === \"text\" ? \"textColor\" : \"backgroundColor\";\r\n      if (crossActive) cross.applyMark(kind, sw.dataset.color);\r\n      else { applyInlineMark(activeEditable, kind, sw.dataset.color); onChange(); }\r\n      closePops();\r\n      renderActive();\r\n      return;\r\n    }\r\n    // \uBE14\uB85D \uC804\uC6A9 \uB3C4\uAD6C(\uC815\uB82C/\uD0C0\uC785/\uB4E4\uC5EC\uC4F0\uAE30/\uB9C1\uD06C)\uB294 \uD06C\uB85C\uC2A4 \uBAA8\uB4DC\uC5D0\uC11C \uBBF8\uC9C0\uC6D0(v1) \u2014 \uBB34\uC2DC.\r\n    if (crossActive) return;\r\n    const alignBtn = e.target.closest(\"[data-align]\");\r\n    if (alignBtn) {\r\n      const b = activeBlock();\r\n      if (b) { setBlockAlignment(b, alignBtn.dataset.align); onChange(); renderActive(); }\r\n      return;\r\n    }\r\n    const actBtn = e.target.closest(\"[data-act]\");\r\n    if (actBtn) {\r\n      const a = actBtn.dataset.act;\r\n      const b = activeBlock();\r\n      if (a === \"link\") { if (onLink) onLink(); return; }\r\n      if (a === \"indent\" && b) { if (indentBlock(b)) { activeEditable = directContent(b); onChange(); } return; }\r\n      if (a === \"outdent\" && b) { if (outdentBlock(b)) { activeEditable = directContent(b); onChange(); } return; }\r\n      return;\r\n    }\r\n  });\r\n\r\n  bar.addEventListener(\"change\", (e) => {\r\n    const crossActive = isCross();\r\n    if (!activeEditable && !crossActive) return;\r\n    if (e.target.classList.contains(\"lf-type\")) {\r\n      if (crossActive) return; // \uD06C\uB85C\uC2A4 \uBAA8\uB4DC\uB294 \uBE14\uB85D \uD0C0\uC785 \uBCC0\uACBD \uBBF8\uC9C0\uC6D0(v1)\r\n      const b = activeBlock();\r\n      if (!b) return;\r\n      const [type, lvl, flag] = e.target.value.split(\":\");\r\n      const el = setBlockType(b, type, lvl ? parseInt(lvl, 10) : undefined, flag === \"toggle\");\r\n      activeEditable = directContent(el);\r\n      onChange();\r\n      renderActive();\r\n    } else if (e.target.classList.contains(\"lf-fs-preset\")) {\r\n      const v = e.target.value;\r\n      if (!crossActive) restoreSelection(); // \uC140\uB809\uD2B8 \uD3EC\uCEE4\uC2A4\uB85C \uC783\uC740 \uC120\uD0DD \uBCF5\uC6D0 \uD6C4 \uC801\uC6A9(\uD06C\uB85C\uC2A4\uB294 \uC624\uD504\uC14B \uAE30\uBC18\uC774\uB77C \uBD88\uC694)\r\n      applyFs(v === \"default\" ? null : parseInt(v, 10));\r\n    } else if (e.target.classList.contains(\"lf-fs-input\")) {\r\n      const n = parseInt(e.target.value, 10);\r\n      if (!crossActive) restoreSelection();\r\n      if (!isNaN(n)) applyFs(n);\r\n    }\r\n  });\r\n\r\n  // \uAE00\uC790\uD06C\uAE30 \uC785\uB825\uCE78: Enter \uC801\uC6A9 / ArrowUp\u00B7Down \u00B11px (\uC6D0\uBCF8 FontSizeButton \uD328\uB9AC\uD2F0)\r\n  bar.addEventListener(\"keydown\", (e) => {\r\n    const crossActive = isCross();\r\n    if (!activeEditable && !crossActive) return;\r\n    const input = e.target;\r\n    if (!input.classList || !input.classList.contains(\"lf-fs-input\")) return;\r\n    if (e.key === \"Enter\") {\r\n      e.preventDefault();\r\n      const n = parseInt(input.value, 10);\r\n      if (!crossActive) restoreSelection();\r\n      if (!isNaN(n)) applyFs(n);\r\n      input.focus();\r\n    } else if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\r\n      e.preventDefault();\r\n      if (!crossActive) restoreSelection();\r\n      applyFs(currentFs() + (e.key === \"ArrowUp\" ? 1 : -1));\r\n      input.focus();\r\n    }\r\n  });\r\n\r\n  let raf = 0;\r\n  function onSel() {\r\n    if (raf) cancelAnimationFrame(raf);\r\n    raf = requestAnimationFrame(update);\r\n  }\r\n  // Ctrl+A \uC804\uCCB4 \uC120\uD0DD(fixed \uBC30\uCE58)\uC77C \uB54C\uB9CC \uC2A4\uD06C\uB864 \uC911 \uC7AC\uD074\uB7A8\uD504 \u2014 \uC5D0\uB514\uD130 \uBC94\uC704 \uBC16\uC73C\uB85C \uB098\uAC00\uC9C0 \uC54A\uAC8C.\r\n  let scrollRaf = 0;\r\n  function onScroll() {\r\n    if (!(cross && cross.isBlockSelect && cross.isBlockSelect())) return;\r\n    if (bar.style.display === \"none\") return;\r\n    if (scrollRaf) cancelAnimationFrame(scrollRaf);\r\n    scrollRaf = requestAnimationFrame(positionForSelectAll);\r\n  }\r\n  document.addEventListener(\"selectionchange\", onSel);\r\n  editorEl.addEventListener(\"mouseup\", onSel);\r\n  editorEl.addEventListener(\"keyup\", onSel);\r\n  window.addEventListener(\"scroll\", onScroll, true); // capture: \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108/\uC708\uB3C4\uC6B0 \uBAA8\uB450 \uD3EC\uCC29\r\n\r\n  return {\r\n    element: bar,\r\n    update,\r\n    hide,\r\n    destroy() {\r\n      document.removeEventListener(\"selectionchange\", onSel);\r\n      editorEl.removeEventListener(\"mouseup\", onSel);\r\n      editorEl.removeEventListener(\"keyup\", onSel);\r\n      window.removeEventListener(\"scroll\", onScroll, true);\r\n      if (scrollRaf) cancelAnimationFrame(scrollRaf);\r\n      if (bar.parentNode) bar.parentNode.removeChild(bar);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD45C \uAD6C\uC870 \uC5F0\uC0B0 (P3-\u2460) \u2014 \uC0D8\uD50C block-editor.html\uC758 \uADF8\uB9AC\uB4DC \uC54C\uACE0\uB9AC\uC998\uC744 \uC6B0\uB9AC \uBAA8\uB378\uC5D0 \uC774\uC2DD.\r\n * \uBAA8\uB4E0 \uD568\uC218\uB294 `model`(= {G, columnWidths, ...})\uC744 \uBCC0\uD615\uD558\uACE0 normalize\uD55C\uB2E4. UI \uBB34\uAD00(\uC21C\uC218).\r\n *\r\n *  - insertRow/insertCol: \uACBD\uACC4\uB97C \uAC00\uB85C\uC9C0\uB974\uB294 \uBCD1\uD569\uC740 \uAC19\uC740 master\uB85C \uC5F0\uC7A5.\r\n *  - deleteRows/deleteCols: \uCD5C\uC18C 1\uD589/1\uC5F4 \uBCF4\uC7A5.\r\n *  - mergeCells: \uC120\uD0DD \uC0AC\uAC01\uD615\uC744 \uC88C\uC0C1\uB2E8 master\uB85C \uBCD1\uD569(\uBCD1\uD569 \uC778\uC9C0 \uD655\uC7A5), content \uC5F0\uACB0.\r\n *  - splitCell: \uBCD1\uD569 \uD574\uC81C(1\u00D71 \uBCF5\uC6D0).\r\n *\r\n * rect \uD615\uC2DD: { r1, c1, r2, c2 } (\uD3EC\uD568 \uBC94\uC704).\r\n */\r\n\r\nimport { newMaster, normalize } from \"./model.js\";\r\n\r\nfunction isEmptyContent(content) {\r\n  if (!Array.isArray(content) || !content.length) return true;\r\n  // \uACF5\uBC31\uC544\uB2CC \uD14D\uC2A4\uD2B8 \uB610\uB294 text\uAC00 \uC544\uB2CC \uB178\uB4DC(link\u00B7checkbox\u00B7olItem\u00B7ulItem \uB4F1 \uC778\uB77C\uC778 \uC6D0\uC790)\uAC00 \uC788\uC73C\uBA74 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC74C.\r\n  return !content.some((n) => (n && n.type && n.type !== \"text\") || ((n && n.text ? n.text : \"\").trim().length > 0));\r\n}\r\n\r\n/** \uC5EC\uB7EC \uC140 content\uB97C \uC904\uBC14\uAFC8\uC73C\uB85C \uC5F0\uACB0(\uBE44\uC5B4\uC788\uB294 \uAC74 \uC81C\uC678) */\r\nfunction concatContents(arrays) {\r\n  const nonEmpty = arrays.filter((a) => !isEmptyContent(a));\r\n  if (!nonEmpty.length) return [];\r\n  const out = [];\r\n  nonEmpty.forEach((a, i) => {\r\n    if (i > 0) out.push({ type: \"text\", text: \"\\n\", styles: {} });\r\n    for (const n of a) out.push(n);\r\n  });\r\n  return out;\r\n}\r\n\r\nfunction hasRowspan(model) { return model.G.some((row) => row.some((m) => m.rowspan > 1)); }\r\nfunction hasColspan(model) { return model.G.some((row) => row.some((m) => m.colspan > 1)); }\r\n\r\n/** \uD589 from \u2192 to \uB85C \uC774\uB3D9(F3). \uBCD1\uD569 \uD589\uC774 \uC788\uC73C\uBA74 \uBBF8\uC9C0\uC6D0(false). */\r\nexport function moveRow(model, from, to) {\r\n  const G = model.G;\r\n  if (from === to || from < 0 || to < 0 || from >= G.length || to >= G.length) return false;\r\n  if (hasRowspan(model)) return false;\r\n  const [row] = G.splice(from, 1);\r\n  G.splice(to, 0, row);\r\n  normalize(model);\r\n  return true;\r\n}\r\n\r\n/** \uC5F4 from \u2192 to \uB85C \uC774\uB3D9(F3). \uBCD1\uD569 \uC5F4\uC774 \uC788\uC73C\uBA74 \uBBF8\uC9C0\uC6D0(false). */\r\nexport function moveCol(model, from, to) {\r\n  const G = model.G;\r\n  const cols = G[0] ? G[0].length : 0;\r\n  if (from === to || from < 0 || to < 0 || from >= cols || to >= cols) return false;\r\n  if (hasColspan(model)) return false;\r\n  for (const row of G) { const [cell] = row.splice(from, 1); row.splice(to, 0, cell); }\r\n  // \uC5F4 \uC21C\uC11C\uB97C \uBC14\uAFB8\uBA74 \uC5F4\uD3ED\uB3C4 \uD568\uAED8 \uC774\uB3D9\uD574\uC57C \uD55C\uB2E4(insertCol/deleteCols\uC640 \uB3D9\uC77C\uD558\uAC8C columnWidths \uC720\uC9C0).\r\n  if (Array.isArray(model.columnWidths)) { const [w] = model.columnWidths.splice(from, 1); model.columnWidths.splice(to, 0, w); }\r\n  normalize(model);\r\n  return true;\r\n}\r\n\r\n/** \uBCD1\uD569 \uC140\uC744 \uD3EC\uD568\uD558\uB3C4\uB85D \uC0AC\uAC01\uD615 \uD655\uC7A5 */\r\nexport function expandRect(model, rect) {\r\n  const G = model.G;\r\n  let { r1, c1, r2, c2 } = rect;\r\n  let changed = true;\r\n  while (changed) {\r\n    changed = false;\r\n    for (let r = r1; r <= r2; r++) {\r\n      for (let c = c1; c <= c2; c++) {\r\n        const cell = G[r][c];\r\n        if (!cell) continue;\r\n        if (cell.r < r1) { r1 = cell.r; changed = true; }\r\n        if (cell.c < c1) { c1 = cell.c; changed = true; }\r\n        if (cell.r + cell.rowspan - 1 > r2) { r2 = cell.r + cell.rowspan - 1; changed = true; }\r\n        if (cell.c + cell.colspan - 1 > c2) { c2 = cell.c + cell.colspan - 1; changed = true; }\r\n      }\r\n    }\r\n  }\r\n  return { r1, c1, r2, c2 };\r\n}\r\n\r\nexport function insertRow(model, at) {\r\n  const G = model.G;\r\n  const C = G[0] ? G[0].length : 0;\r\n  at = Math.max(0, Math.min(at, G.length));\r\n  const row = [];\r\n  for (let c = 0; c < C; c++) {\r\n    if (at > 0 && at < G.length && G[at - 1][c] === G[at][c]) row[c] = G[at - 1][c]; // \uC138\uB85C \uBCD1\uD569 \uC5F0\uC7A5\r\n    else row[c] = newMaster();\r\n  }\r\n  G.splice(at, 0, row);\r\n  normalize(model);\r\n  return model;\r\n}\r\n\r\nexport function insertCol(model, at) {\r\n  const G = model.G;\r\n  at = Math.max(0, Math.min(at, G[0] ? G[0].length : 0));\r\n  for (let r = 0; r < G.length; r++) {\r\n    if (at > 0 && at < G[r].length && G[r][at - 1] === G[r][at]) G[r].splice(at, 0, G[r][at - 1]); // \uAC00\uB85C \uBCD1\uD569 \uC5F0\uC7A5\r\n    else G[r].splice(at, 0, newMaster());\r\n  }\r\n  if (Array.isArray(model.columnWidths)) model.columnWidths.splice(at, 0, null);\r\n  normalize(model);\r\n  return model;\r\n}\r\n\r\nexport function deleteRows(model, r1, r2) {\r\n  const G = model.G;\r\n  if (G.length - (r2 - r1 + 1) < 1) return false;\r\n  G.splice(r1, r2 - r1 + 1);\r\n  normalize(model);\r\n  return true;\r\n}\r\n\r\nexport function deleteCols(model, c1, c2) {\r\n  const G = model.G;\r\n  if ((G[0] ? G[0].length : 0) - (c2 - c1 + 1) < 1) return false;\r\n  for (let r = 0; r < G.length; r++) G[r].splice(c1, c2 - c1 + 1);\r\n  if (Array.isArray(model.columnWidths)) model.columnWidths.splice(c1, c2 - c1 + 1);\r\n  normalize(model);\r\n  return true;\r\n}\r\n\r\nexport function mergeCells(model, rect) {\r\n  const G = model.G;\r\n  rect = expandRect(model, rect);\r\n  if (rect.r1 === rect.r2 && rect.c1 === rect.c2) return false;\r\n  const keep = G[rect.r1][rect.c1];\r\n  const seen = new Set([keep]);\r\n  const others = [];\r\n  for (let r = rect.r1; r <= rect.r2; r++) {\r\n    for (let c = rect.c1; c <= rect.c2; c++) {\r\n      const cell = G[r][c];\r\n      if (!seen.has(cell)) {\r\n        seen.add(cell);\r\n        others.push(cell.content);\r\n      }\r\n      G[r][c] = keep;\r\n    }\r\n  }\r\n  const merged = concatContents([keep.content, ...others]);\r\n  keep.content = merged;\r\n  normalize(model);\r\n  return true;\r\n}\r\n\r\nexport function splitCell(model, master) {\r\n  const G = model.G;\r\n  if (!master || (master.rowspan === 1 && master.colspan === 1)) return false;\r\n  for (let r = master.r; r < master.r + master.rowspan; r++) {\r\n    for (let c = master.c; c < master.c + master.colspan; c++) {\r\n      if (r === master.r && c === master.c) continue;\r\n      G[r][c] = newMaster();\r\n    }\r\n  }\r\n  normalize(model);\r\n  return true;\r\n}\r\n", "/**\r\n * \uD45C \uD3ED \uB9DE\uCDA4(Fit-to-Width) \uCF54\uC5B4 \u2014 \uAC00\uB85C \uC2A4\uD06C\uB864\uC744 \uB450\uC9C0 \uC54A\uB294 \uC124\uACC4 \uC81C\uC57D\uC744 \uACB0\uC815\uB860\uC801\uC73C\uB85C \uBCF4\uC7A5.\r\n *\r\n * \uBD88\uBCC0\uC2DD: \uD45C \uC5F4\uD3ED \uD569\uC740 \uD56D\uC0C1 \uC608\uC0B0(budget = \uD3B8\uC9D1\uC601\uC5ED \uAC00\uC6A9\uD3ED) \uC774\uD558. \"\uD3ED \uCD08\uACFC\"\uB294 \uC2A4\uD06C\uB864\uC774 \uC5C6\uC73C\uBBC0\uB85C\r\n * \uD654\uBA74 \uAE68\uC9D0\uC774\uC9C0 \uB300\uC548\uC774 \uC544\uB2C8\uB2E4. \uB530\uB77C\uC11C \uBE0C\uB77C\uC6B0\uC800 CSS(max-width) \uC790\uB3D9 \uCD95\uC18C\uC5D0 \uB9E1\uAE30\uC9C0 \uC54A\uACE0 \uC5D0\uB514\uD130\uAC00\r\n * \uC5F4\uD3ED\uC744 \uC9C1\uC811 \uACC4\uC0B0\uD55C\uB2E4.\r\n *\r\n *  - effMinCol: \uC5F4 \uC218\u00B7\uC608\uC0B0\uC5D0 \uB530\uB978 \uC5F4 \uCD5C\uC18C\uD3ED. \uC5F4\uC774 \uB9CE\uC73C\uBA74 \uAE30\uBCF8\uCD5C\uC18C(40) \uBBF8\uB9CC HARD_MIN(24)\uAE4C\uC9C0 \uB0AE\uCDA4.\r\n *  - fitWidths: shrink-only(\uC791\uC740 \uD45C\uB294 \uB298\uB9AC\uC9C0 \uC54A\uC74C). \u03A3<=budget \uBCF4\uC7A5, \uAC01 \uC5F4 >= effMin. compact \uD50C\uB798\uADF8\r\n *    (effMin<40 = \uC5F4\uC774 \uB9CE\uC544 \uB20C\uB9B0 \uC0C1\uD0DC)\uB85C \uB80C\uB354\uAC00 CSS min-width\uB97C \uB0AE\uCD94\uB3C4\uB85D \uC2E0\uD638.\r\n */\r\n\r\nexport const HARD_MIN_COL = 24; // \uBB3C\uB9AC \uD558\uD55C(\uC774 \uC544\uB798\uB85C\uB294 \uC5F4 \uCD94\uAC00 \uCC28\uB2E8)\r\nexport const DEFAULT_MIN_COL = 40; // \uAE30\uBCF8 \uCD5C\uC18C\uD3ED(= CSS td min-width)\r\n\r\n/** \uC5F4 \uC218\u00B7\uC608\uC0B0 \uAE30\uBC18 \uC5F4 \uCD5C\uC18C\uD3ED. \uC608\uC0B0 \uBBF8\uC0C1(0)\uC774\uBA74 \uAE30\uBCF8 \uCD5C\uC18C\uB85C \uD3F4\uBC31(\uCE21\uC815 \uBD88\uAC00 \uD658\uACBD \uC548\uC804). */\r\nexport function effMinCol(cols, budget, capMin) {\r\n  capMin = capMin || DEFAULT_MIN_COL;\r\n  if (!budget || !cols || !isFinite(budget)) return capMin;\r\n  return Math.max(HARD_MIN_COL, Math.min(capMin, Math.floor(budget / cols)));\r\n}\r\n\r\n/**\r\n * widths(\uD604\uC7AC/\uC6D0\uD558\uB294 \uC5F4\uD3ED \uBC30\uC5F4; null=auto)\uB97C budget \uC774\uB0B4\uB85C \uCD95\uC18C.\r\n * @returns {{widths:(number|null)[], compact:boolean}}\r\n */\r\nexport function fitWidths(widths, budget, capMin) {\r\n  capMin = capMin || DEFAULT_MIN_COL;\r\n  if (!Array.isArray(widths) || !budget || !isFinite(budget)) return { widths, compact: false };\r\n  const cols = widths.length;\r\n  if (!cols) return { widths, compact: false };\r\n  const nums = widths.map((w) => w || 0);\r\n  const total = nums.reduce((a, b) => a + b, 0);\r\n  const eff = effMinCol(cols, budget, capMin);\r\n  if (total === 0) return { widths, compact: false }; // \uC804\uBD80 auto(null) \u2192 \uADF8\uB300\uB85C(CSS \uC790\uB3D9\uBD84\uBC30)\r\n  if (total <= budget) return { widths: widths.slice(), compact: eff < capMin }; // \uCD95\uC18C \uBD88\uD544\uC694(\uB298\uB9AC\uC9C0 \uC54A\uC74C)\r\n\r\n  // 1) \uBE44\uB840 \uCD95\uC18C \uD6C4 effMin \uBC14\uB2E5\r\n  const f = budget / total;\r\n  let out = nums.map((w) => Math.max(eff, Math.floor((w || eff) * f)));\r\n  // 2) \uBC14\uB2E5 \uB54C\uBB38\uC5D0 \uD569\uC774 \uC608\uC0B0 \uCD08\uACFC \uC2DC, effMin \uCD08\uACFC\uBD84(headroom)\uC5D0\uC11C \uBE44\uB840 \uD68C\uC218 \u2192 \u03A3<=budget \uBCF4\uC7A5\r\n  let excess = out.reduce((a, b) => a + b, 0) - budget;\r\n  if (excess > 0) {\r\n    const headroom = out.map((w) => w - eff);\r\n    const hsum = headroom.reduce((a, b) => a + b, 0);\r\n    if (hsum > 0) {\r\n      out = out.map((w, i) => w - Math.floor((excess * headroom[i]) / hsum));\r\n      // \uBC18\uC62C\uB9BC \uC794\uCC28\uB97C \uC5EC\uC720 \uC788\uB294 \uC5F4\uC5D0\uC11C \uB9C8\uC800 \uD68C\uC218\r\n      let resid = out.reduce((a, b) => a + b, 0) - budget;\r\n      for (let i = out.length - 1; i >= 0 && resid > 0; i--) {\r\n        const take = Math.min(resid, out[i] - eff);\r\n        out[i] -= take;\r\n        resid -= take;\r\n      }\r\n    }\r\n    // hsum===0(\uBAA8\uB4E0 \uC5F4\uC774 \uC774\uBBF8 effMin) = \uBB3C\uB9AC \uD558\uD55C \uCD08\uACFC(\uC608\uC0B0 < cols*HARD_MIN) \u2192 \uBD88\uAC00\uD53C\uD558\uAC8C \uC608\uC0B0 \uCD08\uACFC(compact)\r\n  } else if (excess < 0) {\r\n    // \uBC14\uB2E5 \uBC18\uC62C\uB9BC(Math.floor)\uC73C\uB85C \uD569\uC774 \uC608\uC0B0\uC5D0 \uBBF8\uB2EC \u2192 \uC794\uC5EC(<\uC5F4\uC218 px)\uB97C \uC55E \uC5F4\uBD80\uD130 +1\uC529 \uB418\uCC44\uC6CC \u03A3=budget.\r\n    // \uBE44\uB840 \uCD95\uC18C \uBE0C\uB79C\uCE58(total>budget)\uC5D0\uC11C\uB9CC \uB3D9\uC791\uD558\uBBC0\uB85C \uBAA9\uD45C\uAC00 \uC815\uD655\uD788 budget\uC774\uACE0, \"\uC2A4\uCF00\uC77C-\uD22C-\uB9E5\uC2A4\"\uAC00\r\n    // \uCD5C\uB300\uD3ED(=\uCD5C\uCD08 fill \uD3ED)\uC5D0 \uC815\uD655\uD788 \uB3C4\uB2EC\uD55C\uB2E4. shrink-only\uC758 total<=budget \uC870\uAE30\uBC18\uD658\uC740 \uC774 \uC704\uC5D0\uC11C \uC774\uBBF8 \uBC18\uD658\uB3FC \uBD88\uBCC0.\r\n    let deficit = -excess;\r\n    for (let i = 0; deficit > 0 && i < out.length; i++) { out[i] += 1; deficit--; }\r\n  }\r\n  // \uBB3C\uB9AC \uD558\uD55C \uBCF4\uC7A5: \uC9C0\uBC30 \uC5F4\uC774 \uC788\uB294 \uCD08\uD611\uC18C \uC608\uC0B0(budget < cols*eff)\uC5D0\uC11C \uD5E4\uB4DC\uB8F8 \uD68C\uC218\uAC00 \uC5F4\uC744 eff(\u2265HARD_MIN)\r\n  // \uBBF8\uB9CC\u00B7\uC74C\uC218\uB85C \uBC00 \uC218 \uC788\uB2E4 \u2192 \uCD5C\uC885\uC801\uC73C\uB85C eff\uB85C \uD074\uB7A8\uD504\uD55C\uB2E4. \uC774 \uACBD\uC6B0 \u03A3>budget(compact)\uB294 \uBD88\uAC00\uD53C(\uBB38\uC11C\uD654\uB41C \uD55C\uACC4).\r\n  out = out.map((w) => Math.max(eff, w));\r\n  return { widths: out, compact: eff < capMin };\r\n}\r\n", "/**\r\n * Excel/\uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8 \uD45C \uC11C\uC2DD \uC815\uADDC\uD654 (P6-\u2461)\r\n * kingdoo-editor\uC758 excel-paste.ts \uC0C9 \uC591\uC790\uD654 \uB85C\uC9C1\uC744 vanilla\uB85C \uC774\uC2DD.\r\n *\r\n * \uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8(\uC5D1\uC140 \uC628\uB77C\uC778/\uAD6C\uAE00 \uC2DC\uD2B8/\uC6CC\uB4DC)\uB294 \uC140 \uC11C\uC2DD\uC744 CSS \uC778\uB77C\uC778 \uC2A4\uD0C0\uC77C\uC774\uB098\r\n * \uD45C\uD604 \uC18D\uC131(bgcolor/align/valign)\uC73C\uB85C \uB0B4\uBCF4\uB0B8\uB2E4. htmlToInlineContent\uB294 \uC784\uC758 CSS \uC0C9\uC744\r\n * \uC77D\uC9C0 \uC54A\uC73C\uBBC0\uB85C(span\uC758 data-* \uB9CC \uC778\uC2DD), \uC140 \uC11C\uC2DD\uC744 \uC6B0\uB9AC \uBAA8\uB378\uC774 \uC778\uC2DD\uD558\uB294 \uD615\uD0DC\uB85C \uBCC0\uD658\uD55C\uB2E4:\r\n *  - CSS color/background \u2192 \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 10\uC0C9 \uD314\uB808\uD2B8(value) \u2192 \uC140 data-* (\uC140 prop)\r\n *  - text-align/align \u2192 data-text-alignment, vertical-align/valign \u2192 data-vertical-alignment\r\n *  - font-weight/style/underline \u2192 <strong>/<em>/<u> \uB798\uD551, font-size \u2192 data-font-size span\r\n *\r\n * \uD55C\uACC4: \uB370\uC2A4\uD06C\uD1B1 \uC5D1\uC140\uC758 \uD074\uB798\uC2A4 \uAE30\uBC18(<style>.xl65{background:#FF0})\uC740 getComputedStyle\uC774\r\n *   \uD544\uC694\uD574 \uC5EC\uAE30 \uC778\uB77C\uC778 \uACBD\uB85C\uB85C\uB294 \uC7A1\uC9C0 \uBABB\uD55C\uB2E4(\uC5D1\uC140 \uC628\uB77C\uC778/\uC2DC\uD2B8/\uC6CC\uB4DC\uB294 \uC778\uB77C\uC778 \u2192 \uB300\uBD80\uBD84 \uCEE4\uBC84).\r\n */\r\n\r\nconst NAMED_COLORS = {\r\n  black: '#000000',\r\n  white: '#ffffff',\r\n  red: '#ff0000',\r\n  green: '#008000',\r\n  blue: '#0000ff',\r\n  yellow: '#ffff00',\r\n  orange: '#ffa500',\r\n  purple: '#800080',\r\n  gray: '#808080',\r\n  grey: '#808080',\r\n};\r\n\r\n/** CSS \uC0C9 \uBB38\uC790\uC5F4(#hex, rgb(), \uC77C\uBD80 named) \u2192 [r,g,b]. \uC2E4\uD328 \uC2DC null */\r\nexport function parseCssColorToRgb(input) {\r\n  if (!input) return null;\r\n  const s = String(input).trim().toLowerCase();\r\n  if (!s || s === 'transparent' || s === 'none' || s === 'inherit') return null;\r\n  let m = s.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/);\r\n  if (m) {\r\n    let h = m[1];\r\n    if (h.length === 3)\r\n      h = h\r\n        .split('')\r\n        .map((c) => c + c)\r\n        .join('');\r\n    return [\r\n      parseInt(h.slice(0, 2), 16),\r\n      parseInt(h.slice(2, 4), 16),\r\n      parseInt(h.slice(4, 6), 16),\r\n    ];\r\n  }\r\n  m = s.match(/^rgba?\\(([^)]+)\\)$/);\r\n  if (m) {\r\n    const parts = m[1].split(/[,/]/).map((x) => parseFloat(x.trim()));\r\n    if (parts.length >= 3 && parts.slice(0, 3).every((n) => !isNaN(n))) {\r\n      // \uC644\uC804 \uD22C\uBA85(alpha=0)\uC740 \uBB34\uBC30\uACBD/\uBB34\uC0C9. getComputedStyle\uC774 \uC11C\uC2DD \uC5C6\uB294 \uC140\uC5D0\r\n      // \uB300\uD574 rgba(0,0,0,0)\uC744 \uB3CC\uB824\uC8FC\uB294\uB370, \uC774\uB97C \uAC80\uC815(\u2192gray)\uC73C\uB85C \uC624\uC778\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC81C\uC678.\r\n      if (parts.length >= 4 && parts[3] === 0) return null;\r\n      return [parts[0], parts[1], parts[2]];\r\n    }\r\n    return null;\r\n  }\r\n  if (NAMED_COLORS[s]) return parseCssColorToRgb(NAMED_COLORS[s]);\r\n  return null;\r\n}\r\n\r\nfunction rgbToHsl([r, g, b]) {\r\n  r /= 255;\r\n  g /= 255;\r\n  b /= 255;\r\n  const max = Math.max(r, g, b),\r\n    min = Math.min(r, g, b);\r\n  const l = (max + min) / 2;\r\n  let h = 0,\r\n    s = 0;\r\n  const d = max - min;\r\n  if (d !== 0) {\r\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n    if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) * 60;\r\n    else if (max === g) h = ((b - r) / d + 2) * 60;\r\n    else h = ((r - g) / d + 4) * 60;\r\n  }\r\n  return [h, s, l];\r\n}\r\n\r\nconst HUE_REFERENCE = [\r\n  { value: 'red', hue: 0 },\r\n  { value: 'brown', hue: 17 },\r\n  { value: 'orange', hue: 30 },\r\n  { value: 'yellow', hue: 46 },\r\n  { value: 'green', hue: 150 },\r\n  { value: 'blue', hue: 197 },\r\n  { value: 'purple', hue: 262 },\r\n  { value: 'pink', hue: 324 },\r\n];\r\n\r\nfunction hueDist(a, b) {\r\n  const d = Math.abs(a - b) % 360;\r\n  return d > 180 ? 360 - d : d;\r\n}\r\n\r\nfunction paletteValueFromRgb(rgb) {\r\n  const [h, s, l] = rgbToHsl(rgb);\r\n  if (s < 0.15) {\r\n    if (l < 0.35) return 'default'; // \uAC80\uC815\uB958\r\n    if (l > 0.85) return 'default'; // \uD770\uC0C9\uB958\r\n    return 'gray';\r\n  }\r\n  let best = 'gray',\r\n    bestDist = Infinity;\r\n  for (const ref of HUE_REFERENCE) {\r\n    const d = hueDist(h, ref.hue);\r\n    if (d < bestDist) {\r\n      bestDist = d;\r\n      best = ref.value;\r\n    }\r\n  }\r\n  return best;\r\n}\r\n\r\n/** \uC784\uC758 \uC0C9 \u2192 \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uD14D\uC2A4\uD2B8 \uD314\uB808\uD2B8 value (\uAC80\uC815\uB958\uB294 default) */\r\nexport function nearestTextColorValue(rgb) {\r\n  return paletteValueFromRgb(rgb);\r\n}\r\n\r\n/** \uC784\uC758 \uC0C9 \u2192 \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uBC30\uACBD \uD314\uB808\uD2B8 value (\uD770\uC0C9 \uADFC\uC0AC\uB9CC default=\uBB34\uBC30\uACBD) */\r\nexport function nearestBackgroundColorValue(rgb) {\r\n  const [, s, l] = rgbToHsl(rgb);\r\n  // \uBC30\uACBD\uC740 \uD14D\uC2A4\uD2B8\uC640 \uB2EC\uB9AC \uAC80\uC815/\uC9C4\uD68C\uC0C9\uC744 default(\uBB34\uBC30\uACBD)\uB85C \uBC84\uB9AC\uBA74 \uC5B4\uB450\uC6B4 \uCC44\uC6C0\uC774 \uC0AC\uB77C\uC9C4\uB2E4.\r\n  // \uD770\uC0C9 \uADFC\uC0AC\uB9CC default(\uBB34\uBC30\uACBD)\uB85C \uB450\uACE0, \uB098\uBA38\uC9C0 \uC800\uCC44\uB3C4(\uAC80\uC815~\uD68C\uC0C9)\uB294 gray\uB85C \uAC15\uB4F1\uD55C\uB2E4.\r\n  if (s < 0.15 && l > 0.85) return 'default'; // \uD770\uC0C9/\uADFC\uBC31\uC0C9 = \uBB34\uBC30\uACBD\r\n  if (s < 0.15) return 'gray'; // \uAC80\uC815\u00B7\uC9C4\uD68C\uC0C9\u00B7\uC911\uAC04\uD68C\uC0C9 = \uD68C\uC0C9 \uBC30\uACBD\r\n  return paletteValueFromRgb(rgb);\r\n}\r\n\r\nfunction parseStyle(style) {\r\n  const out = {};\r\n  String(style || '')\r\n    .split(';')\r\n    .forEach((decl) => {\r\n      const idx = decl.indexOf(':');\r\n      if (idx === -1) return;\r\n      const k = decl.slice(0, idx).trim().toLowerCase();\r\n      const v = decl.slice(idx + 1).trim();\r\n      if (k) out[k] = v;\r\n    });\r\n  return out;\r\n}\r\n\r\nfunction colorFromBackgroundShorthand(value) {\r\n  if (!value) return null;\r\n  const direct = parseCssColorToRgb(value);\r\n  if (direct) return direct;\r\n  for (const token of String(value).split(/\\s+/)) {\r\n    const rgb = parseCssColorToRgb(token);\r\n    if (rgb) return rgb;\r\n  }\r\n  return null;\r\n}\r\n\r\nfunction normalizeAlign(ta) {\r\n  const v = String(ta || '')\r\n    .trim()\r\n    .toLowerCase();\r\n  if (v === 'right' || v === 'end') return 'right';\r\n  if (v === 'center') return 'center';\r\n  return ''; // left/justify/start \u2192 \uAE30\uBCF8\r\n}\r\n\r\nfunction mapVerticalAlign(v) {\r\n  const s = String(v || '')\r\n    .trim()\r\n    .toLowerCase();\r\n  if (s === 'middle' || s === 'center') return 'middle';\r\n  if (s === 'bottom') return 'bottom';\r\n  return null;\r\n}\r\n\r\nfunction fontSizeToPx(raw) {\r\n  if (!raw) return null;\r\n  const m = String(raw)\r\n    .trim()\r\n    .match(/^([\\d.]+)\\s*(px|pt)?$/i);\r\n  if (!m) return null;\r\n  const v = parseFloat(m[1]);\r\n  if (!Number.isFinite(v) || v <= 0) return null;\r\n  return (m[2] || 'px').toLowerCase() === 'pt' ? v * (96 / 72) : v;\r\n}\r\n\r\n/** \uC140(td/th)\uC758 \uC778\uB77C\uC778 style + \uD45C\uD604 \uC18D\uC131\uC73C\uB85C \uC11C\uC2DD \uC77D\uAE30 */\r\nfunction readInlineFormat(el) {\r\n  const sm = parseStyle(el.getAttribute('style'));\r\n  const bgRaw = sm['background-color'] || sm['background'] || '';\r\n  const bgRgb =\r\n    colorFromBackgroundShorthand(bgRaw) ||\r\n    parseCssColorToRgb(el.getAttribute('bgcolor'));\r\n  const fw = (sm['font-weight'] || '').toLowerCase();\r\n  const decoration = sm['text-decoration'] || sm['text-decoration-line'] || '';\r\n  return {\r\n    bgRgb,\r\n    colorRgb: parseCssColorToRgb(sm['color']),\r\n    align: normalizeAlign(sm['text-align'] || el.getAttribute('align')),\r\n    bold: fw === 'bold' || fw === 'bolder' || parseInt(fw, 10) >= 600,\r\n    italic: (sm['font-style'] || '').toLowerCase().includes('italic'),\r\n    underline: decoration.toLowerCase().includes('underline'),\r\n    fontSizePx: fontSizeToPx(sm['font-size']),\r\n    verticalAlign: mapVerticalAlign(\r\n      sm['vertical-align'] || el.getAttribute('valign'),\r\n    ),\r\n  };\r\n}\r\n\r\n/** \uC140 \uC11C\uC2DD\uC744 \uC6B0\uB9AC \uBAA8\uB378\uC774 \uC778\uC2DD\uD558\uB294 data-* \uC18D\uC131/\uB9C8\uD06C \uB798\uD551\uC73C\uB85C \uC801\uC6A9 */\r\nfunction applyCellFormatting(el, fmt) {\r\n  if (fmt.bgRgb) {\r\n    const v = nearestBackgroundColorValue(fmt.bgRgb);\r\n    if (v !== 'default') el.setAttribute('data-background-color', v);\r\n  }\r\n  if (fmt.colorRgb) {\r\n    const v = nearestTextColorValue(fmt.colorRgb);\r\n    if (v !== 'default') el.setAttribute('data-text-color', v);\r\n  }\r\n  if (fmt.align === 'right' || fmt.align === 'center')\r\n    el.setAttribute('data-text-alignment', fmt.align);\r\n  if (fmt.verticalAlign)\r\n    el.setAttribute('data-vertical-alignment', fmt.verticalAlign);\r\n  if ((fmt.bold || fmt.italic || fmt.underline) && el.innerHTML.trim()) {\r\n    let inner = el.innerHTML;\r\n    if (fmt.underline) inner = `<u>${inner}</u>`;\r\n    if (fmt.italic) inner = `<em>${inner}</em>`;\r\n    if (fmt.bold) inner = `<strong>${inner}</strong>`;\r\n    el.innerHTML = inner;\r\n  }\r\n  if (\r\n    fmt.fontSizePx &&\r\n    Math.abs(fmt.fontSizePx - 14) > 1 &&\r\n    el.innerHTML.trim()\r\n  ) {\r\n    const v = `${Math.round(fmt.fontSizePx)}px`;\r\n    el.innerHTML = `<span data-font-size=\"${v}\" style=\"font-size:${v}\">${el.innerHTML}</span>`;\r\n  }\r\n}\r\n\r\n/** \uD45C \uC694\uC18C\uC758 \uC140 \uC11C\uC2DD\uC744 \uC81C\uC790\uB9AC \uC815\uADDC\uD654(\uC778\uB77C\uC778 \uACBD\uB85C). parseHtmlToBlocks\uAC00 \uD638\uCD9C. */\r\nexport function normalizeExcelTableEl(tableEl) {\r\n  if (!tableEl) return;\r\n  tableEl.querySelectorAll('td, th').forEach((cell) => {\r\n    applyCellFormatting(cell, readInlineFormat(cell));\r\n  });\r\n}\r\n\r\n/** getComputedStyle\uB85C \uC140 \uC11C\uC2DD \uC77D\uAE30(\uD074\uB798\uC2A4/<style>/inline \uBAA8\uB450 \uBC18\uC601) */\r\nfunction readComputedFormat(el) {\r\n  const cs = getComputedStyle(el);\r\n  const fw = cs.fontWeight;\r\n  const fwNum = parseInt(fw, 10);\r\n  const decoration = cs.textDecorationLine || cs.textDecoration || '';\r\n  return {\r\n    bgRgb: parseCssColorToRgb(cs.backgroundColor),\r\n    colorRgb: parseCssColorToRgb(cs.color),\r\n    align: normalizeAlign(cs.textAlign),\r\n    bold: fw === 'bold' || fw === 'bolder' || (!isNaN(fwNum) && fwNum >= 600),\r\n    italic: (cs.fontStyle || '').toLowerCase().includes('italic'),\r\n    underline: decoration.toLowerCase().includes('underline'),\r\n    fontSizePx: fontSizeToPx(cs.fontSize),\r\n    // computed vertical-align\uC740 td \uAE30\uBCF8 middle \uB178\uC774\uC988 \u2192 \uBA85\uC2DC inline/valign\uB9CC\r\n    verticalAlign: mapVerticalAlign(\r\n      (el.style && el.style.verticalAlign) || el.getAttribute('valign'),\r\n    ),\r\n  };\r\n}\r\n\r\n/**\r\n * \uD074\uB9BD\uBCF4\uB4DC HTML\uC758 \uD45C \uC140 \uC11C\uC2DD\uC744 \uC815\uADDC\uD654\uD55C HTML \uBC18\uD658(\uB370\uC2A4\uD06C\uD1B1 \uC5D1\uC140 \uD074\uB798\uC2A4 \uAE30\uBC18 \uC0C9 \uB300\uC751).\r\n * \uC5D1\uC140(\uB370\uC2A4\uD06C\uD1B1)\uC740 \uC140 \uC11C\uC2DD\uC744 <style>.xlNN{background:#..} \uD074\uB798\uC2A4\uB85C \uB0B4\uBCF4\uB0B8\uB2E4. \uACA9\uB9AC\uB41C Shadow DOM\uC5D0\r\n * \uC7A0\uAE50 \uBD99\uC5EC getComputedStyle\uB85C \uCD5C\uC885 \uC11C\uC2DD\uC744 \uC77D\uC5B4 data-* \uC18D\uC131\u00B7\uB9C8\uD06C\uB85C \uAD7D\uACE0, \uC6D0\uBCF8 \uC140\uC5D0 \uBC18\uC601\uD574 HTML\uB85C \uC9C1\uB82C\uD654.\r\n * \uBBF8\uC9C0\uC6D0/\uBE44\uBE0C\uB77C\uC6B0\uC800 \uD658\uACBD\uC740 \uC6D0\uBCF8 \uADF8\uB300\uB85C(\uC778\uB77C\uC778 \uACBD\uB85C\uAC00 \uCC98\uB9AC).\r\n */\r\nexport function normalizeExcelClipboardHtml(html) {\r\n  if (!html || typeof DOMParser === 'undefined') return html;\r\n  if (\r\n    typeof document === 'undefined' ||\r\n    !document.body ||\r\n    typeof HTMLElement === 'undefined' ||\r\n    typeof HTMLElement.prototype.attachShadow !== 'function' ||\r\n    typeof getComputedStyle === 'undefined'\r\n  )\r\n    return html;\r\n  let doc;\r\n  try {\r\n    doc = new DOMParser().parseFromString(html, 'text/html');\r\n  } catch (_) {\r\n    return html;\r\n  }\r\n  doc.querySelectorAll('script').forEach((s) => s.remove());\r\n  const tables = [...doc.querySelectorAll('table')];\r\n  if (!tables.length) return html;\r\n  const styles = [...doc.querySelectorAll('style')]\r\n    .map((s) => s.outerHTML)\r\n    .join('');\r\n  if (!styles) return html; // \uD074\uB798\uC2A4 \uAE30\uBC18 \uC2A4\uD0C0\uC77C \uC5C6\uC73C\uBA74 \uC778\uB77C\uC778 \uACBD\uB85C\uB85C \uCDA9\uBD84\r\n  let host = null;\r\n  try {\r\n    host = document.createElement('div');\r\n    host.setAttribute('aria-hidden', 'true');\r\n    host.style.cssText =\r\n      'position:absolute;left:-99999px;top:0;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;font-size:14px';\r\n    const shadow = host.attachShadow({ mode: 'open' });\r\n    shadow.innerHTML = styles + tables.map((t) => t.outerHTML).join('');\r\n    document.body.appendChild(host);\r\n    const shadowTables = [...shadow.querySelectorAll('table')];\r\n    tables.forEach((t, ti) => {\r\n      const st = shadowTables[ti];\r\n      if (!st) return;\r\n      const origCells = [...t.querySelectorAll('td, th')];\r\n      const shadowCells = [...st.querySelectorAll('td, th')];\r\n      origCells.forEach((cell, ci) => {\r\n        const sc = shadowCells[ci];\r\n        if (sc) applyCellFormatting(cell, readComputedFormat(sc));\r\n      });\r\n    });\r\n    return doc.body.innerHTML;\r\n  } catch (_) {\r\n    return html;\r\n  } finally {\r\n    if (host && host.parentNode) host.parentNode.removeChild(host);\r\n  }\r\n}\r\n", "/**\r\n * \uBD99\uC5EC\uB123\uAE30 \uD30C\uC11C (P6-\u2460) \u2014 \uD074\uB9BD\uBCF4\uB4DC HTML/\uD14D\uC2A4\uD2B8 \u2192 BlockNote \uBE14\uB85D \uBC30\uC5F4.\r\n * \uC0D8\uD50C block-editor.html\uC758 blocksFromHTML/gridFromHTML \uD328\uD134\uC744 \uC6B0\uB9AC \uBE14\uB85D/\uC9C1\uB82C\uD654\uC5D0 \uC774\uC2DD.\r\n * \uC778\uB77C\uC778\uC740 inline.js(htmlToInlineContent)\uB85C \uB9E4\uD551(strong/em/u/s/code/a \uBCF4\uC874).\r\n */\r\n\r\nimport { htmlToInlineContent } from \"../serialize/inline.js\";\r\nimport { normalizeExcelTableEl } from \"./excel-format.js\";\r\nimport { fitWidths } from \"../table/fit.js\";\r\n\r\nconst P = () => ({ textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" });\r\nconst SKIP = new Set([\"STYLE\", \"SCRIPT\", \"META\", \"LINK\", \"TITLE\", \"HEAD\", \"NOSCRIPT\"]);\r\n// \uBD99\uC5EC\uB123\uAE30 \uACBD\uB85C: \uC18C\uC2A4 \uC815\uB82C\uC6A9 \uAC1C\uD589\uC744 \uACF5\uBC31\uC73C\uB85C \uC811\uC5B4 \uC774\uC911 \uC904\uBC14\uAFC8/\uC904\uBD84\uB9AC \uBC29\uC9C0(collapseWhitespace).\r\nconst inlineOf = (el) => htmlToInlineContent(el, { collapseWhitespace: true });\r\n\r\n/** <table> \uC694\uC18C \u2192 BlockNote tableContent (colspan/rowspan/\uC815\uB82C/<th> \uBA38\uB9AC\uD589 \uBC18\uC601) */\r\nfunction tableContentFromTableEl(t) {\r\n  const rows = [...t.rows];\r\n  if (!rows.length) return null;\r\n  const out = rows.map(() => ({ cells: [] }));\r\n  const occ = {};\r\n  let maxCols = 0;\r\n  let hasTh = false;\r\n  rows.forEach((tr, r) => {\r\n    let c = 0;\r\n    [...tr.cells].forEach((cell) => {\r\n      while (occ[r + \"_\" + c]) c++;\r\n      const rs = cell.rowSpan || 1;\r\n      const cs = cell.colSpan || 1;\r\n      const props = { colspan: cs, rowspan: rs };\r\n      const ta = cell.getAttribute(\"data-text-alignment\") ||\r\n        (String((cell.style && cell.style.textAlign) || cell.getAttribute(\"align\") || \"\").toLowerCase().match(/left|center|right/) || [])[0];\r\n      if (ta && /^(left|center|right)$/.test(ta)) props.textAlignment = ta;\r\n      const bg = cell.getAttribute(\"data-background-color\");\r\n      if (bg) props.backgroundColor = bg;\r\n      const tcol = cell.getAttribute(\"data-text-color\");\r\n      if (tcol) props.textColor = tcol;\r\n      const va = cell.getAttribute(\"data-vertical-alignment\");\r\n      if (va) props.verticalAlignment = va;\r\n      if (cell.tagName === \"TH\") hasTh = true;\r\n      out[r].cells.push({ type: \"tableCell\", props, content: inlineOf(cell) });\r\n      for (let dr = 0; dr < rs; dr++) for (let dc = 0; dc < cs; dc++) if (!(dr === 0 && dc === 0)) occ[(r + dr) + \"_\" + (c + dc)] = true;\r\n      c += cs;\r\n      maxCols = Math.max(maxCols, c);\r\n    });\r\n  });\r\n  const content = { type: \"tableContent\", columnWidths: readSourceColWidths(t, maxCols), rows: out };\r\n  // \uBA38\uB9AC\uD589: \uCCAB \uD589\uC758 \uBAA8\uB4E0 \uC140\uC774 <th>. \uBA38\uB9AC\uC5F4: \uBAA8\uB4E0 \uD589\uC758 \uCCAB \uC140\uC774 <th>. (\uB458 \uB2E4\uBA74 \uB458 \uB2E4 \uC124\uC815)\r\n  // \uC774\uC804\uC5D4 \"\uCCAB \uD589\uC5D0 th\uAC00 \uD558\uB098\uB77C\uB3C4\" \u2192 headerRows \uB85C \uD310\uC815\uD574, th\uAC00 \uCCAB '\uC5F4'\uC778 \uD45C(\uD589\uBA38\uB9AC)\uB97C \uD589\uBA38\uB9AC\uB85C \uC624\uD310\uD588\uB2E4.\r\n  if (hasTh) {\r\n    const firstRow = rows[0] ? [...rows[0].cells] : [];\r\n    if (firstRow.length && firstRow.every((x) => x.tagName === \"TH\")) content.headerRows = 1;\r\n    if (rows.length && rows.every((tr) => tr.cells[0] && tr.cells[0].tagName === \"TH\")) content.headerCols = 1;\r\n  }\r\n  return content;\r\n}\r\n\r\nfunction pxOf(v) {\r\n  if (!v) return null;\r\n  const m = String(v).trim().match(/^([\\d.]+)\\s*(px|pt)?$/i);\r\n  if (!m) return null;\r\n  const n = parseFloat(m[1]);\r\n  if (!Number.isFinite(n) || n <= 0) return null;\r\n  return (m[2] || \"px\").toLowerCase() === \"pt\" ? Math.round((n * 96) / 72) : Math.round(n);\r\n}\r\n/** \uC18C\uC2A4 \uD45C\uC758 \uC5F4 \uD3ED(colgroup/\uCCAB \uD589 \uC140) \uCD94\uCD9C \u2014 \uC5C6\uC73C\uBA74 null \uBC30\uC5F4 */\r\nfunction readSourceColWidths(t, maxCols) {\r\n  const widths = new Array(maxCols).fill(null);\r\n  const cols = t.querySelectorAll(\":scope > colgroup > col\");\r\n  if (cols.length) {\r\n    let i = 0;\r\n    cols.forEach((col) => {\r\n      const span = parseInt(col.getAttribute(\"span\") || \"1\", 10) || 1;\r\n      const w = pxOf((col.style && col.style.width) || col.getAttribute(\"width\"));\r\n      for (let s = 0; s < span && i < maxCols; s++, i++) if (w) widths[i] = w;\r\n    });\r\n    if (widths.some(Boolean)) return widths;\r\n  }\r\n  const firstRow = t.rows && t.rows[0];\r\n  if (firstRow) {\r\n    let i = 0;\r\n    [...firstRow.cells].forEach((cell) => {\r\n      const cs = cell.colSpan || 1;\r\n      const w = pxOf((cell.style && cell.style.width) || cell.getAttribute(\"width\"));\r\n      const per = w ? Math.round(w / cs) : null;\r\n      for (let s = 0; s < cs && i < maxCols; s++, i++) if (per) widths[i] = per;\r\n    });\r\n  }\r\n  return widths.some(Boolean) ? widths : new Array(maxCols).fill(null);\r\n}\r\n\r\n/** \uB113\uC740 \uD45C \uD3ED \uB9DE\uCDA4: \uC5F4\uD3ED \uD569\uC774 maxWidth\uB97C \uB118\uC73C\uBA74 \uCD95\uC18C(\u03A3\u2264maxWidth \uBCF4\uC7A5, \uAC01 \u2265 effMin). \uACF5\uC6A9 solver \uC704\uC784. */\r\nexport function fitColumnWidths(widths, maxWidth, min) {\r\n  return fitWidths(widths, maxWidth, min || 40).widths;\r\n}\r\n\r\n/** \uD074\uB9BD\uBCF4\uB4DC HTML \u2192 \uBE14\uB85D \uBC30\uC5F4 */\r\nexport function parseHtmlToBlocks(html) {\r\n  if (typeof DOMParser === \"undefined\") return [];\r\n  let doc;\r\n  try { doc = new DOMParser().parseFromString(html, \"text/html\"); } catch (_) { return []; }\r\n  const out = [];\r\n  // <img> \u2192 image \uBE14\uB85D(\uC6D0\uACA9/Data URL \uC9C1\uC811 \uCC38\uC870). javascript:/SVG data URL\uC740 \uCC28\uB2E8(XSS).\r\n  const imageBlockFromImg = (node) => {\r\n    const src = (node.getAttribute(\"src\") || \"\").trim();\r\n    if (!src || /^javascript:/i.test(src) || /^data:image\\/svg/i.test(src)) return null;\r\n    const props = { url: src };\r\n    const alt = node.getAttribute(\"alt\");\r\n    if (alt) props.caption = alt;\r\n    const w = parseInt(node.getAttribute(\"width\"), 10);\r\n    if (w) props.previewWidth = w;\r\n    return { type: \"image\", props, children: [] }; // blocknote \uD30C\uC77C\uD615 \uBE14\uB85D: content \uD0A4 \uC5C6\uC74C\r\n  };\r\n  const pushPara = (node) => { const inline = inlineOf(node); if (inline.length) out.push({ type: \"paragraph\", props: P(), content: inline, children: [] }); };\r\n  const pushTyped = (node, type, extra) => { const inline = inlineOf(node); if (inline.length) out.push({ type, props: { ...P(), ...(extra || {}) }, content: inline, children: [] }); };\r\n\r\n  const walk = (cont) => {\r\n    cont.childNodes.forEach((node) => {\r\n      if (node.nodeType === 3) {\r\n        const tx = node.nodeValue;\r\n        if (tx && tx.trim()) out.push({ type: \"paragraph\", props: P(), content: [{ type: \"text\", text: tx, styles: {} }], children: [] });\r\n        return;\r\n      }\r\n      if (node.nodeType !== 1) return;\r\n      const t = node.tagName;\r\n      if (SKIP.has(t)) return;\r\n      if (t === \"TABLE\") { normalizeExcelTableEl(node); const c = tableContentFromTableEl(node); if (c) out.push({ type: \"table\", props: {}, content: c, children: [] }); return; }\r\n      if (/^H[1-6]$/.test(t)) { pushTyped(node, \"heading\", { level: +t[1] }); return; }\r\n      if (t === \"LI\") { pushTyped(node, node.closest(\"ol\") ? \"numberedListItem\" : \"bulletListItem\"); return; }\r\n      if (t === \"UL\" || t === \"OL\") { walk(node); return; }\r\n      if (t === \"BLOCKQUOTE\") { pushTyped(node, \"quote\"); return; }\r\n      if (t === \"PRE\") { const code = node.textContent || \"\"; out.push({ type: \"codeBlock\", props: { language: \"\" }, content: code ? [{ type: \"text\", text: code, styles: {} }] : [], children: [] }); return; }\r\n      if (t === \"IMG\") { const b = imageBlockFromImg(node); if (b) out.push(b); return; } // \uC774\uBBF8\uC9C0 \uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30/DnD\r\n      if (t === \"FIGURE\" || t === \"PICTURE\") { walk(node); return; } // <figure><img><figcaption>, <picture><img>\r\n      if (t === \"P\" || t === \"DIV\" || t === \"SECTION\" || t === \"ARTICLE\" || t === \"BODY\") {\r\n        if (node.querySelector(\"table,ul,ol,h1,h2,h3,h4,h5,h6,li,blockquote,pre,img,figure,picture\")) walk(node);\r\n        else pushPara(node);\r\n        return;\r\n      }\r\n      if (t === \"BR\") return;\r\n      // \uBBF8\uBD84\uB958 \uB798\uD37C\uB77C\uB3C4 \uC774\uBBF8\uC9C0/\uD45C\uAC00 \uB4E4\uC5B4 \uC788\uC73C\uBA74 \uC7AC\uADC0(\uD14D\uC2A4\uD2B8\uB9CC \uCD94\uCD9C\uB418\uC5B4 \uC720\uC2E4\uB418\uC9C0 \uC54A\uB3C4\uB85D)\r\n      if (node.querySelector && node.querySelector(\"img,figure,picture,table\")) { walk(node); return; }\r\n      pushPara(node);\r\n    });\r\n  };\r\n  walk(doc.body);\r\n  return out;\r\n}\r\n\r\n/** \uC5EC\uB7EC \uC904 \uD14D\uC2A4\uD2B8 \u2192 \uBB38\uB2E8 \uBE14\uB85D\uB4E4 */\r\nexport function blocksFromText(text) {\r\n  return String(text || \"\")\r\n    .split(/\\r?\\n/)\r\n    .filter((l) => l.trim().length)\r\n    .map((l) => ({ type: \"paragraph\", props: P(), content: [{ type: \"text\", text: l, styles: {} }], children: [] }));\r\n}\r\n\r\n/** \uB2E8\uC77C URL \uC5EC\uBD80(\uACF5\uBC31 \uC5C6\uB294 http(s)) */\r\nexport function isBareUrl(text) {\r\n  const t = String(text || \"\").trim();\r\n  return /^https?:\\/\\/\\S+$/.test(t) && !/\\s/.test(t);\r\n}\r\n\r\n/** \uD14D\uC2A4\uD2B8\uC5D0 http(s) URL\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uB294\uC9C0 */\r\nexport function hasUrl(text) {\r\n  return /https?:\\/\\/\\S/.test(String(text || \"\"));\r\n}\r\n\r\n/**\r\n * \uD14D\uC2A4\uD2B8\uB97C \uC778\uB77C\uC778 \uCF58\uD150\uCE20(text/link \uB178\uB4DC \uBC30\uC5F4)\uB85C \uBCC0\uD658 \u2014 http(s) URL \uBD80\uBD84\uB9CC link\uB85C.\r\n * URL \uB4A4 \uD754\uD55C \uBB38\uC7A5\uBD80\uD638(.,);]}>)\uB294 \uB9C1\uD06C\uC5D0\uC11C \uC81C\uC678\uD574 \uBCF8\uBB38\uC5D0 \uB0A8\uAE34\uB2E4.\r\n */\r\nexport function linkifyToInline(text) {\r\n  const s = String(text || \"\");\r\n  const re = /https?:\\/\\/[^\\s]+/g;\r\n  const out = [];\r\n  let last = 0, m;\r\n  const pushText = (t) => { if (t) out.push({ type: \"text\", text: t, styles: {} }); };\r\n  while ((m = re.exec(s))) {\r\n    let url = m[0];\r\n    let trail = \"\";\r\n    const tm = url.match(/[.,);\\]}>]+$/);\r\n    if (tm) { trail = tm[0]; url = url.slice(0, -trail.length); }\r\n    if (!url) { re.lastIndex = m.index + m[0].length; continue; }\r\n    pushText(s.slice(last, m.index));\r\n    out.push({ type: \"link\", href: url, content: [{ type: \"text\", text: url, styles: {} }] });\r\n    if (trail) pushText(trail);\r\n    last = m.index + m[0].length;\r\n  }\r\n  pushText(s.slice(last));\r\n  return out;\r\n}\r\n", "/**\r\n * \uD45C \uD074\uB9BD\uBCF4\uB4DC (\uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8\uC2DD \uAD6C\uC870 \uBCF4\uC874 \uBCF5\uC0AC/\uBD99\uC5EC\uB123\uAE30) \u2014 \uC21C\uC218, UI \uBB34\uAD00.\r\n * \uC2A4\uD399: docs/table-clipboard-spec.md\r\n *\r\n * \uD074\uB9BD \uD3EC\uB9F7 = \uAE30\uC874 BlockNote `tableContent`(\uBCC4\uB3C4 \uC2A4\uD0A4\uB9C8 \uC5C6\uC774 \uC9C1\uB82C\uD654 \uACC4\uCE35 \uC7AC\uC0AC\uC6A9).\r\n *  - extractGridClip: \uD45C \uBAA8\uB378\uC758 \uBD80\uBD84 \uC0AC\uAC01\uD615 \u2192 tableContent(\uACBD\uACC4 \uAC00\uB85C\uC9C0\uB974\uB294 \uBCD1\uD569\uC740 \uC798\uB9BC)\r\n *  - gridClipToHtml / gridClipToTSV: \uC678\uBD80(Excel/Sheets) \uC0C1\uD638\uC6B4\uC6A9\uC6A9 \uB0B4\uBCF4\uB0B4\uAE30\r\n *  - parseClipToGrid: \uD074\uB9BD\uBCF4\uB4DC(lumir-JSON / HTML <table> / TSV) \u2192 tableContent | null\r\n *  - pasteGridIntoModel: \uC575\uCEE4 \uC140\uBD80\uD130 \uADF8\uB9AC\uB4DC\uB85C \uCC44\uC6C0(\uC624\uBC84\uD50C\uB85C \uC790\uB3D9\uD655\uC7A5\u00B7\uB300\uC0C1\uBCD1\uD569 \uD574\uC81C\u00B7\uC18C\uC2A4\uBCD1\uD569 \uBCF4\uC874)\r\n */\r\n\r\nimport { newMaster, normalize } from \"./model.js\";\r\nimport { insertRow, insertCol, splitCell, expandRect } from \"./ops.js\";\r\nimport { modelToTableContent, tableContentToModel } from \"../serialize/table.js\";\r\nimport { blocksToHtml } from \"../serialize/html.js\";\r\nimport { parseHtmlToBlocks } from \"../paste/paste-html.js\";\r\nimport { normalizeExcelClipboardHtml } from \"../paste/excel-format.js\";\r\n\r\nexport const LUMIR_TABLE_MIME = \"application/x-lumir-table\";\r\n\r\n// \uC140\uC5D0\uC11C \uC655\uBCF5 \uBCF4\uC874\uD558\uB294 prop \uD0A4(serialize/table.js\uC640 \uB3D9\uC77C \uBAA9\uB85D)\r\nconst CELL_PROP_KEYS = [\"backgroundColor\", \"textColor\", \"textAlignment\", \"verticalAlignment\", \"rowHeight\"];\r\n\r\nconst deepContent = (content) => (Array.isArray(content) ? JSON.parse(JSON.stringify(content)) : []);\r\n\r\n/** master \uBCF5\uC81C(\uB0B4\uC6A9 \uB525\uCE74\uD53C + \uC140 prop \uBCF5\uC0AC). \uC0C8 id \uBD80\uC5EC. */\r\nfunction cloneMaster(src) {\r\n  const nm = newMaster({ content: deepContent(src && src.content) });\r\n  if (src) for (const k of CELL_PROP_KEYS) if (src[k] !== undefined) nm[k] = src[k];\r\n  return nm;\r\n}\r\n\r\n/** \uC778\uB77C\uC778 \uCF58\uD150\uCE20 \u2192 \uD3C9\uBB38(TSV/\uD3C9\uBB38 \uD074\uB9BD\uBCF4\uB4DC\uC6A9). link\uB294 \uB0B4\uBD80 content \uC7AC\uADC0. */\r\nfunction inlineText(content) {\r\n  if (!Array.isArray(content)) return \"\";\r\n  return content.map((n) => (n && n.type === \"link\" ? inlineText(n.content) : (n && n.text) || \"\")).join(\"\");\r\n}\r\n\r\n/**\r\n * \uBAA8\uB378\uC758 \uBD80\uBD84 \uC0AC\uAC01\uD615\uC744 \uD074\uB9BD(tableContent)\uC73C\uB85C \uCD94\uCD9C. rect\uB294 \uBCD1\uD569\uD655\uC7A5(expandRect) \uC644\uB8CC \uAC00\uC815.\r\n * \uACBD\uACC4\uB97C \uAC00\uB85C\uC9C0\uB974\uB294 \uBCD1\uD569\uC740 \uC548\uCABD \uC2AC\uB86F\uB9CC \uB0A8\uC544 normalize\uAC00 span\uC744 \uC790\uB3D9 \uCD95\uC18C(\uC798\uB9BC).\r\n */\r\nexport function extractGridClip(model, rect) {\r\n  const G = model.G || [];\r\n  const R = rect.r2 - rect.r1 + 1, C = rect.c2 - rect.c1 + 1;\r\n  const seen = new Map(); // old master -> new master (\uBCD1\uD569 \uACF5\uC720 \uC720\uC9C0)\r\n  const subG = [];\r\n  for (let r = 0; r < R; r++) {\r\n    subG[r] = [];\r\n    for (let c = 0; c < C; c++) {\r\n      const om = G[rect.r1 + r] && G[rect.r1 + r][rect.c1 + c];\r\n      let nm = om ? seen.get(om) : null;\r\n      if (!nm) { nm = cloneMaster(om); if (om) seen.set(om, nm); }\r\n      subG[r][c] = nm;\r\n    }\r\n  }\r\n  const widths = Array.isArray(model.columnWidths)\r\n    ? Array.from({ length: C }, (_, i) => (model.columnWidths[rect.c1 + i] != null ? model.columnWidths[rect.c1 + i] : null))\r\n    : new Array(C).fill(null);\r\n  const clipModel = { G: subG, columnWidths: widths };\r\n  normalize(clipModel);\r\n  return modelToTableContent(clipModel);\r\n}\r\n\r\n/** \uD074\uB9BD(tableContent) \u2192 HTML `<table>` \uBB38\uC790\uC5F4(\uC678\uBD80 \uBD99\uC5EC\uB123\uAE30 \uC0C1\uD638\uC6B4\uC6A9).\r\n * \uBB34\uC190\uC2E4 \uBCF5\uC6D0\uC6A9 \uD074\uB9BD JSON\uC744 \uD45C \uD0DC\uADF8\uC5D0 data-lumir-clip \uC73C\uB85C \uC784\uBCA0\uB4DC\uD55C\uB2E4(\uC678\uBD80 \uC571\uC740 \uBB34\uC2DC,\r\n * \uC5D0\uB514\uD130 \uC790\uCCB4 \uBD99\uC5EC\uB123\uAE30\uB294 parseClipToGrid\uAC00 \uC774 \uAC12\uC744 \uC6B0\uC120 \uC0AC\uC6A9\uD574 \uC0C9/\uC5F4\uD3ED/\uD5E4\uB354\uAE4C\uC9C0 \uC644\uC804 \uBCF5\uC6D0). */\r\nexport function gridClipToHtml(clip) {\r\n  const html = blocksToHtml([{ type: \"table\", props: {}, content: clip, children: [] }]);\r\n  try {\r\n    const json = encodeURIComponent(JSON.stringify(clip)); // \uB530\uC634\uD45C/<>/& \uC5C6\uB294 \uC548\uC804 \uBB38\uC790\uC5F4\r\n    return html.replace(/<table\\b/i, `<table data-lumir-clip=\"${json}\"`);\r\n  } catch (_) {\r\n    return html;\r\n  }\r\n}\r\n\r\n/** \uD074\uB9BD(tableContent) \u2192 TSV(\uD589 \\n, \uC140 \\t). \uBCD1\uD569/\uC11C\uC2DD\uC740 \uC18C\uC2E4(\uD3C9\uBB38 \uD3F4\uBC31). */\r\nexport function gridClipToTSV(clip) {\r\n  const rows = (clip && clip.rows) || [];\r\n  return rows\r\n    .map((row) => (row.cells || []).map((cell) => inlineText(cell.content).replace(/[\\t\\r\\n]+/g, \" \")).join(\"\\t\"))\r\n    .join(\"\\n\");\r\n}\r\n\r\n/** TSV \uBB38\uC790\uC5F4 \u2192 tableContent(\uAC01 \uC140 \uD3C9\uBB38 1x1, ragged\uB294 \uCD5C\uB300 \uC5F4\uC218\uB85C \uD328\uB529). */\r\nfunction tsvToTableContent(text) {\r\n  const lines = String(text).replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\");\r\n  const rows = lines.map((line) => line.split(\"\\t\"));\r\n  const cols = rows.reduce((m, r) => Math.max(m, r.length), 0);\r\n  if (!cols) return null;\r\n  return {\r\n    type: \"tableContent\",\r\n    columnWidths: new Array(cols).fill(null),\r\n    rows: rows.map((cells) => ({\r\n      cells: Array.from({ length: cols }, (_, i) => ({\r\n        type: \"tableCell\",\r\n        props: { colspan: 1, rowspan: 1 },\r\n        content: cells[i] ? [{ type: \"text\", text: cells[i], styles: {} }] : [],\r\n      })),\r\n    })),\r\n  };\r\n}\r\n\r\n/**\r\n * \uD074\uB9BD\uBCF4\uB4DC \uD398\uC774\uB85C\uB4DC \u2192 \uD074\uB9BD(tableContent) | null. \uC6B0\uC120\uC21C\uC704: lumir-JSON > HTML <table> > TSV.\r\n * @param {{lumir?:string, html?:string, text?:string}} payload\r\n */\r\nexport function parseClipToGrid(payload) {\r\n  const { lumir, html, text } = payload || {};\r\n  if (lumir) {\r\n    try {\r\n      const tc = JSON.parse(lumir);\r\n      if (tc && tc.type === \"tableContent\" && Array.isArray(tc.rows)) return tc;\r\n    } catch (_) { /* fallthrough */ }\r\n  }\r\n  if (html) {\r\n    // \uC5D0\uB514\uD130 \uC790\uCCB4 \uBCF5\uC0AC: gridClipToHtml\uC774 \uC784\uBCA0\uB4DC\uD55C \uBB34\uC190\uC2E4 \uD074\uB9BD\uC744 \uC6B0\uC120 \uBCF5\uC6D0(HTML \uD30C\uC2F1 \uC190\uC2E4 \uD68C\uD53C).\r\n    const m = html.match(/<table\\b[^>]*\\bdata-lumir-clip=\"([^\"]*)\"/i);\r\n    if (m) {\r\n      try {\r\n        const tc = JSON.parse(decodeURIComponent(m[1]));\r\n        if (tc && tc.type === \"tableContent\" && Array.isArray(tc.rows)) return tc;\r\n      } catch (_) { /* fallthrough */ }\r\n    }\r\n  }\r\n  if (html && /<table[\\s>]/i.test(html)) {\r\n    try {\r\n      // \uBB38\uB2E8 \uBD99\uC5EC\uB123\uAE30(editor.js)\uC640 \uB3D9\uC77C\uD558\uAC8C \uD074\uB798\uC2A4 \uAE30\uBC18 \uC0C9(PPT\u00B7\uB370\uC2A4\uD06C\uD1B1 Excel\uC758 <style>.cls{background})\uC744\r\n      // computed \uC815\uADDC\uD654\uB85C data-*\uC5D0 \uAD6C\uC6B4 \uB4A4 \uD30C\uC2F1\uD55C\uB2E4. \uC774 \uB2E8\uACC4\uAC00 \uC5C6\uC73C\uBA74 \uC140 \uBD99\uC5EC\uB123\uAE30\uC5D0\uC11C \uBC30\uACBD/\uAE00\uC790\uC0C9\uC774 \uB204\uB77D\uB41C\uB2E4.\r\n      const blocks = parseHtmlToBlocks(normalizeExcelClipboardHtml(html));\r\n      const t = blocks.find((b) => b.type === \"table\");\r\n      if (t && t.content) return t.content;\r\n    } catch (_) { /* fallthrough */ }\r\n  }\r\n  if (text && /\\t|\\n/.test(text)) return tsvToTableContent(text);\r\n  return null;\r\n}\r\n\r\n/**\r\n * \uC575\uCEE4 \uC140\uBD80\uD130 \uD074\uB9BD \uADF8\uB9AC\uB4DC\uB85C \uB300\uC0C1 \uBAA8\uB378\uC744 \uCC44\uC6B4\uB2E4(\uC81C\uC790\uB9AC \uBCC0\uD615).\r\n *  - \uC624\uBC84\uD50C\uB85C: insertRow/insertCol \uB85C \uB300\uC0C1 \uC790\uB3D9 \uD655\uC7A5\r\n *  - \uB300\uC0C1 \uBCD1\uD569: \uBD99\uC784 \uC601\uC5ED\uACFC \uACB9\uCE58\uB294 \uBCD1\uD569 \uD574\uC81C(splitCell)\r\n *  - \uC18C\uC2A4 \uBCD1\uD569: \uACF5\uC720 master \uB85C \uBCF4\uC874\r\n *  - opts.maxCols: \uC5F4 \uC790\uB3D9\uD655\uC7A5 \uC0C1\uD55C(\uC5D0\uB514\uD130 \uAC00\uC6A9\uD3ED \uC608\uC0B0). \uCD08\uACFC \uC5F4\uC740 \uC798\uB9BC(\uC138\uB85C/\uD589\uC740 \uBB34\uC81C\uD55C). 0/\uBBF8\uC9C0\uC815=\uBB34\uC81C\uD55C.\r\n * @returns {boolean} \uCC44\uC6C0 \uC131\uACF5 \uC5EC\uBD80\r\n */\r\nexport function pasteGridIntoModel(model, anchor, clip, opts) {\r\n  const src = tableContentToModel(clip);\r\n  const sR = src.G.length, sCsrc = src.G[0] ? src.G[0].length : 0;\r\n  if (!sR || !sCsrc) return false;\r\n  const ar = Math.max(0, anchor.r | 0), ac = Math.max(0, anchor.c | 0);\r\n  const maxCols = opts && opts.maxCols > 0 ? opts.maxCols : Infinity;\r\n  const curCols = () => (model.G[0] ? model.G[0].length : 0);\r\n\r\n  // 1) \uC790\uB3D9 \uD655\uC7A5 \u2014 \uD589\uC740 \uC804\uBD80, \uC5F4\uC740 \uC608\uC0B0(maxCols) \uB0B4\uC5D0\uC11C\uB9CC. \uC608\uC0B0 \uCD08\uACFC \uC18C\uC2A4 \uC5F4\uC740 \uC798\uB9BC(\uD45C\uAC00 \uD3B8\uC9D1\uC601\uC5ED\uC744 \uBC97\uC5B4\uB098\uC9C0 \uC54A\uB3C4\uB85D).\r\n  while (model.G.length < ar + sR) insertRow(model, model.G.length);\r\n  const wantCols = Math.min(ac + sCsrc, maxCols);\r\n  while (curCols() < wantCols) insertCol(model, curCols());\r\n  const sC = Math.max(0, Math.min(sCsrc, curCols() - ac)); // \uC608\uC0B0 \uB0B4 \uC2E4\uC81C \uBD99\uC77C \uC5F4 \uC218\r\n  if (sC < 1) { normalize(model); return sR > 0; } // \uAC00\uB85C\uB294 \uC608\uC0B0 \uCD08\uACFC \u2192 \uD589 \uD655\uC7A5\uB9CC(\uC788\uC5C8\uB2E4\uBA74) \uBC18\uC601\r\n\r\n  // 2) \uBD99\uC784 \uC601\uC5ED\uACFC \uACB9\uCE58\uB294 \uB300\uC0C1 \uBCD1\uD569 \uD574\uC81C(\uBA3C\uC800 \uC218\uC9D1 \uD6C4 \uBD84\uD560 \u2014 \uBC18\uBCF5 \uC911 \uBCC0\uD615 \uD68C\uD53C).\r\n  const region = expandRect(model, { r1: ar, c1: ac, r2: ar + sR - 1, c2: ac + sC - 1 });\r\n  const toSplit = new Set();\r\n  for (let r = region.r1; r <= region.r2; r++)\r\n    for (let c = region.c1; c <= region.c2; c++) {\r\n      const m = model.G[r][c];\r\n      if (m && (m.rowspan > 1 || m.colspan > 1)) toSplit.add(m);\r\n    }\r\n  toSplit.forEach((m) => splitCell(model, m));\r\n\r\n  // 3) \uC18C\uC2A4 \uC140\uC744 \uB300\uC0C1\uC5D0 \uBCF5\uC81C(\uC18C\uC2A4 \uBCD1\uD569\uC740 \uACF5\uC720 master \uB85C \uBCF4\uC874).\r\n  const map = new Map();\r\n  for (let r = 0; r < sR; r++)\r\n    for (let c = 0; c < sC; c++) {\r\n      const sm = src.G[r][c];\r\n      let tm = map.get(sm);\r\n      if (!tm) { tm = cloneMaster(sm); map.set(sm, tm); }\r\n      model.G[ar + r][ac + c] = tm;\r\n    }\r\n\r\n  normalize(model);\r\n  return true;\r\n}\r\n", "/**\r\n * \uD45C \uC778\uD130\uB799\uC158 \uCEE8\uD2B8\uB864\uB7EC (P3-\u2461\u2462\u2463) \u2014 \uC0D8\uD50C block-editor.html \uD328\uD134(D5)\uC744 \uC6B0\uB9AC \uBAA8\uB378/\uB80C\uB354/\uC9C1\uB82C\uD654\uC5D0 \uC774\uC2DD.\r\n *  - P3-\u2461: \uC140 \uB4DC\uB798\uADF8 \uC120\uD0DD + .sel-cell + \uB2E8\uC77C \uC120\uD0DD\uBC15\uC2A4.\r\n *  - P3-\u2462: \uD45C \uD234\uBC14(\uD589/\uC5F4 \uCD94\uAC00\uC0AD\uC81C\u00B7\uBCD1\uD569/\uBD84\uD560\u00B7\uC815\uB82C\u00B7\uC138\uB85C\uC815\uB82C\u00B7\uC140 \uBC30\uACBD/\uAE00\uC790\uC0C9\u00B7\uBA38\uB9AC\uD589/\uC5F4).\r\n *  - P3-\u2463: \uC5F4/\uD589 \uB9AC\uC0AC\uC774\uC988 \uD578\uB4E4 + \uD589/\uC5F4 \uCD94\uAC00 \uD638\uBC84\uBC14 + Tab/\uD654\uC0B4\uD45C \uC140 \uB0B4\uBE44 + Enter \uC904\uBC14\uAFC8.\r\n *\r\n * \uAD6C\uC870 \uC5F0\uC0B0 \uD6C4: syncModelFromTableDom \u2192 \uC5F0\uC0B0 \u2192 rerenderTable \u2192 \uC7AC\uD3EC\uCEE4\uC2A4 \u2192 onChange(commit).\r\n * \uC18D\uC131(\uC815\uB82C/\uC0C9)\uC740 \uC7AC\uB80C\uB354 \uC5C6\uC774 \uBAA8\uB378+DOM \uC9C1\uC811 \uAC31\uC2E0(\uCE90\uB7FF \uC720\uC9C0).\r\n */\r\n\r\nimport { syncModelFromTableDom, rerenderTable } from \"./render.js\";\r\nimport { insertRow, insertCol, deleteRows, deleteCols, mergeCells, splitCell, moveRow, moveCol, expandRect } from \"./ops.js\";\r\nimport { fitWidths, effMinCol, HARD_MIN_COL } from \"./fit.js\";\r\nimport { extractGridClip, gridClipToHtml, gridClipToTSV, parseClipToGrid, pasteGridIntoModel, LUMIR_TABLE_MIME } from \"./clipboard.js\";\r\n\r\nconst FILL_COLORS = [\"default\", \"gray\", \"brown\", \"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\"];\r\nconst HEX = { gray: \"#ebeced\", brown: \"#e9e5e3\", red: \"#fbe4e4\", orange: \"#f6e9d9\", yellow: \"#fbf3db\", green: \"#ddedea\", blue: \"#ddebf1\", purple: \"#eae4f2\", pink: \"#f4dfeb\" };\r\nconst TEXT_HEX = { gray: \"#9b9a97\", brown: \"#64473a\", red: \"#e03e3e\", orange: \"#d9730d\", yellow: \"#dfab01\", green: \"#4d6461\", blue: \"#0b6e99\", purple: \"#6940a5\", pink: \"#ad1a72\" };\r\nconst MIN_COL = 40, MIN_ROW = 24;\r\n// \uC804\uCCB4/\uCF54\uB108 \uC2A4\uCF00\uC77C \uD558\uD55C \u2014 compact(\uC5F4 \uB2E4\uC218) \uC0C1\uD0DC\uC758 CSS min-width(HARD_MIN_COL)\uC640 \uC815\uD569\uD574 \uBAA8\uB378=\uB80C\uB354 \uC77C\uCE58.\r\nconst MIN_SCALE_COL = HARD_MIN_COL, MIN_SCALE_ROW = HARD_MIN_COL;\r\n\r\n// \uBAA8\uBC14\uC77C \uBDF0\uD3EC\uD2B8: \uD3ED \uB9DE\uCDA4(fit-to-width) \uB300\uC2E0 \uAC00\uB85C \uC2A4\uD06C\uB864 \uD5C8\uC6A9. CSS \uBE0C\uB808\uC774\uD06C\uD3EC\uC778\uD2B8(table.css)\uC640 \uC77C\uCE58\uC2DC\uD0AC \uAC83.\r\nconst MOBILE_MQ = \"(max-width: 640px)\";\r\nfunction isMobileViewport() {\r\n  return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(MOBILE_MQ).matches;\r\n}\r\n\r\n// \uD45C \uD234\uBC14 SVG \uC544\uC774\uCF58 (block-editor.html \uC138\uD2B8 + vanilla \uD655\uC7A5: \uD45C\uC815\uB82C tbl*, \uAE00\uC790\uC0C9 tcolor).\r\nconst SVG_ICON = (p) => `<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${p}</svg>`;\r\nconst TT_ICN = {\r\n  rowAbove: '<path d=\"M8 2v4.5\"/><path d=\"M5.8 4 8 1.8 10.2 4\"/><path d=\"M3 9.5h10\"/><path d=\"M3 12.5h10\"/>',\r\n  rowBelow: '<path d=\"M3 3.5h10\"/><path d=\"M3 6.5h10\"/><path d=\"M8 9.5V14\"/><path d=\"M5.8 12 8 14.2 10.2 12\"/>',\r\n  rowDel: '<path d=\"M3 4.5h10\"/><path d=\"M3 11.5h10\"/><path d=\"M5.5 8h5\"/>',\r\n  colLeft: '<path d=\"M2 8h4.5\"/><path d=\"M4 5.8 1.8 8 4 10.2\"/><path d=\"M9.5 3v10\"/><path d=\"M12.5 3v10\"/>',\r\n  colRight: '<path d=\"M3.5 3v10\"/><path d=\"M6.5 3v10\"/><path d=\"M9.5 8H14\"/><path d=\"M12 5.8 14.2 8 12 10.2\"/>',\r\n  colDel: '<path d=\"M4.5 3v10\"/><path d=\"M11.5 3v10\"/><path d=\"M5.5 8h5\"/>',\r\n  merge: '<rect x=\"2\" y=\"4.3\" width=\"12\" height=\"7.4\" rx=\"1.3\"/><path d=\"M5 6.5 6.6 8 5 9.5\"/><path d=\"M11 6.5 9.4 8 11 9.5\"/>',\r\n  split: '<rect x=\"2\" y=\"4.3\" width=\"12\" height=\"7.4\" rx=\"1.3\"/><path d=\"M8 4.3v7.4\"/>',\r\n  alignL: '<path d=\"M2.5 4.5h11\"/><path d=\"M2.5 8h7\"/><path d=\"M2.5 11.5h9\"/>',\r\n  alignC: '<path d=\"M2.5 4.5h11\"/><path d=\"M4.5 8h7\"/><path d=\"M3.5 11.5h9\"/>',\r\n  alignR: '<path d=\"M2.5 4.5h11\"/><path d=\"M6.5 8h7\"/><path d=\"M4.5 11.5h9\"/>',\r\n  valTop: '<path d=\"M2.5 2.5h11\"/><rect x=\"6\" y=\"4.5\" width=\"4\" height=\"7\" rx=\"0.6\"/>',\r\n  valMid: '<rect x=\"6\" y=\"4.5\" width=\"4\" height=\"7\" rx=\"0.6\"/><path d=\"M2.5 8h2.5\"/><path d=\"M11 8h2.5\"/>',\r\n  valBot: '<path d=\"M2.5 13.5h11\"/><rect x=\"6\" y=\"4.5\" width=\"4\" height=\"7\" rx=\"0.6\"/>',\r\n  fill: '<path fill=\"currentColor\" stroke=\"none\" d=\"M8 2.2c2.6 3.2 4.2 5.2 4.2 7.1a4.2 4.2 0 0 1-8.4 0C3.8 7.4 5.4 5.4 8 2.2z\"/>',\r\n  tcolor: '<path d=\"M4.3 12.5 8 3.5l3.7 9\"/><path d=\"M5.8 9.4h4.4\"/><path d=\"M3.5 14h9\" stroke-width=\"2.2\"/>',\r\n  headerRow: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1\"/><rect x=\"2.5\" y=\"3\" width=\"11\" height=\"3\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.28\"/><path d=\"M2.5 6h11\"/><path d=\"M2.5 9.5h11\"/><path d=\"M6.3 6v7\"/><path d=\"M9.7 6v7\"/>',\r\n  headerCol: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1\"/><rect x=\"2.5\" y=\"3\" width=\"3.5\" height=\"10\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.28\"/><path d=\"M6 3v10\"/><path d=\"M9.5 3v10\"/><path d=\"M2.5 6.3h11\"/><path d=\"M2.5 9.7h11\"/>',\r\n  tblL: '<rect x=\"1.5\" y=\"4\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M13.5 3.5v9\" opacity=\"0.4\"/>',\r\n  tblC: '<rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M2 3.5v9\" opacity=\"0.35\"/><path d=\"M14 3.5v9\" opacity=\"0.35\"/>',\r\n  tblR: '<rect x=\"6.5\" y=\"4\" width=\"8\" height=\"8\" rx=\"1\"/><path d=\"M2.5 3.5v9\" opacity=\"0.4\"/>',\r\n  del: '<path d=\"M3 4.5h10\"/><path d=\"M6.4 4.5V3.2c0-.4.3-.7.7-.7h1.8c.4 0 .7.3.7.7v1.3\"/><path d=\"M4.7 4.5l.6 8.6c0 .5.4.9.9.9h3.6c.5 0 .9-.4.9-.9l.6-8.6\"/><path d=\"M7 7v3.8\"/><path d=\"M9 7v3.8\"/>',\r\n  insertCheckbox: '<rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"2.2\"/><path d=\"M5.3 8.1 7.1 9.9 10.8 5.8\"/>',\r\n  orderedList: '<path d=\"M6.5 4.5h7\"/><path d=\"M6.5 8h7\"/><path d=\"M6.5 11.5h7\"/><path d=\"M2.4 3.2v2.4\"/><path d=\"M2 8.3h1.2l-1.2 1.5h1.3\"/><path d=\"M2 11h1.1M2 12.4h1.1M3.1 11v1.4\"/>',\r\n  bulletList: '<circle cx=\"3.2\" cy=\"4.5\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"3.2\" cy=\"8\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"3.2\" cy=\"11.5\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M6.5 4.5h7\"/><path d=\"M6.5 8h7\"/><path d=\"M6.5 11.5h7\"/>',\r\n};\r\nTT_ICN.fillPop = TT_ICN.fill;\r\nTT_ICN.tcolorPop = TT_ICN.tcolor;\r\n\r\nexport function attachTableControls(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  const tbl = opts.tables || {}; // \uAD6C\uC131 \uD1A0\uAE00: splitCells / cellBackgroundColor / cellTextColor / headers\r\n  const LT = (opts.locale && opts.locale.table) || {}; // \uB85C\uCF00\uC77C(\uD45C \uD234\uBC14 \uD234\uD301)\r\n\r\n  let selectedCells = [];\r\n  let selecting = false, selAnchor = null, selTable = null;\r\n  let activeTable = null, activeCell = null;\r\n\r\n  // ---------- toolbar element ----------\r\n  const bar = document.createElement(\"div\");\r\n  bar.className = \"lumir-table-toolbar\";\r\n  bar.setAttribute(\"role\", \"toolbar\");\r\n  bar.setAttribute(\"aria-label\", LT.toolbar || \"\uD45C \uC11C\uC2DD \uB3C4\uAD6C\uBAA8\uC74C\");\r\n  bar.style.position = \"absolute\";\r\n  bar.style.display = \"none\";\r\n  bar.innerHTML = buildToolbarHtml();\r\n  document.body.appendChild(bar);\r\n\r\n  // ---------- helpers ----------\r\n  const clamp = (v, lo, hi) => Math.max(lo, Math.min(v, hi));\r\n  function cellEl(table, m) {\r\n    return table.querySelector(`td.lumir-cell[data-r=\"${m.r}\"][data-c=\"${m.c}\"]`);\r\n  }\r\n  function focusEnd(el) {\r\n    if (!el) return;\r\n    el.focus();\r\n    const r = document.createRange();\r\n    r.selectNodeContents(el);\r\n    r.collapse(false);\r\n    const s = window.getSelection();\r\n    s.removeAllRanges();\r\n    s.addRange(r);\r\n  }\r\n  function focusStart(el) {\r\n    if (!el) return;\r\n    el.focus();\r\n    const r = document.createRange();\r\n    r.selectNodeContents(el);\r\n    r.collapse(true);\r\n    const s = window.getSelection();\r\n    s.removeAllRanges();\r\n    s.addRange(r);\r\n  }\r\n  /**\r\n   * \uD45C\uC5D0\uC11C \uC704/\uC544\uB798 \uBC29\uD5A5\uD0A4\uB85C \uC778\uC811 \uBE14\uB85D\uC73C\uB85C \uD0C8\uCD9C \u2014 dir<0=\uC774\uC804 \uBE14\uB85D \uB05D, dir>0=\uB2E4\uC74C \uBE14\uB85D \uC2DC\uC791.\r\n   * \uD3B8\uC9D1\uC601\uC5ED(.content/\uC140)\uC774 \uC5C6\uB294 void \uBE14\uB85D(\uAD6C\uBD84\uC120\u00B7\uC774\uBBF8\uC9C0 \uB4F1)\uC740 \uAC74\uB108\uB6F4\uB2E4. \uC774\uB3D9\uD558\uBA74 true.\r\n   */\r\n  function focusAdjacentBlockEdge(fromBlock, dir) {\r\n    let b = dir < 0 ? fromBlock.previousElementSibling : fromBlock.nextElementSibling;\r\n    while (b) {\r\n      if (b.classList && b.classList.contains(\"block\")) {\r\n        const regions = b.querySelectorAll('.content[contenteditable=\"true\"], td.lumir-cell[contenteditable=\"true\"]');\r\n        if (regions.length) {\r\n          const target = dir < 0 ? regions[regions.length - 1] : regions[0];\r\n          if (dir < 0) focusEnd(target);\r\n          else focusStart(target);\r\n          return true;\r\n        }\r\n      }\r\n      b = dir < 0 ? b.previousElementSibling : b.nextElementSibling;\r\n    }\r\n    return false;\r\n  }\r\n  // \uC140 \uB0B4\uC6A9 \uAE30\uC900 \uCE90\uB7FF\uC774 \uC2DC\uC791/\uB05D\uC778\uC9C0(\uC624\uD504\uC14B \uAE30\uBC18, \uB808\uC774\uC544\uC6C3 \uBB34\uAD00) \u2014 \uC88C\uC6B0 \uC140 \uC774\uB3D9 \uD310\uC815\r\n  function caretAtCellStart(cellTd, range) {\r\n    const r = range.cloneRange();\r\n    r.selectNodeContents(cellTd);\r\n    r.setEnd(range.startContainer, range.startOffset);\r\n    return r.toString().length === 0;\r\n  }\r\n  function caretAtCellEnd(cellTd, range) {\r\n    const r = range.cloneRange();\r\n    r.selectNodeContents(cellTd);\r\n    r.setStart(range.endContainer, range.endOffset);\r\n    return r.toString().length === 0;\r\n  }\r\n  function focusCell(table, m) { focusEnd(cellEl(table, m)); }\r\n  function focusCellAt(table, r, c) {\r\n    const G = table.__model.G;\r\n    r = clamp(r, 0, G.length - 1);\r\n    c = clamp(c, 0, G[0].length - 1);\r\n    focusCell(table, G[r][c]);\r\n  }\r\n  function inGrid(m, master) {\r\n    for (let r = 0; r < m.G.length; r++) if (m.G[r].indexOf(master) >= 0) return true;\r\n    return false;\r\n  }\r\n  function getTargets(table) {\r\n    if (selectedCells.length) return [...new Set(selectedCells)];\r\n    if (activeCell && activeCell.closest(\".lumir-tbl\") === table && activeCell.__master) return [activeCell.__master];\r\n    const td = table.querySelector(\"td.lumir-cell\");\r\n    return td && td.__master ? [td.__master] : [];\r\n  }\r\n  function selBBox(table) {\r\n    const ts = getTargets(table);\r\n    let r1 = 1e9, c1 = 1e9, r2 = -1, c2 = -1;\r\n    ts.forEach((m) => {\r\n      r1 = Math.min(r1, m.r); c1 = Math.min(c1, m.c);\r\n      r2 = Math.max(r2, m.r + m.rowspan - 1); c2 = Math.max(c2, m.c + m.colspan - 1);\r\n    });\r\n    return { r1, c1, r2, c2 };\r\n  }\r\n\r\n  // ---------- selection ----------\r\n  function removeSelBox(table) {\r\n    (table || editorEl).querySelectorAll(\".sel-box\").forEach((b) => b.remove());\r\n  }\r\n  function clearSel(table) {\r\n    (table || editorEl).querySelectorAll(\".sel-cell\").forEach((td) => td.classList.remove(\"sel-cell\"));\r\n    selectedCells = [];\r\n    removeSelBox(table || editorEl);\r\n  }\r\n  function selectRange(table, aTd, bTd) {\r\n    const m = table.__model;\r\n    const a = aTd.__master, b = bTd.__master;\r\n    let r1 = Math.min(a.r, b.r), c1 = Math.min(a.c, b.c);\r\n    let r2 = Math.max(a.r + a.rowspan - 1, b.r + b.rowspan - 1), c2 = Math.max(a.c + a.colspan - 1, b.c + b.colspan - 1);\r\n    // \uBCD1\uD569 \uC778\uC9C0 \uD655\uC7A5\r\n    let changed = true;\r\n    while (changed) {\r\n      changed = false;\r\n      for (let r = r1; r <= r2; r++) for (let c = c1; c <= c2; c++) {\r\n        const cell = m.G[r][c];\r\n        if (cell.r < r1) { r1 = cell.r; changed = true; }\r\n        if (cell.c < c1) { c1 = cell.c; changed = true; }\r\n        if (cell.r + cell.rowspan - 1 > r2) { r2 = cell.r + cell.rowspan - 1; changed = true; }\r\n        if (cell.c + cell.colspan - 1 > c2) { c2 = cell.c + cell.colspan - 1; changed = true; }\r\n      }\r\n    }\r\n    clearSel(table);\r\n    const seen = new Set();\r\n    for (let r = r1; r <= r2; r++) for (let c = c1; c <= c2; c++) {\r\n      const cell = m.G[r][c];\r\n      if (seen.has(cell)) continue;\r\n      seen.add(cell);\r\n      selectedCells.push(cell);\r\n      const td = cellEl(table, cell);\r\n      if (td) td.classList.add(\"sel-cell\");\r\n    }\r\n  }\r\n\r\n  // ---------- structural op ----------\r\n  function runStructural(table, fn) {\r\n    syncModelFromTableDom(table);\r\n    const keep = activeCell && activeCell.__master;\r\n    fn();\r\n    rerenderTable(table);\r\n    if (clampTableWidth(table)) rerenderTable(table); // \uBD80\uBAA8 \uD3ED \uCD08\uACFC \uC2DC 1\uD68C \uC7AC\uC870\uC815\r\n    clearSel(table);\r\n    const m = table.__model;\r\n    const target = keep && inGrid(m, keep) ? keep : m.G[0] && m.G[0][0];\r\n    if (target) focusCell(table, target);\r\n    addResizeHandles(table);\r\n    onChange();\r\n    if (toolbarVisible() && activeTable === table) { showToolbar(table); updateToolbarStates(); }\r\n  }\r\n\r\n  // ---------- attr setters (no re-render) ----------\r\n  function setCellAttr(table, attr, value, applyDom) {\r\n    getTargets(table).forEach((m) => {\r\n      if (value == null || value === \"default\") delete m[attr];\r\n      else m[attr] = value;\r\n      const td = cellEl(table, m);\r\n      if (td) applyDom(td, value);\r\n    });\r\n    onChange();\r\n  }\r\n\r\n  // ---------- \uD45C \uC804\uCCB4 \uC815\uB82C (F1) \u2014 \uD45C \uBE14\uB85D props.tableAlignment ----------\r\n  function setTableAlignment(table, value) {\r\n    const block = table.closest(\".block\");\r\n    if (!block) return;\r\n    if (!block.__props) block.__props = {};\r\n    if (value && value !== \"left\") { block.__props.tableAlignment = value; block.dataset.tableAlignment = value; }\r\n    else { delete block.__props.tableAlignment; block.removeAttribute(\"data-table-alignment\"); }\r\n    // \uC815\uB82C\uB85C \uD45C \uC704\uCE58\uAC00 \uBC14\uB00C\uBBC0\uB85C \uD578\uB4E4(\uC5F4\uCD94\uAC00\u00B7\uB9AC\uC0AC\uC774\uC800\u00B7\uADF8\uB9BD\u00B7\uC2A4\uCF00\uC77C)\uC744 \uC0C8 \uC704\uCE58\uB85C \uC7AC\uCE21\uC815\uD558\uACE0 \uD234\uBC14\uB3C4 \uC7AC\uBC30\uCE58.\r\n    addResizeHandles(table);\r\n    if (toolbarVisible() && activeTable === table) showToolbar(table);\r\n    onChange();\r\n  }\r\n  function tableAlignmentOf(table) {\r\n    const block = table.closest(\".block\");\r\n    return (block && block.__props && block.__props.tableAlignment) || \"left\";\r\n  }\r\n\r\n  // ---------- toolbar ----------\r\n  function buttn(act, title, extra) {\r\n    // SVG \uC544\uC774\uCF58 \uBC84\uD2BC. \uC2A4\uD06C\uB9B0\uB9AC\uB354\uC6A9 aria-label(=title) \uBD80\uC5EC. (block-editor.html \uD234\uBC14 \uC2A4\uD0C0\uC77C)\r\n    return `<button type=\"button\" class=\"tt-btn ${extra || \"\"}\" data-act=\"${act}\" title=\"${title}\" aria-label=\"${title}\">${SVG_ICON(TT_ICN[act] || \"\")}</button>`;\r\n  }\r\n  function buildToolbarHtml() {\r\n    const sep = '<span class=\"tt-sep\"></span>';\r\n    const fill = FILL_COLORS.map((c) => c === \"default\"\r\n      ? `<button type=\"button\" class=\"tt-sw tt-none\" data-fill=\"default\" title=\"\uC5C6\uC74C\" aria-label=\"\uBC30\uACBD\uC0C9 \uC5C6\uC74C\"></button>`\r\n      : `<button type=\"button\" class=\"tt-sw\" data-fill=\"${c}\" style=\"background:${HEX[c]}\" title=\"${c}\" aria-label=\"\uBC30\uACBD\uC0C9 ${c}\"></button>`).join(\"\");\r\n    const tcol = FILL_COLORS.map((c) => c === \"default\"\r\n      ? `<button type=\"button\" class=\"tt-sw tt-none\" data-tcolor=\"default\" title=\"\uAE30\uBCF8\" aria-label=\"\uAE00\uC790\uC0C9 \uAE30\uBCF8\"></button>`\r\n      : `<button type=\"button\" class=\"tt-sw\" data-tcolor=\"${c}\" style=\"background:${TEXT_HEX[c]}\" title=\"${c}\" aria-label=\"\uAE00\uC790\uC0C9 ${c}\"></button>`).join(\"\");\r\n    const t = (k, d) => LT[k] || d;\r\n    // \uB2E8\uC77C \uD589 \uADF8\uB8F9 \uAD6C\uC131(\uAD6C\uC870 \u2192 \uBCD1\uD569 \u2192 \uC815\uB82C \u2192 \uC138\uB85C\uC815\uB82C \u2192 \uC0C9 \u2192 \uD45C\uC815\uB82C \u2192 \uBA38\uB9AC \u2192 \uC0AD\uC81C).\r\n    const rowGrp = buttn(\"rowAbove\", t(\"rowAbove\", \"\uC704\uC5D0 \uD589\")) + buttn(\"rowBelow\", t(\"rowBelow\", \"\uC544\uB798\uC5D0 \uD589\")) + buttn(\"rowDel\", t(\"rowDelete\", \"\uD589 \uC0AD\uC81C\"));\r\n    const colGrp = buttn(\"colLeft\", t(\"colLeft\", \"\uC67C\uCABD\uC5D0 \uC5F4\")) + buttn(\"colRight\", t(\"colRight\", \"\uC624\uB978\uCABD\uC5D0 \uC5F4\")) + buttn(\"colDel\", t(\"colDelete\", \"\uC5F4 \uC0AD\uC81C\"));\r\n    const mergeGrp = tbl.splitCells !== false ? buttn(\"merge\", t(\"merge\", \"\uC140 \uBCD1\uD569\")) + buttn(\"split\", t(\"split\", \"\uBCD1\uD569 \uD574\uC81C\")) : \"\";\r\n    const alignGrp = buttn(\"alignL\", t(\"alignLeft\", \"\uC67C\uCABD\")) + buttn(\"alignC\", t(\"alignCenter\", \"\uAC00\uC6B4\uB370\")) + buttn(\"alignR\", t(\"alignRight\", \"\uC624\uB978\uCABD\"));\r\n    const valGrp = buttn(\"valTop\", t(\"vTop\", \"\uC704\")) + buttn(\"valMid\", t(\"vMiddle\", \"\uC911\uAC04\")) + buttn(\"valBot\", t(\"vBottom\", \"\uC544\uB798\"));\r\n    const fillGrp = tbl.cellBackgroundColor !== false ? `<div class=\"tt-pop-wrap\">` + buttn(\"fillPop\", t(\"fill\", \"\uC140 \uBC30\uACBD\uC0C9\")) + `<div class=\"tt-pop\" data-pop=\"fill\" role=\"menu\" aria-label=\"${t(\"fill\", \"\uC140 \uBC30\uACBD\uC0C9\")}\">${fill}</div></div>` : \"\";\r\n    const tcolGrp = tbl.cellTextColor !== false ? `<div class=\"tt-pop-wrap\">` + buttn(\"tcolorPop\", t(\"textColor\", \"\uC140 \uAE00\uC790\uC0C9\")) + `<div class=\"tt-pop\" data-pop=\"tcolor\" role=\"menu\" aria-label=\"${t(\"textColor\", \"\uC140 \uAE00\uC790\uC0C9\")}\">${tcol}</div></div>` : \"\";\r\n    const colorGrp = fillGrp + tcolGrp;\r\n    const tblGrp = buttn(\"tblL\", t(\"tableLeft\", \"\uD45C \uC67C\uCABD \uC815\uB82C\")) + buttn(\"tblC\", t(\"tableCenter\", \"\uD45C \uAC00\uC6B4\uB370 \uC815\uB82C\")) + buttn(\"tblR\", t(\"tableRight\", \"\uD45C \uC624\uB978\uCABD \uC815\uB82C\"));\r\n    const headerGrp = tbl.headers !== false ? buttn(\"headerRow\", t(\"headerRow\", \"\uBA38\uB9AC\uD589\")) + buttn(\"headerCol\", t(\"headerCol\", \"\uBA38\uB9AC\uC5F4\")) : \"\";\r\n    // \uC140 \uC548 \uCCB4\uD06C\uBC15\uC2A4/\uC21C\uC11C\u00B7\uBD88\uB81B \uBAA9\uB85D \uC0BD\uC785(\uC904\uB9C8\uB2E4 \uD56D\uBAA9=\uBCD1\uB82C, CSS \uC790\uB3D9\uBC88\uD638). tbl.checkbox === false\uB85C \uBE44\uD65C\uC131.\r\n    const insGrp = tbl.checkbox !== false\r\n      ? buttn(\"insertCheckbox\", t(\"insertCheckbox\", \"\uCCB4\uD06C\uBC15\uC2A4\")) +\r\n        buttn(\"orderedList\", t(\"orderedList\", \"\uBC88\uD638 \uBAA9\uB85D\")) +\r\n        buttn(\"bulletList\", t(\"bulletList\", \"\uAE00\uBA38\uB9AC \uBAA9\uB85D\"))\r\n      : \"\";\r\n    const groups = [rowGrp, colGrp, mergeGrp, alignGrp, valGrp, colorGrp, tblGrp, headerGrp, insGrp].filter(Boolean);\r\n    return groups.join(sep) + sep + buttn(\"del\", t(\"deleteTable\", \"\uD45C \uC0AD\uC81C\"), \"danger\");\r\n  }\r\n  function toolbarVisible() { return bar.style.display === \"flex\"; }\r\n  function closePops() { bar.querySelectorAll(\".tt-pop\").forEach((p) => p.classList.remove(\"open\")); }\r\n  function showToolbar(table) {\r\n    bar.style.display = \"flex\";\r\n    const r = table.getBoundingClientRect ? table.getBoundingClientRect() : { top: 0, left: 0 };\r\n    // \uC881\uC740 \uD654\uBA74: max-width\uB85C \uAC10\uC2FC \uD234\uBC14\uAC00 \uBDF0\uD3EC\uD2B8 \uC6B0\uCE21\uC744 \uB118\uC9C0 \uC54A\uB3C4\uB85D left \uD074\uB7A8\uD504(\uC904\uBC14\uAFC8\uC740 CSS wrap\uC774 \uCC98\uB9AC).\r\n    const bw = bar.offsetWidth || 0;\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    let left = r.left || 0;\r\n    if (vw && bw && left + bw > vw - 8) left = vw - bw - 8;\r\n    if (left < 8) left = 8;\r\n    bar.style.top = Math.max(window.scrollY + 4, window.scrollY + r.top - (bar.offsetHeight || 0) - 8) + \"px\";\r\n    bar.style.left = window.scrollX + left + \"px\";\r\n  }\r\n  function hideToolbar() { bar.style.display = \"none\"; closePops(); }\r\n  function setOn(act, on) { const el = bar.querySelector(`[data-act=\"${act}\"]`); if (el) el.classList.toggle(\"on\", !!on); }\r\n  function updateToolbarStates() {\r\n    if (!activeTable) return;\r\n    const o = activeTable.__model;\r\n    setOn(\"headerRow\", (o.headerRows || 0) > 0);\r\n    setOn(\"headerCol\", (o.headerCols || 0) > 0);\r\n    const m = activeCell && activeCell.__master;\r\n    setOn(\"alignL\", m && m.textAlignment === \"left\");\r\n    setOn(\"alignC\", m && m.textAlignment === \"center\");\r\n    setOn(\"alignR\", m && m.textAlignment === \"right\");\r\n    setOn(\"valTop\", m && (!m.verticalAlignment || m.verticalAlignment === \"top\"));\r\n    setOn(\"valMid\", m && m.verticalAlignment === \"middle\");\r\n    setOn(\"valBot\", m && m.verticalAlignment === \"bottom\");\r\n    const ta = tableAlignmentOf(activeTable);\r\n    setOn(\"tblL\", ta === \"left\");\r\n    setOn(\"tblC\", ta === \"center\");\r\n    setOn(\"tblR\", ta === \"right\");\r\n    // \uD45C\uAC00 \uCD5C\uB300\uD3ED\uC774\uBA74 \uC815\uB82C\uC740 \uC758\uBBF8\uAC00 \uC5C6\uACE0 \uD578\uB4E4 \uC601\uC5ED\uC744 \uCE68\uBC94\uD558\uBBC0\uB85C \uC815\uB82C \uBC84\uD2BC \uBE44\uD65C\uC131\uD654.\r\n    const full = tableAtMaxWidth(activeTable);\r\n    [\"tblL\", \"tblC\", \"tblR\"].forEach((a) => { const el = bar.querySelector(`[data-act=\"${a}\"]`); if (el) el.disabled = full; });\r\n    // \uC5F4 \uCD94\uAC00 \uC5EC\uC720 \uC5C6\uC74C(\uBB3C\uB9AC \uD558\uD55C \uB3C4\uB2EC) \u2192 \uC5F4 \uCD94\uAC00 \uBC84\uD2BC \uBA85\uC2DC\uC801 \uBE44\uD65C\uC131(\uBB34\uBC18\uC751 \uB300\uC2E0 disabled+\uCEE4\uC11C)\r\n    const noRoom = !canAddColumn(activeTable);\r\n    [\"colLeft\", \"colRight\"].forEach((a) => { const el = bar.querySelector(`[data-act=\"${a}\"]`); if (el) el.disabled = noRoom; });\r\n  }\r\n\r\n  bar.addEventListener(\"mousedown\", (e) => { if (!e.target.closest(\"input,select\")) e.preventDefault(); });\r\n  bar.addEventListener(\"click\", (e) => {\r\n    const t = activeTable;\r\n    if (!t) return;\r\n    const sw = e.target.closest(\".tt-sw\");\r\n    if (sw) {\r\n      if (sw.dataset.fill != null) setCellAttr(t, \"backgroundColor\", sw.dataset.fill, (td, v) => { if (v && v !== \"default\") td.dataset.backgroundColor = v; else delete td.dataset.backgroundColor; });\r\n      else if (sw.dataset.tcolor != null) setCellAttr(t, \"textColor\", sw.dataset.tcolor, (td, v) => { if (v && v !== \"default\") td.dataset.textColor = v; else delete td.dataset.textColor; });\r\n      closePops(); return;\r\n    }\r\n    const b = e.target.closest(\".tt-btn\");\r\n    if (!b) return;\r\n    const act = b.dataset.act;\r\n    const bb = () => selBBox(t);\r\n    switch (act) {\r\n      case \"rowAbove\": runStructural(t, () => insertRow(t.__model, bb().r1)); break;\r\n      case \"rowBelow\": runStructural(t, () => insertRow(t.__model, bb().r2 + 1)); break;\r\n      case \"rowDel\": { const x = bb(); runStructural(t, () => deleteRows(t.__model, x.r1, x.r2)); break; }\r\n      case \"colLeft\": if (canAddColumn(t)) runStructural(t, () => insertCol(t.__model, bb().c1)); break;\r\n      case \"colRight\": if (canAddColumn(t)) runStructural(t, () => insertCol(t.__model, bb().c2 + 1)); break;\r\n      case \"colDel\": { const x = bb(); runStructural(t, () => deleteCols(t.__model, x.c1, x.c2)); break; }\r\n      case \"merge\": runStructural(t, () => mergeCells(t.__model, bb())); break;\r\n      case \"split\": { const m = activeCell && activeCell.__master; runStructural(t, () => splitCell(t.__model, m)); break; }\r\n      case \"alignL\": setCellAttr(t, \"textAlignment\", \"left\", (td, v) => (td.style.textAlign = v)); break;\r\n      case \"alignC\": setCellAttr(t, \"textAlignment\", \"center\", (td, v) => (td.style.textAlign = v)); break;\r\n      case \"alignR\": setCellAttr(t, \"textAlignment\", \"right\", (td, v) => (td.style.textAlign = v)); break;\r\n      case \"valTop\": setCellAttr(t, \"verticalAlignment\", \"default\", (td) => (td.style.verticalAlign = \"\")); break;\r\n      case \"valMid\": setCellAttr(t, \"verticalAlignment\", \"middle\", (td, v) => (td.style.verticalAlign = v)); break;\r\n      case \"valBot\": setCellAttr(t, \"verticalAlignment\", \"bottom\", (td, v) => (td.style.verticalAlign = v)); break;\r\n      case \"fillPop\": togglePop(\"fill\"); break;\r\n      case \"tcolorPop\": togglePop(\"tcolor\"); break;\r\n      case \"tblL\": setTableAlignment(t, \"left\"); break;\r\n      case \"tblC\": setTableAlignment(t, \"center\"); break;\r\n      case \"tblR\": setTableAlignment(t, \"right\"); break;\r\n      case \"headerRow\": case \"headerCol\": {\r\n        syncModelFromTableDom(t);\r\n        const keepH = activeCell && activeCell.__master;\r\n        if (act === \"headerRow\") t.__model.headerRows = (t.__model.headerRows ? 0 : 1);\r\n        else t.__model.headerCols = (t.__model.headerCols ? 0 : 1);\r\n        rerenderTable(t);\r\n        // \uC7AC\uB80C\uB354\uB85C \uC140 DOM\uC774 \uAD50\uCCB4\uB418\uBBC0\uB85C \uD65C\uC131 \uC140\uC744 \uB2E4\uC2DC \uD3EC\uCEE4\uC2A4\uD55C\uB2E4. \uC548 \uD558\uBA74 activeCell\uC774 detached \uB178\uB4DC\uB97C\r\n        // \uAC00\uB9AC\uCF1C, \uC774\uD6C4 \uC0C9/\uC815\uB82C \uB4F1 \uC18D\uC131 \uC870\uC791\uC774 getTargets \uD3F4\uBC31\uC73C\uB85C \uCCAB \uC140\uC5D0 \uC798\uBABB \uC801\uC6A9\uB41C\uB2E4(\uCE90\uB7FF\uB3C4 \uC720\uC2E4).\r\n        // \uD5E4\uB354 \uD1A0\uAE00\uC740 \uAD6C\uC870\uB97C \uBC14\uAFB8\uC9C0 \uC54A\uC73C\uBBC0\uB85C master \uCC38\uC870\uB294 \uADF8\uB300\uB85C \uC720\uD6A8\uD558\uB2E4.\r\n        if (keepH && inGrid(t.__model, keepH)) focusCell(t, keepH);\r\n        addResizeHandles(t); onChange(); updateToolbarStates(); break;\r\n      }\r\n      case \"insertCheckbox\": insertCheckbox(t); break;\r\n      case \"orderedList\": insertListMarker(t, \"ol\"); break;\r\n      case \"bulletList\": insertListMarker(t, \"ul\"); break;\r\n      case \"del\": deleteTable(t); return;\r\n    }\r\n    updateToolbarStates();\r\n  });\r\n  function togglePop(which) {\r\n    const p = bar.querySelector(`.tt-pop[data-pop=\"${which}\"]`);\r\n    const open = p.classList.contains(\"open\");\r\n    closePops();\r\n    if (!open) p.classList.add(\"open\");\r\n  }\r\n  function deleteTable(table) {\r\n    const block = table.closest(\".block\");\r\n    hideToolbar();\r\n    activeTable = null; activeCell = null;\r\n    if (block) block.remove();\r\n    onChange();\r\n  }\r\n\r\n  // ---------- cell checkbox (\uC778\uB77C\uC778 \uC6D0\uC790: \uC9C1\uB82C=\uC5F0\uC18D \uC0BD\uC785, \uBCD1\uB82C=Enter \uC904\uBC14\uAFC8) ----------\r\n  function isReadonly() { return editorEl.classList && editorEl.classList.contains(\"lumir-readonly\"); }\r\n  function makeCheckboxEl(checked) {\r\n    const span = document.createElement(\"span\");\r\n    span.className = \"lumir-cell-check\" + (checked ? \" checked\" : \"\");\r\n    span.setAttribute(\"role\", \"checkbox\");\r\n    span.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\r\n    span.setAttribute(\"contenteditable\", \"false\");\r\n    span.setAttribute(\"data-lumir-checkbox\", \"1\");\r\n    span.setAttribute(\"data-checked\", checked ? \"true\" : \"false\");\r\n    return span;\r\n  }\r\n  /** \uD65C\uC131 \uC140\uC758 \uCE90\uB7FF \uC704\uCE58\uC5D0 \uCCB4\uD06C\uBC15\uC2A4 \uC0BD\uC785(\uCE90\uB7FF\uC774 \uC140 \uBC16\uC774\uBA74 \uC140 \uB05D\uC5D0 \uCD94\uAC00) \u2192 \uBAA8\uB378 \uD68C\uC218 + \uBCC0\uACBD \uC54C\uB9BC. */\r\n  function insertCheckbox(table) {\r\n    if (isReadonly()) return;\r\n    const td = activeCell && activeCell.closest && activeCell.closest(\"td.lumir-cell\");\r\n    if (!td || td.closest(\".lumir-tbl\") !== table) return;\r\n    const span = makeCheckboxEl(false);\r\n    const sel = typeof window !== \"undefined\" && window.getSelection ? window.getSelection() : null;\r\n    let r = null;\r\n    if (sel && sel.rangeCount) {\r\n      const cand = sel.getRangeAt(0);\r\n      if (td.contains(cand.commonAncestorContainer)) r = cand;\r\n    }\r\n    if (r) {\r\n      r.deleteContents();\r\n      r.insertNode(span);\r\n    } else {\r\n      td.appendChild(span);\r\n      r = document.createRange();\r\n    }\r\n    // contenteditable=false \uC6D0\uC790 \uB4A4\uC5D0 \uCE90\uB7FF\uC774 \uB193\uC774\uB3C4\uB85D \uBCF4\uC870: \uB2E4\uC74C \uD615\uC81C\uAC00 \uC5C6\uC73C\uBA74 ZWSP(\uC9C1\uB82C\uD654\uC5D0\uC11C \uC81C\uAC70) \uC575\uCEE4 \uCD94\uAC00.\r\n    if (!span.nextSibling) span.after(document.createTextNode(\"\u200B\"));\r\n    try {\r\n      r.setStartAfter(span);\r\n      r.collapse(true);\r\n      if (sel) { sel.removeAllRanges(); sel.addRange(r); }\r\n    } catch (_) { /* jsdom \uB4F1 selection \uBBF8\uAD6C\uD604 \uD658\uACBD \uBB34\uC2DC */ }\r\n    syncModelFromTableDom(table);\r\n    onChange();\r\n    refreshActiveTableOverlays(); // \uC0BD\uC785\uC73C\uB85C \uC140/\uD45C \uD06C\uAE30\uAC00 \uBC14\uB014 \uC218 \uC788\uC73C\uBBC0\uB85C \uC624\uBC84\uB808\uC774 \uC7AC\uBC30\uCE58\r\n  }\r\n\r\n  // ---------- cell ordered/bullet list (\uC778\uB77C\uC778 \uB9C8\uCEE4 \uC6D0\uC790, \uC904 \uC2DC\uC791 = \uD56D\uBAA9, \uBCD1\uB82C=<br>, \uBC88\uD638=CSS \uCE74\uC6B4\uD130) ----------\r\n  function isHardBrEl(n) {\r\n    return n && n.nodeType === 1 && n.tagName === \"BR\" && !(n.hasAttribute && n.hasAttribute(\"data-lumir-br-filler\"));\r\n  }\r\n  /** \uC778\uB77C\uC778 \uC6D0\uC790(\uCCB4\uD06C\uBC15\uC2A4/\uC21C\uC11C\u00B7\uBD88\uB81B \uB9C8\uCEE4) \uC694\uC18C\uC778\uC9C0 \u2014 Backspace \uC0AD\uC81C \uD310\uC815\uC6A9. */\r\n  function isAtomEl(n) {\r\n    return n && n.nodeType === 1 && n.hasAttribute &&\r\n      (n.hasAttribute(\"data-lumir-checkbox\") || n.hasAttribute(\"data-lumir-ol\") || n.hasAttribute(\"data-lumir-ul\"));\r\n  }\r\n  function makeListEl(kind) {\r\n    const span = document.createElement(\"span\");\r\n    span.className = kind === \"ol\" ? \"lumir-cell-ol\" : \"lumir-cell-ul\";\r\n    span.setAttribute(\"contenteditable\", \"false\");\r\n    span.setAttribute(kind === \"ol\" ? \"data-lumir-ol\" : \"data-lumir-ul\", \"1\");\r\n    return span;\r\n  }\r\n  /** \uCE90\uB7FF\uC774 \uC18D\uD55C \uB77C\uC778(=<br>\uB85C \uAD6C\uBD84)\uC758 td \uC9C1\uC18D child \uC778\uB371\uC2A4 \uBC94\uC704\u00B7\uC120\uB450 \uB9C8\uCEE4\u00B7\uB0B4\uC6A9\uC720\uBB34 \uBD84\uC11D. */\r\n  function currentLineInfo(td) {\r\n    const sel = typeof window !== \"undefined\" && window.getSelection ? window.getSelection() : null;\r\n    if (!sel || !sel.rangeCount) return null;\r\n    const r = sel.getRangeAt(0);\r\n    if (!td.contains(r.startContainer)) return null;\r\n    const kids = td.childNodes;\r\n    // \uCE90\uB7FF\uC758 td \uC9C1\uC18D \uC870\uC0C1 child \uC704\uCE58(caretIdx: \uADF8 child \uC778\uB371\uC2A4; td \uC9C1\uC811\uC774\uBA74 startOffset)\r\n    let caretIdx;\r\n    if (r.startContainer === td) caretIdx = r.startOffset;\r\n    else {\r\n      let top = r.startContainer;\r\n      while (top && top.parentNode !== td) top = top.parentNode;\r\n      if (!top) return null;\r\n      caretIdx = Array.prototype.indexOf.call(kids, top);\r\n    }\r\n    let s = caretIdx - 1;\r\n    while (s >= 0 && !isHardBrEl(kids[s])) s--;\r\n    const lineStart = s + 1; // <br> \uB2E4\uC74C(\uB610\uB294 0)\r\n    let e = lineStart;\r\n    while (e < kids.length && !isHardBrEl(kids[e])) e++;\r\n    const lineEnd = e; // \uB2E4\uC74C <br> \uC778\uB371\uC2A4 \uB610\uB294 length(\uBC30\uD0C0)\r\n    const first = kids[lineStart];\r\n    let markerEl = null, kind = null;\r\n    if (first && first.nodeType === 1 && first.hasAttribute) {\r\n      if (first.hasAttribute(\"data-lumir-ol\")) { markerEl = first; kind = \"ol\"; }\r\n      else if (first.hasAttribute(\"data-lumir-ul\")) { markerEl = first; kind = \"ul\"; }\r\n    }\r\n    let hasContent = false;\r\n    for (let i = lineStart + (markerEl ? 1 : 0); i < lineEnd; i++) {\r\n      const k = kids[i];\r\n      if (k.nodeType === 3) { if (k.nodeValue.replace(/\u200B/g, \"\").trim().length) { hasContent = true; break; } }\r\n      else if (k.nodeType === 1 && k.tagName !== \"BR\") { hasContent = true; break; }\r\n    }\r\n    return { markerEl, kind, hasContent, lineStart, lineEnd };\r\n  }\r\n  /** \uD65C\uC131 \uC140\uC758 \uD604\uC7AC \uB77C\uC778 \uC2DC\uC791\uC5D0 \uC21C\uC11C/\uBD88\uB81B \uB9C8\uCEE4 \uC0BD\uC785(\uC774\uBBF8 \uB9C8\uCEE4 \uC788\uC73C\uBA74 \uC885\uB958 \uAD50\uCCB4) \u2192 \uD68C\uC218/\uC54C\uB9BC/\uC7AC\uBC30\uCE58. */\r\n  function insertListMarker(table, kind) {\r\n    if (isReadonly()) return;\r\n    const td = activeCell && activeCell.closest && activeCell.closest(\"td.lumir-cell\");\r\n    if (!td || td.closest(\".lumir-tbl\") !== table) return;\r\n    const info = currentLineInfo(td);\r\n    const marker = makeListEl(kind);\r\n    if (info && info.markerEl) {\r\n      info.markerEl.replaceWith(marker); // \uC885\uB958 \uC804\uD658(ol\u2194ul)\r\n    } else {\r\n      const at = info ? info.lineStart : td.childNodes.length;\r\n      const ref = td.childNodes[at] || null;\r\n      td.insertBefore(marker, ref);\r\n    }\r\n    if (!marker.nextSibling) marker.after(document.createTextNode(\"\u200B\"));\r\n    try {\r\n      const nr = document.createRange();\r\n      nr.setStartAfter(marker);\r\n      nr.collapse(true);\r\n      const sel = window.getSelection();\r\n      sel.removeAllRanges();\r\n      sel.addRange(nr);\r\n    } catch (_) { /* selection \uBBF8\uAD6C\uD604 \uD658\uACBD \uBB34\uC2DC */ }\r\n    syncModelFromTableDom(table);\r\n    onChange();\r\n    refreshActiveTableOverlays();\r\n  }\r\n  /**\r\n   * \uC140 \uC790\uB3D9\uC11C\uC2DD: \uB77C\uC778 \uC2DC\uC791\uC758 \"N.\"(\u2192\uC21C\uC11C) / \"-\"\u00B7\"*\"(\u2192\uBD88\uB81B) + \uC2A4\uD398\uC774\uC2A4 \u2192 \uB9AC\uC2A4\uD2B8 \uB9C8\uCEE4.\r\n   * \uB77C\uC778 \uC2DC\uC791(\uC140 \uCCAB\uBA38\uB9AC \uB610\uB294 <br> \uC9C1\uD6C4)\uC5D0\uC11C\uB9CC. \uC131\uACF5 \uC2DC true(\uC2A4\uD398\uC774\uC2A4 \uCDE8\uC18C).\r\n   */\r\n  function tryCellListAutoformat(td) {\r\n    if (tbl.checkbox === false || isReadonly()) return false; // (list\uB3C4 checkbox \uD1A0\uAE00\uACFC \uB3D9\uC77C config\uB85C on/off)\r\n    const sel = typeof window !== \"undefined\" && window.getSelection ? window.getSelection() : null;\r\n    if (!sel || !sel.rangeCount || !sel.isCollapsed) return false;\r\n    const r = sel.getRangeAt(0);\r\n    const node = r.startContainer;\r\n    if (!node || node.nodeType !== 3 || !td.contains(node)) return false;\r\n    const before = node.nodeValue.slice(0, r.startOffset);\r\n    let kind = null;\r\n    if (/^\\d+\\.$/.test(before)) kind = \"ol\";\r\n    else if (/^[-*]$/.test(before)) kind = \"ul\";\r\n    if (!kind) return false;\r\n    // \uB77C\uC778 \uC2DC\uC791 \uD310\uC815: \uC9C1\uC804 \uD615\uC81C(\uBE48 \uD14D\uC2A4\uD2B8 \uC81C\uC678)\uAC00 \uC5C6\uAC70\uB098 <br>\r\n    let prev = node.previousSibling;\r\n    while (prev && prev.nodeType === 3 && prev.nodeValue === \"\") prev = prev.previousSibling;\r\n    const atLineStart = !prev || isHardBrEl(prev);\r\n    if (!atLineStart) return false;\r\n    // \uB9C8\uCEE4 \uD14D\uC2A4\uD2B8 \uC81C\uAC70 + \uB9C8\uCEE4 \uC0BD\uC785\r\n    const marker = makeListEl(kind);\r\n    const parent = node.parentNode;\r\n    const tail = node.nodeValue.slice(r.startOffset);\r\n    parent.insertBefore(marker, node);\r\n    if (tail) node.nodeValue = tail; else parent.removeChild(node);\r\n    if (!marker.nextSibling) marker.after(document.createTextNode(\"\u200B\"));\r\n    try {\r\n      const nr = document.createRange();\r\n      nr.setStartAfter(marker);\r\n      nr.collapse(true);\r\n      sel.removeAllRanges();\r\n      sel.addRange(nr);\r\n    } catch (_) { /* ignore */ }\r\n    syncModelFromTableDom(td.closest(\".lumir-tbl\"));\r\n    onChange();\r\n    refreshActiveTableOverlays();\r\n    return true;\r\n  }\r\n  /**\r\n   * \uC140 \uC548 \uB9C8\uD06C\uB2E4\uC6B4 \uC790\uB3D9\uC11C\uC2DD: \uCE90\uB7FF \uBC14\uB85C \uC55E\uC758 \"[]\" \uB610\uB294 \"[ ]\" + \uC2A4\uD398\uC774\uC2A4 \u2192 \uCCB4\uD06C\uBC15\uC2A4\uB85C \uBCC0\uD658.\r\n   * (\uBE14\uB85D \uB808\uBCA8 editing.js MD_RULES\uC758 checkListItem \uADDC\uCE59\uC744 \uC140 \uC778\uB77C\uC778\uC6A9\uC73C\uB85C \uC774\uC2DD\uD558\uB418, \uC140\uC5D0\uC11C\uB294\r\n   *  \uC904 \uC2DC\uC791\uBFD0 \uC544\uB2C8\uB77C \uCE90\uB7FF \uC5B4\uB514\uC11C\uB098 \uBCC0\uD658\uD55C\uB2E4 \u2192 \uD55C \uC904\uC5D0 \uC5F0\uC18D \uC785\uB825 \uC2DC \uC9C1\uB82C(\uB098\uB780\uD788) \uBC30\uCE58\uAC00 \uB41C\uB2E4.\r\n   *  \uBCD1\uB82C\uC740 Enter\uB85C \uC904\uC744 \uBC14\uAFBC \uB4A4 \uBC18\uBCF5.) \uC131\uACF5 \uC2DC true(\uC2A4\uD398\uC774\uC2A4 \uC785\uB825 \uCDE8\uC18C).\r\n   */\r\n  function tryCellCheckboxAutoformat(td) {\r\n    if (tbl.checkbox === false || isReadonly()) return false;\r\n    const sel = typeof window !== \"undefined\" && window.getSelection ? window.getSelection() : null;\r\n    if (!sel || !sel.rangeCount || !sel.isCollapsed) return false;\r\n    const r = sel.getRangeAt(0);\r\n    const node = r.startContainer;\r\n    if (!node || node.nodeType !== 3 || !td.contains(node)) return false; // \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uCE90\uB7FF\uB9CC\r\n    const offset = r.startOffset;\r\n    const before = node.nodeValue.slice(0, offset);\r\n    const m = before.match(/\\[\\s?\\]$/); // \uCE90\uB7FF \uC9C1\uC804\uC774 \uB9C8\uCEE4\uC5EC\uC57C(\uC704\uCE58 \uBB34\uAD00 \u2192 \uC9C1\uB82C \uC9C0\uC6D0)\r\n    if (!m) return false;\r\n    const markerLen = m[0].length;\r\n    // \uB9C8\uCEE4 \uD14D\uC2A4\uD2B8\uB9CC \uC81C\uAC70\uD558\uACE0 \uADF8 \uC790\uB9AC\uC5D0 \uCCB4\uD06C\uBC15\uC2A4 \uC0BD\uC785(\uC55E/\uB4A4 \uD14D\uC2A4\uD2B8 \uBCF4\uC874).\r\n    const span = makeCheckboxEl(false);\r\n    const parent = node.parentNode;\r\n    const head = node.nodeValue.slice(0, offset - markerLen);\r\n    const tail = node.nodeValue.slice(offset);\r\n    node.nodeValue = head + tail;\r\n    const after = node.splitText(head.length); // after = \uB9C8\uCEE4 \uB4A4 \uD14D\uC2A4\uD2B8 \uB178\uB4DC(\uBE48 \uB178\uB4DC\uC77C \uC218 \uC788\uC74C)\r\n    parent.insertBefore(span, after);\r\n    if (after.nodeValue === \"\") parent.removeChild(after);\r\n    if (node.nodeValue === \"\") parent.removeChild(node);\r\n    if (!span.nextSibling) span.after(document.createTextNode(\"\u200B\")); // \uCE90\uB7FF \uC575\uCEE4(ZWSP, \uC9C1\uB82C\uD654 \uC81C\uAC70)\r\n    try {\r\n      const nr = document.createRange();\r\n      nr.setStartAfter(span);\r\n      nr.collapse(true);\r\n      sel.removeAllRanges();\r\n      sel.addRange(nr);\r\n    } catch (_) { /* selection \uBBF8\uAD6C\uD604 \uD658\uACBD \uBB34\uC2DC */ }\r\n    syncModelFromTableDom(td.closest(\".lumir-tbl\"));\r\n    onChange();\r\n    refreshActiveTableOverlays(); // \uC790\uB3D9\uC11C\uC2DD \uC0BD\uC785 \uD6C4 \uC624\uBC84\uB808\uC774 \uC7AC\uBC30\uCE58\r\n    return true;\r\n  }\r\n  /** \uCCB4\uD06C\uBC15\uC2A4 \uD074\uB9AD \uD1A0\uAE00 \u2014 \uC0C1\uD0DC \uC18D\uC131\uB9CC \uBCC0\uACBD(\uC7AC\uB80C\uB354 \uC5C6\uC74C, \uCE90\uB7FF \uC720\uC9C0) \uD6C4 \uBAA8\uB378 \uD68C\uC218 + \uBCC0\uACBD \uC54C\uB9BC. */\r\n  function toggleCellCheckbox(box, e) {\r\n    const td = box.closest && box.closest(\"td.lumir-cell\");\r\n    if (!td) return;\r\n    const table = td.closest(\".lumir-tbl\");\r\n    if (!table || !editorEl.contains(table)) return;\r\n    e.preventDefault(); // \uCE90\uB7FF \uD074\uB9AD \uC774\uB3D9 \uBC29\uC9C0(\uCCB4\uD06C\uB9CC \uD1A0\uAE00)\r\n    if (isReadonly()) return;\r\n    const now = box.getAttribute(\"data-checked\") !== \"true\";\r\n    box.setAttribute(\"data-checked\", now ? \"true\" : \"false\");\r\n    box.setAttribute(\"aria-checked\", now ? \"true\" : \"false\");\r\n    box.classList.toggle(\"checked\", now);\r\n    syncModelFromTableDom(table);\r\n    onChange();\r\n  }\r\n\r\n  // ---------- resize handles + add bars ----------\r\n  function addResizeHandles(table) {\r\n    const host = table.parentElement; // .content (table \uC9C1\uC18D \uBD80\uBAA8)\r\n    if (!host) return;\r\n    host.querySelectorAll(\".tbl-handles\").forEach((h) => h.remove());\r\n    const cont = document.createElement(\"div\");\r\n    cont.className = \"tbl-handles\";\r\n    cont.setAttribute(\"contenteditable\", \"false\");\r\n    const cols = table.__model.G[0] ? table.__model.G[0].length : 0;\r\n    const rows = table.__model.G.length;\r\n\r\n    // \uC140 \uACBD\uACC4 \uCE21\uC815(\uBE0C\uB77C\uC6B0\uC800). jsdom\uC5D0\uC120 0 \u2192 \uD578\uB4E4\uC740 \uC0DD\uC131\uB418\uB418 \uC704\uCE58 0(\uD14C\uC2A4\uD2B8 \uBB34\uAD00).\r\n    const hostRect = host.getBoundingClientRect ? host.getBoundingClientRect() : { left: 0, top: 0 };\r\n    const tableRect = table.getBoundingClientRect ? table.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 };\r\n    // \uD45C\uC758 \uCF58\uD150\uCE20 \uB0B4 \uC88C/\uC0C1 \uC624\uD504\uC14B \u2014 \uD45C \uC815\uB82C(margin:auto)\uB85C \uD45C\uAC00 \uC6B0\uCE21\uC73C\uB85C \uBC00\uB9AC\uBA74 L>0.\r\n    // \uD578\uB4E4 \uCEE8\uD14C\uC774\uB108\uB97C \uD45C \uBC15\uC2A4\uC5D0 \uC815\uD655\uD788 \uC624\uBC84\uB808\uC774\uD558\uACE0, \uC140 \uC88C\uD45C\uB97C \"\uD45C \uC88C\uC0C1\uB2E8(0,0) \uAE30\uC900\" \uB85C\uCEEC \uC88C\uD45C\uB85C\r\n    // \uCE21\uC815\uD55C\uB2E4. \uC774\uB7EC\uBA74 \uC88C\uCE21 \uAE30\uC900 \uD578\uB4E4(\uD589\uB9AC\uC0AC\uC774\uC800\u00B7\uD589\uCD94\uAC00\uBC14\u00B7\uD558\uBCC0\uC2A4\uCF00\uC77C\u00B7\uC5F4\uADF8\uB9BD\u00B7\uD589\uADF8\uB9BD)\uC774 \uC815\uB82C\uACFC\r\n    // \uBB34\uAD00\uD558\uAC8C \uD45C\uC5D0 \uC815\uB82C\uB418\uC5B4, \uC815\uB82C \uC2DC \uD45C \uC67C\uCABD \uAC70\uD130\uB85C \uC090\uC838\uB098\uC624\uB358 \uACB9\uCE68\uC774 \uC0AC\uB77C\uC9C4\uB2E4.\r\n    const L = (tableRect.left || 0) - (hostRect.left || 0);\r\n    const T = (tableRect.top || 0) - (hostRect.top || 0);\r\n    const right = new Array(cols).fill(0), bottom = new Array(rows).fill(0);\r\n    table.querySelectorAll(\"td.lumir-cell\").forEach((td) => {\r\n      const m = td.__master;\r\n      const rb = td.getBoundingClientRect ? td.getBoundingClientRect() : { right: 0, bottom: 0 };\r\n      const x = rb.right - (tableRect.left || 0), y = rb.bottom - (tableRect.top || 0);\r\n      const ck = m.c + m.colspan - 1, rk = m.r + m.rowspan - 1;\r\n      if (x > right[ck]) right[ck] = x;\r\n      if (y > bottom[rk]) bottom[rk] = y;\r\n    });\r\n    const H = tableRect.height || 0;\r\n    const W = right[cols - 1] || tableRect.width || 0;\r\n    // \uCEE8\uD14C\uC774\uB108\uB97C \uD45C \uBC15\uC2A4\uC5D0 \uC624\uBC84\uB808\uC774(CSS inset:0 \uD574\uC81C). \uC774\uD6C4 \uBAA8\uB4E0 \uD578\uB4E4 \uC88C\uD45C\uB294 \uD45C-\uB85C\uCEEC.\r\n    cont.style.left = L + \"px\"; cont.style.top = T + \"px\";\r\n    cont.style.width = W + \"px\"; cont.style.height = H + \"px\";\r\n    cont.style.right = \"auto\"; cont.style.bottom = \"auto\";\r\n\r\n    const bottomY = bottom[rows - 1] || H;\r\n    // \uC5F4/\uD589 \uC88C\uC0C1\uB2E8 \uACBD\uACC4 \uC88C\uD45C(\uC138\uADF8\uBA3C\uD2B8 \uBD84\uD560\u00B7\uD578\uB4E4 \uBC30\uCE58 \uACF5\uC6A9).\r\n    const G = table.__model.G;\r\n    const lefts = []; { let prev = 0; for (let c = 0; c < cols; c++) { lefts.push(prev); prev = right[c]; } }\r\n    const tops = []; { let prev = 0; for (let r = 0; r < rows; r++) { tops.push(prev); prev = bottom[r]; } }\r\n    // \uB0B4\uBD80 \uC5F4/\uD589 \uB9AC\uC0AC\uC774\uC800 \u2014 \uACBD\uACC4\uAC00 \"\uC2E4\uC81C\uB85C \uC874\uC7AC\uD558\uB294\" \uAD6C\uAC04\uC5D0\uB9CC \uC0DD\uC131\uD55C\uB2E4.\r\n    //   \uBCD1\uD569 \uC140(colspan/rowspan)\uC774 \uACBD\uACC4\uB97C \uAC00\uB85C\uC9C0\uB974\uB294 \uCE78\uC5D0\uB294 \uB0B4\uBD80 \uBCF4\uB354\uAC00 \uC5C6\uC73C\uBBC0\uB85C \uB9AC\uC0AC\uC774\uC800(hit + hover \uBCF4\uB354 \uBC14)\uB97C\r\n    //   \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4. \uBCD1\uD569 \uC140 \uB0B4\uBD80\uC5D0 \uB9AC\uC0AC\uC774\uC988 \uCEE4\uC11C\u00B7\uD30C\uB780 \uB77C\uC778\uC774 \uB728\uB358 \uBB38\uC81C \uBC29\uC9C0. \uACBD\uACC4 \uC874\uC7AC = \uC591\uCABD \uC2AC\uB86F master \uCC38\uC870\uAC00 \uB2E4\uB984.\r\n    // col-resizer(\uC5F4 \uACBD\uACC4 k): \uC138\uB85C \uC138\uADF8\uBA3C\uD2B8(\uD589 \uBC29\uD5A5). G[r][k] === G[r][k+1](\uAC00\uB85C \uBCD1\uD569) \uD589\uC740 \uC81C\uC678.\r\n    for (let k = 0; k < cols - 1; k++) {\r\n      let r = 0;\r\n      while (r < rows) {\r\n        if (G[r][k] === G[r][k + 1]) { r++; continue; }\r\n        const y0 = tops[r];\r\n        while (r < rows && G[r][k] !== G[r][k + 1]) r++;\r\n        const seg = document.createElement(\"div\");\r\n        seg.className = \"col-resizer\"; seg.dataset.col = String(k);\r\n        seg.style.left = right[k] + \"px\"; seg.style.top = y0 + \"px\"; seg.style.height = (bottom[r - 1] - y0) + \"px\";\r\n        seg.innerHTML = '<div class=\"bar\"></div>';\r\n        cont.appendChild(seg);\r\n      }\r\n    }\r\n    // row-resizer(\uD589 \uACBD\uACC4 k): \uAC00\uB85C \uC138\uADF8\uBA3C\uD2B8(\uC5F4 \uBC29\uD5A5). G[k][c] === G[k+1][c](\uC138\uB85C \uBCD1\uD569) \uC5F4\uC740 \uC81C\uC678.\r\n    for (let k = 0; k < rows - 1; k++) {\r\n      let c = 0;\r\n      while (c < cols) {\r\n        if (G[k][c] === G[k + 1][c]) { c++; continue; }\r\n        const x0 = lefts[c];\r\n        while (c < cols && G[k][c] !== G[k + 1][c]) c++;\r\n        const seg = document.createElement(\"div\");\r\n        seg.className = \"row-resizer\"; seg.dataset.row = String(k);\r\n        seg.style.top = bottom[k] + \"px\"; seg.style.left = x0 + \"px\"; seg.style.width = (right[c - 1] - x0) + \"px\";\r\n        seg.innerHTML = '<div class=\"bar\"></div>';\r\n        cont.appendChild(seg);\r\n      }\r\n    }\r\n    // \uD589/\uC5F4 \uCD94\uAC00 \uBC84\uD2BC(hover-reveal): addrow=\uD558\uBCC0 \uC804\uCCB4, addcol=\uC6B0\uCE21 \uAC70\uD130, addboth=\uC6B0\uD558\uB2E8 (block-editor.html UI)\r\n    const hostW = host.clientWidth || 0;\r\n    let addColLeft = W + 6;\r\n    if (hostW && L + addColLeft + 16 > hostW) addColLeft = Math.max(W + 2, hostW - L - 16);\r\n    const addrow = document.createElement(\"div\");\r\n    addrow.className = \"tbl-add tbl-addrow\"; addrow.title = \"\uD589 \uCD94\uAC00\"; addrow.innerHTML = \"<span>+</span>\";\r\n    addrow.style.top = bottomY + 4 + \"px\"; addrow.style.width = W + \"px\";\r\n    cont.appendChild(addrow);\r\n    const addcol = document.createElement(\"div\");\r\n    addcol.className = \"tbl-add tbl-addcol\"; addcol.title = \"\uC5F4 \uCD94\uAC00\"; addcol.innerHTML = \"<span>+</span>\";\r\n    addcol.style.left = addColLeft + \"px\"; addcol.style.height = bottomY + \"px\"; // \uD45C \uC804\uCCB4 \uB192\uC774(addboth\uB294 \uD45C \uC544\uB798\uB77C \uBE44\uACB9\uCE68)\r\n    cont.appendChild(addcol);\r\n    const addboth = document.createElement(\"div\");\r\n    addboth.className = \"tbl-add tbl-addboth\"; addboth.title = \"\uD589\u00B7\uC5F4 \uCD94\uAC00\"; addboth.innerHTML = \"<span>+</span>\";\r\n    addboth.style.left = addColLeft + \"px\"; addboth.style.top = bottomY + 4 + \"px\";\r\n    cont.appendChild(addboth);\r\n\r\n    // \uC804\uCCB4 \uC2A4\uCF00\uC77C \uD578\uB4E4 \u2014 \uB9C8\uC9C0\uB9C9 \uC5F4 \uC6B0\uBCC0(\uC5F4 \uC804\uCCB4 \uC2A4\uCF00\uC77C)\u00B7\uB9C8\uC9C0\uB9C9 \uD589 \uD558\uBCC0(\uD589 \uC804\uCCB4 \uC2A4\uCF00\uC77C)\u00B7\uCF54\uB108(\uC591\uCD95). (block-editor.html \uBAA8\uB378)\r\n    const edgeR = document.createElement(\"div\");\r\n    edgeR.className = \"edge-resizer edge-right\"; edgeR.style.left = W + \"px\"; edgeR.style.height = bottomY + \"px\";\r\n    edgeR.title = \"\uC5F4 \uB108\uBE44 \uC77C\uAD04 \uC870\uC808\"; edgeR.innerHTML = '<div class=\"bar\"></div>';\r\n    cont.appendChild(edgeR);\r\n    const edgeB = document.createElement(\"div\");\r\n    edgeB.className = \"edge-resizer edge-bottom\"; edgeB.style.top = bottomY + \"px\"; edgeB.style.width = W + \"px\";\r\n    edgeB.title = \"\uD589 \uB192\uC774 \uC77C\uAD04 \uC870\uC808\"; edgeB.innerHTML = '<div class=\"bar\"></div>';\r\n    cont.appendChild(edgeB);\r\n    const corner = document.createElement(\"div\");\r\n    corner.className = \"edge-resizer edge-corner\"; corner.style.left = W + \"px\"; corner.style.top = bottomY + \"px\";\r\n    corner.title = \"\uD45C \uD06C\uAE30 \uC870\uC808\"; corner.innerHTML = '<div class=\"bar\"></div>';\r\n    cont.appendChild(corner);\r\n\r\n    // \uD589/\uC5F4 \uC774\uB3D9 \uADF8\uB9BD(\u283F) \uC81C\uAC70 \u2014 \uC591\uC2DD\uC740 \uAD6C\uC870 \uACE0\uC815\uC774\uB77C \uB4DC\uB798\uADF8 \uC7AC\uC815\uB82C \uBD88\uD544\uC694. \uC88C/\uC0C1\uB2E8 \uAC70\uD130\uB97C \uCC28\uC9C0\uD558\uC9C0 \uC54A\uB294\uB2E4.\r\n    // (\uC7AC\uC815\uB82C\uC774 \uD544\uC694\uD558\uBA74 \uD45C \uD234\uBC14\uC758 \uC774\uB3D9 \uBC84\uD2BC\uC73C\uB85C \uB300\uCCB4 \uAC00\uB2A5 \u2014 ops.js moveRow/moveCol \uC7AC\uC0AC\uC6A9.)\r\n\r\n    host.appendChild(cont);\r\n  }\r\n  // \uC5F4 \uC6B0\uBCC0 \uACBD\uACC4(px, \uD45C \uC88C\uC0C1\uB2E8 \uAE30\uC900). cell rect \uAE30\uBC18 \u2014 colspan/\uBCD1\uD569 \uC140\uC740 \uB9C8\uC9C0\uB9C9 \uC5F4(c+colspan-1)\uC5D0\uB9CC\r\n  // \uC6B0\uBCC0\uC744 \uAE30\uB85D\uD558\uBBC0\uB85C, \uAC1C\uBCC4 \uC140 \uD3ED/colspan \uADE0\uB4F1\uBD84\uD560\uB85C \uC5F4\uD3ED\uC744 \uCD94\uC815\uD558\uB358 \uC624\uCC28\uB97C \uC5C6\uC564\uB2E4(addResizeHandles right[]\uC640 \uB3D9\uC77C \uBC29\uC2DD).\r\n  function measureColRights(table) {\r\n    const G = table.__model.G || [];\r\n    const cols = G[0] ? G[0].length : 0;\r\n    const tableRect = table.getBoundingClientRect ? table.getBoundingClientRect() : { left: 0 };\r\n    const right = new Array(cols).fill(0);\r\n    table.querySelectorAll(\"td.lumir-cell\").forEach((td) => {\r\n      const m = td.__master;\r\n      const rb = td.getBoundingClientRect ? td.getBoundingClientRect() : { right: 0 };\r\n      const x = rb.right - (tableRect.left || 0);\r\n      const ck = m.c + m.colspan - 1;\r\n      if (x > right[ck]) right[ck] = x;\r\n    });\r\n    return right;\r\n  }\r\n  function startColResize(rz, e) {\r\n    const table = rz.closest(\".content\").querySelector(\".lumir-tbl\");\r\n    const m = table.__model;\r\n    const k = +rz.dataset.col;\r\n    const cols = (m.G[0] || []).length;\r\n    const colsEl = table.querySelectorAll(\"colgroup col\");\r\n    // \uB9AC\uC0AC\uC774\uC988 \uC2DC\uC791 \uC2DC \uBAA8\uB4E0 \uC5F4 \uB108\uBE44\uB97C \"\uACE0\uC815\"\uD55C\uB2E4(null \uC790\uB3D9 \uC7AC\uBD84\uBC30 \uCC28\uB2E8).\r\n    // \uBAA8\uB378 columnWidths\uAC00 \uC774\uBBF8 \uC720\uD6A8\uD558\uBA74 \uADF8\uB300\uB85C \uC0AC\uC6A9\uD55C\uB2E4 \u2014 \uC7AC\uCE21\uC815(curColWidths)\uC740 \uBCD1\uD569\uC5F4 \uD3F4\uBC31\u00B7colspan\r\n    // \uADE0\uB4F1\uBD84\uD560\u00B7\uBC18\uC62C\uB9BC\u00B7border-collapse \uACF5\uC720\uBCF4\uB354 \uB54C\uBB38\uC5D0 \uC2E4\uC81C \uD45C\uD3ED\uACFC \uC5B4\uAE0B\uB098, \uB9AC\uC0AC\uC774\uC800\uB97C \"\uC7A1\uB294 \uC21C\uAC04\"\r\n    // \uD45C \uC804\uCCB4 \uD3ED\uC774 \uD280\uB294 \uC6D0\uC778\uC774\uC5C8\uB2E4. auto(null)/\uBBF8\uC124\uC815 \uD45C\uB9CC \uCE21\uC815\uC73C\uB85C \uD3F4\uBC31.\r\n    const modelValid = Array.isArray(m.columnWidths) && m.columnWidths.length === cols && m.columnWidths.every((w) => w > 0);\r\n    const frozen = modelValid ? m.columnWidths.slice() : curColWidths(table);\r\n    m.columnWidths = frozen.slice();\r\n    frozen.forEach((w, i) => { if (colsEl[i]) colsEl[i].style.width = w + \"px\"; });\r\n    // \uB4DC\uB798\uADF8 \uC911\uC5D4 \uD3EC\uC778\uD130\uAC00 \uC587\uC740 \uB9AC\uC0AC\uC774\uC800 \uB760 \uBC16\uC73C\uB85C \uB098\uAC00 :hover\uAC00 \uD480\uB9B0\uB2E4 \u2192 body \uCEE4\uC11C\uB97C \uACE0\uC815\uD558\uACE0\r\n    // .resizing \uD074\uB798\uC2A4\uB85C \uACBD\uACC4 \uD558\uC774\uB77C\uC774\uD2B8(.bar)\uB97C \uC720\uC9C0\uD55C\uB2E4(\uC2A4\uCF00\uC77C \uD578\uB4E4\uACFC \uB3D9\uC77C\uD55C UX).\r\n    document.body.style.cursor = \"col-resize\";\r\n    rz.classList.add(\"resizing\");\r\n    // \uACBD\uACC4 k\uC758 \uB9AC\uC0AC\uC774\uC800 \uC138\uADF8\uBA3C\uD2B8(\uBCD1\uD569\uC73C\uB85C \uBD84\uD560\uB410\uC744 \uC218 \uC788\uC74C) \u2014 \uB4DC\uB798\uADF8 \uC911 \uD558\uC774\uB77C\uC774\uD2B8\uAC00 \uC774\uB3D9\uD558\uB294 \uACBD\uACC4\uB97C \uB530\uB77C\uAC00\uB3C4\uB85D \uD568\uAED8 \uC774\uB3D9.\r\n    const cont = rz.closest(\".tbl-handles\");\r\n    const segs = cont ? [...cont.querySelectorAll(`.col-resizer[data-col=\"${k}\"]`)] : [rz];\r\n    const segLeft0 = segs.map((s) => parseFloat(s.style.left) || 0);\r\n    const startX = e.clientX;\r\n    const j = k + 1; // \uC624\uB978\uCABD \uC778\uC811 \uC5F4\r\n    const startWk = frozen[k];\r\n    const startWj = frozen[j] != null ? frozen[j] : startWk;\r\n    // \uB0B4\uBD80 \uACBD\uACC4 \uC7AC\uBD84\uBC30: \uACBD\uACC4\uB97C \u03B4\uB9CC\uD07C \uC62E\uAE30\uBA74 k\uB294 +\u03B4, j\uB294 \u2212\u03B4 (\uC804\uCCB4 \uD45C\uD3ED = \uC0C1\uC218 \u2192 \uC815\uB82C\u00B7\uC704\uCE58 \uBD88\uBCC0, no-scroll \uC815\uD569).\r\n    // \uB9C8\uC9C0\uB9C9 \uC5F4 \uC6B0\uBCC0\uC740 \uB9AC\uC0AC\uC774\uC800\uAC00 \uC544\uB2C8\uB77C edge-right(\uC5F4 \uC804\uCCB4 \uC2A4\uCF00\uC77C)\uAC00 \uB2F4\uB2F9\uD55C\uB2E4. \u03B4\uB294 \uB450 \uC5F4 \uBAA8\uB450 fMin \uC774\uC0C1 \uD074\uB7A8\uD504.\r\n    const fMin = effMinCol(cols, maxTableWidth(table), MIN_COL); // compact \uD45C\uB294 40 \uBBF8\uB9CC\uAE4C\uC9C0 \uD5C8\uC6A9(\uC608\uC0B0 \uBBF8\uC0C1\uC774\uBA74 40)\r\n    const minDelta = fMin - startWk;\r\n    const maxDelta = startWj - fMin;\r\n    function move(ev) {\r\n      let d = Math.round(ev.clientX - startX);\r\n      if (d < minDelta) d = minDelta;\r\n      if (d > maxDelta) d = maxDelta;\r\n      const wk = startWk + d, wj = startWj - d;\r\n      m.columnWidths[k] = wk;\r\n      m.columnWidths[j] = wj;\r\n      if (colsEl[k]) colsEl[k].style.width = wk + \"px\";\r\n      if (colsEl[j]) colsEl[j].style.width = wj + \"px\";\r\n      // \uC5F4\uD3ED\uC774 fMin(<40 \uAC00\uB2A5)\uAE4C\uC9C0 \uB0B4\uB824\uAC00\uBA74 CSS min-width(40)\uAC00 \uB80C\uB354\uB97C 40\uC73C\uB85C \uB418\uBC00\uC5B4 \uD45C\uD3ED\uC774 \uBC8C\uC5B4\uC9C4\uB2E4.\r\n      // \uC2A4\uCF00\uC77C \uACBD\uB85C(applyColWidthsLive)\uC640 \uB3D9\uC77C\uD558\uAC8C compact \uD074\uB798\uC2A4\uB97C \uC2E4\uC2DC\uAC04 \uD1A0\uAE00\uD574 min-width\uB97C 24\uB85C \uB0AE\uCD98\uB2E4(\uBAA8\uB378=\uB80C\uB354 \uC815\uD569).\r\n      syncCompact(table);\r\n      // \uACBD\uACC4\uB294 \uC5F4 k\uC758 \uC6B0\uBCC0 \u2192 \uD3ED \uBCC0\uD654\uB7C9 d \uB9CC\uD07C \uC6B0\uCE21 \uC774\uB3D9. \uD558\uC774\uB77C\uC774\uD2B8 \uC138\uADF8\uBA3C\uD2B8\uB97C \uC0C8 \uACBD\uACC4\uB85C \uC62E\uAE34\uB2E4.\r\n      segs.forEach((s, i) => { s.style.left = segLeft0[i] + d + \"px\"; });\r\n    }\r\n    function up() {\r\n      document.removeEventListener(\"mousemove\", move);\r\n      document.removeEventListener(\"mouseup\", up);\r\n      document.body.style.cursor = \"\";\r\n      rz.classList.remove(\"resizing\");\r\n      addResizeHandles(table); // \uACBD\uACC4\uAC00 \uC774\uB3D9\uD588\uC73C\uBBC0\uB85C \uD578\uB4E4 \uC704\uCE58 \uAC31\uC2E0\r\n      onChange();\r\n    }\r\n    document.addEventListener(\"mousemove\", move);\r\n    document.addEventListener(\"mouseup\", up);\r\n  }\r\n  function startRowResize(rz, e) {\r\n    const table = rz.closest(\".content\").querySelector(\".lumir-tbl\");\r\n    const m = table.__model;\r\n    const k = +rz.dataset.row;\r\n    const startY = e.clientY;\r\n    const trs = table.querySelectorAll(\"tbody tr\");\r\n    const tr = trs[k];\r\n    const startH = (tr && tr.getBoundingClientRect ? Math.round(tr.getBoundingClientRect().height) : 0) || MIN_ROW;\r\n    // \uB4DC\uB798\uADF8 \uC911 :hover \uC0C1\uC2E4\uC5D0 \uB300\uBE44\uD574 body \uCEE4\uC11C \uACE0\uC815 + .resizing \uD558\uC774\uB77C\uC774\uD2B8 \uC720\uC9C0(\uC5F4 \uB9AC\uC0AC\uC774\uC988\uC640 \uB3D9\uC77C UX).\r\n    document.body.style.cursor = \"row-resize\";\r\n    rz.classList.add(\"resizing\");\r\n    // \uACBD\uACC4 k\uC758 \uB9AC\uC0AC\uC774\uC800 \uC138\uADF8\uBA3C\uD2B8(\uC138\uB85C \uBCD1\uD569\uC73C\uB85C \uBD84\uD560\uB410\uC744 \uC218 \uC788\uC74C) \u2014 \uB4DC\uB798\uADF8 \uC911 \uD558\uC774\uB77C\uC774\uD2B8\uAC00 \uC774\uB3D9\uD558\uB294 \uACBD\uACC4\uB97C \uB530\uB77C\uAC00\uB3C4\uB85D \uD568\uAED8 \uC774\uB3D9.\r\n    const cont = rz.closest(\".tbl-handles\");\r\n    const segs = cont ? [...cont.querySelectorAll(`.row-resizer[data-row=\"${k}\"]`)] : [rz];\r\n    const segTop0 = segs.map((s) => parseFloat(s.style.top) || 0);\r\n    function move(ev) {\r\n      const h = Math.max(MIN_ROW, Math.round(startH + (ev.clientY - startY)));\r\n      if (tr) tr.style.height = h + \"px\";\r\n      // \uD589 k\uC5D0\uC11C \uC2DC\uC791\uD558\uB294 master\uC5D0 rowHeight \uC800\uC7A5\r\n      for (let c = 0; c < m.G[k].length; c++) { const cell = m.G[k][c]; if (cell.r === k) cell.rowHeight = h; }\r\n      // \uD558\uC774\uB77C\uC774\uD2B8\uB294 \"\uC2E4\uC81C \uB80C\uB354\uB41C \uD589 \uD558\uBCC0\"\uC73C\uB85C \uC774\uB3D9\uD55C\uB2E4. tr\uC758 height\uB294 \uCD5C\uC18C\uB192\uC774\uB85C \uB3D9\uC791\uD558\uBBC0\uB85C, \uC140 \uCF58\uD150\uCE20\u00B7\uD328\uB529\uC774\r\n      // \uAC15\uC81C\uD558\uB294 \uB80C\uB354 \uCD5C\uC18C\uB192\uC774(> MIN_ROW)\uC5D0\uC11C\uB294 tr\uC774 \uB354 \uC904\uC9C0 \uC54A\uB294\uB2E4 \u2192 \uC2E4\uCE21 \uD558\uBCC0\uC5D0 \uB9DE\uCD94\uBA74 \uBCF4\uB354\u00B7\uD558\uC774\uB77C\uC774\uD2B8\uAC00\r\n      // \uADF8 \uC9C0\uC810\uC5D0\uC11C \uD568\uAED8 \uBA48\uCD98\uB2E4(\uBAA8\uB378 h\uB85C\uB9CC \uACC4\uC0B0\uD558\uBA74 \uCD5C\uC18C \uC774\uD558\uB85C \uB354 \uC62C\uB77C\uAC00 \uC2E4\uC81C \uBCF4\uB354\uC640 \uC5B4\uAE0B\uB0A8).\r\n      const tRect = table.getBoundingClientRect ? table.getBoundingClientRect() : null;\r\n      const trRect = tr && tr.getBoundingClientRect ? tr.getBoundingClientRect() : null;\r\n      const realBottom = tRect && trRect ? trRect.bottom - tRect.top : segTop0[0] + (h - startH);\r\n      segs.forEach((s) => { s.style.top = realBottom + \"px\"; });\r\n    }\r\n    function up() { document.removeEventListener(\"mousemove\", move); document.removeEventListener(\"mouseup\", up); document.body.style.cursor = \"\"; rz.classList.remove(\"resizing\"); addResizeHandles(table); onChange(); }\r\n    document.addEventListener(\"mousemove\", move);\r\n    document.addEventListener(\"mouseup\", up);\r\n  }\r\n\r\n  // ---------- \uC804\uCCB4/\uCF54\uB108 \uC2A4\uCF00\uC77C (\uC0D8\uD50C startColScaleAll/startRowScaleAll/startCornerScale \uCC38\uACE0) ----------\r\n  function curColWidths(table) {\r\n    const rights = measureColRights(table);\r\n    const out = [];\r\n    let prev = 0;\r\n    for (let c = 0; c < rights.length; c++) {\r\n      const edge = rights[c] || prev;      // \uACBD\uACC4 \uBBF8\uCE21\uC815(\uC804 \uD589\uC774 \uBCD1\uD569\uC73C\uB85C \uC774 \uC5F4\uC744 \uAC00\uB85C\uC9C0\uB984\u00B7jsdom 0 \uB4F1)\uC774\uBA74 \uD3ED 0 \uCDE8\uAE09\r\n      const w = Math.round(edge - prev);\r\n      prev = edge;\r\n      out.push(w > 0 ? w : 80);            // \uCE21\uC815 \uBD88\uAC00 \uC5F4\uB9CC 80 \uD3F4\uBC31(\uACBD\uACC4\uAC00 \uC2E4\uC7AC\uD558\uC9C0 \uC54A\uB294 \uC608\uC678 \uCF00\uC774\uC2A4)\r\n    }\r\n    return out;\r\n  }\r\n  function curRowHeights(table) {\r\n    return [...table.querySelectorAll(\"tbody tr\")].map((tr) => (tr.getBoundingClientRect ? Math.round(tr.getBoundingClientRect().height) : MIN_ROW) || MIN_ROW);\r\n  }\r\n  function applyColWidthsLive(table, widths) {\r\n    table.__model.columnWidths = widths.slice();\r\n    const cols = table.querySelectorAll(\"colgroup col\");\r\n    widths.forEach((w, k) => { if (cols[k]) cols[k].style.width = w + \"px\"; });\r\n    syncCompact(table); // \uC2A4\uCF00\uC77C \uC911 \uC2E4\uC2DC\uAC04 compact \uD1A0\uAE00(CSS min-width \uC815\uD569)\r\n  }\r\n  function applyRowHeightsLive(table, heights) {\r\n    const m = table.__model;\r\n    const trs = table.querySelectorAll(\"tbody tr\");\r\n    heights.forEach((h, r) => {\r\n      if (trs[r]) trs[r].style.height = h + \"px\";\r\n      if (m.G[r]) for (let c = 0; c < m.G[r].length; c++) { const cell = m.G[r][c]; if (cell && cell.r === r) cell.rowHeight = h; }\r\n    });\r\n  }\r\n  function liveAfter(table) { addResizeHandles(table); }\r\n  // ---------- \uBD80\uBAA8 \uB108\uBE44 \uD074\uB7A8\uD504 (\uC5F4 \uCD94\uAC00/\uC2A4\uCF00\uC77C\uC774 \uC5D0\uB514\uD130 \uD3ED\uC744 \uB118\uC9C0 \uC54A\uB3C4\uB85D) ----------\r\n  function maxTableWidth(table) {\r\n    // \uBAA8\uBC14\uC77C: \uD3ED \uC608\uC0B0 0(=\uBBF8\uC0C1) \u2192 clampTableWidth\u00B7canAddColumn\u00B7\uC2A4\uCF00\uC77C\uC774 \uBAA8\uB450 \uD3ED \uC81C\uD55C\uC744 \uAC74\uB108\uB6F0\uC5B4\r\n    // \uD45C\uAC00 \uD3B8\uC9D1\uC601\uC5ED\uBCF4\uB2E4 \uB113\uC73C\uBA74 CSS(overflow-x)\uB85C \uAC00\uB85C \uC2A4\uD06C\uB864. (\uB370\uC2A4\uD06C\uD1B1\uC740 \uAE30\uC874 fit-to-width \uC720\uC9C0)\r\n    if (isMobileViewport()) return 0;\r\n    const host = table.closest(\".content\") || table.parentElement;\r\n    const w = host && host.clientWidth ? host.clientWidth : 0;\r\n    // .content \uC88C\uC6B0 padding 0 \u2192 \uCF58\uD150\uCE20\uBC15\uC2A4 \uD3ED = clientWidth. \uC5EC\uAE30\uAE4C\uC9C0 \uCC44\uC6B0\uBA74 \uD45C\uAC00 \uC88C\u00B7\uC6B0\uBCC0 \uCF58\uD150\uCE20 \uB05D\uC120\uC5D0 flush\r\n    // (fillInitialTablesToWidth \uC640 \uB3D9\uC77C \uAE30\uC900 \u2192 \uCD08\uAE30 \uCC44\uC6C0/\uC2A4\uCF00\uC77C \uC0C1\uD55C \uC815\uD569). \uC5F4\uCD94\uAC00(+)\uB294 hover-reveal \uC624\uBC84\uB808\uC774\uB77C \uD3ED \uBBF8\uC810\uC720.\r\n    return w ? Math.max(MIN_COL * 2, w) : 0;\r\n  }\r\n  function tableAtMaxWidth(table) {\r\n    const maxW = maxTableWidth(table);\r\n    if (!maxW) return false;\r\n    const w = table.getBoundingClientRect ? table.getBoundingClientRect().width : 0;\r\n    return w >= maxW - 4; // \uD45C \uD3ED\uC774 \uBD80\uBAA8 \uAC00\uC6A9\uD3ED\uC5D0 \uADFC\uC811 \u2192 \uC815\uB82C \uBB34\uC758\uBBF8\r\n  }\r\n  function canAddColumn(table) {\r\n    const maxW = maxTableWidth(table);\r\n    if (!maxW) return true; // \uCE21\uC815 \uBD88\uAC00(jsdom/\uC11C\uBC84) \u2192 \uD5C8\uC6A9\r\n    const cols = (table.__model.G[0] || []).length;\r\n    return (cols + 1) * HARD_MIN_COL <= maxW; // \uBB3C\uB9AC \uD558\uD55C\uAE4C\uC9C0 \uC5F4 \uCD94\uAC00 \uD5C8\uC6A9(\uCD94\uAC00 \uD6C4 fit\uC774 \uBE44\uB840 \uCD95\uC18C)\r\n  }\r\n  // compact(\uC5F4 \uB2E4\uC218\uB85C 40px \uBBF8\uB9CC) \uC0C1\uD0DC\uB97C \uD45C \uD074\uB798\uC2A4\uC5D0 \uBC18\uC601 \u2192 CSS min-width\uAC00 \uD568\uAED8 \uB0AE\uC544\uC9D0(\uBAA8\uB378=\uB80C\uB354 \uC815\uD569).\r\n  function syncCompact(table) {\r\n    const cw = (table.__model && table.__model.columnWidths) || [];\r\n    table.classList.toggle(\"lumir-tbl--compact\", cw.some((w) => w && w < MIN_COL));\r\n  }\r\n  function clampWidths(widths, maxW) {\r\n    return fitWidths(widths, maxW, MIN_COL).widths;\r\n  }\r\n  /** \uB80C\uB354 \uD6C4 \uD638\uCD9C: \uD45C\uAC00 \uBD80\uBAA8 \uD3ED\uC744 \uB118\uC73C\uBA74 columnWidths\uB97C \uBE44\uB840 \uCD95\uC18C(\uBCC0\uACBD \uC2DC true) */\r\n  function clampTableWidth(table) {\r\n    const maxW = maxTableWidth(table);\r\n    if (!maxW) return false;\r\n    const m = table.__model;\r\n    const cols = (m.G[0] || []).length;\r\n    if (!cols) return false;\r\n    const cur = (m.columnWidths && m.columnWidths.length === cols && m.columnWidths.every((w) => w)) ? m.columnWidths.slice() : curColWidths(table);\r\n    const next = clampWidths(cur, maxW);\r\n    if (next.some((w, i) => w !== (m.columnWidths && m.columnWidths[i]))) { m.columnWidths = next; return true; }\r\n    return false;\r\n  }\r\n  function scaleDrag(table, onMove) {\r\n    function move(ev) { onMove(ev); liveAfter(table); }\r\n    function up() { document.removeEventListener(\"mousemove\", move); document.removeEventListener(\"mouseup\", up); document.body.style.cursor = \"\"; onChange(); }\r\n    document.addEventListener(\"mousemove\", move);\r\n    document.addEventListener(\"mouseup\", up);\r\n  }\r\n  // \uB9C8\uC9C0\uB9C9 \uC5F4 \uC6B0\uBCC0 = \uC5F4 \uC804\uCCB4 \uBE44\uB840 \uC2A4\uCF00\uC77C (block-editor.html startColScaleAll). fit \uC815\uCC45\uC0C1 clampWidths\uB85C budget \uD074\uB7A8\uD504.\r\n  function startColScaleAll(rz, e) {\r\n    const table = rz.closest(\".content\").querySelector(\".lumir-tbl\");\r\n    const c0 = curColWidths(table), W0 = c0.reduce((a, b) => a + b, 0) || 1, sx = e.clientX;\r\n    document.body.style.cursor = \"ew-resize\";\r\n    const maxW = maxTableWidth(table) || Infinity;\r\n    scaleDrag(table, (ev) => { const f = Math.max(0.1, (W0 + (ev.clientX - sx)) / W0); applyColWidthsLive(table, clampWidths(c0.map((w) => Math.max(MIN_SCALE_COL, Math.round(w * f))), maxW)); });\r\n  }\r\n  // \uB9C8\uC9C0\uB9C9 \uD589 \uD558\uBCC0 = \uD589 \uC804\uCCB4 \uBE44\uB840 \uC2A4\uCF00\uC77C (block-editor.html startRowScaleAll).\r\n  function startRowScaleAll(rz, e) {\r\n    const table = rz.closest(\".content\").querySelector(\".lumir-tbl\");\r\n    const h0 = curRowHeights(table), H0 = h0.reduce((a, b) => a + b, 0) || 1, sy = e.clientY;\r\n    document.body.style.cursor = \"ns-resize\";\r\n    scaleDrag(table, (ev) => { const f = Math.max(0.1, (H0 + (ev.clientY - sy)) / H0); applyRowHeightsLive(table, h0.map((h) => Math.max(MIN_SCALE_ROW, Math.round(h * f)))); });\r\n  }\r\n  function startCornerScale(rz, e) {\r\n    const table = rz.closest(\".content\").querySelector(\".lumir-tbl\");\r\n    const c0 = curColWidths(table), h0 = curRowHeights(table);\r\n    const W0 = c0.reduce((a, b) => a + b, 0) || 1, H0 = h0.reduce((a, b) => a + b, 0) || 1;\r\n    const sx = e.clientX, sy = e.clientY;\r\n    document.body.style.cursor = \"nwse-resize\";\r\n    const maxW = maxTableWidth(table) || Infinity;\r\n    scaleDrag(table, (ev) => {\r\n      const fx = Math.max(0.1, (W0 + (ev.clientX - sx)) / W0);\r\n      const fy = Math.max(0.1, (H0 + (ev.clientY - sy)) / H0);\r\n      applyColWidthsLive(table, clampWidths(c0.map((w) => Math.max(MIN_SCALE_COL, Math.round(w * fx))), maxW));\r\n      applyRowHeightsLive(table, h0.map((h) => Math.max(MIN_SCALE_ROW, Math.round(h * fy))));\r\n    });\r\n  }\r\n\r\n  // ---------- \uD589/\uC5F4 \uC7AC\uC815\uB82C (F3) \u2014 \uADF8\uB9BD UI \uB294 \uC81C\uAC70\uB410\uC73C\uB098 API(reorderRow/reorderCol)\uB294 \uC720\uC9C0(\uD234\uBC14 \uC774\uB3D9 \uBC84\uD2BC \uB4F1\uC5D0\uC11C \uC7AC\uC0AC\uC6A9 \uAC00\uB2A5). ----------\r\n  function reorderRow(table, from, to) {\r\n    syncModelFromTableDom(table); // \uC7AC\uB80C\uB354 \uC804 \uB77C\uC774\uBE0C \uC140 \uD3B8\uC9D1\uC744 \uBAA8\uB378\uB85C \uD68C\uC218(\uC548 \uD558\uBA74 \uBBF8\uB3D9\uAE30\uD654 \uD3B8\uC9D1 \uC720\uC2E4)\r\n    if (moveRow(table.__model, from, to)) { rerenderTable(table); addResizeHandles(table); onChange(); return true; }\r\n    return false;\r\n  }\r\n  function reorderCol(table, from, to) {\r\n    syncModelFromTableDom(table); // \uC7AC\uB80C\uB354 \uC804 \uB77C\uC774\uBE0C \uC140 \uD3B8\uC9D1\uC744 \uBAA8\uB378\uB85C \uD68C\uC218(\uC548 \uD558\uBA74 \uBBF8\uB3D9\uAE30\uD654 \uD3B8\uC9D1 \uC720\uC2E4)\r\n    if (moveCol(table.__model, from, to)) { rerenderTable(table); addResizeHandles(table); onChange(); return true; }\r\n    return false;\r\n  }\r\n\r\n  // ---------- cell navigation ----------\r\n  function tableCells(table) { return [...table.querySelectorAll(\"td.lumir-cell\")]; }\r\n  function moveCell(table, cell, dir) {\r\n    const cs = tableCells(table);\r\n    const i = cs.indexOf(cell);\r\n    const j = i + dir;\r\n    if (j < 0) { focusEnd(cs[0]); return; }\r\n    if (j >= cs.length) { runStructural(table, () => insertRow(table.__model, table.__model.G.length)); const c2 = tableCells(table); focusEnd(c2[i + 1] || c2[c2.length - 1]); return; }\r\n    focusEnd(cs[j]);\r\n  }\r\n  function allMasters(table) {\r\n    const m = table.__model, seen = new Set(), out = [];\r\n    for (let r = 0; r < m.G.length; r++) for (let c = 0; c < m.G[r].length; c++) { const cell = m.G[r][c]; if (!seen.has(cell)) { seen.add(cell); out.push(cell); } }\r\n    return out;\r\n  }\r\n  function onCellKeydown(e, td) {\r\n    const table = td.closest(\".lumir-tbl\");\r\n    // Ctrl/Cmd+A \uB2E8\uACC4 \uC120\uD0DD: \uC140 \uC804\uCCB4 \uC120\uD0DD \u2192 \uC774\uBBF8 \uC804\uCCB4\uBA74 \uAE30\uBCF8(\uBB38\uC11C) \uC704\uC784 (F4)\r\n    if ((e.metaKey || e.ctrlKey) && (e.key === \"a\" || e.key === \"A\")) {\r\n      const m = table.__model;\r\n      const masters = allMasters(table);\r\n      if (new Set(selectedCells).size >= masters.length && masters.length > 0) return;\r\n      e.preventDefault();\r\n      const first = cellEl(table, m.G[0][0]);\r\n      const lr = m.G[m.G.length - 1];\r\n      const last = cellEl(table, lr[lr.length - 1]);\r\n      if (first && last) selectRange(table, first, last);\r\n      return;\r\n    }\r\n    // ESC: \uC140 \uC120\uD0DD \uD574\uC81C(\uC120\uD0DD\uC774 \uC788\uC744 \uB54C\uB9CC \uAC00\uB85C\uCC44\uACE0, \uC5C6\uC73C\uBA74 \uAE30\uBCF8 \uB3D9\uC791 \uC720\uC9C0)\r\n    if (e.key === \"Escape\" && selectedCells.length) {\r\n      e.preventDefault();\r\n      clearSel(table);\r\n      return;\r\n    }\r\n    // \uC2A4\uD398\uC774\uC2A4: \uB77C\uC778 \uC2DC\uC791 \"[]\"/\"[ ]\" \u2192 \uCCB4\uD06C\uBC15\uC2A4 \uC790\uB3D9 \uBCC0\uD658(\uC131\uACF5 \uC2DC \uC2A4\uD398\uC774\uC2A4 \uC785\uB825 \uCDE8\uC18C)\r\n    if (e.key === \" \" && (tryCellCheckboxAutoformat(td) || tryCellListAutoformat(td))) { e.preventDefault(); return; }\r\n    // Backspace: \uCE90\uB7FF \uBC14\uB85C \uC55E\uC774 \uC778\uB77C\uC778 \uC6D0\uC790(\uCCB4\uD06C\uBC15\uC2A4/\uC21C\uC11C\u00B7\uBD88\uB81B \uB9C8\uCEE4)\uBA74 \uADF8 \uC6D0\uC790\uB97C \uC0AD\uC81C.\r\n    // \uC6D0\uC790\uB294 contenteditable=false + \uB4A4\uC5D0 ZWSP \uC575\uCEE4\uB77C \uBE0C\uB77C\uC6B0\uC800 \uAE30\uBCF8 Backspace\uB85C\uB294 \uC9C0\uC6CC\uC9C0\uC9C0 \uC54A\uB294\uB2E4.\r\n    if (e.key === \"Backspace\" && !isReadonly()) {\r\n      const sel = window.getSelection && window.getSelection();\r\n      if (sel && sel.rangeCount && sel.isCollapsed) {\r\n        const r = sel.getRangeAt(0);\r\n        if (td.contains(r.startContainer)) {\r\n          let node;\r\n          if (r.startContainer.nodeType === 1) node = r.startContainer.childNodes[r.startOffset - 1];\r\n          else {\r\n            const clean = (r.startContainer.nodeValue || \"\").replace(/\u200B/g, \"\");\r\n            if (r.startOffset > 0 && clean !== \"\") node = null; // \uC2E4\uC81C \uBB38\uC790 \uC55E \u2192 \uAE30\uBCF8 \uC0AD\uC81C\r\n            else node = r.startContainer.previousSibling; // \uC904 \uC2DC\uC791 \uB610\uB294 ZWSP-only \uD14D\uC2A4\uD2B8 \u2192 \uADF8 \uC55E\uC744 \uAC80\uC0AC\r\n          }\r\n          while (node && node.nodeType === 3 && (node.nodeValue || \"\").replace(/\u200B/g, \"\") === \"\") node = node.previousSibling; // ZWSP/\uBE48 \uD14D\uC2A4\uD2B8 \uAC74\uB108\uB700\r\n          if (isAtomEl(node)) {\r\n            e.preventDefault();\r\n            const parent = node.parentNode;\r\n            let anchor = node.nextSibling;\r\n            while (anchor && anchor.nodeType === 3 && (anchor.nodeValue || \"\").replace(/\u200B/g, \"\") === \"\") { const t = anchor; anchor = anchor.nextSibling; t.remove(); } // \uB4A4\uB530\uB974\uB294 ZWSP \uC575\uCEE4 \uC81C\uAC70\r\n            node.remove();\r\n            try {\r\n              const nr = document.createRange();\r\n              if (anchor) nr.setStartBefore(anchor); else nr.setStart(parent, parent.childNodes.length);\r\n              nr.collapse(true);\r\n              sel.removeAllRanges();\r\n              sel.addRange(nr);\r\n            } catch (_) { /* selection \uBBF8\uAD6C\uD604 \uD658\uACBD \uBB34\uC2DC */ }\r\n            syncModelFromTableDom(table);\r\n            onChange();\r\n            refreshActiveTableOverlays();\r\n            return;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    if (e.key === \"Tab\") { e.preventDefault(); moveCell(table, td, e.shiftKey ? -1 : 1); return; }\r\n    if (e.key === \"Enter\") {\r\n      // \uC140 \uC904\uBC14\uAFC8 \u2014 \uC140\uC740 white-space:normal\uC774\uB77C \"\\n\" \uD14D\uC2A4\uD2B8\uB294 \uACF5\uBC31\uC73C\uB85C \uC811\uD78C\uB2E4. <br>\uB85C \uC0BD\uC785\uD574\uC57C \uC2E4\uC81C \uAC1C\uD589.\r\n      // (\uC9C1\uB82C\uD654 htmlToInlineContent\uAC00 <br>\u2192\"\\n\" \uBCC0\uD658, filler <br>\uB294 \uBB34\uC2DC \u2014 regular \uBE14\uB85D handleHardBreak\uC640 \uB3D9\uC77C)\r\n      e.preventDefault();\r\n      // \uB9AC\uC2A4\uD2B8 \uC5F0\uC18D: \uD604\uC7AC \uC904\uC774 \uC21C\uC11C/\uBD88\uB81B \uB9C8\uCEE4\uB85C \uC2DC\uC791\uD558\uBA74 Enter\uAC00 \uB2E4\uC74C \uD56D\uBAA9 \uC790\uB3D9 \uC0DD\uC131(\uBE48 \uD56D\uBAA9\uC774\uBA74 \uB9AC\uC2A4\uD2B8 \uC885\uB8CC).\r\n      const li = currentLineInfo(td);\r\n      if (li && li.markerEl) {\r\n        const sel0 = window.getSelection();\r\n        if (li.hasContent) {\r\n          const r = sel0.getRangeAt(0);\r\n          r.deleteContents();\r\n          const br = document.createElement(\"br\");\r\n          r.insertNode(br);\r\n          const marker = makeListEl(li.kind);\r\n          br.after(marker);\r\n          if (!marker.nextSibling) marker.after(document.createTextNode(\"\u200B\"));\r\n          const nr = document.createRange();\r\n          nr.setStartAfter(marker);\r\n          nr.collapse(true);\r\n          sel0.removeAllRanges();\r\n          sel0.addRange(nr);\r\n        } else {\r\n          // \uBE48 \uB9AC\uC2A4\uD2B8 \uD56D\uBAA9\uC5D0\uC11C Enter \u2192 \uB9C8\uCEE4 \uC81C\uAC70\uD558\uACE0 \uB9AC\uC2A4\uD2B8 \uC885\uB8CC(\uD604\uC7AC \uC904\uC744 \uC77C\uBC18 \uC904\uB85C).\r\n          const anchorNext = li.markerEl.nextSibling;\r\n          const parent = li.markerEl.parentNode;\r\n          li.markerEl.remove();\r\n          try {\r\n            const nr = document.createRange();\r\n            if (anchorNext) nr.setStartBefore(anchorNext);\r\n            else nr.setStart(parent, parent.childNodes.length);\r\n            nr.collapse(true);\r\n            sel0.removeAllRanges();\r\n            sel0.addRange(nr);\r\n          } catch (_) { /* ignore */ }\r\n        }\r\n        onChange();\r\n        refreshActiveTableOverlays();\r\n        return;\r\n      }\r\n      const sel = window.getSelection();\r\n      if (sel && sel.rangeCount) {\r\n        const r = sel.getRangeAt(0);\r\n        r.deleteContents();\r\n        const br = document.createElement(\"br\");\r\n        r.insertNode(br);\r\n        while (br.nextSibling && br.nextSibling.nodeType === 3 && br.nextSibling.nodeValue === \"\") br.nextSibling.remove();\r\n        if (!br.nextSibling) {\r\n          const filler = document.createElement(\"br\");\r\n          filler.setAttribute(\"data-lumir-br-filler\", \"\");\r\n          br.after(filler); // \uC904 \uB05D caret\uC774 \uC0C8 \uC904\uC5D0 \uB193\uC774\uB3C4\uB85D \uBCF4\uC870 <br>(\uC9C1\uB82C\uD654 \uBB34\uC2DC)\r\n        }\r\n        r.setStartAfter(br);\r\n        r.collapse(true);\r\n        sel.removeAllRanges();\r\n        sel.addRange(r);\r\n        onChange();\r\n        refreshActiveTableOverlays(); // \uC904\uBC14\uAFC8\uC73C\uB85C \uC140 \uB192\uC774 \uC99D\uAC00 \u2192 \uC624\uBC84\uB808\uC774 \uC7AC\uBC30\uCE58\r\n      }\r\n      return;\r\n    }\r\n    if (e.key === \"ArrowDown\") {\r\n      const m = td.__master; const nr = m.r + m.rowspan;\r\n      if (nr < table.__model.G.length) { e.preventDefault(); focusCellAt(table, nr, m.c); }\r\n      else { const blk = table.closest(\".block\"); if (blk && focusAdjacentBlockEdge(blk, 1)) e.preventDefault(); } // \uB9C8\uC9C0\uB9C9 \uD589 \u2192 \uC544\uB798 \uBE14\uB85D\r\n    }\r\n    if (e.key === \"ArrowUp\") {\r\n      const m = td.__master;\r\n      if (m.r - 1 >= 0) { e.preventDefault(); focusCellAt(table, m.r - 1, m.c); }\r\n      else { const blk = table.closest(\".block\"); if (blk && focusAdjacentBlockEdge(blk, -1)) e.preventDefault(); } // \uCCAB \uD589 \u2192 \uC704 \uBE14\uB85D\r\n    }\r\n    // \uC88C\uC6B0 \uC140 \uC774\uB3D9 \u2014 \uC140 \uB05D\uC5D0\uC11C \u2192\uB294 \uB2E4\uC74C \uC140, \uC140 \uC2DC\uC791\uC5D0\uC11C \u2190\uB294 \uC774\uC804 \uC140(\uC77D\uAE30 \uC21C\uC11C, \uD45C \uB05D/\uCC98\uC74C\uC774\uBA74 \uADF8\uB300\uB85C).\r\n    // \uC140 \uC911\uAC04\uC5D0\uC11C\uB294 \uB124\uC774\uD2F0\uBE0C(\uC140 \uB0B4\uBD80 \uD14D\uC2A4\uD2B8 \uC774\uB3D9). \uD45C \uAD6C\uC870 \uBCC0\uACBD \uC5C6\uC74C.\r\n    if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\r\n      const sel = window.getSelection();\r\n      if (!sel || !sel.rangeCount || !sel.isCollapsed) return;\r\n      const range = sel.getRangeAt(0);\r\n      const cs = tableCells(table);\r\n      const i = cs.indexOf(td);\r\n      if (i < 0) return;\r\n      if (e.key === \"ArrowRight\" && caretAtCellEnd(td, range) && i + 1 < cs.length) { e.preventDefault(); focusStart(cs[i + 1]); }\r\n      else if (e.key === \"ArrowLeft\" && caretAtCellStart(td, range) && i - 1 >= 0) { e.preventDefault(); focusEnd(cs[i - 1]); }\r\n    }\r\n  }\r\n\r\n  // ---------- listeners ----------\r\n  function onMousedown(e) {\r\n    // \uC140 \uC548 \uCCB4\uD06C\uBC15\uC2A4 \uD074\uB9AD \u2192 checked \uD1A0\uAE00(\uC9C1\uB82C\uD654 {type:\"checkbox\"} + \uBCC0\uACBD \uC54C\uB9BC). \uCE90\uB7FF \uC774\uB3D9 \uBC29\uC9C0 \uC704\uD574 preventDefault.\r\n    const box = e.target.closest && e.target.closest(\".lumir-cell-check\");\r\n    if (box) { toggleCellCheckbox(box, e); return; }\r\n    const corner = e.target.closest && e.target.closest(\".edge-corner\");\r\n    if (corner) { e.preventDefault(); startCornerScale(corner, e); return; }\r\n    const eR = e.target.closest && e.target.closest(\".edge-right\");\r\n    if (eR) { e.preventDefault(); startColScaleAll(eR, e); return; }\r\n    const eB = e.target.closest && e.target.closest(\".edge-bottom\");\r\n    if (eB) { e.preventDefault(); startRowScaleAll(eB, e); return; }\r\n    const rz = e.target.closest && e.target.closest(\".col-resizer\");\r\n    if (rz) { e.preventDefault(); startColResize(rz, e); return; }\r\n    const rrz = e.target.closest && e.target.closest(\".row-resizer\");\r\n    if (rrz) { e.preventDefault(); startRowResize(rrz, e); return; }\r\n    const addRow = e.target.closest && e.target.closest(\".tbl-addrow\");\r\n    if (addRow) { e.preventDefault(); const t = addRow.closest(\".content\").querySelector(\".lumir-tbl\"); runStructural(t, () => insertRow(t.__model, t.__model.G.length)); return; }\r\n    const addCol = e.target.closest && e.target.closest(\".tbl-addcol\");\r\n    if (addCol) { e.preventDefault(); const t = addCol.closest(\".content\").querySelector(\".lumir-tbl\"); if (canAddColumn(t)) runStructural(t, () => insertCol(t.__model, t.__model.G[0].length)); return; }\r\n    const addBoth = e.target.closest && e.target.closest(\".tbl-addboth\");\r\n    if (addBoth) { e.preventDefault(); const t = addBoth.closest(\".content\").querySelector(\".lumir-tbl\"); runStructural(t, () => { insertRow(t.__model, t.__model.G.length); if (canAddColumn(t)) insertCol(t.__model, t.__model.G[0].length); }); return; }\r\n    const td = e.target.closest && e.target.closest(\"td.lumir-cell\");\r\n    if (td) { selAnchor = td; selTable = td.closest(\".lumir-tbl\"); selecting = true; }\r\n  }\r\n  function onMousemove(e) {\r\n    if (!selecting) return;\r\n    const td = e.target.closest && e.target.closest(\"td.lumir-cell\");\r\n    if (!td || td.closest(\".lumir-tbl\") !== selTable) return;\r\n    if (td !== selAnchor) { window.getSelection().removeAllRanges(); selectRange(selTable, selAnchor, td); }\r\n    else { clearSel(selTable); }\r\n  }\r\n  function onMouseup() { selecting = false; }\r\n  function onFocusin(e) {\r\n    const td = e.target.closest && e.target.closest(\"td.lumir-cell\");\r\n    if (td) {\r\n      activeTable = td.closest(\".lumir-tbl\");\r\n      activeCell = td;\r\n      if (!selecting) clearSel(activeTable);\r\n      addResizeHandles(activeTable);\r\n      showToolbar(activeTable);\r\n      updateToolbarStates();\r\n    } else {\r\n      const c = e.target.closest && e.target.closest(\".content\");\r\n      if (!c || !c.querySelector || !c.querySelector(\".lumir-tbl\")) {\r\n        // \uD45C \uBC16\uC73C\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9\r\n        setTimeout(() => { const a = document.activeElement; if (!a || (!a.closest(\"td.lumir-cell\") && !a.closest(\".lumir-table-toolbar\"))) hideToolbar(); }, 0);\r\n      }\r\n    }\r\n  }\r\n  function onKeydown(e) {\r\n    // Ctrl/Cmd+C\u00B7X (\uC140 \uBC94\uC704 \uC120\uD0DD) \u2014 \uC140\uC774 \uAC01\uAC01 \uB3C5\uB9BD contenteditable\uC774\uB77C \uB4DC\uB798\uADF8 \uC120\uD0DD\uC740 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC744\r\n    // \uB9CC\uB4E4\uC9C0 \uBABB\uD558\uACE0 \uBE44\uC6B4\uB2E4. \uADF8 \uACB0\uACFC \uC2E4\uC81C Chrome\uC740 Ctrl+C\uC5D0\uC11C copy \uC774\uBCA4\uD2B8\uB97C \uBC1C\uD654\uD558\uC9C0 \uC54A\uC544 \uD074\uB9BD\uBCF4\uB4DC\uAC00\r\n    // \uAC31\uC2E0\uB418\uC9C0 \uC54A\uB294\uB2E4(\uC9C1\uC804 \uBCF5\uC0AC \uB370\uC774\uD130\uAC00 \uADF8\uB300\uB85C \uBD99\uC74C). \uD3EC\uCEE4\uC2A4\uAC00 \uC140\uC744 \uBC97\uC5B4\uB09C \uACBD\uC6B0\uAE4C\uC9C0 \uCEE4\uBC84\uD558\uB3C4\uB85D \uC0C1\uC704\uC5D0\uC11C \uCC98\uB9AC.\r\n    if ((e.metaKey || e.ctrlKey) && !e.altKey && (e.key === \"c\" || e.key === \"C\" || e.key === \"x\" || e.key === \"X\")\r\n        && selectedCells.length && activeTable && editorEl.contains(activeTable)) {\r\n      e.preventDefault();\r\n      copySelectedCells(activeTable, e.key === \"x\" || e.key === \"X\");\r\n      return;\r\n    }\r\n    const td = e.target.closest && e.target.closest(\"td.lumir-cell\");\r\n    if (td) onCellKeydown(e, td);\r\n  }\r\n  // \uD45C \uD234\uBC14 \uD45C\uC2DC \uC911, \uD45C \uBC14\uAE65(\uB2E4\uB978 \uBE14\uB85D\u00B7\uBE48 \uC601\uC5ED\u00B7\uC5D0\uB514\uD130 \uBC16) \uD074\uB9AD \u2192 \uD234\uBC14 \uB2EB\uAE30 + \uC120\uD0DD \uD574\uC81C.\r\n  // (contenteditable \uC140\uC740 \uBE44\uD3EC\uCEE4\uC2A4 \uC601\uC5ED \uD074\uB9AD \uC2DC \uD3EC\uCEE4\uC2A4\uB97C \uC720\uC9C0\uD574 focusin \uAE30\uBC18 \uC228\uAE40\uC774 \uB3D9\uC791\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uD544\uC694)\r\n  function onDocMousedown(e) {\r\n    if (!toolbarVisible()) return;\r\n    const t = e.target;\r\n    if (t && t.closest && t.closest(\".lumir-table-toolbar\")) return; // \uD234\uBC14 \uC870\uC791\uC740 \uC720\uC9C0\r\n    const host = activeTable && activeTable.closest ? activeTable.closest(\".content\") : null;\r\n    if (host && t && host.contains(t)) return; // \uD65C\uC131 \uD45C(\uC140\u00B7\uB9AC\uC0AC\uC774\uC988 \uD578\uB4E4 \uD3EC\uD568) \uB0B4\uBD80 \uD074\uB9AD\uC740 \uC720\uC9C0\r\n    const prev = activeTable;\r\n    hideToolbar();\r\n    if (prev) clearSel(prev);\r\n    activeTable = null;\r\n    activeCell = null;\r\n  }\r\n\r\n  // \uCC3D \uD06C\uAE30 \uBCC0\uACBD \uC2DC \uD45C\uAC00 \uB9AC\uD50C\uB85C\uC6B0\uB418\uBA74 body-absolute \uD234\uBC14\uC640 \uD53D\uC140 \uC88C\uD45C \uD578\uB4E4\uC774 stale\uD574\uC9C0\uBBC0\uB85C \uC7AC\uBC30\uCE58.\r\n  /** \uD65C\uC131 \uD45C\uC758 \uC624\uBC84\uB808\uC774(\uD589/\uC5F4 \uCD94\uAC00 \uBC14\u00B7\uB9AC\uC0AC\uC774\uC988 \uD578\uB4E4\u00B7\uD234\uBC14)\uB97C \uD604\uC7AC \uD45C \uD06C\uAE30\uC5D0 \uB9DE\uCDB0 \uC7AC\uBC30\uCE58. */\r\n  function refreshActiveTableOverlays() {\r\n    if (!toolbarVisible() || !activeTable || !editorEl.contains(activeTable)) return;\r\n    addResizeHandles(activeTable);\r\n    showToolbar(activeTable);\r\n  }\r\n  function onWinResize() { refreshActiveTableOverlays(); }\r\n\r\n  // \uC140 \uB0B4\uC6A9 \uD3B8\uC9D1(\uD0C0\uC774\uD551 \uB4F1)\uC73C\uB85C \uD45C \uB192\uC774/\uB108\uBE44\uAC00 \uBC14\uB00C\uBA74 \uC624\uBC84\uB808\uC774\uAC00 \uC5B4\uAE0B\uB09C\uB2E4(\uC7AC\uD3EC\uCEE4\uC2A4 \uC804\uAE4C\uC9C0 stale).\r\n  // input\uC744 rAF\uB85C \uB514\uBC14\uC6B4\uC2A4\uD574 \uD65C\uC131 \uD45C\uC758 \uC624\uBC84\uB808\uC774\uB97C \uC7AC\uBC30\uCE58\uD55C\uB2E4. \uD504\uB85C\uADF8\uB7A8\uC801 \uD3B8\uC9D1(\uCCB4\uD06C\uBC15\uC2A4 \uC0BD\uC785\u00B7Enter)\uC740\r\n  // input\uC744 \uBC1C\uD654\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uAC01 \uC9C0\uC810\uC5D0\uC11C refreshActiveTableOverlays()\uB97C \uC9C1\uC811 \uD638\uCD9C\uD55C\uB2E4.\r\n  let overlayRaf = 0;\r\n  function onCellInput(e) {\r\n    const t = e.target;\r\n    const td = t && t.closest && t.closest(\"td.lumir-cell\");\r\n    if (!td || !activeTable || td.closest(\".lumir-tbl\") !== activeTable) return;\r\n    if (overlayRaf) return;\r\n    const raf = typeof requestAnimationFrame === \"function\" ? requestAnimationFrame : (cb) => setTimeout(cb, 0);\r\n    overlayRaf = raf(() => { overlayRaf = 0; refreshActiveTableOverlays(); });\r\n  }\r\n\r\n  // ---------- \uD074\uB9BD\uBCF4\uB4DC: \uC140 \uBC94\uC704 \uBCF5\uC0AC/\uC798\uB77C\uB0B4\uAE30 + \uC140 \uC548 \uADF8\uB9AC\uB4DC \uBD99\uC5EC\uB123\uAE30 (\uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8\uC2DD) ----------\r\n  // \uD074\uB9BD 3\uC885 \uAE30\uB85D(\uBB34\uC190\uC2E4 lumir-JSON + html <table> + TSV). selBBox\uB294 \uBCD1\uD569 \uC778\uC9C0(getTargets\u2192expandRect).\r\n  function writeCellClip(e, table) {\r\n    syncModelFromTableDom(table);\r\n    const rect = expandRect(table.__model, selBBox(table));\r\n    const clip = extractGridClip(table.__model, rect);\r\n    if (e.clipboardData && e.clipboardData.setData) {\r\n      try {\r\n        e.clipboardData.setData(LUMIR_TABLE_MIME, JSON.stringify(clip));\r\n        e.clipboardData.setData(\"text/html\", gridClipToHtml(clip));\r\n        e.clipboardData.setData(\"text/plain\", gridClipToTSV(clip));\r\n      } catch (_) {}\r\n    }\r\n    e.preventDefault();\r\n    return clip;\r\n  }\r\n  function onCopy(e) {\r\n    // \uC140 '\uBC94\uC704' \uC120\uD0DD\uC77C \uB54C\uB9CC \uAC00\uB85C\uCC54 \u2014 \uC140 \uC548 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC\uB294 \uB124\uC774\uD2F0\uBE0C \uC720\uC9C0.\r\n    if (!activeTable || !editorEl.contains(activeTable) || !selectedCells.length) return;\r\n    writeCellClip(e, activeTable);\r\n  }\r\n  function clearSelectedCellContent(table) {\r\n    [...new Set(selectedCells)].forEach((m) => { m.content = []; }); // \uAD6C\uC870 \uC720\uC9C0, \uB0B4\uC6A9\uB9CC \uBE44\uC6C0\r\n    rerenderTable(table);\r\n    clearSel(table);\r\n    addResizeHandles(table);\r\n    onChange();\r\n  }\r\n  function onCut(e) {\r\n    if (!activeTable || !editorEl.contains(activeTable) || !selectedCells.length) return;\r\n    const table = activeTable;\r\n    writeCellClip(e, table);\r\n    clearSelectedCellContent(table);\r\n  }\r\n  // \uD0A4\uBCF4\uB4DC(Ctrl/Cmd+C\u00B7X) \uC9C4\uC785\uC810 \u2014 \uC140\uC774 \uAC01\uAC01 \uB3C5\uB9BD contenteditable\uC774\uB77C \uB4DC\uB798\uADF8 \uC120\uD0DD\uC740 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC744 \uB9CC\uB4E4\uC9C0\r\n  // \uBABB\uD558\uACE0, \uC2E4\uC81C Chrome\uC740 \uADF8 \uC0C1\uD0DC\uC5D0\uC11C copy \uC774\uBCA4\uD2B8\uB97C \uBC1C\uD654\uD558\uC9C0 \uC54A\uB294\uB2E4(\uD074\uB9BD\uBCF4\uB4DC \uBBF8\uAC31\uC2E0). \uADF8\uB798\uC11C copy \uC774\uBCA4\uD2B8\uC5D0\r\n  // \uC758\uC874\uD558\uC9C0 \uC54A\uB294 \uBE44\uB3D9\uAE30 Clipboard API\uB85C \uC9C1\uC811 \uAE30\uB85D\uD55C\uB2E4. \uBB34\uC190\uC2E4 \uD074\uB9BD\uC740 gridClipToHtml\uC774 html\uC5D0 \uC784\uBCA0\uB4DC\uD558\uBBC0\uB85C\r\n  // text/html + text/plain \uB9CC\uC73C\uB85C\uB3C4 \uC644\uC804 \uBCF5\uC6D0\uB41C\uB2E4(\uCEE4\uC2A4\uD140 MIME \uBD88\uC694). \uAD6C\uD615/\uCC28\uB2E8 \uC2DC execCommand \uD3F4\uBC31.\r\n  function copySelectedCells(table, cut) {\r\n    if (!selectedCells.length) return;\r\n    syncModelFromTableDom(table);\r\n    const clip = extractGridClip(table.__model, expandRect(table.__model, selBBox(table)));\r\n    const html = gridClipToHtml(clip);\r\n    const tsv = gridClipToTSV(clip);\r\n    let wrote = false;\r\n    try {\r\n      if (navigator.clipboard && typeof navigator.clipboard.write === \"function\" && typeof window.ClipboardItem === \"function\") {\r\n        const item = new window.ClipboardItem({\r\n          \"text/html\": new Blob([html], { type: \"text/html\" }),\r\n          \"text/plain\": new Blob([tsv], { type: \"text/plain\" }),\r\n        });\r\n        navigator.clipboard.write([item]).catch(() => {});\r\n        wrote = true;\r\n      }\r\n    } catch (_) {}\r\n    if (!wrote) {\r\n      // \uD3F4\uBC31: \uC575\uCEE4 \uC140\uC744 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD \uD6C4 execCommand('copy') \u2192 onCopy\uAC00 3\uC885 MIME \uAE30\uB85D.\r\n      try {\r\n        const anchorEl = cellEl(table, [...new Set(selectedCells)][0]);\r\n        if (anchorEl && typeof document.execCommand === \"function\") {\r\n          const sel = window.getSelection();\r\n          const range = document.createRange();\r\n          range.selectNode(anchorEl);\r\n          sel.removeAllRanges();\r\n          sel.addRange(range);\r\n          document.execCommand(\"copy\");\r\n          sel.removeAllRanges();\r\n        }\r\n      } catch (_) {}\r\n    }\r\n    if (cut) clearSelectedCellContent(table);\r\n  }\r\n  function onPaste(e) {\r\n    const td = e.target && e.target.closest && e.target.closest(\"td.lumir-cell\");\r\n    if (!td) return; // \uC140 \uBC16 \u2192 editor.js \uBD99\uC5EC\uB123\uAE30(\uC0C8 \uD45C \uBE14\uB85D \uB4F1)\uAC00 \uB2F4\uB2F9\r\n    const table = td.closest(\".lumir-tbl\");\r\n    if (!table || !table.__model || !editorEl.contains(table)) return;\r\n    const cd = e.clipboardData;\r\n    if (!cd || !cd.getData) return;\r\n    const clip = parseClipToGrid({ lumir: cd.getData(LUMIR_TABLE_MIME), html: cd.getData(\"text/html\"), text: cd.getData(\"text/plain\") });\r\n    if (!clip) return; // \uADF8\uB9AC\uB4DC\uAC00 \uC544\uB2C8\uBA74 \uB124\uC774\uD2F0\uBE0C \uD1B5\uACFC(\uC140 \uC548 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBD99\uC5EC\uB123\uAE30, \uD604\uD589 \uC720\uC9C0)\r\n    e.preventDefault();\r\n    syncModelFromTableDom(table);\r\n    const anchor = { r: td.__master.r, c: td.__master.c };\r\n    // \uC5F4 \uC790\uB3D9\uD655\uC7A5\uC744 \uC5D0\uB514\uD130 \uAC00\uC6A9\uD3ED \uC608\uC0B0\uC73C\uB85C \uC81C\uD55C \u2014 \uCD08\uACFC \uC5F4\uC740 \uC798\uB824 \uD45C\uAC00 \uD3B8\uC9D1\uC601\uC5ED\uC744 \uBC97\uC5B4\uB098\uC9C0 \uC54A\uB294\uB2E4(canAddColumn\uACFC \uB3D9\uC77C \uAE30\uC900).\r\n    const maxW = maxTableWidth(table);\r\n    const maxCols = maxW ? Math.max(1, Math.floor(maxW / HARD_MIN_COL)) : 0;\r\n    pasteGridIntoModel(table.__model, anchor, clip, { maxCols });\r\n    rerenderTable(table);\r\n    if (clampTableWidth(table)) rerenderTable(table); // \uC790\uB3D9\uD655\uC7A5\uBD84\uC744 \uD3ED\uC608\uC0B0\uC73C\uB85C \uC7AC\uC870\uC815(no-scroll \uC720\uC9C0)\r\n    clearSel(table);\r\n    const at = table.__model.G[anchor.r] && table.__model.G[anchor.r][anchor.c];\r\n    if (at) focusCell(table, at);\r\n    addResizeHandles(table);\r\n    onChange();\r\n    if (toolbarVisible() && activeTable === table) { showToolbar(table); updateToolbarStates(); }\r\n  }\r\n\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n  document.addEventListener(\"mousemove\", onMousemove);\r\n  document.addEventListener(\"mouseup\", onMouseup);\r\n  document.addEventListener(\"mousedown\", onDocMousedown);\r\n  editorEl.addEventListener(\"focusin\", onFocusin);\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  editorEl.addEventListener(\"copy\", onCopy);\r\n  editorEl.addEventListener(\"cut\", onCut);\r\n  editorEl.addEventListener(\"paste\", onPaste);\r\n  window.addEventListener(\"resize\", onWinResize);\r\n  editorEl.addEventListener(\"input\", onCellInput);\r\n\r\n  return {\r\n    toolbarEl: bar,\r\n    addResizeHandles,\r\n    reorderRow,\r\n    reorderCol,\r\n    destroy() {\r\n      editorEl.removeEventListener(\"mousedown\", onMousedown);\r\n      document.removeEventListener(\"mousemove\", onMousemove);\r\n      document.removeEventListener(\"mouseup\", onMouseup);\r\n      document.removeEventListener(\"mousedown\", onDocMousedown);\r\n      editorEl.removeEventListener(\"focusin\", onFocusin);\r\n      editorEl.removeEventListener(\"keydown\", onKeydown);\r\n      editorEl.removeEventListener(\"copy\", onCopy);\r\n      editorEl.removeEventListener(\"cut\", onCut);\r\n      editorEl.removeEventListener(\"paste\", onPaste);\r\n      window.removeEventListener(\"resize\", onWinResize);\r\n      editorEl.removeEventListener(\"input\", onCellInput);\r\n      if (bar.parentNode) bar.parentNode.removeChild(bar);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * S3 \uC5C5\uB85C\uB354 (P5-\u2460) \u2014 kingdoo-editor\uC758 s3-uploader.ts \uC774\uC2DD(\uC21C\uC218 JS, \uB514\uBC84\uADF8 \uBE44\uCF58 \uC81C\uAC70 R7).\r\n * Presigned URL GET \u2192 S3 PUT. SSRF \uBC29\uC9C0 URL \uAC80\uC99D, \uD30C\uC77C\uBA85 \uBCC0\uD658/UUID/\uD655\uC7A5\uC790, \uC9C4\uD589\uB960 \uBCF4\uAC04, \uD0C0\uC784\uC544\uC6C3, \uC7AC\uC2DC\uB3C4.\r\n *\r\n * @typedef {Object} S3UploaderConfig\r\n *  apiEndpoint, env('production'|'development'), path,\r\n *  fileNameTransform?(nameWithoutExt,file)\u2192string, appendUUID?, preserveExtension?(\uAE30\uBCF8 true),\r\n *  onProgress?(percent 0\u2013100), uploadTimeoutMs?(\uAE30\uBCF8 120000), maxRetries?(\uAE30\uBCF8 2)\r\n */\r\n\r\n/** S3 URL \uAC80\uC99D \u2014 HTTPS \uAC15\uC81C + \uC0AC\uC124/\uBA54\uD0C0\uB370\uC774\uD130 IP \uCC28\uB2E8(SSRF \uBC29\uC9C0) */\r\nfunction validateS3Url(url, fieldName) {\r\n  if (typeof url !== 'string' || !url || url.trim() === '') {\r\n    throw new Error(`${fieldName} is required and must be a non-empty string`);\r\n  }\r\n  if (!url.startsWith('https://')) {\r\n    throw new Error(`${fieldName} must use HTTPS protocol`);\r\n  }\r\n  try {\r\n    const urlObj = new URL(url);\r\n    const hostname = urlObj.hostname.toLowerCase();\r\n    if (\r\n      hostname === 'localhost' ||\r\n      hostname.startsWith('127.') ||\r\n      hostname.startsWith('192.168.') ||\r\n      hostname.startsWith('10.') ||\r\n      hostname === '169.254.169.254'\r\n    ) {\r\n      throw new Error(`${fieldName} cannot point to internal/private networks`);\r\n    }\r\n  } catch (error) {\r\n    if (error instanceof Error && error.message.includes('cannot point to'))\r\n      throw error;\r\n    throw new Error(`${fieldName} is not a valid URL format`);\r\n  }\r\n  return url;\r\n}\r\n\r\nexport function generateUUID() {\r\n  if (typeof crypto !== 'undefined' && crypto.randomUUID)\r\n    return crypto.randomUUID();\r\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n    const r = (Math.random() * 16) | 0;\r\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n    return v.toString(16);\r\n  });\r\n}\r\n\r\nexport function createS3Uploader(config) {\r\n  const {\r\n    apiEndpoint,\r\n    env,\r\n    path,\r\n    fileNameTransform,\r\n    appendUUID,\r\n    preserveExtension = true,\r\n    onProgress,\r\n    uploadTimeoutMs = 120000,\r\n    maxRetries = 2,\r\n  } = config || {};\r\n\r\n  if (!apiEndpoint || apiEndpoint.trim() === '')\r\n    throw new Error('apiEndpoint is required for S3 upload.');\r\n  if (!env)\r\n    throw new Error(\"env is required. Must be 'development' or 'production'.\");\r\n  if (!path || path.trim() === '')\r\n    throw new Error('path is required and cannot be empty.');\r\n\r\n  const generateHierarchicalFileName = (file) => {\r\n    const originalName = file.name;\r\n    const lastDotIndex = originalName.lastIndexOf('.');\r\n    const nameWithoutExt =\r\n      lastDotIndex === -1\r\n        ? originalName\r\n        : originalName.substring(0, lastDotIndex);\r\n    const extension =\r\n      lastDotIndex === -1 ? '' : originalName.substring(lastDotIndex);\r\n\r\n    let filename = nameWithoutExt;\r\n    if (fileNameTransform) filename = fileNameTransform(filename, file);\r\n    if (appendUUID) filename = `${filename}_${generateUUID()}`;\r\n    if (preserveExtension) filename = `${filename}${extension}`;\r\n    return `${env}/${path}/${filename}`;\r\n  };\r\n\r\n  return async (file) => {\r\n    const fileName = generateHierarchicalFileName(file);\r\n    const contentType = file.type || 'application/octet-stream';\r\n    const presignedUrlFull = `${apiEndpoint}?key=${encodeURIComponent(fileName)}&contentType=${encodeURIComponent(contentType)}`;\r\n\r\n    const response = await fetch(presignedUrlFull);\r\n    if (!response.ok) {\r\n      const errorText = (await response.text().catch(() => '')) || '';\r\n      throw new Error(\r\n        `Failed to get presigned URL: ${response.statusText}, ${errorText}`,\r\n      );\r\n    }\r\n    const { presignedUrl, publicUrl } = await response.json();\r\n    const validatedPresignedUrl = validateS3Url(presignedUrl, 'presignedUrl');\r\n    const validatedPublicUrl = validateS3Url(publicUrl, 'publicUrl');\r\n\r\n    let lastError;\r\n    const attempts = maxRetries + 1;\r\n    for (let attempt = 0; attempt < attempts; attempt++) {\r\n      try {\r\n        if (onProgress && typeof XMLHttpRequest !== 'undefined') {\r\n          await putWithProgress(\r\n            validatedPresignedUrl,\r\n            file,\r\n            uploadTimeoutMs,\r\n            onProgress,\r\n          );\r\n        } else {\r\n          const controller = new AbortController();\r\n          const timeoutId = setTimeout(\r\n            () => controller.abort(),\r\n            uploadTimeoutMs,\r\n          );\r\n          const uploadResponse = await fetch(validatedPresignedUrl, {\r\n            method: 'PUT',\r\n            headers: {\r\n              'Content-Type': file.type || 'application/octet-stream',\r\n            },\r\n            body: file,\r\n            signal: controller.signal,\r\n          });\r\n          clearTimeout(timeoutId);\r\n          if (!uploadResponse.ok)\r\n            throw new Error(\r\n              `Failed to upload file: ${uploadResponse.statusText}`,\r\n            );\r\n        }\r\n        return validatedPublicUrl;\r\n      } catch (err) {\r\n        lastError = err instanceof Error ? err : new Error(String(err));\r\n        if (attempt >= attempts - 1) throw lastError;\r\n      }\r\n    }\r\n    throw lastError || new Error('Upload failed');\r\n  };\r\n}\r\n\r\n/** XHR PUT + \uC9C4\uD589\uB960 \uBCF4\uAC04(progress \uC774\uBCA4\uD2B8\uAC00 \uB4DC\uBB3C \uB54C \uC911\uAC04 % \uD45C\uC2DC) */\r\nfunction putWithProgress(url, file, timeoutMs, onProgress) {\r\n  return new Promise((resolve, reject) => {\r\n    const xhr = new XMLHttpRequest();\r\n    xhr.timeout = timeoutMs;\r\n    let lastReported = -1;\r\n    const REPORT_INTERVAL_MS = 100;\r\n    const simulatedCap = 90;\r\n    let simulatedPercent = 0;\r\n\r\n    const simId = setInterval(() => {\r\n      if (simulatedPercent >= simulatedCap) return;\r\n      simulatedPercent = Math.min(simulatedCap, simulatedPercent + 3);\r\n      const p = Math.min(100, simulatedPercent);\r\n      if (p > lastReported) {\r\n        lastReported = p;\r\n        onProgress(p);\r\n      }\r\n    }, REPORT_INTERVAL_MS);\r\n    const clearSim = () => clearInterval(simId);\r\n\r\n    xhr.upload.onprogress = (e) => {\r\n      if (e.lengthComputable) {\r\n        const p = Math.min(100, Math.round((e.loaded / e.total) * 100));\r\n        if (p >= simulatedCap) clearSim();\r\n        const toReport = Math.max(p, simulatedPercent);\r\n        if (toReport > lastReported) {\r\n          lastReported = toReport;\r\n          onProgress(toReport);\r\n        }\r\n      }\r\n    };\r\n    xhr.onload = () => {\r\n      clearSim();\r\n      if (xhr.status >= 200 && xhr.status < 300) {\r\n        if (lastReported < 100) onProgress(100);\r\n        resolve();\r\n      } else reject(new Error(`Failed to upload file: ${xhr.statusText}`));\r\n    };\r\n    xhr.onerror = () => {\r\n      clearSim();\r\n      reject(new Error('Upload failed'));\r\n    };\r\n    xhr.ontimeout = () => {\r\n      clearSim();\r\n      reject(new Error('Upload timeout'));\r\n    };\r\n    xhr.open('PUT', url);\r\n    xhr.setRequestHeader(\r\n      'Content-Type',\r\n      file.type || 'application/octet-stream',\r\n    );\r\n    onProgress(0);\r\n    lastReported = 0;\r\n    xhr.send(file);\r\n  });\r\n}\r\n", "/**\r\n * \uD30C\uC77C \uAC80\uC99D (P5-\u2460) \u2014 kingdoo-editor\uC758 limits.ts + LumirEditor.tsx \uC778\uB77C\uC778 \uAC80\uC99D \uC774\uC2DD.\r\n * SVG \uCC28\uB2E8(XSS), MIME+\uD655\uC7A5\uC790 \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8, \uC6A9\uB7C9 \uD55C\uB3C4.\r\n */\r\n\r\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024; // \uC774\uBBF8\uC9C0 10MB\r\nexport const MAX_VIDEO_FILE_SIZE = 100 * 1024 * 1024; // \uBE44\uB514\uC624 100MB\r\nexport const MAX_AUDIO_FILE_SIZE = 50 * 1024 * 1024; // \uC624\uB514\uC624 50MB\r\nexport const MAX_GENERIC_FILE_SIZE = 100 * 1024 * 1024; // \uC77C\uBC18 \uD30C\uC77C 100MB\r\nexport const UPLOAD_TIMEOUT = 30000;\r\nexport const UPLOAD_TIMEOUT_VIDEO = 120000;\r\n\r\nexport const ALLOWED_IMAGE_MIME_TYPES = new Set([\r\n  'image/jpeg',\r\n  'image/png',\r\n  'image/gif',\r\n  'image/webp',\r\n  'image/bmp',\r\n]);\r\nexport const BLOCKED_EXTENSIONS = ['.svg', '.svgz'];\r\nexport const ALLOWED_IMAGE_EXTENSIONS = [\r\n  '.png',\r\n  '.jpg',\r\n  '.jpeg',\r\n  '.gif',\r\n  '.webp',\r\n  '.bmp',\r\n];\r\nexport const ALLOWED_VIDEO_MIME_TYPES = new Set([\r\n  'video/mp4',\r\n  'video/webm',\r\n  'video/ogg',\r\n  'video/quicktime',\r\n]);\r\nexport const ALLOWED_VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogg', '.mov'];\r\nexport const ALLOWED_AUDIO_MIME_TYPES = new Set([\r\n  'audio/mpeg',\r\n  'audio/wav',\r\n  'audio/x-wav',\r\n  'audio/ogg',\r\n  'audio/mp4',\r\n  'audio/aac',\r\n  'audio/webm',\r\n]);\r\nexport const ALLOWED_AUDIO_EXTENSIONS = [\r\n  '.mp3',\r\n  '.wav',\r\n  '.ogg',\r\n  '.m4a',\r\n  '.aac',\r\n];\r\n\r\nfunction ext(name) {\r\n  const i = (name || '').lastIndexOf('.');\r\n  return i === -1 ? '' : name.substring(i).toLowerCase();\r\n}\r\n\r\n/** \uC774\uBBF8\uC9C0 \uD30C\uC77C \uC5EC\uBD80 (SVG \uCC28\uB2E8, \uC6A9\uB7C9 \uD55C\uB3C4) */\r\nexport function isImageFile(file, maxSize = MAX_FILE_SIZE) {\r\n  if (!file || file.size === 0 || file.size > maxSize) return false;\r\n  const e = ext(file.name);\r\n  if (BLOCKED_EXTENSIONS.includes(e)) return false; // .svg/.svgz \uCC28\uB2E8\r\n  if (file.type === 'image/svg+xml') return false;\r\n  if (ALLOWED_IMAGE_MIME_TYPES.has(file.type)) return true;\r\n  return ALLOWED_IMAGE_EXTENSIONS.includes(e);\r\n}\r\n\r\n/** \uB3D9\uC601\uC0C1 \uD30C\uC77C \uC5EC\uBD80 (\uC6A9\uB7C9 \uD55C\uB3C4) */\r\nexport function isVideoFile(file, maxSize = MAX_VIDEO_FILE_SIZE) {\r\n  if (!file || file.size === 0 || file.size > maxSize) return false;\r\n  if (ALLOWED_VIDEO_MIME_TYPES.has(file.type)) return true;\r\n  if (file.type && file.type.startsWith('video/')) return true;\r\n  return ALLOWED_VIDEO_EXTENSIONS.includes(ext(file.name));\r\n}\r\n\r\n/** \uC624\uB514\uC624 \uD30C\uC77C \uC5EC\uBD80 (\uC6A9\uB7C9 \uD55C\uB3C4) */\r\nexport function isAudioFile(file, maxSize = MAX_AUDIO_FILE_SIZE) {\r\n  if (!file || file.size === 0 || file.size > maxSize) return false;\r\n  if (ALLOWED_AUDIO_MIME_TYPES.has(file.type)) return true;\r\n  if (file.type && file.type.startsWith('audio/')) return true;\r\n  return ALLOWED_AUDIO_EXTENSIONS.includes(ext(file.name));\r\n}\r\n\r\n/** \uC77C\uBC18 \uD30C\uC77C \uD5C8\uC6A9 \uC5EC\uBD80 (SVG\uB9CC \uCC28\uB2E8, \uC6A9\uB7C9 \uD55C\uB3C4) */\r\nexport function isGenericFile(file, maxSize = MAX_GENERIC_FILE_SIZE) {\r\n  if (!file || file.size === 0 || file.size > maxSize) return false;\r\n  if (BLOCKED_EXTENSIONS.includes(ext(file.name))) return false;\r\n  return true;\r\n}\r\n\r\n/** HTML \uD30C\uC77C \uC5EC\uBD80 */\r\nexport function isHtmlFile(file) {\r\n  if (!file || file.size === 0) return false;\r\n  if (file.type === 'text/html') return true;\r\n  const e = ext(file.name);\r\n  return e === '.html' || e === '.htm';\r\n}\r\n\r\n/** HTML \uD14D\uC2A4\uD2B8 \uC774\uC2A4\uCF00\uC774\uD504(URL/\uC0AC\uC6A9\uC790 \uC785\uB825 \u2192 \uC548\uC804 \uC0BD\uC785) */\r\nexport function escapeHtml(s) {\r\n  return String(s)\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;');\r\n}\r\n", "/**\r\n * \uC0C1\uB2E8 FloatingMenu (P7-\u2461) \u2014 \uC5D0\uB514\uD130 \uC704\uC5D0 \uACE0\uC815\uB418\uB294 \uB3C4\uAD6C \uBAA8\uC74C.\r\n * undo/redo \u00B7 \uBE14\uB85D \uD0C0\uC785 \u00B7 B/I/U/S/code \u00B7 \uAE00\uC790\uC0C9/\uBC30\uACBD\uC0C9 \u00B7 \uC774\uBBF8\uC9C0/\uD45C \uC0BD\uC785.\r\n * \uAE30\uC874 \uC5D4\uC9C4(applyInlineMark/readActiveMarks, setBlockType) \uC7AC\uC0AC\uC6A9.\r\n * \uC120\uD0DD \uBCF4\uC874: \uBC84\uD2BC mousedown preventDefault \u2192 \uC5D0\uB514\uD130 blur \uBC29\uC9C0. \uB9C8\uC9C0\uB9C9 \uD3EC\uCEE4\uC2A4 .content\uB97C \uB300\uC0C1\uC73C\uB85C \uC801\uC6A9.\r\n */\r\n\r\nimport { applyInlineMark, readActiveMarks } from \"../inline-format.js\";\r\nimport { setBlockType } from \"../editing.js\";\r\nimport { BLOCK_TYPE_DEFS } from \"../shared/block-types.js\";\r\nimport { TEXT_PALETTE, BG_PALETTE } from \"../shared/palettes.js\";\r\nimport { ICON } from \"./icons.js\";\r\n\r\nconst MARKS = [\r\n  { mark: \"bold\", icon: ICON.bold, tkey: \"bold\", fb: \"\uAD75\uAC8C\" },\r\n  { mark: \"italic\", icon: ICON.italic, tkey: \"italic\", fb: \"\uAE30\uC6B8\uC784\" },\r\n  { mark: \"underline\", icon: ICON.underline, tkey: \"underline\", fb: \"\uBC11\uC904\" },\r\n  { mark: \"strike\", icon: ICON.strikethrough, tkey: \"strike\", fb: \"\uCDE8\uC18C\uC120\" },\r\n  { mark: \"code\", icon: ICON.code, tkey: \"code\", fb: \"\uCF54\uB4DC\" },\r\n];\r\n\r\nexport function attachFloatingMenu(editorEl, opts) {\r\n  opts = opts || {};\r\n  const undo = typeof opts.undo === \"function\" ? opts.undo : () => {};\r\n  const redo = typeof opts.redo === \"function\" ? opts.redo : () => {};\r\n  const canUndo = typeof opts.canUndo === \"function\" ? opts.canUndo : () => true;\r\n  const canRedo = typeof opts.canRedo === \"function\" ? opts.canRedo : () => true;\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  const insertImage = typeof opts.insertImage === \"function\" ? opts.insertImage : null;\r\n  const insertTable = typeof opts.insertTable === \"function\" ? opts.insertTable : null;\r\n  const insertLink = typeof opts.insertLink === \"function\" ? opts.insertLink : null;\r\n  const cross = opts.cross || null; // \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD \uC11C\uC2DD \uD30C\uC0AC\uB4DC\r\n  const isCross = () => !!(cross && cross.isActive());\r\n  const BT = (opts.locale && opts.locale.blockTypes) || {};\r\n  const TB = (opts.locale && opts.locale.toolbar) || {};\r\n  const headingLevels = Array.isArray(opts.headingLevels) && opts.headingLevels.length ? opts.headingLevels : [1, 2, 3, 4, 5, 6];\r\n  const blockTypeDefs = BLOCK_TYPE_DEFS.filter(([v]) => { const m = v.match(/^heading:(\\d)/); return !m || headingLevels.includes(+m[1]); });\r\n\r\n  const bar = document.createElement(\"div\");\r\n  bar.className = \"lumir-floating-menu\";\r\n  bar.setAttribute(\"data-position\", opts.position === \"fixed\" ? \"fixed\" : \"sticky\");\r\n  bar.innerHTML = buildHtml();\r\n  if (editorEl.parentNode) editorEl.parentNode.insertBefore(bar, editorEl);\r\n\r\n  function swatch(value, hex, kind) {\r\n    if (value === \"default\") return `<button type=\"button\" class=\"lfm-swatch lfm-none\" data-color=\"default\" data-kind=\"${kind}\" title=\"\uAE30\uBCF8\"></button>`;\r\n    return `<button type=\"button\" class=\"lfm-swatch\" data-color=\"${value}\" data-kind=\"${kind}\" title=\"${value}\" style=\"background:${hex}\"></button>`;\r\n  }\r\n  function buildHtml() {\r\n    const hist = `<button type=\"button\" class=\"lfm-btn\" data-act=\"undo\" title=\"\uC2E4\uD589\uCDE8\uC18C\">${ICON.undo}</button><button type=\"button\" class=\"lfm-btn\" data-act=\"redo\" title=\"\uB2E4\uC2DC\uC2E4\uD589\">${ICON.redo}</button>`;\r\n    const type = `<select class=\"lfm-type\" title=\"\uBE14\uB85D \uC720\uD615\">` + blockTypeDefs.map(([v, key, fb]) => `<option value=\"${v}\">${BT[key] || fb}</option>`).join(\"\") + `</select>`;\r\n    const marks = MARKS.map((b) => `<button type=\"button\" class=\"lfm-btn\" data-mark=\"${b.mark}\" title=\"${TB[b.tkey] || b.fb}\">${b.icon}</button>`).join(\"\");\r\n    const colors = `<button type=\"button\" class=\"lfm-btn lfm-color-btn\" data-pop=\"text\" title=\"${TB.textColor || \"\uAE00\uC790\uC0C9\"}\">${ICON.textColor}</button><button type=\"button\" class=\"lfm-btn lfm-color-btn\" data-pop=\"bg\" title=\"${TB.bgColor || \"\uBC30\uACBD\uC0C9\"}\">${ICON.bgColor}</button>`;\r\n    const textPop = `<div class=\"lfm-pop\" data-for=\"text\">` + TEXT_PALETTE.map(([v, h]) => swatch(v, h, \"text\")).join(\"\") + `</div>`;\r\n    const bgPop = `<div class=\"lfm-pop\" data-for=\"bg\">` + BG_PALETTE.map(([v, h]) => swatch(v, h, \"bg\")).join(\"\") + `</div>`;\r\n    const insert =\r\n      (insertLink ? `<button type=\"button\" class=\"lfm-btn\" data-act=\"link\" title=\"${TB.link || \"\uB9C1\uD06C\"}\">${ICON.link}</button>` : \"\") +\r\n      (insertImage ? `<button type=\"button\" class=\"lfm-btn\" data-act=\"image\" title=\"\uC774\uBBF8\uC9C0\">${ICON.image}</button>` : \"\") +\r\n      (insertTable ? `<button type=\"button\" class=\"lfm-btn\" data-act=\"table\" title=\"\uD45C\">${ICON.table}</button>` : \"\");\r\n    return (\r\n      `<button type=\"button\" class=\"lfm-btn lfm-toggle\" data-act=\"menutoggle\" title=\"\uBA54\uB274 \uD3BC\uCE58\uAE30/\uC811\uAE30\">${ICON.chevronRight}</button>` +\r\n      `<div class=\"lfm-group\">${hist}</div><span class=\"lfm-sep\"></span>` +\r\n      `<div class=\"lfm-group\">${type}</div><span class=\"lfm-sep\"></span>` +\r\n      `<div class=\"lfm-group\">${marks}</div><span class=\"lfm-sep\"></span>` +\r\n      `<div class=\"lfm-group\" style=\"position:relative\">${colors}${textPop}${bgPop}</div>` +\r\n      (insert ? `<span class=\"lfm-sep\"></span><div class=\"lfm-group\">${insert}</div>` : \"\")\r\n    );\r\n  }\r\n\r\n  let activeEditable = null;\r\n  function closestEditable(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    return el ? el.closest(\".content, td.lumir-cell\") : null;\r\n  }\r\n  function currentBlock() {\r\n    return activeEditable && activeEditable.closest ? activeEditable.closest(\".block\") : null;\r\n  }\r\n  function closePops() { bar.querySelectorAll(\".lfm-pop\").forEach((p) => p.classList.remove(\"open\")); }\r\n  function renderActive() {\r\n    const marks = isCross() ? cross.readMarks() : (activeEditable ? readActiveMarks(activeEditable) : {});\r\n    MARKS.forEach((m) => {\r\n      const el = bar.querySelector(`[data-mark=\"${m.mark}\"]`);\r\n      if (el) el.classList.toggle(\"on\", !!marks[m.mark]);\r\n    });\r\n    const sel = bar.querySelector(\".lfm-type\");\r\n    const b = currentBlock();\r\n    if (sel && b) sel.value = b.dataset.type === \"heading\" ? \"heading:\" + (b.dataset.level || \"1\") + (b.dataset.toggle === \"true\" ? \":toggle\" : \"\") : b.dataset.type;\r\n    const u = bar.querySelector('[data-act=\"undo\"]');\r\n    const r = bar.querySelector('[data-act=\"redo\"]');\r\n    if (u) u.disabled = !canUndo();\r\n    if (r) r.disabled = !canRedo();\r\n  }\r\n  function trackSelection() {\r\n    const s = document.getSelection();\r\n    if (s && s.rangeCount) {\r\n      const e = closestEditable(s.getRangeAt(0).startContainer);\r\n      if (e && editorEl.contains(e)) activeEditable = e;\r\n    }\r\n    renderActive();\r\n  }\r\n\r\n  // \uC120\uD0DD \uC720\uC9C0(\uC785\uB825/\uC140\uB809\uD2B8 \uC81C\uC678)\r\n  bar.addEventListener(\"mousedown\", (e) => { if (e.target.closest(\"input, select\")) return; e.preventDefault(); });\r\n\r\n  bar.addEventListener(\"click\", (e) => {\r\n    const act = e.target.closest(\"[data-act]\");\r\n    if (act) {\r\n      const a = act.dataset.act;\r\n      if (a === \"menutoggle\") { bar.classList.toggle(\"lfm-expanded\"); return; }\r\n      if (a === \"undo\") { undo(); renderActive(); }\r\n      else if (a === \"redo\") { redo(); renderActive(); }\r\n      else if (a === \"image\" && insertImage) insertImage();\r\n      else if (a === \"table\" && insertTable) insertTable();\r\n      else if (a === \"link\" && insertLink) insertLink();\r\n      return;\r\n    }\r\n    const mk = e.target.closest(\"[data-mark]\");\r\n    if (mk) {\r\n      if (isCross()) { cross.applyMark(mk.dataset.mark); renderActive(); }\r\n      else if (activeEditable) { applyInlineMark(activeEditable, mk.dataset.mark); onChange(); renderActive(); }\r\n      return;\r\n    }\r\n    const pop = e.target.closest(\"[data-pop]\");\r\n    if (pop) {\r\n      const p = bar.querySelector(`.lfm-pop[data-for=\"${pop.dataset.pop}\"]`);\r\n      const wasOpen = p.classList.contains(\"open\");\r\n      closePops();\r\n      if (!wasOpen) p.classList.add(\"open\");\r\n      return;\r\n    }\r\n    const sw = e.target.closest(\".lfm-swatch\");\r\n    if (sw) {\r\n      const kind = sw.dataset.kind === \"text\" ? \"textColor\" : \"backgroundColor\";\r\n      if (isCross()) { cross.applyMark(kind, sw.dataset.color); renderActive(); }\r\n      else if (activeEditable) { applyInlineMark(activeEditable, kind, sw.dataset.color); onChange(); renderActive(); }\r\n      closePops();\r\n      return;\r\n    }\r\n  });\r\n\r\n  bar.addEventListener(\"change\", (e) => {\r\n    if (!e.target.classList.contains(\"lfm-type\")) return;\r\n    const b = currentBlock();\r\n    if (!b) return;\r\n    const [type, lvl, flag] = e.target.value.split(\":\");\r\n    const el = setBlockType(b, type, lvl ? parseInt(lvl, 10) : undefined, flag === \"toggle\");\r\n    activeEditable = el.querySelector(\":scope > .content\");\r\n    onChange();\r\n    renderActive();\r\n  });\r\n\r\n  document.addEventListener(\"selectionchange\", trackSelection);\r\n  editorEl.addEventListener(\"keyup\", trackSelection);\r\n  editorEl.addEventListener(\"mouseup\", trackSelection);\r\n  renderActive();\r\n\r\n  // \uBC18\uC751\uD615 3\uB2E8 \uB808\uC774\uC544\uC6C3(P9-\u2465): \uD3ED\uC5D0 \uB530\uB77C compact/tight \uD074\uB798\uC2A4 \uD1A0\uAE00\r\n  let ro = null;\r\n  if (typeof ResizeObserver !== \"undefined\") {\r\n    ro = new ResizeObserver((entries) => {\r\n      const w = entries[0] && entries[0].contentRect ? entries[0].contentRect.width : 9999;\r\n      bar.classList.toggle(\"lfm-compact\", w < 700);   // 2\uD589(wrap)\r\n      const wasMin = bar.classList.contains(\"lfm-minimized\");\r\n      const min = w < 440;\r\n      bar.classList.toggle(\"lfm-minimized\", min);      // \uCD5C\uC18C\uD654(\uC811\uAE30 \uD1A0\uAE00)\r\n      // \uBAA8\uBC14\uC77C \uD3ED \uC9C4\uC785 \uC2DC \uAE30\uBCF8\uC73C\uB85C \uD3BC\uCCD0 \uC804\uCCB4 \uB3C4\uAD6C\uB97C \uB178\uCD9C(\uC811\uAE30 \uD1A0\uAE00\uC740 \uC720\uC9C0 \u2014 \uC0AC\uC6A9\uC790\uAC00 \uC6D0\uD558\uBA74 \uB2E4\uC2DC \uC811\uC744 \uC218 \uC788\uC74C).\r\n      if (min && !wasMin) bar.classList.add(\"lfm-expanded\");\r\n      if (!min) bar.classList.remove(\"lfm-expanded\");\r\n    });\r\n    ro.observe(editorEl);\r\n  }\r\n\r\n  return {\r\n    element: bar,\r\n    refresh: renderActive,\r\n    sync: trackSelection,\r\n    destroy() {\r\n      document.removeEventListener(\"selectionchange\", trackSelection);\r\n      editorEl.removeEventListener(\"keyup\", trackSelection);\r\n      editorEl.removeEventListener(\"mouseup\", trackSelection);\r\n      if (ro) ro.disconnect();\r\n      if (bar.parentNode) bar.parentNode.removeChild(bar);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uC0AC\uC774\uB4DC \uBA54\uB274 / \uB4DC\uB798\uADF8 \uD578\uB4E4 (P7-\u2462) \u2014 \uD638\uBC84\uD55C \uBE14\uB85D \uC88C\uCE21\uC5D0 \uB728\uB294 \uCEE8\uD2B8\uB864.\r\n *  \u283F \uD578\uB4E4(\uADF8\uB9BD): \uD074\uB9AD \uC2DC \uB4DC\uB86D\uB2E4\uC6B4(\uC704/\uC544\uB798 \uCD94\uAC00\u00B7\uC0AD\uC81C\u00B7\uD45C \uC815\uB82C), \uB124\uC774\uD2F0\uBE0C DnD\uB85C \uBE14\uB85D \uC7AC\uC815\uB82C.\r\n *  (\uBE14\uB85D \uCD94\uAC00 \"+\" \uBC84\uD2BC\uC740 \uC2A4\uD399\uC5D0\uC11C \uC81C\uAC70 \u2014 \uCD94\uAC00\uB294 \uADF8\uB9BD \uB4DC\uB86D\uB2E4\uC6B4\uC73C\uB85C\uB9CC.)\r\n * \uCD5C\uC0C1\uC704 .block\uB9CC \uB300\uC0C1. \uC624\uBC84\uB808\uC774\uB294 document.body\uC5D0 \uC808\uB300\uBC30\uCE58(\uC2A4\uD06C\uB864 \uBCF4\uC815).\r\n */\r\n\r\nimport { makeBlockElement, directContent } from \"../serialize/block.js\";\r\n\r\nconst DEFAULT_PROPS = () => ({ textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" });\r\n\r\nfunction focusContent(content) {\r\n  if (!content) return;\r\n  try {\r\n    const r = document.createRange();\r\n    r.selectNodeContents(content);\r\n    r.collapse(true);\r\n    const s = window.getSelection();\r\n    s.removeAllRanges();\r\n    s.addRange(r);\r\n    content.focus && content.focus();\r\n  } catch (_) {}\r\n}\r\n\r\nexport function attachSideMenu(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  const onDuplicate = typeof opts.onDuplicate === \"function\" ? opts.onDuplicate : null;\r\n\r\n  const menu = document.createElement(\"div\");\r\n  menu.className = \"lumir-side-menu\";\r\n  menu.style.position = \"absolute\";\r\n  menu.style.display = \"none\";\r\n  menu.innerHTML = '<button type=\"button\" class=\"lsm-btn lsm-drag\" title=\"\uB04C\uC5B4\uC11C \uC774\uB3D9\" draggable=\"true\">\u283F</button>';\r\n  document.body.appendChild(menu);\r\n\r\n  const indicator = document.createElement(\"div\");\r\n  indicator.className = \"lumir-drop-indicator\";\r\n  indicator.style.position = \"absolute\";\r\n  indicator.style.display = \"none\";\r\n  indicator.style.pointerEvents = \"none\"; // elementFromPoint\uAC00 \uC778\uB514\uCF00\uC774\uD130\uB97C \uC9D1\uC9C0 \uC54A\uB3C4\uB85D\r\n  document.body.appendChild(indicator);\r\n\r\n  const dragMenu = document.createElement(\"div\");\r\n  dragMenu.className = \"lumir-drag-menu\";\r\n  dragMenu.style.position = \"absolute\";\r\n  dragMenu.style.display = \"none\";\r\n  document.body.appendChild(dragMenu);\r\n\r\n  let currentBlock = null;\r\n  let dragSrc = null;\r\n  let dragEdge = null; // { block, side } \u2014 \uAC00\uC7A5\uC790\uB9AC \uB4DC\uB798\uADF8 \u2192 2\uB2E8 \uBCC0\uD658 \uBAA8\uB4DC\r\n  let dropInto = null; // .lumir-column \u2014 \uAE30\uC874 2\uB2E8\uC758 \uD2B9\uC815 \uCEEC\uB7FC \uC548\uC73C\uB85C \uB4DC\uB86D \uBAA8\uB4DC\r\n  const EDGE_PX = 48;\r\n\r\n  function topBlock(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    if (!el) return null;\r\n    // \uCD5C\uB0B4\uACFD .block \uBC18\uD658 \u2192 \uCEEC\uB7FC(2\uB2E8) \uB0B4\uBD80 \uB4F1 \uC911\uCCA9 \uBE14\uB85D\uB3C4 \uADF8\uB9BD \uD45C\uC2DC.\r\n    // (\uCEEC\uB7FC \uD328\uB529/\uAC04\uACA9\uC5D0 \uD638\uBC84\uD558\uBA74 \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 .block = columnList \uAC00 \uC7A1\uD600 \uCEEC\uB7FC\uB9AC\uC2A4\uD2B8 \uADF8\uB9BD\uB3C4 \uB3D9\uC791)\r\n    const b = el.closest(\".block\");\r\n    return b && editorEl.contains(b) ? b : null;\r\n  }\r\n  function showFor(block) {\r\n    if (!block) return;\r\n    currentBlock = block;\r\n    menu.style.display = \"flex\"; // \uD45C\uC2DC \uD6C4 \uCE21\uC815(offsetWidth 0 \uBC29\uC9C0)\r\n    const r = block.getBoundingClientRect();\r\n    const er = editorEl.getBoundingClientRect ? editorEl.getBoundingClientRect() : { left: 0 };\r\n    const mw = menu.offsetWidth || 48;\r\n    let left = window.scrollX + r.left - mw - 6;\r\n    const minLeft = window.scrollX + Math.max(2, er.left); // \uC5D0\uB514\uD130 \uC88C\uCE21 \uACBD\uACC4(\uAC70\uD130) \uBC16\uC73C\uB85C \uB098\uAC00\uC9C0 \uC54A\uC74C\r\n    if (left < minLeft) left = minLeft;\r\n    menu.style.top = window.scrollY + r.top + 4 + \"px\"; // \uADF8\uB9BD \uC704\uCE58(\uBE14\uB85D \uC0C1\uB2E8 \uAE30\uC900 4px \uC544\uB798)\r\n    menu.style.left = left + \"px\";\r\n  }\r\n  function hide() {\r\n    menu.style.display = \"none\";\r\n  }\r\n\r\n  function addAfter(block) {\r\n    if (!block) return null;\r\n    const p = makeBlockElement(\"paragraph\", { props: DEFAULT_PROPS(), innerHTML: \"\" });\r\n    block.after(p);\r\n    focusContent(directContent(p));\r\n    onChange();\r\n    return p;\r\n  }\r\n  /** src \uBE14\uB85D\uC744 target \uBE14\uB85D \uC55E/\uB4A4\uB85C \uC774\uB3D9 */\r\n  function moveBlock(src, target, placeAfter) {\r\n    if (!src || !target || src === target) return false;\r\n    if (placeAfter) target.after(src);\r\n    else target.before(src);\r\n    onChange();\r\n    return true;\r\n  }\r\n\r\n  // --- \uD638\uBC84\uB85C \uBA54\uB274 \uCD94\uC801 ---\r\n  function onMove(e) {\r\n    if (dragSrc) return; // \uB4DC\uB798\uADF8 \uC911\uC5D4 \uC704\uCE58 \uACE0\uC815\r\n    let b = topBlock(e.target);\r\n    if (!b) {\r\n      // \uC88C\uCE21 \uAC70\uD130(.lumir-editor padding-left:24px, \uADF8\uB9BD\uC774 \uB728\uB294 \uC790\uB9AC)\uC5D0 \uD638\uBC84\uD558\uBA74 e.target \uC774 .block \uC774 \uC544\uB2C8\uB77C\r\n      // \uADF8\uB9BD\uC774 \uC548 \uB5B4\uB2E4 \u2192 \uCEE4\uC11C Y \uB85C \uD574\uB2F9 \uD589\uC758 \uCD5C\uC0C1\uC704 \uBE14\uB85D\uC744 \uCC3E\uC544 \uD45C\uC2DC(\uBE14\uB85D \uCF58\uD150\uCE20 \uBC16\uC5D0\uC11C\uB3C4 \uADF8\uB9BD \uB178\uCD9C).\r\n      const hit = topBlockAt(e.clientX, e.clientY);\r\n      b = hit && hit.block;\r\n    }\r\n    if (!b) return;\r\n    // sticky: \uD604\uC7AC \uC548\uCABD \uBE14\uB85D\uC758 \"\uC870\uC0C1 \uCEE8\uD14C\uC774\uB108\"(\uC608: 2\uB2E8 columnList)\uB85C \uC2B9\uACA9\uB418\uC9C0 \uC54A\uAC8C \uC720\uC9C0.\r\n    // \uC548\uCABD \uBE14\uB85D \uADF8\uB9BD\uC740 \uCEEC\uB7FC \uC67C\uCABD \uD328\uB529 \uC704\uC5D0 \uB728\uB294\uB370, \uADF8 \uD328\uB529\uC740 .block\uC774 \uC544\uB2CC .lumir-column\r\n    // \uC18C\uC720\uB77C closest(\".block\")\uAC00 columnList\uB85C \uC7A1\uD798 \u2192 \uADF8\uB9BD\uC744 \uD5A5\uD574 \uCEE4\uC11C\uB97C \uC62E\uAE30\uBA74 columnList\uB85C\r\n    // \uD280\uC5B4 \uD074\uB9AD \uBD88\uAC00. \uC870\uC0C1 \uCEE8\uD14C\uC774\uB108\uB85C\uC758 \uC804\uD658\uC740 \uBB34\uC2DC\uD574 \uC548\uCABD \uADF8\uB9BD\uC744 \uD074\uB9AD \uAC00\uB2A5\uD558\uAC8C \uD55C\uB2E4.\r\n    if (\r\n      menu.style.display !== \"none\" &&\r\n      currentBlock &&\r\n      b !== currentBlock &&\r\n      editorEl.contains(currentBlock) &&\r\n      b.contains(currentBlock)\r\n    ) {\r\n      return;\r\n    }\r\n    showFor(b);\r\n  }\r\n  editorEl.addEventListener(\"mousemove\", onMove);\r\n  function onMouseLeave(e) { if (!menu.contains(e.relatedTarget)) hide(); }\r\n  editorEl.addEventListener(\"mouseleave\", onMouseLeave);\r\n\r\n  menu.addEventListener(\"mousedown\", (e) => { if (!e.target.closest(\".lsm-drag\")) e.preventDefault(); });\r\n\r\n  // --- \uB4DC\uB798\uADF8\uD578\uB4E4 \uB4DC\uB86D\uB2E4\uC6B4 \uBA54\uB274 (T3-\u2464) ---\r\n  function closeDragMenu() { dragMenu.style.display = \"none\"; dragMenu.__block = null; }\r\n  function openDragMenu(block) {\r\n    if (!block) return;\r\n    const isTable = block.dataset.type === \"table\";\r\n    dragMenu.innerHTML =\r\n      '<button type=\"button\" class=\"ldm-item\" data-act=\"addAbove\">\uC704\uC5D0 \uBE14\uB85D \uCD94\uAC00</button>' +\r\n      '<button type=\"button\" class=\"ldm-item\" data-act=\"addBelow\">\uC544\uB798\uC5D0 \uBE14\uB85D \uCD94\uAC00</button>' +\r\n      (onDuplicate ? '<button type=\"button\" class=\"ldm-item\" data-act=\"duplicate\">\uBE14\uB85D \uBCF5\uC81C</button>' : \"\") +\r\n      (isTable ? '<div class=\"ldm-sep\"></div><button type=\"button\" class=\"ldm-item\" data-act=\"tblL\">\uD45C \uC67C\uCABD \uC815\uB82C</button><button type=\"button\" class=\"ldm-item\" data-act=\"tblC\">\uD45C \uAC00\uC6B4\uB370 \uC815\uB82C</button><button type=\"button\" class=\"ldm-item\" data-act=\"tblR\">\uD45C \uC624\uB978\uCABD \uC815\uB82C</button>' : \"\") +\r\n      '<div class=\"ldm-sep\"></div><button type=\"button\" class=\"ldm-item danger\" data-act=\"delete\">\uC0AD\uC81C</button>';\r\n    const r = menu.getBoundingClientRect ? menu.getBoundingClientRect() : { bottom: 0, left: 0 };\r\n    dragMenu.style.top = window.scrollY + (r.bottom || 0) + 4 + \"px\";\r\n    dragMenu.style.left = window.scrollX + (r.left || 0) + \"px\";\r\n    dragMenu.style.display = \"block\";\r\n    dragMenu.__block = block;\r\n  }\r\n  dragMenu.addEventListener(\"mousedown\", (e) => e.preventDefault());\r\n  dragMenu.addEventListener(\"click\", (e) => {\r\n    const it = e.target.closest(\".ldm-item\");\r\n    if (!it) return;\r\n    const block = dragMenu.__block;\r\n    if (!block) { closeDragMenu(); return; }\r\n    const act = it.dataset.act;\r\n    if (act === \"addAbove\") { const p = makeBlockElement(\"paragraph\", { props: DEFAULT_PROPS(), innerHTML: \"\" }); block.before(p); focusContent(directContent(p)); onChange(); }\r\n    else if (act === \"addBelow\") { addAfter(block); }\r\n    else if (act === \"duplicate\") { if (onDuplicate) onDuplicate(block); }\r\n    else if (act === \"delete\") { const host = block.parentElement; block.remove(); if (host && !host.querySelector(\":scope > .block\")) host.appendChild(makeBlockElement(\"paragraph\", { props: DEFAULT_PROPS(), innerHTML: \"\" })); onChange(); }\r\n    else if (act === \"tblL\" || act === \"tblC\" || act === \"tblR\") {\r\n      const v = act === \"tblL\" ? \"left\" : act === \"tblC\" ? \"center\" : \"right\";\r\n      if (!block.__props) block.__props = {};\r\n      if (v !== \"left\") { block.__props.tableAlignment = v; block.dataset.tableAlignment = v; } else { delete block.__props.tableAlignment; block.removeAttribute(\"data-table-alignment\"); }\r\n      onChange();\r\n    }\r\n    closeDragMenu();\r\n  });\r\n  const onDocDown = (e) => { if (!e.target.closest(\".lumir-drag-menu\") && !e.target.closest(\".lsm-drag\")) closeDragMenu(); };\r\n  document.addEventListener(\"mousedown\", onDocDown);\r\n\r\n  // --- \uB4DC\uB798\uADF8 \uC7AC\uC815\uB82C ---\r\n  const handle = menu.querySelector(\".lsm-drag\");\r\n  handle.addEventListener(\"click\", (e) => { e.stopPropagation(); if (dragMenu.style.display === \"block\") closeDragMenu(); else openDragMenu(currentBlock); });\r\n  handle.addEventListener(\"dragstart\", (e) => {\r\n    dragSrc = currentBlock;\r\n    if (e.dataTransfer) {\r\n      e.dataTransfer.effectAllowed = \"move\";\r\n      try { e.dataTransfer.setData(\"application/x-lumir-block\", \"1\"); } catch (_) {}\r\n    }\r\n  });\r\n  handle.addEventListener(\"dragend\", () => {\r\n    dragSrc = null;\r\n    dragEdge = null;\r\n    dropInto = null;\r\n    indicator.style.display = \"none\";\r\n  });\r\n\r\n  /** \uC9C0\uC815 \uCEE8\uD14C\uC774\uB108 \uB0B4 \uBE14\uB85D\uB4E4 \uC911 clientY \uAE30\uC900 \uC0BD\uC785 \uC9C0\uC810 */\r\n  function dropTargetIn(container, clientY) {\r\n    const blocks = [...container.children].filter((b) => b.classList && b.classList.contains(\"block\"));\r\n    for (const b of blocks) {\r\n      const r = b.getBoundingClientRect();\r\n      if (clientY < r.top + r.height / 2) return { block: b, after: false };\r\n    }\r\n    const last = blocks[blocks.length - 1];\r\n    return { block: last || null, after: true };\r\n  }\r\n  function dropTarget(clientY) {\r\n    // \uC7AC\uC815\uB82C \uD6C4\uBCF4\uB294 \uB4DC\uB798\uADF8 \uC911\uC778 \uBE14\uB85D\uACFC \uAC19\uC740 \uCEE8\uD14C\uC774\uB108(\uCD5C\uC0C1\uC704 \uB610\uB294 \uCEEC\uB7FC \uB0B4\uBD80)\uB85C \uD55C\uC815\r\n    const container = dragSrc && dragSrc.parentElement ? dragSrc.parentElement : editorEl;\r\n    const t = dropTargetIn(container, clientY);\r\n    return t.block ? t : null;\r\n  }\r\n  /** \uCEE4\uC11C \uC544\uB798\uC758 \uCEEC\uB7FC(.lumir-column) \u2014 \uAE30\uC874 2\uB2E8\uC758 \uD2B9\uC815 \uCEEC\uB7FC\uC73C\uB85C \uB4DC\uB86D \uD310\uBCC4 */\r\n  function columnUnder(x, y) {\r\n    const el = typeof document.elementFromPoint === \"function\" ? document.elementFromPoint(x, y) : null;\r\n    const col = el && el.closest ? el.closest(\".lumir-column\") : null;\r\n    return col && editorEl.contains(col) ? col : null;\r\n  }\r\n  function showIndicator(t) {\r\n    if (!t || !t.block) { indicator.style.display = \"none\"; return; }\r\n    const r = t.block.getBoundingClientRect();\r\n    indicator.style.display = \"block\";\r\n    indicator.style.height = \"2px\";\r\n    indicator.style.top = window.scrollY + (t.after ? r.bottom : r.top) - 1 + \"px\";\r\n    indicator.style.left = window.scrollX + r.left + \"px\";\r\n    indicator.style.width = r.width + \"px\";\r\n  }\r\n  function showColumnTopIndicator(col) {\r\n    const r = col.getBoundingClientRect();\r\n    indicator.style.display = \"block\";\r\n    indicator.style.height = \"2px\";\r\n    indicator.style.top = window.scrollY + r.top + 4 + \"px\";\r\n    indicator.style.left = window.scrollX + r.left + \"px\";\r\n    indicator.style.width = r.width + \"px\";\r\n  }\r\n  // \u2500\u2500 \uAC00\uC7A5\uC790\uB9AC \uB4DC\uB798\uADF8 \u2192 2\uB2E8 \uBCC0\uD658 (P9-\u2466) \u2500\u2500\r\n  function topBlockAt(x, y) {\r\n    const blocks = [...editorEl.children].filter((b) => b.classList && b.classList.contains(\"block\"));\r\n    for (const b of blocks) { const r = b.getBoundingClientRect(); if (y >= r.top && y <= r.bottom) return { block: b, rect: r }; }\r\n    return null;\r\n  }\r\n  function edgeOf(hit, x) {\r\n    if (!hit) return null;\r\n    if (x <= hit.rect.left + EDGE_PX) return \"left\";\r\n    if (x >= hit.rect.right - EDGE_PX) return \"right\";\r\n    return null;\r\n  }\r\n  function showVIndicator(rect, side) {\r\n    indicator.style.display = \"block\";\r\n    indicator.style.width = \"3px\";\r\n    indicator.style.height = rect.height + \"px\";\r\n    indicator.style.top = window.scrollY + rect.top + \"px\";\r\n    indicator.style.left = window.scrollX + (side === \"left\" ? rect.left : rect.right) - 1 + \"px\";\r\n  }\r\n  function mkColumn() {\r\n    const c = document.createElement(\"div\");\r\n    c.className = \"lumir-column\";\r\n    c.dataset.type = \"column\";\r\n    c.__props = { width: 1 };\r\n    c.style.flexGrow = \"1\";\r\n    c.style.flexBasis = \"0\";\r\n    c.style.flexShrink = \"1\";\r\n    return c;\r\n  }\r\n  /** src\u00B7target \uB450 \uBE14\uB85D\uC744 2\uB2E8 columnList\uB85C \uAC10\uC2FC\uB2E4(side: src\uAC00 \uB193\uC77C \uCABD) */\r\n  function wrapInColumns(src, target, side) {\r\n    if (!src || !target || src === target) return false;\r\n    const cl = document.createElement(\"div\");\r\n    cl.className = \"block\";\r\n    cl.dataset.type = \"columnList\";\r\n    cl.__props = {};\r\n    const content = document.createElement(\"div\");\r\n    content.className = \"content lumir-columns\";\r\n    content.setAttribute(\"contenteditable\", \"false\");\r\n    const colA = mkColumn();\r\n    const colB = mkColumn();\r\n    const handle = document.createElement(\"div\");\r\n    handle.className = \"lumir-col-resize\";\r\n    handle.setAttribute(\"contenteditable\", \"false\");\r\n    target.before(cl); // columnList\uB97C target \uC704\uCE58\uC5D0 \uC0BD\uC785\r\n    const left = side === \"left\" ? src : target;\r\n    const right = side === \"left\" ? target : src;\r\n    colA.appendChild(left);\r\n    colB.appendChild(right);\r\n    content.appendChild(colA);\r\n    content.appendChild(handle);\r\n    content.appendChild(colB);\r\n    cl.appendChild(content);\r\n    onChange();\r\n    return true;\r\n  }\r\n  function onDragOver(e) {\r\n    if (!dragSrc) return;\r\n    e.preventDefault();\r\n    if (e.dataTransfer) e.dataTransfer.dropEffect = \"move\";\r\n    // 1) \uAE30\uC874 2\uB2E8 \uCEEC\uB7FC\uC758 \uD2B9\uC815 \uCEEC\uB7FC \uC704 \u2192 \uADF8 \uCEEC\uB7FC \uC548\uC73C\uB85C \uC0BD\uC785(\uC88C/\uC6B0 \uC6D0\uD558\uB294 \uCEEC\uB7FC).\r\n    const overCol = columnUnder(e.clientX, e.clientY);\r\n    if (overCol && !dragSrc.contains(overCol)) {\r\n      dragEdge = null; dropInto = overCol;\r\n      const t = dropTargetIn(overCol, e.clientY);\r\n      if (t.block) showIndicator(t);\r\n      else showColumnTopIndicator(overCol); // \uBE48 \uCEEC\uB7FC: \uC0C1\uB2E8 \uD45C\uC2DC\r\n      return;\r\n    }\r\n    dropInto = null;\r\n    // 2) \uCD5C\uC0C1\uC704 \uBE14\uB85D \uAC00\uC7A5\uC790\uB9AC \u2192 \uC0C8 2\uB2E8 \uC0DD\uC131(2\uB2E8\uAE4C\uC9C0\uB9CC, columnList \uB300\uC0C1 \uC81C\uC678)\r\n    const hit = topBlockAt(e.clientX, e.clientY);\r\n    const topLevelSrc = dragSrc && dragSrc.parentElement === editorEl;\r\n    const canEdge = hit && hit.block !== dragSrc && topLevelSrc && hit.block.dataset.type !== \"columnList\" && dragSrc.dataset.type !== \"columnList\";\r\n    const side = canEdge ? edgeOf(hit, e.clientX) : null;\r\n    if (side) { dragEdge = { block: hit.block, side }; showVIndicator(hit.rect, side); return; }\r\n    dragEdge = null;\r\n    // 3) \uAC19\uC740 \uCEE8\uD14C\uC774\uB108 \uC7AC\uC815\uB82C\r\n    showIndicator(dropTarget(e.clientY));\r\n  }\r\n  editorEl.addEventListener(\"dragover\", onDragOver);\r\n  function onDrop(e) {\r\n    if (!dragSrc) return;\r\n    e.preventDefault();\r\n    if (dropInto && !dragSrc.contains(dropInto)) {\r\n      const t = dropTargetIn(dropInto, e.clientY);\r\n      if (t.block && t.block !== dragSrc) moveBlock(dragSrc, t.block, t.after);\r\n      else if (!t.block) { dropInto.appendChild(dragSrc); onChange(); }\r\n    } else if (dragEdge) {\r\n      wrapInColumns(dragSrc, dragEdge.block, dragEdge.side);\r\n    } else {\r\n      const t = dropTarget(e.clientY);\r\n      if (t) moveBlock(dragSrc, t.block, t.after);\r\n    }\r\n    dragSrc = null;\r\n    dragEdge = null;\r\n    dropInto = null;\r\n    indicator.style.display = \"none\";\r\n  }\r\n  editorEl.addEventListener(\"drop\", onDrop);\r\n\r\n  return {\r\n    element: menu,\r\n    showFor,\r\n    hide,\r\n    addAfter,\r\n    moveBlock,\r\n    wrapInColumns,\r\n    openDragMenu,\r\n    closeDragMenu, // M1: \uC7AC\uAD6C\uCD95(restore) \uC2DC \uC5F4\uB9B0 \uB4DC\uB86D\uB2E4\uC6B4 \uB2EB\uAE30\uC6A9\r\n    destroy() {\r\n      editorEl.removeEventListener(\"mousemove\", onMove);\r\n      editorEl.removeEventListener(\"mouseleave\", onMouseLeave);\r\n      editorEl.removeEventListener(\"dragover\", onDragOver);\r\n      editorEl.removeEventListener(\"drop\", onDrop);\r\n      document.removeEventListener(\"mousedown\", onDocDown);\r\n      if (menu.parentNode) menu.parentNode.removeChild(menu);\r\n      if (indicator.parentNode) indicator.parentNode.removeChild(indicator);\r\n      if (dragMenu.parentNode) dragMenu.parentNode.removeChild(dragMenu);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uCEEC\uB7FC \uB108\uBE44 \uB9AC\uC0AC\uC774\uC988 (P9-\u2466) \u2014 `.lumir-col-resize` \uD578\uB4E4 \uB4DC\uB798\uADF8\uB85C \uC778\uC811 \uB450 \uCEEC\uB7FC\uC758 width(flex-grow) \uC870\uC815.\r\n * \uD569(totalW)\uC740 \uC720\uC9C0\uD558\uACE0 \uD53D\uC140 \uB378\uD0C0\uB97C \uBE44\uC728\uB85C \uD658\uC0B0. \uB4DC\uB86D \uC2DC dataset.columnWidth \uAC31\uC2E0 + onChange(\uCEE4\uBC0B).\r\n */\r\n\r\nconst MIN_PX = 48;\r\n\r\nexport function attachColumnControls(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  let drag = null;\r\n\r\n  function setW(col, w) {\r\n    col.style.flexGrow = String(w);\r\n    col.style.flexBasis = \"0\";\r\n    col.style.flexShrink = \"1\";\r\n    col.dataset.columnWidth = String(Math.round(w * 1000) / 1000);\r\n  }\r\n  function onDown(e) {\r\n    const h = e.target.closest && e.target.closest(\".lumir-col-resize\");\r\n    if (!h || !editorEl.contains(h)) return;\r\n    const prev = h.previousElementSibling;\r\n    const next = h.nextElementSibling;\r\n    if (!prev || !next || !prev.classList.contains(\"lumir-column\") || !next.classList.contains(\"lumir-column\")) return;\r\n    e.preventDefault();\r\n    const pr = prev.getBoundingClientRect();\r\n    const nr = next.getBoundingClientRect();\r\n    const wPrev = parseFloat(prev.style.flexGrow) || 1;\r\n    const wNext = parseFloat(next.style.flexGrow) || 1;\r\n    drag = { prev, next, startX: e.clientX, prevPx: pr.width, totalPx: pr.width + nr.width, totalW: wPrev + wNext };\r\n    document.addEventListener(\"mousemove\", onMove);\r\n    document.addEventListener(\"mouseup\", onUp);\r\n  }\r\n  function onMove(e) {\r\n    if (!drag) return;\r\n    const dx = e.clientX - drag.startX;\r\n    if (drag.totalPx <= 0) return;\r\n    const newPrevPx = Math.max(MIN_PX, Math.min(drag.totalPx - MIN_PX, drag.prevPx + dx));\r\n    const ratio = newPrevPx / drag.totalPx;\r\n    const newPrevW = drag.totalW * ratio;\r\n    setW(drag.prev, newPrevW);\r\n    setW(drag.next, drag.totalW - newPrevW);\r\n  }\r\n  function onUp() {\r\n    document.removeEventListener(\"mousemove\", onMove);\r\n    document.removeEventListener(\"mouseup\", onUp);\r\n    if (drag) { drag = null; onChange(); }\r\n  }\r\n  editorEl.addEventListener(\"mousedown\", onDown);\r\n\r\n  return {\r\n    destroy() {\r\n      editorEl.removeEventListener(\"mousedown\", onDown);\r\n      document.removeEventListener(\"mousemove\", onMove);\r\n      document.removeEventListener(\"mouseup\", onUp);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uB9C1\uD06C \uD234\uBC14 (Notion\uC2DD) \u2014 \uC778\uB77C\uC778 \uB9C1\uD06C \uC804\uC6A9.\r\n *  - \uB9C1\uD06C hover(\uB610\uB294 \uCE90\uB7FF \uC9C4\uC785) \uC2DC \uD234\uD301: \uD83C\uDF10 URL \u00B7 \uBCF5\uC0AC \u00B7 \uD3B8\uC9D1.\r\n *  - \"\uD3B8\uC9D1\" \u2192 popup: \uD398\uC774\uC9C0/URL \uC785\uB825 \u00B7 \uB9C1\uD06C \uC81C\uBAA9 \uC785\uB825 \u00B7 \uB9C1\uD06C \uC81C\uAC70.\r\n *  - \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC5D0 \uB9C1\uD06C \uCD94\uAC00: promptAdd()(Ctrl+K) \u2192 \uD3B8\uC9D1 popup(\uCD94\uAC00 \uBAA8\uB4DC).\r\n *  - \uB9C1\uD06C \uBCF8\uBB38 \uD074\uB9AD \u2192 \uC0C8 \uD0ED\uC73C\uB85C \uC5F4\uAE30.\r\n * \uAE30\uC874 \uC778\uB77C\uC778 \uB9C1\uD06C\uB294 <a href> DOM. \uD3B8\uC9D1\uC740 DOM \uC9C1\uC811 \uC218\uC815 \uD6C4 onChange()\uB85C \uC7AC\uC9C1\uB82C\uD654/\uCEE4\uBC0B.\r\n */\r\n\r\nimport { applyLink } from \"../inline-format.js\";\r\nimport { neutralizeUrl } from \"../utils/url.js\";\r\n\r\nconst SAFE_URL = /^(https?:|mailto:|tel:|\\/|#)/i;\r\nfunction normalizeHref(raw) {\r\n  const s = String(raw || \"\").trim();\r\n  if (!s) return \"\";\r\n  if (SAFE_URL.test(s)) return s;\r\n  if (/^[\\w.-]+\\.[a-z]{2,}(\\/|$|\\?|#)/i.test(s)) return \"https://\" + s; // \uB3C4\uBA54\uC778\uB9CC \uC785\uB825 \uC2DC\r\n  return \"\"; // javascript: \uB4F1 \uC704\uD5D8 \uD504\uB85C\uD1A0\uCF5C \uCC28\uB2E8\r\n}\r\nfunction esc(s) {\r\n  return String(s == null ? \"\" : s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\r\n}\r\n\r\nconst ICON_GLOBE = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18\"/><path d=\"M12 3c2.6 2.7 2.6 15.3 0 18M12 3c-2.6 2.7-2.6 15.3 0 18\"/></svg>';\r\nconst ICON_COPY = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15V5a2 2 0 0 1 2-2h10\"/></svg>';\r\nconst ICON_TRASH = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13\"/></svg>';\r\n\r\nexport function attachLinkToolbar(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n  // \uC778\uB77C\uC778 \uB9C1\uD06C \u2192 \uCE74\uB4DC/\uC784\uBCA0\uB4DC \uBE14\uB85D \"\uC804\uD658\"(editor.js \uC8FC\uC785). canEmbed(href): \uC784\uBCA0\uB4DC \uAC00\uB2A5(YouTube/Vimeo)\uC77C \uB54C\uB9CC \uC784\uBCA0\uB4DC \uBC84\uD2BC \uB178\uCD9C.\r\n  const onConvert = typeof opts.onConvert === \"function\" ? opts.onConvert : null;\r\n  const canEmbed = typeof opts.canEmbed === \"function\" ? opts.canEmbed : () => false;\r\n  const LK = (opts.locale && opts.locale.link) || {};\r\n\r\n  const bar = document.createElement(\"div\");\r\n  bar.className = \"lumir-link-toolbar\";\r\n  bar.style.position = \"absolute\";\r\n  bar.style.display = \"none\";\r\n  document.body.appendChild(bar);\r\n\r\n  let mode = null; // \"view\" | \"edit\" | \"add\"\r\n  let currentAnchor = null;\r\n  let savedRange = null, savedContent = null; // add \uBAA8\uB4DC\uC6A9\r\n  let hideTimer = null, focusTimer = null, focusoutTimer = null;\r\n\r\n  function clearHideTimer() { if (hideTimer) { clearTimeout(hideTimer); hideTimer = null; } }\r\n  function clearEditTimers() {\r\n    if (focusTimer) { clearTimeout(focusTimer); focusTimer = null; }\r\n    if (focusoutTimer) { clearTimeout(focusoutTimer); focusoutTimer = null; }\r\n  }\r\n  function scheduleHide() { clearHideTimer(); hideTimer = setTimeout(() => { if (mode === \"view\") hide(); }, 260); }\r\n  function hide() {\r\n    bar.style.display = \"none\";\r\n    bar.classList.remove(\"llt-editing\");\r\n    mode = null; currentAnchor = null; savedRange = null; savedContent = null;\r\n    clearHideTimer();\r\n    clearEditTimers();\r\n  }\r\n\r\n  function closestEditable(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    return el ? el.closest(\".content, td.lumir-cell\") : null;\r\n  }\r\n  function linkUnder(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    const a = el && el.closest ? el.closest(\"a\") : null;\r\n    if (!a || !editorEl.contains(a)) return null;\r\n    // \uBD81\uB9C8\uD06C \uCE74\uB4DC/\uC774\uBBF8\uC9C0 \uD30C\uC77C\uBA85 \uCE74\uB4DC\uC758 <a>\uB294 \uC778\uB77C\uC778 \uB9C1\uD06C\uAC00 \uC544\uB2C8\uBBC0\uB85C \uB9C1\uD06C \uD234\uBC14 \uB300\uC0C1\uC5D0\uC11C \uC81C\uC678.\r\n    if (a.closest(\".lumir-bookmark, .lumir-image\")) return null;\r\n    return a;\r\n  }\r\n  function rectOf(x) { try { return x && x.getBoundingClientRect ? x.getBoundingClientRect() : null; } catch (_) { return null; } }\r\n  function position(rect) {\r\n    rect = rect || { bottom: 0, left: 0, top: 0 };\r\n    bar.style.display = mode === \"edit\" || mode === \"add\" ? \"block\" : \"flex\";\r\n    const bw = bar.offsetWidth || 0, bh = bar.offsetHeight || 0;\r\n    const vw = (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || 0;\r\n    const vh = (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || 0;\r\n    let left = rect.left || 0;\r\n    if (vw && left + bw > vw - 8) left = vw - bw - 8;\r\n    if (left < 8) left = 8;\r\n    let top = (rect.bottom || 0) + 6;\r\n    if (vh && bh && top + bh > vh - 8) { const up = (rect.top || 0) - bh - 6; top = up >= 8 ? up : Math.max(8, vh - bh - 8); }\r\n    bar.style.left = window.scrollX + left + \"px\";\r\n    bar.style.top = window.scrollY + top + \"px\";\r\n  }\r\n\r\n  function showView(a) {\r\n    mode = \"view\"; currentAnchor = a;\r\n    bar.classList.remove(\"llt-editing\");\r\n    const href = a.getAttribute(\"href\") || \"\";\r\n    // \"\uC804\uD658\" \uC561\uC158(\uC120\uD0DD): \uCE74\uB4DC\uB294 \uD56D\uC0C1, \uC784\uBCA0\uB4DC\uB294 YouTube/Vimeo \uB9C1\uD06C\uC77C \uB54C\uB9CC \uB178\uCD9C.\r\n    const convertBtns = onConvert\r\n      ? `<button type=\"button\" class=\"llt-btn\" data-act=\"card\">${LK.toCard || \"\uCE74\uB4DC\"}</button>` +\r\n        (canEmbed(href) ? `<button type=\"button\" class=\"llt-btn\" data-act=\"embed\">${LK.toEmbed || \"\uC784\uBCA0\uB4DC\"}</button>` : \"\")\r\n      : \"\";\r\n    bar.innerHTML =\r\n      `<span class=\"llt-fav\">${ICON_GLOBE}</span>` +\r\n      `<a class=\"llt-url\" href=\"${esc(neutralizeUrl(href))}\" target=\"_blank\" rel=\"noopener noreferrer\">${esc(href || \"(\uBE48 \uB9C1\uD06C)\")}</a>` +\r\n      `<button type=\"button\" class=\"llt-icon\" data-act=\"copy\" title=\"${LK.copy || \"URL \uBCF5\uC0AC\"}\">${ICON_COPY}</button>` +\r\n      `<button type=\"button\" class=\"llt-btn\" data-act=\"edit\">${LK.edit || \"\uD3B8\uC9D1\"}</button>` +\r\n      convertBtns;\r\n    position(rectOf(a));\r\n  }\r\n  function showEdit(a, addRect) {\r\n    mode = a ? \"edit\" : \"add\";\r\n    currentAnchor = a || null;\r\n    bar.classList.add(\"llt-editing\");\r\n    const href = a ? (a.getAttribute(\"href\") || \"\") : \"\";\r\n    const title = a ? (a.textContent || \"\") : (window.getSelection ? window.getSelection().toString() : \"\");\r\n    bar.innerHTML =\r\n      `<div class=\"llt-field\"><label>${LK.pageOrUrl || \"\uD398\uC774\uC9C0 \uB610\uB294 URL\"}</label>` +\r\n      `<input type=\"text\" class=\"llt-url-input\" placeholder=\"${LK.placeholder || \"https://\u2026\"}\" value=\"${esc(href)}\" /></div>` +\r\n      `<div class=\"llt-field\"><label>${LK.linkTitle || \"\uB9C1\uD06C \uC81C\uBAA9\"}</label>` +\r\n      `<input type=\"text\" class=\"llt-title-input\" value=\"${esc(title)}\" /></div>` +\r\n      (a\r\n        ? `<button type=\"button\" class=\"llt-remove\" data-act=\"remove\"><span class=\"llt-tico\">${ICON_TRASH}</span>${LK.remove || \"\uB9C1\uD06C \uC81C\uAC70\"}</button>`\r\n        : `<button type=\"button\" class=\"llt-apply\" data-act=\"apply\">${LK.apply || \"\uC801\uC6A9\"}</button>`);\r\n    position(a ? rectOf(a) : addRect);\r\n    const inp = bar.querySelector(\".llt-url-input\");\r\n    if (inp) focusTimer = setTimeout(() => { try { inp.focus(); inp.select && inp.select(); } catch (_) {} }, 0);\r\n  }\r\n\r\n  function unwrap(a) { if (a && a.parentNode) a.replaceWith(document.createTextNode(a.textContent || \"\")); }\r\n  function applyEdit() {\r\n    if (!bar.isConnected) return; // destroy \uD6C4 \uC9C0\uC5F0 \uD0C0\uC774\uBA38(focusout) \uBC1C\uD654 \uBC29\uC5B4(H1)\r\n    const urlInput = bar.querySelector(\".llt-url-input\");\r\n    const titleInput = bar.querySelector(\".llt-title-input\");\r\n    const href = normalizeHref(urlInput ? urlInput.value : \"\");\r\n    const title = (titleInput ? titleInput.value : \"\").trim();\r\n    if (mode === \"edit\" && currentAnchor) {\r\n      if (!href) { unwrap(currentAnchor); onChange(); hide(); return; } // URL \uBE44\uC6B0\uBA74 \uB9C1\uD06C \uD574\uC81C\r\n      currentAnchor.setAttribute(\"href\", href);\r\n      currentAnchor.textContent = title || href;\r\n      onChange(); hide();\r\n    } else if (mode === \"add\" && savedContent && savedRange) {\r\n      if (href) {\r\n        const s = window.getSelection(); s.removeAllRanges(); s.addRange(savedRange);\r\n        if (applyLink(savedContent, href)) onChange();\r\n      }\r\n      hide();\r\n    }\r\n  }\r\n\r\n  // \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC5D0 \uB9C1\uD06C \uCD94\uAC00(Ctrl+K \uB4F1 \uC678\uBD80 \uD2B8\uB9AC\uAC70)\r\n  function promptAdd() {\r\n    const sel = window.getSelection();\r\n    if (!sel || !sel.rangeCount) return false;\r\n    const r = sel.getRangeAt(0);\r\n    if (r.collapsed) return false;\r\n    const content = closestEditable(r.startContainer);\r\n    if (!content || !editorEl.contains(content)) return false;\r\n    savedRange = r.cloneRange(); savedContent = content;\r\n    showEdit(null, rectOf(r));\r\n    return true;\r\n  }\r\n\r\n  // \uB9C1\uD06C \uBCF8\uBB38 \uD074\uB9AD \u2192 \uC0C8 \uD0ED\r\n  function onEditorClick(e) {\r\n    const a = linkUnder(e.target);\r\n    if (!a) return;\r\n    const h = a.getAttribute(\"href\");\r\n    if (h && SAFE_URL.test(h)) { e.preventDefault(); window.open(h, \"_blank\", \"noopener,noreferrer\"); }\r\n  }\r\n  function onEditorOver(e) {\r\n    if (mode === \"edit\" || mode === \"add\") return;\r\n    const a = linkUnder(e.target);\r\n    if (a) { clearHideTimer(); if (currentAnchor !== a || mode !== \"view\") showView(a); }\r\n  }\r\n  function onEditorOut(e) {\r\n    if (mode === \"edit\" || mode === \"add\") return;\r\n    if (linkUnder(e.target)) scheduleHide();\r\n  }\r\n\r\n  bar.addEventListener(\"mouseenter\", clearHideTimer);\r\n  bar.addEventListener(\"mouseleave\", () => { if (mode === \"view\") scheduleHide(); });\r\n  bar.addEventListener(\"mousedown\", (e) => { if (!e.target.closest(\"input\")) e.preventDefault(); }); // \uC120\uD0DD \uC720\uC9C0\r\n  bar.addEventListener(\"click\", (e) => {\r\n    const btn = e.target.closest(\"[data-act]\");\r\n    if (!btn) return;\r\n    const act = btn.dataset.act;\r\n    if (act === \"copy\" && currentAnchor) {\r\n      const h = currentAnchor.getAttribute(\"href\") || \"\";\r\n      try { if (navigator.clipboard) navigator.clipboard.writeText(h); } catch (_) {}\r\n      btn.classList.add(\"copied\"); setTimeout(() => btn.classList.remove(\"copied\"), 900);\r\n    } else if (act === \"edit\" && currentAnchor) { showEdit(currentAnchor); }\r\n    else if (act === \"remove\" && currentAnchor) { unwrap(currentAnchor); onChange(); hide(); }\r\n    else if (act === \"apply\") { applyEdit(); }\r\n    else if ((act === \"card\" || act === \"embed\") && currentAnchor && onConvert) {\r\n      const anchor = currentAnchor;\r\n      hide();\r\n      onConvert(anchor, act); // \uC778\uB77C\uC778 \uB9C1\uD06C \u2192 \uBD81\uB9C8\uD06C \uBE14\uB85D \uC804\uD658(editor.js)\r\n    }\r\n  });\r\n  bar.addEventListener(\"keydown\", (e) => {\r\n    if (e.target.classList && (e.target.classList.contains(\"llt-url-input\") || e.target.classList.contains(\"llt-title-input\"))) {\r\n      if (e.key === \"Enter\") { e.preventDefault(); applyEdit(); }\r\n      else if (e.key === \"Escape\") { e.preventDefault(); hide(); }\r\n    }\r\n  });\r\n  // \uD3B8\uC9D1 popup \uBC16\uC73C\uB85C \uD3EC\uCEE4\uC2A4 \uB098\uAC00\uBA74 \uC801\uC6A9\r\n  bar.addEventListener(\"focusout\", () => {\r\n    if (mode !== \"edit\" && mode !== \"add\") return;\r\n    focusoutTimer = setTimeout(() => { if (!bar.contains(document.activeElement) && (mode === \"edit\" || mode === \"add\")) applyEdit(); }, 120);\r\n  });\r\n\r\n  editorEl.addEventListener(\"mouseover\", onEditorOver);\r\n  editorEl.addEventListener(\"mouseout\", onEditorOut);\r\n  editorEl.addEventListener(\"click\", onEditorClick);\r\n  function onSelChange() {\r\n    if (mode === \"edit\" || mode === \"add\") return;\r\n    const sel = window.getSelection();\r\n    if (!sel || !sel.rangeCount) return;\r\n    const a = linkUnder(sel.getRangeAt(0).startContainer);\r\n    if (a) { if (currentAnchor !== a || mode !== \"view\") showView(a); }\r\n    else if (mode === \"view\") scheduleHide();\r\n  }\r\n  document.addEventListener(\"selectionchange\", onSelChange);\r\n\r\n  return {\r\n    element: bar,\r\n    promptAdd,\r\n    hide,\r\n    isOpen: () => bar.style.display !== \"none\",\r\n    destroy() {\r\n      document.removeEventListener(\"selectionchange\", onSelChange);\r\n      editorEl.removeEventListener(\"mouseover\", onEditorOver);\r\n      editorEl.removeEventListener(\"mouseout\", onEditorOut);\r\n      editorEl.removeEventListener(\"click\", onEditorClick);\r\n      clearHideTimer();\r\n      clearEditTimers();\r\n      if (bar.parentNode) bar.parentNode.removeChild(bar);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD30C\uC77C \uD328\uB110 (P7-\u2464) \u2014 \uD30C\uC77C \uC120\uD0DD \uB610\uB294 URL \uC784\uBCA0\uB4DC.\r\n *  - \"\uD30C\uC77C \uC120\uD0DD\" \u2192 onPickFile()(\uC5D0\uB514\uD130\uC758 \uC774\uBBF8\uC9C0 \uD53C\uCEE4/\uC5C5\uB85C\uB4DC \uD30C\uC774\uD504\uB77C\uC778).\r\n *  - URL \uC785\uB825 \u2192 \uD655\uC7A5\uC790\uB85C \uC774\uBBF8\uC9C0/\uBE44\uB514\uC624 \uBE14\uB85D, \uC544\uB2C8\uBA74 \uC778\uB77C\uC778 \uB9C1\uD06C \uBB38\uB2E8 \uC0BD\uC785.\r\n * \uD2B8\uB9AC\uAC70: \uC2AC\uB798\uC2DC \uBA54\uB274 \uD56D\uBAA9. body \uC808\uB300\uBC30\uCE58.\r\n */\r\n\r\n/** URL \uD655\uC7A5\uC790 \u2192 \uBE14\uB85D (\uC774\uBBF8\uC9C0/\uBE44\uB514\uC624\uAC00 \uC544\uB2C8\uBA74 \uC778\uB77C\uC778 \uB9C1\uD06C \uBB38\uB2E8) */\r\nexport function blockFromUrl(url) {\r\n  const clean = String(url || \"\").split(\"?\")[0].split(\"#\")[0];\r\n  const ext = (clean.match(/\\.([a-z0-9]+)$/i) || [])[1] || \"\";\r\n  if (/^(png|jpe?g|gif|webp|bmp|avif)$/i.test(ext)) return { type: \"image\", props: { url, caption: \"\", previewWidth: 512 }, content: [], children: [] };\r\n  if (/^(mp4|webm|ogg|mov|m4v)$/i.test(ext)) return { type: \"video\", props: { url }, content: [], children: [] };\r\n  return { type: \"paragraph\", props: { textColor: \"default\", backgroundColor: \"default\", textAlignment: \"left\" }, content: [{ type: \"link\", href: url, content: [{ type: \"text\", text: url, styles: {} }] }], children: [] };\r\n}\r\n\r\nexport function attachFilePanel(editorEl, opts) {\r\n  opts = opts || {};\r\n  const onPickFile = typeof opts.onPickFile === \"function\" ? opts.onPickFile : () => {};\r\n  const onInsertBlock = typeof opts.onInsertBlock === \"function\" ? opts.onInsertBlock : () => {};\r\n\r\n  const pop = document.createElement(\"div\");\r\n  pop.className = \"lumir-file-panel\";\r\n  pop.style.position = \"absolute\";\r\n  pop.style.display = \"none\";\r\n  pop.innerHTML =\r\n    `<button type=\"button\" class=\"lfp-btn\" data-act=\"file\">\uD30C\uC77C \uC120\uD0DD</button>` +\r\n    `<div class=\"lfp-row\"><input type=\"text\" class=\"lfp-url\" placeholder=\"\uC774\uBBF8\uC9C0/\uC601\uC0C1/\uB9C1\uD06C URL\u2026\" /><button type=\"button\" class=\"lfp-btn\" data-act=\"embed\">\uC0BD\uC785</button></div>`;\r\n  document.body.appendChild(pop);\r\n\r\n  function closestEditable(node) {\r\n    const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n    return el ? el.closest(\".content, td.lumir-cell\") : null;\r\n  }\r\n  function rectOf(x) { try { return x && x.getBoundingClientRect ? x.getBoundingClientRect() : null; } catch (_) { return null; } }\r\n  function hide() { pop.style.display = \"none\"; }\r\n\r\n  function open(anchor) {\r\n    const sel = window.getSelection();\r\n    let rect = null;\r\n    if (sel && sel.rangeCount) {\r\n      const r = sel.getRangeAt(0);\r\n      const content = closestEditable(r.startContainer);\r\n      if (content && editorEl.contains(content)) rect = rectOf(r);\r\n    }\r\n    // \uCE90\uB7FF \uC704\uCE58\uB97C \uBABB \uC7A1\uC73C\uBA74 \uAE30\uC900 \uBE14\uB85D \u2192 \uC5D0\uB514\uD130 \uC21C\uC73C\uB85C \uD3F4\uBC31(\uC88C\uC0C1\uB2E8(0,0) \uBC29\uC9C0)\r\n    if (!rect || (!rect.bottom && !rect.left)) rect = rectOf(anchor) || rectOf(editorEl) || { bottom: 0, left: 0 };\r\n    pop.style.top = window.scrollY + (rect.bottom || 0) + 6 + \"px\";\r\n    pop.style.left = window.scrollX + (rect.left || 0) + \"px\";\r\n    pop.style.display = \"block\";\r\n    const input = pop.querySelector(\".lfp-url\");\r\n    if (input) { input.value = \"\"; setTimeout(() => { try { input.focus(); } catch (_) {} }, 0); }\r\n    return true;\r\n  }\r\n\r\n  function embed() {\r\n    const input = pop.querySelector(\".lfp-url\");\r\n    const url = input ? input.value.trim() : \"\";\r\n    if (!url) return;\r\n    onInsertBlock(blockFromUrl(url));\r\n    hide();\r\n  }\r\n\r\n  pop.addEventListener(\"mousedown\", (e) => { if (!e.target.closest(\"input\")) e.preventDefault(); });\r\n  pop.addEventListener(\"click\", (e) => {\r\n    const btn = e.target.closest(\"[data-act]\");\r\n    if (!btn) return;\r\n    if (btn.dataset.act === \"file\") { onPickFile(); hide(); }\r\n    else if (btn.dataset.act === \"embed\") embed();\r\n  });\r\n  pop.addEventListener(\"keydown\", (e) => {\r\n    if (e.target.classList && e.target.classList.contains(\"lfp-url\")) {\r\n      if (e.key === \"Enter\") { e.preventDefault(); embed(); }\r\n      else if (e.key === \"Escape\") { e.preventDefault(); hide(); }\r\n    }\r\n  });\r\n\r\n  return {\r\n    element: pop,\r\n    open,\r\n    hide,\r\n    embed,\r\n    isOpen: () => pop.style.display !== \"none\",\r\n    destroy() { if (pop.parentNode) pop.parentNode.removeChild(pop); },\r\n  };\r\n}\r\n", "/**\r\n * LumirEditor \uCEE4\uC2A4\uD140 \uC5D0\uB7EC (P8-\u2460) \u2014 kingdoo-editor errors/LumirEditorError.ts \uC774\uC2DD.\r\n * \uCF54\uB4DC + \uD55C\uAD6D\uC5B4 \uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0(getUserMessage) + \uD329\uD1A0\uB9AC.\r\n */\r\n\r\nexport const LUMIR_ERROR_CODES = [\r\n  'UPLOAD_FAILED',\r\n  'INVALID_FILE_TYPE',\r\n  'S3_CONFIG_ERROR',\r\n  'PRESIGNED_URL_ERROR',\r\n  'NETWORK_ERROR',\r\n  'EDITOR_ERROR',\r\n  'UNKNOWN_ERROR',\r\n];\r\n\r\nexport class LumirEditorError extends Error {\r\n  constructor(message, details) {\r\n    super(message);\r\n    details = details || {};\r\n    this.name = 'LumirEditorError';\r\n    this.code = details.code || 'UNKNOWN_ERROR';\r\n    this.originalError = details.originalError;\r\n    this.context = details.context;\r\n    Object.setPrototypeOf(this, LumirEditorError.prototype);\r\n  }\r\n\r\n  toJSON() {\r\n    return {\r\n      name: this.name,\r\n      message: this.message,\r\n      code: this.code,\r\n      context: this.context,\r\n      stack: this.stack,\r\n    };\r\n  }\r\n\r\n  /** \uC0AC\uC6A9\uC790 \uCE5C\uD654\uC801(\uD55C\uAD6D\uC5B4) \uBA54\uC2DC\uC9C0 */\r\n  getUserMessage() {\r\n    switch (this.code) {\r\n      case 'UPLOAD_FAILED':\r\n        return '\uD30C\uC77C \uC5C5\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.';\r\n      case 'INVALID_FILE_TYPE':\r\n        return '\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD\uC785\uB2C8\uB2E4. \uC774\uBBF8\uC9C0 \uD30C\uC77C\uB9CC \uC5C5\uB85C\uB4DC \uAC00\uB2A5\uD569\uB2C8\uB2E4.';\r\n      case 'S3_CONFIG_ERROR':\r\n        return 'S3 \uC124\uC815\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694.';\r\n      case 'PRESIGNED_URL_ERROR':\r\n        return '\uC5C5\uB85C\uB4DC URL \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.';\r\n      case 'NETWORK_ERROR':\r\n        return '\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.';\r\n      case 'EDITOR_ERROR':\r\n        return '\uC5D0\uB514\uD130 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574\uC8FC\uC138\uC694.';\r\n      default:\r\n        return '\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.';\r\n    }\r\n  }\r\n\r\n  static fromError(error, code, context) {\r\n    return new LumirEditorError(\r\n      error && error.message ? error.message : String(error),\r\n      {\r\n        code: code || 'UNKNOWN_ERROR',\r\n        originalError: error instanceof Error ? error : undefined,\r\n        context,\r\n      },\r\n    );\r\n  }\r\n  static uploadFailed(message, originalError) {\r\n    return new LumirEditorError(message, {\r\n      code: 'UPLOAD_FAILED',\r\n      originalError,\r\n    });\r\n  }\r\n  static invalidFileType(fileName, allowVideoUpload) {\r\n    const message =\r\n      allowVideoUpload === true\r\n        ? `Invalid file type: ${fileName}. Only image and video files are allowed.`\r\n        : `Invalid file type: ${fileName}. Only image files are allowed.`;\r\n    return new LumirEditorError(message, {\r\n      code: 'INVALID_FILE_TYPE',\r\n      context: { fileName },\r\n    });\r\n  }\r\n  static s3ConfigError(message) {\r\n    return new LumirEditorError(message, { code: 'S3_CONFIG_ERROR' });\r\n  }\r\n  static networkError(originalError) {\r\n    return new LumirEditorError('Network request failed', {\r\n      code: 'NETWORK_ERROR',\r\n      originalError,\r\n    });\r\n  }\r\n}\r\n", "/**\r\n * \uB85C\uCF00\uC77C (P8-\u2460) \u2014 \uAE30\uBCF8 \uD55C\uAD6D\uC5B4 \uC0AC\uC804.\r\n * \uC0AC\uC6A9\uC790 \uB178\uCD9C \uBB38\uC790\uC5F4\uC744 \uD55C\uACF3\uC5D0 \uBAA8\uC740\uB2E4. `mountLumirEditor(el, { locale })`\uB85C \uBD80\uBD84 \uB36E\uC5B4\uC4F0\uAE30 \uAC00\uB2A5.\r\n * (UI \uBAA8\uB4C8 \uB0B4\uBD80 \uBB38\uC790\uC5F4\uC758 \uC804\uBA74 \uC8FC\uC785\uC740 P9 \uD3F4\uB9AC\uC2DC\uC5D0\uC11C \uD655\uC7A5)\r\n */\r\n\r\nexport const KO = {\r\n  placeholder: \"\uB0B4\uC6A9\uC744 \uC785\uB825\uD558\uAC70\uB098 '/' \uB97C \uB204\uB974\uC138\uC694\u2026\",\r\n  upload: {\r\n    uploading: '\uC5C5\uB85C\uB4DC \uC911\u2026',\r\n    disabled: '\uBBF8\uB514\uC5B4 \uC5C5\uB85C\uB4DC\uAC00 \uBE44\uD65C\uC131\uD654\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.',\r\n  },\r\n  paste: {\r\n    imagesDropped:\r\n      '\uC77C\uBD80 \uC774\uBBF8\uC9C0\uB294 \uBD99\uC5EC\uB123\uAE30\uB85C \uAC00\uC838\uC62C \uC218 \uC5C6\uC5B4 \uC81C\uC678\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC774\uBBF8\uC9C0\uB97C \uAC1C\uBCC4 \uBCF5\uC0AC\uD558\uAC70\uB098 \uB4DC\uB798\uADF8\uD574\uC11C \uB123\uC5B4\uC8FC\uC138\uC694.',\r\n  },\r\n  // \uC5D0\uB7EC \uD1A0\uC2A4\uD2B8(\uCF54\uB4DC\uBCC4 \uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0\uB294 LumirEditorError.getUserMessage\uC640 \uC815\uD569)\r\n  errors: {\r\n    UPLOAD_FAILED: '\uD30C\uC77C \uC5C5\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.',\r\n    INVALID_FILE_TYPE:\r\n      '\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD\uC785\uB2C8\uB2E4. \uC774\uBBF8\uC9C0 \uD30C\uC77C\uB9CC \uC5C5\uB85C\uB4DC \uAC00\uB2A5\uD569\uB2C8\uB2E4.',\r\n    S3_CONFIG_ERROR: 'S3 \uC124\uC815\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694.',\r\n    PRESIGNED_URL_ERROR: '\uC5C5\uB85C\uB4DC URL \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.',\r\n    NETWORK_ERROR: '\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.',\r\n    EDITOR_ERROR: '\uC5D0\uB514\uD130 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574\uC8FC\uC138\uC694.',\r\n    UNKNOWN_ERROR: '\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.',\r\n  },\r\n  toolbar: {\r\n    bold: '\uAD75\uAC8C',\r\n    italic: '\uAE30\uC6B8\uC784',\r\n    underline: '\uBC11\uC904',\r\n    strike: '\uCDE8\uC18C\uC120',\r\n    code: '\uCF54\uB4DC',\r\n    link: '\uB9C1\uD06C',\r\n    textColor: '\uAE00\uC790\uC0C9',\r\n    bgColor: '\uBC30\uACBD\uC0C9',\r\n  },\r\n  blockTypes: {\r\n    paragraph: '\uBCF8\uBB38',\r\n    heading1: '\uC81C\uBAA91',\r\n    heading2: '\uC81C\uBAA92',\r\n    heading3: '\uC81C\uBAA93',\r\n    heading4: '\uC81C\uBAA94',\r\n    heading5: '\uC81C\uBAA95',\r\n    heading6: '\uC81C\uBAA96',\r\n    toggleHeading1: '\uD1A0\uAE00 \uC81C\uBAA91',\r\n    toggleHeading2: '\uD1A0\uAE00 \uC81C\uBAA92',\r\n    toggleHeading3: '\uD1A0\uAE00 \uC81C\uBAA93',\r\n    toggleList: '\uD1A0\uAE00 \uBAA9\uB85D',\r\n    bulletListItem: '\u2022 \uBAA9\uB85D',\r\n    numberedListItem: '1. \uBAA9\uB85D',\r\n    checkListItem: '\u2611 \uCCB4\uD06C',\r\n    quote: '\uC778\uC6A9',\r\n    codeBlock: '\uCF54\uB4DC',\r\n  },\r\n  slashMenu: {\r\n    paragraph: '\uD14D\uC2A4\uD2B8',\r\n    heading1: '\uC81C\uBAA91',\r\n    heading2: '\uC81C\uBAA92',\r\n    heading3: '\uC81C\uBAA93',\r\n    heading4: '\uC81C\uBAA94',\r\n    heading5: '\uC81C\uBAA95',\r\n    heading6: '\uC81C\uBAA96',\r\n    toggleHeading1: '\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA91',\r\n    toggleHeading2: '\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA92',\r\n    toggleHeading3: '\uC811\uC744 \uC218 \uC788\uB294 \uC81C\uBAA93',\r\n    toggleList: '\uC811\uC744 \uC218 \uC788\uB294 \uBAA9\uB85D',\r\n    bulletListItem: '\uAE00\uBA38\uB9AC \uAE30\uD638',\r\n    numberedListItem: '\uBC88\uD638 \uB9E4\uAE30\uAE30',\r\n    checkListItem: '\uD560 \uC77C',\r\n    quote: '\uC778\uC6A9',\r\n    codeBlock: '\uCF54\uB4DC',\r\n    emoji: '\uC774\uBAA8\uC9C0',\r\n    image: '\uC774\uBBF8\uC9C0',\r\n    video: '\uBE44\uB514\uC624',\r\n    table: '\uD45C',\r\n    pageBreak: '\uD398\uC774\uC9C0 \uB098\uB204\uAE30',\r\n    columns2: '2\uB2E8 \uCEEC\uB7FC',\r\n    columns2Divider: '2\uB2E8 \uCEEC\uB7FC (\uAD6C\uBD84\uC120)',\r\n    groupHeading: '\uC81C\uBAA9',\r\n    groupBasic: '\uAE30\uBCF8 \uBE14\uB85D',\r\n    groupMedia: '\uBBF8\uB514\uC5B4',\r\n    groupEmbed: '\uC784\uBCA0\uB4DC',\r\n  },\r\n  table: {\r\n    rowAbove: '\uC704\uC5D0 \uD589',\r\n    rowBelow: '\uC544\uB798\uC5D0 \uD589',\r\n    rowDelete: '\uD589 \uC0AD\uC81C',\r\n    colLeft: '\uC67C\uCABD\uC5D0 \uC5F4',\r\n    colRight: '\uC624\uB978\uCABD\uC5D0 \uC5F4',\r\n    colDelete: '\uC5F4 \uC0AD\uC81C',\r\n    merge: '\uC140 \uBCD1\uD569',\r\n    split: '\uBCD1\uD569 \uD574\uC81C',\r\n    alignLeft: '\uC67C\uCABD',\r\n    alignCenter: '\uAC00\uC6B4\uB370',\r\n    alignRight: '\uC624\uB978\uCABD',\r\n    vTop: '\uC704',\r\n    vMiddle: '\uC911\uAC04',\r\n    vBottom: '\uC544\uB798',\r\n    fill: '\uC140 \uBC30\uACBD\uC0C9',\r\n    textColor: '\uC140 \uAE00\uC790\uC0C9',\r\n    tableLeft: '\uD45C \uC67C\uCABD \uC815\uB82C',\r\n    tableCenter: '\uD45C \uAC00\uC6B4\uB370 \uC815\uB82C',\r\n    tableRight: '\uD45C \uC624\uB978\uCABD \uC815\uB82C',\r\n    headerRow: '\uBA38\uB9AC\uD589',\r\n    headerCol: '\uBA38\uB9AC\uC5F4',\r\n    insertCheckbox: '\uCCB4\uD06C\uBC15\uC2A4',\r\n    orderedList: '\uBC88\uD638 \uBAA9\uB85D',\r\n    bulletList: '\uAE00\uBA38\uB9AC \uBAA9\uB85D',\r\n    deleteTable: '\uD45C \uC0AD\uC81C',\r\n  },\r\n  link: {\r\n    open: '\uC5F4\uAE30',\r\n    edit: '\uD3B8\uC9D1',\r\n    copy: 'URL \uBCF5\uC0AC',\r\n    remove: '\uB9C1\uD06C \uC81C\uAC70',\r\n    apply: '\uC801\uC6A9',\r\n    cancel: '\uCDE8\uC18C',\r\n    placeholder: 'https://\u2026',\r\n    pageOrUrl: '\uD398\uC774\uC9C0 \uB610\uB294 URL',\r\n    linkTitle: '\uB9C1\uD06C \uC81C\uBAA9',\r\n  },\r\n};\r\n\r\n/** \uC601\uC5B4 \uC0AC\uC804 (A10) \u2014 KO\uC640 \uB3D9\uC77C \uAD6C\uC870. */\r\nexport const EN = {\r\n  placeholder: \"Type something or press '/'\u2026\",\r\n  upload: { uploading: 'Uploading\u2026', disabled: 'Image upload is disabled.' },\r\n  paste: {\r\n    imagesDropped:\r\n      'Some images could not be pasted and were skipped. Copy or drag the images individually instead.',\r\n  },\r\n  errors: {\r\n    UPLOAD_FAILED: 'File upload failed. Please try again.',\r\n    INVALID_FILE_TYPE:\r\n      'Unsupported file type. Only image files can be uploaded.',\r\n    S3_CONFIG_ERROR:\r\n      'S3 configuration is invalid. Please contact your administrator.',\r\n    PRESIGNED_URL_ERROR: 'Failed to create upload URL. Please try again.',\r\n    NETWORK_ERROR: 'Please check your network connection.',\r\n    EDITOR_ERROR: 'An editor error occurred. Please refresh the page.',\r\n    UNKNOWN_ERROR: 'An unknown error occurred.',\r\n  },\r\n  toolbar: {\r\n    bold: 'Bold',\r\n    italic: 'Italic',\r\n    underline: 'Underline',\r\n    strike: 'Strikethrough',\r\n    code: 'Code',\r\n    link: 'Link',\r\n    textColor: 'Text color',\r\n    bgColor: 'Background color',\r\n  },\r\n  blockTypes: {\r\n    paragraph: 'Text',\r\n    heading1: 'Heading 1',\r\n    heading2: 'Heading 2',\r\n    heading3: 'Heading 3',\r\n    heading4: 'Heading 4',\r\n    heading5: 'Heading 5',\r\n    heading6: 'Heading 6',\r\n    toggleHeading1: 'Toggle heading 1',\r\n    toggleHeading2: 'Toggle heading 2',\r\n    toggleHeading3: 'Toggle heading 3',\r\n    toggleList: 'Toggle list',\r\n    bulletListItem: '\u2022 List',\r\n    numberedListItem: '1. List',\r\n    checkListItem: '\u2611 Check',\r\n    quote: 'Quote',\r\n    codeBlock: 'Code',\r\n  },\r\n  slashMenu: {\r\n    paragraph: 'Text',\r\n    heading1: 'Heading 1',\r\n    heading2: 'Heading 2',\r\n    heading3: 'Heading 3',\r\n    heading4: 'Heading 4',\r\n    heading5: 'Heading 5',\r\n    heading6: 'Heading 6',\r\n    toggleHeading1: 'Toggle heading 1',\r\n    toggleHeading2: 'Toggle heading 2',\r\n    toggleHeading3: 'Toggle heading 3',\r\n    toggleList: 'Toggle list',\r\n    bulletListItem: 'Bullet list',\r\n    numberedListItem: 'Numbered list',\r\n    checkListItem: 'Check list',\r\n    quote: 'Quote',\r\n    codeBlock: 'Code',\r\n    emoji: 'Emoji',\r\n    image: 'Image',\r\n    video: 'Video',\r\n    table: 'Table',\r\n    pageBreak: 'Page break',\r\n    columns2: '2 columns',\r\n    columns2Divider: '2 columns (divider)',\r\n    groupHeading: 'Headings',\r\n    groupBasic: 'Basic blocks',\r\n    groupMedia: 'Media',\r\n    groupEmbed: 'Embed',\r\n  },\r\n  table: {\r\n    rowAbove: 'Insert row above',\r\n    rowBelow: 'Insert row below',\r\n    rowDelete: 'Delete row',\r\n    colLeft: 'Insert column left',\r\n    colRight: 'Insert column right',\r\n    colDelete: 'Delete column',\r\n    merge: 'Merge cells',\r\n    split: 'Split cells',\r\n    alignLeft: 'Left',\r\n    alignCenter: 'Center',\r\n    alignRight: 'Right',\r\n    vTop: 'Top',\r\n    vMiddle: 'Middle',\r\n    vBottom: 'Bottom',\r\n    fill: 'Cell background',\r\n    textColor: 'Cell text color',\r\n    tableLeft: 'Align table left',\r\n    tableCenter: 'Align table center',\r\n    tableRight: 'Align table right',\r\n    headerRow: 'Header row',\r\n    headerCol: 'Header column',\r\n    insertCheckbox: 'Checkbox',\r\n    orderedList: 'Numbered list',\r\n    bulletList: 'Bulleted list',\r\n    deleteTable: 'Delete table',\r\n  },\r\n  link: {\r\n    open: 'Open',\r\n    edit: 'Edit',\r\n    copy: 'Copy URL',\r\n    remove: 'Remove link',\r\n    apply: 'Apply',\r\n    cancel: 'Cancel',\r\n    placeholder: 'https://\u2026',\r\n    pageOrUrl: 'Page or URL',\r\n    linkTitle: 'Link title',\r\n  },\r\n};\r\n\r\n/** \uC9C0\uC6D0 \uB85C\uCF00\uC77C: \uD55C\uAD6D\uC5B4(ko) \u00B7 \uC601\uC5B4(en) 2\uAC1C\uB9CC. (\uB2E4\uAD6D\uC5B4 \uD655\uC7A5 \uD504\uB808\uC784\uC6CC\uD06C\uB294 \uCC44\uD0DD\uD558\uC9C0 \uC54A\uC74C) */\r\nexport const LOCALES = { ko: KO, en: EN };\r\n\r\nfunction mergeOver(base, over) {\r\n  const out = { ...base };\r\n  for (const k of Object.keys(over)) {\r\n    const v = over[k];\r\n    out[k] =\r\n      v && typeof v === 'object' && !Array.isArray(v)\r\n        ? { ...(base[k] || {}), ...v }\r\n        : v;\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * \uB85C\uCF00\uC77C \uD574\uC11D \u2014 \uD55C\uAD6D\uC5B4/\uC601\uC5B4\uB9CC \uC9C0\uC6D0.\r\n *  - \uBB38\uC790\uC5F4 \"ko\"/\"en\": \uB0B4\uC7A5 \uC0AC\uC804 \uBC18\uD658(\uADF8 \uC678 \uCF54\uB4DC\uB294 KO).\r\n *  - \uAC1D\uCCB4: KO \uC704\uC5D0 2-\uB808\uBCA8 \uBA38\uC9C0(\uBD80\uBD84 \uC624\uBC84\uB77C\uC774\uB4DC). `code:\"en\"`\uC774\uBA74 EN\uC744 \uBCA0\uC774\uC2A4\uB85C \uBA38\uC9C0.\r\n *  - \uC5C6\uC74C: KO.\r\n */\r\nexport function resolveLocale(locale) {\r\n  if (!locale) return KO;\r\n  if (typeof locale === 'string') return LOCALES[locale] || KO;\r\n  if (typeof locale !== 'object') return KO;\r\n  const base = locale.code && LOCALES[locale.code] ? LOCALES[locale.code] : KO;\r\n  const over = { ...locale };\r\n  delete over.code;\r\n  return mergeOver(base, over);\r\n}\r\n", "/**\r\n * \uBE14\uB85D \uAC1D\uCCB4 \uD329\uD1A0\uB9AC \u2014 \uC21C\uC218(\uBD80\uC218\uD6A8\uACFC \uC5C6\uC74C). editor \uB9C8\uC6B4\uD2B8\u00B7\uBD99\uC5EC\uB123\uAE30\u00B7\uC5C5\uB85C\uB4DC\uAC00 \uACF5\uC720\uD55C\uB2E4.\r\n * \uC800\uC7A5 JSON(BlockNote \uD638\uD658) \uD615\uD0DC\uB97C \uC0DD\uC131\uB9CC \uD558\uBA70 DOM \uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4.\r\n */\r\n\r\n/** \uBB38\uB2E8/\uB9AC\uC2A4\uD2B8 \uAE30\uBCF8 props(\uC0C9\u00B7\uC815\uB82C) */\r\nexport const DEFAULT_BLOCK_PROPS = () => ({\r\n  textColor: 'default',\r\n  backgroundColor: 'default',\r\n  textAlignment: 'left',\r\n});\r\n\r\n/** \uBE48 \uBB38\uB2E8 n\uAC1C(\uCD5C\uC18C 1\uAC1C) */\r\nexport function emptyParas(n) {\r\n  return Array.from({ length: Math.max(1, n) }, () => ({\r\n    type: 'paragraph',\r\n    props: DEFAULT_BLOCK_PROPS(),\r\n    content: [],\r\n    children: [],\r\n  }));\r\n}\r\n\r\n/**\r\n * initialContent \uC815\uADDC\uD654 \u2014 \uBC30\uC5F4 \uB610\uB294 JSON \uBB38\uC790\uC5F4 \uD5C8\uC6A9. \uC5C6\uAC70\uB098 \uD30C\uC2F1 \uC2E4\uD328 \uC2DC\r\n * initialEmptyBlocks(\uAE30\uBCF8 3)\uAC1C\uC758 \uBE48 \uBB38\uB2E8\uC73C\uB85C \uB300\uCCB4.\r\n */\r\nexport function resolveInitialContent(opts) {\r\n  let raw = opts.initialContent;\r\n  if (typeof raw === 'string') {\r\n    try {\r\n      raw = JSON.parse(raw);\r\n    } catch (_) {\r\n      raw = null;\r\n    }\r\n  }\r\n  const n = opts.initialEmptyBlocks != null ? opts.initialEmptyBlocks : 3;\r\n  if (raw == null) return emptyParas(n);\r\n  return Array.isArray(raw) ? raw : emptyParas(n);\r\n}\r\n\r\n/**\r\n * \uC5C5\uB85C\uB4DC\uB41C \uBBF8\uB514\uC5B4 \uBE14\uB85D \uAC1D\uCCB4 \uC0DD\uC131(kingdoo-editor \uB370\uC774\uD130 \uAD6C\uC870\uC640 \uB3D9\uC77C).\r\n * - video: blocknote \uCEE4\uC2A4\uD140 VideoBlock props {url}\r\n * - audio/file: blocknote \uAE30\uBCF8 \uD30C\uC77C\uBE14\uB85D(content \uD0A4 \uC5C6\uC74C)\r\n * - image: blocknote \uAE30\uBCF8 image\r\n */\r\nexport function buildMediaBlock(type, url, name) {\r\n  const n = name || '';\r\n  if (type === 'video') return { type: 'video', props: { url }, children: [] };\r\n  if (type === 'audio')\r\n    return {\r\n      type: 'audio',\r\n      props: {\r\n        backgroundColor: 'default',\r\n        name: n,\r\n        url,\r\n        caption: '',\r\n        showPreview: true,\r\n      },\r\n      children: [],\r\n    };\r\n  if (type === 'file')\r\n    return {\r\n      type: 'file',\r\n      props: { backgroundColor: 'default', name: n, url, caption: '' },\r\n      children: [],\r\n    };\r\n  return {\r\n    type: 'image',\r\n    props: {\r\n      backgroundColor: 'default',\r\n      textAlignment: 'left',\r\n      name: n,\r\n      url,\r\n      caption: '',\r\n      showPreview: true,\r\n    },\r\n    children: [],\r\n  };\r\n}\r\n\r\n/** rows\u00D7cols \uBE48 \uD45C \uBE14\uB85D(\uC5F4\uD3ED \uBBF8\uC9C0\uC815) */\r\nexport function emptyTable(rows, cols) {\r\n  rows = rows || 2;\r\n  cols = cols || 2;\r\n  const mkCell = () => ({\r\n    type: 'tableCell',\r\n    props: { colspan: 1, rowspan: 1 },\r\n    content: [],\r\n  });\r\n  const rws = [];\r\n  for (let r = 0; r < rows; r++) {\r\n    const cells = [];\r\n    for (let c = 0; c < cols; c++) cells.push(mkCell());\r\n    rws.push({ cells });\r\n  }\r\n  return {\r\n    type: 'table',\r\n    props: {},\r\n    content: {\r\n      type: 'tableContent',\r\n      columnWidths: new Array(cols).fill(null),\r\n      rows: rws,\r\n    },\r\n    children: [],\r\n  };\r\n}\r\n\r\n/** 2\uB2E8 \uCEEC\uB7FC \uBE14\uB85D(\uAC01 \uB2E8\uC5D0 \uBE48 \uBB38\uB2E8). n>2 \uB294 2\uB85C \uD074\uB7A8\uD504(2\uB2E8\uAE4C\uC9C0\uB9CC \uC9C0\uC6D0) */\r\nexport function emptyColumns(n, showDivider) {\r\n  n = Math.min(2, n || 2);\r\n  const cols = [];\r\n  for (let i = 0; i < n; i++)\r\n    cols.push({\r\n      type: 'column',\r\n      props: { width: 1 },\r\n      children: [\r\n        {\r\n          type: 'paragraph',\r\n          props: DEFAULT_BLOCK_PROPS(),\r\n          content: [],\r\n          children: [],\r\n        },\r\n      ],\r\n    });\r\n  return {\r\n    type: 'columnList',\r\n    props: showDivider ? { showDivider: true } : {},\r\n    children: cols,\r\n  };\r\n}\r\n", "/**\r\n * \uC5D0\uB7EC \uD1A0\uC2A4\uD2B8 + LumirEditorError \uC815\uADDC\uD654 \uB9AC\uD3EC\uD130.\r\n * \uBAA8\uB4E0 \uC5D0\uB7EC\uB97C LumirEditorError \uB85C \uC815\uADDC\uD654\uD574 \uCF5C\uBC31(opts.onError)+\uD1A0\uC2A4\uD2B8+\uCF58\uC194\uB85C \uBCF4\uB0B8\uB2E4.\r\n * opts.showErrorToast === false \uC774\uBA74 \uD1A0\uC2A4\uD2B8\uB97C \uD45C\uC2DC\uD558\uC9C0 \uC54A\uB294\uB2E4.\r\n */\r\nimport { LumirEditorError } from '../errors/lumir-error.js';\r\n\r\nexport function createErrorReporter(opts) {\r\n  const toast = document.createElement('div');\r\n  toast.className = 'lumir-error-toast';\r\n  toast.style.display = 'none';\r\n  let toastTimer = 0;\r\n  const userOnError = typeof opts.onError === 'function' ? opts.onError : null;\r\n\r\n  function showToast(msg) {\r\n    if (opts.showErrorToast === false) return;\r\n    toast.textContent = msg;\r\n    toast.style.display = 'block';\r\n    if (toastTimer) clearTimeout(toastTimer);\r\n    toastTimer = setTimeout(() => {\r\n      toast.style.display = 'none';\r\n    }, 4000);\r\n  }\r\n\r\n  function onError(err, code) {\r\n    const e =\r\n      err instanceof LumirEditorError\r\n        ? err\r\n        : LumirEditorError.fromError(\r\n            err instanceof Error ? err : new Error(String(err)),\r\n            code,\r\n          );\r\n    try {\r\n      console.error(e);\r\n    } catch (_) {}\r\n    showToast(e.getUserMessage());\r\n    if (userOnError) {\r\n      try {\r\n        userOnError(e);\r\n      } catch (_) {}\r\n    }\r\n  }\r\n\r\n  function destroy() {\r\n    if (toastTimer) clearTimeout(toastTimer);\r\n    if (toast.parentNode) toast.parentNode.removeChild(toast);\r\n  }\r\n\r\n  return { toastEl: toast, showToast, onError, destroy };\r\n}\r\n", "/**\r\n * \uC5C5\uB85C\uB4DC \uC9C4\uD589\uB960 \uC624\uBC84\uB808\uC774. \uC5C5\uB85C\uB4DC \uC911 \"\uC5C5\uB85C\uB529 n%\"\uB97C \uD45C\uC2DC\uD55C\uB2E4.\r\n * editor \uB294 showProgress(0)\uB85C \uC2DC\uC791, hideProgress()\uB85C \uC885\uB8CC\uD55C\uB2E4.\r\n */\r\nexport function createUploadOverlay(L) {\r\n  const overlay = document.createElement('div');\r\n  overlay.className = 'lumir-upload-overlay';\r\n  overlay.style.display = 'none';\r\n\r\n  function showProgress(p) {\r\n    overlay.style.display = 'flex';\r\n    overlay.textContent =\r\n      typeof p === 'number'\r\n        ? `${L.upload.uploading} ${Math.round(p)}%`\r\n        : L.upload.uploading;\r\n  }\r\n  function hideProgress() {\r\n    overlay.style.display = 'none';\r\n  }\r\n  function destroy() {\r\n    if (overlay.parentNode) overlay.parentNode.removeChild(overlay);\r\n  }\r\n\r\n  return { overlayEl: overlay, showProgress, hideProgress, destroy };\r\n}\r\n", "/**\r\n * editorEl \uB300\uC0C1 DOM \uC870\uC791 \uC720\uD2F8(\uC21C\uC218 \uD568\uC218) \u2014 \uD3B8\uC9D1\uAC00\uB2A5 \uD1A0\uAE00 / \uCEEC\uB7FC \uC815\uADDC\uD654 / \uD45C\uC2DC\uC6A9 URL \uD574\uC11D.\r\n * \uBAA8\uB450 editorEl \uC744 \uC778\uC790\uB85C \uBC1B\uC544 \uC0C1\uD0DC\uB97C \uAC16\uC9C0 \uC54A\uB294\uB2E4(\uD14C\uC2A4\uD2B8\u00B7\uC7AC\uC0AC\uC6A9 \uC6A9\uC774).\r\n */\r\nimport { renderBlock } from '../serialize/document.js';\r\nimport { DEFAULT_BLOCK_PROPS } from './blocks.js';\r\n\r\n/** \uC77D\uAE30\uC804\uC6A9 \uD1A0\uAE00 \u2014 contenteditable \uC744 \uC77C\uAD04 on/off \uD558\uACE0 \uBCF5\uC6D0 \uB9C8\uCEE4\uB97C \uB0A8\uAE34\uB2E4. */\r\nexport function applyEditable(editorEl, on) {\r\n  editorEl.classList.toggle('lumir-readonly', !on);\r\n  if (!on) {\r\n    editorEl.querySelectorAll('[contenteditable=\"true\"]').forEach((el) => {\r\n      el.setAttribute('contenteditable', 'false');\r\n      el.setAttribute('data-was-editable', '1');\r\n    });\r\n  } else {\r\n    editorEl.querySelectorAll('[data-was-editable=\"1\"]').forEach((el) => {\r\n      el.setAttribute('contenteditable', 'true');\r\n      el.removeAttribute('data-was-editable');\r\n    });\r\n  }\r\n}\r\n\r\n/**\r\n * columnList \uC815\uADDC\uD654 \u2014 2\uAC1C \uBBF8\uB9CC\uC740 \uD3BC\uCCD0 \uC81C\uAC70, 2\uAC1C \uCD08\uACFC(3\uB2E8+)\uB294 2\uB2E8\uC73C\uB85C \uBCD1\uD569(2\uB2E8\uAE4C\uC9C0\uB9CC \uC9C0\uC6D0).\r\n */\r\nexport function normalizeColumnsDom(editorEl) {\r\n  editorEl.querySelectorAll('.block[data-type=\"columnList\"]').forEach((cl) => {\r\n    const content = cl.querySelector(':scope > .content');\r\n    const cols = [...cl.querySelectorAll(':scope > .content > .lumir-column')];\r\n    if (cols.length < 2) {\r\n      const frag = document.createDocumentFragment();\r\n      cols.forEach((col) => {\r\n        [...col.children]\r\n          .filter((b) => b.classList && b.classList.contains('block'))\r\n          .forEach((b) => frag.appendChild(b));\r\n      });\r\n      if (!frag.childNodes.length)\r\n        frag.appendChild(\r\n          renderBlock({\r\n            type: 'paragraph',\r\n            props: DEFAULT_BLOCK_PROPS(),\r\n            content: [],\r\n            children: [],\r\n          }),\r\n        );\r\n      cl.replaceWith(frag);\r\n      return;\r\n    }\r\n    if (cols.length > 2 && content) {\r\n      // 3\uB2E8 \uC774\uC0C1: 3\uBC88\uC9F8 \uC774\uD6C4 \uCEEC\uB7FC\uC758 \uBE14\uB85D\uC744 2\uBC88\uC9F8 \uCEEC\uB7FC\uC73C\uB85C \uC774\uB3D9 \uD6C4, \uCD08\uACFC \uCEEC\uB7FC\u00B7\uC5EC\uBD84 \uD578\uB4E4 \uC81C\uAC70.\r\n      const second = cols[1];\r\n      for (let i = 2; i < cols.length; i++) {\r\n        [...cols[i].children]\r\n          .filter((b) => b.classList && b.classList.contains('block'))\r\n          .forEach((b) => second.appendChild(b));\r\n      }\r\n      let node = second.nextSibling;\r\n      while (node) {\r\n        const next = node.nextSibling;\r\n        content.removeChild(node);\r\n        node = next;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * A8: resolveFileUrl \u2014 \uD45C\uC2DC \uC804\uC6A9 URL \uD574\uC11D(\uC778\uC99D \uD1A0\uD070/\uC0AC\uC124 \uC2A4\uD0B4).\r\n * __props.url(\uC6D0\uBCF8)\uC740 \uADF8\uB300\uB85C \uB450\uC5B4 \uC9C1\uB82C\uD654\uC5D0 \uC601\uD5A5\uC744 \uC8FC\uC9C0 \uC54A\uB294\uB2E4.\r\n */\r\nexport function applyResolveFileUrl(editorEl, resolveFileUrl) {\r\n  if (typeof resolveFileUrl !== 'function') return;\r\n  editorEl\r\n    .querySelectorAll(\r\n      '.block[data-type=\"image\"],.block[data-type=\"video\"],.block[data-type=\"audio\"],.block[data-type=\"file\"]',\r\n    )\r\n    .forEach((el) => {\r\n      const props = el.__props || {};\r\n      if (!props.url) return;\r\n      const type = el.dataset.type;\r\n      const setSrc = (resolved) => {\r\n        if (resolved == null || resolved === props.url) return;\r\n        if (type === 'image') {\r\n          const img = el.querySelector('.lumir-image img');\r\n          if (img) img.src = resolved;\r\n          const nc = el.querySelector('.lumir-image-namecard');\r\n          if (nc) nc.href = resolved;\r\n        } else if (type === 'video') {\r\n          const v = el.querySelector('video');\r\n          if (v) v.src = resolved;\r\n        } else if (type === 'audio') {\r\n          const a = el.querySelector('audio');\r\n          if (a) a.src = resolved;\r\n        } else if (type === 'file') {\r\n          const d = el.querySelector('.lf-download');\r\n          if (d) d.href = resolved;\r\n        }\r\n      };\r\n      try {\r\n        Promise.resolve(resolveFileUrl(props.url, { type }))\r\n          .then(setSrc)\r\n          .catch(() => {});\r\n      } catch (_) {}\r\n    });\r\n}\r\n", "/**\r\n * blur \uC120\uD0DD \uD558\uC774\uB77C\uC774\uD2B8 (P9-\u2465) \u2014 CSS Custom Highlight API \uB85C \uD3EC\uCEE4\uC2A4\uAC00 \uBE60\uC838\uB3C4 \uC120\uD0DD \uBC94\uC704\uB97C\r\n * \uACC4\uC18D \uBCF4\uC774\uAC8C \uD55C\uB2E4(\uBBF8\uC9C0\uC6D0 \uD658\uACBD\uC740 \uBB34\uC2DC). editorEl \uC5D0 focusin/focusout \uB9AC\uC2A4\uB108\uB97C \uC790\uCCB4 \uBD80\uCC29\uD55C\uB2E4.\r\n *\r\n *   const hl = createBlurHighlight(editorEl);\r\n *   // selectionchange \uC2DC hl.capture()\r\n *   hl.destroy(); // \uC815\uB9AC\r\n */\r\nexport function createBlurHighlight(editorEl) {\r\n  const HL_NAME = 'lumir-blur-sel';\r\n  const hlSupported =\r\n    typeof CSS !== 'undefined' &&\r\n    CSS.highlights &&\r\n    typeof Highlight !== 'undefined';\r\n  if (\r\n    hlSupported &&\r\n    typeof document !== 'undefined' &&\r\n    document.head &&\r\n    !document.getElementById('lumir-blur-sel-style')\r\n  ) {\r\n    try {\r\n      const st = document.createElement('style');\r\n      st.id = 'lumir-blur-sel-style';\r\n      st.textContent =\r\n        '::highlight(lumir-blur-sel){background:rgba(91,87,214,0.28);}';\r\n      document.head.appendChild(st);\r\n    } catch (_) {}\r\n  }\r\n  let lastSelRange = null;\r\n  function capture() {\r\n    const sel = document.getSelection();\r\n    if (sel && sel.rangeCount) {\r\n      const r = sel.getRangeAt(0);\r\n      if (!r.collapsed) {\r\n        let n = r.startContainer;\r\n        if (n && n.nodeType === 3) n = n.parentNode;\r\n        const c = n && n.closest ? n.closest('.content, td.lumir-cell') : null;\r\n        if (c && editorEl.contains(c)) {\r\n          lastSelRange = r.cloneRange();\r\n          return;\r\n        }\r\n      }\r\n    }\r\n    lastSelRange = null;\r\n  }\r\n  function show() {\r\n    if (hlSupported && lastSelRange) {\r\n      try {\r\n        CSS.highlights.set(HL_NAME, new Highlight(lastSelRange));\r\n      } catch (_) {}\r\n    }\r\n  }\r\n  function clear() {\r\n    if (hlSupported) {\r\n      try {\r\n        CSS.highlights.delete(HL_NAME);\r\n      } catch (_) {}\r\n    }\r\n  }\r\n  const onFocusIn = () => clear();\r\n  const onFocusOut = (e) => {\r\n    if (!editorEl.contains(e.relatedTarget)) show();\r\n  };\r\n  editorEl.addEventListener('focusin', onFocusIn);\r\n  editorEl.addEventListener('focusout', onFocusOut);\r\n\r\n  function destroy() {\r\n    clear();\r\n    editorEl.removeEventListener('focusin', onFocusIn);\r\n    editorEl.removeEventListener('focusout', onFocusOut);\r\n  }\r\n\r\n  return { capture, clear, destroy };\r\n}\r\n", "/**\r\n * \uBBF8\uB514\uC5B4(\uC774\uBBF8\uC9C0/\uBE44\uB514\uC624/\uC624\uB514\uC624) \uC0AD\uC81C \uAC10\uC9C0 \u2014 \uBB38\uC11C \uBCC0\uACBD \uC804\uD6C4 URL \uC9D1\uD569\uC744 \uBE44\uAD50\uD574\r\n * \uC0AC\uB77C\uC9C4 URL \uC744 onImageDelete \uB85C \uD1B5\uC9C0(S3 \uB4F1 \uC678\uBD80 \uC2A4\uD1A0\uB9AC\uC9C0 \uC815\uB9AC\uC6A9).\r\n */\r\n\r\n/**\r\n * \uC0AD\uC81C \uD1B5\uC9C0 \uB300\uC0C1 URL \uC5EC\uBD80. data:/blob:/file:/filesystem: \uC740 \uC11C\uBC84\u00B7\uC678\uBD80 \uC2A4\uD1A0\uB9AC\uC9C0 \uAC1D\uCCB4\uAC00 \uC544\uB2C8\uBBC0\uB85C\r\n * onImageDelete(\u2192 S3 \uC0AD\uC81C \uB4F1) \uB300\uC0C1\uC5D0\uC11C \uC81C\uC678\uD55C\uB2E4. (\uC608: \uBD99\uC5EC\uB123\uAE30 \uC774\uBBF8\uC9C0\uAC00 data:\u2192\uC11C\uBC84 URL \uB85C \uC2B9\uACA9\uB420 \uB54C\r\n * \uC61B data: URL \uC774 \"\uC0AD\uC81C\uB428\"\uC73C\uB85C \uC624\uD0D0\uB418\uC5B4 \uAC70\uB300\uD55C data: \uBB38\uC790\uC5F4\uB85C \uC0AD\uC81C API \uB97C \uD638\uCD9C\uD558\uB294 \uBB38\uC81C \uBC29\uC9C0)\r\n */\r\nexport function isDeletableMediaUrl(url) {\r\n  return !/^(?:data:|blob:|file:|filesystem:)/i.test(String(url || '').trim());\r\n}\r\n\r\n/** blocks \uD2B8\uB9AC\uC5D0\uC11C \uBBF8\uB514\uC5B4 url \uC744 \uC7AC\uADC0 \uC218\uC9D1(\uC0AD\uC81C \uB300\uC0C1 \uC2A4\uD0B4\uB9CC) */\r\nexport function collectMediaUrls(blocks, set) {\r\n  for (const b of blocks || []) {\r\n    if (\r\n      b &&\r\n      (b.type === 'image' || b.type === 'video' || b.type === 'audio') &&\r\n      b.props &&\r\n      b.props.url &&\r\n      isDeletableMediaUrl(b.props.url)\r\n    )\r\n      set.add(b.props.url);\r\n    if (b && Array.isArray(b.children)) collectMediaUrls(b.children, set);\r\n  }\r\n  return set;\r\n}\r\n\r\n/**\r\n * \uC0AD\uC81C \uAC10\uC9C0\uAE30 \uC0DD\uC131. detect(doc) \uD638\uCD9C\uB9C8\uB2E4 \uC9C1\uC804 \uC2A4\uB0C5\uC0F7\uACFC \uBE44\uAD50\uD574 \uC0AC\uB77C\uC9C4 url \uC744 \uCF5C\uBC31.\r\n */\r\nexport function createMediaDeletionDetector(onImageDelete, initialBlocks) {\r\n  let prev = collectMediaUrls(initialBlocks || [], new Set());\r\n  return function detect(doc) {\r\n    const cur = collectMediaUrls(doc, new Set());\r\n    if (onImageDelete) for (const u of prev) if (!cur.has(u)) onImageDelete(u);\r\n    prev = cur;\r\n  };\r\n}\r\n", "/**\r\n * undo/redo \uD788\uC2A4\uD1A0\uB9AC \u2014 JSON \uC2A4\uB0C5\uC0F7 \uC2A4\uD0DD. \uC2A4\uB0C5\uC0F7 \uBC30\uC5F4/\uD3EC\uC778\uD130\uB9CC \uC18C\uC720\uD558\uACE0,\r\n * DOM \uBCF5\uC6D0(restore)\uACFC \uBCC0\uACBD \uC54C\uB9BC(fireChange)\uC740 \uC8FC\uC785\uBC1B\uC544 editor \uC218\uBA85\uC8FC\uAE30\uC640 \uBD84\uB9AC\uD55C\uB2E4.\r\n *\r\n *   const hist = createHistory({ getDocument, restore, fireChange });\r\n *   hist.commit();               // \uD604\uC7AC \uBB38\uC11C\uB97C 1\uC2A4\uD15D\uC73C\uB85C(\uB3D9\uC77C \uC2A4\uB0C5\uC0F7\uC740 \uCF54\uC5BC\uB808\uC2F1)\r\n *   hist.undo(); hist.redo();    // \uBCF5\uC6D0 + \uC54C\uB9BC\r\n *   hist.canUndo(); hist.canRedo();\r\n */\r\nexport function createHistory({ getDocument, restore, fireChange }) {\r\n  let history = [];\r\n  let index = -1;\r\n  const eq = (a, b) => JSON.stringify(a) === JSON.stringify(b);\r\n\r\n  function commit() {\r\n    const snap = getDocument();\r\n    if (index >= 0 && eq(history[index], snap)) return false;\r\n    history = history.slice(0, index + 1);\r\n    history.push(snap);\r\n    index = history.length - 1;\r\n    return true;\r\n  }\r\n  function undo() {\r\n    if (index > 0) {\r\n      index--;\r\n      restore(history[index]);\r\n      fireChange();\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  function redo() {\r\n    if (index < history.length - 1) {\r\n      index++;\r\n      restore(history[index]);\r\n      fireChange();\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  return {\r\n    commit,\r\n    undo,\r\n    redo,\r\n    canUndo: () => index > 0,\r\n    canRedo: () => index < history.length - 1,\r\n  };\r\n}\r\n", "/**\r\n * placeholder(\uBE48 \uBE14\uB85D \uC548\uB0B4 \uD14D\uC2A4\uD2B8) + \uD3EC\uCEE4\uC2A4 \uCEE8\uD150\uCE20 \uD310\uBCC4.\r\n * editable \uC740 \uB7F0\uD0C0\uC784\uC5D0 \uBC14\uB00C\uBBC0\uB85C getEditable() \uB85C \uD604\uC7AC\uAC12\uC744 \uC77D\uB294\uB2E4.\r\n *\r\n *   const ph = createPlaceholders({ editorEl, getEditable, placeholderText });\r\n *   ph.refresh();            // \uBE48 \uBE14\uB85D\uC5D0 data-ph \uD45C\uAE30 \uAC31\uC2E0\r\n *   ph.focusedContent();     // \uD604\uC7AC \uCEE4\uC11C\uAC00 \uB193\uC778 .content(\uC5D0\uB514\uD130 \uB0B4\uBD80)\r\n */\r\nconst PLACEHOLDER_TYPES = new Set([\r\n  'paragraph',\r\n  'heading',\r\n  'bulletListItem',\r\n  'numberedListItem',\r\n  'checkListItem',\r\n  'quote',\r\n]);\r\n\r\nexport function createPlaceholders({ editorEl, getEditable, placeholderText }) {\r\n  function focusedContent() {\r\n    const sel = document.getSelection();\r\n    if (!sel || !sel.rangeCount) return null;\r\n    let n = sel.anchorNode;\r\n    if (n && n.nodeType === 3) n = n.parentNode;\r\n    const c = n && n.closest ? n.closest('.content') : null;\r\n    return c && editorEl.contains(c) ? c : null;\r\n  }\r\n  function isEmptyContent(c) {\r\n    return (\r\n      c &&\r\n      !c.querySelector('img,video,table,iframe,.lumir-image,.lumir-video') &&\r\n      c.textContent.replace(/\u200B/g, '').trim() === ''\r\n    );\r\n  }\r\n  function refresh() {\r\n    if (!placeholderText) return;\r\n    const blocks = [...editorEl.children].filter(\r\n      (b) => b.classList && b.classList.contains('block'),\r\n    );\r\n    const focused = focusedContent();\r\n    blocks.forEach((b, i) => {\r\n      const c = b.querySelector(':scope > .content');\r\n      if (!c) return;\r\n      const show =\r\n        getEditable() &&\r\n        PLACEHOLDER_TYPES.has(b.dataset.type) &&\r\n        isEmptyContent(c) &&\r\n        (c === focused || (i === 0 && !focused));\r\n      if (show) {\r\n        c.setAttribute('data-empty', 'true');\r\n        c.setAttribute('data-ph', placeholderText);\r\n      } else {\r\n        c.removeAttribute('data-empty');\r\n      }\r\n    });\r\n  }\r\n\r\n  return { refresh, focusedContent, isEmptyContent };\r\n}\r\n", "/**\r\n * \uCE90\uB7FF \uB0B4\uBE44\uAC8C\uC774\uC158 (\uBC29\uD5A5\uD0A4) \u2014 \uBE14\uB85D \uAC04 \uC774\uB3D9 + \uC778\uB77C\uC778 \uCF54\uB4DC \uD0C8\uCD9C.\r\n *\r\n * \uBC30\uACBD: \uAC01 \uBE14\uB85D\uC758 `.content`\uAC00 **\uB3C5\uB9BD contenteditable \uC12C**\uC774\uB77C \uB124\uC774\uD2F0\uBE0C \uBC29\uD5A5\uD0A4\uB294\r\n *   \uBE14\uB85D \uACBD\uACC4\uB97C \uB118\uC9C0 \uBABB\uD55C\uB2E4(\uD55C \uBE14\uB85D \uC548\uC5D0 \uCE90\uB7FF\uC774 \uAC07\uD798). \uC774 \uBAA8\uB4C8\uC774 \uACBD\uACC4\uC5D0\uC11C \uC778\uC811 \uBE14\uB85D\uC73C\uB85C\r\n *   \uCE90\uB7FF\uC744 \uB118\uAE34\uB2E4.\r\n *\r\n *  - ArrowLeft(\uBE14\uB85D \uC2DC\uC791\u00B7collapsed)  \u2192 \uC774\uC804 \uD3B8\uC9D1\uC601\uC5ED \uB05D\r\n *  - ArrowRight(\uBE14\uB85D \uB05D\u00B7collapsed)   \u2192 \uB2E4\uC74C \uD3B8\uC9D1\uC601\uC5ED \uC2DC\uC791\r\n *  - ArrowUp(\uCCAB \uC904)                  \u2192 \uC774\uC804 \uD3B8\uC9D1\uC601\uC5ED \uB9C8\uC9C0\uB9C9 \uC904(\uAC00\uB85C \uC704\uCE58 \uBCF4\uC874)\r\n *  - ArrowDown(\uB9C8\uC9C0\uB9C9 \uC904)            \u2192 \uB2E4\uC74C \uD3B8\uC9D1\uC601\uC5ED \uCCAB \uC904(\uAC00\uB85C \uC704\uCE58 \uBCF4\uC874)\r\n *  - \uC778\uB77C\uC778 \uCF54\uB4DC \uD0C8\uCD9C: \uCF54\uB4DC \uB05D\uC5D0\uC11C ArrowRight / \uCF54\uB4DC \uC2DC\uC791\uC5D0\uC11C ArrowLeft \u2192 \uCF54\uB4DC \uBC16\uC73C\uB85C,\r\n *    \uCF54\uB4DC \uB05D\uC5D0\uC11C \uC2A4\uD398\uC774\uC2A4 2\uBC88(\uC9C1\uC804 \uBB38\uC790\uB3C4 \uC2A4\uD398\uC774\uC2A4) \u2192 \uCF54\uB4DC \uBC16 \uACF5\uBC31 1\uAC1C + \uCE90\uB7FF \uD0C8\uCD9C.\r\n *\r\n * \uD45C \uC140(.lumir-tbl \uB0B4\uBD80)\uC740 table-controls\uAC00 \uC790\uCCB4 \uBC29\uD5A5\uD0A4\uB97C \uC18C\uC720\uD558\uBBC0\uB85C \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\r\n * \uB808\uC774\uC544\uC6C3 \uC815\uBCF4(getClientRects)\uAC00 \uC5C6\uB294 \uD658\uACBD(jsdom \uB4F1)\uC5D0\uC11C\uB294 \uB2E8\uC77C \uC904\uB85C \uAC04\uC8FC\uD574 \uC774\uB3D9\uC744 \uD5C8\uC6A9\uD55C\uB2E4.\r\n */\r\n\r\nfunction setRange(range) {\r\n  const s = window.getSelection();\r\n  if (!s) return;\r\n  s.removeAllRanges();\r\n  s.addRange(range);\r\n}\r\nfunction focusStart(content) {\r\n  content.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  r.collapse(true);\r\n  setRange(r);\r\n}\r\nfunction focusEnd(content) {\r\n  content.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  r.collapse(false);\r\n  setRange(r);\r\n}\r\n\r\n/** el \uB0B4\uC6A9 \uAE30\uC900 \uCE90\uB7FF\uC774 \uC2DC\uC791(\uB05D)\uC778\uC9C0 \u2014 \uB808\uC774\uC544\uC6C3 \uBE44\uC758\uC874(\uC624\uD504\uC14B \uAE30\uBC18) */\r\nfunction atStartOf(el, range) {\r\n  const r = range.cloneRange();\r\n  r.selectNodeContents(el);\r\n  r.setEnd(range.startContainer, range.startOffset);\r\n  return r.toString().length === 0;\r\n}\r\nfunction atEndOf(el, range) {\r\n  const r = range.cloneRange();\r\n  r.selectNodeContents(el);\r\n  r.setStart(range.endContainer, range.endOffset);\r\n  return r.toString().length === 0;\r\n}\r\n\r\nconst ZWSP = \"\u200B\"; // \uCF54\uB4DC \uBC16 \uCE90\uB7FF \uC575\uCEE4(\uC9C1\uB82C\uD654\uC5D0\uC11C \uC81C\uAC70) \u2014 \uBE48 \uD14D\uC2A4\uD2B8 \uB178\uB4DC\uB294 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uCF54\uB4DC\uB85C \uC7AC\uD761\uC218\uD568\r\n\r\n/** \uCF54\uB4DC \uB05D\uC5D0\uC11C \uC624\uB978\uCABD \uD0C8\uCD9C \u2014 \uCF54\uB4DC \uBC16 \uD3C9\uBB38 \uC704\uCE58\uB85C \uCE90\uB7FF \uC774\uB3D9. \uBC18\uD658: DOM \uBCC0\uACBD \uC5EC\uBD80 */\r\nfunction escapeCodeRight(code) {\r\n  const after = code.nextSibling;\r\n  if (after && after.nodeType === 3) {\r\n    const r = document.createRange();\r\n    r.setStart(after, 0);\r\n    r.collapse(true);\r\n    setRange(r);\r\n    return false;\r\n  }\r\n  const zwsp = document.createTextNode(ZWSP);\r\n  code.parentNode.insertBefore(zwsp, code.nextSibling);\r\n  const r = document.createRange();\r\n  r.setStart(zwsp, 1);\r\n  r.collapse(true);\r\n  setRange(r);\r\n  return true;\r\n}\r\n/** \uCF54\uB4DC \uC2DC\uC791\uC5D0\uC11C \uC67C\uCABD \uD0C8\uCD9C \u2014 \uCF54\uB4DC \uBC16 \uD3C9\uBB38 \uC704\uCE58\uB85C \uCE90\uB7FF \uC774\uB3D9. \uBC18\uD658: DOM \uBCC0\uACBD \uC5EC\uBD80 */\r\nfunction escapeCodeLeft(code) {\r\n  const before = code.previousSibling;\r\n  if (before && before.nodeType === 3) {\r\n    const r = document.createRange();\r\n    r.setStart(before, before.length);\r\n    r.collapse(true);\r\n    setRange(r);\r\n    return false;\r\n  }\r\n  const zwsp = document.createTextNode(ZWSP);\r\n  code.parentNode.insertBefore(zwsp, code);\r\n  const r = document.createRange();\r\n  r.setStart(zwsp, 0);\r\n  r.collapse(true);\r\n  setRange(r);\r\n  return true;\r\n}\r\n\r\n/** content \uC548\uC5D0\uC11C \uCE90\uB7FF\uC744 \uAC10\uC2F8\uB294 <code> \uC694\uC18C(\uC5C6\uC73C\uBA74 null) */\r\nfunction enclosingCode(node, content) {\r\n  let el = node && node.nodeType === 1 ? node : node && node.parentNode;\r\n  while (el && el !== content) {\r\n    if (el.tagName && el.tagName.toLowerCase() === \"code\") return el;\r\n    el = el.parentNode;\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * \uD3B8\uC9D1 \uAC00\uB2A5\uD55C \uC601\uC5ED \uBAA9\uB85D(\uBB38\uC11C \uC21C\uC11C) \u2014 \uD14D\uC2A4\uD2B8 \uBE14\uB85D .content + \uD45C \uC140.\r\n * \uD45C \uC140\uC744 \uD3EC\uD568\uD574 \uC778\uC811 \uBE14\uB85D\uC5D0\uC11C \uBC29\uD5A5\uD0A4\uB85C \uD45C\uC5D0 \uC9C4\uC785\uD560 \uC218 \uC788\uAC8C \uD55C\uB2E4(\uD45C \uB0B4\uBD80 \uC774\uB3D9\uC740 table-controls \uC18C\uAD00 \u2014\r\n * caret-nav\uB294 .lumir-tbl \uC548\uC5D0\uC11C\uB294 \uAD00\uC5EC\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uCDA9\uB3CC \uC5C6\uC74C).\r\n */\r\nexport function editableContents(editorEl) {\r\n  return [...editorEl.querySelectorAll('.content[contenteditable=\"true\"], td.lumir-cell[contenteditable=\"true\"]')];\r\n}\r\n\r\n// ---- \uB808\uC774\uC544\uC6C3(\uC904) \uD310\uC815 ----\r\n/**\r\n * \uCE90\uB7FF rect \u2014 collapsed \uCE90\uB7FF\uC740 \uBE0C\uB77C\uC6B0\uC800\uBCC4\uB85C getClientRects/getBoundingClientRect\uAC00 0\uC744 \uC8FC\uBBC0\uB85C,\r\n * \uC2E4\uD328 \uC2DC **\uC778\uC811 \uD55C \uAE00\uC790 \uBC94\uC704**\uB85C \uD655\uC7A5\uD574 \uC2E4\uC81C \uC904 rect\uB97C \uD655\uBCF4\uD55C\uB2E4(\uCF54\uB4DC\uBE14\uB85D \uCCAB/\uB9C8\uC9C0\uB9C9 \uC904 \uD310\uC815 \uC2E0\uB8B0\uC131).\r\n */\r\nfunction caretRect(range) {\r\n  const rects = range.getClientRects && range.getClientRects();\r\n  if (rects && rects.length) {\r\n    const r = rects[rects.length - 1];\r\n    if (r && r.height) return r;\r\n  }\r\n  const b = range.getBoundingClientRect && range.getBoundingClientRect();\r\n  if (b && b.height) return b;\r\n  const node = range.endContainer;\r\n  if (node && node.nodeType === 3) {\r\n    const off = range.endOffset;\r\n    try {\r\n      const p = document.createRange();\r\n      if (off < node.nodeValue.length) { p.setStart(node, off); p.setEnd(node, off + 1); }\r\n      else if (off > 0) { p.setStart(node, off - 1); p.setEnd(node, off); }\r\n      else return null;\r\n      const pr = p.getClientRects();\r\n      if (pr && pr.length && pr[0].height) return pr[0];\r\n      const pb = p.getBoundingClientRect();\r\n      if (pb && pb.height) return pb;\r\n    } catch (_) {}\r\n  }\r\n  return null;\r\n}\r\n/** content \uC548\uC5D0\uC11C \uCE90\uB7FF \uC55E(before=true)/\uB4A4\uC5D0 \uC904\uBC14\uAFC8(\"\\n\"\u00B7<br>)\uC774 \uC5C6\uB098 \u2014 \uB808\uC774\uC544\uC6C3 \uC5C6\uC744 \uB54C \uCCAB/\uB9C8\uC9C0\uB9C9 \uC904 \uD3F4\uBC31 */\r\nfunction noBreak(content, range, before) {\r\n  const r = range.cloneRange();\r\n  r.selectNodeContents(content);\r\n  if (before) r.setEnd(range.startContainer, range.startOffset);\r\n  else r.setStart(range.endContainer, range.endOffset);\r\n  const frag = r.cloneContents();\r\n  return !/\\n/.test(frag.textContent || \"\") && !frag.querySelector(\"br\");\r\n}\r\n/** content \uC2DC\uC791/\uB05D \uC9C0\uC810\uC758 \uCE90\uB7FF rect(\uCCAB/\uB9C8\uC9C0\uB9C9 \uC2DC\uAC01 \uC904 \uAE30\uC900) \u2014 box\uAC00 \uC544\uB2CC \uCE90\uB7FF \uC704\uCE58\uB77C padding \uBB34\uAD00 */\r\nfunction edgeCaretRect(content, atStart) {\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  r.collapse(atStart);\r\n  return caretRect(r);\r\n}\r\nfunction atFirstVisualLine(content, range) {\r\n  const cr = caretRect(range);\r\n  const ref = cr && cr.height ? edgeCaretRect(content, true) : null;\r\n  // padding \uBB34\uAD00\uD558\uB3C4\uB85D box\uAC00 \uC544\uB2CC \uCCAB \uC904 \uCE90\uB7FF top\uACFC \uBE44\uAD50(\uB808\uC774\uC544\uC6C3 \uC5C6\uC73C\uBA74 \uCE90\uB7FF \uC55E \uC904\uBC14\uAFC8 \uC720\uBB34\uB85C \uD3F4\uBC31)\r\n  if (cr && cr.height && ref && ref.height) return Math.abs(cr.top - ref.top) < Math.max(4, cr.height * 0.5);\r\n  return noBreak(content, range, true);\r\n}\r\nfunction atLastVisualLine(content, range) {\r\n  const cr = caretRect(range);\r\n  const ref = cr && cr.height ? edgeCaretRect(content, false) : null;\r\n  if (cr && cr.height && ref && ref.height) return Math.abs(cr.bottom - ref.bottom) < Math.max(4, cr.height * 0.5);\r\n  return noBreak(content, range, false);\r\n}\r\n\r\nexport function caretRangeFromPoint(x, y, within) {\r\n  let range = null;\r\n  if (typeof document.caretRangeFromPoint === \"function\") {\r\n    range = document.caretRangeFromPoint(x, y);\r\n  } else if (typeof document.caretPositionFromPoint === \"function\") {\r\n    const pos = document.caretPositionFromPoint(x, y);\r\n    if (pos) {\r\n      range = document.createRange();\r\n      range.setStart(pos.offsetNode, pos.offset);\r\n      range.collapse(true);\r\n    }\r\n  }\r\n  if (range && within && !within.contains(range.startContainer)) return null;\r\n  return range;\r\n}\r\n\r\n/** \uC138\uB85C \uC774\uB3D9: \uB300\uC0C1 \uD3B8\uC9D1\uC601\uC5ED\uC5D0 x \uC88C\uD45C\uB97C \uBCF4\uC874\uD574 \uCE90\uB7FF \uBC30\uCE58(\uB808\uC774\uC544\uC6C3 \uC5C6\uC73C\uBA74 \uC2DC\uC791/\uB05D) */\r\nfunction placeVertical(target, x, fromTop) {\r\n  target.focus();\r\n  const box = target.getBoundingClientRect && target.getBoundingClientRect();\r\n  if (box && (box.width || box.height) && typeof x === \"number\") {\r\n    const y = fromTop ? box.top + Math.min(8, box.height / 2) : box.bottom - Math.min(8, box.height / 2);\r\n    const r = caretRangeFromPoint(x, y, target);\r\n    if (r) {\r\n      setRange(r);\r\n      return;\r\n    }\r\n  }\r\n  if (fromTop) focusStart(target);\r\n  else focusEnd(target);\r\n}\r\n\r\nexport function attachCaretNav(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const onChange = typeof opts.onChange === \"function\" ? opts.onChange : () => {};\r\n\r\n  function onKeydown(e) {\r\n    if (e.isComposing || isComposing()) return; // IME \uAC00\uB4DC\r\n    if (e.metaKey || e.ctrlKey || e.altKey) return; // \uC870\uD569\uD0A4\uB294 \uB2E4\uB978 \uD578\uB4E4\uB7EC \uC18C\uAD00\r\n    const key = e.key;\r\n    if (key !== \"ArrowLeft\" && key !== \"ArrowRight\" && key !== \"ArrowUp\" && key !== \"ArrowDown\" && key !== \" \" && key !== \"Spacebar\") return;\r\n\r\n    // \uD45C \uC140\uC740 table-controls\uAC00 \uBC29\uD5A5\uD0A4 \uC18C\uC720\r\n    if (e.target.closest && e.target.closest(\".lumir-tbl\")) return;\r\n    const content = e.target.closest && e.target.closest('.content[contenteditable=\"true\"]');\r\n    if (!content || !editorEl.contains(content)) return;\r\n\r\n    const sel = window.getSelection();\r\n    if (!sel || !sel.rangeCount) return;\r\n    const range = sel.getRangeAt(0);\r\n\r\n    // --- \uC778\uB77C\uC778 \uCF54\uB4DC \uD0C8\uCD9C ---\r\n    const code = range.collapsed ? enclosingCode(range.endContainer, content) : null;\r\n    if (code) {\r\n      // \uC2A4\uD398\uC774\uC2A4\uB85C \uCF54\uB4DC \uD0C8\uCD9C \u2014 \"\uBE60\uB974\uAC8C 2\uBC88\"(\uCF54\uB4DC \uB05D\uC5D0\uC11C):\r\n      //  \u00B7 1\uBC88\uC9F8: \uCF54\uB4DC \uC548\uC5D0 \uC9C1\uC811 \uC0BD\uC785(\uBE0C\uB77C\uC6B0\uC800\uAC00 \uCF54\uB4DC \uBC16\uC73C\uB85C \uBE7C\uB294 \uAC83 \uBC29\uC9C0 \u2192 2\uBC88\uC9F8 \uAC10\uC9C0 \uBCF4\uC7A5)\r\n      //  \u00B7 2\uBC88\uC9F8(\uC9C1\uC804\uC774 \uACF5\uBC31): \uCF54\uB4DC \uBC16\uC73C\uB85C \uD0C8\uCD9C(\uCF54\uB4DC \uB0B4 \uD6C4\uD589 \uACF5\uBC31 \uC81C\uAC70, \uBC16\uC5D0 \uACF5\uBC31 1\uAC1C, \uCE90\uB7FF \uC774\uB3D9)\r\n      if ((key === \" \" || key === \"Spacebar\") && atEndOf(code, range)) {\r\n        e.preventDefault();\r\n        const node = range.endContainer;\r\n        const prevSpace =\r\n          node.nodeType === 3 && range.endOffset > 0 && node.nodeValue[range.endOffset - 1] === \" \";\r\n        if (prevSpace) {\r\n          node.nodeValue = node.nodeValue.slice(0, range.endOffset - 1) + node.nodeValue.slice(range.endOffset);\r\n          if (node.nodeValue === \"\") node.remove();\r\n          const spaceNode = document.createTextNode(\" \");\r\n          code.parentNode.insertBefore(spaceNode, code.nextSibling);\r\n          const r = document.createRange();\r\n          r.setStart(spaceNode, 1);\r\n          r.collapse(true);\r\n          setRange(r);\r\n        } else {\r\n          const r = range.cloneRange();\r\n          const sp = document.createTextNode(\" \");\r\n          r.insertNode(sp);\r\n          const r2 = document.createRange();\r\n          r2.setStart(sp, 1);\r\n          r2.collapse(true);\r\n          setRange(r2);\r\n        }\r\n        onChange();\r\n        return;\r\n      }\r\n      if (key === \"ArrowRight\" && atEndOf(code, range)) {\r\n        e.preventDefault();\r\n        escapeCodeRight(code); // \uCF54\uB4DC \uBC16 \uD3C9\uBB38 \uC704\uCE58\uB85C(\uAC19\uC740 \uBE14\uB85D\uC5D0\uC11C \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uC774\uC5B4\uC4F0\uAE30)\r\n        return;\r\n      }\r\n      if (key === \"ArrowLeft\" && atStartOf(code, range)) {\r\n        e.preventDefault();\r\n        escapeCodeLeft(code);\r\n        return;\r\n      }\r\n    }\r\n\r\n    if (key === \" \" || key === \"Spacebar\") return; // \uCF54\uB4DC \uBC16 \uC2A4\uD398\uC774\uC2A4\uB294 \uB124\uC774\uD2F0\uBE0C\r\n    if (!range.collapsed) return; // \uC120\uD0DD \uC0C1\uD0DC\uC758 \uBC29\uD5A5\uD0A4\uB294 \uB124\uC774\uD2F0\uBE0C(\uC120\uD0DD \uC811\uAE30)\r\n\r\n    const list = editableContents(editorEl);\r\n    const i = list.indexOf(content);\r\n    if (i < 0) return;\r\n    const prev = list[i - 1] || null;\r\n    const next = list[i + 1] || null;\r\n\r\n    if (key === \"ArrowLeft\") {\r\n      if (atStartOf(content, range) && prev) {\r\n        e.preventDefault();\r\n        focusEnd(prev);\r\n      }\r\n      return;\r\n    }\r\n    if (key === \"ArrowRight\") {\r\n      if (atEndOf(content, range) && next) {\r\n        e.preventDefault();\r\n        focusStart(next);\r\n      }\r\n      return;\r\n    }\r\n    if (key === \"ArrowUp\") {\r\n      if (atFirstVisualLine(content, range) && prev) {\r\n        e.preventDefault();\r\n        const cr = caretRect(range);\r\n        placeVertical(prev, cr ? cr.left : undefined, false);\r\n      }\r\n      return;\r\n    }\r\n    if (key === \"ArrowDown\") {\r\n      if (atLastVisualLine(content, range) && next) {\r\n        e.preventDefault();\r\n        const cr = caretRect(range);\r\n        placeVertical(next, cr ? cr.left : undefined, true);\r\n      }\r\n      return;\r\n    }\r\n  }\r\n\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  return () => editorEl.removeEventListener(\"keydown\", onKeydown);\r\n}\r\n", "/**\r\n * \uC804\uCCB4 \uC120\uD0DD(Ctrl/Cmd+A) \u2014 \uB2E8\uACC4 \uC120\uD0DD + \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC.\r\n *\r\n * \uAC01 \uBE14\uB85D\uC774 \uB3C5\uB9BD contenteditable \uC12C\uC774\uB77C \uB124\uC774\uD2F0\uBE0C Ctrl+A\uB294 \uD604\uC7AC \uBE14\uB85D \uD14D\uC2A4\uD2B8\uB9CC \uC7A1\uB294\uB2E4.\r\n * BlockNote \uC815\uD569 \uB3D9\uC791:\r\n *   1\uB2E8\uACC4: \uD604\uC7AC \uBE14\uB85D \uD14D\uC2A4\uD2B8 \uC804\uCCB4 \uC120\uD0DD(\uC544\uC9C1 \uC804\uCCB4\uAC00 \uC544\uB2C8\uBA74)\r\n *   2\uB2E8\uACC4: \uC774\uBBF8 \uBE14\uB85D \uC804\uCCB4\uAC00 \uC120\uD0DD\uB3FC \uC788\uC73C\uBA74 \u2192 \uBB38\uC11C\uC758 \uBAA8\uB4E0 \uCD5C\uC0C1\uC704 \uBE14\uB85D \uC120\uD0DD(\uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC)\r\n *\r\n * \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC\uC5D0\uC11C:\r\n *   - Backspace/Delete \u2192 \uC120\uD0DD \uBE14\uB85D \uC0AD\uC81C(\uBE48 \uBB38\uB2E8 1\uAC1C \uB0A8\uAE40)\r\n *   - \uC778\uC1C4 \uAC00\uB2A5\uD55C \uBB38\uC790 \u2192 \uC120\uD0DD \uBE14\uB85D \uC0AD\uC81C \uD6C4 \uBE48 \uBB38\uB2E8\uC5D0\uC11C \uC785\uB825 \uC774\uC5B4\uAC00\uAE30\r\n *   - Ctrl/Cmd+C\u00B7X \u2192 \uC120\uD0DD \uBE14\uB85D \uBCF5\uC0AC/\uC798\uB77C\uB0B4\uAE30(text/html + text/plain)\r\n *   - \uBC29\uD5A5\uD0A4/Escape \u2192 \uBAA8\uB4DC \uD574\uC81C(\uCE90\uB7FF \uBC30\uCE58)\r\n *   - Ctrl/Cmd+Z\u00B7Y \u2192 \uBAA8\uB4DC \uD574\uC81C \uD6C4 \uC804\uC5ED undo/redo\uC5D0 \uC704\uC784\r\n *   - \uC5D0\uB514\uD130 \uB0B4 mousedown \u2192 \uBAA8\uB4DC \uD574\uC81C\r\n *\r\n * \uD45C \uC140 \uB0B4\uBD80 Ctrl+A\uB294 table-controls\uAC00 \uC18C\uC720\uD558\uBBC0\uB85C \uAD00\uC5EC\uD558\uC9C0 \uC54A\uB294\uB2E4.\r\n */\r\n\r\nconst SELECTED_CLASS = \"ml-block-selected\";\r\n\r\n/**\r\n * \uB2E4\uC911 \uBE14\uB85D \uBB34\uC190\uC2E4 \uD074\uB9BD\uBCF4\uB4DC MIME \u2014 \uC120\uD0DD \uBE14\uB85D\uC758 \uC6D0\uBCF8 JSON(\uC800\uC7A5 \uD3FC)\uC744 \uC2E4\uC5B4 \uC790\uAE30-\uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC744 \uBCF4\uC7A5.\r\n * (side-menu \uB4DC\uB798\uADF8 \uB9C8\uCEE4 `application/x-lumir-block`(\uB2E8\uC218)\uACFC \uD63C\uB3D9 \uBC29\uC9C0 \uC704\uD574 \uBA85\uD655\uD788 \uAD6C\uBD84\uB418\uB294 \uC774\uB984 \uC0AC\uC6A9)\r\n */\r\nexport const LUMIR_BLOCK_COPY_MIME = \"application/x-lumir-block-copy\";\r\n\r\n/**\r\n * \uBB34\uC190\uC2E4 JSON\uC744 text/html \uB798\uD37C\uC758 data \uC18D\uC131\uC5D0 \uC784\uBCA0\uB4DC.\r\n * (\uBE44\uB3D9\uAE30 Clipboard API\uB294 \uCEE4\uC2A4\uD140 MIME\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C html\uB85C \uC6B4\uBC18; \uBD99\uC5EC\uB123\uAE30 \uC2DC \uD68C\uC218)\r\n */\r\nexport function embedBlocksInHtml(json, html) {\r\n  return `<div data-lumir-block-copy=\"${encodeURIComponent(json)}\">${html}</div>`;\r\n}\r\n\r\nfunction topLevelBlocks(editorEl) {\r\n  return [...editorEl.children].filter((c) => c.classList && c.classList.contains(\"block\"));\r\n}\r\nfunction contentOf(blockEl) {\r\n  return blockEl.querySelector(\":scope > .content\") || blockEl.querySelector(\".content\");\r\n}\r\nfunction focusStart(content) {\r\n  if (!content) return;\r\n  content.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  r.collapse(true);\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\nfunction focusEnd(content) {\r\n  if (!content) return;\r\n  content.focus();\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  r.collapse(false);\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\n\r\n/** \uD604\uC7AC \uC120\uD0DD\uC774 content \uD14D\uC2A4\uD2B8 \uC804\uCCB4\uB97C \uB36E\uB294\uC9C0(\uC591\uB05D \uC5EC\uBC31 \uC5C6\uC74C) */\r\nfunction isWholeContentSelected(content) {\r\n  const sel = window.getSelection();\r\n  if (!sel || !sel.rangeCount) return false;\r\n  const r = sel.getRangeAt(0);\r\n  if (r.collapsed) return false;\r\n  if (!content.contains(r.startContainer) || !content.contains(r.endContainer)) return false;\r\n  const pre = r.cloneRange();\r\n  pre.selectNodeContents(content);\r\n  pre.setEnd(r.startContainer, r.startOffset);\r\n  const post = r.cloneRange();\r\n  post.selectNodeContents(content);\r\n  post.setStart(r.endContainer, r.endOffset);\r\n  const empty = (content.textContent || \"\").length === 0;\r\n  return empty || (pre.toString() === \"\" && post.toString() === \"\");\r\n}\r\n\r\nfunction selectWholeContent(content) {\r\n  const r = document.createRange();\r\n  r.selectNodeContents(content);\r\n  const s = window.getSelection();\r\n  s.removeAllRanges();\r\n  s.addRange(r);\r\n}\r\n\r\nexport function attachBlockSelect(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isEditable = typeof opts.isEditable === \"function\" ? opts.isEditable : () => true;\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const getDocument = opts.getDocument || (() => []);\r\n  const htmlOf = opts.htmlOf || (() => \"\");\r\n  const textOf = opts.textOf || (() => \"\");\r\n  const jsonOf = typeof opts.jsonOf === \"function\" ? opts.jsonOf : () => \"\";\r\n  const makeParagraphEl = opts.makeParagraphEl || (() => null);\r\n  const commitChange = typeof opts.commitChange === \"function\" ? opts.commitChange : () => {};\r\n\r\n  let selected = []; // \uC120\uD0DD\uB41C \uCD5C\uC0C1\uC704 \uBE14\uB85D \uC694\uC18C\uB4E4\r\n  let active = false;\r\n\r\n  function clear() {\r\n    for (const b of selected) b.classList.remove(SELECTED_CLASS);\r\n    selected = [];\r\n    active = false;\r\n  }\r\n\r\n  function selectAllBlocks() {\r\n    clear();\r\n    selected = topLevelBlocks(editorEl);\r\n    if (!selected.length) return;\r\n    for (const b of selected) b.classList.add(SELECTED_CLASS);\r\n    active = true;\r\n    const sel = window.getSelection(); // \uB124\uC774\uD2F0\uBE0C \uD14D\uC2A4\uD2B8 \uD558\uC774\uB77C\uC774\uD2B8\uB294 \uC811\uC5B4 \uBE14\uB85D \uD558\uC774\uB77C\uC774\uD2B8\uB9CC \uB0A8\uAE40\r\n    if (sel) sel.removeAllRanges();\r\n  }\r\n\r\n  /** \uC120\uD0DD \uBE14\uB85D \u2192 \uC800\uC7A5 blocks \uBC30\uC5F4(\uC21C\uC11C \uBCF4\uC874) */\r\n  function selectedBlockObjects() {\r\n    const all = topLevelBlocks(editorEl);\r\n    const doc = getDocument();\r\n    const idxs = selected.map((b) => all.indexOf(b)).filter((i) => i >= 0).sort((a, b) => a - b);\r\n    return idxs.map((i) => doc[i]).filter(Boolean);\r\n  }\r\n\r\n  function deleteSelected() {\r\n    if (!selected.length) return;\r\n    const all = topLevelBlocks(editorEl);\r\n    const ordered = selected.slice().sort((a, b) => all.indexOf(a) - all.indexOf(b));\r\n    const para = makeParagraphEl();\r\n    const first = ordered[0];\r\n    if (para) first.replaceWith(para);\r\n    else first.remove();\r\n    for (const b of ordered.slice(1)) b.remove();\r\n    clear();\r\n    if (para) focusStart(contentOf(para));\r\n    commitChange();\r\n  }\r\n\r\n  function onKeydown(e) {\r\n    if (!isEditable()) return;\r\n    if (e.isComposing || isComposing()) return;\r\n    const mod = e.metaKey || e.ctrlKey;\r\n    const key = e.key;\r\n\r\n    // Ctrl/Cmd+A \uB2E8\uACC4 \uC120\uD0DD\r\n    if (mod && !e.altKey && (key === \"a\" || key === \"A\")) {\r\n      if (e.target.closest && e.target.closest(\".lumir-tbl\")) return; // \uD45C\uB294 table-controls \uC18C\uAD00\r\n      const content = e.target.closest && e.target.closest('.content[contenteditable=\"true\"]');\r\n      if (active) {\r\n        e.preventDefault();\r\n        return;\r\n      } // \uC774\uBBF8 \uC804\uCCB4 \uC120\uD0DD \uC0C1\uD0DC \uC720\uC9C0\r\n      if (!content || !editorEl.contains(content)) return;\r\n      e.preventDefault();\r\n      const empty = (content.textContent || \"\").length === 0;\r\n      // \uBE48 \uBE14\uB85D\uC774\uAC70\uB098 \uC774\uBBF8 \uBE14\uB85D \uC804\uCCB4\uAC00 \uC120\uD0DD\uB410\uC73C\uBA74 \u2192 \uC804\uCCB4 \uBE14\uB85D \uC120\uD0DD, \uC544\uB2C8\uBA74 \uD604\uC7AC \uBE14\uB85D\uB9CC\r\n      if (empty || isWholeContentSelected(content)) selectAllBlocks();\r\n      else selectWholeContent(content);\r\n      return;\r\n    }\r\n\r\n    if (!active) return; // \uC774\uD558 \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC \uC804\uC6A9\r\n\r\n    // undo/redo\uB294 \uC804\uC5ED \uD578\uB4E4\uB7EC\uC5D0 \uC704\uC784(\uBAA8\uB4DC\uB9CC \uD574\uC81C \u2014 restore\uAC00 DOM \uC7AC\uAD6C\uCD95)\r\n    if (mod && !e.altKey && (key === \"z\" || key === \"Z\" || key === \"y\" || key === \"Y\")) {\r\n      clear();\r\n      return;\r\n    }\r\n    // \uBCF5\uC0AC/\uC798\uB77C\uB0B4\uAE30 \u2014 copy \uC774\uBCA4\uD2B8\uC5D0 \uC758\uC874\uD558\uC9C0 \uC54A\uACE0 \uC9C1\uC811 \uAE30\uB85D(selectAllBlocks\uAC00 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC744 \uBE44\uC6CC \uC2E4\uC81C\r\n    // Chrome\uC740 copy \uC774\uBCA4\uD2B8\uB97C \uBC1C\uD654\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C). copyBlocks \uB0B4\uBD80\uC5D0\uC11C async clipboard/execCommand \uCC98\uB9AC.\r\n    if (mod && !e.altKey && (key === \"c\" || key === \"C\" || key === \"x\" || key === \"X\")) {\r\n      e.preventDefault();\r\n      copyBlocks(key === \"x\" || key === \"X\");\r\n      return;\r\n    }\r\n\r\n    if (key === \"Escape\") {\r\n      e.preventDefault();\r\n      const first = selected[0];\r\n      clear();\r\n      focusStart(contentOf(first));\r\n      return;\r\n    }\r\n    if (key === \"ArrowUp\" || key === \"ArrowLeft\") {\r\n      e.preventDefault();\r\n      const first = selected[0];\r\n      clear();\r\n      focusStart(contentOf(first));\r\n      return;\r\n    }\r\n    if (key === \"ArrowDown\" || key === \"ArrowRight\") {\r\n      e.preventDefault();\r\n      const last = selected[selected.length - 1];\r\n      clear();\r\n      focusEnd(contentOf(last));\r\n      return;\r\n    }\r\n    if (key === \"Backspace\" || key === \"Delete\") {\r\n      e.preventDefault();\r\n      deleteSelected();\r\n      return;\r\n    }\r\n    // \uC778\uC1C4 \uAC00\uB2A5\uD55C \uB2E8\uC77C \uBB38\uC790 \u2192 \uC120\uD0DD \uC0AD\uC81C \uD6C4 \uBE48 \uBB38\uB2E8\uC5D0\uC11C \uC785\uB825 \uC774\uC5B4\uAC00\uAE30(\uBB38\uC790\uB294 \uB124\uC774\uD2F0\uBE0C \uC785\uB825)\r\n    if (!mod && !e.altKey && key && key.length === 1) {\r\n      deleteSelected();\r\n      return; // preventDefault \uC548 \uD568 \u2192 \uBC29\uAE08 \uD3EC\uCEE4\uC2A4\uD55C \uBE48 \uBB38\uB2E8\uC5D0 \uBB38\uC790 \uC785\uB825\r\n    }\r\n  }\r\n\r\n  /**\r\n   * \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC\uC5D0\uC11C Ctrl/Cmd+C\u00B7X \uC9C1\uC811 \uCC98\uB9AC.\r\n   * selectAllBlocks\uAC00 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC744 \uBE44\uC6B0\uBBC0\uB85C \uC2E4\uC81C Chrome\uC740 copy \uC774\uBCA4\uD2B8\uB97C \uBC1C\uD654\uD558\uC9C0 \uC54A\uB294\uB2E4(\uC9C1\uC804 \uD074\uB9BD\uBCF4\uB4DC\uAC00\r\n   * \uADF8\uB300\uB85C \uBD99\uC74C). \uADF8\uB798\uC11C \uC774\uBCA4\uD2B8\uC5D0 \uC758\uC874\uD558\uC9C0 \uC54A\uACE0 \uBE44\uB3D9\uAE30 Clipboard API\uB85C \uC9C1\uC811 \uAE30\uB85D\uD55C\uB2E4(\uBB34\uC190\uC2E4 JSON\uC740 html\uC5D0\r\n   * \uC784\uBCA0\uB4DC \u2192 \uCEE4\uC2A4\uD140 MIME \uBD88\uC694). \uBBF8\uC9C0\uC6D0/\uCC28\uB2E8 \uC2DC \uC784\uC2DC range + execCommand('copy')\uB85C \uD3F4\uBC31(\u2192 onClipboard\uAC00 \uAE30\uB85D).\r\n   * (\uD45C table-controls.copySelectedCells\uC640 \uB3D9\uC77C \uC804\uB7B5)\r\n   */\r\n  function copyBlocks(cut) {\r\n    const blocks = selectedBlockObjects();\r\n    if (!blocks.length) return;\r\n    const json = jsonOf(blocks);\r\n    const html = embedBlocksInHtml(json, htmlOf(blocks));\r\n    const text = textOf(blocks);\r\n    try {\r\n      if (\r\n        typeof navigator !== \"undefined\" && navigator.clipboard &&\r\n        typeof navigator.clipboard.write === \"function\" && typeof window.ClipboardItem === \"function\"\r\n      ) {\r\n        const item = new window.ClipboardItem({\r\n          \"text/html\": new Blob([html], { type: \"text/html\" }),\r\n          \"text/plain\": new Blob([text], { type: \"text/plain\" }),\r\n        });\r\n        navigator.clipboard.write([item]).then(() => { if (cut) deleteSelected(); }, () => {});\r\n        return; // cut \uC0AD\uC81C\uB294 \uC4F0\uAE30 \uC131\uACF5 \uD6C4\uC5D0\uB9CC(\uB370\uC774\uD130 \uC720\uC2E4 \uBC29\uC9C0)\r\n      }\r\n    } catch (_) {}\r\n    // \uD3F4\uBC31: \uC120\uD0DD \uBE14\uB85D\uC5D0 \uB124\uC774\uD2F0\uBE0C range\uB97C \uB9CC\uB4E4\uC5B4 execCommand('copy') \u2192 onClipboard\uAC00 3\uC885 MIME \uAE30\uB85D.\r\n    let ok = false;\r\n    try {\r\n      const first = selected[0], last = selected[selected.length - 1];\r\n      if (first && last && typeof document.execCommand === \"function\") {\r\n        const sel = window.getSelection();\r\n        const range = document.createRange();\r\n        range.setStartBefore(first);\r\n        range.setEndAfter(last);\r\n        sel.removeAllRanges();\r\n        sel.addRange(range);\r\n        ok = document.execCommand(\"copy\"); // \uD56D\uC0C1 copy\uB85C \uBC1C\uD654(\u2192onClipboard\uAC00 \uAE30\uB85D); cut \uC0AD\uC81C\uB294 \uC544\uB798\uC11C \uCC98\uB9AC(\uC774\uC911\uC0AD\uC81C \uBC29\uC9C0)\r\n        sel.removeAllRanges(); // \uD558\uC774\uB77C\uC774\uD2B8 \uC804\uC6A9 \uC0C1\uD0DC \uBCF5\uC6D0\r\n      }\r\n    } catch (_) {}\r\n    if (cut && ok) deleteSelected();\r\n  }\r\n\r\n  function onClipboard(e, cut) {\r\n    if (!active) return;\r\n    const blocks = selectedBlockObjects();\r\n    if (!blocks.length) return;\r\n    // \uBB34\uC190\uC2E4 lumir-JSON\uC744 '\uBA3C\uC800' \uAE30\uB85D(\uC790\uAE30-\uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uC6B0\uC120), html/plain\uC740 \uC678\uBD80 \uC571 \uD3F4\uBC31. \uAC01 setData\uB294 \uB3C5\uB9BD try/catch.\r\n    let wroteLossless = false;\r\n    const cd = e.clipboardData;\r\n    if (cd && cd.setData) {\r\n      try { cd.setData(LUMIR_BLOCK_COPY_MIME, jsonOf(blocks)); wroteLossless = true; } catch (_) {}\r\n      try { cd.setData(\"text/html\", htmlOf(blocks)); } catch (_) {}\r\n      try { cd.setData(\"text/plain\", textOf(blocks)); } catch (_) {}\r\n    }\r\n    e.preventDefault();\r\n    if (cut && wroteLossless) deleteSelected(); // \uBB34\uC190\uC2E4 \uAE30\uB85D \uC131\uACF5 \uC2DC\uC5D0\uB9CC \uC0AD\uC81C(\uC4F0\uAE30 \uC2E4\uD328 \uC2DC \uC6D0\uBCF8 \uBCF4\uC874)\r\n  }\r\n  const onCopy = (e) => onClipboard(e, false);\r\n  const onCut = (e) => onClipboard(e, true);\r\n  const onMousedown = () => {\r\n    if (active) clear();\r\n  };\r\n\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  editorEl.addEventListener(\"copy\", onCopy);\r\n  editorEl.addEventListener(\"cut\", onCut);\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n\r\n  /** \uC120\uD0DD\uB41C \uCD5C\uC0C1\uC704 \uBE14\uB85D\uB4E4\uC758 \uD3B8\uC9D1 \uAC00\uB2A5 .content(\uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBE14\uB85D\uB9CC; \uD45C/\uB2E8 \uB798\uD37C \uC81C\uC678) \u2014 \uD06C\uB85C\uC2A4 \uC11C\uC2DD\uC6A9. */\r\n  function selectedIslands() {\r\n    return selected\r\n      .map((b) => b.querySelector(':scope > .content[contenteditable=\"true\"]'))\r\n      .filter(Boolean);\r\n  }\r\n\r\n  return {\r\n    clear,\r\n    isActive: () => active,\r\n    selectAll: selectAllBlocks,\r\n    selectedIslands,\r\n    destroy() {\r\n      editorEl.removeEventListener(\"keydown\", onKeydown);\r\n      editorEl.removeEventListener(\"copy\", onCopy);\r\n      editorEl.removeEventListener(\"cut\", onCut);\r\n      editorEl.removeEventListener(\"mousedown\", onMousedown);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD \u2014 \uC21C\uC218 \uBAA8\uB378/\uCEE4\uBC84 \uACC4\uC0B0/\uD558\uC774\uB77C\uC774\uD2B8 \uB80C\uB354 (\uC774\uBCA4\uD2B8 \uBC30\uC120 \uC5C6\uC74C).\r\n *\r\n * \uBC30\uACBD: \uAC01 \uBE14\uB85D\uC758 `.content`\uAC00 \uB3C5\uB9BD contenteditable \uC12C\uC774\uB77C \uB124\uC774\uD2F0\uBE0C \uB4DC\uB798\uADF8\uAC00 \uBE14\uB85D \uACBD\uACC4\uB97C\r\n *   \uB118\uC9C0 \uBABB\uD55C\uB2E4(inline-format/caret-nav \uCC38\uC870). \uC774 \uBAA8\uB4C8\uC740 (anchorIsland,anchorOffset)\u2192\r\n *   (focusIsland,focusOffset) \uC120\uD0DD\uC744 \uBB38\uC11C \uC21C\uC11C\uB85C \uC815\uB82C\uD574 \"\uCEE4\uBC84\uB41C \uC12C \uBAA9\uB85D\"\uC73C\uB85C \uD658\uC0B0\uD558\uACE0,\r\n *   CSS Custom Highlight API\uB85C \uC5EC\uB7EC \uC12C\uC744 \uD55C \uBC88\uC5D0 \uD398\uC778\uD305\uD55C\uB2E4(blur-highlight\uC640 \uB3D9\uC77C \uD504\uB9AC\uBBF8\uD2F0\uBE0C,\r\n *   \uC774\uB984\uB9CC lumir-cross-sel\uB85C \uBD84\uB9AC).\r\n *\r\n * \uC624\uD504\uC14B\uC740 inline-format\uC758 char \uC720\uB2DB \uACF5\uAC04(caretToOffset/offsetToCaret)\uACFC \uC815\uD569\uD55C\uB2E4 \u2014\r\n * \uC11C\uC2DD \uC801\uC6A9\uC740 \uC720\uB2DB \uC218\uB97C \uBC14\uAFB8\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC7AC\uB80C\uB354 \uD6C4\uC5D0\uB3C4 \uC624\uD504\uC14B\uC774 \uC720\uD6A8\uD558\uB2E4.\r\n *\r\n * v1 \uBC94\uC704: \uC77C\uBC18 \uBCF8\uBB38(\uBB38\uB2E8/\uC81C\uBAA9/\uB9AC\uC2A4\uD2B8)\uB9CC. \uD45C \uC140(td.lumir-cell)\u00B7\uB2E8(.lumir-column)\u00B7\r\n *   \uC911\uCCA9(.lumir-children) \uC18C\uC18D \uC12C\uC740 \uCEE4\uBC84\uC5D0\uC11C \uC81C\uC678\uD55C\uB2E4(\uACBD\uACC4 no-op).\r\n */\r\n\r\nimport { editableContents } from \"./caret-nav.js\";\r\nimport { caretToOffset, offsetToCaret } from \"../inline-format.js\";\r\n\r\nconst HL_NAME = \"lumir-cross-sel\";\r\nconst HL_STYLE_ID = \"lumir-cross-sel-style\";\r\n\r\nconst hlSupported =\r\n  typeof CSS !== \"undefined\" && CSS.highlights && typeof Highlight !== \"undefined\";\r\n\r\n/** \uC77C\uBC18 \uBCF8\uBB38 \uD3B8\uC9D1 \uC12C\uC778\uAC00 \u2014 \uD45C/\uB2E8/\uC911\uCCA9 \uBC16\uC758 \uCD5C\uC0C1\uC704 `.content[contenteditable=true]`. */\r\nexport function isPlainIsland(el) {\r\n  return !!(\r\n    el &&\r\n    el.nodeType === 1 &&\r\n    el.matches &&\r\n    el.matches('.content[contenteditable=\"true\"]') &&\r\n    !el.closest(\".lumir-tbl\") &&\r\n    !el.closest(\".lumir-column\") &&\r\n    !el.closest(\".lumir-children\")\r\n  );\r\n}\r\n\r\n/** \uB178\uB4DC\uC5D0\uC11C \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uC77C\uBC18 \uBCF8\uBB38 \uC12C(\uC5C6\uC73C\uBA74 null). */\r\nexport function plainIslandOf(node) {\r\n  const el = node && node.nodeType === 1 ? node : node && node.parentElement;\r\n  if (!el || !el.closest) return null;\r\n  const c = el.closest('.content[contenteditable=\"true\"]');\r\n  return isPlainIsland(c) ? c : null;\r\n}\r\n\r\n/** \uC12C \uC804\uCCB4\uC758 \uC720\uB2DB \uAE38\uC774(\uB05D \uC624\uD504\uC14B). */\r\nexport function contentLen(island) {\r\n  return caretToOffset(island, island, island.childNodes.length);\r\n}\r\n\r\n/**\r\n * \uC120\uD0DD \u2192 \uCEE4\uBC84\uB41C \uC12C \uBAA9\uB85D(\uBB38\uC11C \uC21C\uC11C). sel = {anchorIsland,anchorOffset,focusIsland,focusOffset}.\r\n * \uBC18\uD658: [{island, start, end, full}] \u2014 \uCCAB/\uB05D\uC740 \uBD80\uBD84, \uC911\uAC04\uC740 \uC804\uCCB4. \uD45C/\uB2E8/\uC911\uCCA9 \uC12C\uC740 \uC2A4\uD0B5.\r\n * anchor/focus \uC5B4\uB290 \uCABD\uC774 \uC55E\uC11C\uB4E0(\uC5ED\uBC29\uD5A5 \uB4DC\uB798\uADF8) \uBB38\uC11C \uC21C\uC11C\uB85C \uC815\uADDC\uD654\uD55C\uB2E4.\r\n */\r\nexport function coveredIslands(editorEl, sel) {\r\n  if (!editorEl || !sel || !sel.anchorIsland || !sel.focusIsland) return [];\r\n  const list = editableContents(editorEl);\r\n  let ai = list.indexOf(sel.anchorIsland);\r\n  let fi = list.indexOf(sel.focusIsland);\r\n  if (ai < 0 || fi < 0) return [];\r\n  let aOff = sel.anchorOffset;\r\n  let fOff = sel.focusOffset;\r\n  if (ai > fi) {\r\n    [ai, fi] = [fi, ai];\r\n    [aOff, fOff] = [fOff, aOff];\r\n  } else if (ai === fi && aOff > fOff) {\r\n    [aOff, fOff] = [fOff, aOff];\r\n  }\r\n  const out = [];\r\n  for (let i = ai; i <= fi; i++) {\r\n    const island = list[i];\r\n    if (!isPlainIsland(island)) continue; // \uD45C/\uB2E8/\uC911\uCCA9 \uC12C \uC81C\uC678\r\n    const len = contentLen(island);\r\n    const start = i === ai ? aOff : 0;\r\n    const end = i === fi ? fOff : len;\r\n    if (start === end && i !== ai && i !== fi) continue; // \uBE48 \uC911\uAC04 \uC12C\uC740 \uBB34\uD574\uD558\uAC8C \uC2A4\uD0B5\r\n    out.push({ island, start, end, full: start === 0 && end === len });\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction ensureCrossStyle() {\r\n  if (!hlSupported) return;\r\n  if (typeof document === \"undefined\" || !document.head) return;\r\n  if (document.getElementById(HL_STYLE_ID)) return;\r\n  try {\r\n    const st = document.createElement(\"style\");\r\n    st.id = HL_STYLE_ID;\r\n    // \uB124\uC774\uD2F0\uBE0C ::selection\uACFC \uCD5C\uB300\uD55C \uC720\uC0AC\uD55C \uD1A4(blur-highlight\uC640 \uB3D9\uC77C \uC0C9).\r\n    st.textContent = \"::highlight(lumir-cross-sel){background:rgba(91,87,214,0.28);}\";\r\n    document.head.appendChild(st);\r\n  } catch (_) {}\r\n}\r\n\r\n/** \uC12C \uD558\uB098\uC5D0 \uB300\uD55C Range(\uBD80\uBD84/\uC804\uCCB4). */\r\nfunction rangeForCovered(c) {\r\n  const r = document.createRange();\r\n  if (c.full) {\r\n    r.selectNodeContents(c.island);\r\n    return r;\r\n  }\r\n  const a = offsetToCaret(c.island, c.start);\r\n  const b = offsetToCaret(c.island, c.end);\r\n  try {\r\n    r.setStart(a.node, a.offset);\r\n    r.setEnd(b.node, b.offset);\r\n  } catch (_) {\r\n    r.selectNodeContents(c.island);\r\n  }\r\n  return r;\r\n}\r\n\r\n/** \uCEE4\uBC84\uB41C \uC12C\uB4E4\uC744 \uD558\uB098\uC758 Highlight\uB85C \uD398\uC778\uD305(\uBBF8\uC9C0\uC6D0 \uD658\uACBD\uC740 \uBB34\uC2DC). */\r\nexport function paintCrossHighlight(covered) {\r\n  if (!hlSupported) return;\r\n  ensureCrossStyle();\r\n  try {\r\n    if (!covered || !covered.length) {\r\n      CSS.highlights.delete(HL_NAME);\r\n      return;\r\n    }\r\n    const ranges = covered.map(rangeForCovered);\r\n    CSS.highlights.set(HL_NAME, new Highlight(...ranges));\r\n  } catch (_) {}\r\n}\r\n\r\nexport function clearCrossHighlight() {\r\n  if (!hlSupported) return;\r\n  try {\r\n    CSS.highlights.delete(HL_NAME);\r\n  } catch (_) {}\r\n}\r\n\r\n/** \uD234\uBC14 \uC704\uCE58\uC6A9 \u2014 \uCEE4\uBC84\uB41C \uC12C Range\uB4E4\uC758 \uC720\uB2C8\uC628 BoundingRect(\uC5C6\uC73C\uBA74 null). */\r\nexport function crossBoundingRect(covered) {\r\n  if (!covered || !covered.length) return null;\r\n  let top = Infinity, left = Infinity, right = -Infinity, bottom = -Infinity;\r\n  let has = false;\r\n  for (const c of covered) {\r\n    const rng = rangeForCovered(c);\r\n    const rect = rng && typeof rng.getBoundingClientRect === \"function\" ? rng.getBoundingClientRect() : null;\r\n    if (!rect || (!rect.width && !rect.height)) continue;\r\n    has = true;\r\n    top = Math.min(top, rect.top);\r\n    left = Math.min(left, rect.left);\r\n    right = Math.max(right, rect.right);\r\n    bottom = Math.max(bottom, rect.bottom);\r\n  }\r\n  if (!has) return null;\r\n  return { top, left, right, bottom, width: right - left, height: bottom - top };\r\n}\r\n", "/**\r\n * \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD \u2014 \uC774\uBCA4\uD2B8 \uCEE8\uD2B8\uB864\uB7EC(\uD3EC\uC778\uD130 \uB4DC\uB798\uADF8 \uCEA1\uCC98).\r\n *\r\n * \uAC01 \uBE14\uB85D\uC758 `.content`\uAC00 \uB3C5\uB9BD contenteditable \uC12C\uC774\uB77C \uB124\uC774\uD2F0\uBE0C \uB4DC\uB798\uADF8\uB294 \uC2DC\uC791 \uBE14\uB85D \uC548\uC73C\uB85C\r\n * \uD074\uB7A8\uD504\uB41C\uB2E4. \uC774 \uCEE8\uD2B8\uB864\uB7EC\uB294 \uB9C8\uC6B0\uC2A4 \uB4DC\uB798\uADF8\uAC00 \uBE14\uB85D \uACBD\uACC4\uB97C \uB118\uB294 \uC21C\uAC04 \"\uD06C\uB85C\uC2A4 \uBAA8\uB4DC\"\uB85C \uC804\uD658\uD574\r\n * \uC120\uD0DD\uC744 \uC9C1\uC811 \uAD6C\uB3D9\uD55C\uB2E4(\uAE30\uBC95 b: editorEl\uC5D0 user-select:none + \uB9E4 \uC774\uB3D9 removeAllRanges +\r\n * \uC804\uBA74 \uCEE4\uC2A4\uD140 \uD558\uC774\uB77C\uC774\uD2B8). \uCEA1\uCC98 \uB85C\uC9C1\uC740 \uC774 \uD30C\uC77C\uC5D0 \uACA9\uB9AC\uB418\uC5B4, \uAE30\uBC95 \uAD50\uCCB4 \uC2DC \uC5EC\uAE30\uB9CC \uBC14\uAFB8\uBA74 \uB41C\uB2E4.\r\n *\r\n * \uB3D9\uC791:\r\n *   - \uB2E8\uC77C \uBE14\uB85D \uB0B4 \uD074\uB9AD/\uB4DC\uB798\uADF8 \u2192 \uD06C\uB85C\uC2A4 \uBBF8\uC9C4\uC785(\uB124\uC774\uD2F0\uBE0C \uADF8\uB300\uB85C, \uAE30\uC874 \uD234\uBC14 \uBE60\uB978 \uACBD\uB85C \uC720\uC9C0).\r\n *   - \uBE14\uB85D A\u2192C \uB4DC\uB798\uADF8 \u2192 \uD06C\uB85C\uC2A4 \uC9C4\uC785, (anchorIsland,offset)\u2192(focusIsland,offset) \uCD94\uC801.\r\n *   - shift+\uD074\uB9AD \u2192 \uAE30\uC874 anchor \uC720\uC9C0, \uD074\uB9AD \uC9C0\uC810\uC73C\uB85C focus \uD655\uC7A5.\r\n *   - Escape/\uBC29\uD5A5\uD0A4(shift \uC5C6\uC74C) \u2192 \uD06C\uB85C\uC2A4 \uD574\uC81C + \uCE90\uB7FF \uBC30\uCE58.\r\n *   - \uC0C8 mousedown(shift \uC5C6\uC74C)\u00B7\uC5D0\uB514\uD130 \uBC16 \uD074\uB9AD \u2192 \uD574\uC81C.\r\n *   - \uD45C \uC140/\uB2E8/\uC911\uCCA9 \uC12C\uC740 \uC9C4\uC785/\uCEE4\uBC84 \uB300\uC0C1 \uC544\uB2D8(\uACBD\uACC4 \uD074\uB7A8\uD504).\r\n *\r\n * v1: \uC120\uD0DD + \uC77C\uAD04 \uC11C\uC2DD\uB9CC. \uC120\uD0DD \uC601\uC5ED \uD3B8\uC9D1(\uC0AD\uC81C/\uD0C0\uC774\uD551/\uBD99\uC5EC\uB123\uAE30)\uC740 2\uB2E8\uACC4.\r\n */\r\n\r\nimport { caretRangeFromPoint } from \"./caret-nav.js\";\r\nimport { caretToOffset, setSelection } from \"../inline-format.js\";\r\nimport {\r\n  plainIslandOf,\r\n  coveredIslands as computeCovered,\r\n  paintCrossHighlight,\r\n  clearCrossHighlight,\r\n  crossBoundingRect,\r\n} from \"./cross-block-selection.js\";\r\n\r\nexport function attachCrossBlockSelect(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isEditable = typeof opts.isEditable === \"function\" ? opts.isEditable : () => true;\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const clearBlockSelect = typeof opts.clearBlockSelect === \"function\" ? opts.clearBlockSelect : () => {};\r\n  const onSettled = typeof opts.onSettled === \"function\" ? opts.onSettled : () => {};\r\n\r\n  let sel = null; // {anchorIsland, anchorOffset, focusIsland, focusOffset}\r\n  let anchor = null; // {island, offset} \u2014 mousedown \uC9C0\uC810\r\n  let pointerDown = false;\r\n  let engaged = false; // \uD06C\uB85C\uC2A4 \uBAA8\uB4DC(\uACBD\uACC4\uB97C \uB118\uC5B4 \uCEE4\uC2A4\uD140 \uAD6C\uB3D9 \uC911)\r\n\r\n  function covered() {\r\n    return computeCovered(editorEl, sel);\r\n  }\r\n  function isActive() {\r\n    return !!(sel && sel.anchorIsland && sel.focusIsland && sel.anchorIsland !== sel.focusIsland);\r\n  }\r\n  function isDragging() {\r\n    return pointerDown && engaged;\r\n  }\r\n\r\n  function setUserSelectNone(on) {\r\n    try {\r\n      editorEl.style.userSelect = on ? \"none\" : \"\";\r\n      editorEl.style.webkitUserSelect = on ? \"none\" : \"\";\r\n    } catch (_) {}\r\n  }\r\n\r\n  function repaint() {\r\n    paintCrossHighlight(covered());\r\n  }\r\n\r\n  function clear() {\r\n    sel = null;\r\n    anchor = null;\r\n    engaged = false;\r\n    pointerDown = false;\r\n    setUserSelectNone(false);\r\n    clearCrossHighlight();\r\n  }\r\n\r\n  function offsetAtPoint(x, y) {\r\n    const rng = caretRangeFromPoint(x, y);\r\n    if (!rng) return null;\r\n    const island = plainIslandOf(rng.startContainer);\r\n    if (!island) return null;\r\n    return { island, offset: caretToOffset(island, rng.startContainer, rng.startOffset) };\r\n  }\r\n\r\n  // \u2500\u2500 mousedown: anchor \uAE30\uB85D(\uD06C\uB85C\uC2A4 \uC9C4\uC785\uC740 mousemove\uC5D0\uC11C) \u2500\u2500\r\n  function onMousedown(e) {\r\n    if (!isEditable() || e.button !== 0 || isComposing()) return;\r\n    // \uD45C\uB294 table-controls \uC18C\uAD00 \u2014 \uD06C\uB85C\uC2A4 \uBBF8\uAD00\uC5EC.\r\n    if (e.target.closest && e.target.closest(\".lumir-tbl\")) {\r\n      if (isActive()) clear();\r\n      return;\r\n    }\r\n    const at = offsetAtPoint(e.clientX, e.clientY);\r\n\r\n    // shift+\uD074\uB9AD: \uAE30\uC874 anchor \uC720\uC9C0\uD558\uACE0 focus\uB9CC \uC774\uB3D9(\uD655\uC7A5).\r\n    if (e.shiftKey && (anchor || sel) && at) {\r\n      const a = anchor || { island: sel.anchorIsland, offset: sel.anchorOffset };\r\n      anchor = a;\r\n      sel = { anchorIsland: a.island, anchorOffset: a.offset, focusIsland: at.island, focusOffset: at.offset };\r\n      if (isActive()) {\r\n        e.preventDefault();\r\n        engaged = true;\r\n        setUserSelectNone(true);\r\n        const s = window.getSelection();\r\n        if (s) s.removeAllRanges();\r\n        repaint();\r\n        onSettled();\r\n      } else {\r\n        // \uAC19\uC740 \uC12C\uC73C\uB85C\uC758 shift+\uD074\uB9AD \u2192 \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD\uC73C\uB85C \uD658\uC6D0.\r\n        clearCrossHighlight();\r\n        engaged = false;\r\n        setUserSelectNone(false);\r\n      }\r\n      return;\r\n    }\r\n\r\n    // \uC77C\uBC18 mousedown: \uC774\uC804 \uD06C\uB85C\uC2A4 \uD574\uC81C + \uC0C8 anchor.\r\n    if (isActive() || engaged) {\r\n      clearCrossHighlight();\r\n      setUserSelectNone(false);\r\n    }\r\n    sel = null;\r\n    engaged = false;\r\n    clearBlockSelect();\r\n    anchor = at; // \uC77C\uBC18 \uC12C\uC774 \uC544\uB2C8\uBA74 null \u2192 \uD06C\uB85C\uC2A4 \uC9C4\uC785 \uBD88\uAC00(\uB124\uC774\uD2F0\uBE0C \uCC98\uB9AC)\r\n    pointerDown = true;\r\n  }\r\n\r\n  // \u2500\u2500 mousemove: \uACBD\uACC4\uB97C \uB118\uC73C\uBA74 \uD06C\uB85C\uC2A4 \uC9C4\uC785 \uD6C4 \uCEE4\uC2A4\uD140 \uAD6C\uB3D9 \u2500\u2500\r\n  function onMousemove(e) {\r\n    if (!pointerDown || !anchor) return;\r\n    const at = offsetAtPoint(e.clientX, e.clientY);\r\n    if (!at) return; // \uD45C/\uB2E8/\uC911\uCCA9/\uC5EC\uBC31 \uC704 \u2192 \uD074\uB7A8\uD504(\uBB34\uC2DC)\r\n    if (!engaged && at.island === anchor.island) return; // \uC544\uC9C1 \uAC19\uC740 \uC12C \u2192 \uB124\uC774\uD2F0\uBE0C \uC720\uC9C0\r\n\r\n    if (!engaged) {\r\n      engaged = true;\r\n      setUserSelectNone(true); // \uB124\uC774\uD2F0\uBE0C \uC120\uD0DD \uD655\uC7A5 \uC5B5\uC81C\r\n    }\r\n    sel = {\r\n      anchorIsland: anchor.island,\r\n      anchorOffset: anchor.offset,\r\n      focusIsland: at.island,\r\n      focusOffset: at.offset,\r\n    };\r\n    const s = window.getSelection();\r\n    if (s) s.removeAllRanges();\r\n    repaint();\r\n  }\r\n\r\n  // \u2500\u2500 mouseup: \uB9C8\uBB34\uB9AC(\uB2E8\uC77C \uC12C\uC73C\uB85C \uC811\uD788\uBA74 \uB124\uC774\uD2F0\uBE0C\uB85C \uD658\uC6D0, \uB2E4\uC911\uC774\uBA74 \uD06C\uB85C\uC2A4 \uD655\uC815) \u2500\u2500\r\n  function onMouseup() {\r\n    if (!pointerDown) return;\r\n    pointerDown = false;\r\n    if (!engaged) return; // \uC21C\uC218 \uB124\uC774\uD2F0\uBE0C(\uB2E8\uC77C \uC12C) \u2014 \uAD00\uC5EC \uC5C6\uC74C\r\n\r\n    setUserSelectNone(false);\r\n    if (sel && sel.anchorIsland === sel.focusIsland) {\r\n      // \uD55C \uC12C\uC73C\uB85C \uC811\uD798 \u2192 \uB124\uC774\uD2F0\uBE0C \uB2E8\uC77C \uBE14\uB85D \uC120\uD0DD\uC73C\uB85C \uB418\uB3CC\uB824 \uAE30\uC874 \uACBD\uB85C\uC5D0 \uC704\uC784.\r\n      clearCrossHighlight();\r\n      try {\r\n        sel.anchorIsland.focus();\r\n        setSelection(sel.anchorIsland, sel.anchorOffset, sel.focusOffset);\r\n      } catch (_) {}\r\n      sel = null;\r\n      engaged = false;\r\n      return;\r\n    }\r\n    engaged = false;\r\n    repaint();\r\n    onSettled(); // \uD234\uBC14 \uD45C\uC2DC/\uC704\uCE58\r\n  }\r\n\r\n  // \u2500\u2500 keydown: Escape/\uBC29\uD5A5\uD0A4\uB85C \uD574\uC81C(\uD06C\uB85C\uC2A4 \uD65C\uC131 \uC2DC) \u2014 caret-nav\uBCF4\uB2E4 \uBA3C\uC800 \uB4F1\uB85D\uB428 \u2500\u2500\r\n  function placeCaret(island, offset) {\r\n    if (!island) return;\r\n    try {\r\n      island.focus();\r\n      setSelection(island, offset, offset);\r\n    } catch (_) {}\r\n  }\r\n  function onKeydown(e) {\r\n    if (!isActive()) return;\r\n    const key = e.key;\r\n    const cov = covered();\r\n    const first = cov[0];\r\n    const last = cov[cov.length - 1];\r\n    if (key === \"Escape\") {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      const a = { island: sel.anchorIsland, offset: sel.anchorOffset };\r\n      clear();\r\n      placeCaret(a.island, a.offset);\r\n      return;\r\n    }\r\n    if (key === \"ArrowLeft\" || key === \"ArrowUp\") {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      clear();\r\n      if (first) placeCaret(first.island, first.start);\r\n      return;\r\n    }\r\n    if (key === \"ArrowRight\" || key === \"ArrowDown\") {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      clear();\r\n      if (last) placeCaret(last.island, last.end);\r\n      return;\r\n    }\r\n  }\r\n\r\n  // \uC5D0\uB514\uD130 \uBC16 \uD074\uB9AD \uC2DC \uD574\uC81C(\uD234\uBC14 \uD074\uB9AD\uC740 \uC81C\uC678 \u2014 \uADF8\uB798\uC57C \uC11C\uC2DD \uC801\uC6A9\uC774 \uC720\uC9C0\uB41C\uB2E4).\r\n  function onDocMousedown(e) {\r\n    if (!isActive() && !engaged) return;\r\n    if (editorEl.contains(e.target)) return; // \uC5D0\uB514\uD130 \uB0B4\uBD80\uB294 onMousedown\uC774 \uCC98\uB9AC\r\n    if (\r\n      e.target.closest &&\r\n      e.target.closest(\".lumir-format-toolbar, .lumir-floating-menu, .lumir-link-toolbar\")\r\n    )\r\n      return; // \uD234\uBC14 \uC870\uC791 \uC720\uC9C0\r\n    clear();\r\n  }\r\n\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  editorEl.addEventListener(\"mousedown\", onMousedown);\r\n  document.addEventListener(\"mousemove\", onMousemove);\r\n  document.addEventListener(\"mouseup\", onMouseup);\r\n  document.addEventListener(\"mousedown\", onDocMousedown);\r\n\r\n  return {\r\n    isActive,\r\n    isDragging,\r\n    get: () => sel,\r\n    clear,\r\n    coveredIslands: covered,\r\n    boundingRect: () => crossBoundingRect(covered()),\r\n    repaint,\r\n    destroy() {\r\n      clear();\r\n      editorEl.removeEventListener(\"keydown\", onKeydown);\r\n      editorEl.removeEventListener(\"mousedown\", onMousedown);\r\n      document.removeEventListener(\"mousemove\", onMousemove);\r\n      document.removeEventListener(\"mouseup\", onMouseup);\r\n      document.removeEventListener(\"mousedown\", onDocMousedown);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD06C\uB85C\uC2A4\uBE14\uB85D \uD3B8\uC9D1 \uD504\uB9AC\uBBF8\uD2F0\uBE0C(Phase 2) \u2014 \uC21C\uC218 DOM/char \uBAA8\uB378 \uC5F0\uC0B0(\uCEE4\uBC0B \uC5C6\uC74C).\r\n *\r\n *  - orderSelection: (anchor,focus)\uB97C \uBB38\uC11C \uC21C\uC11C\uB85C \uC815\uADDC\uD654.\r\n *  - deleteRangeAcross: \uC120\uD0DD \uBC94\uC704\uB97C \uC0AD\uC81C\uD558\uACE0 \uB05D \uBE14\uB85D \uC794\uC5EC\uB97C \uCCAB \uBE14\uB85D\uC5D0 \uBCD1\uD569(\uCCAB \uBE14\uB85D \uD0C0\uC785 \uC720\uC9C0).\r\n *      \uCCAB/\uB05D \uACBD\uACC4 \uC12C\uC774 \uD45C/\uB2E8/\uC911\uCCA9(\uBCF5\uD569)\uC774\uBA74 no-op(null \uBC18\uD658) \u2014 v1 \uC81C\uC678.\r\n *  - buildCrossBlockClipboard: \uCCAB/\uB05D \uBD80\uBD84 + \uC911\uAC04 \uC804\uCCB4 \uBE14\uB85D\uC744 \uC800\uC7A5 \uD3FC blocks \uBC30\uC5F4\uB85C(\uBD80\uBD84 \uBCF5\uC0AC).\r\n *\r\n * \uC624\uD504\uC14B\uC740 inline-format\uC758 char \uC720\uB2DB \uACF5\uAC04. \uCEE4\uBC0B/\uD788\uC2A4\uD1A0\uB9AC\uB294 \uD638\uCD9C\uC790(cross-block-edit)\uAC00 1\uD68C \uC218\uD589.\r\n */\r\n\r\nimport { editableContents } from \"./caret-nav.js\";\r\nimport { isPlainIsland, contentLen } from \"./cross-block-selection.js\";\r\nimport { contentToChars, charsToHtml, sliceContentInline } from \"../inline-format.js\";\r\n\r\n/** (anchor,focus)\uB97C \uBB38\uC11C \uC21C\uC11C\uB85C \uC815\uADDC\uD654. \uBC18\uD658 \uC5C6\uC73C\uBA74 null. */\r\nexport function orderSelection(editorEl, sel) {\r\n  if (!sel || !sel.anchorIsland || !sel.focusIsland) return null;\r\n  const list = editableContents(editorEl);\r\n  const ai = list.indexOf(sel.anchorIsland);\r\n  const fi = list.indexOf(sel.focusIsland);\r\n  if (ai < 0 || fi < 0) return null;\r\n  let sIsland = sel.anchorIsland, sOff = sel.anchorOffset;\r\n  let eIsland = sel.focusIsland, eOff = sel.focusOffset;\r\n  if (ai > fi || (ai === fi && sOff > eOff)) {\r\n    sIsland = sel.focusIsland; sOff = sel.focusOffset;\r\n    eIsland = sel.anchorIsland; eOff = sel.anchorOffset;\r\n  }\r\n  return { startIsland: sIsland, startOffset: sOff, endIsland: eIsland, endOffset: eOff, sameIsland: sIsland === eIsland };\r\n}\r\n\r\n/** \uCD5C\uC0C1\uC704 .block \uD615\uC81C \uBAA9\uB85D. */\r\nfunction topBlocks(editorEl) {\r\n  return [...editorEl.children].filter((c) => c.classList && c.classList.contains(\"block\"));\r\n}\r\n\r\n/** \uBE14\uB85D\uC758 \uC9C1\uC18D \uD3B8\uC9D1 \uAC00\uB2A5 .content(\uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBE14\uB85D\uB9CC; \uD45C/\uB2E8 \uB798\uD37C\uB294 null). */\r\nfunction editableContentOf(block) {\r\n  if (!block || !block.querySelector) return null;\r\n  return block.querySelector(':scope > .content[contenteditable=\"true\"]');\r\n}\r\n\r\n/**\r\n * \uC120\uD0DD \uBC94\uC704 \uC0AD\uC81C + \uBCD1\uD569. \uBC18\uD658: \uCE90\uB7FF {island, offset} \uB610\uB294 null(\uACBD\uACC4 \uBCF5\uD569 \uC12C \u2192 no-op).\r\n * \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uB294\uB2E4(\uD638\uCD9C\uC790\uAC00 1\uD68C \uCEE4\uBC0B \u2192 \uB2E8\uC77C undo \uC2A4\uD15D).\r\n * opts.collapseEmpty: \uBCD1\uD569 \uACB0\uACFC\uAC00 \uBE44\uBA74(\uC120\uD0DD\uC774 \uBE14\uB85D\uC744 \uC644\uC804\uD788 \uB36E\uC74C) \uBE48 \uCCAB \uBE14\uB85D\uB3C4 \uC81C\uAC70\uD558\uACE0\r\n *   \uC778\uC811 \uD3B8\uC9D1 \uBE14\uB85D\uC73C\uB85C \uCE90\uB7FF \uC774\uB3D9(\uC0AD\uC81C/\uC798\uB77C\uB0B4\uAE30\uC6A9). \uD0C0\uC774\uD551/\uBD99\uC5EC\uB123\uAE30\uB294 \uC0BD\uC785 \uB300\uC0C1 \uBE14\uB85D\uC744 \uB0A8\uAE30\uB824 false.\r\n */\r\nexport function deleteRangeAcross(editorEl, sel, opts) {\r\n  const collapseEmpty = !!(opts && opts.collapseEmpty);\r\n  const o = orderSelection(editorEl, sel);\r\n  if (!o) return null;\r\n  // v1: \uCCAB/\uB05D \uACBD\uACC4\uAC00 \uD45C/\uB2E8/\uC911\uCCA9 \uC12C\uC774\uBA74 \uAD00\uC5EC\uD558\uC9C0 \uC54A\uC74C(\uAE30\uC874 \uB3D9\uC791 \uBCF4\uC874).\r\n  if (!isPlainIsland(o.startIsland) || !isPlainIsland(o.endIsland)) return null;\r\n\r\n  if (o.sameIsland) {\r\n    const chars = contentToChars(o.startIsland);\r\n    o.startIsland.innerHTML = charsToHtml(chars.slice(0, o.startOffset).concat(chars.slice(o.endOffset)));\r\n    return { island: o.startIsland, offset: o.startOffset };\r\n  }\r\n\r\n  const startBlock = o.startIsland.closest(\".block\");\r\n  const endBlock = o.endIsland.closest(\".block\");\r\n  const firstKept = contentToChars(o.startIsland).slice(0, o.startOffset);\r\n  const tail = contentToChars(o.endIsland).slice(o.endOffset);\r\n  const merged = firstKept.concat(tail);\r\n  // \uCCAB \uBE14\uB85D \uB2E4\uC74C ~ \uB05D \uBE14\uB85D(\uD3EC\uD568)\uAE4C\uC9C0 \uCD5C\uC0C1\uC704 \uD615\uC81C \uC81C\uAC70(\uC911\uAC04 \uC804\uCCB4 \uCEE4\uBC84 \uBE14\uB85D\uC740 \uD1B5\uC9F8 \uC0AD\uC81C \u2014 \uD45C/\uB2E8 \uD3EC\uD568).\r\n  if (startBlock && endBlock) {\r\n    let n = startBlock.nextElementSibling;\r\n    while (n && n !== endBlock) {\r\n      const nx = n.nextElementSibling;\r\n      n.remove();\r\n      n = nx;\r\n    }\r\n    endBlock.remove();\r\n  }\r\n  // \uC644\uC804 \uCEE4\uBC84\uB85C \uBCD1\uD569 \uACB0\uACFC\uAC00 \uBE44\uC5C8\uC73C\uBA74(=\uC120\uD0DD\uD55C \uBE14\uB85D\uB4E4 \uD1B5\uC9F8 \uC0AD\uC81C) \uBE48 \uCCAB \uBE14\uB85D\uB3C4 \uC81C\uAC70 \u2014 \uD3B8\uC9D1 \uAC00\uB2A5\uD55C \uC778\uC811 \uBE14\uB85D\uC774 \uC788\uC744 \uB54C.\r\n  if (collapseEmpty && merged.length === 0 && startBlock) {\r\n    const nc = editableContentOf(startBlock.nextElementSibling);\r\n    if (nc) { startBlock.remove(); return { island: nc, offset: 0 }; }\r\n    const pc = editableContentOf(startBlock.previousElementSibling);\r\n    if (pc) { startBlock.remove(); return { island: pc, offset: contentLen(pc) }; }\r\n    // \uD3B8\uC9D1 \uAC00\uB2A5\uD55C \uC778\uC811 \uBE14\uB85D \uC5C6\uC74C \u2192 \uBE48 \uCCAB \uBE14\uB85D \uC720\uC9C0(\uBB38\uC11C \uCD5C\uC18C 1\uBE14\uB85D/\uCE90\uB7FF \uD648).\r\n  }\r\n  // \uB05D \uBE14\uB85D \uC794\uC5EC\uB97C \uCCAB \uBE14\uB85D\uC5D0 \uBCD1\uD569(\uCCAB \uBE14\uB85D\uC758 \uD0C0\uC785/props \uC720\uC9C0 \u2014 .content\uB9CC \uC7AC\uC791\uC131).\r\n  o.startIsland.innerHTML = charsToHtml(merged);\r\n  return { island: o.startIsland, offset: o.startOffset };\r\n}\r\n\r\n/**\r\n * \uBD80\uBD84 \uBCF5\uC0AC\uC6A9 blocks \uBC30\uC5F4 \u2014 \uCCAB/\uB05D\uC740 \uBD80\uBD84 content, \uC911\uAC04\uC740 \uC6D0\uD615 \uBE14\uB85D. doc=getDocument() \uCD5C\uC0C1\uC704 \uBC30\uC5F4.\r\n * \uACBD\uACC4 \uBCF5\uD569 \uC12C\uC774\uBA74 null.\r\n */\r\nexport function buildCrossBlockClipboard(editorEl, sel, doc) {\r\n  const o = orderSelection(editorEl, sel);\r\n  if (!o || !Array.isArray(doc)) return null;\r\n  if (!isPlainIsland(o.startIsland) || !isPlainIsland(o.endIsland)) return null;\r\n  const tops = topBlocks(editorEl);\r\n  const si = tops.indexOf(o.startIsland.closest(\".block\"));\r\n  const ei = tops.indexOf(o.endIsland.closest(\".block\"));\r\n  if (si < 0 || ei < 0) return null;\r\n\r\n  if (o.sameIsland) {\r\n    if (!doc[si]) return null;\r\n    return [{ ...doc[si], content: sliceContentInline(o.startIsland, o.startOffset, o.endOffset), children: [] }];\r\n  }\r\n  const out = [];\r\n  const startLen = contentToChars(o.startIsland).length;\r\n  if (doc[si]) out.push({ ...doc[si], content: sliceContentInline(o.startIsland, o.startOffset, startLen), children: [] });\r\n  for (let k = si + 1; k < ei; k++) if (doc[k]) out.push(doc[k]);\r\n  if (doc[ei]) out.push({ ...doc[ei], content: sliceContentInline(o.endIsland, 0, o.endOffset), children: [] });\r\n  return out;\r\n}\r\n", "/**\r\n * \uD06C\uB85C\uC2A4\uBE14\uB85D \uD3B8\uC9D1 \uCEE8\uD2B8\uB864\uB7EC(Phase 2) \u2014 \uD06C\uB85C\uC2A4 \uC120\uD0DD\uC774 \uD65C\uC131\uC77C \uB54C \uD0A4 \uC785\uB825\uC744 \uAC00\uB85C\uCC44 \uC120\uD0DD \uC601\uC5ED\uC744 \uD3B8\uC9D1\uD55C\uB2E4.\r\n *\r\n * \uB2E4\uB978 keydown \uC5B4\uD0DC\uCC98(editing/caret-nav/block-select)\uBCF4\uB2E4 **\uBA3C\uC800** \uB4F1\uB85D\uD574, \uCC98\uB9AC \uC2DC\r\n * stopImmediatePropagation\uC73C\uB85C \uD558\uC704 \uD578\uB4E4\uB7EC\uC758 \uB2E8\uC77C \uBE14\uB85D \uB3D9\uC791\uC744 \uB9C9\uB294\uB2E4.\r\n *\r\n *  - Backspace/Delete \u2192 \uC120\uD0DD \uC0AD\uC81C(deleteRangeAcross) + \uCEE4\uBC0B 1\uD68C(\uB2E8\uC77C undo).\r\n *  - Enter \u2192 \uC120\uD0DD \uC0AD\uC81C \uD6C4 join \uC9C0\uC810\uC5D0\uC11C \uBE14\uB85D \uBD84\uD560(handleEnter \uC7AC\uC0AC\uC6A9).\r\n *  - \uC778\uC1C4 \uAC00\uB2A5\uD55C \uBB38\uC790 \u2192 \uC120\uD0DD \uC0AD\uC81C \uD6C4 \uADF8 \uC790\uB9AC\uC5D0 \uBB38\uC790 \uC0BD\uC785(\uBAA8\uB378 \uC0BD\uC785).\r\n *  - Ctrl/Cmd+C\u00B7X \u2192 \uBD80\uBD84 \uC9C1\uB82C\uD654 \uD074\uB9BD\uBCF4\uB4DC \uAE30\uB85D(cut\uC740 \uAE30\uB85D \uC131\uACF5 \uD6C4 \uC0AD\uC81C).\r\n *  - \uADF8 \uC678 Ctrl/Cmd \uC870\uD569(B/I/U \uB4F1)\u00B7\uD654\uC0B4\uD45C\u00B7Escape\uB294 \uD1B5\uACFC(\uAC01\uAC01 \uD234\uBC14/\uD06C\uB85C\uC2A4 \uC120\uD0DD \uCEE8\uD2B8\uB864\uB7EC\uAC00 \uCC98\uB9AC).\r\n *  - \uD55C\uAE00 \uB4F1 IME \uC785\uB825\uC740 \uC5EC\uAE30\uC11C \uCC98\uB9AC\uD558\uC9C0 \uC54A\uB294\uB2E4(compositionstart \uACBD\uB85C \u2014 editor.js).\r\n *\r\n * \uD45C/\uB2E8/\uC911\uCCA9 \uACBD\uACC4 \uC120\uD0DD\uC740 deleteRangeAcross\uAC00 null\uC744 \uBC18\uD658(v1 \uC81C\uC678)\uD558\uBBC0\uB85C \uC0AD\uC81C/\uD0C0\uC774\uD551\uC774 no-op\uC774 \uB418\uACE0,\r\n * \uC774 \uACBD\uC6B0\uC5D0\uB3C4 stopImmediatePropagation\uC744 \uD558\uBBC0\uB85C \uC798\uBABB\uB41C \uB2E8\uC77C \uBE14\uB85D \uD3B8\uC9D1\uC774 \uC77C\uC5B4\uB098\uC9C0 \uC54A\uB294\uB2E4.\r\n */\r\n\r\nimport { deleteRangeAcross, buildCrossBlockClipboard } from \"./cross-block-range.js\";\r\nimport { embedBlocksInHtml } from \"./block-select.js\";\r\nimport { handleEnter } from \"../editing.js\";\r\nimport { setSelection, contentToChars, charsToHtml } from \"../inline-format.js\";\r\n\r\nexport function attachCrossBlockEdit(editorEl, opts) {\r\n  opts = opts || {};\r\n  const isEditable = typeof opts.isEditable === \"function\" ? opts.isEditable : () => true;\r\n  const isComposing = typeof opts.isComposing === \"function\" ? opts.isComposing : () => false;\r\n  const commitChange = typeof opts.commitChange === \"function\" ? opts.commitChange : () => {};\r\n  const getSel = typeof opts.getSelection === \"function\" ? opts.getSelection : () => null;\r\n  const isActive = typeof opts.isActive === \"function\" ? opts.isActive : () => false;\r\n  const clearCross = typeof opts.clearCross === \"function\" ? opts.clearCross : () => {};\r\n  const getDocument = typeof opts.getDocument === \"function\" ? opts.getDocument : () => [];\r\n  const jsonOf = typeof opts.jsonOf === \"function\" ? opts.jsonOf : () => \"\";\r\n  const htmlOf = typeof opts.htmlOf === \"function\" ? opts.htmlOf : () => \"\";\r\n  const textOf = typeof opts.textOf === \"function\" ? opts.textOf : () => \"\";\r\n\r\n  function placeCaret(caret) {\r\n    if (!caret || !caret.island) return;\r\n    try {\r\n      caret.island.focus();\r\n      setSelection(caret.island, caret.offset, caret.offset);\r\n    } catch (_) {}\r\n  }\r\n  function insertCharAt(caret, ch) {\r\n    if (!caret || !caret.island) return;\r\n    const chars = contentToChars(caret.island);\r\n    const next = chars.slice(0, caret.offset).concat([{ ch, styles: {} }], chars.slice(caret.offset));\r\n    caret.island.innerHTML = charsToHtml(next);\r\n    try {\r\n      caret.island.focus();\r\n      setSelection(caret.island, caret.offset + 1, caret.offset + 1);\r\n    } catch (_) {}\r\n  }\r\n\r\n  function copyCross(sel, cut) {\r\n    const blocks = buildCrossBlockClipboard(editorEl, sel, getDocument());\r\n    if (!blocks || !blocks.length) return;\r\n    const json = jsonOf(blocks);\r\n    const html = embedBlocksInHtml(json, htmlOf(blocks)); // \uBB34\uC190\uC2E4 JSON\uC744 html data \uC18D\uC131\uC5D0 \uC784\uBCA0\uB4DC\r\n    const text = textOf(blocks);\r\n    const doCut = () => {\r\n      if (!cut) return;\r\n      const caret = deleteRangeAcross(editorEl, sel, { collapseEmpty: true });\r\n      clearCross();\r\n      placeCaret(caret);\r\n      commitChange(); // cut \uC0AD\uC81C\uB294 \uC4F0\uAE30 \uC131\uACF5 \uD6C4\uC5D0\uB9CC(\uB370\uC774\uD130 \uC720\uC2E4 \uBC29\uC9C0)\r\n    };\r\n    try {\r\n      if (\r\n        typeof navigator !== \"undefined\" && navigator.clipboard &&\r\n        typeof navigator.clipboard.write === \"function\" && typeof window.ClipboardItem === \"function\"\r\n      ) {\r\n        const item = new window.ClipboardItem({\r\n          \"text/html\": new Blob([html], { type: \"text/html\" }),\r\n          \"text/plain\": new Blob([text], { type: \"text/plain\" }),\r\n        });\r\n        navigator.clipboard.write([item]).then(doCut, () => {});\r\n        return;\r\n      }\r\n    } catch (_) {}\r\n    // \uBE44\uB3D9\uAE30 Clipboard \uBBF8\uC9C0\uC6D0 \uC2DC: \uD06C\uB85C\uC2A4\uB294 \uB124\uC774\uD2F0\uBE0C range\uAC00 \uBE44\uC5B4 execCommand \uD3F4\uBC31\uC774 \uBD80\uC815\uD655\uD558\uBBC0\uB85C \uC0DD\uB7B5(\uBB34\uB3D9\uC791).\r\n  }\r\n\r\n  function onKeydown(e) {\r\n    if (!isEditable() || !isActive() || isComposing() || e.isComposing) return;\r\n    const sel = getSel();\r\n    const mod = e.metaKey || e.ctrlKey;\r\n\r\n    if (mod && !e.altKey && (e.key === \"c\" || e.key === \"C\" || e.key === \"x\" || e.key === \"X\")) {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      copyCross(sel, e.key === \"x\" || e.key === \"X\");\r\n      return;\r\n    }\r\n    if (mod) return; // B/I/U \uB4F1\uC740 editing/\uD234\uBC14 \uACBD\uB85C\uB85C \uD1B5\uACFC\r\n    if (e.altKey) return;\r\n\r\n    if (e.key === \"Backspace\" || e.key === \"Delete\") {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      const caret = deleteRangeAcross(editorEl, sel, { collapseEmpty: true });\r\n      clearCross();\r\n      placeCaret(caret);\r\n      commitChange();\r\n      return;\r\n    }\r\n    if (e.key === \"Enter\" && !e.shiftKey) {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      const caret = deleteRangeAcross(editorEl, sel);\r\n      clearCross();\r\n      if (caret) {\r\n        placeCaret(caret);\r\n        handleEnter({ target: caret.island, preventDefault() {} }, () => {}); // join \uC9C0\uC810 \uBD84\uD560\r\n      }\r\n      commitChange();\r\n      return;\r\n    }\r\n    // \uC778\uC1C4 \uAC00\uB2A5\uD55C \uB2E8\uC77C \uBB38\uC790(\uBE44-IME) \u2192 \uC120\uD0DD \uC0AD\uC81C \uD6C4 \uADF8 \uC790\uB9AC\uC5D0 \uC0BD\uC785.\r\n    if (e.key && e.key.length === 1) {\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      const caret = deleteRangeAcross(editorEl, sel);\r\n      clearCross();\r\n      if (caret) insertCharAt(caret, e.key);\r\n      commitChange();\r\n      return;\r\n    }\r\n  }\r\n\r\n  editorEl.addEventListener(\"keydown\", onKeydown);\r\n  return {\r\n    destroy() {\r\n      editorEl.removeEventListener(\"keydown\", onKeydown);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * vanilla \uB9C8\uC6B4\uD2B8 \uC870\uB9BD \uB8E8\uD2B8(composition root) \u2014 mountLumirEditor.\r\n * \uAD00\uC2EC\uC0AC\uBCC4 \uBAA8\uB4C8(./editor/*)\uC744 \uBA85\uC2DC\uC801 \uC758\uC874\uC131 \uC8FC\uC785\uC73C\uB85C \uACB0\uC120\uD55C\uB2E4. \uAC01 \uBAA8\uB4C8\uC740 \uB3C5\uB9BD\uC801\uC774\uB77C\r\n * \uD55C \uAE30\uB2A5 \uC218\uC815\uC774 \uB2E4\uB978 \uAE30\uB2A5\uC73C\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uB294\uB2E4(\uACF5\uC720 \uD074\uB85C\uC800 \uC0C1\uD0DC \uCD5C\uC18C\uD654).\r\n *\r\n *   const editor = mountLumirEditor(containerEl, { initialContent, onContentChange });\r\n *   editor.getDocument(); editor.undo(); editor.redo(); editor.destroy();\r\n *\r\n *  - undo/redo(./editor/history): JSON \uC2A4\uB0C5\uC0F7 \uD788\uC2A4\uD1A0\uB9AC(\uB3D9\uC77C \uC2A4\uB0C5\uC0F7 \uCF54\uC5BC\uB808\uC2F1).\r\n *  - IME \uAC00\uB4DC: compositionstart~end \uB3D9\uC548 \uCEE4\uBC0B/\uC54C\uB9BC \uBCF4\uB958(\uD55C\uAE00 \uC870\uD569 1\uD68C\uB2F9 undo 1\uC2A4\uD15D).\r\n */\r\n\r\nimport { blocksToDom, domToBlocks, renderBlock, elToBlock, CUSTOM_BLOCK_TYPES } from './serialize/document.js';\r\nimport { liftFontSize } from './serialize/font-size.js';\r\nimport {\r\n  attachEditing,\r\n  tryMarkdown,\r\n  tryInlineMarkdown,\r\n  normalizeCodeTrailingNewline,\r\n} from './editing.js';\r\nimport { blocksToMarkdown, markdownToBlocks } from './serialize/markdown.js';\r\nimport { blocksToHtml, blocksToFullHtml } from './serialize/html.js';\r\nimport { attachSlashMenu } from './ui/slash-menu.js';\r\nimport { COLUMNS_DIVIDER_ICON } from './ui/icons.js';\r\nimport { attachEmojiPicker } from './ui/emoji-picker.js';\r\nimport { attachTableSizePicker } from './ui/table-size-picker.js';\r\nimport { attachFormatToolbar } from './ui/format-toolbar.js';\r\nimport { attachTableControls } from './table/table-controls.js';\r\nimport { createS3Uploader } from './upload/s3-uploader.js';\r\nimport { isImageFile, isVideoFile, isAudioFile } from './upload/file-validation.js';\r\nimport { attachFloatingMenu } from './ui/floating-menu.js';\r\nimport { attachSideMenu } from './ui/side-menu.js';\r\nimport { attachColumnControls } from './columns/column-controls.js';\r\nimport { registry } from './features/index.js'; // \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4(\uC2A4\uD399 \uB808\uC9C0\uC2A4\uD2B8\uB9AC) \u2014 \uC2AC\uB798\uC2DC \uB4F1 \uAE30\uC5EC \uC218\uC9D1\r\nimport { attachLinkToolbar } from './ui/link-toolbar.js';\r\nimport { attachFilePanel } from './ui/file-panel.js';\r\nimport {\r\n  parseHtmlToBlocks,\r\n  blocksFromText,\r\n  fitColumnWidths,\r\n  isBareUrl,\r\n  hasUrl,\r\n  linkifyToInline,\r\n} from './paste/paste-html.js';\r\nimport { normalizeExcelClipboardHtml } from './paste/excel-format.js';\r\nimport { rerenderTable } from './table/render.js';\r\nimport { LumirEditorError } from './errors/lumir-error.js';\r\nimport { resolveLocale } from './locale.js';\r\nimport { readActiveMarks, applyLink, insertInlineAtCursor, applyInlineMarkAcross, readActiveMarksAcross, setSelection } from './inline-format.js';\r\nimport { resolveEmbed } from './utils/url.js';\r\n\r\n// \uAD00\uC2EC\uC0AC\uBCC4 \uCD94\uCD9C \uBAA8\uB4C8\r\nimport {\r\n  DEFAULT_BLOCK_PROPS,\r\n  resolveInitialContent,\r\n  buildMediaBlock,\r\n  emptyTable,\r\n  emptyColumns,\r\n} from './editor/blocks.js';\r\nimport { createErrorReporter } from './editor/error-toast.js';\r\nimport { createUploadOverlay } from './editor/upload-overlay.js';\r\nimport {\r\n  applyEditable as applyEditableDom,\r\n  normalizeColumnsDom as normalizeColumnsDomEl,\r\n  applyResolveFileUrl as applyResolveFileUrlEl,\r\n} from './editor/dom-ops.js';\r\nimport { createBlurHighlight } from './editor/blur-highlight.js';\r\nimport { createMediaDeletionDetector } from './editor/media-detect.js';\r\nimport { createHistory } from './editor/history.js';\r\nimport { createPlaceholders } from './editor/placeholder.js';\r\nimport { attachCaretNav } from './editor/caret-nav.js';\r\nimport { attachBlockSelect, LUMIR_BLOCK_COPY_MIME } from './editor/block-select.js';\r\nimport { attachCrossBlockSelect } from './editor/cross-block-select.js';\r\nimport { attachCrossBlockEdit } from './editor/cross-block-edit.js';\r\nimport { deleteRangeAcross } from './editor/cross-block-range.js';\r\nimport { contentLen, crossBoundingRect } from './editor/cross-block-selection.js';\r\n\r\n/** editorEl \uC0C1\uC704(\uC790\uC2E0 \uD3EC\uD568)\uC5D0\uC11C \uC138\uB85C \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108\uB97C \uCC3E\uB294\uB2E4. \uC5C6\uC73C\uBA74 null(=\uD398\uC774\uC9C0/window \uC2A4\uD06C\uB864). */\r\nfunction getScrollParent(node) {\r\n  let el = node;\r\n  const getStyle = typeof getComputedStyle === 'function' ? getComputedStyle : null;\r\n  while (el && el.nodeType === 1 && el !== document.body && el !== document.documentElement) {\r\n    const oy = getStyle ? getStyle(el).overflowY : '';\r\n    if (oy === 'auto' || oy === 'scroll' || oy === 'overlay') return el;\r\n    el = el.parentElement;\r\n  }\r\n  return null;\r\n}\r\n\r\n/** \uBE44\uB3D9\uAE30 Clipboard \uACBD\uB85C\uAC00 text/html data \uC18D\uC131\uC5D0 \uC784\uBCA0\uB4DC\uD55C \uBB34\uC190\uC2E4 JSON \uD68C\uC218(\uCEE4\uC2A4\uD140 MIME \uBBF8\uC9C0\uC6D0 \uB300\uBE44). */\r\nfunction extractEmbeddedBlocks(html) {\r\n  if (!html || typeof DOMParser === 'undefined' || html.indexOf('data-lumir-block-copy') === -1) return '';\r\n  try {\r\n    const doc = new DOMParser().parseFromString(html, 'text/html');\r\n    const el = doc.querySelector('[data-lumir-block-copy]');\r\n    return el ? decodeURIComponent(el.getAttribute('data-lumir-block-copy') || '') : '';\r\n  } catch (_) { return ''; }\r\n}\r\n\r\n// \uBD99\uC5EC\uB123\uAE30 \uC815\uC81C(\uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8) \u2014 \uC81C\uB124\uB9AD \uD14D\uC2A4\uD2B8 \uD0C0\uC785 \u222A \uCEE4\uC2A4\uD140(\uB808\uC9C0\uC2A4\uD2B8\uB9AC) \uD0C0\uC785. \uBBF8\uC9C0 \uD0C0\uC785\uC740 \uB4DC\uB86D.\r\nconst GENERIC_BLOCK_TYPES = new Set([\r\n  'paragraph', 'heading', 'bulletListItem', 'numberedListItem', 'checkListItem',\r\n  'toggleListItem', 'quote', 'codeBlock', 'divider',\r\n]);\r\nconst KNOWN_PASTE_TYPES = new Set([...GENERIC_BLOCK_TYPES, ...CUSTOM_BLOCK_TYPES]);\r\n\r\n/** columnList \uC790\uC2DD \uCEEC\uB7FC \uC815\uC81C \u2014 \uC774 \uBAA8\uB378\uC758 \uCEEC\uB7FC\uC740 type \uD544\uB4DC\uAC00 \uC5C6\uB2E4({props,children}). id\uB294 \uC0DD\uB7B5. */\r\nfunction sanitizeColumn(c) {\r\n  if (!c || typeof c !== 'object') return null;\r\n  return { props: c.props, children: Array.isArray(c.children) ? sanitizeBlocks(c.children) : [] };\r\n}\r\n/**\r\n * \uC2E0\uB8B0 \uACBD\uACC4: \uBD99\uC5EC\uB123\uAE30 JSON\uC744 \uC54C\uB824\uC9C4 \uD0C0\uC785 \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8\uB85C \uC815\uC81C + \uC804 \uB808\uBCA8 id \uC81C\uAC70(\uBCF5\uC81C \uC2DC data-id \uC911\uBCF5 \uBC29\uC9C0).\r\n * props/content\uB294 \uB80C\uB354 \uC2DC \uBB34\uD574\uD654(inline escape\u00B7neutralizeUrl\u00B7isAllowedEmbedUrl)\uB418\uBBC0\uB85C verbatim \uBCF4\uC874.\r\n */\r\nfunction sanitizeBlocks(arr) {\r\n  const out = [];\r\n  for (const b of Array.isArray(arr) ? arr : []) {\r\n    if (!b || typeof b !== 'object' || typeof b.type !== 'string') continue;\r\n    if (b.type === 'columnList') {\r\n      const cols = (Array.isArray(b.children) ? b.children : []).map(sanitizeColumn).filter(Boolean);\r\n      out.push({ type: 'columnList', props: b.props, content: b.content, children: cols });\r\n    } else if (KNOWN_PASTE_TYPES.has(b.type)) {\r\n      const n = { type: b.type };\r\n      if (b.props !== undefined) n.props = b.props;\r\n      if (b.content !== undefined) n.content = b.content;\r\n      n.children = Array.isArray(b.children) ? sanitizeBlocks(b.children) : [];\r\n      out.push(n);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nexport function mountLumirEditor(container, opts) {\r\n  if (typeof document === 'undefined')\r\n    throw new Error('mountLumirEditor: DOM(document) \uD544\uC694');\r\n  opts = opts || {};\r\n\r\n  const editorEl = document.createElement('div');\r\n  // \"bn-editor\"\uB294 BlockNote \uD074\uB798\uC2A4 \uBCC4\uCE6D \u2014 \uC18C\uBE44\uCC98\uC758 [&_.bn-editor]:\u2026 \uB4F1 \uAE30\uC874 CSS \uC624\uBC84\uB77C\uC774\uB4DC \uD638\uD658.\r\n  editorEl.className = 'lumir-editor bn-editor';\r\n  const _initial = resolveInitialContent(opts);\r\n  blocksToDom(_initial, editorEl);\r\n  if (container) container.appendChild(editorEl);\r\n\r\n  // \uCD08\uAE30 \uD45C \uD3ED \uCC44\uC6C0(fill): \uCF58\uD150\uCE20 \uD3ED\uBCF4\uB2E4 \uC881\uAC8C \uB4E4\uC5B4\uC628 \uD45C(\uB2E4\uB978 \uD3ED \uAE30\uC900\uC73C\uB85C \uB9CC\uB4E0 \uD45C\u00B7\uAD6C\uBC84\uC804 import \uB4F1)\uB97C\r\n  // \uCF58\uD150\uCE20 \uD3ED\uC5D0 \uB9DE\uCDB0 \uC5F4\uD3ED\uC744 \uBE44\uB840 \uD655\uB300\uD55C\uB2E4. \uC774\uBBF8 \uCC44\uC6E0\uAC70\uB098 \uB354 \uB113\uC740 \uD45C(\u2192 CSS max-width/\uD3B8\uC9D1 \uC2DC fit \uC774 \uCD95\uC18C)\uB294 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\r\n  // \uC5F4\uD3ED\uC774 \uC77C\uBD80\uB77C\uB3C4 auto(null) \uC774\uBA74 CSS \uC790\uB3D9\uBD84\uBC30\uC5D0 \uB9E1\uAE30\uACE0 \uAC74\uB108\uB6F4\uB2E4. \uBAA8\uBC14\uC77C(\uAC00\uB85C \uC2A4\uD06C\uB864 \uC815\uCC45)\uC740 \uC81C\uC678.\r\n  function fillInitialTablesToWidth(root) {\r\n    if (typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia('(max-width: 640px)').matches) return;\r\n    root.querySelectorAll('.lumir-tbl').forEach((table) => {\r\n      if (!table.__model) return;\r\n      const content = table.parentElement; // .content\r\n      // .content \uB294 \uC88C\uC6B0 padding 0(table.css) \u2192 \uCF58\uD150\uCE20\uBC15\uC2A4 \uD3ED = clientWidth. \uC774 \uD3ED\uAE4C\uC9C0 \uCC44\uC6B0\uBA74 \uD45C\uAC00 \uC88C\u00B7\uC6B0\uBCC0 \uBAA8\uB450\r\n      // \uCF58\uD150\uCE20 \uB05D\uC120\uC5D0 flush(= \uB124\uC774\uD2F0\uBE0C \uD45C\uC640 \uB3D9\uC77C \uD3ED\u00B7\uB3D9\uC77C \uC815\uB82C).\r\n      const avail = content && content.clientWidth ? content.clientWidth : 0;\r\n      if (!(avail > 0)) return;\r\n      const cw = table.__model.columnWidths;\r\n      if (!Array.isArray(cw) || !cw.length || cw.some((w) => !w)) return;\r\n      const total = cw.reduce((a, b) => a + (b || 0), 0);\r\n      if (total <= 0 || total >= avail) return;\r\n      const f = avail / total;\r\n      const next = cw.map((w) => Math.round(w * f));\r\n      next[next.length - 1] += avail - next.reduce((a, b) => a + b, 0); // \uBC18\uC62C\uB9BC \uC794\uCC28 \uBCF4\uC815 \u2192 \uD569=avail\r\n      table.__model.columnWidths = next;\r\n      rerenderTable(table);\r\n    });\r\n  }\r\n  fillInitialTablesToWidth(editorEl);\r\n\r\n  // A8: \uD45C\uC2DC\uC6A9 URL \uD574\uC11D \uB798\uD37C(\uC6D0\uBCF8 __props.url \uBCF4\uC874 \u2192 \uC9C1\uB82C\uD654 \uBB34\uC601\uD5A5).\r\n  const applyResolveFileUrl = () =>\r\n    applyResolveFileUrlEl(editorEl, opts.resolveFileUrl);\r\n  applyResolveFileUrl();\r\n\r\n  let onChange =\r\n    typeof opts.onContentChange === 'function' ? opts.onContentChange : null;\r\n  const onSelectionChange =\r\n    typeof opts.onSelectionChange === 'function'\r\n      ? opts.onSelectionChange\r\n      : null;\r\n  const L = resolveLocale(opts.locale);\r\n\r\n  // --- \uCF54\uC5B4 props (P7): className / theme / placeholder / editable ---\r\n  if (typeof opts.className === 'string' && opts.className)\r\n    editorEl.className += ' ' + opts.className;\r\n  // theme: \uBB38\uC790\uC5F4(\"light\"/\"dark\"/\uCEE4\uC2A4\uD140)\uB9CC data-theme\uB85C. \uC6D0\uBCF8\uC758 \uAC1D\uCCB4 \uD14C\uB9C8(Mantine)\uB294 1:1 \uBD88\uAC00 \u2192\r\n  // \uAC1D\uCCB4\uB294 dark \uC758\uB3C4\uB9CC \uAC10\uC9C0\uD558\uACE0 \uADF8 \uC678 \uAE30\uBCF8(light). \"[object Object]\" \uC9C1\uB82C\uD654 \uBC29\uC9C0(\uD638\uD658 \uD558\uB4DC\uB2DD).\r\n  function applyThemeOpt(theme) {\r\n    if (typeof theme === 'string' && theme)\r\n      editorEl.setAttribute('data-theme', theme);\r\n    else if (theme && typeof theme === 'object')\r\n      editorEl.setAttribute('data-theme', theme.dark ? 'dark' : 'light');\r\n    else editorEl.removeAttribute('data-theme');\r\n  }\r\n  if (opts.theme) applyThemeOpt(opts.theme);\r\n  if (opts.columnDivider) editorEl.classList.add('lumir-col-divider');\r\n  // --- \uAD6C\uC131 \uD1A0\uAE00 (Tier-2) ---\r\n  const cfgTables = opts.tables || {};\r\n  const headingLevels =\r\n    opts.heading &&\r\n    Array.isArray(opts.heading.levels) &&\r\n    opts.heading.levels.length\r\n      ? opts.heading.levels.slice()\r\n      : [1, 2, 3, 4, 5, 6];\r\n  const trailingBlock = opts.trailingBlock !== false; // \uB05D\uC5D0 \uC790\uB3D9 \uBE48 \uBB38\uB2E8 \uC720\uC9C0\r\n  const tabBehavior =\r\n    opts.tabBehavior === 'prefer-indent'\r\n      ? 'prefer-indent'\r\n      : 'prefer-navigate-ui';\r\n  const placeholderText =\r\n    opts.placeholder != null ? String(opts.placeholder) : L.placeholder;\r\n  let editable = opts.editable !== false;\r\n\r\n  // --- \uC5C5\uB85C\uB4DC \uC124\uC815 (\uC6B0\uC120\uC21C\uC704: uploadFile > s3Upload > \uC5C6\uC74C) ---\r\n  const onImageDelete =\r\n    typeof opts.onImageDelete === 'function' ? opts.onImageDelete : null;\r\n\r\n  // \uC5D0\uB7EC \uD1A0\uC2A4\uD2B8 + LumirEditorError \uC815\uADDC\uD654 \uB9AC\uD3EC\uD130\r\n  const errorReporter = createErrorReporter(opts);\r\n  const onError = errorReporter.onError;\r\n\r\n  // \uC5C5\uB85C\uB4DC \uC9C4\uD589\uB960 \uC624\uBC84\uB808\uC774 + \uC5C5\uB85C\uB354\r\n  const uploadOverlay = createUploadOverlay(L);\r\n  const showProgress = uploadOverlay.showProgress;\r\n  const hideProgress = uploadOverlay.hideProgress;\r\n  let uploader = null;\r\n  if (typeof opts.uploadFile === 'function') uploader = opts.uploadFile;\r\n  else if (opts.s3Upload) {\r\n    const cfg = { ...opts.s3Upload };\r\n    const userProg = cfg.onProgress;\r\n    cfg.onProgress = (p) => {\r\n      showProgress(p);\r\n      if (typeof userProg === 'function') userProg(p);\r\n    };\r\n    uploader = createS3Uploader(cfg);\r\n  }\r\n\r\n  // --- \uC9C1\uB82C\uD654 ---\r\n  function getDocument() {\r\n    return domToBlocks(editorEl);\r\n  }\r\n\r\n  // --- placeholder + \uC77D\uAE30\uC804\uC6A9 (P7) ---\r\n  const placeholders = createPlaceholders({\r\n    editorEl,\r\n    getEditable: () => editable,\r\n    placeholderText,\r\n  });\r\n  const refreshPlaceholders = placeholders.refresh;\r\n  const focusedContent = placeholders.focusedContent;\r\n  const applyEditable = (on) => applyEditableDom(editorEl, on);\r\n\r\n  // --- \uD788\uC2A4\uD1A0\uB9AC(undo/redo): \uC2A4\uD0DD\uC740 createHistory \uC18C\uC720, DOM \uBCF5\uC6D0(restore)\u00B7\uC54C\uB9BC(fireChange) \uC8FC\uC785 ---\r\n  function restore(snap) {\r\n    // M1: \uC7AC\uAD6C\uCD95 \uC804, \uC5F4\uB9B0 \uC784\uC2DC UI(\uBA54\uB274/\uD234\uBC14)\uAC00 \uACE7 detached\uB420 \uB178\uB4DC\uB97C \uAC00\uB9AC\uD0A4\uC9C0 \uC54A\uB3C4\uB85D \uB2EB\uB294\uB2E4.\r\n    if (slash) slash.close();\r\n    if (blockSelect) blockSelect.clear(); // \uC7AC\uAD6C\uCD95 \uC804 \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC \uD574\uC81C(\uACE7 detached\uB420 \uB178\uB4DC \uCC38\uC870 \uC815\uB9AC)\r\n    if (crossSelect) crossSelect.clear(); // \uD06C\uB85C\uC2A4\uBE14\uB85D \uC120\uD0DD\uB3C4 \uD574\uC81C(detached\uB420 \uC12C \uCC38\uC870/\uD558\uC774\uB77C\uC774\uD2B8 \uC815\uB9AC)\r\n    if (linkToolbar) linkToolbar.hide();\r\n    if (sideMenu) {\r\n      sideMenu.hide();\r\n      if (sideMenu.closeDragMenu) sideMenu.closeDragMenu();\r\n    }\r\n    if (emojiPicker && emojiPicker.close) emojiPicker.close();\r\n    // \uC2A4\uD06C\uB864 \uC704\uCE58 \uBCF4\uC874: blocksToDom\uC774 innerHTML\uC744 \uBE44\uC6B0\uBA74 \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108 \uB192\uC774\uAC00 \uC21C\uAC04 0\uC73C\uB85C \uBD95\uAD34\uB418\uBA70\r\n    // \uCD5C\uC0C1\uB2E8\uC73C\uB85C \uD284\uB2E4(undo/redo \uC2DC \uC2DC\uC810 \uC810\uD504). \uC7AC\uAD6C\uCD95 \uC804 \uC704\uCE58\uB97C \uB2F4\uC544 \uB450\uC5C8\uB2E4\uAC00 \uBCF5\uC6D0\uD55C\uB2E4.\r\n    const scroller = getScrollParent(editorEl);\r\n    const sTop = scroller ? scroller.scrollTop : 0;\r\n    const sLeft = scroller ? scroller.scrollLeft : 0;\r\n    const winX = typeof window !== 'undefined' ? window.scrollX : 0;\r\n    const winY = typeof window !== 'undefined' ? window.scrollY : 0;\r\n    blocksToDom(snap, editorEl); // DOM \uC7AC\uAD6C\uCD95(fontSize lift \uD3EC\uD568). \uB9AC\uC2A4\uB108\uB294 editorEl\uC5D0 \uC788\uC5B4 \uC720\uC9C0\uB428.\r\n    applyEditable(editable); // \uC7AC\uB80C\uB354 \uD6C4 \uC77D\uAE30\uC804\uC6A9/placeholder \uC7AC\uC801\uC6A9\r\n    refreshPlaceholders();\r\n    applyResolveFileUrl(); // A8: \uC7AC\uB80C\uB354 \uD6C4 \uD45C\uC2DC\uC6A9 URL \uC7AC\uD574\uC11D\r\n    refreshFeatureBlocks(); // \uC7AC\uAD6C\uCD95 \uD6C4 \uAE30\uB2A5 \uCEE8\uD2B8\uB864\uB7EC \uC7AC\uC2A4\uCE94(setBlocks \uACBD\uB85C\uC640 \uC815\uD569)\r\n    // \uC2A4\uD06C\uB864 \uBCF5\uC6D0(\uB808\uC774\uC544\uC6C3 \uD655\uC815 \uD6C4). \uCEE8\uD14C\uC774\uB108\u00B7\uD398\uC774\uC9C0 \uC2A4\uD06C\uB864 \uBAA8\uB450 \uC6D0\uBCF5. \uC704\uCE58\uAC00 \uC2E4\uC81C\uB85C \uBC14\uB010 \uACBD\uC6B0\uC5D0\uB9CC.\r\n    if (scroller) {\r\n      if (scroller.scrollTop !== sTop) scroller.scrollTop = sTop;\r\n      if (scroller.scrollLeft !== sLeft) scroller.scrollLeft = sLeft;\r\n    }\r\n    if (\r\n      typeof window !== 'undefined' && typeof window.scrollTo === 'function' &&\r\n      (window.scrollX !== winX || window.scrollY !== winY)\r\n    ) {\r\n      try { window.scrollTo(winX, winY); } catch (_) {}\r\n    }\r\n  }\r\n  const { commit, undo, redo, canUndo, canRedo } = createHistory({\r\n    getDocument,\r\n    restore,\r\n    fireChange,\r\n  });\r\n  commit(); // \uCD08\uAE30 \uC2A4\uB0C5\uC0F7\r\n\r\n  // --- \uBCC0\uACBD \uC54C\uB9BC + IME \uAC00\uB4DC ---\r\n  let composing = false;\r\n  const detectDeletedMedia = createMediaDeletionDetector(\r\n    onImageDelete,\r\n    opts.initialContent || [],\r\n  );\r\n  function fireChange() {\r\n    const doc = getDocument();\r\n    detectDeletedMedia(doc);\r\n    refreshPlaceholders();\r\n    if (onChange) onChange(doc);\r\n  }\r\n\r\n  function handleEdit(e) {\r\n    if (!editable) return;\r\n    if (composing) return; // \uC870\uD569 \uC911\uC5D0\uB294 \uCEE4\uBC0B/\uC54C\uB9BC \uBCF4\uB958(IME \uAC00\uB4DC)\r\n    const content =\r\n      e && e.target && e.target.closest && e.target.closest('.content');\r\n    if (\r\n      content &&\r\n      editorEl.contains(content) &&\r\n      !(content.closest && content.closest('.lumir-tbl'))\r\n    ) {\r\n      const b = content.closest('.block');\r\n      // \uB9C8\uD06C\uB2E4\uC6B4 `---` \u2192 \uD398\uC774\uC9C0 \uB098\uB204\uAE30(none-content \uBE14\uB85D\uC774\uB77C changeBlockType \uACBD\uB85C \uB300\uC2E0 \uC9C1\uC811 \uC0BD\uC785)\r\n      if (\r\n        b &&\r\n        b.dataset.type === 'paragraph' &&\r\n        content.textContent === '---'\r\n      ) {\r\n        content.textContent = '';\r\n        try {\r\n          const r = document.createRange();\r\n          r.selectNodeContents(content);\r\n          r.collapse(true);\r\n          const s = window.getSelection();\r\n          s.removeAllRanges();\r\n          s.addRange(r);\r\n        } catch (_) {}\r\n        insertPageBreak(); // \uB0B4\uBD80\uC5D0\uC11C commit/fireChange \uC218\uD589\r\n        return;\r\n      }\r\n      // \uBE14\uB85D \uB9C8\uD06C\uB2E4\uC6B4(\uC2DC\uC791 \uD2B8\uB9AC\uAC70) \uC6B0\uC120, \uC544\uB2C8\uBA74 \uC778\uB77C\uC778 \uB9C8\uD06C\uB2E4\uC6B4(\uB2EB\uB294 \uAD6C\uBD84\uC790) \uC2DC\uB3C4\r\n      if (!tryMarkdown(content, headingLevels)) tryInlineMarkdown(content);\r\n      // \uCF54\uB4DC\uBE14\uB85D: \uD0C0\uC774\uD551 \uC911 \uD6C4\uD589 \uAC1C\uD589 filler \uB3D9\uAE30\uD654(\uBE48 \uB9C8\uC9C0\uB9C9 \uC904 \uB80C\uB354 \uBCF4\uC815)\r\n      if (b && b.dataset.type === 'codeBlock')\r\n        normalizeCodeTrailingNewline(content);\r\n    }\r\n    commit();\r\n    fireChange();\r\n  }\r\n  editorEl.addEventListener('compositionstart', () => {\r\n    composing = true;\r\n    // \uD06C\uB85C\uC2A4 \uC120\uD0DD \uC704\uC5D0\uC11C IME \uC870\uD569 \uC2DC\uC791 \u2192 \uC120\uD0DD \uC0AD\uC81C \uD6C4 join \uCE90\uB7FF\uC5D0\uC11C \uC870\uD569 \uC9C4\uD589(compositionend\uAC00 1\uD68C \uCEE4\uBC0B).\r\n    if (crossSelect && crossSelect.isActive()) {\r\n      const caret = deleteRangeAcross(editorEl, crossSelect.get());\r\n      crossSelect.clear();\r\n      if (caret && caret.island) {\r\n        try {\r\n          caret.island.focus();\r\n          setSelection(caret.island, caret.offset, caret.offset);\r\n        } catch (_) {}\r\n      }\r\n    }\r\n  });\r\n  editorEl.addEventListener('compositionend', () => {\r\n    composing = false;\r\n    commit(); // \uC870\uD569 \uACB0\uACFC\uB97C 1\uC2A4\uD15D\uC73C\uB85C \uCEE4\uBC0B\r\n    fireChange();\r\n  });\r\n  editorEl.addEventListener('input', handleEdit);\r\n\r\n  // \uD1A0\uAE00(\uC811\uC744 \uC218 \uC788\uB294) \uBE14\uB85D \uCE90\uB7FF \uD074\uB9AD \u2192 children \uC811\uAE30/\uD3BC\uCE58\uAE30(\uD718\uBC1C\uC131 UI \uC0C1\uD0DC, \uC9C1\uB82C\uD654 \uC548 \uD568)\r\n  editorEl.addEventListener('mousedown', (e) => {\r\n    const caret = e.target.closest && e.target.closest('.lumir-toggle');\r\n    if (!caret) return;\r\n    e.preventDefault(); // \uCE90\uB7FF \uD074\uB9AD\uC774 \uCE90\uB7FF \uD3EC\uCEE4\uC2A4/\uC120\uD0DD \uC774\uB3D9\uC744 \uC77C\uC73C\uD0A4\uC9C0 \uC54A\uB3C4\uB85D\r\n    const b = caret.closest('.block');\r\n    if (b) b.classList.toggle('collapsed');\r\n  });\r\n\r\n  // \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uCCB4\uD06C\uBC15\uC2A4 \uD074\uB9AD \u2192 checked \uD1A0\uAE00(props.checked \uC9C1\uB82C\uD654 + \uBCC0\uACBD \uC54C\uB9BC)\r\n  editorEl.addEventListener('mousedown', (e) => {\r\n    if (!editable) return;\r\n    const chk = e.target.closest && e.target.closest('.marker .check, .marker');\r\n    if (!chk) return;\r\n    const b = chk.closest && chk.closest('.block[data-type=\"checkListItem\"]');\r\n    if (!b) return;\r\n    e.preventDefault();\r\n    const now = !b.classList.contains('checked');\r\n    b.classList.toggle('checked', now);\r\n    if (!b.__props)\r\n      b.__props = {\r\n        textColor: 'default',\r\n        backgroundColor: 'default',\r\n        textAlignment: 'left',\r\n      };\r\n    b.__props.checked = now;\r\n    structuralChange();\r\n  });\r\n\r\n  // Undo/Redo \uD0A4\uBCF4\uB4DC (Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z, Ctrl+Y) \u2014 \uB124\uC774\uD2F0\uBE0C contenteditable undo\uAC00\r\n  // JSON \uC2A4\uB0C5\uC0F7 \uD788\uC2A4\uD1A0\uB9AC\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uAC00\uB85C\uCC44 \uC790\uCCB4 \uD788\uC2A4\uD1A0\uB9AC\uB85C \uCC98\uB9AC(\uD45C \uC140 \uD3EC\uD568 \uC5D0\uB514\uD130 \uC804\uC5ED).\r\n  function focusAfterRestore() {\r\n    const c = editorEl.querySelector(\r\n      \".content[contenteditable='true'], td.lumir-cell[contenteditable='true']\",\r\n    );\r\n    if (c) {\r\n      try {\r\n        c.focus({ preventScroll: true }); // \uCCAB \uD3B8\uC9D1\uC694\uC18C \uD3EC\uCEE4\uC2A4\uAC00 \uBDF0\uB97C \uCD5C\uC0C1\uB2E8\uC73C\uB85C \uC2A4\uD06C\uB864\uD558\uC9C0 \uC54A\uB3C4\uB85D(undo/redo \uC2DC\uC810 \uC810\uD504 \uBC29\uC9C0)\r\n        const r = document.createRange();\r\n        r.selectNodeContents(c);\r\n        r.collapse(false);\r\n        const s = window.getSelection();\r\n        s.removeAllRanges();\r\n        s.addRange(r);\r\n      } catch (_) {}\r\n    }\r\n  }\r\n  editorEl.addEventListener('keydown', (e) => {\r\n    if (!editable) return;\r\n    if (e.isComposing || composing) return; // IME \uAC00\uB4DC\r\n    if (!(e.ctrlKey || e.metaKey) || e.altKey) return;\r\n    const k = (e.key || '').toLowerCase();\r\n    if (k === 'z' && !e.shiftKey) {\r\n      e.preventDefault();\r\n      if (undo()) focusAfterRestore();\r\n    } else if ((k === 'z' && e.shiftKey) || k === 'y') {\r\n      e.preventDefault();\r\n      if (redo()) focusAfterRestore();\r\n    } else if (k === 'k') {\r\n      e.preventDefault();\r\n      if (linkToolbar) linkToolbar.promptAdd();\r\n    } // \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC5D0 \uB9C1\uD06C \uCD94\uAC00\r\n  });\r\n\r\n  // --- \uC5C5\uB85C\uB4DC \uD30C\uC774\uD504\uB77C\uC778 (P5-\u2462): \uB4DC\uB86D/\uBD99\uC5EC\uB123\uAE30/\uC2AC\uB798\uC2DC/\uBC84\uD2BC \u2192 \uC5C5\uB85C\uB4DC \u2192 \uBBF8\uB514\uC5B4 \uBE14\uB85D \uC0BD\uC785 ---\r\n  function currentBlock() {\r\n    const sel = window.getSelection();\r\n    if (!sel || !sel.rangeCount) return null;\r\n    const node = sel.getRangeAt(0).startContainer;\r\n    const el = node.nodeType === 1 ? node : node.parentElement;\r\n    return el ? el.closest('.block') : null;\r\n  }\r\n  function insertMediaBlock(type, url, name) {\r\n    const blockObj = buildMediaBlock(type, url, name);\r\n    const newEl = renderBlock(blockObj);\r\n    const anchor = currentBlock() || editorEl.lastElementChild;\r\n    if (anchor && anchor.classList && anchor.classList.contains('block')) {\r\n      const c = anchor.querySelector('.content');\r\n      const emptyPara =\r\n        anchor.dataset.type === 'paragraph' && c && c.textContent.trim() === '';\r\n      if (emptyPara) anchor.replaceWith(newEl);\r\n      else anchor.after(newEl);\r\n    } else {\r\n      editorEl.appendChild(newEl);\r\n    }\r\n    if (trailingBlock && !newEl.nextElementSibling)\r\n      newEl.after(\r\n        renderBlock({\r\n          type: 'paragraph',\r\n          props: DEFAULT_BLOCK_PROPS(),\r\n          content: [],\r\n          children: [],\r\n        }),\r\n      );\r\n    applyResolveFileUrl(); // A8\r\n    commit();\r\n    fireChange();\r\n  }\r\n  async function insertFile(file) {\r\n    // \uC77C\uBC18 \uD30C\uC77C \uC5C5\uB85C\uB4DC\uB294 \uCC28\uB2E8(\uC774\uBBF8\uC9C0/\uBE44\uB514\uC624/\uC624\uB514\uC624\uB9CC \u2014 \uBE44\uB514\uC624/\uC624\uB514\uC624\uB294 allow \uC635\uC158 \uD544\uC694)\r\n    const img = isImageFile(file, opts.maxImageFileSize);\r\n    const vid =\r\n      opts.allowVideoUpload && isVideoFile(file, opts.maxVideoFileSize);\r\n    const aud =\r\n      opts.allowAudioUpload && isAudioFile(file, opts.maxAudioFileSize);\r\n    if (!img && !vid && !aud) {\r\n      onError(\r\n        LumirEditorError.invalidFileType(\r\n          file && file.name ? file.name : 'file',\r\n          !!opts.allowVideoUpload,\r\n        ),\r\n      );\r\n      return;\r\n    }\r\n    if (!uploader) {\r\n      // \uC5C5\uB85C\uB354(uploadFile/s3Upload) \uBBF8\uC124\uC815 = \uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC \uBE44\uD65C\uC131. \uAC1C\uBC1C\uC790\uC6A9 \uC124\uC815 \uC5D0\uB7EC\uAC00 \uC544\uB2C8\uB77C\r\n      // \uC0AC\uC6A9\uC790\uC6A9 \uC548\uB0B4 \uD1A0\uC2A4\uD2B8\uB9CC \uB744\uC6B0\uACE0 \uC870\uC6A9\uD788 \uBB34\uC2DC(\uCF58\uC194 \uC5D0\uB7EC\u00B7onError \uCF5C\uBC31 \uBC1C\uC0DD \uC548 \uD568).\r\n      errorReporter.showToast(L.upload.disabled);\r\n      return;\r\n    }\r\n    showProgress(0);\r\n    const kind = img ? 'image' : vid ? 'video' : 'audio';\r\n    if (typeof opts.onUploadStart === 'function') {\r\n      try {\r\n        opts.onUploadStart({ file, kind });\r\n      } catch (_) {}\r\n    } // A9\r\n    let uploadedUrl, uploadErr;\r\n    try {\r\n      uploadedUrl = await uploader(file);\r\n      insertMediaBlock(kind, uploadedUrl, file && file.name);\r\n    } catch (e) {\r\n      uploadErr =\r\n        e instanceof Error\r\n          ? e\r\n          : new Error(e && e.message ? e.message : '\uC5C5\uB85C\uB4DC \uC2E4\uD328');\r\n      onError(LumirEditorError.uploadFailed(uploadErr.message, uploadErr));\r\n    } finally {\r\n      hideProgress();\r\n      if (typeof opts.onUploadEnd === 'function') {\r\n        try {\r\n          opts.onUploadEnd({ file, kind, url: uploadedUrl, error: uploadErr });\r\n        } catch (_) {}\r\n      } // A9\r\n    }\r\n  }\r\n  async function insertFiles(files) {\r\n    for (const f of files) await insertFile(f);\r\n  }\r\n  const isMedia = (f) =>\r\n    isImageFile(f, opts.maxImageFileSize) ||\r\n    (opts.allowVideoUpload && isVideoFile(f, opts.maxVideoFileSize)) ||\r\n    (opts.allowAudioUpload && isAudioFile(f, opts.maxAudioFileSize));\r\n  const fileInput = document.createElement('input');\r\n  fileInput.type = 'file';\r\n  // \uC77C\uBC18 \uD30C\uC77C \uC5C5\uB85C\uB4DC \uCC28\uB2E8: \uD56D\uC0C1 \uC774\uBBF8\uC9C0(+\uD5C8\uC6A9 \uC2DC \uBE44\uB514\uC624/\uC624\uB514\uC624)\uB9CC \uC120\uD0DD \uAC00\uB2A5\r\n  fileInput.accept = [\r\n    'image/*',\r\n    opts.allowVideoUpload && 'video/*',\r\n    opts.allowAudioUpload && 'audio/*',\r\n  ]\r\n    .filter(Boolean)\r\n    .join(',');\r\n  fileInput.style.display = 'none';\r\n  fileInput.addEventListener('change', () => {\r\n    const files = fileInput.files ? [...fileInput.files] : [];\r\n    fileInput.value = '';\r\n    if (files.length) insertFiles(files);\r\n  });\r\n  function openImagePicker() {\r\n    fileInput.click();\r\n  }\r\n  editorEl.addEventListener('drop', (e) => {\r\n    if (!editable) return;\r\n    const dt = e.dataTransfer;\r\n    const files = dt && dt.files ? [...dt.files] : [];\r\n    const media = files.filter(isMedia);\r\n    if (media.length) {\r\n      e.preventDefault();\r\n      insertFiles(media);\r\n      return;\r\n    } // \uB370\uC2A4\uD06C\uD1B1 \uC774\uBBF8\uC9C0 \uD30C\uC77C \u2192 \uC5C5\uB85C\uB4DC\r\n    // \uD30C\uC77C\uC774 \uC544\uB2CC \uB4DC\uB798\uADF8(\uC6F9\uD398\uC774\uC9C0 \uC774\uBBF8\uC9C0/URL/HTML) \u2192 html/text \uACBD\uB85C(\uC774\uBBF8\uC9C0\u00B7\uD45C \uB4F1 \uAD6C\uC870 \uD30C\uC2F1)\r\n    const html = dt && dt.getData ? dt.getData('text/html') : '';\r\n    const text =\r\n      dt && dt.getData\r\n        ? dt.getData('text/uri-list') || dt.getData('text/plain') || ''\r\n        : '';\r\n    if ((html || text) && handlePasteContent(html, text)) e.preventDefault();\r\n  });\r\n  editorEl.addEventListener('dragover', (e) => {\r\n    if (!editable) return;\r\n    const types =\r\n      e.dataTransfer && e.dataTransfer.types ? [...e.dataTransfer.types] : [];\r\n    // \uD30C\uC77C\uBFD0 \uC544\uB2C8\uB77C \uC6F9 \uC774\uBBF8\uC9C0/URL \uB4DC\uB798\uADF8(text/html\u00B7uri-list)\uB3C4 drop\uC744 \uBC1B\uB3C4\uB85D \uAE30\uBCF8\uB3D9\uC791 \uCC28\uB2E8\r\n    if (\r\n      types.includes('Files') ||\r\n      types.includes('text/html') ||\r\n      types.includes('text/uri-list')\r\n    )\r\n      e.preventDefault();\r\n  });\r\n  function insertBlocksAtCursor(blocks) {\r\n    if (!blocks || !blocks.length) return;\r\n    const els = blocks.map(renderBlock);\r\n    const anchor = currentBlock() || editorEl.lastElementChild;\r\n    let last = null;\r\n    if (anchor && anchor.classList && anchor.classList.contains('block')) {\r\n      const c = anchor.querySelector('.content');\r\n      const emptyPara =\r\n        anchor.dataset.type === 'paragraph' && c && c.textContent.trim() === '';\r\n      let ref = anchor;\r\n      els.forEach((el, i) => {\r\n        if (i === 0 && emptyPara) anchor.replaceWith(el);\r\n        else ref.after(el);\r\n        ref = el;\r\n        last = el;\r\n      });\r\n    } else {\r\n      els.forEach((el) => {\r\n        editorEl.appendChild(el);\r\n        last = el;\r\n      });\r\n    }\r\n    if (trailingBlock && last && !last.nextElementSibling)\r\n      last.after(\r\n        renderBlock({\r\n          type: 'paragraph',\r\n          props: DEFAULT_BLOCK_PROPS(),\r\n          content: [],\r\n          children: [],\r\n        }),\r\n      );\r\n    els.forEach((el) => {\r\n      const tables =\r\n        el.dataset && el.dataset.type === 'table'\r\n          ? [el]\r\n          : [...el.querySelectorAll('.block[data-type=\"table\"]')]; // \uCEEC\uB7FC \uB4F1 \uC911\uCCA9 \uD45C \uD3EC\uD568\r\n      tables.forEach(fitTableToWidth);\r\n    }); // \uB113\uC740\uD45C \uD3ED \uB9DE\uCDA4\r\n    refreshFeatureBlocks(); // \uBD99\uC5EC\uB123\uC740 \uAE30\uB2A5 \uBE14\uB85D \uCEE8\uD2B8\uB864\uB7EC \uAC31\uC2E0\r\n    commit();\r\n    fireChange();\r\n    return els; // \uC0BD\uC785\uB41C \uCD5C\uC0C1\uC704 \uBE14\uB85D \uC5D8\uB9AC\uBA3C\uD2B8(\uBD99\uC5EC\uB123\uAE30 \uC774\uBBF8\uC9C0 \uBE44\uB3D9\uAE30 \uC5C5\uB85C\uB4DC\uAC00 \uC774\uBBF8\uC9C0 el\uC744 \uCC3E\uB294 \uB370 \uC0AC\uC6A9)\r\n  }\r\n\r\n  // --- \uBD99\uC5EC\uB123\uAE30 \uBBF8\uB514\uC5B4 \uCC98\uB9AC (Word \uB4F1 HTML \uACBD\uB85C) ---\r\n  // DnD/\uC774\uBBF8\uC9C0 \uD30C\uC77C \uBCF5\uBD99\uC740 insertFile\u2192uploader \uB85C \uC11C\uBC84 \uC5C5\uB85C\uB4DC\uB418\uC9C0\uB9CC, HTML(<img>) \uACBD\uB85C\uB294 src \uB97C \uADF8\uB300\uB85C\r\n  // \uCC38\uC870\uB9CC \uD574\uC654\uB2E4. \uADF8 \uACB0\uACFC data:(base64) \uBBF8\uB514\uC5B4\uAC00 \uBB38\uC11C JSON \uC5D0 \uD1B5\uC9F8\uB85C \uC800\uC7A5\uB418\uC5B4 DB \uBE44\uB300\u00B7\uC800\uC7A5 \uC2E4\uD328\u00B7\uC131\uB2A5\r\n  // \uC800\uD558\uB97C \uC720\uBC1C\uD558\uACE0, file://(\uC6D0\uBCF8 PC \uB85C\uCEEC)\uC740 \uD0C0 PC/\uBC30\uD3EC\uC5D0\uC11C \uB85C\uB4DC \uBD88\uAC00\uC600\uB2E4.\r\n  // \uC815\uCC45: base64/blob/\uB85C\uCEEC \uBBF8\uB514\uC5B4\uB294 \uC808\uB300 \uBB38\uC11C\uC5D0 \uB0A8\uAE30\uC9C0 \uC54A\uB294\uB2E4.\r\n  //  - \uC6F9 URL(http(s)/\uC0C1\uB300) \u2192 \uADF8\uB300\uB85C \uC720\uC9C0\r\n  //  - data:image//blob: \uC774\uBBF8\uC9C0 + uploader \uC788\uC74C \u2192 \uC0BD\uC785 \uD6C4 \uC5C5\uB85C\uB4DC\uD558\uC5EC \uC11C\uBC84 URL \uB85C \uAD50\uCCB4(\uC2E4\uD328 \uC2DC \uC81C\uAC70)\r\n  //  - \uADF8 \uC678(uploader \uC5C6\uC74C\u00B7file://\u00B7data:\uBE44\uC774\uBBF8\uC9C0\u00B7data/blob \uC601\uC0C1 \uB4F1) \u2192 \uC0BD\uC785\uD558\uC9C0 \uC54A\uACE0 \uC81C\uC678\r\n  const MEDIA_TYPES = new Set(['image', 'video', 'audio']);\r\n  const PASTE_IMG_UPLOADABLE = /^(?:data:image\\/|blob:)/i;\r\n  /** \uBB38\uC11C\uC5D0 \uADF8\uB300\uB85C \uB0A8\uACA8\uB3C4 \uB418\uB294 \uBBF8\uB514\uC5B4 URL \uC778\uC9C0(\uC6F9 \uC811\uADFC \uAC00\uB2A5). data:/blob:/file: \uC740 \uBD88\uAC00. */\r\n  function isPersistableMediaUrl(url) {\r\n    return !/^(?:data:|blob:|file:|filesystem:)/i.test(String(url == null ? '' : url).trim());\r\n  }\r\n  /**\r\n   * \uBD99\uC5EC\uB123\uAE30 \uBE14\uB85D\uC5D0\uC11C \uBB38\uC11C\uC5D0 \uB0A8\uAE30\uBA74 \uC548 \uB418\uB294 \uBBF8\uB514\uC5B4(base64/blob/\uB85C\uCEEC)\uB97C \uC81C\uAC70. { blocks, dropped }.\r\n   * data:image//blob: \uC774\uBBF8\uC9C0\uB294 uploader \uAC00 \uC788\uC744 \uB54C\uB9CC \uB0A8\uAE34\uB2E4(\uC9C1\uD6C4 uploadPastedImages \uAC00 \uC11C\uBC84 URL \uB85C \uC2B9\uACA9).\r\n   */\r\n  function filterPasteMedia(blocks) {\r\n    let dropped = 0;\r\n    const walk = (arr) =>\r\n      arr.filter((b) => {\r\n        if (b && MEDIA_TYPES.has(b.type) && b.props && b.props.url) {\r\n          const url = b.props.url;\r\n          if (isPersistableMediaUrl(url)) return true; // \uC6F9 URL \u2014 \uC720\uC9C0\r\n          if (uploader && b.type === 'image' && PASTE_IMG_UPLOADABLE.test(String(url))) return true; // \uC5C5\uB85C\uB4DC \uC608\uC815\r\n          dropped++;\r\n          return false; // base64/blob/\uB85C\uCEEC \u2192 \uBB38\uC11C\uC5D0 \uB0A8\uAE30\uC9C0 \uC54A\uC74C\r\n        }\r\n        if (b && Array.isArray(b.children) && b.children.length) b.children = walk(b.children);\r\n        return true;\r\n      });\r\n    return { blocks: walk(blocks), dropped };\r\n  }\r\n  /**\r\n   * \uC0BD\uC785\uB41C \uC774\uBBF8\uC9C0 \uBE14\uB85D \uC911 data:/blob: \uC744 uploader \uB85C \uC5C5\uB85C\uB4DC\uD574 \uC11C\uBC84 URL \uB85C \uAD50\uCCB4(\uBE44\uB3D9\uAE30, \uC81C\uC790\uB9AC \uC2A4\uC651).\r\n   * \uC5C5\uB85C\uB4DC/\uAC80\uC99D/fetch \uC2E4\uD328 \uC2DC \uD574\uB2F9 \uBE14\uB85D\uC744 \uC81C\uAC70\uD574 base64 \uAC00 \uBB38\uC11C\uC5D0 \uB0A8\uC9C0 \uC54A\uB3C4\uB85D \uD55C\uB2E4.\r\n   */\r\n  async function uploadPastedImages(els) {\r\n    if (!uploader || !els || !els.length || typeof fetch !== 'function') return;\r\n    const targets = els.filter(\r\n      (el) =>\r\n        el && el.dataset && el.dataset.type === 'image' && el.__props && PASTE_IMG_UPLOADABLE.test(String(el.__props.url || '')),\r\n    );\r\n    if (!targets.length) return;\r\n    showProgress(0);\r\n    let changed = false;\r\n    const removeBlock = (el) => { if (el && el.parentNode) { el.remove(); changed = true; } };\r\n    await Promise.all(\r\n      targets.map(async (el) => {\r\n        const src = el.__props.url;\r\n        try {\r\n          const res = await fetch(src);\r\n          const blob = await res.blob();\r\n          const extn = (blob.type && blob.type.split('/')[1]) || 'png';\r\n          const file = new File([blob], `pasted-image.${extn}`, { type: blob.type || 'image/png' });\r\n          if (!isImageFile(file, opts.maxImageFileSize)) { removeBlock(el); return; } // SVG\u00B7\uC6A9\uB7C9\u00B7\uD0C0\uC785 \uC2E4\uD328 \u2192 base64 \uC81C\uAC70\r\n          if (typeof opts.onUploadStart === 'function') { try { opts.onUploadStart({ file, kind: 'image' }); } catch (_) {} }\r\n          let url, uploadErr;\r\n          try { url = await uploader(file); }\r\n          catch (e) { uploadErr = e instanceof Error ? e : new Error(e && e.message ? e.message : '\uC5C5\uB85C\uB4DC \uC2E4\uD328'); }\r\n          if (typeof opts.onUploadEnd === 'function') { try { opts.onUploadEnd({ file, kind: 'image', url, error: uploadErr }); } catch (_) {} }\r\n          if (uploadErr) { onError(LumirEditorError.uploadFailed(uploadErr.message, uploadErr)); removeBlock(el); return; } // \uC2E4\uD328 \u2192 base64 \uC81C\uAC70\r\n          if (url && editorEl.contains(el)) {\r\n            el.__props.url = url; // \uC9C1\uB82C\uD654(imageElementToBlock)\uAC00 \uC77D\uB294 \uC6D0\uCC9C\r\n            const img = el.querySelector('img'); if (img) img.src = url;\r\n            const card = el.querySelector('a.lumir-image-namecard'); if (card) card.href = url;\r\n            changed = true;\r\n          } else if (!url) {\r\n            removeBlock(el); // URL \uBBF8\uBC18\uD658 \u2192 base64 \uC81C\uAC70\r\n          }\r\n        } catch (_) { removeBlock(el); /* fetch \uC2E4\uD328(CORS\u00B7blob \uB9CC\uB8CC \uB4F1) \u2192 base64 \uC81C\uAC70 */ }\r\n      }),\r\n    );\r\n    hideProgress();\r\n    if (changed) { applyResolveFileUrl(); commit(); fireChange(); }\r\n  }\r\n  /**\r\n   * \uBB34\uC190\uC2E4 lumir-JSON(\uB2E4\uC911 \uBE14\uB85D \uBCF5\uC81C) \uBD99\uC5EC\uB123\uAE30: \uC815\uC81C \u2192 fontSize lift \u2192 \uBBF8\uB514\uC5B4 \uD544\uD130 \u2192 \uC0BD\uC785 \u2192 (\uC911\uCCA9)\uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC.\r\n   * \uC18C\uBE44(consumed)\uB418\uBA74 true(\uB124\uC774\uD2F0\uBE0C \uD3F4\uBC31 \uCC28\uB2E8). \uD30C\uC2F1/\uC815\uC81C \uC2E4\uD328 \uC2DC false\uB85C \uAE30\uC874 HTML \uACBD\uB85C\uC5D0 \uC704\uC784.\r\n   */\r\n  function handleLumirBlocksPaste(json) {\r\n    let parsed;\r\n    try { parsed = JSON.parse(json); } catch (_) { return false; }\r\n    if (!Array.isArray(parsed)) return false;\r\n    const clean = sanitizeBlocks(parsed);\r\n    if (!clean.length) return false;\r\n    // \uC800\uC7A5 \uD3FC(\uD615\uC81C\uD0A4) \u2192 \uC5D0\uB514\uD130 \uD3FC(styles.fontSize). insertBlocksAtCursor\u2192renderBlock\uC740 lift \uC548 \uD558\uBBC0\uB85C \uD544\uC218.\r\n    const lifted = liftFontSize(clean);\r\n    const { blocks: kept, dropped } = filterPasteMedia(lifted);\r\n    if (!kept.length && !dropped) return false;\r\n    if (blockSelect && blockSelect.isActive()) blockSelect.clear(); // \uD65C\uC131 \uBE14\uB85D\uC120\uD0DD \uD558\uC774\uB77C\uC774\uD2B8 \uC815\uB9AC\r\n    const els = insertBlocksAtCursor(kept);\r\n    // data:/blob: \uC774\uBBF8\uC9C0\uB97C \uC11C\uBC84 URL\uB85C \uC2B9\uACA9 \u2014 \uCEEC\uB7FC \uB4F1 \uC911\uCCA9 \uB0B4\uBD80 \uC774\uBBF8\uC9C0\uAE4C\uC9C0 \uC218\uC9D1(top-level\uB9CC \uC2A4\uCE94\uD558\uBA74 \uB204\uB77D).\r\n    const imgEls = (els || []).flatMap((el) => [el, ...el.querySelectorAll('.block[data-type=\"image\"]')]);\r\n    uploadPastedImages(imgEls);\r\n    if (dropped) errorReporter.showToast(L.paste.imagesDropped);\r\n    return true;\r\n  }\r\n  /**\r\n   * \uADF8\uB9BD \uBA54\uB274 \"\uBE14\uB85D \uBCF5\uC81C\": \uB2E8\uC77C \uBE14\uB85D DOM \u2192 \uAC1D\uCCB4(\uD45C/\uCEEC\uB7FC/\uAE30\uB2A5 \uD3EC\uD568) \u2192 \uC0C8 id \uC5C6\uB294 DOM \u2192 \uC6D0\uBCF8 \uBC14\uB85C \uB4A4 \uC0BD\uC785.\r\n   * elToBlock/renderBlock\uC740 \uC5D0\uB514\uD130 \uD3FC(styles.fontSize)\uC774\uB77C lift/lower \uBD88\uD544\uC694. sanitizeBlocks\uB85C id \uC81C\uAC70.\r\n   */\r\n  function duplicateBlockEl(el) {\r\n    if (!editable || !el || !editorEl.contains(el)) return;\r\n    const [clean] = sanitizeBlocks([elToBlock(el)]); // \uC790\uAE30 \uBE14\uB85D\uC774\uB77C \uD654\uC774\uD2B8\uB9AC\uC2A4\uD2B8\uB294 \uBB34\uC190\uC2E4, id\uB9CC \uC81C\uAC70\r\n    if (!clean) return;\r\n    const newEl = renderBlock(clean);\r\n    el.after(newEl);\r\n    refreshFeatureBlocks();\r\n    const tables =\r\n      newEl.dataset && newEl.dataset.type === 'table'\r\n        ? [newEl]\r\n        : [...newEl.querySelectorAll('.block[data-type=\"table\"]')];\r\n    tables.forEach(fitTableToWidth);\r\n    structuralChange();\r\n  }\r\n  /** \uC778\uB77C\uC778 \uB9C1\uD06C <a> \u2192 \uBD81\uB9C8\uD06C \uBE14\uB85D(\uCE74\uB4DC/\uC784\uBCA0\uB4DC) \uC804\uD658. link-toolbar \uC758 \"\uCE74\uB4DC/\uC784\uBCA0\uB4DC\" \uBC84\uD2BC\uC774 \uD638\uCD9C. */\r\n  function convertLinkToBookmark(anchor, mode) {\r\n    if (!editable || !anchor || !anchor.getAttribute) return false;\r\n    const url = (anchor.getAttribute('href') || '').trim();\r\n    if (!url) return false;\r\n    const block = anchor.closest('.block');\r\n    if (!block || !editorEl.contains(block)) return false;\r\n    if (anchor.closest('td.lumir-cell')) return false; // \uD45C \uC140 \uB0B4\uBD80 \uB9C1\uD06C\uB294 \uC804\uD658 \uC81C\uC678(\uAD6C\uC870 \uBCF5\uC7A1)\r\n    const content = anchor.closest('.content');\r\n    const props = { url, mode: mode === 'embed' ? 'embed' : 'card' };\r\n    if (props.mode === 'embed') {\r\n      const emb = resolveEmbed(url);\r\n      if (emb) {\r\n        props.provider = emb.provider;\r\n        props.embedUrl = emb.embedUrl;\r\n        props.ratio = emb.ratio;\r\n      } else props.mode = 'card'; // \uC784\uBCA0\uB4DC \uBD88\uAC00 \u2192 \uCE74\uB4DC\r\n    }\r\n    const el = renderBlock({ type: 'bookmark', props, content: [], children: [] });\r\n    // \uB9C1\uD06C\uAC00 \uBE14\uB85D \uD14D\uC2A4\uD2B8 \uC804\uBD80\uBA74 \uBE14\uB85D \uAD50\uCCB4, \uC544\uB2C8\uBA74 \uBE14\uB85D \uB4A4\uC5D0 \uC0BD\uC785(\uC6D0\uBB38 \uB9C1\uD06C \uBCF4\uC874).\r\n    const onlyLink =\r\n      content && (content.textContent || '').trim() === (anchor.textContent || '').trim();\r\n    if (onlyLink) block.replaceWith(el);\r\n    else block.after(el);\r\n    if (trailingBlock && !el.nextElementSibling)\r\n      el.after(\r\n        renderBlock({\r\n          type: 'paragraph',\r\n          props: DEFAULT_BLOCK_PROPS(),\r\n          content: [],\r\n          children: [],\r\n        }),\r\n      );\r\n    refreshFeatureBlocks();\r\n    // \uCE74\uB4DC: \uC11C\uBC84(fetchLinkPreview)\uB85C \uBA54\uD0C0 \uBE44\uB3D9\uAE30 \uCC44\uC6C0. \uBBF8\uC8FC\uC785/\uC2E4\uD328 \uC2DC URL\u00B7\uB3C4\uBA54\uC778\uB9CC \uC788\uB294 \uCE74\uB4DC\uB85C \uC720\uC9C0.\r\n    if (props.mode === 'card' && typeof opts.fetchLinkPreview === 'function') {\r\n      const wrap = el.querySelector('.lumir-bookmark');\r\n      if (wrap) wrap.classList.add('is-loading');\r\n      Promise.resolve()\r\n        .then(() => opts.fetchLinkPreview(url))\r\n        .then((meta) => {\r\n          if (!meta || !el.isConnected) {\r\n            if (wrap) wrap.classList.remove('is-loading');\r\n            return;\r\n          }\r\n          const merged = { ...el.__props };\r\n          ['title', 'description', 'image', 'site', 'favicon'].forEach((k) => {\r\n            if (meta[k]) merged[k] = String(meta[k]);\r\n          });\r\n          const newEl = renderBlock({ type: 'bookmark', props: merged, content: [], children: [] });\r\n          el.replaceWith(newEl);\r\n          refreshFeatureBlocks();\r\n          commit();\r\n          fireChange();\r\n        })\r\n        .catch(() => {\r\n          if (wrap) wrap.classList.remove('is-loading');\r\n        });\r\n    }\r\n    commit();\r\n    fireChange();\r\n    return true;\r\n  }\r\n  /** \uBD99\uC5EC\uB123\uC740 \uD45C\uC758 \uC5F4\uD3ED \uD569\uC774 \uC5D0\uB514\uD130 \uD3ED\uC744 \uB118\uC73C\uBA74 \uBE44\uB840 \uCD95\uC18C(\uBAA8\uBC14\uC77C\uC740 \uAC00\uB85C \uC2A4\uD06C\uB864 \uC815\uCC45 \u2192 \uCD95\uC18C \uC0DD\uB7B5) */\r\n  function fitTableToWidth(el) {\r\n    const table = el.querySelector('.lumir-tbl');\r\n    if (!table || !table.__model) return;\r\n    // \uBAA8\uBC14\uC77C(max-width:640px): \uD3ED \uB9DE\uCDA4 \uB300\uC2E0 \uAC00\uB85C \uC2A4\uD06C\uB864 \u2014 table.css\uC758 \uBE0C\uB808\uC774\uD06C\uD3EC\uC778\uD2B8\uC640 \uC77C\uCE58.\r\n    if (\r\n      typeof window !== 'undefined' &&\r\n      typeof window.matchMedia === 'function' &&\r\n      window.matchMedia('(max-width: 640px)').matches\r\n    )\r\n      return;\r\n    const maxW = editorEl.clientWidth || 0;\r\n    if (!maxW) return;\r\n    const fitted = fitColumnWidths(table.__model.columnWidths, maxW);\r\n    if (fitted !== table.__model.columnWidths) {\r\n      table.__model.columnWidths = fitted;\r\n      rerenderTable(table);\r\n    }\r\n  }\r\n  /** \uB2E8\uB3C5 URL \uBD99\uC5EC\uB123\uAE30 \u2192 \uD56D\uC0C1 \uC778\uB77C\uC778 \uB9C1\uD06C(\uC120\uD0DD\u2192\uAC10\uC2F8\uAE30, \uCEE4\uC11C\u2192\uC0BD\uC785). */\r\n  function handleUrlPaste(rawUrl) {\r\n    const url = String(rawUrl || '').trim();\r\n    if (!url) return false;\r\n    const content = focusedContent();\r\n    if (!content) return false;\r\n    const sel = window.getSelection();\r\n    const r = sel && sel.rangeCount ? sel.getRangeAt(0) : null;\r\n    const hasSelection = !!(r && !r.collapsed);\r\n    const ok = hasSelection\r\n      ? applyLink(content, url)\r\n      : insertInlineAtCursor(content, [\r\n          {\r\n            type: 'link',\r\n            href: url,\r\n            content: [{ type: 'text', text: url, styles: {} }],\r\n          },\r\n        ]);\r\n    if (ok) {\r\n      structuralChange();\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  /** \uB2E4\uB2E8\uC5B4 \uD14D\uC2A4\uD2B8 \uB0B4 http(s) URL \uC790\uB3D9 \uB9C1\uD06C\uD654(\uCEE4\uC11C\uC5D0 \uC778\uB77C\uC778 \uC0BD\uC785). */\r\n  function autolinkTextPaste(text) {\r\n    const content = focusedContent();\r\n    if (!content) return false;\r\n    const nodes = linkifyToInline(text);\r\n    if (!nodes.some((n) => n.type === 'link')) return false;\r\n    if (insertInlineAtCursor(content, nodes)) {\r\n      structuralChange();\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  function handlePasteContent(html, text) {\r\n    // URL \uBD99\uC5EC\uB123\uAE30 \uD1B5\uD569 \uADDC\uCE59 \u2014 \uB2E8\uB3C5 URL(html \uC5C6\uC74C)\r\n    if (!html && isBareUrl(text)) {\r\n      if (handleUrlPaste(text)) return true;\r\n    }\r\n    // \uB2E4\uB2E8\uC5B4 \uD14D\uC2A4\uD2B8 \uB0B4 URL \uC790\uB3D9 \uB9C1\uD06C\uD654 \u2014 \uB2E8\uC77C \uB77C\uC778, html \uC5C6\uC74C\r\n    if (!html && !/\\n/.test(text) && hasUrl(text) && !isBareUrl(text)) {\r\n      if (autolinkTextPaste(text)) return true;\r\n    }\r\n    // \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \uBD99\uC5EC\uB123\uAE30 \uADDC\uCE59 \uC6B0\uC120\r\n    for (const rule of registry.gatherPaste({\r\n      insertBlocks: insertBlocksAtCursor,\r\n    })) {\r\n      if (rule && rule.match(text, html) && rule.handle(text, html))\r\n        return true;\r\n    }\r\n    if (html) {\r\n      const blocks = parseHtmlToBlocks(normalizeExcelClipboardHtml(html)); // \uC5D1\uC140 \uD074\uB798\uC2A4\uC0C9 computed \uC815\uADDC\uD654 \uD6C4 \uD30C\uC2F1\r\n      if (\r\n        blocks.length > 1 ||\r\n        (blocks.length === 1 && blocks[0].type !== 'paragraph')\r\n      ) {\r\n        // base64/blob/\uB85C\uCEEC \uBBF8\uB514\uC5B4 \uC81C\uC678 \uD6C4 \uC0BD\uC785 \u2192 data:/blob: \uC774\uBBF8\uC9C0\uB294 \uC11C\uBC84\uB85C \uC5C5\uB85C\uB4DC\uD574 URL \uAD50\uCCB4(\uD0C0 PC \uC815\uD569\u00B7DB base64 \uBC29\uC9C0).\r\n        const { blocks: kept, dropped } = filterPasteMedia(blocks);\r\n        const els = insertBlocksAtCursor(kept);\r\n        uploadPastedImages(els); // \uBE44\uB3D9\uAE30(fire-and-forget) \u2014 \uC9C4\uD589\uB960 \uC624\uBC84\uB808\uC774 \uD45C\uC2DC \uD6C4 \uC81C\uC790\uB9AC \uC2A4\uC651/\uC2E4\uD328 \uC2DC \uC81C\uAC70\r\n        if (dropped) errorReporter.showToast(L.paste.imagesDropped);\r\n        return true; // dropped \uB85C kept \uAC00 \uBE44\uC5B4\uB3C4 consumed(\uB124\uC774\uD2F0\uBE0C\uAC00 \uAE68\uC9C4 \uBBF8\uB514\uC5B4\uB97C \uBD99\uC774\uC9C0 \uC54A\uB3C4\uB85D)\r\n      }\r\n      return false; // \uB2E8\uC77C \uBB38\uB2E8 \u2192 \uB124\uC774\uD2F0\uBE0C \uC778\uB77C\uC778 \uBD99\uC5EC\uB123\uAE30\r\n    }\r\n    if (/\\n/.test(text)) {\r\n      const blocks = blocksFromText(text);\r\n      if (blocks.length) {\r\n        insertBlocksAtCursor(blocks);\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n  editorEl.addEventListener('paste', (e) => {\r\n    if (!editable) return;\r\n    const cd = e.clipboardData;\r\n    if (!cd) return;\r\n    if (e.target && e.target.closest && e.target.closest('td.lumir-cell'))\r\n      return; // \uD45C \uC140 \uBD99\uC5EC\uB123\uAE30\uB294 \uB124\uC774\uD2F0\uBE0C(\uCD94\uD6C4)\r\n    // \uD06C\uB85C\uC2A4 \uC120\uD0DD \uC704 \uBD99\uC5EC\uB123\uAE30 \u2192 \uBA3C\uC800 \uC120\uD0DD \uC0AD\uC81C(\uCEE4\uBC0B \uC5C6\uC774) \uD6C4 join \uCE90\uB7FF\uC5D0\uC11C \uAE30\uC874 \uC0BD\uC785 \uACBD\uB85C \uC9C4\uD589\r\n    // (\uC0BD\uC785 \uACBD\uB85C\uAC00 1\uD68C \uCEE4\uBC0B \u2192 \uC0AD\uC81C+\uC0BD\uC785\uC774 \uB2E8\uC77C undo \uC2A4\uD15D).\r\n    if (crossSelect && crossSelect.isActive()) {\r\n      const caret = deleteRangeAcross(editorEl, crossSelect.get());\r\n      crossSelect.clear();\r\n      if (caret && caret.island) {\r\n        try {\r\n          caret.island.focus();\r\n          setSelection(caret.island, caret.offset, caret.offset);\r\n        } catch (_) {}\r\n      }\r\n    }\r\n    // \uBB34\uC190\uC2E4 lumir-JSON(\uB2E4\uC911 \uBE14\uB85D \uBCF5\uC81C)\uC744 \uCD5C\uC6B0\uC120 \uC778\uC2DD \u2014 <table> html \uD558\uC774\uC7AC\uD0B9\uBCF4\uB2E4 \uBA3C\uC800 \uCC98\uB9AC(\uD45C \uD3EC\uD568 \uBCF5\uC81C \uBCF4\uC7A5).\r\n    // \uCEE4\uC2A4\uD140 MIME(\uB3D9\uAE30 copy) \uC6B0\uC120, \uC5C6\uC73C\uBA74 \uBE44\uB3D9\uAE30 clipboard\uAC00 html\uC5D0 \uC784\uBCA0\uB4DC\uD55C JSON\uC744 \uD68C\uC218.\r\n    let lumirJson = cd.getData ? cd.getData(LUMIR_BLOCK_COPY_MIME) : '';\r\n    if (!lumirJson) lumirJson = extractEmbeddedBlocks(cd.getData ? cd.getData('text/html') : '');\r\n    if (lumirJson && handleLumirBlocksPaste(lumirJson)) {\r\n      e.preventDefault();\r\n      return;\r\n    }\r\n    const html = cd.getData ? cd.getData('text/html') : '';\r\n    const text = cd.getData ? cd.getData('text/plain') || '' : '';\r\n    // Excel/\uC2DC\uD2B8 \uD558\uC774\uC7AC\uD0B9 \uBC29\uC9C0: html\uC5D0 <table>\uC774 \uC788\uC73C\uBA74 \uB3D9\uBD09\uB41C \uBE44\uD2B8\uB9F5 \uC5C5\uB85C\uB4DC\uBCF4\uB2E4 \uD45C \uD30C\uC2F1\uC744 \uC6B0\uC120.\r\n    if (/<table[\\s>]/i.test(html)) {\r\n      if (handlePasteContent(html, text)) {\r\n        e.preventDefault();\r\n        return;\r\n      }\r\n    }\r\n    // \uD074\uB9BD\uBCF4\uB4DC \uD30C\uC77C(\uC2A4\uD06C\uB9B0\uC0F7/\uC774\uBBF8\uC9C0 \uD30C\uC77C) \u2192 \uC5C5\uB85C\uB4DC\r\n    const items = cd.items ? [...cd.items] : [];\r\n    const files = items\r\n      .filter((it) => it.kind === 'file')\r\n      .map((it) => it.getAsFile())\r\n      .filter(Boolean);\r\n    const media = files.filter(isMedia);\r\n    if (media.length) {\r\n      e.preventDefault();\r\n      insertFiles(media);\r\n      return;\r\n    }\r\n    // \uADF8 \uC678: html(\uC774\uBBF8\uC9C0 <img>\u00B7\uD45C \uB4F1 \uAD6C\uC870 \uD3EC\uD568) / \uBA40\uD2F0\uB77C\uC778 \uD14D\uC2A4\uD2B8\r\n    if (handlePasteContent(html, text)) e.preventDefault();\r\n  });\r\n  document.body.appendChild(uploadOverlay.overlayEl);\r\n  document.body.appendChild(fileInput);\r\n  document.body.appendChild(errorReporter.toastEl);\r\n\r\n  /** \uD398\uC774\uC9C0 \uB098\uB204\uAE30 \uBE14\uB85D \uC0BD\uC785(\uC2AC\uB798\uC2DC\u00B7\uB9C8\uD06C\uB2E4\uC6B4 \uACF5\uC6A9) */\r\n  function insertPageBreak() {\r\n    insertBlocksAtCursor([\r\n      { type: 'pageBreak', props: {}, content: [], children: [] },\r\n    ]);\r\n  }\r\n\r\n  // --- \uD3B8\uC9D1 \uB3D9\uC791(Enter/Backspace) + \uC2AC\uB798\uC2DC \uBA54\uB274 \u2014 IME \uAC00\uB4DC, \uAD6C\uC870 \uBCC0\uACBD \uD6C4 \uD788\uC2A4\uD1A0\uB9AC \uCEE4\uBC0B ---\r\n  const structuralChange = () => {\r\n    normalizeColumnsDomEl(editorEl);\r\n    commit();\r\n    fireChange();\r\n  };\r\n  let detachEditing = null,\r\n    detachCaretNav = null,\r\n    blockSelect = null,\r\n    crossSelect = null,\r\n    crossFormat = null,\r\n    crossEdit = null,\r\n    slash = null,\r\n    formatToolbar = null,\r\n    tableControls = null,\r\n    featureControlHandles = [],\r\n    emojiPicker = null,\r\n    tableSizePicker = null;\r\n  let filePanel = null;\r\n  if (editable) {\r\n    // \uD06C\uB85C\uC2A4\uBE14\uB85D(\uC5EC\uB7EC \uC904) \uC120\uD0DD \u2014 caret-nav/editing\uBCF4\uB2E4 \uBA3C\uC800 \uB4F1\uB85D\uD574 \uBC29\uD5A5\uD0A4/Escape\uB97C \uC6B0\uC120 \uCC98\uB9AC.\r\n    crossSelect = attachCrossBlockSelect(editorEl, {\r\n      isEditable: () => editable,\r\n      isComposing: () => composing,\r\n      clearBlockSelect: () => {\r\n        if (blockSelect) blockSelect.clear();\r\n      },\r\n      onSettled: () => {\r\n        if (formatToolbar) formatToolbar.update();\r\n        if (floatingMenu && floatingMenu.sync) floatingMenu.sync();\r\n      },\r\n    });\r\n    // \uD06C\uB85C\uC2A4 \uC11C\uC2DD \uD30C\uC0AC\uB4DC \u2014 \uD234\uBC14/\uB2E8\uCD95\uD0A4\uAC00 (\uB4DC\uB798\uADF8 \uD06C\uB85C\uC2A4 \uC120\uD0DD | Ctrl+A \uBE14\uB85D \uC804\uCCB4 \uC120\uD0DD)\uC77C \uB54C \uC774 \uACBD\uB85C\uB85C \uB77C\uC6B0\uD305.\r\n    // \uCEE4\uBC84 \uC12C: \uB4DC\uB798\uADF8 \uD06C\uB85C\uC2A4\uBA74 \uBD80\uBD84/\uC804\uCCB4 \uD63C\uD569, \uBE14\uB85D \uC804\uCCB4 \uC120\uD0DD\uC774\uBA74 \uC120\uD0DD \uBE14\uB85D\uB4E4\uC758 .content \uC804\uCCB4(\uC77C\uBC18 \uD14D\uC2A4\uD2B8\uB9CC).\r\n    const coveredForFormat = () => {\r\n      if (crossSelect.isActive()) return crossSelect.coveredIslands();\r\n      if (blockSelect && blockSelect.isActive() && blockSelect.selectedIslands) {\r\n        return blockSelect.selectedIslands().map((island) => ({ island, start: 0, end: contentLen(island), full: true }));\r\n      }\r\n      return [];\r\n    };\r\n    crossFormat = {\r\n      isActive: () => crossSelect.isActive() || !!(blockSelect && blockSelect.isActive()),\r\n      // Ctrl+A \uC804\uCCB4 \uC120\uD0DD(block-select \uBAA8\uB4DC)\uC778\uAC00 \u2014 \uD234\uBC14\uB97C \uC5D0\uB514\uD130 \uC911\uC0C1\uB2E8\uC5D0 \uACE0\uC815 \uBC30\uCE58\uD558\uAE30 \uC704\uD55C \uD78C\uD2B8.\r\n      isBlockSelect: () => !crossSelect.isActive() && !!(blockSelect && blockSelect.isActive()),\r\n      isDragging: () => crossSelect.isDragging(),\r\n      applyMark: (type, value) => {\r\n        const cov = coveredForFormat();\r\n        if (applyInlineMarkAcross(cov, type, value)) {\r\n          structuralChange();\r\n          if (crossSelect.isActive()) crossSelect.repaint(); // \uB4DC\uB798\uADF8 \uD06C\uB85C\uC2A4\uB294 \uCEE4\uC2A4\uD140 \uD558\uC774\uB77C\uC774\uD2B8 \uC7AC\uD398\uC778\uD305(\uBE14\uB85D \uC120\uD0DD\uC740 CSS \uD074\uB798\uC2A4\uB77C \uC720\uC9C0)\r\n        }\r\n      },\r\n      readMarks: () => readActiveMarksAcross(coveredForFormat()),\r\n      boundingRect: () => (crossSelect.isActive() ? crossSelect.boundingRect() : crossBoundingRect(coveredForFormat())),\r\n    };\r\n    if (opts.filePanel !== false)\r\n      filePanel = attachFilePanel(editorEl, {\r\n        onPickFile: () => openImagePicker(),\r\n        onInsertBlock: (b) => insertBlocksAtCursor([b]),\r\n      });\r\n    // \uD06C\uB85C\uC2A4 \uC120\uD0DD \uC601\uC5ED \uD3B8\uC9D1(\uC0AD\uC81C/\uD0C0\uC774\uD551/Enter/\uBCF5\uC0AC\u00B7\uC798\uB77C\uB0B4\uAE30) \u2014 editing/caret-nav\uBCF4\uB2E4 \uBA3C\uC800 \uB4F1\uB85D.\r\n    crossEdit = attachCrossBlockEdit(editorEl, {\r\n      isEditable: () => editable,\r\n      isComposing: () => composing,\r\n      commitChange: structuralChange,\r\n      isActive: () => crossSelect.isActive(),\r\n      getSelection: () => crossSelect.get(),\r\n      clearCross: () => crossSelect.clear(),\r\n      getDocument,\r\n      htmlOf: (blocks) => blocksToHtml(blocks),\r\n      textOf: (blocks) => blocksToMarkdown(blocks),\r\n      jsonOf: (blocks) => JSON.stringify(blocks),\r\n    });\r\n    detachEditing = attachEditing(editorEl, {\r\n      onChange: structuralChange,\r\n      isComposing: () => composing,\r\n      headingLevels,\r\n      tabBehavior,\r\n      cross: crossFormat,\r\n    });\r\n    // \uBC29\uD5A5\uD0A4 \uBE14\uB85D \uAC04 \uC774\uB3D9 + \uC778\uB77C\uC778 \uCF54\uB4DC \uD0C8\uCD9C\r\n    detachCaretNav = attachCaretNav(editorEl, {\r\n      isComposing: () => composing,\r\n      onChange: structuralChange,\r\n    });\r\n    // Ctrl/Cmd+A \uB2E8\uACC4 \uC120\uD0DD(\uD604\uC7AC \uBE14\uB85D \u2192 \uC804\uCCB4 \uBE14\uB85D) + \uBE14\uB85D \uC120\uD0DD \uBAA8\uB4DC(\uC0AD\uC81C/\uBCF5\uC0AC)\r\n    blockSelect = attachBlockSelect(editorEl, {\r\n      isEditable: () => editable,\r\n      isComposing: () => composing,\r\n      getDocument,\r\n      htmlOf: (blocks) => blocksToHtml(blocks),\r\n      textOf: (blocks) => blocksToMarkdown(blocks),\r\n      jsonOf: (blocks) => JSON.stringify(blocks), // \uBB34\uC190\uC2E4 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD\uC6A9 \uC6D0\uBCF8 JSON(\uC800\uC7A5 \uD3FC)\r\n\r\n      makeParagraphEl: () =>\r\n        renderBlock({\r\n          type: 'paragraph',\r\n          props: DEFAULT_BLOCK_PROPS(),\r\n          content: [],\r\n          children: [],\r\n        }),\r\n      commitChange: structuralChange,\r\n    });\r\n    const SM = L.slashMenu || {};\r\n    const gEmbed = SM.groupEmbed || '\uC784\uBCA0\uB4DC';\r\n    // \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4(features/*) \uC2AC\uB798\uC2DC \uAE30\uC5EC \uC218\uC9D1 \u2014 pageBreak/image/file \uB4F1. (\uBBF8\uC774\uC804: table/columns \uB294 \uB808\uAC70\uC2DC \uBC30\uC120)\r\n    const featureCtx = {\r\n      locale: L,\r\n      insertBlocks: insertBlocksAtCursor,\r\n      openImagePicker,\r\n      filePanel,\r\n      hasUploader: !!uploader, // uploadFile/s3Upload \uC124\uC815 \uC5EC\uBD80 = \uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC \uC2AC\uB798\uC2DC \uB178\uCD9C \uAC8C\uC774\uD2B8\r\n      opts,\r\n    };\r\n    const extraItems = [...registry.gatherSlash(featureCtx)];\r\n    // \uC774\uBAA8\uC9C0 \u2014 \uAE30\uBCF8 \uD65C\uC131(emojiPicker !== false). \uC2AC\uB798\uC2DC \"\uC774\uBAA8\uC9C0\"\uB85C \uD53C\uCEE4 \uC5F4\uAE30.\r\n    if (opts.emojiPicker !== false) {\r\n      emojiPicker = attachEmojiPicker(editorEl, { onChange: structuralChange });\r\n      extraItems.push({\r\n        type: 'emoji',\r\n        label: SM.emoji || '\uC774\uBAA8\uC9C0',\r\n        kw: 'emoji \uC774\uBAA8\uC9C0 emoticon \uC2A4\uB9C8\uC77C \uC774\uBAA8\uD2F0\uCF58',\r\n        group: SM.groupBasic || '\uAE30\uBCF8 \uBE14\uB85D',\r\n        ico: '\uD83D\uDE00',\r\n        sub: '\uC774\uBAA8\uC9C0 \uC0BD\uC785',\r\n        action: (b) => emojiPicker.open(b),\r\n      });\r\n    }\r\n    // \uD45C \uD06C\uAE30 N\u00D7M \uADF8\uB9AC\uB4DC \uD53C\uCEE4 \u2014 \uC2AC\uB798\uC2DC \"\uD45C\"/\uD50C\uB85C\uD305 \uBA54\uB274\uAC00 \uACF5\uC720. \uC5F4 \uC0C1\uD55C\uC740 \uC5D0\uB514\uD130 \uD3ED \uAE30\uBC18.\r\n    tableSizePicker = attachTableSizePicker(editorEl, {\r\n      locale: L,\r\n      onPick: (rows, cols) => insertBlocksAtCursor([emptyTable(rows, cols)]),\r\n      getMaxCols: () => {\r\n        const cw = editorEl.clientWidth || 0;\r\n        return cw ? Math.max(3, Math.floor((cw - 28) / 48)) : 20;\r\n      },\r\n    });\r\n    extraItems.push({\r\n      type: 'table',\r\n      label: SM.table || '\uD45C',\r\n      kw: 'table \uD45C \uACA9\uC790 grid \uC140',\r\n      group: gEmbed,\r\n      ico: '\u25A6',\r\n      sub: 'N\u00D7M \uD06C\uAE30\uB97C \uACE8\uB77C \uD45C \uCD94\uAC00',\r\n      action: () => tableSizePicker.open(),\r\n    });\r\n    extraItems.push({\r\n      type: 'columnList',\r\n      label: SM.columns2 || '2\uB2E8 \uCEEC\uB7FC',\r\n      kw: 'column \uCEEC\uB7FC 2\uB2E8 \uB2E8 layout \uB098\uB204\uAE30 col',\r\n      group: gEmbed,\r\n      ico: '\u25A6',\r\n      sub: '\uBE14\uB85D\uC744 \uC88C\uC6B0 2\uB2E8\uC73C\uB85C \uBC30\uCE58',\r\n      action: () => insertBlocksAtCursor([emptyColumns(2)]),\r\n    });\r\n    extraItems.push({\r\n      type: 'columnList',\r\n      label: SM.columns2Divider || '2\uB2E8 \uCEEC\uB7FC (\uAD6C\uBD84\uC120)',\r\n      kw: 'column \uCEEC\uB7FC 2\uB2E8 \uAD6C\uBD84\uC120 divider layout col',\r\n      group: gEmbed,\r\n      ico: COLUMNS_DIVIDER_ICON,\r\n      sub: '\uAC00\uC6B4\uB370 \uAD6C\uBD84\uC120\uC774 \uC788\uB294 2\uB2E8',\r\n      action: () => insertBlocksAtCursor([emptyColumns(2, true)]),\r\n    });\r\n    if (opts.slashMenu !== false)\r\n      slash = attachSlashMenu(editorEl, {\r\n        onApply: structuralChange,\r\n        isComposing: () => composing,\r\n        headingLevels,\r\n        extraItems,\r\n        locale: L,\r\n      });\r\n    // \uC120\uD0DD \uC2DC \uC778\uB77C\uC778 \uC11C\uC2DD \uD31D\uC5C5\uC740 \uD56D\uC0C1 \uD45C\uC2DC(vanilla\uB294 \uB3D9\uAE30 \uB80C\uB354\uB77C floatingMenu\uC640 \uACF5\uC874\uD574\uB3C4 (0,0) \uD290 \uC5C6\uC74C).\r\n    if (opts.formattingToolbar !== false)\r\n      formatToolbar = attachFormatToolbar(editorEl, {\r\n        onChange: structuralChange,\r\n        isComposing: () => composing,\r\n        headingLevels,\r\n        locale: L,\r\n        onLink: () => linkToolbar && linkToolbar.promptAdd(),\r\n        cross: crossFormat,\r\n      });\r\n    if (opts.tableHandles !== false)\r\n      tableControls = attachTableControls(editorEl, {\r\n        onChange: structuralChange,\r\n        tables: cfgTables,\r\n        locale: L,\r\n      });\r\n  }\r\n  // \uAE30\uB2A5 \uC2AC\uB77C\uC774\uC2A4 \uC778\uD130\uB799\uC158 \uCEE8\uD2B8\uB864\uB7EC \u2014 \uC77D\uAE30\uC804\uC6A9\uC5D0\uC11C\uB3C4 \uBD80\uCC29(\uBBF8\uB514\uC5B4 \uC5F4\uAE30/\uB2E4\uC6B4\uB85C\uB4DC \uC720\uC9C0).\r\n  // \uB9AC\uC0AC\uC774\uC988 \uB4F1 \uD3B8\uC9D1 \uB3D9\uC791\uC740 \uAC01 \uCEE8\uD2B8\uB864\uB7EC\uAC00 ctx.isEditable() \uB85C \uAC00\uB4DC. image/video \uB4F1.\r\n  featureControlHandles = registry.attachControls(editorEl, {\r\n    onChange: structuralChange,\r\n    isEditable: () => !editorEl.classList.contains('lumir-readonly'),\r\n  });\r\n  /** \uAE30\uB2A5 \uCEE8\uD2B8\uB864\uB7EC refresh \u2014 \uC0BD\uC785/\uBD99\uC5EC\uB123\uAE30 \uD6C4 \uD638\uCD9C */\r\n  function refreshFeatureBlocks() {\r\n    featureControlHandles.forEach((h) => {\r\n      try {\r\n        h && h.refresh && h.refresh();\r\n      } catch (_) {}\r\n    });\r\n  }\r\n\r\n  // \uB9C1\uD06C \uD234\uBC14 (\uB9C1\uD06C hover \uC2DC \uD234\uD301: URL/\uBCF5\uC0AC/\uD3B8\uC9D1 \u2192 \uD3B8\uC9D1 popup: URL\u00B7\uC81C\uBAA9\u00B7\uB9C1\uD06C\uC81C\uAC70. \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC5D0 \uB9C1\uD06C \uCD94\uAC00.)\r\n  let linkToolbar = null;\r\n  if (editable && opts.linkToolbar !== false) {\r\n    linkToolbar = attachLinkToolbar(editorEl, {\r\n      onChange: structuralChange,\r\n      locale: L,\r\n      onConvert: convertLinkToBookmark,\r\n      canEmbed: (href) => !!resolveEmbed(href),\r\n    });\r\n  }\r\n  // \uC0C1\uB2E8 FloatingMenu (\uC6D0\uBCF8\uACFC \uB3D9\uC77C\uD558\uAC8C \uAE30\uBCF8 \uBE44\uD65C\uC131; opts.floatingMenu:true \uB85C \uD65C\uC131)\r\n  let floatingMenu = null;\r\n  if (editable && opts.floatingMenu === true) {\r\n    floatingMenu = attachFloatingMenu(editorEl, {\r\n      locale: L,\r\n      headingLevels,\r\n      position: opts.floatingMenuPosition === 'fixed' ? 'fixed' : 'sticky',\r\n      undo,\r\n      redo,\r\n      canUndo,\r\n      canRedo,\r\n      onChange: structuralChange,\r\n      insertImage: uploader ? () => openImagePicker() : null, // \uC5C5\uB85C\uB354 \uC5C6\uC73C\uBA74 \uD50C\uB85C\uD305 \uBA54\uB274 \uC774\uBBF8\uC9C0 \uBC84\uD2BC \uC228\uAE40\r\n      insertTable: () =>\r\n        tableSizePicker\r\n          ? tableSizePicker.open()\r\n          : insertBlocksAtCursor([emptyTable(3, 3)]),\r\n      insertLink: linkToolbar ? () => linkToolbar.promptAdd() : null,\r\n      cross: crossFormat,\r\n    });\r\n  }\r\n\r\n  // \uC0AC\uC774\uB4DC \uBA54\uB274 / \uB4DC\uB798\uADF8 \uD578\uB4E4 (\uAE30\uBCF8 ON; opts.sideMenu===false \uB85C \uBE44\uD65C\uC131). \uBE14\uB85D \uCD94\uAC00\uB294 \uADF8\uB9BD \uB4DC\uB86D\uB2E4\uC6B4\uC73C\uB85C\uB9CC(+ \uBC84\uD2BC \uC81C\uAC70).\r\n  let sideMenu = null;\r\n  if (editable && opts.sideMenu !== false) {\r\n    sideMenu = attachSideMenu(editorEl, { onChange: structuralChange, onDuplicate: duplicateBlockEl });\r\n  }\r\n  // \uCEEC\uB7FC \uB108\uBE44 \uB9AC\uC0AC\uC774\uC988 (P9-\u2466)\r\n  let columnControls = null;\r\n  if (editable)\r\n    columnControls = attachColumnControls(editorEl, {\r\n      onChange: structuralChange,\r\n    });\r\n\r\n  // onSelectionChange (P8-\u2461) \u2014 \uC5D0\uB514\uD130 \uB0B4 \uC120\uD0DD \uBCC0\uACBD \uC2DC {block, blockType, isCollapsed, text, marks}\r\n  function fireSelectionChange() {\r\n    if (!onSelectionChange) return;\r\n    const sel = document.getSelection();\r\n    if (!sel || !sel.rangeCount) return;\r\n    const r = sel.getRangeAt(0);\r\n    let n = r.startContainer;\r\n    if (n && n.nodeType === 3) n = n.parentNode;\r\n    const content =\r\n      n && n.closest ? n.closest('.content, td.lumir-cell') : null;\r\n    if (!content || !editorEl.contains(content)) return; // \uC5D0\uB514\uD130 \uBC16 \uC120\uD0DD\uC740 \uBB34\uC2DC\r\n    const block = content.closest('.block');\r\n    onSelectionChange({\r\n      block: block ? block.dataset.id || null : null,\r\n      blockType: block ? block.dataset.type : null,\r\n      isCollapsed: r.collapsed,\r\n      text: sel.toString(),\r\n      marks: readActiveMarks(content),\r\n    });\r\n  }\r\n\r\n  // blur \uC120\uD0DD \uD558\uC774\uB77C\uC774\uD2B8 (P9-\u2465) \u2014 CSS Custom Highlight API(\uBBF8\uC9C0\uC6D0 \uD658\uACBD\uC740 \uBB34\uC2DC)\r\n  const blurHl = createBlurHighlight(editorEl);\r\n\r\n  // \uCD08\uAE30 \uC801\uC6A9 + placeholder/\uC120\uD0DD \uAC31\uC2E0 \uB9AC\uC2A4\uB108\r\n  applyEditable(editable);\r\n  refreshPlaceholders();\r\n  const onSelChange = () => {\r\n    refreshPlaceholders();\r\n    blurHl.capture();\r\n    fireSelectionChange();\r\n  };\r\n  document.addEventListener('selectionchange', onSelChange);\r\n\r\n  return {\r\n    element: editorEl,\r\n    getDocument,\r\n    getMarkdown: () => blocksToMarkdown(getDocument()),\r\n    getHTML: () => blocksToHtml(getDocument()),\r\n    getFullHTML: (htmlOpts) => blocksToFullHtml(getDocument(), htmlOpts),\r\n    setBlocks(blocks) {\r\n      restore(Array.isArray(blocks) ? blocks : []);\r\n      commit();\r\n      refreshFeatureBlocks();\r\n      fireChange();\r\n    },\r\n    setMarkdown(md) {\r\n      restore(markdownToBlocks(md));\r\n      commit();\r\n      refreshFeatureBlocks();\r\n      fireChange();\r\n    },\r\n    commit,\r\n    undo,\r\n    redo,\r\n    canUndo,\r\n    canRedo,\r\n    isComposing: () => composing,\r\n    setOnContentChange(fn) {\r\n      onChange = typeof fn === 'function' ? fn : null;\r\n    },\r\n    isSlashOpen: () => (slash ? slash.isOpen() : false),\r\n    insertFile,\r\n    formatToolbar,\r\n    tableControls,\r\n    floatingMenu,\r\n    sideMenu,\r\n    columnControls,\r\n    linkToolbar,\r\n    filePanel,\r\n    emojiPicker,\r\n    isEditable: () => editable,\r\n    setEditable(on) {\r\n      editable = on !== false;\r\n      applyEditable(editable);\r\n      refreshPlaceholders();\r\n    },\r\n    setTheme(theme) {\r\n      applyThemeOpt(theme);\r\n    },\r\n    destroy() {\r\n      document.removeEventListener('selectionchange', onSelChange);\r\n      if (detachEditing) detachEditing();\r\n      if (detachCaretNav) detachCaretNav();\r\n      if (crossEdit) crossEdit.destroy();\r\n      if (crossSelect) crossSelect.destroy();\r\n      if (blockSelect) blockSelect.destroy();\r\n      if (slash) slash.destroy();\r\n      if (formatToolbar) formatToolbar.destroy();\r\n      if (tableControls) tableControls.destroy();\r\n      featureControlHandles.forEach((h) => {\r\n        try {\r\n          h && h.destroy && h.destroy();\r\n        } catch (_) {}\r\n      });\r\n      if (floatingMenu) floatingMenu.destroy();\r\n      if (sideMenu) sideMenu.destroy();\r\n      if (columnControls) columnControls.destroy();\r\n      if (linkToolbar) linkToolbar.destroy();\r\n      if (filePanel) filePanel.destroy();\r\n      if (emojiPicker) emojiPicker.destroy();\r\n      if (tableSizePicker) tableSizePicker.destroy();\r\n      blurHl.destroy();\r\n      uploadOverlay.destroy();\r\n      errorReporter.destroy();\r\n      if (fileInput.parentNode) fileInput.parentNode.removeChild(fileInput);\r\n      if (editorEl.parentNode) editorEl.parentNode.removeChild(editorEl);\r\n    },\r\n  };\r\n}\r\n", "/**\r\n * \uD638\uD658 \uC720\uD2F8\uB9AC\uD2F0 (drop-in) \u2014 kingdoo-editor LumirEditor.tsx\uC758\r\n * `ContentUtils` / `EditorConfig` \uD074\uB798\uC2A4 export \uD328\uB9AC\uD2F0.\r\n *\r\n * \uAD6C lumir-editor\uB97C \uC4F0\uB358 \uD504\uB85C\uC81D\uD2B8\uAC00\r\n *   import { ContentUtils, EditorConfig } from \"@lumir-company/editor\";\r\n * \uD558\uB358 \uAC83\uC744 lumir-editor\uC5D0\uC11C \uB3D9\uC77C \uC2DC\uADF8\uB2C8\uCC98\uB85C \uADF8\uB300\uB85C \uC4F8 \uC218 \uC788\uAC8C \uD55C\uB2E4.\r\n * \uB3D9\uC791\uC740 \uC6D0\uBCF8 \uB2E8\uC704 \uD14C\uC2A4\uD2B8(ContentUtils.unit.test / EditorConfig.unit.test)\uC640 \uB3D9\uC77C.\r\n */\r\n\r\n/** @typedef {{ type: string, props?: object, content?: any, children?: any[] }} DefaultPartialBlock */\r\n\r\n/** \uCF58\uD150\uCE20(\uBE14\uB85D \uBC30\uC5F4/JSON \uBB38\uC790\uC5F4) \uAC80\uC99D\u00B7\uC815\uADDC\uD654 \uC720\uD2F8 */\r\nexport class ContentUtils {\r\n  /** JSON \uBB38\uC790\uC5F4\uC774 \uC720\uD6A8\uD55C \"\uBC30\uC5F4\" JSON \uC778\uC9C0 */\r\n  static isValidJSONString(jsonString) {\r\n    try {\r\n      const parsed = JSON.parse(jsonString);\r\n      return Array.isArray(parsed);\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /** JSON \uBB38\uC790\uC5F4 \u2192 \uBE14\uB85D \uBC30\uC5F4(\uBC30\uC5F4\uC774 \uC544\uB2C8\uAC70\uB098 \uC2E4\uD328 \uC2DC null) */\r\n  static parseJSONContent(jsonString) {\r\n    try {\r\n      const parsed = JSON.parse(jsonString);\r\n      return Array.isArray(parsed) ? parsed : null;\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  /** \uAE30\uBCF8 paragraph \uBE14\uB85D (\uC6D0\uBCF8\uACFC \uB3D9\uC77C\uD558\uAC8C content \uB294 \uBE48 text 1\uAC1C) */\r\n  static createDefaultBlock() {\r\n    return {\r\n      type: 'paragraph',\r\n      props: {\r\n        textColor: 'default',\r\n        backgroundColor: 'default',\r\n        textAlignment: 'left',\r\n      },\r\n      content: [{ type: 'text', text: '', styles: {} }],\r\n      children: [],\r\n    };\r\n  }\r\n\r\n  /** \uCF58\uD150\uCE20 \uAC80\uC99D: \uBB38\uC790\uC5F4\uC774\uBA74 \uD30C\uC2F1, \uBE44\uC5C8\uC73C\uBA74 \uBE48 \uBE14\uB85D emptyBlockCount\uAC1C \uC0DD\uC131 */\r\n  static validateContent(content, emptyBlockCount = 3) {\r\n    if (typeof content === 'string') {\r\n      if (content.trim() === '')\r\n        return ContentUtils.createEmptyBlocks(emptyBlockCount);\r\n      const parsed = ContentUtils.parseJSONContent(content);\r\n      if (parsed && parsed.length > 0) return parsed;\r\n      return ContentUtils.createEmptyBlocks(emptyBlockCount);\r\n    }\r\n    if (!content || content.length === 0)\r\n      return ContentUtils.createEmptyBlocks(emptyBlockCount);\r\n    return content;\r\n  }\r\n\r\n  /** \uBE48 \uBE14\uB85D N\uAC1C (\uC6D0\uBCF8\uC5D0\uC11C\uB294 private; \uD638\uD658\uC744 \uC704\uD574 \uB178\uCD9C\uC740 \uD558\uB418 \uB0B4\uBD80 \uD5EC\uD37C) */\r\n  static createEmptyBlocks(emptyBlockCount) {\r\n    return Array.from({ length: emptyBlockCount }, () =>\r\n      ContentUtils.createDefaultBlock(),\r\n    );\r\n  }\r\n}\r\n\r\n/** \uC5D0\uB514\uD130 \uC124\uC815 \uAE30\uBCF8\uAC12/\uAC80\uC99D \uC720\uD2F8 */\r\nexport class EditorConfig {\r\n  /** \uD45C \uC124\uC815 \uAE30\uBCF8\uAC12 \uBCD1\uD569 (\uBAA8\uB450 \uAE30\uBCF8 true) */\r\n  static getDefaultTableConfig(userTables) {\r\n    const u = userTables || {};\r\n    return {\r\n      splitCells: u.splitCells ?? true,\r\n      cellBackgroundColor: u.cellBackgroundColor ?? true,\r\n      cellTextColor: u.cellTextColor ?? true,\r\n      headers: u.headers ?? true,\r\n    };\r\n  }\r\n\r\n  /** \uD5E4\uB529 \uC124\uC815 \uAE30\uBCF8\uAC12 (levels \uBE44\uC5C8\uC73C\uBA74 [1..6]); \uC720\uD6A8 \uC2DC \uC0AC\uC6A9\uC790 \uAC1D\uCCB4 \uADF8\uB300\uB85C \uBC18\uD658 */\r\n  static getDefaultHeadingConfig(userHeading) {\r\n    return userHeading &&\r\n      Array.isArray(userHeading.levels) &&\r\n      userHeading.levels.length > 0\r\n      ? userHeading\r\n      : { levels: [1, 2, 3, 4, 5, 6] };\r\n  }\r\n\r\n  /** \uBE44\uD65C\uC131 \uD655\uC7A5 \uBAA9\uB85D (\uC704\uCE58 \uC778\uC790: userExtensions, allowVideo, allowAudio, allowFile) */\r\n  static getDisabledExtensions(\r\n    userExtensions,\r\n    allowVideo = false,\r\n    allowAudio = false,\r\n    allowFile = false,\r\n  ) {\r\n    const set = new Set(userExtensions || []);\r\n    if (!allowVideo) set.add('video');\r\n    if (!allowAudio) set.add('audio');\r\n    if (!allowFile) set.add('file');\r\n    return Array.from(set);\r\n  }\r\n}\r\n", "/**\r\n * className \uACB0\uD569 \uC720\uD2F8 (\uD638\uD658) \u2014 kingdoo-editor utils/cn.ts \uC640 \uB3D9\uC77C \uB3D9\uC791.\r\n * falsy \uAC12\uC744 \uAC70\uB974\uACE0 \uACF5\uBC31\uC73C\uB85C join.\r\n */\r\nexport function cn(...inputs) {\r\n  return inputs.filter(Boolean).join(' ');\r\n}\r\n", "/**\r\n * \uAE00\uC790 \uD06C\uAE30 \uC0C1\uC218/\uD5EC\uD37C (\uD638\uD658) \u2014 kingdoo-editor styles/FontSizeStyle.tsx\uC758 export \uD328\uB9AC\uD2F0.\r\n */\r\nexport const FONT_SIZE_PRESETS = [\r\n  '10px',\r\n  '12px',\r\n  '14px',\r\n  '16px',\r\n  '18px',\r\n  '20px',\r\n  '24px',\r\n  '28px',\r\n];\r\nexport const FONT_SIZE_MIN = 8;\r\nexport const FONT_SIZE_MAX = 96;\r\nexport const FONT_SIZE_DEFAULT_PX = 14;\r\nexport const FONT_SIZE_STEP = 1;\r\n\r\nexport function parseFontSizePx(size) {\r\n  const m = String(size == null ? '' : size).match(/^([\\d.]+)/);\r\n  const n = m ? parseFloat(m[1]) : NaN;\r\n  return Number.isFinite(n) && n > 0 ? n : FONT_SIZE_DEFAULT_PX;\r\n}\r\nexport function clampFontSizePx(px) {\r\n  return Math.round(Math.max(FONT_SIZE_MIN, Math.min(FONT_SIZE_MAX, px)));\r\n}\r\nexport function toFontSizeValue(px) {\r\n  return clampFontSizePx(px) + 'px';\r\n}\r\n", "\"use client\";\r\n/**\r\n * React \uB798\uD37C (drop-in) \u2014 \uAD6C @lumir-company/editor \uC758 <LumirEditor /> \uCEF4\uD3EC\uB10C\uD2B8 \uD638\uD658.\r\n *\r\n *   // \uAE30\uC874:  import LumirEditor, { ContentUtils } from \"@lumir-company/editor\";\r\n *   // \uBCC0\uACBD:  import LumirEditor, { ContentUtils } from \"@lumir-company/editor/react\";\r\n *\r\n * \uB0B4\uBD80\uC801\uC73C\uB85C react-free \uCF54\uC5B4(mountLumirEditor)\uB97C useEffect \uC5D0\uC11C \uB9C8\uC6B4\uD2B8\uD55C\uB2E4.\r\n * react \uB294 \uC774 \uC11C\uBE0C\uD328\uC2A4\uC5D0\uC11C\uB9CC import \uB418\uBBC0\uB85C \uB8E8\uD2B8(\".\")\uB294 \uC5EC\uC804\uD788 react \uC758\uC874\uC774 \uC5C6\uB2E4.\r\n *\r\n * - props \uB294 \uAD6C \uCEF4\uD3EC\uB10C\uD2B8\uC640 \uB3D9\uC77C\uD55C \uC774\uB984\uC744 \uADF8\uB300\uB85C \uC804\uB2EC(initialContent/editable/theme/\r\n *   tables/heading/onContentChange/onError/onSelectionChange/onImageDelete/ \u2026 ).\r\n * - editable/theme \uB294 \uB9AC\uB80C\uB354 \uC2DC \uBC18\uC751\uC801\uC73C\uB85C \uBC18\uC601(setEditable/setTheme).\r\n * - \uCF5C\uBC31\uB958\uB294 ref \uB85C \uCD5C\uC2E0\uAC12\uC744 \uCD94\uC801\uD574 remount \uC5C6\uC774 \uD56D\uC0C1 \uCD5C\uC2E0 \uD578\uB4E4\uB7EC \uD638\uCD9C.\r\n * - ref \uB85C { getDocument, undo, redo, canUndo, canRedo, insertFile, editor } \uB178\uCD9C(\uBCF4\uB108\uC2A4).\r\n */\r\nimport * as React from \"react\";\r\nimport { mountLumirEditor } from \"./editor.js\";\r\n\r\n// \uB8E8\uD2B8\uC758 \uBAA8\uB4E0 \uC720\uD2F8(ContentUtils/EditorConfig/colors/fontSize/errors/api/\u2026)\uC744 \uD55C \uACBD\uB85C\uC5D0\uC11C \uC4F0\uB3C4\uB85D \uC7AC\uB178\uCD9C\r\nexport * from \"./index.js\";\r\n\r\nexport const LumirEditor = React.forwardRef(function LumirEditor(props, ref) {\r\n  const { className = \"\", style, ...rest } = props || {};\r\n\r\n  const hostRef = React.useRef(null);\r\n  const edRef = React.useRef(null);\r\n\r\n  // \uCF5C\uBC31/\uC5C5\uB85C\uB354\uB294 ref \uB85C \uCD5C\uC2E0\uAC12 \uC720\uC9C0 \u2192 remount \uC5C6\uC774 \uCD5C\uC2E0 \uD578\uB4E4\uB7EC \uC0AC\uC6A9\r\n  const cbRef = React.useRef({});\r\n  cbRef.current = {\r\n    onContentChange: rest.onContentChange,\r\n    onError: rest.onError,\r\n    onSelectionChange: rest.onSelectionChange,\r\n    onImageDelete: rest.onImageDelete,\r\n    uploadFile: rest.uploadFile,\r\n  };\r\n\r\n  // \uCD5C\uCD08 \uB9C8\uC6B4\uD2B8 \uC635\uC158 \uC2A4\uB0C5\uC0F7(\uCD08\uAE30 \uCF58\uD150\uCE20/\uAD6C\uC131 \uD1A0\uAE00). \uC774\uD6C4 \uBCC0\uACBD\uC740 \uBC18\uC751 effect\uB85C \uCC98\uB9AC.\r\n  const mountOptsRef = React.useRef(null);\r\n  if (mountOptsRef.current === null) mountOptsRef.current = { ...rest };\r\n\r\n  React.useEffect(() => {\r\n    const host = hostRef.current;\r\n    if (!host) return undefined;\r\n    const opts = { ...mountOptsRef.current };\r\n    // \uC548\uC815\uC801 \uB798\uD37C \u2192 \uD56D\uC0C1 \uCD5C\uC2E0 \uCF5C\uBC31 \uD638\uCD9C\r\n    opts.onContentChange = (...a) => cbRef.current.onContentChange && cbRef.current.onContentChange(...a);\r\n    opts.onError = (...a) => cbRef.current.onError && cbRef.current.onError(...a);\r\n    opts.onSelectionChange = (...a) => cbRef.current.onSelectionChange && cbRef.current.onSelectionChange(...a);\r\n    opts.onImageDelete = (...a) => cbRef.current.onImageDelete && cbRef.current.onImageDelete(...a);\r\n    if (mountOptsRef.current.uploadFile) opts.uploadFile = (...a) => cbRef.current.uploadFile && cbRef.current.uploadFile(...a);\r\n\r\n    const ed = mountLumirEditor(host, opts);\r\n    edRef.current = ed;\r\n    return () => {\r\n      try { ed && ed.destroy && ed.destroy(); } catch (_) {}\r\n      edRef.current = null;\r\n    };\r\n    // \uCD5C\uCD08 1\uD68C\uB9CC \uB9C8\uC6B4\uD2B8(BlockNote \uC6D0\uBCF8\uB3C4 initialContent \uBCC0\uACBD\uC73C\uB85C \uC7AC\uC124\uC815\uD558\uC9C0 \uC54A\uC74C)\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  // editable \uBC18\uC751\r\n  React.useEffect(() => {\r\n    const ed = edRef.current;\r\n    if (ed && ed.setEditable) ed.setEditable(rest.editable !== false);\r\n  }, [rest.editable]);\r\n\r\n  // theme \uBC18\uC751\r\n  React.useEffect(() => {\r\n    const ed = edRef.current;\r\n    if (ed && ed.setTheme) ed.setTheme(rest.theme || \"light\");\r\n  }, [rest.theme]);\r\n\r\n  React.useImperativeHandle(\r\n    ref,\r\n    () => ({\r\n      getDocument: () => (edRef.current ? edRef.current.getDocument() : null),\r\n      undo: () => (edRef.current ? edRef.current.undo() : false),\r\n      redo: () => (edRef.current ? edRef.current.redo() : false),\r\n      canUndo: () => (edRef.current ? edRef.current.canUndo() : false),\r\n      canRedo: () => (edRef.current ? edRef.current.canRedo() : false),\r\n      insertFile: (file) => (edRef.current ? edRef.current.insertFile(file) : undefined),\r\n      setTheme: (t) => edRef.current && edRef.current.setTheme(t),\r\n      setEditable: (v) => edRef.current && edRef.current.setEditable(v),\r\n      get editor() {\r\n        return edRef.current;\r\n      },\r\n    }),\r\n    []\r\n  );\r\n\r\n  // \"bn-container\"\uB294 BlockNote \uB798\uD37C \uD074\uB798\uC2A4 \uBCC4\uCE6D(\uC18C\uBE44\uCC98 CSS \uD638\uD658).\r\n  return React.createElement(\"div\", { ref: hostRef, className: cnJoin(\"lumir-react-host bn-container\", className), style });\r\n});\r\n\r\nfunction cnJoin(a, b) {\r\n  return [a, b].filter(Boolean).join(\" \");\r\n}\r\n\r\n/**\r\n * \uD638\uD658 \uC2A4\uD141 \u2014 \uAD6C @lumir-company/editor \uB294 \uB3C5\uB9BD <FloatingMenu editor=\u2026 /> \uCEF4\uD3EC\uB10C\uD2B8\uB97C export \uD588\uB2E4.\r\n * vanilla \uB294 \uC0C1\uB2E8 \uD50C\uB85C\uD305 \uBA54\uB274\uB97C `<LumirEditor floatingMenu />` prop \uC73C\uB85C \uC81C\uACF5\uD558\uBBC0\uB85C standalone \uC740\r\n * \uBD88\uD544\uC694. \uADF8\uB7EC\uB098 `import { FloatingMenu }` \uAC00 \uAE68\uC9C0\uC9C0 \uC54A\uB3C4\uB85D null \uB80C\uB354 \uC2A4\uD141 + 1\uD68C \uC548\uB0B4\uB97C \uB454\uB2E4.\r\n */\r\nlet _fmWarned = false;\r\nexport function FloatingMenu() {\r\n  if (!_fmWarned && typeof console !== \"undefined\") {\r\n    _fmWarned = true;\r\n    console.warn(\r\n      \"[@lumir-company/editor] FloatingMenu \uB3C5\uB9BD \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \" +\r\n        \"<LumirEditor floatingMenu floatingMenuPosition=\\\"sticky|fixed\\\" /> prop \uC73C\uB85C \uB300\uCCB4\uD558\uC138\uC694.\"\r\n    );\r\n  }\r\n  return null;\r\n}\r\n\r\n/** \uD638\uD658 \uC2A4\uD141 \u2014 \uAD6C \uD328\uD0A4\uC9C0\uC758 \uB3C5\uB9BD FontSizeButton(\uD3EC\uB9E4\uD305 \uD234\uBC14\uC6A9). vanilla \uB294 \uD234\uBC14\uC5D0 \uB0B4\uC7A5\uB418\uC5B4 \uBD88\uD544\uC694. */\r\nlet _fsbWarned = false;\r\nexport function FontSizeButton() {\r\n  if (!_fsbWarned && typeof console !== \"undefined\") {\r\n    _fsbWarned = true;\r\n    console.warn(\r\n      \"[@lumir-company/editor] FontSizeButton \uB3C5\uB9BD \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \" +\r\n        \"\uAE00\uC790\uD06C\uAE30 \uCEE8\uD2B8\uB864\uC740 \uD3EC\uB9E4\uD305 \uD234\uBC14\uC5D0 \uB0B4\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.\"\r\n    );\r\n  }\r\n  return null;\r\n}\r\n\r\nexport default LumirEditor;\r\n"],
  "mappings": "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",
  "names": ["fs", "clamp", "MIN_W", "MAX_W", "esc", "sameStyles", "next", "content", "MIN_W", "MAX_W", "renderBlock", "p", "m", "esc", "LIST_TYPES", "span", "renderBlocks", "renderBlock", "esc", "b", "rect", "span", "CELL_PROP_KEYS", "clamp", "focusEnd", "focusStart", "span", "isAtomEl", "handle", "esc", "ext", "HL_NAME", "hlSupported", "isEmptyContent", "focusStart", "focusEnd", "ZWSP", "r", "contentOf", "focusStart", "focusEnd", "applyResolveFileUrl", "applyEditable", "LumirEditor"]
}
