{"version":3,"file":"mn-angular-lib-rich-text-editor.mjs","sources":["../../../projects/mn-angular-lib/rich-text-editor/src/mn-rich-text-editor/mn-rich-text-editor.component.ts","../../../projects/mn-angular-lib/rich-text-editor/src/mn-rich-text-editor/mn-rich-text-editor.component.html","../../../projects/mn-angular-lib/rich-text-editor/public-api.ts","../../../projects/mn-angular-lib/rich-text-editor/mn-angular-lib-rich-text-editor.ts"],"sourcesContent":["import {\n  afterNextRender,\n  ChangeDetectionStrategy,\n  Component,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  untracked,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type Quill from 'quill';\nimport {MnLanguageService} from 'mn-angular-lib/core';\nimport {MnRichTextEditorControl, MnRichTextEditorLabels, MnRichTextEditorToolbar,} from './mn-rich-text-editor.types';\n\n/**\n * Toolbar the editor renders when the consumer does not supply one. Deliberately\n * small: it covers written prose, so there is no colour picker, no font picker\n * and no image embedding (an image needs an upload and storage path the editor\n * knows nothing about).\n */\nconst DEFAULT_TOOLBAR: MnRichTextEditorToolbar = [\n  [{header: [2, 3, false]}],\n  ['bold', 'italic', 'underline', 'strike'],\n  [{list: 'ordered'}, {list: 'bullet'}],\n  ['blockquote', 'code-block'],\n  ['link'],\n  ['clean'],\n];\n\n/** Where each control sits in the toolbar Quill builds. */\nconst CONTROL_SELECTORS: Record<MnRichTextEditorControl, string> = {\n  textStyle: '.ql-header .ql-picker-label',\n  bold: 'button.ql-bold',\n  italic: 'button.ql-italic',\n  underline: 'button.ql-underline',\n  strike: 'button.ql-strike',\n  orderedList: 'button.ql-list[value=\"ordered\"]',\n  bulletList: 'button.ql-list[value=\"bullet\"]',\n  blockquote: 'button.ql-blockquote',\n  codeBlock: 'button.ql-code-block',\n  link: 'button.ql-link',\n  clean: 'button.ql-clean',\n};\n\n/** Hover labels used when the consumer supplies neither a label nor a key. */\nconst DEFAULT_LABELS: Record<MnRichTextEditorControl, string> = {\n  textStyle: 'Text style',\n  bold: 'Bold',\n  italic: 'Italic',\n  underline: 'Underline',\n  strike: 'Strikethrough',\n  orderedList: 'Numbered list',\n  bulletList: 'Bulleted list',\n  blockquote: 'Quote',\n  codeBlock: 'Code block',\n  link: 'Link',\n  clean: 'Clear formatting',\n};\n\n/** Quill's document when it holds no text; treated as an empty value. */\nconst EMPTY_DOCUMENT = '<p><br></p>';\n\n/**\n * Thin wrapper around the {@link Quill} rich-text editor.\n *\n * Quill is used **directly** rather than through an Angular wrapper package: the\n * wrapper libraries carry peer-dependency ranges that lag behind Angular's\n * release train, and none of them add anything this component needs.\n *\n * Consumers must install `quill` themselves (it is an optional peer dependency)\n * and load its snow theme, e.g. `node_modules/quill/dist/quill.snow.css` in the\n * `styles` array of `angular.json`. Only the chrome around that theme — radius,\n * borders, height limits and the toolbar tooltips — belongs to this component;\n * recolouring Quill's own palette to an app theme stays with the app, because\n * the same `.ql-snow` markup is normally reused to render stored HTML in places\n * where no editor is mounted.\n *\n * Quill itself is pulled in with a dynamic `import()` when the editor mounts.\n * This component sits in the library's single entry point, which apps import\n * eagerly, so a static import would put the whole editor engine in every app's\n * initial bundle — including the pages that never open one.\n *\n * Zoneless notes: nothing here relies on an implicit change-detection tick. The\n * editor is created inside {@link afterNextRender} (the host element only exists\n * after the first render pass) and every value that flows back out is written to\n * a signal or emitted through an `output`, both of which schedule change\n * detection themselves. No `setTimeout`, no manual `detectChanges`.\n *\n * The produced HTML is **not** trusted: sanitise it before rendering it anywhere.\n *\n * @example\n * ```html\n * <mn-rich-text-editor\n *   [content]=\"draft()\"\n *   [placeholder]=\"'minutes.placeholder' | mnTranslate\"\n *   [labelKeys]=\"{ bold: 'editor.bold', italic: 'editor.italic' }\"\n *   (contentChange)=\"draft.set($event)\">\n * </mn-rich-text-editor>\n * ```\n */\n@Component({\n  selector: 'mn-rich-text-editor',\n  standalone: true,\n  templateUrl: './mn-rich-text-editor.component.html',\n  styleUrl: './mn-rich-text-editor.component.css',\n  // Quill builds its DOM at runtime, so those elements never carry Angular's\n  // scoping attribute and an encapsulated stylesheet could never reach them.\n  // Every rule in the stylesheet is scoped by `.mn-rich-text-editor` instead.\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnRichTextEditor implements OnDestroy {\n  /**\n   * The initial HTML content. Later changes are applied only when they differ\n   * from what the editor currently holds, so a parent echoing the emitted value\n   * back never moves the caret.\n   */\n  public readonly content = input<string>('');\n  /** Placeholder shown while the editor is empty. */\n  public readonly placeholder = input<string>('');\n  /** Accessible label for the editing surface. */\n  public readonly ariaLabel = input<string>('');\n  /** Toolbar layout, in Quill's own format. Defaults to a prose-oriented set. */\n  public readonly toolbar = input<MnRichTextEditorToolbar>(DEFAULT_TOOLBAR);\n  /** Literal hover labels per toolbar control. */\n  public readonly labels = input<MnRichTextEditorLabels>({});\n  /** Translation keys per toolbar control; takes precedence over `labels`. */\n  public readonly labelKeys = input<MnRichTextEditorLabels>({});\n  /**\n   * Utilities applied to the wrapper, for sizing the writing surface. Overriding\n   * this replaces the default height limits, so pass both bounds when you do.\n   */\n  public readonly editorClass = input<string>(\n    '[&_.ql-editor]:max-h-104 [&_.ql-editor]:min-h-72 [&_.ql-editor]:overflow-y-auto',\n  );\n  /** Emits the editor's HTML on every user edit. */\n  public readonly contentChange = output<string>();\n  /**\n   * Chrome around Quill's snow theme: the field's radius, border and surface.\n   *\n   * Descendant variants rather than a stylesheet — the utilities come from the\n   * consuming app's Tailwind build (which scans this bundle), so they follow the\n   * app's theme tokens the same way the rest of the library does.\n   */\n  protected readonly chromeClass =\n    '[&_.ql-container.ql-snow]:rounded-b-xl [&_.ql-container.ql-snow]:border-base-300 ' +\n    '[&_.ql-container.ql-snow]:bg-base-100 [&_.ql-container.ql-snow]:text-base ' +\n    '[&_.ql-toolbar.ql-snow]:rounded-t-xl [&_.ql-toolbar.ql-snow]:border-base-300 ' +\n    '[&_.ql-toolbar.ql-snow]:bg-base-100';\n  /** Host element, used to keep DOM queries inside this component. */\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  /** Language service, used to resolve the toolbar labels from keys. */\n  private readonly lang = inject(MnLanguageService);\n  /** The container Quill mounts into. */\n  private readonly editorHost = viewChild.required<ElementRef<HTMLElement>>('editorHost');\n  /** The live editor instance, or null before Quill has loaded. */\n  private quill: Quill | null = null;\n\n  /** Whether the component is gone, so a late Quill load knows to stop. */\n  private destroyed = false;\n\n  /** The last HTML this component emitted, used to skip redundant writes. */\n  private readonly lastEmitted = signal<string>('');\n\n  constructor() {\n    afterNextRender(() => void this.createEditor());\n    // Push a changed `content` input into a live editor. `lastEmitted` is read\n    // `untracked` on purpose: it must gate the write (skip when the incoming HTML\n    // already matches what we hold) WITHOUT making the effect depend on it. If it\n    // were tracked, every keystroke (which updates `lastEmitted`) would re-run the\n    // effect and re-paste the now-stale `content` seed — wiping the user's typing\n    // and resetting the caret after any wholesale reseed.\n    effect(() => {\n      const incoming = this.content();\n      if (!this.quill || incoming === untracked(this.lastEmitted)) return;\n      this.setEditorHtml(incoming);\n    });\n  }\n\n  /** Drops the editor reference so the instance can be garbage collected. */\n  ngOnDestroy(): void {\n    this.destroyed = true;\n    this.quill = null;\n  }\n\n  /** Moves focus into the editing surface. */\n  public focusEditor(): void {\n    this.quill?.focus();\n    if (!this.quill) {\n      this.host.nativeElement.querySelector<HTMLElement>('.ql-editor')?.focus();\n    }\n  }\n\n  /**\n   * Loads Quill, builds the instance and wires its change handler.\n   *\n   * Nothing awaits this beyond the component itself: the surface appears once\n   * the engine has loaded, and until then the `content` effect is a no-op that\n   * the seeding below makes good.\n   */\n  private async createEditor(): Promise<void> {\n    const {default: QuillEditor} = await import('quill');\n    if (this.destroyed) return;\n    const container = this.editorHost().nativeElement;\n    this.quill = new QuillEditor(container, {\n      theme: 'snow',\n      placeholder: this.placeholder(),\n      modules: {toolbar: this.toolbar() as unknown[]},\n    });\n    const label = this.ariaLabel();\n    if (label) {\n      this.quill.root.setAttribute('aria-label', label);\n    }\n    this.applyToolbarLabels();\n    this.setEditorHtml(this.content());\n    this.quill.on('text-change', () => this.emitCurrentHtml());\n  }\n\n  /**\n   * Gives each toolbar control a hover label, so hovering explains what the\n   * style does. Set on the Quill-generated DOM after init; a control the current\n   * toolbar does not render is simply skipped.\n   */\n  private applyToolbarLabels(): void {\n    const toolbar = this.host.nativeElement.querySelector('.ql-toolbar');\n    if (!toolbar) return;\n    const labels = this.labels();\n    const keys = this.labelKeys();\n    for (const [control, selector] of Object.entries(CONTROL_SELECTORS)) {\n      const element = toolbar.querySelector(selector);\n      if (!element) continue;\n      element.classList.add('mn-rte-tooltip');\n      element.setAttribute(\n        'data-tip',\n        this.resolveLabel(control as MnRichTextEditorControl, labels, keys),\n      );\n    }\n  }\n\n  /**\n   * Picks the hover label for one control.\n   * @param control The control being labelled.\n   * @param labels Literal labels supplied by the consumer.\n   * @param keys Translation keys supplied by the consumer.\n   * @returns The translated key, the literal label, or the built-in default.\n   */\n  private resolveLabel(\n    control: MnRichTextEditorControl,\n    labels: MnRichTextEditorLabels,\n    keys: MnRichTextEditorLabels,\n  ): string {\n    const key = keys[control];\n    if (key) {\n      // `t()` echoes the key back when the consumer has no translation for it;\n      // that is a miss, not a label, so fall through to the remaining sources.\n      const translated = this.lang.t(key);\n      if (translated !== key) return translated;\n    }\n    return labels[control] ?? DEFAULT_LABELS[control];\n  }\n\n  /**\n   * Replaces the editor content with stored HTML. Quill parses it into its own\n   * document model, which silently drops anything it has no format for — a\n   * useful extra filter on top of the consumer's sanitiser.\n   * @param html The HTML to load into the editor.\n   */\n  private setEditorHtml(html: string): void {\n    if (!this.quill) return;\n    // `dangerouslyPasteHTML` is Quill's documented name for \"parse this HTML\".\n    this.quill.clipboard.dangerouslyPasteHTML(html ?? '', 'silent');\n    this.lastEmitted.set(this.readHtml());\n  }\n\n  /** Emits the editor's current HTML, normalising Quill's \"empty\" document. */\n  private emitCurrentHtml(): void {\n    const html = this.readHtml();\n    this.lastEmitted.set(html);\n    this.contentChange.emit(html);\n  }\n\n  /**\n   * Reads the editor's HTML.\n   * @returns The current HTML, or an empty string when the editor is blank.\n   */\n  private readHtml(): string {\n    if (!this.quill) return '';\n    // Quill leaves an empty paragraph behind after a clear; treat that as empty\n    // so an untouched editor does not count as authored content.\n    const html = this.quill.root.innerHTML;\n    return html === EMPTY_DOCUMENT ? '' : html;\n  }\n}\n","<div class=\"mn-rich-text-editor {{ chromeClass }} {{ editorClass() }}\">\n  <div #editorHost></div>\n</div>\n","/**\n * Public API of the `mn-angular-lib/rich-text-editor` entry point: the rich-text editor.\n *\n * Each entry point is its own module in the published package, so a consumer's bundler\n * splits it into the chunk that uses it instead of loading the whole library at startup.\n * The root `mn-angular-lib` entry re-exports every entry point.\n */\nexport * from './src/mn-rich-text-editor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}