{"version":3,"file":"main.CoHL6N.js","sources":["theme-13/virtual:theme","theme-13/discourse/components/mermaid-diagram.gjs","theme-13/discourse/components/mermaid-fullscreen.gjs","theme-13/discourse/components/mermaid-inline.gjs","theme-13/discourse/api-initializers/discourse-mermaid-theme-component.js","theme-13/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(13);\n\nexport function themePrefix(key) {\n  return `theme_translations.13.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { cached, tracked } from \"@glimmer/tracking\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { htmlSafe } from \"@ember/template\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport loadingSpinner from \"discourse/helpers/loading-spinner\";\nimport loadScript from \"discourse/lib/load-script\";\n\n// Todo: move to ember-async-data if/when core adopts it\nclass TrackedPromise {\n  @tracked isResolved = false;\n  @tracked isRejected = false;\n  @tracked isPending = true;\n  @tracked value = null;\n  @tracked error = null;\n\n  constructor(promise) {\n    promise\n      .then((value) => {\n        this.isResolved = true;\n        this.isPending = false;\n        this.value = value;\n      })\n      .catch((error) => {\n        this.isRejected = true;\n        this.isPending = false;\n        this.error = error;\n      });\n  }\n}\n\nlet loaded = false;\n\nasync function loadMermaid() {\n  await loadScript(settings.theme_uploads_local.mermaid_js);\n\n  if (loaded) {\n    return;\n  }\n  loaded = true;\n  window.mermaid.initialize({\n    startOnLoad: false,\n    theme:\n      getComputedStyle(document.body)\n        .getPropertyValue(\"--scheme-type\")\n        .trim() === \"dark\"\n        ? \"dark\"\n        : \"default\",\n    suppressErrorRendering: true,\n  });\n}\n\nlet i = 0;\n\nexport async function generateDiagram(source) {\n  await loadMermaid();\n  i++;\n  return window.mermaid\n    .render(`mermaid-diagram-${i}`, source)\n    .then((result) => htmlSafe(result.svg));\n}\n\nexport default class MermaidDiagram extends Component {\n  @tracked zoomed = false;\n\n  @cached\n  get mermaidDiagram() {\n    const src = this.args.src;\n    return new TrackedPromise(generateDiagram(src));\n  }\n\n  @action\n  toggleZoom(event) {\n    event.preventDefault();\n    if (!this.args.enableZoom) {\n      return;\n    }\n    this.zoomed = !this.zoomed;\n  }\n\n  <template>\n    {{! template-lint-disable no-invalid-interactive }}\n    <div\n      class={{concatClass\n        \"mermaid-diagram\"\n        (if @enableZoom \"zoomable\")\n        (if this.zoomed \"zoomed\")\n      }}\n      {{on \"click\" this.toggleZoom}}\n    >\n      {{#if this.mermaidDiagram.isPending}}\n        {{loadingSpinner}}\n      {{else if this.mermaidDiagram.isResolved}}\n        {{this.mermaidDiagram.value}}\n      {{else if this.mermaidDiagram.isRejected}}\n        <div\n          class=\"alert alert-error\"\n        >{{this.mermaidDiagram.error.message}}</div>\n      {{/if}}\n    </div>\n  </template>\n}\n","import DModal from \"discourse/components/d-modal\";\nimport MermaidDiagram from \"./mermaid-diagram\";\n\nconst MermaidFullscreen = <template>\n  <DModal @closeModal={{@closeModal}} class=\"mermaid-fullscreen\">\n    <MermaidDiagram @src={{@model.src}} @enableZoom={{true}} />\n  </DModal>\n</template>;\n\nexport default MermaidFullscreen;\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport MermaidDiagram from \"./mermaid-diagram\";\nimport MermaidFullscreen from \"./mermaid-fullscreen\";\n\nexport default class MermaidInline extends Component {\n  @service modal;\n\n  @action\n  fullscreen() {\n    this.modal.show(MermaidFullscreen, {\n      model: {\n        src: this.args.data.src,\n      },\n    });\n  }\n\n  <template>\n    <div class=\"mermaid-diagram-controls\">\n      <DButton\n        @icon=\"discourse-expand\"\n        class=\"btn-flat mermaid-fullscreen-button\"\n        @action={{this.fullscreen}}\n      />\n    </div>\n\n    <MermaidDiagram @src={{@data.src}} />\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport { generateDiagram } from \"../components/mermaid-diagram\";\nimport MermaidInline from \"../components/mermaid-inline\";\n\nfunction applyMermaid(mermaidPre, helper) {\n  const mermaidSrc = mermaidPre.querySelector(\"code\")?.textContent;\n  if (!mermaidSrc) {\n    return;\n  }\n\n  const mermaidWrapper = document.createElement(\"div\");\n  mermaidWrapper.classList.add(\"mermaid-wrapper\");\n\n  if (helper?.renderGlimmer) {\n    helper.renderGlimmer(mermaidWrapper, MermaidInline, {\n      src: mermaidSrc,\n    });\n    mermaidPre.replaceWith(mermaidWrapper);\n  } else {\n    // Legacy support for parts of core which cannot renderGlimmer. No fullscreen support\n    mermaidPre.replaceChildren(mermaidWrapper);\n\n    const mermaidDiagram = document.createElement(\"div\");\n    mermaidDiagram.classList.add(\"mermaid-diagram\");\n    mermaidDiagram.innerHTML = \"<div class='spinner'></div>\";\n    mermaidWrapper.appendChild(mermaidDiagram);\n\n    generateDiagram(mermaidSrc)\n      .then((svg) => {\n        mermaidDiagram.innerHTML = svg;\n      })\n      .catch((error) => {\n        const errorDiv = document.createElement(\"div\");\n        errorDiv.classList.add(\"alert\", \"alert-error\");\n        errorDiv.textContent = error.message;\n        mermaidDiagram.replaceChildren(errorDiv);\n      });\n  }\n}\n\nexport default apiInitializer((api) => {\n  // this is a hack as applySurround expects a top level\n  // composer key, not possible from a theme\n  window.I18n.translations[window.I18n.locale].js.composer.mermaid_sample =\n    `    flowchart\n         A --> B`;\n\n  api.addComposerToolbarPopupMenuOption({\n    icon: \"diagram-project\",\n    label: themePrefix(\"insert_mermaid_sample\"),\n    action: (toolbarEvent) => {\n      toolbarEvent.applySurround(\n        \"\\n```mermaid\\n\",\n        \"\\n```\\n\",\n        \"mermaid_sample\",\n        { multiline: false }\n      );\n    },\n  });\n\n  if (api.decorateChatMessage) {\n    api.decorateChatMessage((element) => {\n      element\n        .querySelectorAll(\"pre[data-code-wrap=mermaid]\")\n        .forEach((mermaidPre, helper) => applyMermaid(mermaidPre, helper));\n    });\n  }\n\n  api.decorateCookedElement((element, helper) => {\n    element\n      .querySelectorAll(\"pre[data-code-wrap=mermaid]\")\n      .forEach((mermaidPre) => applyMermaid(mermaidPre, helper));\n  });\n});\n","import * as Mod1 from \"./discourse/api-initializers/discourse-mermaid-theme-component\";\nimport * as Mod2 from \"./discourse/components/mermaid-diagram\";\nimport * as Mod3 from \"./discourse/components/mermaid-fullscreen\";\nimport * as Mod4 from \"./discourse/components/mermaid-inline\";\nconst compatModules = {\n  \"discourse/api-initializers/discourse-mermaid-theme-component\": Mod1,\n  \"discourse/components/mermaid-diagram\": Mod2,\n  \"discourse/components/mermaid-fullscreen\": Mod3,\n  \"discourse/components/mermaid-inline\": Mod4,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","TrackedPromise","dt7948","g","this","prototype","tracked","isResolved","i","isRejected","isPending","value","error","constructor","promise","then","catch","loaded","async","generateDiagram","source","loadScript","theme_uploads_local","mermaid_js","window","mermaid","initialize","startOnLoad","theme","getComputedStyle","document","body","getPropertyValue","trim","suppressErrorRendering","loadMermaid","render","result","htmlSafe","svg","MermaidDiagram","Component","zoomed","mermaidDiagram","src","args","n","cached","toggleZoom","event","preventDefault","enableZoom","action","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","concatClass","on","loadingSpinner","isStrictMode","MermaidFullscreen","DModal","templateOnly","MermaidInline","service","modal","fullscreen","show","model","data","DButton","applyMermaid","mermaidPre","helper","mermaidSrc","querySelector","textContent","mermaidWrapper","createElement","classList","add","renderGlimmer","replaceWith","replaceChildren","innerHTML","appendChild","errorDiv","message","discourseMermaidThemeComponent","apiInitializer","api","key","I18n","translations","locale","js","composer","mermaid_sample","addComposerToolbarPopupMenuOption","icon","label","toolbarEvent","applySurround","multiline","decorateChatMessage","element","querySelectorAll","forEach","decorateCookedElement","compatModules","Mod2","Mod3","Mod4"],"mappings":"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"}