{"version":3,"file":"cisstech-nge-markdown.mjs","sources":["../../../projects/nge/markdown/src/nge-markdown-contribution.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-admonitions.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-emoji.ts","../../../projects/nge/markdown/src/contributions/code-chrome.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-highlighter.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-icons.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-katex.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-link-anchor.ts","../../../projects/nge/markdown/src/contributions/nge-markdown-tabbed-set.ts","../../../projects/nge/markdown/src/nge-markdown-transformer.ts","../../../projects/nge/markdown/src/nge-markdown-components.ts","../../../projects/nge/markdown/src/nge-markdown-config.ts","../../../projects/nge/markdown/src/nge-markdown.service.ts","../../../projects/nge/markdown/src/nge-markdown.component.ts","../../../projects/nge/markdown/src/nge-markdown.component.html","../../../projects/nge/markdown/src/nge-markdown.module.ts","../../../projects/nge/markdown/src/nge-markdown.providers.ts","../../../projects/nge/markdown/cisstech-nge-markdown.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { NgeMarkdownTransformer } from './nge-markdown-transformer'\n\n/**\n * Implements this interface to contribute to nge-markdown.\n */\nexport interface NgeMarkdownContribution {\n  /**\n   * List of scripts and styles dependencies to loads\n   * before calling the `transform` methods.\n   *\n   * The dependencies are to be loaded only once.\n   */\n  dependencies?(): ['style' | 'script', string][]\n\n  /**\n   * Contributes to nge-markdown api.\n   * @param api nge-markdown api.\n   */\n  contribute(api: NgeMarkdownTransformer): void\n}\n\n/** Inject this token to get the list of contributions to nge-markdown api.  */\nexport const NGE_MARKDOWN_CONTRIBUTION = new InjectionToken<NgeMarkdownContribution>('NGE_MARKDOWN_CONTRIBUTION')\n","import { DOCUMENT, Injectable, Provider, inject } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\nconst OPEN = /^:::(\\+?)\\s+(\\w+)(\\s+.+)?/\nconst CLOSE = /^:::\\s*$/\n\n/**\n * Contribution to add collapsible styled block to markdown syntax.\n */\n@Injectable()\nexport class NgeMarkdownAdmonitions implements NgeMarkdownContribution {\n  private readonly document = inject(DOCUMENT)\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    this.addStyles()\n    this.autoFixAdmonitionsSyntax(transformer)\n    this.createAdmonitions(transformer)\n  }\n\n  private addStyles() {\n    const head = this.document.head\n    if (head.querySelector('[nge-markdown-admonitions]')) {\n      return\n    }\n\n    const admonitions: Record<string, { border: string; bg: string }> = {\n      note: {\n        bg: 'rgba(68, 138, 255, 0.1)',\n        border: '#448aff',\n      },\n      abstract: {\n        bg: 'rgba(0, 176, 255, 0.1)',\n        border: '#00b0ff',\n      },\n      info: {\n        bg: 'rgba(0, 184, 212, 0.1)',\n        border: '#00b8d4',\n      },\n      tip: {\n        bg: 'rgba(0, 191, 165, 0.1)',\n        border: '#00bfa5',\n      },\n      success: {\n        bg: 'rgba(0, 200, 83, 0.1)',\n        border: '#00c853',\n      },\n      question: {\n        bg: 'rgba(100, 221, 23, 0.1)',\n        border: '#64dd17',\n      },\n      warning: {\n        bg: 'rgba(255, 145, 0, 0.1)',\n        border: '#ff9100',\n      },\n      failure: {\n        bg: 'rgba(255, 82, 82, 0.1)',\n        border: '#ff5252',\n      },\n      danger: {\n        bg: 'rgba(255, 23, 68, 0.1)',\n        border: '#ff1744',\n      },\n      bug: {\n        bg: 'rgba(245, 0, 87, 0.1)',\n        border: '#f50057',\n      },\n      example: {\n        bg: 'rgba(101, 31, 255, 0.1)',\n        border: '#651fff',\n      },\n      quote: {\n        bg: 'rgba(158, 158, 158, 0.1)',\n        border: '#9e9e9e',\n      },\n    }\n\n    const stylesheet = [\n      `\n            /* CONTAINER */\n            .nge-md-admonition {\n                margin: 1.5625em 0;\n                overflow: hidden;\n                font-size: 0.84rem;\n                page-break-inside: avoid;\n                border-radius: 0.1rem;\n                box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.05rem rgba(0, 0, 0, 0.1);\n\n                --admonition--note: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z\"/></svg>');\n                --admonition--abstract: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16v2H4V5m0 4h16v2H4V9m0 4h16v2H4v-2m0 4h10v2H4v-2z\"/></svg>');\n                --admonition--info: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10A10 10 0 0012 2z\"/></svg>');\n                --admonition--tip: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M17.55 11.2c-.23-.3-.5-.56-.76-.82-.65-.6-1.4-1.03-2.03-1.66C13.3 7.26 13 4.85 13.91 3c-.91.23-1.75.75-2.45 1.32-2.54 2.08-3.54 5.75-2.34 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.22.1-.46.04-.64-.12a.83.83 0 01-.15-.17c-1.1-1.43-1.28-3.48-.53-5.12C5.89 10 5 12.3 5.14 14.47c.04.5.1 1 .27 1.5.14.6.4 1.2.72 1.73 1.04 1.73 2.87 2.97 4.84 3.22 2.1.27 4.35-.12 5.96-1.6 1.8-1.66 2.45-4.32 1.5-6.6l-.13-.26c-.2-.46-.47-.87-.8-1.25l.05-.01m-3.1 6.3c-.28.24-.73.5-1.08.6-1.1.4-2.2-.16-2.87-.82 1.19-.28 1.89-1.16 2.09-2.05.17-.8-.14-1.46-.27-2.23-.12-.74-.1-1.37.18-2.06.17.38.37.76.6 1.06.76 1 1.95 1.44 2.2 2.8.04.14.06.28.06.43.03.82-.32 1.72-.92 2.27h.01z\"/></svg>');\n                --admonition--success: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2m-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>');\n                --admonition--question: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.07 11.25l-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 00-2-2 2 2 0 00-2 2H8a4 4 0 014-4 4 4 0 014 4 3.2 3.2 0 01-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10c0-5.53-4.5-10-10-10z\"/></svg>');\n                --admonition--warning: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 14h-2v-4h2m0 8h-2v-2h2M1 21h22L12 2 1 21z\"/></svg>');\n                --admonition--failure: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2c5.53 0 10 4.47 10 10s-4.47 10-10 10S2 17.53 2 12 6.47 2 12 2m3.59 5L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41 15.59 7z\"/></svg>');\n                --admonition--danger: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M11.5 20l4.86-9.73H13V4l-5 9.73h3.5V20M12 2c2.75 0 5.1 1 7.05 2.95C21 6.9 22 9.25 22 12s-1 5.1-2.95 7.05C17.1 21 14.75 22 12 22s-5.1-1-7.05-2.95C3 17.1 2 14.75 2 12s1-5.1 2.95-7.05C6.9 3 9.25 2 12 2z\"/></svg>');\n                --admonition--bug: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 00-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 00-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z\"/></svg>');\n                --admonition--example: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 01.75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z\"/></svg>');\n                --admonition--quote: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z\"/></svg>');\n                --admonition--chevron-right: url('data:image/svg+xml;:charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/></svg>');\n                --admonition--chevron-down: url('data:image/svg+xml;:charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z\"/></svg>');\n            }\n\n            /* TITLE */\n            .nge-md-admonition-title {\n                min-height: 24px;\n                box-sizing: border-box;\n                position: relative;\n                display: flex;\n                align-items: center;\n                margin-top: 0 !important;\n                margin-bottom: 0 !important;\n                padding: 0.4rem 0.6rem 0.4rem 2rem;\n                font-weight: 700;\n                /*REMOVE DETAILS MARKER IN FIREFOX*/\n                list-style-type: none;\n            }\n            .nge-md-admonition-title:focus {\n                outline: none;\n            }\n\n            /* DETAILS MARKER */\n            .nge-md-admonition-title::marker,\n            .nge-md-admonition-title::-webkit-details-marker {\n                display: none;\n            }\n\n            /* TITLE COLLAPSIBLE */\n\n            details .nge-md-admonition-title {\n                cursor: pointer;\n            }\n            details .nge-md-admonition-title:after {\n                position: absolute;\n                right: 0.6rem;\n                width: 1rem;\n                height: 1rem;\n                -o-mask-image: var(--admonition--chevron-right);\n                -webkit-mask-image: var(--admonition--chevron-right);\n                mask-image: var(--admonition--chevron-right);\n                content: \"\";\n            }\n            details[open] .nge-md-admonition-title:after {\n                -o-mask-image: var(--admonition--chevron-down);\n                -webkit-mask-image: var(--admonition--chevron-down);\n                mask-image: var(--admonition--chevron-down);\n            }\n\n            /* CONTENT */\n            .nge-md-admonition-content {\n                padding: 0 0.6rem;\n            }\n        `,\n    ]\n\n    Object.keys(admonitions).forEach((type) => {\n      const map = admonitions[type]\n      stylesheet.push(`\n                .nge-md-admonition--${type} {\n                    border-left: 0.2rem solid ${map.border};\n                }\n                .nge-md-admonition-title--${type} {\n                    background-color: ${map.bg};\n                }\n                .nge-md-admonition-title--${type}:before,\n                .nge-md-admonition-title--${type}:after {\n                    background-color: ${map.border};\n                }\n                .nge-md-admonition-title--${type}:before {\n                    position: absolute;\n                    left: 0.6rem;\n                    width: 1rem;\n                    height: 1rem;\n                    -o-mask-image: var(--admonition--${type});\n                    -webkit-mask-image: var(--admonition--${type});\n                    mask-image: var(--admonition--${type});\n                    content: \"\";\n                }\n            `)\n    })\n    const style = this.document.createElement('style')\n    style.setAttribute('nge-markdown-admonitions', '')\n    style.innerHTML = stylesheet.join('\\n')\n\n    head.appendChild(style)\n  }\n\n  private createAdmonitions(transformer: NgeMarkdownTransformer) {\n    transformer.addHtmlTransformer((element) => {\n      const paragraphs = Array.from(element.querySelectorAll('p'))\n      paragraphs.forEach((p) => {\n        const text = p.innerHTML\n        const match = text.match(OPEN)\n        if (match) {\n          const opener = match[1]\n          const type = match[2]\n          const title = (match[3] || '').trim()\n\n          const admonition = this.document.createElement('details')\n          if (opener.endsWith('+')) {\n            admonition.open = true\n          }\n          admonition.className = 'nge-md-admonition nge-md-admonition--' + type\n\n          const summary = this.document.createElement('summary')\n          summary.className = 'nge-md-admonition-title nge-md-admonition-title--' + type\n          summary.innerHTML = title\n\n          const content: HTMLElement[] = []\n          admonition.appendChild(summary)\n\n          let node = p.nextElementSibling\n          let opened = 1\n          while (node) {\n            const innerHTML = node.innerHTML.trim()\n            if (innerHTML.match(OPEN)) {\n              opened++\n            } else if (innerHTML.match(CLOSE)) {\n              opened--\n              if (opened === 0) {\n                node.remove()\n                break\n              }\n            }\n            content.push(node as HTMLElement)\n            node = node.nextElementSibling\n          }\n\n          const div = this.document.createElement('div')\n          div.className = 'nge-md-admonition-content'\n          content.forEach((e) => div.appendChild(e))\n          admonition.appendChild(div)\n\n          p.parentElement?.insertBefore(admonition, p)\n          p.remove()\n        }\n      })\n    })\n  }\n\n  private autoFixAdmonitionsSyntax(transformer: NgeMarkdownTransformer) {\n    transformer.addMarkdownTransformer((markdown) => {\n      const lines = markdown.split('\\n')\n      const length = lines.length\n      let insideCodeBlock = false\n      for (let i = 0; i < length; i++) {\n        const curr = lines[i]\n        if (curr.startsWith('```')) {\n          insideCodeBlock = !insideCodeBlock\n        }\n        if (insideCodeBlock) {\n          continue\n        }\n        const prev = i > 0 ? lines[i - 1] : undefined\n        const next = i < length - 1 ? lines[i + 1] : undefined\n        if (curr.match(OPEN)) {\n          if (next?.trim()) {\n            lines[i] = curr + '\\n'\n          }\n        } else if (curr.match(CLOSE)) {\n          if (prev?.trim()) {\n            lines[i] = '\\n' + curr\n          }\n        }\n      }\n      return lines.join('\\n')\n    })\n  }\n}\n\n/**\n * Injection token to register `NgeMarkdownAdmonitions` contribution.\n *\n * @deprecated Use `provideNgeMarkdown(withAdmonitions())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownAdmonitionsProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownAdmonitions,\n}\n","import { Injectable, InjectionToken, Provider, inject } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\n/** Options to pass to `NgeMarkdownEmoji` contribution. */\nexport interface NgeMarkdownEmojiOptions {\n  /** URL to load joypixels script (default https://cdn.jsdelivr.net/npm/emoji-toolkit@6.0.1/lib/js/joypixels.min.js). */\n  url: string\n}\n\n/** Injection token to pass custom options to `NgeMarkdownEmoji` contribution. */\nexport const NGE_MARKDOWN_EMOJI_OPTIONS = new InjectionToken<NgeMarkdownEmojiOptions>('NGE_MARKDOWN_EMOJI_OPTIONS')\n\n/**\n * Contribution to use emoji in markdown using [emoji-toolkit](https://github.com/joypixels/emoji-toolkit) library.\n */\n@Injectable()\nexport class NgeMarkdownEmoji implements NgeMarkdownContribution {\n  private readonly options: NgeMarkdownEmojiOptions = inject<NgeMarkdownEmojiOptions>(NGE_MARKDOWN_EMOJI_OPTIONS, {\n    optional: true,\n  }) ?? { url: 'https://cdn.jsdelivr.net/npm/emoji-toolkit@8.0.0/lib/js/joypixels.min.js' }\n\n  dependencies() {\n    const deps: any[] = []\n    // joypixels is a browser script; under SSR declare no dependency and let the\n    // emoji shortcodes resolve on the client after hydration.\n    if (typeof window !== 'undefined' && !('joypixels' in window)) {\n      deps.push(['script', this.options.url])\n    }\n    return deps\n  }\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    transformer.addMarkdownTransformer((markdown) => {\n      // joypixels only exists in the browser; leave shortcodes untouched on the\n      // server so they resolve after hydration.\n      if (typeof window === 'undefined' || !('joypixels' in window)) {\n        return markdown\n      }\n      const { joypixels } = window as any\n      const lines = markdown.split('\\n')\n      const length = lines.length\n      let insideCodeBlock = false\n      for (let i = 0; i < length; i++) {\n        const curr = lines[i]\n        if (curr.startsWith('```')) {\n          insideCodeBlock = !insideCodeBlock\n        }\n        if (insideCodeBlock) {\n          continue\n        }\n        if (lines[i].match(/:[a-z0-9_+-]+:/g)) {\n          lines[i] = joypixels.shortnameToUnicode(lines[i])\n        }\n      }\n      return lines.join('\\n')\n    })\n  }\n}\n\n/**\n * Provider to register `NgeMarkdownEmoji` contribution.\n *\n * @deprecated Use `provideNgeMarkdown(withEmoji())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownEmojiProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownEmoji,\n}\n\n/**\n * Provider to pass options to `NgeMarkdownEmoji` contribution.\n * @param options `NgeMarkdownEmoji` options.\n *\n * @deprecated Use `provideNgeMarkdown(withEmoji(options))` instead; will be removed in the next major.\n */\nexport function NgeMarkdownEmojiOptionsProvider(options: NgeMarkdownEmojiOptions): Provider {\n  return {\n    provide: NGE_MARKDOWN_EMOJI_OPTIONS,\n    useValue: options,\n  }\n}\n","/**\n * Shared chrome of fenced code blocks: a wrapper with a toolbar holding the\n * optional `filename` tab and the copy / download actions. The highlighter\n * contribution applies it whatever the colorizing backend (monaco, shiki), so\n * every block gets the same look and actions.\n */\n\nconst STYLE_ID = 'nge-markdown-code-chrome'\n\nconst COPY_SVG =\n  '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>'\n\nconst DOWNLOAD_SVG =\n  '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>'\n\nconst CHECK_SVG =\n  '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"></path></svg>'\n\nexport interface CodeChromeOptions {\n  /** The `<pre>` element of the block. */\n  pre: HTMLElement\n  /** Raw code, captured before colorizing (used by copy and download). */\n  code: string\n  /** Optional filename shown as the tab label and used as the download name. */\n  filename?: string\n  /** Language, used as the download extension fallback. */\n  language?: string\n  /** Extra toolbar actions, after copy and download (e.g. \"Open in StackBlitz\"). */\n  actions?: CodeAction[]\n}\n\n/** An extra toolbar action for a code block. */\nexport interface CodeAction {\n  /** Accessible title and tooltip. */\n  title: string\n  /** Inline SVG markup for the icon. */\n  icon: string\n  /** Invoked with the raw code when the button is clicked. */\n  run: (code: string) => void\n}\n\n/**\n * Wraps the block and prepends the toolbar. Idempotent: a block already\n * wrapped keeps its chrome (the actions are re-bound on the fresh elements a\n * re-render produces anyway, since re-rendering replaces the whole fragment).\n */\nexport function applyCodeChrome(document: Document, options: CodeChromeOptions): void {\n  const { pre } = options\n  const parent = pre.parentNode as HTMLElement | null\n  if (!parent || parent.getAttribute?.('class')?.includes('nge-code-block')) {\n    return\n  }\n\n  const wrapper = document.createElement('div')\n  wrapper.setAttribute('class', 'nge-code-block')\n\n  const toolbar = document.createElement('div')\n  toolbar.setAttribute('class', 'nge-code-toolbar')\n\n  const label = document.createElement('span')\n  label.setAttribute('class', 'nge-code-toolbar-label')\n  label.textContent = options.filename ?? options.language ?? ''\n  toolbar.appendChild(label)\n\n  const actions = document.createElement('div')\n  actions.setAttribute('class', 'nge-code-toolbar-actions')\n  for (const action of options.actions ?? []) {\n    actions.appendChild(extraAction(document, options.code, action))\n  }\n  actions.appendChild(copyAction(document, options))\n  actions.appendChild(downloadAction(document, options))\n  toolbar.appendChild(actions)\n\n  parent.insertBefore(wrapper, pre)\n  wrapper.appendChild(toolbar)\n  wrapper.appendChild(pre)\n\n  ensureChromeStyle(document)\n}\n\nfunction extraAction(document: Document, code: string, action: CodeAction): HTMLElement {\n  const button = actionButton(document, action.title, action.icon)\n  button.addEventListener('click', (event) => {\n    event.preventDefault()\n    event.stopPropagation()\n    action.run(code)\n  })\n  return button\n}\n\nfunction copyAction(document: Document, options: CodeChromeOptions): HTMLElement {\n  const button = actionButton(document, 'Copy code to clipboard', COPY_SVG)\n  button.addEventListener('click', async (event) => {\n    event.preventDefault()\n    event.stopPropagation()\n    try {\n      await navigator.clipboard.writeText(options.code)\n      feedback(button, COPY_SVG)\n    } catch {\n      // Clipboard unavailable (permissions, insecure context): nothing to do.\n    }\n  })\n  return button\n}\n\nfunction downloadAction(document: Document, options: CodeChromeOptions): HTMLElement {\n  const button = actionButton(document, 'Download code as file', DOWNLOAD_SVG)\n  button.addEventListener('click', (event) => {\n    event.preventDefault()\n    event.stopPropagation()\n    const url = URL.createObjectURL(new Blob([options.code], { type: 'text/plain' }))\n    const anchor = document.createElement('a')\n    anchor.href = url\n    anchor.download = options.filename || `code.${options.language || 'txt'}`\n    anchor.click()\n    URL.revokeObjectURL(url)\n    feedback(button, DOWNLOAD_SVG)\n  })\n  return button\n}\n\nfunction actionButton(document: Document, title: string, svg: string): HTMLElement {\n  const button = document.createElement('button')\n  button.setAttribute('type', 'button')\n  button.setAttribute('class', 'nge-code-action')\n  button.setAttribute('title', title)\n  button.setAttribute('aria-label', title)\n  button.innerHTML = svg\n  return button\n}\n\n/** Swaps the icon for a check mark for a moment, as the action's confirmation. */\nfunction feedback(button: HTMLElement, restore: string): void {\n  button.innerHTML = CHECK_SVG\n  button.setAttribute('class', 'nge-code-action nge-code-action-done')\n  setTimeout(() => {\n    button.innerHTML = restore\n    button.setAttribute('class', 'nge-code-action')\n  }, 2000)\n}\n\n/** Neutral, scheme-adaptive styling: everything derives from `currentColor`. */\nfunction ensureChromeStyle(document: Document): void {\n  if (document.getElementById(STYLE_ID)) {\n    return\n  }\n  const style = document.createElement('style')\n  style.id = STYLE_ID\n  style.textContent = [\n    '.nge-code-block { border: 1px solid color-mix(in srgb, currentColor 14%, transparent); border-radius: 8px; overflow: hidden; margin: 1em 0; }',\n    '.nge-code-block > pre { margin: 0; border-radius: 0; }',\n    '.nge-code-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 0.5em; padding: 0.35em 0.5em 0.35em 1em; font-size: 0.8em; background-color: color-mix(in srgb, currentColor 5%, transparent); border-bottom: 1px solid color-mix(in srgb, currentColor 10%, transparent); }',\n    '.nge-code-toolbar-label { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; opacity: 0.75; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }',\n    '.nge-code-toolbar-actions { display: flex; gap: 0.25em; }',\n    '.nge-code-action { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; padding: 0; border: none; border-radius: 6px; background: transparent; color: inherit; opacity: 0.65; cursor: pointer; transition: opacity 0.2s, background-color 0.2s; }',\n    '.nge-code-action:hover { opacity: 1; background-color: color-mix(in srgb, currentColor 10%, transparent); }',\n    '.nge-code-action-done { color: #22c55e; opacity: 1; }',\n  ].join('\\n')\n  document.head.appendChild(style)\n}\n","import { DOCUMENT, Injector, InjectionToken, Injectable, Provider, Type, inject } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\nimport { CodeAction, applyCodeChrome } from './code-chrome'\n\nconst DATA_LINES = 'data-nge-md-hl-lines'\nconst DATA_LANGUAGE = 'data-nge-md-hl-language'\nconst DATA_HIGHLIGHTS = 'data-nge-md-hl-highlights'\nconst DATA_FILENAME = 'data-nge-md-hl-filename'\n\n/** Fence flag exposed on the rendered `pre`, e.g. from ```ts stackblitz. */\nexport const DATA_STACKBLITZ = 'data-nge-md-hl-stackblitz'\n\n/** Context handed to a code-action provider for one highlighted block. */\nexport interface NgeMarkdownCodeActionContext {\n  /** The rendered `pre` element, carrying the fence flags as data attributes. */\n  pre: HTMLElement\n  /** The raw code, captured before colorizing mutates the DOM. */\n  code: string\n  /** Fence language. */\n  language: string\n  /** Fence filename, if any. */\n  filename?: string\n}\n\n/**\n * Contributes a toolbar action to a highlighted code block, or `null` to skip\n * it. Register with `multi: true` on {@link NGE_MARKDOWN_CODE_ACTIONS}. Keeping\n * actions behind this token lets optional integrations (StackBlitz, ...) stay\n * out of the highlighter's module graph until their feature is opted into.\n */\nexport type NgeMarkdownCodeActionProvider = (context: NgeMarkdownCodeActionContext) => CodeAction | null\n\n/** Multi-provider token for code-block toolbar actions. */\nexport const NGE_MARKDOWN_CODE_ACTIONS = new InjectionToken<readonly NgeMarkdownCodeActionProvider[]>(\n  'NGE_MARKDOWN_CODE_ACTIONS'\n)\n\n/**\n * Highlight options.\n */\nexport interface NgeMarkdownHighlightOptions {\n  /** &lt;code&gt;&lt;/code&gt; element to colorize. */\n  element: HTMLElement\n\n  /** Target language (default plaintext) */\n  language?: string\n\n  /**\n   * Start line number or a space separated list of line numbers to show.\n   *\n   * Example:\n   *\n   * *Show all line numbers starting 1*\n   *\n   * `\"1\"`\n   *\n   * *Show all line numbers from 1 to 4*\n   *\n   * `\"1-4\"`\n   *\n   * *Show lines 2 4 5 6 7 9*\n   *\n   * `\"2 4-7 9\"`\n   *\n   */\n  lines?: string\n\n  /**\n   * A space separated list of line numbers to highlight.\n   *\n   * Example:\n   *\n   * *Highlight line 1*\n   *\n   * `\"1\"`\n   *\n   * *Highlight all lines from 1 to 4*\n   *\n   * `\"1-4\"`\n   *\n   * *Highlightw lines 2 4 5 6 7 9*\n   *\n   * `\"2 4-7 9\"`\n   */\n  highlights?: string\n\n  /** Filename to display */\n  filename?: string\n}\n\n/**\n * Highlighter service representation.\n */\nexport interface NgeMarkdownHighlighterService {\n  /**\n   * Whether the service also works during server rendering. Browser-bound\n   * services (monaco) leave it unset: their blocks render plain on the server\n   * and colorize on the client. A server-capable service (shiki) sets it to\n   * true so prerendered pages ship highlighted HTML.\n   */\n  ssr?: boolean\n\n  /**\n   * Function called to hightlight an HTMLElement code.\n   * @param injector Injector reference to use Angular dependency injection.\n   * @param options Highlight options.\n   */\n  highligtht?(injector: Injector, options: NgeMarkdownHighlightOptions): void | Promise<void>\n}\n\n/**\n * Injection token to register a highlighter service.\n */\nexport const NGE_MARKDOWN_HIGHLIGHTER_SERVICE = new InjectionToken<NgeMarkdownHighlighterService>(\n  'NGE_MARKDOWN_HIGHLIGHTER_SERVICE'\n)\n\n/**\n * Contribution to add an abstract syntax highlighter.\n */\n@Injectable()\nexport class NgeMarkdownHighlighter implements NgeMarkdownContribution {\n  private readonly injector = inject(Injector)\n  private readonly options = inject<NgeMarkdownHighlighterService>(NGE_MARKDOWN_HIGHLIGHTER_SERVICE, { optional: true })\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    this.createAttributes(transformer)\n    this.colorizeCodes(transformer)\n  }\n\n  private createAttributes(transformer: NgeMarkdownTransformer) {\n    transformer.addRendererTransformer((renderer) => {\n      renderer.code = (code, args) => {\n        args = args || ''\n        const attributes = new Map<string, string>()\n\n        // LANGUAGE\n        const language = args.split(' ').slice(0, 1).pop() || 'plaintext'\n        attributes.set(DATA_LANGUAGE, language)\n\n        // LINE NUMBERING\n        let match = args.match(/lines=\"(.+?)\"/)\n        if (match) {\n          attributes.set(DATA_LINES, match[1])\n        }\n\n        // LINE HIGHLIGHTING\n        match = args.match(/highlights=\"(.+?)\"/)\n        if (match) {\n          attributes.set(DATA_HIGHLIGHTS, match[1])\n        }\n\n        // FILENAME\n        match = args.match(/filename=\"(.+?)\"/)\n        if (match) {\n          attributes.set(DATA_FILENAME, match[1])\n        }\n\n        // STACKBLITZ (a bare flag on the fence, e.g. ```ts stackblitz)\n        if (/(^|\\s)stackblitz(\\s|$)/.test(args)) {\n          attributes.set(DATA_STACKBLITZ, 'true')\n        }\n\n        const attribs = Array.from(attributes.entries())\n          .map(([attributeName, attributeValue]) => {\n            return `${attributeName}=\"${attributeValue}\"`\n          })\n          .join(' ')\n        return `<pre ${attribs}><code>${this.escapeHtml(code)}</code></pre>`\n      }\n      return renderer\n    })\n  }\n\n  private colorizeCodes(transformer: NgeMarkdownTransformer) {\n    if (!this.options?.highligtht) {\n      return\n    }\n    const highlight = this.options.highligtht\n    const actionProviders = this.injector.get(NGE_MARKDOWN_CODE_ACTIONS, [])\n    transformer.addHtmlTransformer(async (element) => {\n      // Unless the service declares itself server-capable, colorizing waits for\n      // the browser: blocks render plain under SSR and colorize after hydration.\n      if (typeof document === 'undefined' && !this.options?.ssr) {\n        return\n      }\n      const doc = this.injector.get(DOCUMENT)\n      const preElements = Array.from(element.querySelectorAll(`pre[${DATA_LANGUAGE}]`))\n      for (const pre of preElements) {\n        const code = pre.querySelector('code') as HTMLElement\n        const language = pre.getAttribute(DATA_LANGUAGE) || 'plaintext'\n        const filename = pre.getAttribute(DATA_FILENAME) || undefined\n        // Captured before colorizing mutates the DOM; feeds copy, download and the actions.\n        const raw = code?.textContent ?? ''\n\n        // Awaited so server rendering only snapshots once every block is done.\n        await highlight(this.injector, {\n          lines: pre.getAttribute(DATA_LINES) || '',\n          element: code,\n          language,\n          highlights: pre.getAttribute(DATA_HIGHLIGHTS) || '',\n          filename: filename || '',\n        })\n\n        const context: NgeMarkdownCodeActionContext = { pre: pre as HTMLElement, code: raw, language, filename }\n        const actions = actionProviders\n          .map((provider) => provider(context))\n          .filter((action): action is CodeAction => action != null)\n\n        // Same chrome (filename tab, copy, download, extra actions) whatever the\n        // colorizing backend.\n        applyCodeChrome(doc, { pre: pre as HTMLElement, code: raw, filename, language, actions })\n      }\n    })\n  }\n\n  private escapeHtml(input: string) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const map: any = {\n      '<': '&lt;',\n      '>': '&gt;',\n    }\n    return input.replace(/[<>]/g, (tag) => map[tag] || tag)\n  }\n}\n\n/**\n * Injection token to register `NgeMarkdownHighlighter` contribution.\n *\n * @deprecated Use `provideNgeMarkdown(withHighlighter())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownHighlighterProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownHighlighter,\n}\n\n/**\n * Highlighter service backed by a Monaco colorizer (`NgeMonacoColorizerService`),\n * resolved lazily through the injector so markdown never imports monaco.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function monacoHighlighterService(type: Type<any>): NgeMarkdownHighlighterService {\n  return {\n    highligtht: (injector, options) => {\n      const colorizer = injector.get(type, null)\n      const code = options.element\n      const pre = code.parentElement as HTMLElement\n      pre.style.overflow = 'auto'\n      colorizer?.colorizeElement({\n        element: code,\n        language: options.language,\n        code: code.textContent,\n        lines: options.lines,\n        filename: options.filename,\n        highlights: options.highlights,\n        // The highlighter contribution renders the shared chrome.\n        fileTab: false,\n      })\n    },\n  } as NgeMarkdownHighlighterService\n}\n\n/**\n * Provider to register `NgeMonacoColorizerService` as the syntax highlighter.\n * @param type A reference to NgeMonacoColorizerService type.\n * @deprecated Use `provideNgeMarkdown(withHighlighter(NgeMonacoColorizerService))` instead; will be removed in the next major.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function NgeMarkdownHighlighterMonacoProvider(type: Type<any>) {\n  return {\n    provide: NGE_MARKDOWN_HIGHLIGHTER_SERVICE,\n    useValue: monacoHighlighterService(type),\n  }\n}\n","import { Injectable, Provider } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\n/**\n * Contribution to use icons in markdown library using https://icongr.am/.\n */\n@Injectable()\nexport class NgeMarkdownIcons implements NgeMarkdownContribution {\n  contribute(transformer: NgeMarkdownTransformer) {\n    transformer.addMarkdownTransformer((markdown) => {\n      const pattern = /@(\\w+)\\s+([\\w-]+)((\\s+(?:color|size)=[^\\s]+)*?)?@/gm\n      const lines = markdown.split('\\n')\n      const length = lines.length\n      let insideCodeBlock = false\n      for (let i = 0; i < length; i++) {\n        const curr = lines[i]\n        if (curr.startsWith('```')) {\n          insideCodeBlock = !insideCodeBlock\n        }\n        if (insideCodeBlock) {\n          continue\n        }\n        lines[i] = lines[i].replace(pattern, (_: string, type: string, name: string, params?: string) => {\n          params = (params ?? '')\n            .trim()\n            .split(' ')\n            .filter((e) => e.trim())\n            .join('&')\n          params = params ? '?' + params : ''\n          return `<img src=\"https://icongr.am/${type.trim()}/${name.trim()}.svg${params}\"/>`\n        })\n      }\n      return lines.join('\\n')\n    })\n  }\n}\n\n/**\n * Injection token to register `NgeMarkdownIcons` contribution.\n *\n * @deprecated Use `provideNgeMarkdown(withIcons())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownIconsProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownIcons,\n}\n","import { Injectable, InjectionToken, Provider, inject } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\n/** Custom options to pass to NgeMarkdownKatex contribution. */\nexport interface NgeMarkdownKatexOptions {\n  /** Base url to load katex scripts and styles. (default https://cdn.jsdelivr.net/npm/katex@0.15.1/dist) */\n  baseUrl?: string\n  /** Options to pass to katex render function. https://katex.org/docs/options.html */\n  options?: Record<string, any>\n  /** Katex extensions to include. https://katex.org/docs/libs.html  */\n  extensions?: {\n    /** https://github.com/Khan/KaTeX/tree/master/contrib/mhchem (default to `true`) */\n    mhchem?: boolean\n    /** https://github.com/Khan/KaTeX/tree/master/contrib/copy-tex (default to `true`) */\n    copyTex?: boolean\n  }\n}\n\n/** Custom options to pass to NgeMarkdownKatex contribution. */\nexport const NGE_MARKDOWN_KATEX_OPTIONS = new InjectionToken<NgeMarkdownKatexOptions>('NGE_MARKDOWN_KATEX_OPTIONS')\n\n/**\n * Contribution to render math expressions in markdown using [Katex](https://katex.org) library.\n */\n@Injectable()\nexport class NgeMarkdownKatex implements NgeMarkdownContribution {\n  private readonly options: NgeMarkdownKatexOptions =\n    inject<NgeMarkdownKatexOptions>(NGE_MARKDOWN_KATEX_OPTIONS, { optional: true }) ?? {}\n\n  constructor() {\n    this.options.extensions = this.options.extensions || {}\n    this.options.extensions.mhchem = this.options.extensions.mhchem ?? true\n    this.options.extensions.copyTex = this.options.extensions.copyTex ?? true\n  }\n\n  dependencies() {\n    // KaTeX ships as browser scripts; under SSR declare no dependencies and let\n    // the math render on the client after hydration.\n    if (typeof window === 'undefined' || 'katex' in window) {\n      return []\n    }\n\n    let baseUrl = this.options?.baseUrl || 'https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/'\n    if (!baseUrl.endsWith('/')) {\n      baseUrl += '/'\n    }\n\n    const deps = [\n      ['style', `${baseUrl}katex.min.css`],\n      ['script', `${baseUrl}katex.js`],\n      ['script', `${baseUrl}contrib/auto-render.js`],\n    ]\n\n    if (this.options.extensions?.copyTex) {\n      deps.push(['script', `${baseUrl}contrib/copy-tex.min.js`])\n    }\n\n    if (this.options.extensions?.mhchem) {\n      deps.push(['script', `${baseUrl}contrib/mhchem.js`])\n    }\n\n    return deps as any\n  }\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    // Display math ($$...$$ and \\[...\\]) spans several lines, so protect it from\n    // the markdown parser before lexing. Otherwise a line that starts with \"- \"\n    // (a negative term in an equation, for instance) is turned into a bullet list\n    // before KaTeX ever sees it. Each block is stashed and restored verbatim just\n    // before rendering. See https://github.com/cisstech/nge/issues/335.\n    const mathBlocks: string[] = []\n    transformer.addMarkdownTransformer((markdown) =>\n      // The first branch matches (and preserves) fenced or inline code, so a `$$`\n      // shown as an example inside code is left untouched.\n      markdown.replace(\n        /(```[\\s\\S]*?```|~~~[\\s\\S]*?~~~|`[^`\\n]*`)|(\\$\\$[\\s\\S]+?\\$\\$|\\\\\\[[\\s\\S]+?\\\\\\])/g,\n        (match, code: string | undefined, math: string | undefined) => {\n          if (code != null) return code\n          const index = mathBlocks.push(math as string) - 1\n          return `\\n\\n<div class=\"nge-markdown-math\" data-math=\"${index}\"></div>\\n\\n`\n        }\n      )\n    )\n\n    transformer.addHtmlTransformer((element) => {\n      Array.from(element.querySelectorAll<HTMLElement>('.nge-markdown-math')).forEach((placeholder) => {\n        const holder = element.ownerDocument.createElement('div')\n        holder.textContent = mathBlocks[Number(placeholder.getAttribute('data-math'))] ?? ''\n        placeholder.parentNode?.replaceChild(holder, placeholder)\n      })\n\n      // KaTeX renders in the browser; under SSR leave the math placeholders for\n      // the client to render after hydration.\n      if (typeof window === 'undefined') {\n        return\n      }\n\n      const { renderMathInElement } = window as any\n      try {\n        renderMathInElement(\n          element,\n          this.options.options || {\n            delimiters: [\n              { left: '$$', right: '$$', display: false },\n              { left: '$', right: '$', display: false },\n              { left: '\\\\(', right: '\\\\)', display: false },\n              { left: '\\\\[', right: '\\\\]', display: false },\n            ],\n          }\n        )\n      } catch (error) {\n        console.error(error)\n      }\n    })\n  }\n}\n\n/**\n * Provider to render math expressions in markdown using [Katex](https://katex.org) library.\n *\n * @deprecated Use `provideNgeMarkdown(withKatex())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownKatexProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownKatex,\n}\n\n/**\n * Provider to pass options to `NgeMarkdownKatex` contribution.\n * @param options `NgeMarkdownKatex` options.\n *\n * @deprecated Use `provideNgeMarkdown(withKatex(options))` instead; will be removed in the next major.\n */\nexport function NgeMarkdownKatexOptionsProvider(options: NgeMarkdownKatexOptions): Provider {\n  return {\n    provide: NGE_MARKDOWN_KATEX_OPTIONS,\n    useValue: options,\n  }\n}\n","import { Location } from '@angular/common'\nimport { Injectable, Provider, inject } from '@angular/core'\nimport { Router } from '@angular/router'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\n/**\n * Contribution to handle fragment navigation in anchor elements.\n */\n@Injectable()\nexport class NgeMarkdownLinkAnchor implements NgeMarkdownContribution {\n  private readonly router = inject(Router)\n  private readonly location = inject(Location)\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    transformer.addRendererTransformer((renderer) => {\n      renderer.link = (href: string, _: string, text: string) => {\n        const attributes = new Map<string, string>()\n        if (href.startsWith('#')) {\n          href = this.location.path() + href\n        }\n        attributes.set('href', href)\n\n        // open in new tab if its a link external to the application\n        const routes = (this.router.config || []).map((config) => {\n          if (!config.path?.startsWith('/')) {\n            return '/' + config.path\n          }\n          return config.path\n        })\n        if (!routes.find((route) => href.startsWith(route))) {\n          attributes.set('target', '_blank')\n        }\n\n        return `<a ${Array.from(attributes.entries())\n          .map((entry) => {\n            return entry[0] + '=' + entry[1]\n          })\n          .join(' ')}>${text}</a>`\n      }\n      return renderer\n    })\n  }\n}\n\n/**\n * Injection token to register `NgeMarkdownLinkAnchor` contribution.\n *\n * @deprecated Use `provideNgeMarkdown(withLinkAnchor())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownLinkAnchorProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownLinkAnchor,\n}\n","import { DOCUMENT, Injectable, Provider, inject } from '@angular/core'\nimport { NgeMarkdownTransformer } from '../nge-markdown-transformer'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'\n\nlet TABSET_COUNTER = 0\n\ninterface Tab {\n  title: string\n  content: Element[]\n}\n\n/**\n * Contribution to render tabs inside markdown files.\n */\n@Injectable()\nexport class NgeMarkdownTabbedSet implements NgeMarkdownContribution {\n  private readonly document = inject(DOCUMENT)\n\n  contribute(transformer: NgeMarkdownTransformer) {\n    this.addStyles()\n    transformer.addHtmlTransformer((el) => {\n      const open = /^===\\s*(.+)/\n      const close = /^===\\s*$/\n      const processed: Element[] = []\n      const toRemoves: Element[] = []\n      Array.from(el.querySelectorAll('p')).forEach((paragraph) => {\n        if (processed.indexOf(paragraph) !== -1) {\n          return\n        }\n\n        const match = paragraph.innerHTML.match(open)\n        if (match) {\n          const tabs: Tab[] = []\n          let tab: Tab = {\n            title: match[1],\n            content: [],\n          }\n\n          let node = paragraph.nextElementSibling\n          while (node) {\n            let push = true\n            const innerHTML = node.innerHTML.trim()\n            if (innerHTML.match(open)) {\n              tabs.push(tab)\n              tab = {\n                title: innerHTML.replace('===', '').trim(),\n                content: [],\n              }\n              push = false\n              toRemoves.push(node)\n            } else if (innerHTML.match(close)) {\n              tabs.push(tab)\n              toRemoves.push(node)\n              break\n            }\n\n            if (push) {\n              tab.content.push(node)\n            }\n\n            processed.push(node)\n            node = node.nextElementSibling\n          }\n\n          paragraph.parentElement?.replaceChild(this.createTabs(tabs), paragraph)\n\n          paragraph.remove()\n          toRemoves.forEach((e) => e.remove())\n        }\n      })\n    })\n  }\n\n  private createTabs(tabs: Tab[]) {\n    const tabset = this.document.createElement('div')\n    tabset.className = 'nge-md-tabbed-set'\n\n    let i = 0\n    TABSET_COUNTER++\n    tabs.forEach((e) => {\n      const checkbox = this.document.createElement('input')\n      checkbox.type = 'radio'\n      checkbox.id = 'nge-md-tabbed-' + TABSET_COUNTER + '-' + i\n      checkbox.name = 'nge-md-tabbed-' + TABSET_COUNTER\n      if (i === 0) {\n        checkbox.setAttribute('checked', 'checked')\n      }\n\n      const label = this.document.createElement('label')\n      label.setAttribute('for', checkbox.id)\n      label.innerHTML = e.title\n\n      const content = this.document.createElement('div')\n      content.className = 'nge-md-tabbed-content'\n      e.content.forEach((c) => content.appendChild(c))\n\n      tabset.appendChild(checkbox)\n      tabset.appendChild(label)\n      tabset.appendChild(content)\n      i++\n    })\n    return tabset\n  }\n\n  private addStyles() {\n    const head = this.document.head\n    if (head.querySelector('[nge-markdown-tabbed-set]')) {\n      return\n    }\n\n    const style = this.document.createElement('style')\n    style.setAttribute('nge-markdown-tabbed-set', '')\n    style.innerHTML = `\n            /*  TAB SET */\n            .nge-md-tabbed-set {\n                display: flex;\n                position: relative;\n                flex-wrap: wrap;\n                margin: 1em 0;\n                border-radius: .1rem;\n            }\n\n            .nge-md-tabbed-set .highlight {\n                background: #ddd;\n            }\n\n            .nge-md-tabbed-set .nge-md-tabbed-content {\n                display: none;\n                order: 99;\n                width: 100%;\n            }\n            .nge-md-tabbed-set .nge-md-tabbed-content :first-child {\n                margin: 0;\n            }\n\n            .nge-md-tabbed-set label {\n                width: auto;\n                /*padding: 0.25em;*/\n                padding: .9375em 1.25em .78125em;\n                font-weight: 700;\n                font-size: .84rem;\n                cursor: pointer;\n            }\n\n            .nge-md-tabbed-set input {\n                position: absolute;\n                opacity: 0;\n            }\n\n            .nge-md-tabbed-set input:nth-child(n+1) {\n                color: #333333;\n            }\n\n            .nge-md-tabbed-set input:nth-child(n+1):checked + label {\n                color: #ff5252;\n                transition: all 0.3s;\n                /* background-color: rgba(255, 82, 82, 0.1);*/\n                border-bottom: .1rem solid;\n            }\n\n            .nge-md-tabbed-set input:nth-child(n+1):checked + label + .nge-md-tabbed-content {\n                display: block;\n                border-top: 1px solid #F5F5F5;\n            }\n        `\n\n    head.appendChild(style)\n  }\n}\n\n/**  * Injection token to register `NgeMarkdownTabbedSet` contribution. *\n * @deprecated Use `provideNgeMarkdown(withTabbedSet())` instead; will be removed in the next major.\n */\nexport const NgeMarkdownTabbedSetProvider: Provider = {\n  provide: NGE_MARKDOWN_CONTRIBUTION,\n  multi: true,\n  useClass: NgeMarkdownTabbedSet,\n}\n","import type { Renderer, Tokenizer, TokensList, marked } from 'marked'\nimport { NgeMarkdownConfig } from './nge-markdown-config'\n\ndeclare type AstTransformer = (tokens: TokensList) => TokensList\ndeclare type HtmlTransformer = (element: HTMLElement) => void | Promise<void>\ndeclare type MarkdownTransformer = (markdown: string) => string\ndeclare type RendererTransformer = (renderer: Renderer) => Renderer\ndeclare type TokenizerTransformer = (tokenizer: Tokenizer) => Tokenizer\n\n/**\n * Nge markdown transformer used by the contributions.\n */\nexport class NgeMarkdownTransformer {\n  private readonly astTransformers: AstTransformer[] = []\n  private readonly htmlTransformers: HtmlTransformer[] = []\n  private readonly markdownTransformers: MarkdownTransformer[] = []\n  private readonly rendererTransformers: RendererTransformer[] = []\n  private readonly tokenizerTransformers: TokenizerTransformer[] = []\n\n  constructor(\n    /** Configuration option */\n    readonly config: NgeMarkdownConfig\n  ) {}\n\n  /**\n   * Registers a function to call to update the ast generated by the markdown compiler.\n   * @param transform the function to call.\n   */\n  addAstTransformer(transform: AstTransformer) {\n    if (transform == null) {\n      throw new ReferenceError('argument \"transform\" is required')\n    }\n\n    this.astTransformers.push(transform)\n  }\n\n  /**\n   * Registers a function to call to transform the html generated by the markdown compiler.\n   * @param transformer the function to call.\n   */\n  addHtmlTransformer(transformer: HtmlTransformer) {\n    if (transformer == null) {\n      throw new ReferenceError('argument \"transform\" is required')\n    }\n\n    this.htmlTransformers.push(transformer)\n  }\n\n  /**\n   * Registers a function to call to transform the markdown before it's parsed by the markdown compiler.\n   * @param transform the function to call.\n   */\n  addMarkdownTransformer(transform: MarkdownTransformer) {\n    if (transform == null) {\n      throw new ReferenceError('argument \"transform\" is required')\n    }\n\n    this.markdownTransformers.push(transform)\n  }\n\n  /**\n   * Registers a function to call to update marked library renderer.\n   * @param transform the function to call.\n   */\n  addRendererTransformer(transform: RendererTransformer) {\n    if (transform == null) {\n      throw new ReferenceError('argument \"transform\" is required')\n    }\n\n    this.rendererTransformers.push(transform)\n  }\n\n  /**\n   * Registers a function to call to update marked library tokenizer.\n   * @param transform the function to call.\n   */\n  addTokenizerTransformer(transform: TokenizerTransformer) {\n    if (transform == null) {\n      throw new ReferenceError('argument \"transform\" is required')\n    }\n\n    this.tokenizerTransformers.push(transform)\n  }\n\n  /**\n   * Apply the registered ast transformer functions to the given ast.\n   * @param ast the ast to transform.\n   * @returns the transformed ast.\n   */\n  transformAst(ast: TokensList): TokensList {\n    if (ast == null) {\n      throw new ReferenceError('argument \"ast\" is required')\n    }\n\n    for (const fn of this.astTransformers) {\n      ast = fn(ast)\n    }\n\n    return ast\n  }\n\n  /**\n   * Apply the registered html transformer functions to the given html.\n   * @param element the html element to transform.\n   * @returns the transformed html.\n   */\n  async transformHTML(element: HTMLElement) {\n    if (element == null) {\n      throw new ReferenceError('argument \"html\" is required')\n    }\n\n    // Awaited in order: transformers mutate the same DOM (tabbed sets regroup\n    // it, the highlighter then reads it), and server rendering must not\n    // snapshot the page before the async ones (shiki) are done.\n    for (const fn of this.htmlTransformers) {\n      await fn(element)\n    }\n\n    return element\n  }\n\n  /**\n   * Apply the registered markdown transformer functions to the given markdown.\n   * @param markdown the markdown to transform.\n   * @returns the transformed markdown.\n   */\n  transformMarkdown(markdown: string): string {\n    if (markdown == null) {\n      throw new ReferenceError('argument \"markdown\" is required')\n    }\n\n    for (const fn of this.markdownTransformers) {\n      markdown = fn(markdown)\n    }\n\n    return markdown\n  }\n\n  /**\n   * Apply the registered renderer transformer functions to the given renderer.\n   * @param renderer the renderer to transform.\n   * @returns the transformed renderer.\n   */\n  transformRenderer(renderer: Renderer): Renderer {\n    if (renderer == null) {\n      throw new ReferenceError('argument \"renderer\" is required')\n    }\n\n    for (const fn of this.rendererTransformers) {\n      renderer = fn(renderer)\n    }\n\n    return renderer\n  }\n\n  /**\n   * Apply the registered tokenizer transformer functions to the given tokenizer.\n   * @param tokenizer the tokenizer to transform.\n   * @returns the transformed tokenizer.\n   */\n  transformTokenizer(tokenizer: Tokenizer): Tokenizer {\n    if (tokenizer == null) {\n      throw new ReferenceError('argument \"tokenizer\" is required')\n    }\n\n    for (const fn of this.tokenizerTransformers) {\n      tokenizer = fn(tokenizer)\n    }\n\n    return tokenizer\n  }\n\n  /**\n   * Add new stylesheet element to the document.\n   * @param url url to the stylesheet.\n   * @returns A promise that resolves once the element is loaded.\n   */\n  addStyle(url: string) {\n    const link = document.createElement('link')\n    link.rel = 'stylesheet'\n    link.href = url\n    document.body.appendChild(link)\n    return new Promise<any>((resolve, reject) => {\n      link.onload = resolve\n      link.onerror = reject\n    })\n  }\n\n  /**\n   * Add new script element to the document.\n   * @param url url to the script.\n   * @returns A promise that resolves once the element is loaded.\n   */\n  addScript(url: string) {\n    const script = document.createElement('script')\n    script.type = 'text/javascript'\n    script.src = url\n    script.defer = true\n    document.body.appendChild(script)\n    return new Promise<any>((resolve, reject) => {\n      script.onload = resolve\n      script.onerror = reject\n    })\n  }\n}\n","import { InjectionToken, Provider, Type } from '@angular/core'\n\n/** Loads the component mounted for a keyword. */\nexport type NgeMarkdownComponentLoader = () => Type<unknown> | Promise<Type<unknown> | { default: Type<unknown> }>\n\n/** Map of a custom tag name to the component it mounts. */\nexport type NgeMarkdownComponents = Record<string, NgeMarkdownComponentLoader>\n\n/**\n * Registry of components embedded in Markdown by keyword.\n *\n * A registered keyword written as a tag (`<color-picker></color-picker>`) is replaced by its\n * component once the Markdown is rendered. Only registered keywords are mounted; every other tag\n * stays plain HTML, so the feature is opt-in and never collides with real markup.\n */\nexport const NGE_MARKDOWN_COMPONENTS = new InjectionToken<NgeMarkdownComponents>('NGE_MARKDOWN_COMPONENTS')\n\n/**\n * Register components that can be embedded in Markdown by keyword.\n *\n * ```ts\n * NgeMarkdownComponentsProvider({\n *   'color-picker': () => import('./color-picker.component').then((m) => m.ColorPickerComponent),\n * })\n * ```\n *\n * Then in Markdown, write the keyword as a tag: `<color-picker></color-picker>`. Tag attributes are\n * passed to the component as inputs, so `<color-picker theme=\"dark\"></color-picker>` sets `theme`.\n * Prefer hyphenated keywords so they are valid custom-element names.\n *\n * @deprecated Use `provideNgeMarkdown(withComponents(...))` instead; will be removed in the next major.\n */\nexport const NgeMarkdownComponentsProvider = (components: NgeMarkdownComponents): Provider => ({\n  provide: NGE_MARKDOWN_COMPONENTS,\n  useValue: components,\n})\n","import { InjectionToken, Provider } from '@angular/core'\nimport { MarkedOptions } from 'marked'\n\n/**\n * Global configuration of NgeMarkdownModule\n */\nexport declare type NgeMarkdownConfig = MarkedOptions & {\n  /**\n   * Class name (or names) indicating that the page is currently in dark mode.\n   * Pass an array to match any of several dark classes across a multi-page app.\n   */\n  darkThemeClassName?: string | string[]\n}\n\n/**\n * Theme configuration of NgeMarkdownModule\n */\nexport interface NgeMarkdownTheme {\n  /**\n   * Name of the theme (the @Input() theme property of NgeMarkdownComponent)\n   */\n  name: string\n\n  /**\n   * Style URL for the theme\n   */\n  styleUrl: string\n}\n\nexport const NGE_MARKDOWN_CONFIG = new InjectionToken<NgeMarkdownConfig>('NGE_MARKDOWN_CONFIG')\n\nexport const NGE_MARKDOWN_THEMES = new InjectionToken<NgeMarkdownTheme>('NGE_MARKDOWN_THEMES')\n\n/** @deprecated Use `provideNgeMarkdown(withConfig(...))` instead; will be removed in the next major. */\nexport const NgeMarkdownConfigProvider = (config: NgeMarkdownConfig | (() => NgeMarkdownConfig)): Provider =>\n  typeof config === 'function'\n    ? {\n        provide: NGE_MARKDOWN_CONFIG,\n\n        useFactory: config,\n      }\n    : {\n        provide: NGE_MARKDOWN_CONFIG,\n\n        useValue: config,\n      }\n\n//  darkThemeClassName: 'dark-theme',\n\n/** @deprecated Use `provideNgeMarkdown(withThemes(...))` instead; will be removed in the next major. */\nexport const NgeMarkdownThemeProvider = (...themes: NgeMarkdownTheme[]): Provider[] =>\n  themes.map((theme) => ({\n    provide: NGE_MARKDOWN_THEMES,\n    useValue: theme,\n    multi: true,\n  }))\n","import { Injectable, inject } from '@angular/core'\nimport { MarkedOptions, marked } from 'marked'\nimport { NgeMarkdownContribution } from './nge-markdown-contribution'\nimport { NgeMarkdownConfig, NGE_MARKDOWN_CONFIG } from './nge-markdown-config'\nimport { NgeMarkdownTransformer } from './nge-markdown-transformer'\nimport { ResourceLoaderService } from '@cisstech/nge/services'\nimport { lastValueFrom } from 'rxjs'\n\n/**\n * Markdown compiler service.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class NgeMarkdownService {\n  readonly config: NgeMarkdownConfig = inject<NgeMarkdownConfig>(NGE_MARKDOWN_CONFIG, { optional: true }) ?? {}\n  private readonly resourceLoader = inject(ResourceLoaderService)\n\n  /**\n   * Compiles a markdown string to an html string.\n   * @param options compilation options.\n   * @returns A promise that resolve with the AST of the compiled markdown\n   * (with the modifications of the contributions).\n   */\n  async compile(options: NgeMarkdownCompileOptions) {\n    let markdown = this.trimIndent(options.markdown)\n    if (options.isHtmlString) {\n      markdown = this.decodeHtml(markdown)\n    }\n\n    const transformer = await this.createTransformer(options)\n    const renderer = this.renderer(transformer)\n    const tokenizer = this.tokenizer(transformer)\n\n    const markedOptions: MarkedOptions = {\n      gfm: true,\n      ...this.config,\n      renderer,\n      tokenizer,\n    }\n\n    markdown = transformer.transformMarkdown(markdown)\n\n    const tokens = transformer.transformAst(marked.lexer(markdown, markedOptions))\n\n    options.target.innerHTML = marked.parser(tokens, markedOptions)\n\n    await transformer.transformHTML(options.target)\n\n    return tokens\n  }\n\n  private async createTransformer(options: NgeMarkdownCompileOptions) {\n    const contributions = [...(options.contributions || [])]\n    const transformer = new NgeMarkdownTransformer(this.config)\n    const dependencies: ['style' | 'script', string][] = []\n    for (const contrib of contributions) {\n      if (contrib.dependencies) {\n        dependencies.push(...contrib.dependencies())\n      }\n      contrib.contribute(transformer)\n    }\n\n    // Try to fix the issues described here by loading monaco editor\n    // after all the other scripts.\n    // https://stackoverflow.com/a/33635881\n    // https://github.com/microsoft/monaco-editor/issues/662\n    // https://github.com/microsoft/monaco-editor/issues/1249\n    // Monaco's AMD loader clobbers a global `define`; neutralize it while the\n    // dependency scripts load, then restore. Browser-only and a no-op on the\n    // server (no window), which also keeps this module importable at prerender.\n    const scope = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : undefined\n    const define = scope?.['define']\n    if (scope) {\n      scope['define'] = undefined\n    }\n    await lastValueFrom(this.resourceLoader.loadAllSync(dependencies))\n    if (scope) {\n      scope['define'] = define\n    }\n    return transformer\n  }\n\n  private renderer(transformer: NgeMarkdownTransformer) {\n    const renderer = transformer.transformRenderer(this.config?.renderer || new marked.Renderer())\n    return renderer\n  }\n\n  private tokenizer(transformer: NgeMarkdownTransformer) {\n    return transformer.transformTokenizer(this.config?.tokenizer || new marked.Tokenizer())\n  }\n\n  private decodeHtml(html: string): string {\n    const textarea = document.createElement('textarea')\n    textarea.innerHTML = html\n    return textarea.value\n  }\n\n  private trimIndent(markdown: string): string {\n    if (!markdown) {\n      return ''\n    }\n\n    let indentStart: number\n    return markdown\n      .split('\\n')\n      .map((line) => {\n        let lineIdentStart = indentStart\n        if (line.length > 0) {\n          lineIdentStart = isNaN(lineIdentStart) ? line.search(/\\S|$/) : Math.min(line.search(/\\S|$/), lineIdentStart)\n        }\n        if (isNaN(indentStart)) {\n          indentStart = lineIdentStart\n        }\n        return lineIdentStart ? line.substring(lineIdentStart) : line\n      })\n      .join('\\n')\n  }\n}\n\n/**\n * Parameters of NgeMarkdownService `compile` method.\n */\ninterface NgeMarkdownCompileOptions {\n  /** Markdown string to compile. */\n  markdown: string\n  /** HTMLElement on which to render the compiled markdown.  */\n  target: HTMLElement\n  /** Is the markdown contains html code? */\n  isHtmlString?: boolean\n  /** List of contribution to use during the compilation. */\n  contributions?: NgeMarkdownContribution[]\n}\n","import { HttpClient } from '@angular/common/http'\nimport {\n  AfterViewInit,\n  ApplicationRef,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ComponentRef,\n  DOCUMENT,\n  ElementRef,\n  EnvironmentInjector,\n  HostBinding,\n  OnDestroy,\n  OnInit,\n  PendingTasks,\n  Type,\n  createComponent,\n  effect,\n  inject,\n  output,\n  input,\n} from '@angular/core'\nimport { ResourceLoaderService } from '@cisstech/nge/services'\nimport type { TokensList } from 'marked'\nimport { firstValueFrom } from 'rxjs'\nimport { NGE_MARKDOWN_COMPONENTS } from './nge-markdown-components'\nimport { NGE_MARKDOWN_THEMES, NgeMarkdownTheme } from './nge-markdown-config'\nimport { NGE_MARKDOWN_CONTRIBUTION, NgeMarkdownContribution } from './nge-markdown-contribution'\nimport { NgeMarkdownService } from './nge-markdown.service'\n\n@Component({\n  selector: 'nge-markdown, [nge-markdown]',\n  templateUrl: 'nge-markdown.component.html',\n  styleUrls: ['nge-markdown.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgeMarkdownComponent implements OnInit, AfterViewInit, OnDestroy {\n  private readonly el: ElementRef<HTMLElement> = inject(ElementRef)\n  private readonly document = inject(DOCUMENT)\n  private readonly http = inject(HttpClient, { optional: true })\n  private readonly markdownService = inject(NgeMarkdownService)\n  private readonly pendingTasks = inject(PendingTasks)\n  private readonly resourceLoader = inject(ResourceLoaderService)\n  private readonly changeDetectorRef = inject(ChangeDetectorRef)\n  private readonly appRef = inject(ApplicationRef)\n  private readonly environmentInjector = inject(EnvironmentInjector)\n  private readonly components = inject(NGE_MARKDOWN_COMPONENTS, { optional: true })\n  private readonly themes = inject(NGE_MARKDOWN_THEMES, { optional: true }) as unknown as NgeMarkdownTheme[]\n  private readonly contributions = inject(NGE_MARKDOWN_CONTRIBUTION, {\n    optional: true,\n  }) as unknown as NgeMarkdownContribution[]\n\n  private isDark = false\n  private embedded: ComponentRef<unknown>[] = []\n\n  /** Link to a markdown file to render. */\n  readonly file = input<string>()\n\n  /** Markdown string to render. */\n  readonly data = input<string>()\n\n  /** Theme to apply to the markdown content. */\n  readonly theme = input<string | null | undefined>('github')\n\n  @HostBinding('class')\n  get klass() {\n    const theme = this.theme()\n    if (!theme) return ''\n    const classeNames = [`nge-markdown-theme--${theme}`]\n    if (this.isDark) {\n      classeNames.push(`nge-markdown-theme--${theme}--dark`)\n    }\n    return classeNames.join(' ')\n  }\n\n  /**\n   * An event that emit after each rendering pass\n   * with the list of tokens parsed from the input markdown.\n   */\n  readonly render = output<TokensList>()\n\n  /**\n   * An event that emits once the content has been mounted and revealed (the host\n   * opacity is set to `1`), i.e. after `render` and after embedded components are\n   * mounted. Use it to know the page has actually painted, for example to hide a\n   * loading placeholder without a flash.\n   */\n  readonly rendered = output<void>()\n\n  constructor() {\n    this.themes = this.themes || []\n\n    // Re-render whenever the file, data or theme input changes.\n    effect(() => {\n      const file = this.file()\n      const data = this.data()\n      this.theme()\n      if (file || data) {\n        this.renderContent(file, data)\n      }\n    })\n  }\n\n  ngOnInit(): void {\n    this.el.nativeElement.style.opacity = '0'\n  }\n\n  async ngAfterViewInit(): Promise<void> {\n    // Render the projected content when no file or data input is provided.\n    if (!this.file() && !this.data()) {\n      await this.renderContent()\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroyEmbeddedComponents()\n  }\n\n  private async renderContent(file?: string, data?: string): Promise<void> {\n    // Rendering is asynchronous (fetch, compile, transforms): block application\n    // stability so server rendering serializes the page only once it is done.\n    const removePendingTask = this.pendingTasks.add()\n    try {\n      // Tear down the previous embeds before the content that hosts them is replaced.\n      this.destroyEmbeddedComponents()\n      await this.checkTheme()\n      if (file) {\n        await this.renderFromFile(file)\n      } else if (data) {\n        await this.renderFromString(data)\n      } else {\n        await this.renderFromString(this.el.nativeElement.innerHTML, true)\n      }\n      await this.mountEmbeddedComponents()\n      this.el.nativeElement.style.opacity = '1'\n      this.rendered.emit()\n    } finally {\n      removePendingTask()\n    }\n  }\n\n  private async renderFromFile(file: string): Promise<void> {\n    if (!this.http) {\n      throw new Error(\n        '[nge-markdown] When using the `file` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information'\n      )\n    }\n    const markdown = await firstValueFrom(this.http.get(file, { responseType: 'text' }))\n    await this.renderFromString(markdown)\n  }\n\n  private async renderFromString(markdown: string, isHtmlString = false) {\n    const tokens = await this.markdownService.compile({\n      target: this.el.nativeElement,\n      markdown,\n      isHtmlString,\n      contributions: this.contributions,\n    })\n    this.render.emit(tokens)\n    this.changeDetectorRef.markForCheck()\n  }\n\n  private async checkTheme(): Promise<void> {\n    if (this.theme()) {\n      const themeInfo = this.themes?.find((theme) => theme.name === this.theme())\n      if (themeInfo) {\n        await firstValueFrom(this.resourceLoader.loadAllSync([['style', themeInfo.styleUrl]])).catch()\n      }\n    }\n\n    const { darkThemeClassName } = this.markdownService.config\n    if (darkThemeClassName) {\n      const classNames = Array.isArray(darkThemeClassName) ? darkThemeClassName : [darkThemeClassName]\n      this.isDark = classNames.some(\n        (name) => this.document.querySelector(name.startsWith('.') ? name : `.${name}`) != null\n      )\n    }\n  }\n\n  /** Mounts the registered component for every keyword tag present in the rendered output. */\n  private async mountEmbeddedComponents(): Promise<void> {\n    if (!this.components) {\n      return\n    }\n    const host = this.el.nativeElement\n    for (const [tag, loader] of Object.entries(this.components)) {\n      const elements = Array.from(host.querySelectorAll<HTMLElement>(tag))\n      if (!elements.length) {\n        continue\n      }\n      const loaded = await loader()\n      const type = (\n        loaded && typeof loaded === 'object' && 'default' in loaded ? loaded.default : loaded\n      ) as Type<unknown>\n      for (const element of elements) {\n        // Read the author's attributes before createComponent adds Angular's own\n        // (ng-version, host markers), which are not inputs.\n        const attributes = Array.from(element.attributes).map((attr) => ({ name: attr.name, value: attr.value }))\n        const ref = createComponent(type, { environmentInjector: this.environmentInjector, hostElement: element })\n        for (const attr of attributes) {\n          if (attr.name === 'class' || attr.name === 'style' || attr.name === 'id') {\n            continue\n          }\n          try {\n            ref.setInput(attr.name, attr.value)\n          } catch {\n            // The attribute is not a declared input; leave it as a plain attribute.\n          }\n        }\n        this.appRef.attachView(ref.hostView)\n        ref.changeDetectorRef.detectChanges()\n        this.embedded.push(ref)\n      }\n    }\n  }\n\n  /** Destroys the components mounted by the previous render so nothing leaks. */\n  private destroyEmbeddedComponents(): void {\n    this.embedded.forEach((ref) => ref.destroy())\n    this.embedded = []\n  }\n}\n","<ng-content></ng-content>\n","import { NgModule } from '@angular/core'\nimport { NgeMarkdownComponent } from './nge-markdown.component'\nimport { RouterModule } from '@angular/router'\n\n@NgModule({\n  imports: [RouterModule, NgeMarkdownComponent],\n  exports: [NgeMarkdownComponent],\n})\nexport class NgeMarkdownModule {}\n","import { EnvironmentProviders, Provider, Type, makeEnvironmentProviders } from '@angular/core'\nimport { NgeMarkdownAdmonitions } from './contributions/nge-markdown-admonitions'\nimport {\n  NGE_MARKDOWN_EMOJI_OPTIONS,\n  NgeMarkdownEmoji,\n  NgeMarkdownEmojiOptions,\n} from './contributions/nge-markdown-emoji'\nimport {\n  NGE_MARKDOWN_HIGHLIGHTER_SERVICE,\n  NgeMarkdownHighlighter,\n  monacoHighlighterService,\n} from './contributions/nge-markdown-highlighter'\nimport { NgeMarkdownIcons } from './contributions/nge-markdown-icons'\nimport {\n  NGE_MARKDOWN_KATEX_OPTIONS,\n  NgeMarkdownKatex,\n  NgeMarkdownKatexOptions,\n} from './contributions/nge-markdown-katex'\nimport { NgeMarkdownLinkAnchor } from './contributions/nge-markdown-link-anchor'\nimport { NgeMarkdownTabbedSet } from './contributions/nge-markdown-tabbed-set'\nimport { NGE_MARKDOWN_COMPONENTS, NgeMarkdownComponents } from './nge-markdown-components'\nimport { NGE_MARKDOWN_CONFIG, NGE_MARKDOWN_THEMES, NgeMarkdownConfig, NgeMarkdownTheme } from './nge-markdown-config'\nimport { NgeMarkdownContribution, NGE_MARKDOWN_CONTRIBUTION } from './nge-markdown-contribution'\n\n/** A configuration feature for {@link provideNgeMarkdown}. */\nexport interface NgeMarkdownFeature {\n  readonly providers: (Provider | EnvironmentProviders)[]\n}\n\n/**\n * Configure the markdown renderer at the application root, composing features:\n *\n * ```ts\n * providers: [\n *   provideNgeMarkdown(\n *     withThemes({ name: 'github', styleUrl: 'assets/nge/markdown/themes/github.css' }),\n *     withKatex(),\n *     withHighlighter(NgeMonacoColorizerService),\n *   ),\n * ]\n * ```\n */\nexport function provideNgeMarkdown(...features: NgeMarkdownFeature[]): EnvironmentProviders {\n  return makeEnvironmentProviders(features.flatMap((feature) => feature.providers))\n}\n\n/** Global markdown options (dark theme class name...). */\nexport function withConfig(config: NgeMarkdownConfig | (() => NgeMarkdownConfig)): NgeMarkdownFeature {\n  return {\n    providers: [\n      typeof config === 'function'\n        ? { provide: NGE_MARKDOWN_CONFIG, useFactory: config }\n        : { provide: NGE_MARKDOWN_CONFIG, useValue: config },\n    ],\n  }\n}\n\n/** Register stylesheet themes; the active one is picked by name. */\nexport function withThemes(...themes: NgeMarkdownTheme[]): NgeMarkdownFeature {\n  return { providers: themes.map((theme) => ({ provide: NGE_MARKDOWN_THEMES, useValue: theme, multi: true })) }\n}\n\n/** Angular components instantiable from markdown through their custom element tag. */\nexport function withComponents(components: NgeMarkdownComponents): NgeMarkdownFeature {\n  return { providers: [{ provide: NGE_MARKDOWN_COMPONENTS, useValue: components }] }\n}\n\n/** Render math expressions with [KaTeX](https://katex.org). */\nexport function withKatex(options?: NgeMarkdownKatexOptions): NgeMarkdownFeature {\n  return {\n    providers: [\n      contribution(NgeMarkdownKatex),\n      ...(options ? [{ provide: NGE_MARKDOWN_KATEX_OPTIONS, useValue: options }] : []),\n    ],\n  }\n}\n\n/** Render emoji short codes (`:smile:`) with [joypixels](https://www.joypixels.com). */\nexport function withEmoji(options?: NgeMarkdownEmojiOptions): NgeMarkdownFeature {\n  return {\n    providers: [\n      contribution(NgeMarkdownEmoji),\n      ...(options ? [{ provide: NGE_MARKDOWN_EMOJI_OPTIONS, useValue: options }] : []),\n    ],\n  }\n}\n\n/** Render icon short codes (`@mdi/react`-style) inside markdown. */\nexport function withIcons(): NgeMarkdownFeature {\n  return { providers: [contribution(NgeMarkdownIcons)] }\n}\n\n/** Group content under `=== \"Tab\"` markers into tabbed sets. */\nexport function withTabbedSet(): NgeMarkdownFeature {\n  return { providers: [contribution(NgeMarkdownTabbedSet)] }\n}\n\n/** Add anchor links to headings. */\nexport function withLinkAnchor(): NgeMarkdownFeature {\n  return { providers: [contribution(NgeMarkdownLinkAnchor)] }\n}\n\n/** Render `:::` admonition blocks (note, warning...). */\nexport function withAdmonitions(): NgeMarkdownFeature {\n  return { providers: [contribution(NgeMarkdownAdmonitions)] }\n}\n\n/**\n * Highlight fenced code blocks. Pass the `NgeMonacoColorizerService` type (from\n * `@cisstech/nge/monaco`) to colorize with Monaco; it is a parameter, not an\n * import, so markdown does not depend on monaco.\n */\nexport function withHighlighter(colorizer?: Type<unknown>): NgeMarkdownFeature {\n  return {\n    providers: [contribution(NgeMarkdownHighlighter), ...(colorizer ? [monacoHighlighter(colorizer)] : [])],\n  }\n}\n\nfunction contribution(type: Type<NgeMarkdownContribution>): Provider {\n  return { provide: NGE_MARKDOWN_CONTRIBUTION, multi: true, useClass: type }\n}\n\nfunction monacoHighlighter(colorizer: Type<unknown>): Provider {\n  return { provide: NGE_MARKDOWN_HIGHLIGHTER_SERVICE, useValue: monacoHighlighterService(colorizer) }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}