{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n  createGuides,\n  createRuler,\n  createVRuler,\n  detectLanguage,\n  resolveRulerLabels,\n  type Guides,\n  type GuideSet,\n  type Ruler,\n  type RulerChange,\n  type RulerChangePhase,\n  type RulerMetrics,\n  type RulerUnit,\n  type VRuler,\n} from '@devslab/editor-ruler';\n\n/**\n * Options merged into FroalaEditor.DEFAULTS. Configure per editor instance via\n * `new FroalaEditor(el, { rulerEnabled: true, rulerUnit: 'cm' })`.\n */\nexport interface FroalaRulerOptions {\n  rulerEnabled?: boolean;\n  /**\n   * Whether the horizontal ruler starts visible with the editor. Default\n   * true. Unlike `rulerEnabled: false` (which disables the plugin entirely),\n   * `rulerVisible: false` keeps the plugin — and its toolbar commands —\n   * alive, just hidden until the user toggles it on.\n   */\n  rulerVisible?: boolean;\n  rulerUnit?: RulerUnit;\n  /** Show the vertical ruler strip on init. Default false. */\n  rulerVertical?: boolean;\n  /**\n   * Reserve the vertical ruler's 23px column from the start (like CSS\n   * `scrollbar-gutter: stable`), so toggling the vertical ruler never\n   * reflows the content — hidden means an empty gutter, not reclaimed\n   * width. Default false: the strip only takes space while visible.\n   */\n  rulerVerticalGutter?: boolean;\n  /** Enable guide lines (drag down from the ruler strip). Default true. */\n  rulerGuides?: boolean;\n}\n\n/**\n * The plugin API exposed as `editor.ruler` on a Froala instance.\n * `_init` is Froala's own lifecycle hook — the editor calls it, you don't.\n */\nexport interface FroalaRulerApi {\n  _init(): void;\n  refresh(): void;\n  show(): void;\n  hide(): void;\n  toggle(): void;\n  isVisible(): boolean;\n  setUnit(unit: RulerUnit): void;\n  getUnit(): RulerUnit;\n  toggleVRuler(): void;\n  isVRulerVisible(): boolean;\n  setGuidesLocked(locked: boolean): void;\n  isGuidesLocked(): boolean;\n  clearGuides(): void;\n  getGuides(): GuideSet;\n  destroy(): void;\n}\n\n/** UI strings for the toolbar commands. Registered once per FroalaEditor constructor. */\nexport interface RulerStrings {\n  ruler: string;\n  toggleRuler: string;\n  rulerUnit: string;\n  showHide: string;\n  verticalRuler: string;\n  lockGuides: string;\n  clearGuides: string;\n  cm: string;\n  in: string;\n  px: string;\n}\n\nconst STRINGS: Record<string, RulerStrings> = {\n  en: {\n    ruler: 'Ruler',\n    toggleRuler: 'Toggle Ruler',\n    rulerUnit: 'Ruler Unit',\n    showHide: 'Show / Hide',\n    verticalRuler: 'Vertical Ruler',\n    lockGuides: 'Lock Guides',\n    clearGuides: 'Clear Guides',\n    cm: 'cm',\n    in: 'inch',\n    px: 'px',\n  },\n  ko: {\n    ruler: '줄자',\n    toggleRuler: '줄자 표시/숨기기',\n    rulerUnit: '눈금 단위',\n    showHide: '보이기 / 숨기기',\n    verticalRuler: '세로 줄자',\n    lockGuides: '가이드 잠금',\n    clearGuides: '가이드 지우기',\n    cm: 'cm',\n    in: '인치',\n    px: 'px',\n  },\n};\n\nexport interface DefineRulerPluginOptions {\n  /** Language for toolbar strings ('ko', 'en', …). Default: `<html lang>` → browser language → 'en'. */\n  language?: string;\n  /** Override any built-in string. */\n  strings?: Partial<RulerStrings>;\n}\n\nconst BLOCK_FALLBACK_SELECTOR = 'p, div, h1, h2, h3, h4, h5, h6, li, blockquote, pre';\n\n/**\n * CSS ignores margins on table *cells*, so a selection inside a table targets\n * the whole `<table>` instead — Word's behavior: the ruler indents the table\n * as a block. `text-indent` is skipped for tables (meaningless there).\n */\nconst TABLE_TAGS = new Set(['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR', 'TD', 'TH']);\n\nconst RULER_ICON_SVG =\n  '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 8a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1H3zm1 2h1.5v3H4v-3zm3.5 0H9v2H7.5v-2zm3.5 0h1.5v3H11v-3zm3.5 0H16v2h-1.5v-2zm3.5 0h1.5v3H18v-3z\"/></svg>';\n\n/**\n * Registers the ruler plugin on the FroalaEditor constructor. Call once, before\n * creating editor instances:\n *\n * ```ts\n * import FroalaEditor from 'froala-editor';\n * import { defineRulerPlugin } from '@devslab/editor-ruler-froala';\n *\n * defineRulerPlugin(FroalaEditor);\n * new FroalaEditor('#editor', { rulerEnabled: true });\n * ```\n *\n * If you set `pluginsEnabled` explicitly, include `'ruler'` in the list.\n *\n * Also registers a `'toggleRuler'` toolbar command with a ruler icon — add it to\n * `toolbarButtons` to let users show/hide the ruler.\n */\nexport function defineRulerPlugin(FroalaEditor: any, defineOptions: DefineRulerPluginOptions = {}): void {\n  if (FroalaEditor.PLUGINS?.ruler) return;\n\n  const doc = typeof document !== 'undefined' ? document : undefined;\n  const language = detectLanguage(defineOptions.language, doc);\n  const t: RulerStrings = { ...(STRINGS[language] ?? STRINGS.en!), ...defineOptions.strings };\n  const UNIT_OPTIONS: Record<RulerUnit, string> = { cm: t.cm, in: t.in, px: t.px };\n\n  FroalaEditor.DEFAULTS = Object.assign(\n    {\n      rulerEnabled: true,\n      rulerVisible: true,\n      rulerUnit: 'cm' satisfies RulerUnit,\n      rulerVertical: false,\n      rulerVerticalGutter: false,\n      rulerGuides: true,\n      rulerLanguage: null,\n    },\n    FroalaEditor.DEFAULTS,\n  );\n\n  if (typeof FroalaEditor.DefineIconTemplate === 'function') {\n    FroalaEditor.DefineIconTemplate('editorRuler', RULER_ICON_SVG);\n  }\n  if (typeof FroalaEditor.DefineIcon === 'function') {\n    FroalaEditor.DefineIcon('toggleRuler', { NAME: 'ruler', template: 'editorRuler' });\n  }\n  if (typeof FroalaEditor.RegisterCommand === 'function') {\n    // Recommended single button: one ruler icon, all ruler options inside.\n    FroalaEditor.RegisterCommand('rulerOptions', {\n      title: t.ruler,\n      icon: 'toggleRuler',\n      type: 'dropdown',\n      undo: false,\n      focus: false,\n      plugin: 'ruler',\n      options: {\n        toggle: t.showHide,\n        vruler: t.verticalRuler,\n        lockGuides: t.lockGuides,\n        clearGuides: t.clearGuides,\n        ...UNIT_OPTIONS,\n      },\n      callback(this: any, _cmd: string, value: string) {\n        if (value === 'toggle') this.ruler?.toggle();\n        else if (value === 'vruler') this.ruler?.toggleVRuler();\n        else if (value === 'lockGuides') this.ruler?.setGuidesLocked(!this.ruler?.isGuidesLocked());\n        else if (value === 'clearGuides') this.ruler?.clearGuides();\n        else this.ruler?.setUnit(value as RulerUnit);\n      },\n      refreshOnShow(this: any, _$btn: any, $dropdown: any) {\n        const rootEl: any = $dropdown?.get?.(0) ?? $dropdown;\n        if (!rootEl?.querySelectorAll) return;\n        const unit = this.ruler?.getUnit?.();\n        const activeByParam: Record<string, boolean> = {\n          toggle: this.ruler?.isVisible?.() === true,\n          vruler: this.ruler?.isVRulerVisible?.() === true,\n          lockGuides: this.ruler?.isGuidesLocked?.() === true,\n          clearGuides: false,\n        };\n        for (const item of rootEl.querySelectorAll('a.fr-command')) {\n          const param = item.getAttribute('data-param1');\n          item.classList.toggle('fr-active', param ? (activeByParam[param] ?? param === unit) : false);\n        }\n      },\n    });\n    // Granular commands for hosts that prefer separate buttons.\n    FroalaEditor.RegisterCommand('rulerUnit', {\n      title: t.rulerUnit,\n      icon: 'toggleRuler',\n      type: 'dropdown',\n      undo: false,\n      focus: false,\n      plugin: 'ruler',\n      options: UNIT_OPTIONS,\n      callback(this: any, _cmd: string, unit: string) {\n        this.ruler?.setUnit(unit as RulerUnit);\n      },\n      refreshOnShow(this: any, _$btn: any, $dropdown: any) {\n        const current = this.ruler?.getUnit?.();\n        if (!current) return;\n        const rootEl: any = $dropdown?.get?.(0) ?? $dropdown;\n        if (!rootEl?.querySelectorAll) return;\n        for (const item of rootEl.querySelectorAll('a.fr-command')) {\n          item.classList.toggle('fr-active', item.getAttribute('data-param1') === current);\n        }\n      },\n    });\n    FroalaEditor.RegisterCommand('toggleRuler', {\n      title: t.toggleRuler,\n      icon: 'toggleRuler',\n      undo: false,\n      focus: false,\n      plugin: 'ruler',\n      callback(this: any) {\n        this.ruler?.toggle();\n      },\n      refresh(this: any, $btn: any) {\n        $btn?.toggleClass?.('fr-active', this.ruler?.isVisible() === true);\n      },\n    });\n  }\n\n  FroalaEditor.PLUGINS.ruler = function rulerPlugin(editor: any): FroalaRulerApi {\n    let ruler: Ruler | null = null;\n    let mount: HTMLElement | null = null;\n    let visible = false;\n    let guides: Guides | null = null;\n    let vruler: VRuler | null = null;\n    let vmount: HTMLElement | null = null;\n    let vwrap: HTMLElement | null = null;\n    let vVisible = false;\n\n    function editorEl(): HTMLElement {\n      return editor.el as HTMLElement;\n    }\n\n    /**\n     * Resolves a raw selection block to what the ruler should push:\n     * - table structure (td/tr/…) → the whole <table> (Word-style table indent)\n     * - a bare <img> → its closest block container\n     * - anything else → itself\n     */\n    function normalizeBlock(b: HTMLElement, el: HTMLElement): HTMLElement | null {\n      if (b === el || !el.contains(b)) return null;\n      if (b.tagName === 'IMG') {\n        const host = b.closest(BLOCK_FALLBACK_SELECTOR) as HTMLElement | null;\n        return host && host !== el && el.contains(host) ? host : null;\n      }\n      if (TABLE_TAGS.has(b.tagName)) {\n        const table = (b.tagName === 'TABLE' ? b : b.closest('table')) as HTMLElement | null;\n        return table && el.contains(table) ? table : null;\n      }\n      return b;\n    }\n\n    function selectedBlocks(): HTMLElement[] {\n      const blocks: HTMLElement[] = editor.selection?.blocks?.() ?? [];\n      const el = editorEl();\n      const targets: HTMLElement[] = [];\n      for (const raw of blocks) {\n        const target = normalizeBlock(raw, el);\n        if (target && !targets.includes(target)) targets.push(target);\n      }\n      if (targets.length > 0) return targets;\n      if (blocks.some((b) => el.contains(b) && b !== el)) return [];\n      const fallback = el.querySelector(BLOCK_FALLBACK_SELECTOR);\n      return fallback ? [fallback as HTMLElement] : [];\n    }\n\n    function getMetrics(): RulerMetrics {\n      const el = editorEl();\n      const doc = el.ownerDocument;\n      const win = doc.defaultView!;\n      const elStyle = win.getComputedStyle(el);\n      const paddingLeft = parseFloat(elStyle.paddingLeft) || 0;\n      const paddingRight = parseFloat(elStyle.paddingRight) || 0;\n      const contentWidth = Math.max(0, el.clientWidth - paddingLeft - paddingRight);\n      const block = selectedBlocks()[0];\n      if (!block) {\n        return { contentWidth, leftMargin: 0, rightMargin: 0, firstLineIndent: 0 };\n      }\n      const style = win.getComputedStyle(block);\n      return {\n        contentWidth,\n        leftMargin: parseFloat(style.marginLeft) || 0,\n        rightMargin: parseFloat(style.marginRight) || 0,\n        firstLineIndent: parseFloat(style.textIndent) || 0,\n      };\n    }\n\n    function currentTable(): HTMLTableElement | null {\n      const blocks: HTMLElement[] = editor.selection?.blocks?.() ?? [];\n      const el = editorEl();\n      for (const b of blocks) {\n        const t = (b.tagName === 'TABLE' ? b : b.closest?.('table')) as HTMLTableElement | null;\n        if (t && el.contains(t)) return t;\n      }\n      return null;\n    }\n\n    function contentLeft(): number {\n      const el = editorEl();\n      return el.getBoundingClientRect().left + contentPadding('paddingLeft');\n    }\n\n    /** Column boundaries of the selected table in ruler coords, or null. */\n    function columnEdges(): number[] | null {\n      const table = currentTable();\n      if (!table) return null;\n      // Merged cells make boundary math ambiguous — no markers there.\n      if (table.querySelector('td[colspan], th[colspan], td[rowspan], th[rowspan]')) return null;\n      const row = table.querySelector('tr');\n      if (!row) return null;\n      const cells = Array.from(row.children).filter(\n        (c) => c.tagName === 'TD' || c.tagName === 'TH',\n      ) as HTMLElement[];\n      if (cells.length === 0) return null;\n      const origin = contentLeft();\n      const edges = [table.getBoundingClientRect().left - origin];\n      for (const cell of cells) edges.push(cell.getBoundingClientRect().right - origin);\n      return edges;\n    }\n\n    function applyColumnChange(index: number, x: number, phase: RulerChangePhase): void {\n      const table = currentTable();\n      const edges = columnEdges();\n      if (!table || !edges) return;\n      const leftEdge = edges[index - 1];\n      const rightEdge = edges[index + 1];\n      if (leftEdge === undefined || rightEdge === undefined) return;\n      const tableWidth = table.getBoundingClientRect().width;\n      if (!(tableWidth > 0)) return;\n      const pct = (w: number) => `${((w / tableWidth) * 100).toFixed(4)}%`;\n      for (const row of Array.from(table.querySelectorAll('tr'))) {\n        const cells = Array.from(row.children).filter(\n          (c) => c.tagName === 'TD' || c.tagName === 'TH',\n        ) as HTMLElement[];\n        const leftCell = cells[index - 1];\n        const rightCell = cells[index];\n        if (leftCell) leftCell.style.width = pct(x - leftEdge);\n        if (rightCell) rightCell.style.width = pct(rightEdge - x);\n      }\n      if (phase === 'commit') {\n        editor.undo?.saveStep?.();\n      }\n    }\n\n    function applyChange(change: RulerChange, phase: RulerChangePhase): void {\n      for (const block of selectedBlocks()) {\n        if (change.leftMargin !== undefined) block.style.marginLeft = `${change.leftMargin}px`;\n        if (change.rightMargin !== undefined) block.style.marginRight = `${change.rightMargin}px`;\n        // text-indent is meaningless on a table block.\n        if (change.firstLineIndent !== undefined && block.tagName !== 'TABLE')\n          block.style.textIndent = `${change.firstLineIndent}px`;\n      }\n      if (phase === 'commit') {\n        editor.undo?.saveStep?.();\n      }\n    }\n\n    function contentPadding(side: 'paddingLeft' | 'paddingRight' | 'paddingTop' | 'paddingBottom'): number {\n      const el = editorEl();\n      const win = el.ownerDocument.defaultView!;\n      return parseFloat(win.getComputedStyle(el)[side]) || 0;\n    }\n\n    function vGutter(): boolean {\n      return editor.opts.rulerVerticalGutter === true;\n    }\n\n    /** Extra x-offset the vertical ruler strip adds in front of the editor. */\n    function vRulerOffset(): number {\n      // 22px strip + 1px border. In gutter mode the column is reserved even\n      // while the strip is hidden, so the offset applies whenever it exists.\n      return vVisible || (vGutter() && vwrap) ? 23 : 0;\n    }\n\n    function alignMount(): void {\n      if (!mount) return;\n      mount.style.paddingLeft = `${contentPadding('paddingLeft') + vRulerOffset()}px`;\n    }\n\n    function refresh(): void {\n      alignMount();\n      if (vmount) vmount.style.paddingTop = `${contentPadding('paddingTop')}px`;\n      ruler?.refresh();\n      vruler?.refresh();\n      guides?.refresh();\n    }\n\n    function wrapperEl(): HTMLElement {\n      return editor.$wp?.get?.(0) ?? editorEl().parentElement ?? editorEl();\n    }\n\n    function ensureVWrap(): void {\n      const el = editorEl();\n      const doc = el.ownerDocument;\n      if (!vwrap) {\n        const wrapper = wrapperEl();\n        vwrap = doc.createElement('div');\n        vwrap.className = 'edr-vwrap';\n        wrapper.parentElement?.insertBefore(vwrap, wrapper);\n        vmount = doc.createElement('div');\n        vmount.className = 'edr-froala-vmount';\n        vwrap.appendChild(vmount);\n        vwrap.appendChild(wrapper);\n        vruler = createVRuler(vmount, {\n          unit: ruler?.getUnit() ?? editor.opts.rulerUnit ?? 'cm',\n          ...(guides ? { guides } : {}),\n          getMetrics: () => {\n            const target = editorEl();\n            const scroller = wrapperEl();\n            const padTop = contentPadding('paddingTop');\n            const contentH =\n              target.clientHeight - padTop - contentPadding('paddingBottom');\n            // .fr-element grows with its content, but .fr-wrapper is the\n            // scroll container with the fixed visible height — cap the strip\n            // at the visible viewport or it outgrows the editor. (Falls back\n            // to the content height when the wrapper has no layout, e.g. in\n            // jsdom or when the wrapper auto-grows with heightMin only.)\n            const viewportH =\n              scroller.clientHeight > 0 ? scroller.clientHeight - padTop : Infinity;\n            return { contentHeight: Math.max(0, Math.min(contentH, viewportH)) };\n          },\n        });\n      }\n    }\n\n    function showVRuler(): void {\n      ensureVWrap();\n      vmount!.style.display = '';\n      vmount!.style.visibility = '';\n      vVisible = true;\n      refresh();\n    }\n\n    function hideVRuler(): void {\n      if (!vmount) return;\n      if (vGutter()) {\n        // Keep the reserved column — hide the strip without reclaiming width.\n        vmount.style.visibility = 'hidden';\n      } else {\n        vmount.style.display = 'none';\n      }\n      vVisible = false;\n      refresh();\n    }\n\n    function toggleVRuler(): void {\n      vVisible ? hideVRuler() : showVRuler();\n    }\n\n    function isVRulerVisible(): boolean {\n      return vVisible;\n    }\n\n    function show(): void {\n      if (!mount) return;\n      mount.style.display = '';\n      visible = true;\n      refresh();\n    }\n\n    function hide(): void {\n      if (!mount) return;\n      mount.style.display = 'none';\n      visible = false;\n    }\n\n    function toggle(): void {\n      visible ? hide() : show();\n    }\n\n    function isVisible(): boolean {\n      return visible;\n    }\n\n    function setUnit(unit: RulerUnit): void {\n      ruler?.setUnit(unit);\n      vruler?.setUnit(unit);\n    }\n\n    function getUnit(): RulerUnit {\n      return ruler?.getUnit() ?? ((editor.opts.rulerUnit as RulerUnit) ?? 'cm');\n    }\n\n    function setGuidesLocked(locked: boolean): void {\n      guides?.setLocked(locked);\n    }\n\n    function isGuidesLocked(): boolean {\n      return guides?.isLocked() === true;\n    }\n\n    function clearGuides(): void {\n      guides?.clear();\n    }\n\n    function getGuides(): GuideSet {\n      return guides?.list() ?? { x: [], y: [] };\n    }\n\n    function destroy(): void {\n      ruler?.destroy();\n      ruler = null;\n      guides?.destroy();\n      guides = null;\n      vruler?.destroy();\n      vruler = null;\n      if (vwrap) {\n        const wrapper = vwrap.lastElementChild;\n        if (wrapper && wrapper !== vmount) vwrap.parentElement?.insertBefore(wrapper, vwrap);\n        vwrap.remove();\n        vwrap = null;\n        vmount = null;\n      }\n      mount?.remove();\n      mount = null;\n      visible = false;\n      vVisible = false;\n    }\n\n    function _init(): void {\n      if (!editor.opts.rulerEnabled) return;\n      const el = editorEl();\n      const doc = el.ownerDocument;\n      const wrapper: HTMLElement = editor.$wp?.get?.(0) ?? el.parentElement ?? el;\n      const host = wrapper.parentElement ?? wrapper;\n\n      mount = doc.createElement('div');\n      mount.className = 'edr-froala-mount';\n      host.insertBefore(mount, wrapper);\n\n      if (editor.opts.rulerGuides !== false) {\n        guides = createGuides(wrapper, {\n          getOffsetLeft: () => contentPadding('paddingLeft'),\n          getOffsetTop: () => contentPadding('paddingTop'),\n        });\n      }\n\n      ruler = createRuler(mount, {\n        unit: editor.opts.rulerUnit ?? 'cm',\n        getMetrics,\n        onChange: applyChange,\n        labels: resolveRulerLabels(editor.opts.rulerLanguage || editor.opts.language, doc),\n        columns: { get: columnEdges, onChange: applyColumnChange },\n        ...(guides ? { guides } : {}),\n      });\n      alignMount();\n      visible = true;\n      if (editor.opts.rulerVisible === false) hide();\n\n      if (editor.opts.rulerVertical === true) {\n        showVRuler();\n      } else if (vGutter()) {\n        // Reserve the gutter up front so a later toggle doesn't reflow content.\n        ensureVWrap();\n        vmount!.style.visibility = 'hidden';\n        refresh();\n      }\n\n      for (const event of ['mouseup', 'keyup', 'contentChanged', 'commands.after']) {\n        editor.events?.on?.(event, refresh);\n      }\n      editor.events?.on?.('destroy', destroy);\n    }\n\n    return {\n      _init,\n      refresh,\n      show,\n      hide,\n      toggle,\n      isVisible,\n      setUnit,\n      getUnit,\n      toggleVRuler,\n      isVRulerVisible,\n      setGuidesLocked,\n      isGuidesLocked,\n      clearGuides,\n      getGuides,\n      destroy,\n    };\n  };\n}\n\nexport type { RulerChange, RulerChangePhase, RulerMetrics, RulerUnit };\n"],"mappings":"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","names":["doc","t"]}