{"version":3,"file":"main.oIKFVE.js","sources":["theme-53/virtual:theme","theme-53/discourse/lib/vendor/dom-purify.js","theme-53/discourse/lib/svg.js","theme-53/discourse/helpers/icon-or-svg.gjs","theme-53/discourse/lib/utils.js","theme-53/discourse/lib/config.js","theme-53/discourse/components/callout-chooser-panel.gjs","theme-53/discourse/components/callout-chooser.gjs","theme-53/discourse/components/callout.gjs","theme-53/discourse/lib/rich-editor-utils.js","theme-53/discourse/lib/rich-editor-extension/commands.js","theme-53/discourse/lib/rich-editor-extension/input-rules.js","theme-53/discourse/lib/rich-editor-extension/markdown.js","theme-53/discourse/components/callout-node-view.gjs","theme-53/discourse/components/callout-title-node-view.gjs","theme-53/discourse/lib/glimmer-node-view.js","theme-53/discourse/lib/rich-editor-extension/node-views.js","theme-53/discourse/lib/rich-editor-extension/keyboard.js","theme-53/discourse/lib/rich-editor-extension/paste-handler.js","theme-53/discourse/lib/rich-editor-extension/plugins.js","theme-53/discourse/lib/rich-editor-extension/schema.js","theme-53/discourse/lib/rich-editor-extension/index.js","theme-53/discourse/api-initializers/callouts.gjs","theme-53/discourse/services/callout-move-state.js","theme-53/virtual:entrypoint:main","theme-53/discourse/services/callout-settings.js"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(53);\n\nexport function themePrefix(key) {\n  return `theme_translations.53.${key}`;\n}\n","/* eslint-disable */\n\n/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\n} = Object;\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== \"undefined\" && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(fun, thisValue, args) {\n    return fun.apply(thisValue, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func, args) {\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    for (\n      var _len = arguments.length,\n        args = new Array(_len > 1 ? _len - 1 : 0),\n        _key = 1;\n      _key < _len;\n      _key++\n    ) {\n      args[_key - 1] = arguments[_key];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(func) {\n  return function () {\n    for (\n      var _len2 = arguments.length, args = new Array(_len2), _key2 = 0;\n      _key2 < _len2;\n      _key2++\n    ) {\n      args[_key2] = arguments[_key2];\n    }\n    return construct(func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc =\n    arguments.length > 2 && arguments[2] !== undefined\n      ? arguments[2]\n      : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === \"string\") {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (Array.isArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (\n        value &&\n        typeof value === \"object\" &&\n        value.constructor === Object\n      ) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === \"function\") {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\n\nconst html$1 = freeze([\n  \"a\",\n  \"abbr\",\n  \"acronym\",\n  \"address\",\n  \"area\",\n  \"article\",\n  \"aside\",\n  \"audio\",\n  \"b\",\n  \"bdi\",\n  \"bdo\",\n  \"big\",\n  \"blink\",\n  \"blockquote\",\n  \"body\",\n  \"br\",\n  \"button\",\n  \"canvas\",\n  \"caption\",\n  \"center\",\n  \"cite\",\n  \"code\",\n  \"col\",\n  \"colgroup\",\n  \"content\",\n  \"data\",\n  \"datalist\",\n  \"dd\",\n  \"decorator\",\n  \"del\",\n  \"details\",\n  \"dfn\",\n  \"dialog\",\n  \"dir\",\n  \"div\",\n  \"dl\",\n  \"dt\",\n  \"element\",\n  \"em\",\n  \"fieldset\",\n  \"figcaption\",\n  \"figure\",\n  \"font\",\n  \"footer\",\n  \"form\",\n  \"h1\",\n  \"h2\",\n  \"h3\",\n  \"h4\",\n  \"h5\",\n  \"h6\",\n  \"head\",\n  \"header\",\n  \"hgroup\",\n  \"hr\",\n  \"html\",\n  \"i\",\n  \"img\",\n  \"input\",\n  \"ins\",\n  \"kbd\",\n  \"label\",\n  \"legend\",\n  \"li\",\n  \"main\",\n  \"map\",\n  \"mark\",\n  \"marquee\",\n  \"menu\",\n  \"menuitem\",\n  \"meter\",\n  \"nav\",\n  \"nobr\",\n  \"ol\",\n  \"optgroup\",\n  \"option\",\n  \"output\",\n  \"p\",\n  \"picture\",\n  \"pre\",\n  \"progress\",\n  \"q\",\n  \"rp\",\n  \"rt\",\n  \"ruby\",\n  \"s\",\n  \"samp\",\n  \"section\",\n  \"select\",\n  \"shadow\",\n  \"small\",\n  \"source\",\n  \"spacer\",\n  \"span\",\n  \"strike\",\n  \"strong\",\n  \"style\",\n  \"sub\",\n  \"summary\",\n  \"sup\",\n  \"table\",\n  \"tbody\",\n  \"td\",\n  \"template\",\n  \"textarea\",\n  \"tfoot\",\n  \"th\",\n  \"thead\",\n  \"time\",\n  \"tr\",\n  \"track\",\n  \"tt\",\n  \"u\",\n  \"ul\",\n  \"var\",\n  \"video\",\n  \"wbr\",\n]);\nconst svg$1 = freeze([\n  \"svg\",\n  \"a\",\n  \"altglyph\",\n  \"altglyphdef\",\n  \"altglyphitem\",\n  \"animatecolor\",\n  \"animatemotion\",\n  \"animatetransform\",\n  \"circle\",\n  \"clippath\",\n  \"defs\",\n  \"desc\",\n  \"ellipse\",\n  \"filter\",\n  \"font\",\n  \"g\",\n  \"glyph\",\n  \"glyphref\",\n  \"hkern\",\n  \"image\",\n  \"line\",\n  \"lineargradient\",\n  \"marker\",\n  \"mask\",\n  \"metadata\",\n  \"mpath\",\n  \"path\",\n  \"pattern\",\n  \"polygon\",\n  \"polyline\",\n  \"radialgradient\",\n  \"rect\",\n  \"stop\",\n  \"style\",\n  \"switch\",\n  \"symbol\",\n  \"text\",\n  \"textpath\",\n  \"title\",\n  \"tref\",\n  \"tspan\",\n  \"view\",\n  \"vkern\",\n]);\nconst svgFilters = freeze([\n  \"feBlend\",\n  \"feColorMatrix\",\n  \"feComponentTransfer\",\n  \"feComposite\",\n  \"feConvolveMatrix\",\n  \"feDiffuseLighting\",\n  \"feDisplacementMap\",\n  \"feDistantLight\",\n  \"feDropShadow\",\n  \"feFlood\",\n  \"feFuncA\",\n  \"feFuncB\",\n  \"feFuncG\",\n  \"feFuncR\",\n  \"feGaussianBlur\",\n  \"feImage\",\n  \"feMerge\",\n  \"feMergeNode\",\n  \"feMorphology\",\n  \"feOffset\",\n  \"fePointLight\",\n  \"feSpecularLighting\",\n  \"feSpotLight\",\n  \"feTile\",\n  \"feTurbulence\",\n]);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze([\n  \"animate\",\n  \"color-profile\",\n  \"cursor\",\n  \"discard\",\n  \"font-face\",\n  \"font-face-format\",\n  \"font-face-name\",\n  \"font-face-src\",\n  \"font-face-uri\",\n  \"foreignobject\",\n  \"hatch\",\n  \"hatchpath\",\n  \"mesh\",\n  \"meshgradient\",\n  \"meshpatch\",\n  \"meshrow\",\n  \"missing-glyph\",\n  \"script\",\n  \"set\",\n  \"solidcolor\",\n  \"unknown\",\n  \"use\",\n]);\nconst mathMl$1 = freeze([\n  \"math\",\n  \"menclose\",\n  \"merror\",\n  \"mfenced\",\n  \"mfrac\",\n  \"mglyph\",\n  \"mi\",\n  \"mlabeledtr\",\n  \"mmultiscripts\",\n  \"mn\",\n  \"mo\",\n  \"mover\",\n  \"mpadded\",\n  \"mphantom\",\n  \"mroot\",\n  \"mrow\",\n  \"ms\",\n  \"mspace\",\n  \"msqrt\",\n  \"mstyle\",\n  \"msub\",\n  \"msup\",\n  \"msubsup\",\n  \"mtable\",\n  \"mtd\",\n  \"mtext\",\n  \"mtr\",\n  \"munder\",\n  \"munderover\",\n  \"mprescripts\",\n]);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze([\n  \"maction\",\n  \"maligngroup\",\n  \"malignmark\",\n  \"mlongdiv\",\n  \"mscarries\",\n  \"mscarry\",\n  \"msgroup\",\n  \"mstack\",\n  \"msline\",\n  \"msrow\",\n  \"semantics\",\n  \"annotation\",\n  \"annotation-xml\",\n  \"mprescripts\",\n  \"none\",\n]);\nconst text = freeze([\"#text\"]);\n\nconst html = freeze([\n  \"accept\",\n  \"action\",\n  \"align\",\n  \"alt\",\n  \"autocapitalize\",\n  \"autocomplete\",\n  \"autopictureinpicture\",\n  \"autoplay\",\n  \"background\",\n  \"bgcolor\",\n  \"border\",\n  \"capture\",\n  \"cellpadding\",\n  \"cellspacing\",\n  \"checked\",\n  \"cite\",\n  \"class\",\n  \"clear\",\n  \"color\",\n  \"cols\",\n  \"colspan\",\n  \"controls\",\n  \"controlslist\",\n  \"coords\",\n  \"crossorigin\",\n  \"datetime\",\n  \"decoding\",\n  \"default\",\n  \"dir\",\n  \"disabled\",\n  \"disablepictureinpicture\",\n  \"disableremoteplayback\",\n  \"download\",\n  \"draggable\",\n  \"enctype\",\n  \"enterkeyhint\",\n  \"face\",\n  \"for\",\n  \"headers\",\n  \"height\",\n  \"hidden\",\n  \"high\",\n  \"href\",\n  \"hreflang\",\n  \"id\",\n  \"inputmode\",\n  \"integrity\",\n  \"ismap\",\n  \"kind\",\n  \"label\",\n  \"lang\",\n  \"list\",\n  \"loading\",\n  \"loop\",\n  \"low\",\n  \"max\",\n  \"maxlength\",\n  \"media\",\n  \"method\",\n  \"min\",\n  \"minlength\",\n  \"multiple\",\n  \"muted\",\n  \"name\",\n  \"nonce\",\n  \"noshade\",\n  \"novalidate\",\n  \"nowrap\",\n  \"open\",\n  \"optimum\",\n  \"pattern\",\n  \"placeholder\",\n  \"playsinline\",\n  \"popover\",\n  \"popovertarget\",\n  \"popovertargetaction\",\n  \"poster\",\n  \"preload\",\n  \"pubdate\",\n  \"radiogroup\",\n  \"readonly\",\n  \"rel\",\n  \"required\",\n  \"rev\",\n  \"reversed\",\n  \"role\",\n  \"rows\",\n  \"rowspan\",\n  \"spellcheck\",\n  \"scope\",\n  \"selected\",\n  \"shape\",\n  \"size\",\n  \"sizes\",\n  \"span\",\n  \"srclang\",\n  \"start\",\n  \"src\",\n  \"srcset\",\n  \"step\",\n  \"style\",\n  \"summary\",\n  \"tabindex\",\n  \"title\",\n  \"translate\",\n  \"type\",\n  \"usemap\",\n  \"valign\",\n  \"value\",\n  \"width\",\n  \"wrap\",\n  \"xmlns\",\n  \"slot\",\n]);\nconst svg = freeze([\n  \"accent-height\",\n  \"accumulate\",\n  \"additive\",\n  \"alignment-baseline\",\n  \"amplitude\",\n  \"ascent\",\n  \"attributename\",\n  \"attributetype\",\n  \"azimuth\",\n  \"basefrequency\",\n  \"baseline-shift\",\n  \"begin\",\n  \"bias\",\n  \"by\",\n  \"class\",\n  \"clip\",\n  \"clippathunits\",\n  \"clip-path\",\n  \"clip-rule\",\n  \"color\",\n  \"color-interpolation\",\n  \"color-interpolation-filters\",\n  \"color-profile\",\n  \"color-rendering\",\n  \"cx\",\n  \"cy\",\n  \"d\",\n  \"dx\",\n  \"dy\",\n  \"diffuseconstant\",\n  \"direction\",\n  \"display\",\n  \"divisor\",\n  \"dur\",\n  \"edgemode\",\n  \"elevation\",\n  \"end\",\n  \"exponent\",\n  \"fill\",\n  \"fill-opacity\",\n  \"fill-rule\",\n  \"filter\",\n  \"filterunits\",\n  \"flood-color\",\n  \"flood-opacity\",\n  \"font-family\",\n  \"font-size\",\n  \"font-size-adjust\",\n  \"font-stretch\",\n  \"font-style\",\n  \"font-variant\",\n  \"font-weight\",\n  \"fx\",\n  \"fy\",\n  \"g1\",\n  \"g2\",\n  \"glyph-name\",\n  \"glyphref\",\n  \"gradientunits\",\n  \"gradienttransform\",\n  \"height\",\n  \"href\",\n  \"id\",\n  \"image-rendering\",\n  \"in\",\n  \"in2\",\n  \"intercept\",\n  \"k\",\n  \"k1\",\n  \"k2\",\n  \"k3\",\n  \"k4\",\n  \"kerning\",\n  \"keypoints\",\n  \"keysplines\",\n  \"keytimes\",\n  \"lang\",\n  \"lengthadjust\",\n  \"letter-spacing\",\n  \"kernelmatrix\",\n  \"kernelunitlength\",\n  \"lighting-color\",\n  \"local\",\n  \"marker-end\",\n  \"marker-mid\",\n  \"marker-start\",\n  \"markerheight\",\n  \"markerunits\",\n  \"markerwidth\",\n  \"maskcontentunits\",\n  \"maskunits\",\n  \"max\",\n  \"mask\",\n  \"media\",\n  \"method\",\n  \"mode\",\n  \"min\",\n  \"name\",\n  \"numoctaves\",\n  \"offset\",\n  \"operator\",\n  \"opacity\",\n  \"order\",\n  \"orient\",\n  \"orientation\",\n  \"origin\",\n  \"overflow\",\n  \"paint-order\",\n  \"path\",\n  \"pathlength\",\n  \"patterncontentunits\",\n  \"patterntransform\",\n  \"patternunits\",\n  \"points\",\n  \"preservealpha\",\n  \"preserveaspectratio\",\n  \"primitiveunits\",\n  \"r\",\n  \"rx\",\n  \"ry\",\n  \"radius\",\n  \"refx\",\n  \"refy\",\n  \"repeatcount\",\n  \"repeatdur\",\n  \"restart\",\n  \"result\",\n  \"rotate\",\n  \"scale\",\n  \"seed\",\n  \"shape-rendering\",\n  \"slope\",\n  \"specularconstant\",\n  \"specularexponent\",\n  \"spreadmethod\",\n  \"startoffset\",\n  \"stddeviation\",\n  \"stitchtiles\",\n  \"stop-color\",\n  \"stop-opacity\",\n  \"stroke-dasharray\",\n  \"stroke-dashoffset\",\n  \"stroke-linecap\",\n  \"stroke-linejoin\",\n  \"stroke-miterlimit\",\n  \"stroke-opacity\",\n  \"stroke\",\n  \"stroke-width\",\n  \"style\",\n  \"surfacescale\",\n  \"systemlanguage\",\n  \"tabindex\",\n  \"tablevalues\",\n  \"targetx\",\n  \"targety\",\n  \"transform\",\n  \"transform-origin\",\n  \"text-anchor\",\n  \"text-decoration\",\n  \"text-rendering\",\n  \"textlength\",\n  \"type\",\n  \"u1\",\n  \"u2\",\n  \"unicode\",\n  \"values\",\n  \"viewbox\",\n  \"visibility\",\n  \"version\",\n  \"vert-adv-y\",\n  \"vert-origin-x\",\n  \"vert-origin-y\",\n  \"width\",\n  \"word-spacing\",\n  \"wrap\",\n  \"writing-mode\",\n  \"xchannelselector\",\n  \"ychannelselector\",\n  \"x\",\n  \"x1\",\n  \"x2\",\n  \"xmlns\",\n  \"y\",\n  \"y1\",\n  \"y2\",\n  \"z\",\n  \"zoomandpan\",\n]);\nconst mathMl = freeze([\n  \"accent\",\n  \"accentunder\",\n  \"align\",\n  \"bevelled\",\n  \"close\",\n  \"columnsalign\",\n  \"columnlines\",\n  \"columnspan\",\n  \"denomalign\",\n  \"depth\",\n  \"dir\",\n  \"display\",\n  \"displaystyle\",\n  \"encoding\",\n  \"fence\",\n  \"frame\",\n  \"height\",\n  \"href\",\n  \"id\",\n  \"largeop\",\n  \"length\",\n  \"linethickness\",\n  \"lspace\",\n  \"lquote\",\n  \"mathbackground\",\n  \"mathcolor\",\n  \"mathsize\",\n  \"mathvariant\",\n  \"maxsize\",\n  \"minsize\",\n  \"movablelimits\",\n  \"notation\",\n  \"numalign\",\n  \"open\",\n  \"rowalign\",\n  \"rowlines\",\n  \"rowspacing\",\n  \"rowspan\",\n  \"rspace\",\n  \"rquote\",\n  \"scriptlevel\",\n  \"scriptminsize\",\n  \"scriptsizemultiplier\",\n  \"selection\",\n  \"separator\",\n  \"separators\",\n  \"stretchy\",\n  \"subscriptshift\",\n  \"supscriptshift\",\n  \"symmetric\",\n  \"voffset\",\n  \"width\",\n  \"xmlns\",\n]);\nconst xml = freeze([\n  \"xlink:href\",\n  \"xml:id\",\n  \"xlink:title\",\n  \"xml:space\",\n  \"xmlns:xlink\",\n]);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/);\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\nconst IS_ALLOWED_URI = seal(\n  /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(\n  /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nlet EXPRESSIONS = /*#__PURE__*/ Object.freeze({\n  __proto__: null,\n  ARIA_ATTR,\n  ATTR_WHITESPACE,\n  CUSTOM_ELEMENT,\n  DATA_ATTR,\n  DOCTYPE_NAME,\n  ERB_EXPR,\n  IS_ALLOWED_URI,\n  IS_SCRIPT_OR_DATA,\n  MUSTACHE_EXPR,\n  TMPLIT_EXPR,\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12, // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === \"undefined\" ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(\n  trustedTypes,\n  purifyHostElement\n) {\n  if (\n    typeof trustedTypes !== \"object\" ||\n    typeof trustedTypes.createPolicy !== \"function\"\n  ) {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = \"data-tt-policy-suffix\";\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = \"dompurify\" + (suffix ? \"#\" + suffix : \"\");\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      },\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn(\n      \"TrustedTypes policy \" + policyName + \" could not be created.\"\n    );\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: [],\n  };\n};\nfunction createDOMPurify() {\n  let window =\n    arguments.length > 0 && arguments[0] !== undefined\n      ? arguments[0]\n      : getGlobal();\n  const DOMPurify = (root) => createDOMPurify(root);\n  DOMPurify.version = \"3.2.4\";\n  DOMPurify.removed = [];\n  if (\n    !window ||\n    !window.document ||\n    window.document.nodeType !== NODE_TYPE.document ||\n    !window.Element\n  ) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let { document } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes,\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, \"cloneNode\");\n  const remove = lookupGetter(ElementPrototype, \"remove\");\n  const getNextSibling = lookupGetter(ElementPrototype, \"nextSibling\");\n  const getChildNodes = lookupGetter(ElementPrototype, \"childNodes\");\n  const getParentNode = lookupGetter(ElementPrototype, \"parentNode\");\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === \"function\") {\n    const template = document.createElement(\"template\");\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = \"\";\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName,\n  } = document;\n  const { importNode } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === \"function\" &&\n    typeof getParentNode === \"function\" &&\n    implementation &&\n    implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT,\n  } = EXPRESSIONS;\n  let { IS_ALLOWED_URI: IS_ALLOWED_URI$1 } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n    ...html$1,\n    ...svg$1,\n    ...svgFilters,\n    ...mathMl$1,\n    ...text,\n  ]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n    ...html,\n    ...svg,\n    ...mathMl,\n    ...xml,\n  ]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(\n    create(null, {\n      tagNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n      attributeNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n      allowCustomizedBuiltInElements: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: false,\n      },\n    })\n  );\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = \"user-content-\";\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n    \"annotation-xml\",\n    \"audio\",\n    \"colgroup\",\n    \"desc\",\n    \"foreignobject\",\n    \"head\",\n    \"iframe\",\n    \"math\",\n    \"mi\",\n    \"mn\",\n    \"mo\",\n    \"ms\",\n    \"mtext\",\n    \"noembed\",\n    \"noframes\",\n    \"noscript\",\n    \"plaintext\",\n    \"script\",\n    \"style\",\n    \"svg\",\n    \"template\",\n    \"thead\",\n    \"title\",\n    \"video\",\n    \"xmp\",\n  ]);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n    \"audio\",\n    \"video\",\n    \"img\",\n    \"source\",\n    \"image\",\n    \"track\",\n  ]);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n    \"alt\",\n    \"class\",\n    \"for\",\n    \"id\",\n    \"label\",\n    \"name\",\n    \"pattern\",\n    \"placeholder\",\n    \"role\",\n    \"summary\",\n    \"title\",\n    \"value\",\n    \"style\",\n    \"xmlns\",\n  ]);\n  const MATHML_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\n  const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n  const HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n    {},\n    [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n    stringToString\n  );\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n    \"mi\",\n    \"mo\",\n    \"mn\",\n    \"ms\",\n    \"mtext\",\n  ]);\n  let HTML_INTEGRATION_POINTS = addToSet({}, [\"annotation-xml\"]);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n    \"title\",\n    \"style\",\n    \"font\",\n    \"a\",\n    \"script\",\n  ]);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = [\"application/xhtml+xml\", \"text/html\"];\n  const DEFAULT_PARSER_MEDIA_TYPE = \"text/html\";\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement(\"form\");\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n\n  const _parseConfig = function _parseConfig() {\n    let cfg =\n      arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== \"object\") {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n      // eslint-disable-next-line unicorn/prefer-includes\n      SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n        ? DEFAULT_PARSER_MEDIA_TYPE\n        : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc =\n      PARSER_MEDIA_TYPE === \"application/xhtml+xml\"\n        ? stringToString\n        : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, \"ALLOWED_TAGS\")\n      ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc)\n      : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, \"ALLOWED_ATTR\")\n      ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc)\n      : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, \"ALLOWED_NAMESPACES\")\n      ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString)\n      : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, \"ADD_URI_SAFE_ATTR\")\n      ? addToSet(\n          clone(DEFAULT_URI_SAFE_ATTRIBUTES),\n          cfg.ADD_URI_SAFE_ATTR,\n          transformCaseFunc\n        )\n      : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, \"ADD_DATA_URI_TAGS\")\n      ? addToSet(\n          clone(DEFAULT_DATA_URI_TAGS),\n          cfg.ADD_DATA_URI_TAGS,\n          transformCaseFunc\n        )\n      : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, \"FORBID_CONTENTS\")\n      ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc)\n      : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, \"FORBID_TAGS\")\n      ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc)\n      : {};\n    FORBID_ATTR = objectHasOwnProperty(cfg, \"FORBID_ATTR\")\n      ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc)\n      : {};\n    USE_PROFILES = objectHasOwnProperty(cfg, \"USE_PROFILES\")\n      ? cfg.USE_PROFILES\n      : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    MATHML_TEXT_INTEGRATION_POINTS =\n      cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n    HTML_INTEGRATION_POINTS =\n      cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n    if (\n      cfg.CUSTOM_ELEMENT_HANDLING &&\n      isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\n    ) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck =\n        cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n    }\n    if (\n      cfg.CUSTOM_ELEMENT_HANDLING &&\n      isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\n    ) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n        cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n    }\n    if (\n      cfg.CUSTOM_ELEMENT_HANDLING &&\n      typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements ===\n        \"boolean\"\n    ) {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n        cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = [];\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Merge configuration parameters */\n    if (cfg.ADD_TAGS) {\n      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n        ALLOWED_TAGS = clone(ALLOWED_TAGS);\n      }\n      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n    }\n    if (cfg.ADD_ATTR) {\n      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n        ALLOWED_ATTR = clone(ALLOWED_ATTR);\n      }\n      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n    }\n    if (cfg.ADD_URI_SAFE_ATTR) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (cfg.FORBID_CONTENTS) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS[\"#text\"] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, [\"html\", \"head\", \"body\"]);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, [\"tbody\"]);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== \"function\") {\n        throw typeErrorCreate(\n          'TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.'\n        );\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== \"function\") {\n        throw typeErrorCreate(\n          'TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.'\n        );\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML(\"\");\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(\n          trustedTypes,\n          currentScript\n        );\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === \"string\") {\n        emptyHTML = trustedTypesPolicy.createHTML(\"\");\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [\n    ...svg$1,\n    ...svgFilters,\n    ...svgDisallowed,\n  ]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: \"template\",\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === \"svg\";\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return (\n          tagName === \"svg\" &&\n          (parentTagName === \"annotation-xml\" ||\n            MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n        );\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === \"math\";\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === \"math\" && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (\n        parent.namespaceURI === SVG_NAMESPACE &&\n        !HTML_INTEGRATION_POINTS[parentTagName]\n      ) {\n        return false;\n      }\n      if (\n        parent.namespaceURI === MATHML_NAMESPACE &&\n        !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n      ) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return (\n        !ALL_MATHML_TAGS[tagName] &&\n        (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n      );\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (\n      PARSER_MEDIA_TYPE === \"application/xhtml+xml\" &&\n      ALLOWED_NAMESPACES[element.namespaceURI]\n    ) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node,\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element,\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element,\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === \"is\") {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, \"\");\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = \"<remove></remove>\" + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (\n      PARSER_MEDIA_TYPE === \"application/xhtml+xml\" &&\n      NAMESPACE === HTML_NAMESPACE\n    ) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty =\n        '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' +\n        dirty +\n        \"</body></html>\";\n    }\n    const dirtyPayload = trustedTypesPolicy\n      ? trustedTypesPolicy.createHTML(dirty)\n      : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, \"template\", null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT\n          ? emptyHTML\n          : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(\n        document.createTextNode(leadingWhitespace),\n        body.childNodes[0] || null\n      );\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(\n        doc,\n        WHOLE_DOCUMENT ? \"html\" : \"body\"\n      )[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(\n      root.ownerDocument || root,\n      root,\n\n      NodeFilter.SHOW_ELEMENT |\n        NodeFilter.SHOW_COMMENT |\n        NodeFilter.SHOW_TEXT |\n        NodeFilter.SHOW_PROCESSING_INSTRUCTION |\n        NodeFilter.SHOW_CDATA_SECTION,\n      null\n    );\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return (\n      element instanceof HTMLFormElement &&\n      (typeof element.nodeName !== \"string\" ||\n        typeof element.textContent !== \"string\" ||\n        typeof element.removeChild !== \"function\" ||\n        !(element.attributes instanceof NamedNodeMap) ||\n        typeof element.removeAttribute !== \"function\" ||\n        typeof element.setAttribute !== \"function\" ||\n        typeof element.namespaceURI !== \"string\" ||\n        typeof element.insertBefore !== \"function\" ||\n        typeof element.hasChildNodes !== \"function\")\n    );\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === \"function\" && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, (hook) => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS,\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (\n      currentNode.hasChildNodes() &&\n      !_isNode(currentNode.firstElementChild) &&\n      regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n      regExpTest(/<[/\\w]/g, currentNode.textContent)\n    ) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (\n      SAFE_FOR_XML &&\n      currentNode.nodeType === NODE_TYPE.comment &&\n      regExpTest(/<[/\\w]/g, currentNode.data)\n    ) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (\n          CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n          regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)\n        ) {\n          return false;\n        }\n        if (\n          CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n          CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)\n        ) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if (\n      (tagName === \"noscript\" ||\n        tagName === \"noembed\" ||\n        tagName === \"noframes\") &&\n      regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)\n    ) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], (expr) => {\n        content = stringReplace(content, expr, \" \");\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode(),\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* Make sure attribute cannot clobber */\n    if (\n      SANITIZE_DOM &&\n      (lcName === \"id\" || lcName === \"name\") &&\n      (value in document || value in formElement)\n    ) {\n      return false;\n    }\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (\n      ALLOW_DATA_ATTR &&\n      !FORBID_ATTR[lcName] &&\n      regExpTest(DATA_ATTR, lcName)\n    ) {\n    } else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) {\n    } else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n      if (\n        // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n        // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n        // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n        (_isBasicCustomElement(lcTag) &&\n          ((CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n            regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag)) ||\n            (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n              CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag))) &&\n          ((CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp &&\n            regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName)) ||\n            (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function &&\n              CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)))) ||\n        // Alternative, second condition checks if it's an `is`-attribute, AND\n        // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n        (lcName === \"is\" &&\n          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements &&\n          ((CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n            regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value)) ||\n            (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n              CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))))\n      ) {\n      } else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) {\n    } else if (\n      regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, \"\"))\n    ) {\n    } else if (\n      (lcName === \"src\" || lcName === \"xlink:href\" || lcName === \"href\") &&\n      lcTag !== \"script\" &&\n      stringIndexOf(value, \"data:\") === 0 &&\n      DATA_URI_TAGS[lcTag]\n    ) {\n    } else if (\n      ALLOW_UNKNOWN_PROTOCOLS &&\n      !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, \"\"))\n    ) {\n    } else if (value) {\n      return false;\n    } else {\n    }\n    return true;\n  };\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return tagName !== \"annotation-xml\" && stringMatch(tagName, CUSTOM_ELEMENT);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const { attributes } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: \"\",\n      attrValue: \"\",\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined,\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const { name, namespaceURI, value: attrValue } = attr;\n      const lcName = transformCaseFunc(name);\n      let value = name === \"value\" ? attrValue : stringTrim(attrValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === \"id\" || lcName === \"name\")) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Remove attribute */\n      _removeAttribute(name, currentNode);\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], (expr) => {\n          value = stringReplace(value, expr, \" \");\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (\n        trustedTypesPolicy &&\n        typeof trustedTypes === \"object\" &&\n        typeof trustedTypes.getAttributeType === \"function\"\n      ) {\n        if (namespaceURI) {\n        } else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case \"TrustedHTML\": {\n              value = trustedTypesPolicy.createHTML(value);\n              break;\n            }\n            case \"TrustedScriptURL\": {\n              value = trustedTypesPolicy.createScriptURL(value);\n              break;\n            }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      try {\n        if (namespaceURI) {\n          currentNode.setAttributeNS(namespaceURI, name, value);\n        } else {\n          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n          currentNode.setAttribute(name, value);\n        }\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n        } else {\n          arrayPop(DOMPurify.removed);\n        }\n      } catch (_) {}\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while ((shadowNode = shadowIterator.nextNode())) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n\n  DOMPurify.sanitize = function (dirty) {\n    let cfg =\n      arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = \"<!-->\";\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== \"string\" && !_isNode(dirty)) {\n      if (typeof dirty.toString === \"function\") {\n        dirty = dirty.toString();\n        if (typeof dirty !== \"string\") {\n          throw typeErrorCreate(\"dirty is not a string, aborting\");\n        }\n      } else {\n        throw typeErrorCreate(\"toString is not a function\");\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === \"string\") {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      if (dirty.nodeName) {\n        const tagName = transformCaseFunc(dirty.nodeName);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate(\n            \"root node is forbidden and cannot be sanitized in-place\"\n          );\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument(\"<!---->\");\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (\n        importedNode.nodeType === NODE_TYPE.element &&\n        importedNode.nodeName === \"BODY\"\n      ) {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === \"HTML\") {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (\n        !RETURN_DOM &&\n        !SAFE_FOR_TEMPLATES &&\n        !WHOLE_DOCUMENT &&\n        // eslint-disable-next-line unicorn/prefer-includes\n        dirty.indexOf(\"<\") === -1\n      ) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n          ? trustedTypesPolicy.createHTML(dirty)\n          : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : \"\";\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while ((currentNode = nodeIterator.nextNode())) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (\n      WHOLE_DOCUMENT &&\n      ALLOWED_TAGS[\"!doctype\"] &&\n      body.ownerDocument &&\n      body.ownerDocument.doctype &&\n      body.ownerDocument.doctype.name &&\n      regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)\n    ) {\n      serializedHTML =\n        \"<!DOCTYPE \" + body.ownerDocument.doctype.name + \">\\n\" + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], (expr) => {\n        serializedHTML = stringReplace(serializedHTML, expr, \" \");\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n      ? trustedTypesPolicy.createHTML(serializedHTML)\n      : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg =\n      arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== \"function\") {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1\n        ? undefined\n        : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nlet purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","import DOMPurify from \"./vendor/dom-purify\";\n\nconst SVG_SANITIZER_CONFIG = {\n  // Return a DOM fragment for proper node creation\n  RETURN_DOM_FRAGMENT: true,\n\n  // Only allow SVG-specific tags\n  ALLOWED_TAGS: [\n    \"svg\",\n    \"path\",\n    \"circle\",\n    \"rect\",\n    \"line\",\n    \"polyline\",\n    \"polygon\",\n    \"ellipse\",\n    \"g\",\n    \"defs\",\n    \"title\",\n    \"linearGradient\",\n    \"radialGradient\",\n    \"stop\",\n    \"mask\",\n    \"pattern\",\n    \"clipPath\",\n  ],\n\n  ALLOWED_ATTR: [\n    // Core SVG attributes\n    \"viewBox\",\n    \"d\",\n    \"points\",\n    \"preserveAspectRatio\",\n\n    // Presentation attributes\n    \"fill\",\n    \"stroke\",\n    \"stroke-width\",\n    \"stroke-linecap\",\n    \"stroke-linejoin\",\n    \"stroke-dasharray\",\n    \"stroke-dashoffset\",\n    \"stroke-opacity\",\n    \"fill-opacity\",\n    \"opacity\",\n\n    // Transform attributes\n    \"transform\",\n    \"transform-origin\",\n\n    // Basic shape attributes\n    \"cx\",\n    \"cy\",\n    \"r\",\n    \"rx\",\n    \"ry\",\n    \"x\",\n    \"y\",\n    \"x1\",\n    \"y1\",\n    \"x2\",\n    \"y2\",\n    \"width\",\n    \"height\",\n\n    // Gradient attributes\n    \"gradientUnits\",\n    \"gradientTransform\",\n    \"offset\",\n    \"stop-color\",\n    \"stop-opacity\",\n\n    // Other common attributes\n    \"id\",\n    \"class\",\n    \"style\",\n\n    // Pattern/mask attributes\n    \"patternUnits\",\n    \"maskUnits\",\n    \"maskContentUnits\",\n  ],\n\n  USE_PROFILES: { svg: true },\n  ALLOW_DATA_ATTR: false,\n  ALLOW_UNKNOWN_PROTOCOLS: false,\n  ALLOW_NAMESPACES: false,\n};\n\nexport function createSafeSVG(svgString, size = 16) {\n  const fragment = DOMPurify.sanitize(svgString, SVG_SANITIZER_CONFIG);\n  const node = document.importNode(fragment, true);\n  const svgElement = node.firstChild;\n\n  if (svgElement && svgElement instanceof SVGSVGElement) {\n    svgElement.setAttribute(\"width\", `${size}`);\n    svgElement.setAttribute(\"height\", `${size}`);\n    return svgElement.outerHTML;\n  }\n\n  return \"\";\n}\n","import { htmlSafe } from \"@ember/template\";\nimport { isEmpty } from \"@ember/utils\";\nimport { convertIconClass, iconHTML } from \"discourse/lib/icon-library\";\nimport { createSafeSVG } from \"../lib/svg\";\n\nexport default function iconOrSvg(source) {\n  if (isEmpty(source)) {\n    return \"\";\n  }\n\n  if (source.startsWith(\"<svg\")) {\n    return htmlSafe(createSafeSVG(source));\n  }\n\n  return htmlSafe(iconHTML(convertIconClass(source)));\n}\n","/**\n * Toggles the collapse state of a callout content element.\n *\n * @param {HTMLElement} element\n * @param {boolean} isCollapsing\n * @param {function(boolean): void} onUpdate\n */\nexport function toggleCalloutCollapse(element, isCollapsing, onUpdate) {\n  if (!element) {\n    return;\n  }\n\n  // Clip overflow during transitions to prevent content\n  // from being visible before the container grows to reveal it.\n  element.classList.add(\"is-clipped\");\n\n  // Let the CSS handle the collapse if we can.\n  if (CSS.supports(\"interpolate-size: allow-keywords\")) {\n    element.classList.add(\"can-interpolate-size\");\n    onUpdate(isCollapsing);\n\n    if (!isCollapsing) {\n      element.addEventListener(\n        \"transitionend\",\n        () => element.classList.remove(\"is-clipped\"),\n        { once: true }\n      );\n    }\n\n    return;\n  }\n\n  element.removeAttribute(\"style\");\n  element.style.height = element.scrollHeight + \"px\";\n\n  if (isCollapsing) {\n    element.style.height = element.scrollHeight + \"px\";\n    element.offsetHeight; // reflow\n    element.style.height = \"0px\";\n  }\n\n  onUpdate(isCollapsing);\n\n  element.addEventListener(\n    \"transitionend\",\n    () => {\n      if (isCollapsing) {\n        element.style.display = \"none\";\n      } else {\n        element.style.height = \"\";\n        element.classList.remove(\"is-clipped\");\n      }\n    },\n    { once: true }\n  );\n}\n\n/**\n * Converts hex code to rgba.\n *\n * @param {string} hexCode\n * @param {number} opacity\n * @returns {string}\n */\nexport function hexToRGBA(hexCode, opacity) {\n  let hex = hexCode.replace(\"#\", \"\");\n\n  if (hex.length === 3) {\n    hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n  }\n\n  const r = parseInt(hex.substring(0, 2), 16);\n  const g = parseInt(hex.substring(2, 4), 16);\n  const b = parseInt(hex.substring(4, 6), 16);\n\n  return `rgba(${r},${g},${b}, ${opacity})`;\n}\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param {string} string\n * @returns {string}\n */\nexport function capitalizeFirstLetter(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Checks if a node is truly empty.\n *\n * @param {Node} element\n * @returns {boolean}\n */\nexport function isNodeEmpty(element) {\n  // No text content (after trimming whitespace)\n  const hasNoText = !element.textContent.trim();\n  // No child elements (including void elements like img)\n  const hasNoElements = !element.children.length;\n  // No non-whitespace text nodes\n  const hasNoTextNodes = Array.from(element.childNodes)\n    .filter((node) => node.nodeType === Node.TEXT_NODE)\n    .every((node) => !node.textContent.trim());\n\n  return hasNoText && hasNoElements && hasNoTextNodes;\n}\n\n/**\n * Collects nodes until a condition is met.\n *\n * @param {Node} parentNode\n * @param {function(Node): boolean} stopWhen\n * @param {Object} options\n * @param {function(Node): void} options.onEach\n * @param {function(Node): void} options.onStop\n * @param {function(Node[]): void} options.onEnd\n * @returns {Node[]}\n */\nexport function collectNodesUntil(\n  parentNode,\n  stopWhen,\n  { onEach, onStop, onEnd } = {}\n) {\n  const collected = [];\n\n  for (const node of Array.from(parentNode.childNodes)) {\n    if (stopWhen(node)) {\n      onStop?.(node);\n      break;\n    }\n    collected.push(node);\n    onEach?.(node);\n  }\n  onEnd?.(collected);\n  return collected;\n}\n\n/**\n * Gets the first text node that has content\n * @param {Node} node\n * @returns {Node}\n */\nexport function firstMeaningfulNode(node) {\n  let child = node.firstChild;\n\n  while (\n    child &&\n    child.nodeType === Node.TEXT_NODE &&\n    !child.textContent.trim()\n  ) {\n    child = child.nextSibling;\n  }\n\n  return child;\n}\n\n/**\n * Gets the leading text from a node\n * @param {Node} node\n * @returns {string}\n */\nexport function leadingTextFromNode(node) {\n  if (!node) {\n    return null;\n  }\n\n  if (node.nodeType === Node.TEXT_NODE) {\n    return node.textContent;\n  }\n\n  if (node.nodeType === Node.ELEMENT_NODE) {\n    const inner = firstMeaningfulNode(node);\n\n    if (inner?.nodeType === Node.TEXT_NODE) {\n      return inner.textContent;\n    }\n  }\n\n  return null;\n}\n","import { isTesting } from \"discourse/lib/environment\";\nimport { capitalizeFirstLetter } from \"./utils\";\n\nexport const CALLOUT_EXCERPT_REGEX = new RegExp(`\\\\[![^\\\\]]+\\\\][+-]? *`, \"gmi\");\nexport const CALLOUT_REGEX =\n  /^(?<marker>\\[!(?<callout>[^\\]]+)\\](?<fold>[+-])?\\s*?)(?<title>.*)?/;\nexport const CALLOUT_MARKER_REGEX = /\\[![^\\]]+\\]/;\nexport const CALLOUT_CONTROLS_META = \"callout:controls\";\n\n// Default callout type when callout_fallback_type is not set\nexport const DEFAULT_CALLOUT_TYPE = settings.callout_fallback_type || \"note\";\n\nlet cache;\n\nfunction getCalloutData() {\n  if (!cache || isTesting()) {\n    cache = buildCalloutData(settings.callouts || []);\n  }\n  return cache;\n}\n\nfunction buildCalloutData(callouts) {\n  const entries = [];\n\n  for (const callout of callouts) {\n    const aliases = (callout.alias ?? \"\")\n      .split(\"|\")\n      .map((alias) => alias.trim().toLowerCase())\n      .filter(Boolean);\n\n    const type = callout.type.trim().toLowerCase();\n    const title = callout.title?.trim();\n    const hasExplicitTitle = Boolean(title);\n\n    entries.push({\n      ...callout,\n      type,\n      name: type,\n      title: title || capitalizeFirstLetter(type),\n      aliases,\n      hasExplicitTitle,\n    });\n\n    for (const alias of aliases) {\n      entries.push({\n        ...callout,\n        type: alias,\n        mainType: type,\n        name: alias,\n        title: title || capitalizeFirstLetter(alias),\n        hasExplicitTitle,\n      });\n    }\n  }\n\n  return entries;\n}\n\nexport function findCalloutOptions(type) {\n  return getCalloutData().find(\n    (callout) => callout.type === type?.toLowerCase()\n  );\n}\n\nexport function getAllCallouts() {\n  return getCalloutData();\n}\n\nexport function getChooserCallouts() {\n  return getCalloutData().filter(\n    (callout) => !callout.mainType || !callout.hasExplicitTitle\n  );\n}\n\nexport function getAllCalloutTypes() {\n  return getCalloutData().map((callout) => callout.type);\n}\n\nexport function searchCallouts(term) {\n  return getAllCalloutTypes().filter((type) =>\n    type.startsWith(term.toLowerCase())\n  );\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport { next } from \"@ember/runloop\";\nimport { service } from \"@ember/service\";\nimport { trustHTML } from \"@ember/template\";\nimport DButton from \"discourse/components/d-button\";\nimport DropdownMenu from \"discourse/components/dropdown-menu\";\nimport TextField from \"discourse/components/text-field\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport scrollIntoView from \"discourse/modifiers/scroll-into-view\";\nimport { eq } from \"discourse/truth-helpers\";\nimport { i18n } from \"discourse-i18n\";\nimport iconOrSvg from \"../helpers/icon-or-svg\";\nimport { hexToRGBA } from \"../lib/utils\";\n\nexport default class CalloutChooserPanel extends Component {\n  @service calloutSettings;\n\n  @tracked searchTerm = \"\";\n  @tracked selectedTypeIndex = -1;\n\n  get filteredCallouts() {\n    const all = this.calloutSettings.chooser();\n    if (!this.searchTerm) {\n      return all;\n    }\n\n    const filter = this.searchTerm.toLowerCase();\n    return all.filter(\n      (callout) =>\n        callout.type.includes(filter) ||\n        callout.title.toLowerCase().includes(filter) ||\n        (callout.hasExplicitTitle &&\n          callout.aliases?.some((alias) => alias.includes(filter)))\n    );\n  }\n\n  @action\n  search(event) {\n    this.searchTerm = event.target.value;\n    this.selectedTypeIndex = -1;\n  }\n\n  @action\n  handleKeydown(event) {\n    const items = this.filteredCallouts;\n\n    if (event.key === \"ArrowDown\") {\n      event.preventDefault();\n      this.selectedTypeIndex = Math.min(\n        this.selectedTypeIndex + 1,\n        items.length - 1\n      );\n    } else if (event.key === \"ArrowUp\") {\n      event.preventDefault();\n      this.selectedTypeIndex = Math.max(this.selectedTypeIndex - 1, 0);\n    } else if (event.key === \"Enter\") {\n      event.preventDefault();\n      const item = items[this.selectedTypeIndex];\n      if (item) {\n        this.selectType(item.type);\n      }\n    }\n  }\n\n  @action\n  focus(element) {\n    element.focus({ preventScroll: true });\n    next(() => {\n      this.selectedTypeIndex = this.filteredCallouts.findIndex(\n        (callout) => callout.type === this.args.selectedType\n      );\n    });\n  }\n\n  @action\n  selectType(type) {\n    this.args.onSelect?.(type);\n    this.args.close?.();\n  }\n\n  calloutColorStyle(color) {\n    const bg = hexToRGBA(\n      color || settings.callout_fallback_color,\n      settings.callout_background_opacity / 100\n    );\n    return trustHTML(\n      `--q-callout-background: ${bg}; --q-callout-color: ${color || settings.callout_fallback_color};`\n    );\n  }\n\n  <template>\n    <div class=\"callout-chooser-panel\">\n      <div class=\"callout-chooser-search\">\n        <TextField\n          autocomplete=\"off\"\n          @placeholder={{i18n (themePrefix \"composer.menu.search\")}}\n          @type=\"search\"\n          {{on \"input\" this.search}}\n          {{on \"keydown\" this.handleKeydown}}\n          {{didInsert this.focus}}\n          @value={{readonly this.searchTerm}}\n        />\n        {{icon \"magnifying-glass\"}}\n      </div>\n      <DropdownMenu class=\"callout-chooser-list\" as |menu|>\n        {{#each this.filteredCallouts as |callout index|}}\n          <menu.item>\n            <DButton\n              class={{concatClass\n                \"callout-chooser-row\"\n                (if (eq callout.type @selectedType) \"is-selected\")\n                (if (eq index this.selectedTypeIndex) \"is-highlighted\")\n              }}\n              data-type={{callout.type}}\n              style={{this.calloutColorStyle callout.color}}\n              @action={{fn this.selectType callout.type}}\n              {{scrollIntoView (eq index this.selectedTypeIndex)}}\n            >\n              <span class=\"callout-chooser-row__icon\">\n                {{iconOrSvg callout.icon}}\n              </span>\n              <span class=\"callout-chooser-row__name\">\n                {{callout.title}}\n              </span>\n            </DButton>\n          </menu.item>\n        {{/each}}\n      </DropdownMenu>\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DMenu from \"discourse/float-kit/components/d-menu\";\nimport iconOrSvg from \"../helpers/icon-or-svg\";\nimport CalloutChooserPanel from \"./callout-chooser-panel\";\n\nexport default class CalloutChooser extends Component {\n  @service calloutSettings;\n\n  menuApi = null;\n\n  get icon() {\n    const options = this.calloutSettings.find(this.args.value);\n    return options?.icon || settings.callout_fallback_icon;\n  }\n\n  @action\n  onRegisterApi(api) {\n    this.menuApi = api;\n  }\n\n  @action\n  onClose() {\n    this.args.onClose?.();\n  }\n\n  @action\n  onSelect(type) {\n    this.menuApi?.close();\n    this.args.onChange?.(type);\n  }\n\n  <template>\n    <DMenu\n      @identifier=\"callout-chooser\"\n      @triggerClass=\"callout-chooser-trigger\"\n      @contentClass=\"callout-chooser-content\"\n      @placement=\"bottom-start\"\n      @disabled={{@disabled}}\n      @onClose={{this.onClose}}\n      @onRegisterApi={{this.onRegisterApi}}\n      @offset={{2}}\n      ...attributes\n    >\n      <:trigger>\n        <span class=\"callout-icon\">\n          {{iconOrSvg this.icon}}\n        </span>\n      </:trigger>\n      <:content>\n        <CalloutChooserPanel\n          @selectedType={{@value}}\n          @onSelect={{this.onSelect}}\n        />\n      </:content>\n    </DMenu>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport { service } from \"@ember/service\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport noop from \"discourse/helpers/noop\";\nimport iconOrSvg from \"../helpers/icon-or-svg\";\nimport { DEFAULT_CALLOUT_TYPE } from \"../lib/config\";\nimport {\n  capitalizeFirstLetter,\n  hexToRGBA,\n  toggleCalloutCollapse,\n} from \"../lib/utils\";\nimport CalloutChooser from \"./callout-chooser\";\n\nexport default class Callout extends Component {\n  @service calloutSettings;\n\n  @tracked isCollapsed;\n\n  contentElement = null;\n\n  type = DEFAULT_CALLOUT_TYPE;\n  icon = settings.callout_fallback_icon;\n  alias = this.type;\n\n  constructor() {\n    super(...arguments);\n\n    const { type: calloutType, fold } = this.args.data;\n\n    this.isCollapsed = fold && fold === \"-\";\n    this.options = this.calloutSettings.find(calloutType);\n\n    if (this.options?.type) {\n      this.type = this.options.mainType || this.options.type;\n      this.alias = calloutType;\n    }\n\n    if (this.options?.icon) {\n      this.icon = this.options.icon;\n    }\n  }\n\n  @action\n  setupContent(element) {\n    this.contentElement = element;\n  }\n\n  @action\n  setupColor(element) {\n    element.style.setProperty(\n      \"--q-callout-background\",\n      hexToRGBA(\n        this.options?.color || settings.callout_fallback_color,\n        settings.callout_background_opacity / 100\n      )\n    );\n\n    element.style.setProperty(\n      \"--q-callout-color\",\n      this.options?.color || settings.callout_fallback_color\n    );\n  }\n\n  @action\n  preventSelection(event) {\n    if (event.detail > 1) {\n      // If double click\n      event.preventDefault();\n    }\n  }\n\n  @action\n  toggleCollapse() {\n    const isCollapsing = !this.isCollapsed;\n\n    toggleCalloutCollapse(this.contentElement, isCollapsing, (isCollapsed) => {\n      this.isCollapsed = isCollapsed;\n    });\n  }\n\n  get isCollapsible() {\n    return (\n      [\"-\", \"+\"].includes(this.args.data.fold) &&\n      this.args.data.children?.length > 0\n    );\n  }\n\n  get title() {\n    return (\n      this.args.data.title.text ||\n      this.options?.title ||\n      capitalizeFirstLetter(this.type)\n    );\n  }\n\n  @action\n  onTypeChange(newType) {\n    const { calloutIndex } = this.args.data;\n    const textarea = document.querySelector(\".d-editor-input\");\n    if (!textarea) {\n      return;\n    }\n\n    const text = textarea.value;\n    const markerRegex = /\\[!([^\\]]+)\\]/gim;\n    let match;\n    let count = 0;\n\n    while ((match = markerRegex.exec(text)) !== null) {\n      const lineStart = text.lastIndexOf(\"\\n\", match.index - 1) + 1;\n      const prefix = text.substring(lineStart, match.index);\n      if (!/^(?:>[ \\t]*)+$/.test(prefix)) {\n        continue;\n      }\n\n      if (count === calloutIndex) {\n        const newMarker = `[!${newType}]`;\n\n        textarea.setSelectionRange(match.index, match.index + match[0].length);\n        textarea.focus();\n        document.execCommand(\"insertText\", false, newMarker);\n        break;\n      }\n      count++;\n    }\n  }\n\n  <template>\n    <blockquote\n      class={{concatClass\n        \"callout\"\n        (if this.isCollapsed \"is-collapsed\")\n        (if this.isCollapsible \"is-collapsible\")\n      }}\n      data-callout-type={{this.type}}\n      data-callout-alias={{this.alias}}\n      {{didInsert this.setupColor}}\n    >\n      {{! template-lint-disable no-invalid-interactive }}\n      {{! template-lint-disable no-pointer-down-event-binding }}\n      <div\n        class=\"callout-title\"\n        {{on \"click\" (if this.isCollapsible this.toggleCollapse (noop))}}\n        {{on \"mousedown\" this.preventSelection}}\n      >\n        {{#if @data.isPreview}}\n          <CalloutChooser\n            @value={{readonly this.type}}\n            @onChange={{this.onTypeChange}}\n            class=\"btn-transparent\"\n          />\n        {{else if this.icon}}\n          <span class=\"callout-icon\">\n            {{iconOrSvg this.icon}}\n          </span>\n        {{/if}}\n        <span class=\"callout-title-inner\">\n          {{~#if @data.title.hasInline~}}\n            {{~#each @data.title.nodes as |node|~}}\n              {{~node~}}\n            {{~/each~}}\n          {{~else~}}\n            {{~this.title~}}\n          {{~/if~}}\n        </span>\n        {{#if this.isCollapsible}}\n          <span\n            class={{concatClass\n              \"callout-fold\"\n              (if this.isCollapsed \"is-collapsed\")\n            }}\n          >\n            {{icon \"chevron-down\"}}\n          </span>\n        {{/if}}\n      </div>\n\n      {{#if @data.children}}\n        <div class=\"callout-content\" {{didInsert this.setupContent}}>\n          {{#each @data.children as |child|}}\n            {{#if child.isCallout}}\n              <Callout @data={{child}} />\n            {{else}}\n              {{child.content}}\n            {{/if}}\n          {{/each}}\n        </div>\n      {{/if}}\n    </blockquote>\n  </template>\n}\n","import { DEFAULT_CALLOUT_TYPE, findCalloutOptions } from \"./config\";\nimport { capitalizeFirstLetter } from \"./utils\";\n\n/**\n * Checks if the cursor is at the start of a block.\n * from https://github.com/ProseMirror/prosemirror-commands/blob/master/src/commands.ts\n *\n * @param {Object} state - The current state of the editor.\n * @param {Object} view - The view of the editor.\n * @returns {Object|null} The cursor position if at the start of a block, null otherwise.\n */\nexport function atBlockStart(state, view) {\n  let { $cursor } = state.selection;\n  if (\n    !$cursor ||\n    (view ? !view.endOfTextblock(\"backward\", state) : $cursor.parentOffset > 0)\n  ) {\n    return null;\n  }\n  return $cursor;\n}\n\n// https://github.com/discourse/discourse/pull/31933#discussion_r2019739410\nexport function changedDescendants(old, cur, f, offset = 0) {\n  const oldSize = old.childCount,\n    curSize = cur.childCount;\n  outer: for (let i = 0, j = 0; i < curSize; i++) {\n    const child = cur.child(i);\n    for (let scan = j, e = Math.min(oldSize, i + 5); scan < e; scan++) {\n      if (old.child(scan) === child) {\n        j = scan + 1;\n        offset += child.nodeSize;\n        continue outer;\n      }\n    }\n    f(child, offset);\n    if (j < oldSize && old.child(j).sameMarkup(child)) {\n      changedDescendants(old.child(j), child, f, offset + 1);\n    } else {\n      child.nodesBetween(0, child.content.size, f, offset + 1);\n    }\n    offset += child.nodeSize;\n  }\n}\n\n/**\n * Finds the nearest ancestor node of a given type in the current selection.\n *\n * @param {Object} state - The current state of the editor.\n * @param {Object} nodeType - The type of node to find.\n * @param {Object} attrs - Optional attributes to narrow the match.\n * @returns {Object|null} The ancestor { node, depth, pos } if found, null otherwise.\n */\nexport function findAncestor(state, nodeType, attrs = {}) {\n  const { $from } = state.selection;\n  const hasAttrs = Object.keys(attrs).length > 0;\n\n  for (let depth = $from.depth; depth >= 0; depth--) {\n    const node = $from.node(depth);\n    if (node.type === nodeType) {\n      if (\n        !hasAttrs ||\n        Object.keys(attrs).every((key) => node.attrs[key] === attrs[key])\n      ) {\n        return { node, depth, pos: $from.before(depth) };\n      }\n    }\n  }\n\n  return null;\n}\n\n/**\n * Returns the document position of the innermost callout the cursor is in,\n * or null. Mirrors the plugin's logic so components can read the current\n * active callout on mount without waiting for an appEvent.\n *\n * @param {import(\"prosemirror-view\").EditorView} view\n * @returns {number|null}\n */\nexport function activeCalloutPosFromView(view) {\n  const { selection, schema } = view.state;\n  if (selection.node?.type === schema.nodes.callout) {\n    return selection.from;\n  }\n  const ancestor = findAncestor(view.state, schema.nodes.callout);\n  return ancestor?.pos ?? null;\n}\n\n/**\n * Checks if a node of a specific type is present in the current selection,\n * with optional scoping by specific attributes.\n *\n * @param {Object} state - The current state of the editor.\n * @param {Object} nodeType - The type of node to find.\n * @param {Object} attrs - Optional attributes to narrow the match.\n * @returns {boolean} True if the node is present, false otherwise.\n */\nexport function inNode(state, nodeType, attrs = {}) {\n  return findAncestor(state, nodeType, attrs) !== null;\n}\n\n/**\n * Builds a callout node with a title and body.\n *\n * @param {Object} schema - The schema of the editor.\n * @param {string} type - The type of the callout.\n * @param {Object} options - Optional parameters.\n * @param {string} options.title - The title of the callout.\n * @param {Array} options.bodyNodes - The nodes to wrap in the body.\n * @returns {Object} The callout node.\n */\nexport function buildCallout(schema, type, { title = \"\", bodyNodes } = {}) {\n  let options = findCalloutOptions(type);\n  if (!options) {\n    type = DEFAULT_CALLOUT_TYPE;\n    options = findCalloutOptions(type);\n  }\n  const titleText = title || options?.title || capitalizeFirstLetter(type);\n  const titleNode = schema.nodes.callout_title.create(\n    { type },\n    schema.text(titleText)\n  );\n  const bodyContent = bodyNodes || [schema.nodes.paragraph.create()];\n  const bodyNode = schema.nodes.callout_body.create(null, bodyContent);\n\n  return schema.nodes.callout.create({ type, hasCustomTitle: !!title }, [\n    titleNode,\n    bodyNode,\n  ]);\n}\n\n/**\n * Insert a block node at an inline selection:\n * - consumes adjacent hard_breaks to avoid stray <br>s at split edges\n * - removes empty sibling paragraphs left by the paragraph split\n *\n * @param {Object} tr - The transaction to modify.\n * @param {Object} schema - The schema of the editor.\n * @param {Object} selection - The current selection.\n * @param {Object} node - The node to insert.\n * @returns {Object} The modified transaction.\n */\nexport function insertBlockAtInlineSelection(tr, schema, selection, node) {\n  const { $from, $to } = selection;\n  const blockStart = $from.before($from.depth);\n\n  const from =\n    $from.nodeBefore?.type === schema.nodes.hard_break\n      ? selection.from - 1\n      : selection.from;\n  const to =\n    $to.nodeAfter?.type === schema.nodes.hard_break\n      ? selection.to + 1\n      : selection.to;\n  tr.replaceWith(from, to, node);\n\n  let insertedPos = null;\n  tr.doc.nodesBetween(blockStart, tr.doc.content.size, (nd, pos) => {\n    if (!insertedPos && nd.type === node.type && pos >= blockStart) {\n      insertedPos = pos;\n      return false;\n    }\n  });\n\n  if (insertedPos == null) {\n    return null;\n  }\n\n  const afterPos = insertedPos + tr.doc.nodeAt(insertedPos).nodeSize;\n  const nodeAfter = tr.doc.nodeAt(afterPos);\n  if (nodeAfter?.type === schema.nodes.paragraph && !nodeAfter.content.size) {\n    tr.delete(afterPos, afterPos + nodeAfter.nodeSize);\n  }\n\n  const nodeBefore = tr.doc.resolve(insertedPos).nodeBefore;\n  if (nodeBefore?.type === schema.nodes.paragraph && !nodeBefore.content.size) {\n    tr.delete(insertedPos - nodeBefore.nodeSize, insertedPos);\n    insertedPos -= nodeBefore.nodeSize;\n  }\n\n  return insertedPos;\n}\n\n/**\n * Checks if a node of a specific type is active in the current selection,\n * (with optional scoping by specific attributes), and that no other nodes\n * of any other type are present in the selection.\n *\n * @param {Object} state - The current state of the editor.\n * @param {Object} nodeType - The type of node to find.\n * @param {Object} attrs - Optional attributes to narrow the match.\n * @returns {boolean} True if the node is active, false otherwise.\n */\nexport function isNodeActive(state, nodeType, attrs = {}) {\n  const { from, to, empty } = state.selection;\n  const nodeRanges = [];\n\n  state.doc.nodesBetween(from, to, (node, pos) => {\n    if (node.isText) {\n      return;\n    }\n\n    const relativeFrom = Math.max(from, pos);\n    const relativeTo = Math.min(to, pos + node.nodeSize);\n\n    nodeRanges.push({\n      node,\n      from: relativeFrom,\n      to: relativeTo,\n    });\n  });\n\n  const selectionRange = to - from;\n\n  const matchedNodeRanges = nodeRanges\n    .filter((nodeRange) => {\n      return nodeType.name === nodeRange.node.type.name;\n    })\n    .filter((nodeRange) => {\n      if (!Object.keys(attrs).length) {\n        return true;\n      } else {\n        return Object.keys(attrs).every(\n          (key) => nodeRange.node.attrs[key] === attrs[key]\n        );\n      }\n    });\n\n  if (empty) {\n    return !!matchedNodeRanges.length;\n  }\n\n  // Determines if there are other nodes not matching nodeType in the selection\n  // by summing selection ranges to find \"gaps\" in the selection.\n  const range = matchedNodeRanges.reduce(\n    (sum, nodeRange) => sum + nodeRange.to - nodeRange.from,\n    0\n  );\n\n  // If there are no \"gaps\" in the selection, it means the nodeType is active\n  // with no other node types selected.\n  return range >= selectionRange;\n}\n\nexport function stripPrefix(inlineToken, prefixLen) {\n  let remaining = prefixLen;\n  const out = [];\n\n  for (const tok of inlineToken.children || []) {\n    if (remaining <= 0) {\n      out.push(tok);\n      continue;\n    }\n\n    if (tok.type !== \"text\") {\n      continue;\n    }\n\n    const len = tok.content.length;\n    if (len > remaining) {\n      out.push({ ...tok, content: tok.content.slice(remaining) });\n      remaining = 0;\n    } else {\n      remaining -= len;\n    }\n  }\n\n  inlineToken.children = out;\n}\n\nexport function splitAtFirstLineBreak(inlineToken) {\n  const children = inlineToken.children || [];\n  const title = [];\n  const rest = [];\n  let foundBreak = false;\n\n  for (const tok of children) {\n    if (foundBreak) {\n      rest.push(tok);\n      continue;\n    }\n\n    if (tok.type === \"softbreak\" || tok.type === \"hardbreak\") {\n      foundBreak = true;\n      continue;\n    }\n\n    if (tok.type === \"text\") {\n      const splitIdx = tok.content.indexOf(\"\\n\");\n      if (splitIdx !== -1) {\n        title.push({ ...tok, content: tok.content.slice(0, splitIdx) });\n        const remainder = tok.content.slice(splitIdx + 1);\n        if (remainder) {\n          rest.push({ ...tok, content: remainder });\n        }\n        foundBreak = true;\n        continue;\n      }\n    }\n\n    title.push(tok);\n  }\n\n  return { title, rest };\n}\n","import { DEFAULT_CALLOUT_TYPE } from \"../config\";\nimport {\n  buildCallout,\n  insertBlockAtInlineSelection,\n} from \"../rich-editor-utils\";\n\nexport const commands = ({ schema, utils }) => ({\n  insertCallout:\n    (type = DEFAULT_CALLOUT_TYPE, title = \"\") =>\n    (state, dispatch) => {\n      const { selection } = state;\n      const { $from, $to } = selection;\n\n      const createCallout = (bodyNodes) =>\n        buildCallout(schema, type, { title, bodyNodes });\n\n      const setCursorAtBodyEnd = (\n        tr,\n        { calloutStart, nearPos, minPos = 0 } = {}\n      ) => {\n        let foundPos = calloutStart ?? null;\n\n        if (foundPos == null) {\n          const searchEnd = Math.min(\n            tr.doc.content.size,\n            nearPos + tr.doc.content.size\n          );\n          tr.doc.nodesBetween(nearPos, searchEnd, (node, pos) => {\n            if (\n              foundPos == null &&\n              node.type === schema.nodes.callout &&\n              pos >= minPos\n            ) {\n              foundPos = pos;\n              return false;\n            }\n          });\n        }\n\n        if (foundPos == null) {\n          return;\n        }\n\n        const foundNode = tr.doc.nodeAt(foundPos);\n        const bodyEnd = foundPos + foundNode.nodeSize - 2;\n        tr.setSelection(\n          selection.constructor.near(tr.doc.resolve(bodyEnd), -1)\n        );\n      };\n\n      const tr = state.tr;\n\n      // If inside a callout title, wrap the entire callout in a new one\n      if (utils.isNodeActive(state, schema.nodes.callout_title)) {\n        for (let d = $from.depth; d >= 0; d--) {\n          if ($from.node(d).type === schema.nodes.callout) {\n            const calloutStart = $from.before(d);\n            const existingCallout = $from.node(d);\n            const newCallout = createCallout([existingCallout]);\n\n            tr.replaceWith(\n              calloutStart,\n              calloutStart + existingCallout.nodeSize,\n              newCallout\n            );\n            setCursorAtBodyEnd(tr, { calloutStart });\n            break;\n          }\n        }\n      } else if (selection.empty) {\n        const callout = createCallout([schema.nodes.paragraph.create()]);\n        tr.replaceSelectionWith(callout);\n        setCursorAtBodyEnd(tr, {\n          nearPos: $from.pos,\n          minPos: $from.before($from.depth),\n        });\n      } else {\n        const isBlockSelection =\n          ($from.parent === $to.parent &&\n            $from.parentOffset === 0 &&\n            $to.parentOffset === $from.parent.content.size &&\n            $from.parent.isBlock &&\n            $from.depth > 0) ||\n          $from.parent !== $to.parent;\n\n        if (isBlockSelection) {\n          const range = $from.blockRange($to);\n          if (!range) {\n            return false;\n          }\n\n          const content = state.doc.slice(range.start, range.end).content;\n          const callout = createCallout(content);\n\n          tr.replaceWith(range.start, range.end, callout);\n          setCursorAtBodyEnd(tr, { calloutStart: range.start });\n        } else {\n          const inlineContent = state.doc.slice(\n            selection.from,\n            selection.to\n          ).content;\n          const callout = createCallout([\n            schema.nodes.paragraph.create(null, inlineContent),\n          ]);\n\n          const calloutPos = insertBlockAtInlineSelection(\n            tr,\n            schema,\n            selection,\n            callout\n          );\n          if (calloutPos != null) {\n            setCursorAtBodyEnd(tr, { calloutStart: calloutPos });\n          }\n        }\n      }\n\n      dispatch?.(tr.scrollIntoView());\n      return true;\n    },\n});\n","import { DEFAULT_CALLOUT_TYPE } from \"../config\";\nimport { buildCallout } from \"../rich-editor-utils\";\n\nexport const inputRules = () => {\n  function calloutInputHandler(state, type, start, end) {\n    const callout = buildCallout(state.schema, type);\n\n    const insertPos = start - 1;\n    const tr = state.tr.replaceWith(insertPos, end, callout);\n\n    const titleNode = callout.child(0);\n    const bodyParaPos = insertPos + 1 + titleNode.nodeSize + 2;\n    tr.setSelection(\n      state.selection.constructor.near(tr.doc.resolve(bodyParaPos))\n    );\n\n    return tr.scrollIntoView();\n  }\n\n  return [\n    {\n      match: /^\\/callout(?::(\\w+))?\\s$/, // /callout or /callout:type\n      handler: (state, match, start, end) => {\n        const type = match[1]?.toLowerCase() || DEFAULT_CALLOUT_TYPE;\n        return calloutInputHandler(state, type, start, end);\n      },\n    },\n    {\n      match: /^!!(\\w+)\\s$/, // !!type\n      handler: (state, match, start, end) => {\n        const type = match[1].toLowerCase();\n        return calloutInputHandler(state, type, start, end);\n      },\n    },\n  ];\n};\n","import {\n  CALLOUT_REGEX,\n  DEFAULT_CALLOUT_TYPE,\n  findCalloutOptions,\n} from \"../config\";\nimport { splitAtFirstLineBreak, stripPrefix } from \"../rich-editor-utils\";\nimport { capitalizeFirstLetter } from \"../utils\";\n\nexport const parse = {\n  blockquote_open(state, _token, tokens, i) {\n    state._bqStack ||= [];\n\n    // A blockquote wrapping a paragraph produces this token layout:\n    // i+0: blockquote_open\n    // i+1: paragraph_open\n    // i+2: inline\n    // i+3: paragraph_close\n    // ...\n    // blockquote_close\n    const inlineToken = tokens[i + 2];\n    const firstLine = (inlineToken?.content || \"\").split(\"\\n\")[0];\n    const match =\n      tokens[i + 1]?.type === \"paragraph_open\" &&\n      inlineToken?.type === \"inline\" &&\n      firstLine.match(CALLOUT_REGEX);\n\n    if (!match) {\n      state._bqStack.push(\"blockquote\");\n      state.openNode(state.schema.nodes.blockquote);\n      return true;\n    }\n\n    const { callout: rawCallout, marker, fold } = match.groups;\n\n    let calloutType = rawCallout.toLowerCase();\n    let options = findCalloutOptions(calloutType);\n    if (!options) {\n      calloutType = DEFAULT_CALLOUT_TYPE;\n      options = findCalloutOptions(calloutType);\n    }\n\n    state._bqStack.push(\"callout\");\n\n    stripPrefix(inlineToken, marker.length);\n\n    // Trim leading whitespace from the first text token.\n    const firstChild = inlineToken.children?.[0];\n    if (firstChild?.type === \"text\") {\n      firstChild.content = firstChild.content.replace(/^\\s+/, \"\");\n      if (!firstChild.content) {\n        inlineToken.children.shift();\n      }\n    }\n\n    const { title, rest } = splitAtFirstLineBreak(inlineToken);\n    const hasCustomTitle = title.length > 0;\n\n    if (!hasCustomTitle) {\n      const defaultTitle = options?.title ?? capitalizeFirstLetter(calloutType);\n      inlineToken.children = [{ type: \"text\", content: defaultTitle }];\n    } else {\n      inlineToken.children = title;\n    }\n\n    const foldOptions = {\n      fold,\n      isCollapsed: fold === \"-\",\n      isCollapsible: [\"-\", \"+\"].includes(fold),\n      hasBody: rest.length > 0 || tokens[i + 4]?.type !== \"blockquote_close\",\n    };\n\n    // Inject the remaining body content as a new paragraph right after the title paragraph.\n    if (rest.length) {\n      tokens.splice(\n        i + 4,\n        0,\n        { type: \"paragraph_open\", tag: \"p\", nesting: 1 },\n        { type: \"inline\", children: rest, content: \"\" },\n        { type: \"paragraph_close\", tag: \"p\", nesting: -1 }\n      );\n    }\n\n    state.openNode(state.schema.nodes.callout, {\n      type: calloutType,\n      hasCustomTitle,\n      ...foldOptions,\n    });\n\n    state.openNode(state.schema.nodes.callout_title, {\n      type: calloutType,\n      ...foldOptions,\n    });\n\n    return true;\n  },\n\n  paragraph_open(state) {\n    if (state.top()?.type === state.schema.nodes.callout_title) {\n      return true;\n    }\n\n    state.openNode(state.schema.nodes.paragraph);\n    return true;\n  },\n\n  paragraph_close(state) {\n    const top = state.top();\n\n    if (top?.type === state.schema.nodes.callout_title) {\n      state.closeNode();\n      state.openNode(state.schema.nodes.callout_body);\n      return true;\n    }\n\n    if (top?.type === state.schema.nodes.paragraph) {\n      state.closeNode();\n      return true;\n    }\n\n    return false;\n  },\n\n  blockquote_close(state) {\n    const kind = state._bqStack.pop();\n    const topType = () => state.top()?.type;\n\n    if (kind === \"callout\") {\n      if (topType() === state.schema.nodes.callout_title) {\n        state.closeNode();\n      }\n      if (topType() === state.schema.nodes.callout_body) {\n        state.closeNode();\n      }\n      if (topType() === state.schema.nodes.callout) {\n        state.closeNode();\n      }\n      return true;\n    }\n\n    if (kind === \"blockquote\") {\n      if (topType() === state.schema.nodes.blockquote) {\n        state.closeNode();\n      }\n      return true;\n    }\n\n    return false;\n  },\n};\n\nexport const serializeNode = {\n  callout(state, node) {\n    // Renders the body's children directly\n    // when getSelected is used inside a callout body\n    if (node.childCount < 2) {\n      const only = node.childCount === 1 ? node.child(0) : null;\n\n      if (only?.type.name === \"callout_body\") {\n        only.forEach((child, _offset, index) =>\n          state.render(child, only, index)\n        );\n      }\n      return;\n    }\n\n    const titleNode = node.child(0);\n    const bodyNode = node.child(1);\n\n    // Captures the title as a plain string. renderInline() appends directly to\n    // state.out with no way to redirect it, so we reset the buffer to isolate\n    // just the title output, read it, then restore the original state.\n    const prev = state.out;\n    const prevDelim = state.delim;\n    const prevClosed = state.closed;\n    const prevAtBlockStart = state.atBlockStart;\n\n    state.out = \"\";\n    state.delim = \"\";\n    state.closed = null;\n    state.atBlockStart = true;\n\n    state.renderInline(titleNode);\n    let title = state.out.trim();\n\n    state.out = prev;\n    state.delim = prevDelim;\n    state.closed = prevClosed;\n    state.atBlockStart = prevAtBlockStart;\n\n    const fold = node.attrs.fold || \"\";\n    const titleStr = node.attrs.hasCustomTitle ? ` ${title}` : \"\";\n    const marker = `[!${node.attrs.type}]${fold}${titleStr}`;\n\n    state.wrapBlock(\"> \", null, node, () => {\n      state.write(bodyNode.childCount ? `${marker}\\n` : marker);\n\n      if (bodyNode.childCount) {\n        bodyNode.forEach((child, _offset, index) => {\n          if (index > 0) {\n            const prevChild = bodyNode.child(index - 1);\n            // Uses size=1 (newline only, no blank line) when going from a\n            // paragraph to a block, so the nested wrapBlock doesn't emit\n            // a spurious blank \"> \" via its internal flushClose(). Use\n            // size=2 otherwise to keep adjacent paragraphs/blocks separated.\n            const paraToBlock =\n              prevChild.type.name === \"paragraph\" &&\n              child.type.name !== \"paragraph\";\n            state.flushClose(paraToBlock ? 1 : 2);\n          }\n          state.render(child, bodyNode, index);\n        });\n      }\n    });\n  },\n};\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport icon from \"discourse/helpers/d-icon\";\nimport { or } from \"discourse/truth-helpers\";\nimport { i18n } from \"discourse-i18n\";\nimport { DEFAULT_CALLOUT_TYPE } from \"../lib/config\";\nimport { activeCalloutPosFromView } from \"../lib/rich-editor-utils\";\n\nexport default class CalloutNodeView extends Component {\n  @service appEvents;\n  @service calloutSettings;\n  @service calloutMoveState;\n\n  @tracked activeCalloutPos = null;\n  @tracked hasEmptyBody = false;\n  @tracked needsInsertAfter = false;\n  @tracked canNestUp = false;\n  @tracked canNestDown = false;\n  @tracked canMoveUp = false;\n  @tracked canMoveDown = false;\n\n  constructor() {\n    super(...arguments);\n\n    this.args.onSetup?.(this);\n    this.activeCalloutPos = activeCalloutPosFromView(this.args.view);\n    this.updateState();\n\n    this.appEvents.on(\n      \"callout:selection-changed\",\n      this,\n      this.onSelectionChanged\n    );\n  }\n\n  willDestroy() {\n    super.willDestroy();\n\n    this.appEvents.off(\n      \"callout:selection-changed\",\n      this,\n      this.onSelectionChanged\n    );\n  }\n\n  onSelectionChanged(pos) {\n    this.activeCalloutPos = pos;\n    this.updateState();\n  }\n\n  get isSelected() {\n    return this.activeCalloutPos === this.args.getPos();\n  }\n\n  get showMoveControls() {\n    return this.calloutMoveState.isEnabledFor(this.args.getPos());\n  }\n\n  updateState() {\n    const calloutPos = this.args.getPos();\n    if (calloutPos == null) {\n      this.canMoveUp = false;\n      this.canMoveDown = false;\n      this.canNestUp = false;\n      this.canNestDown = false;\n      this.hasEmptyBody = false;\n      this.needsInsertAfter = false;\n      return;\n    }\n\n    const contentElement = this.args.dom?.querySelector(\".callout-content\");\n    this.hasEmptyBody = contentElement\n      ? contentElement.childElementCount === 0\n      : false;\n\n    const { state } = this.args.view;\n    const { schema } = state;\n    const $pos = state.doc.resolve(calloutPos);\n    const index = $pos.index($pos.depth);\n\n    // Check siblings for nest buttons\n    const prevSibling = index > 0 ? $pos.parent.child(index - 1) : null;\n    const nextSibling =\n      index < $pos.parent.childCount - 1 ? $pos.parent.child(index + 1) : null;\n\n    this.canNestUp = prevSibling?.type === schema.nodes.callout;\n    this.canNestDown = nextSibling?.type === schema.nodes.callout;\n\n    const isNested = $pos.parent.type === schema.nodes.callout_body;\n    const isEmptyParagraph = (node) =>\n      node?.type === schema.nodes.paragraph && node.content.size === 0;\n\n    // Only skip empty paragraphs at the very edges of the parent\n    // (leading/trailing empty paragraphs), not separators between nodes\n    const isLeadingEmpty = index === 1 && isEmptyParagraph(prevSibling);\n    const isTrailingEmpty =\n      index === $pos.parent.childCount - 2 && isEmptyParagraph(nextSibling);\n\n    const hasPrev = index > 0 && !isLeadingEmpty;\n    const hasNext = index < $pos.parent.childCount - 1 && !isTrailingEmpty;\n\n    this.canMoveUp = hasPrev || isNested;\n    this.canMoveDown = hasNext || isNested;\n\n    const calloutNode = state.doc.nodeAt(calloutPos);\n    if (!calloutNode) {\n      this.needsInsertAfter = false;\n      return;\n    }\n\n    const afterPos = calloutPos + calloutNode.nodeSize;\n    const $after = state.doc.resolve(afterPos);\n    const nodeAfter = $after.nodeAfter;\n\n    this.needsInsertAfter =\n      !nodeAfter || nodeAfter.type === schema.nodes.callout;\n  }\n\n  #resolveCallout() {\n    const { view } = this.args;\n    const { state } = view;\n    const { schema } = state;\n\n    const calloutPos = this.args.getPos();\n    if (calloutPos == null) {\n      return null;\n    }\n\n    const calloutNode = state.doc.nodeAt(calloutPos);\n    if (!calloutNode) {\n      return null;\n    }\n\n    const $pos = state.doc.resolve(calloutPos);\n    const index = $pos.index($pos.depth);\n\n    return { view, state, schema, calloutPos, calloutNode, $pos, index };\n  }\n\n  #finishMove(tr, newCalloutPos) {\n    const { view } = this.args;\n    const $newPos = tr.doc.resolve(newCalloutPos + 2);\n    tr.setSelection(view.state.selection.constructor.near($newPos));\n\n    this.calloutMoveState.enable(newCalloutPos);\n    view.dispatch(tr.scrollIntoView());\n    view.focus();\n    this.appEvents.trigger(\"callout:selection-changed\", newCalloutPos);\n  }\n\n  @action\n  addBody() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { view, state, schema, calloutPos, calloutNode } = ctx;\n    const titleNode = calloutNode.child(0);\n    const bodyContentStart = calloutPos + 1 + titleNode.nodeSize + 1;\n    const tr = state.tr.insert(\n      bodyContentStart,\n      schema.nodes.paragraph.create()\n    );\n\n    const $pos = tr.doc.resolve(bodyContentStart + 1);\n    tr.setSelection(state.selection.constructor.near($pos));\n    view.dispatch(tr.scrollIntoView());\n    view.focus();\n  }\n\n  @action\n  insertAfter() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { view, state, schema, calloutPos, calloutNode } = ctx;\n    const posAfter = calloutPos + calloutNode.nodeSize;\n    const tr = state.tr.insert(posAfter, schema.nodes.paragraph.create());\n    const $pos = tr.doc.resolve(posAfter + 1);\n\n    tr.setSelection(state.selection.constructor.near($pos));\n    view.dispatch(tr.scrollIntoView());\n    view.focus();\n  }\n\n  @action\n  moveUp() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { state, schema, calloutPos, calloutNode, $pos, index } = ctx;\n    const tr = state.tr;\n    let newCalloutPos;\n\n    if (index > 0) {\n      const prevSibling = $pos.parent.child(index - 1);\n      const prevSiblingPos = calloutPos - prevSibling.nodeSize;\n      tr.insert(prevSiblingPos, calloutNode);\n      const shifted = calloutPos + calloutNode.nodeSize;\n      tr.delete(shifted, shifted + calloutNode.nodeSize);\n      newCalloutPos = prevSiblingPos;\n    } else if ($pos.parent.type === schema.nodes.callout_body) {\n      const parentCalloutPos = $pos.before($pos.depth - 1);\n      tr.insert(parentCalloutPos, calloutNode);\n      const shifted = calloutPos + calloutNode.nodeSize;\n      tr.delete(shifted, shifted + calloutNode.nodeSize);\n      newCalloutPos = parentCalloutPos;\n    } else {\n      return;\n    }\n\n    this.#finishMove(tr, newCalloutPos);\n  }\n\n  @action\n  moveDown() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { state, schema, calloutPos, calloutNode, $pos, index } = ctx;\n    const tr = state.tr;\n    let newCalloutPos;\n\n    if (index < $pos.parent.childCount - 1) {\n      const nextSiblingPos = calloutPos + calloutNode.nodeSize;\n      const nextSibling = state.doc.nodeAt(nextSiblingPos);\n      if (!nextSibling) {\n        return;\n      }\n\n      tr.insert(nextSiblingPos + nextSibling.nodeSize, calloutNode);\n      tr.delete(calloutPos, calloutPos + calloutNode.nodeSize);\n\n      newCalloutPos = calloutPos + nextSibling.nodeSize;\n    } else if ($pos.parent.type === schema.nodes.callout_body) {\n      const afterParentPos = $pos.after($pos.depth - 1);\n\n      tr.insert(afterParentPos, calloutNode);\n      tr.delete(calloutPos, calloutPos + calloutNode.nodeSize);\n\n      newCalloutPos = afterParentPos - calloutNode.nodeSize;\n    } else {\n      return;\n    }\n\n    this.#finishMove(tr, newCalloutPos);\n  }\n\n  @action\n  nestUp() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { state, schema, calloutPos, calloutNode, $pos, index } = ctx;\n\n    if (index === 0) {\n      return;\n    }\n\n    const prevSibling = $pos.parent.child(index - 1);\n    if (prevSibling.type !== schema.nodes.callout) {\n      return;\n    }\n\n    const bodyEndPos = calloutPos - 2;\n    const tr = state.tr;\n    tr.insert(bodyEndPos, calloutNode);\n    const shifted = calloutPos + calloutNode.nodeSize;\n    tr.delete(shifted, shifted + calloutNode.nodeSize);\n\n    this.#finishMove(tr, bodyEndPos);\n  }\n\n  @action\n  nestDown() {\n    const ctx = this.#resolveCallout();\n    if (!ctx) {\n      return;\n    }\n\n    const { state, schema, calloutPos, calloutNode, $pos, index } = ctx;\n\n    if (index >= $pos.parent.childCount - 1) {\n      return;\n    }\n\n    const nextSibling = $pos.parent.child(index + 1);\n    if (nextSibling.type !== schema.nodes.callout) {\n      return;\n    }\n\n    const nextCalloutPos = calloutPos + calloutNode.nodeSize;\n    const nextCalloutNode = state.doc.nodeAt(nextCalloutPos);\n    if (!nextCalloutNode) {\n      return;\n    }\n\n    const titleNode = nextCalloutNode.child(0);\n    const bodyContentStart = nextCalloutPos + 1 + titleNode.nodeSize + 1;\n\n    const tr = state.tr;\n    tr.insert(bodyContentStart, calloutNode);\n    tr.delete(calloutPos, calloutPos + calloutNode.nodeSize);\n\n    this.#finishMove(tr, bodyContentStart - calloutNode.nodeSize);\n  }\n\n  update(node) {\n    const options = this.calloutSettings.find(node.attrs.type);\n    const element = this.args.dom.firstElementChild;\n\n    if (!options) {\n      element.removeAttribute(\"data-callout-alias\");\n      element.setAttribute(\"data-callout-type\", DEFAULT_CALLOUT_TYPE);\n    } else if (options.mainType) {\n      element.setAttribute(\"data-callout-type\", options.mainType);\n      element.setAttribute(\"data-callout-alias\", options.type);\n    } else {\n      element.removeAttribute(\"data-callout-alias\");\n      element.setAttribute(\"data-callout-type\", options.type);\n    }\n\n    element.classList.toggle(\"is-collapsed\", node.attrs.isCollapsed);\n    element.classList.toggle(\"is-collapsible\", node.attrs.isCollapsible);\n\n    this.updateState();\n  }\n\n  <template>\n    {{#if this.isSelected}}\n      {{#if this.showMoveControls}}\n        {{#if (or this.canMoveUp this.canNestUp)}}\n          <div\n            class=\"callout-move-controls callout-top-controls\"\n            contenteditable=\"false\"\n          >\n            {{#if this.canMoveUp}}\n              <DButton\n                @icon=\"arrow-up\"\n                @action={{this.moveUp}}\n                class=\"callout-move-btn callout-move-up-btn btn btn-flat btn-small\"\n                @translatedTitle={{i18n (themePrefix \"composer.menu.move_up\")}}\n                @preventFocus=\"true\"\n              />\n            {{/if}}\n            {{#if this.canNestUp}}\n              <DButton\n                @icon=\"arrow-up-from-bracket\"\n                @action={{this.nestUp}}\n                class=\"callout-move-btn callout-nest-btn btn btn-flat btn-small\"\n                @translatedTitle={{i18n (themePrefix \"composer.menu.nest_up\")}}\n                @preventFocus=\"true\"\n              />\n            {{/if}}\n          </div>\n        {{/if}}\n      {{else}}\n        <div class=\"callout-handle\" contenteditable=\"false\">\n          {{icon \"grip-lines\"}}\n        </div>\n      {{/if}}\n      <div class=\"callout-bottom-controls\" contenteditable=\"false\">\n        {{#if this.hasEmptyBody}}\n          <DButton\n            @icon=\"callout-add-body\"\n            @action={{this.addBody}}\n            class=\"callout-add-body btn btn-flat btn-small\"\n            @translatedTitle={{i18n (themePrefix \"composer.menu.add_body\")}}\n            @preventFocus=\"true\"\n          />\n        {{/if}}\n\n        {{#if this.showMoveControls}}\n\n          {{#if this.canMoveDown}}\n            <DButton\n              @icon=\"arrow-down\"\n              @action={{this.moveDown}}\n              class=\"callout-move-btn callout-move-down-btn btn btn-flat btn-small\"\n              @translatedTitle={{i18n (themePrefix \"composer.menu.move_down\")}}\n              @preventFocus=\"true\"\n            />\n          {{/if}}\n          {{#if this.canNestDown}}\n            <DButton\n              @icon=\"arrow-up-from-bracket\"\n              @action={{this.nestDown}}\n              class=\"callout-move-btn callout-nest-btn callout-nest-down btn btn-flat btn-small\"\n              @translatedTitle={{i18n (themePrefix \"composer.menu.nest_down\")}}\n              @preventFocus=\"true\"\n            />\n          {{/if}}\n        {{/if}}\n\n        {{#if this.needsInsertAfter}}\n          <DButton\n            @icon=\"callout-insert-after\"\n            @action={{this.insertAfter}}\n            class=\"callout-add-after btn btn-flat btn-small\"\n            @translatedTitle={{i18n\n              (themePrefix \"composer.menu.insert_paragraph_after\")\n            }}\n            @preventFocus=\"true\"\n          />\n        {{/if}}\n      </div>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { next } from \"@ember/runloop\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport DToggleSwitch from \"discourse/components/d-toggle-switch\";\nimport DropdownMenu from \"discourse/components/dropdown-menu\";\nimport DMenu from \"discourse/float-kit/components/d-menu\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport { and, eq, not, or } from \"discourse/truth-helpers\";\nimport { i18n } from \"discourse-i18n\";\nimport { findCalloutOptions } from \"../lib/config\";\nimport {\n  activeCalloutPosFromView,\n  findAncestor,\n} from \"../lib/rich-editor-utils\";\nimport { capitalizeFirstLetter, toggleCalloutCollapse } from \"../lib/utils\";\nimport CalloutChooser from \"./callout-chooser\";\n\nexport default class CalloutTitleNodeView extends Component {\n  @service appEvents;\n  @service calloutSettings;\n  @service calloutMoveState;\n  @service capabilities;\n\n  @tracked type;\n  @tracked fold;\n  @tracked isCollapsed;\n  @tracked isCollapsible;\n  @tracked hasBody;\n  @tracked activeCalloutPos = null;\n\n  constructor() {\n    super(...arguments);\n\n    const { type, fold, isCollapsed, isCollapsible, hasBody } =\n      this.args.node.attrs;\n\n    this.type = type;\n    this.fold = fold || \"\";\n    this.isCollapsed = isCollapsed;\n    this.isCollapsible = isCollapsible;\n    this.hasBody = hasBody;\n\n    this.args.onSetup?.(this);\n    this.activeCalloutPos = activeCalloutPosFromView(this.args.view);\n\n    this.appEvents.on(\n      \"callout:selection-changed\",\n      this,\n      this.onSelectionChanged\n    );\n  }\n\n  willDestroy() {\n    super.willDestroy();\n\n    this.appEvents.off(\n      \"callout:selection-changed\",\n      this,\n      this.onSelectionChanged\n    );\n  }\n\n  onSelectionChanged(pos) {\n    this.activeCalloutPos = pos;\n  }\n\n  get isSelected() {\n    return this.activeCalloutPos === this.args.getPos() - 1;\n  }\n\n  get isMoveEnabled() {\n    return this.calloutMoveState.isEnabledFor(this.args.getPos() - 1);\n  }\n\n  get isNested() {\n    const { state } = this.args.view;\n    const calloutPos = this.args.getPos() - 1;\n    const $pos = state.doc.resolve(calloutPos);\n    return $pos.parent.type === state.schema.nodes.callout_body;\n  }\n\n  get canShowMoreOptions() {\n    return this.capabilities.touch || this.hasBody || this.isCollapsible;\n  }\n\n  ignoreMutation(mutation) {\n    const { target, type } = mutation;\n    const element =\n      target.nodeType === Node.ELEMENT_NODE ? target : target.parentElement;\n\n    if (!element) {\n      return true;\n    }\n\n    const inControls =\n      element.closest(\".callout-left-controls\") ||\n      element.closest(\".callout-right-controls\");\n    const inTitle = element.closest(\".callout-title-inner\");\n\n    if (inControls || !inTitle) {\n      return true;\n    }\n\n    if (type === \"characterData\" || type === \"selection\") {\n      return false;\n    }\n\n    return true;\n  }\n\n  get calloutType() {\n    return this.args.node.attrs.type || this.calloutSettings.fallbackType;\n  }\n\n  update(node) {\n    this.type = node.attrs.type;\n    this.fold = node.attrs.fold || \"\";\n    this.isCollapsed = node.attrs.isCollapsed;\n    this.isCollapsible = node.attrs.isCollapsible;\n    this.hasBody = node.attrs.hasBody;\n  }\n\n  updateNodeMarkup(attrs) {\n    const { state, dispatch } = this.args.view;\n    const titlePos = this.args.getPos();\n    const calloutPos = titlePos - 1;\n\n    let tr = state.tr;\n\n    const calloutNode = state.doc.nodeAt(calloutPos);\n    if (calloutNode && calloutNode.type.name === \"callout\") {\n      tr = tr.setNodeMarkup(calloutPos, null, {\n        ...calloutNode.attrs,\n        ...attrs,\n      });\n    }\n\n    const titleNode = tr.doc.nodeAt(titlePos);\n    if (titleNode && titleNode.type.name === \"callout_title\") {\n      tr = tr.setNodeMarkup(titlePos, null, {\n        ...titleNode.attrs,\n        ...attrs,\n      });\n    }\n\n    dispatch(tr);\n  }\n\n  @action\n  focusEditor() {\n    next(() => {\n      const { view } = this.args;\n      if (view.dom?.isConnected) {\n        view.focus();\n      }\n    });\n  }\n\n  @action\n  onTypeChange(newType) {\n    this.type = newType;\n    this.updateNodeMarkup({ type: this.type });\n\n    // Update default title text when it's not a custom title\n    const { state, dispatch } = this.args.view;\n    const titlePos = this.args.getPos();\n    const calloutNode = state.doc.nodeAt(titlePos - 1);\n\n    if (calloutNode && !calloutNode.attrs.hasCustomTitle) {\n      const options = findCalloutOptions(newType);\n      const defaultTitle = options?.title || capitalizeFirstLetter(newType);\n      const titleNode = state.doc.nodeAt(titlePos);\n\n      if (titleNode) {\n        const from = titlePos + 1;\n        const to = from + titleNode.content.size;\n        const tr = state.tr.replaceWith(\n          from,\n          to,\n          defaultTitle ? state.schema.text(defaultTitle) : []\n        );\n        tr.setMeta(\"callout:isDefaultTitle\", true);\n        dispatch(tr);\n      }\n    }\n\n    next(() => {\n      this.focusEditor();\n    });\n  }\n\n  @action\n  setFold(value) {\n    this.fold = value;\n    this.isCollapsed = value === \"-\";\n    this.isCollapsible = value !== \"\";\n\n    this.updateNodeMarkup({\n      fold: this.fold,\n      isCollapsed: this.isCollapsed,\n      isCollapsible: this.isCollapsible,\n    });\n  }\n\n  @action\n  deleteCallout() {\n    const { view } = this.args;\n    const { schema } = view.state;\n\n    const callout = findAncestor(view.state, schema.nodes.callout);\n    if (!callout) {\n      return;\n    }\n\n    const tr = view.state.tr;\n    tr.delete(callout.pos, callout.pos + callout.node.nodeSize);\n    view.dispatch(tr);\n    view.focus();\n  }\n\n  @action\n  toggleMoveControls() {\n    const calloutPos = this.args.getPos() - 1;\n    this.calloutMoveState.toggle(calloutPos);\n  }\n\n  get foldOptions() {\n    const trans = (key) =>\n      i18n(themePrefix(`composer.menu.folding_options.${key}`));\n    return [\n      { value: \"\", label: trans(\"none\"), className: \"option-none\" },\n      { value: \"-\", label: trans(\"collapsed\"), className: \"option-collapsed\" },\n      { value: \"+\", label: trans(\"expanded\"), className: \"option-expanded\" },\n    ];\n  }\n\n  @action\n  toggleCollapse() {\n    const isCollapsing = !this.isCollapsed;\n\n    toggleCalloutCollapse(\n      this.args.dom.parentElement.querySelector(\".callout-content\"),\n      isCollapsing,\n      (isCollapsed) => {\n        this.isCollapsed = isCollapsed;\n        this.updateNodeMarkup({ isCollapsed });\n      }\n    );\n  }\n\n  <template>\n    <span\n      class={{concatClass\n        \"callout-controls-hub\"\n        (if this.isSelected \"is-selected\")\n      }}\n    >\n      <span class=\"callout-left-controls\" contenteditable=\"false\">\n        <CalloutChooser\n          @value={{this.type}}\n          @onChange={{this.onTypeChange}}\n          @onClose={{this.focusEditor}}\n          @disabled={{not this.isSelected}}\n        />\n      </span>\n\n      {{#if this.isSelected}}\n        <span class=\"callout-right-controls\" contenteditable=\"false\">\n          {{#if this.canShowMoreOptions}}\n            <DMenu\n              @identifier=\"callout-options-menu\"\n              @icon=\"ellipsis-vertical\"\n              @class=\"callout-control-btn btn-no-text btn-transparent\"\n              @translatedTitle={{i18n\n                (themePrefix \"composer.menu.more_options\")\n              }}\n            >\n              <:content>\n                <DropdownMenu @class=\"callout-control-dropdown\" as |dropdown|>\n                  {{#if this.capabilities.touch}}\n                    <dropdown.item class=\"callout-control-dropdown__move-item\">\n                      <span>{{i18n (themePrefix \"composer.menu.move\")}}</span>\n                      <DToggleSwitch\n                        @state={{this.isMoveEnabled}}\n                        {{on \"click\" this.toggleMoveControls}}\n                      />\n                    </dropdown.item>\n                  {{/if}}\n\n                  {{#if (or this.hasBody this.isCollapsible)}}\n                    <dropdown.item class=\"callout-control-dropdown__fold-item\">\n                      <span>{{i18n\n                          (themePrefix \"composer.menu.folding\")\n                        }}</span>\n                      {{#each this.foldOptions as |option|}}\n                        <DButton\n                          class={{concatClass\n                            \"callout-control-fold\"\n                            \"text-size btn btn-flat\"\n                            option.className\n                            (if (eq option.value this.fold) \"active\")\n                          }}\n                          @action={{fn this.setFold option.value}}\n                        >\n                          {{option.label}}\n                        </DButton>\n                      {{/each}}\n                    </dropdown.item>\n                  {{/if}}\n                </DropdownMenu>\n              </:content>\n            </DMenu>\n          {{/if}}\n\n          <DButton\n            @icon=\"trash-can\"\n            @action={{this.deleteCallout}}\n            class=\"callout-control-btn callout-delete-btn btn-no-text btn-transparent\"\n            @translatedTitle={{i18n (themePrefix \"composer.delete_callout\")}}\n          />\n        </span>\n      {{/if}}\n    </span>\n\n    {{#if (and this.isCollapsible this.hasBody)}}\n      <DButton\n        @icon=\"chevron-down\"\n        @action={{this.toggleCollapse}}\n        @preventFocus={{true}}\n        @translatedTitle={{i18n (themePrefix \"composer.menu.toggle_folding\")}}\n        class={{concatClass\n          \"callout-fold btn btn-no-text btn-transparent\"\n          (if this.isCollapsed \"is-collapsed\")\n        }}\n      />\n    {{/if}}\n  </template>\n}\n","import { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport { next } from \"@ember/runloop\";\n\n/**\n * @typedef {Object} GlimmerNodeViewArgs\n * @property {import(\"prosemirror-model\").Node} node\n * @property {import(\"prosemirror-view\").EditorView} view\n * @property {() => number} getPos\n * @property {() => import(\"discourse/lib/composer/rich-editor-extensions\").PluginContext} getContext\n * @property {any} component\n * @property {string} name\n */\nexport default class GlimmerNodeView {\n  @tracked node;\n\n  #componentInstance;\n\n  /**\n   * @param {GlimmerNodeViewArgs} args\n   */\n  constructor({\n    node,\n    view,\n    getPos,\n    getContext,\n    component,\n    name,\n    hasContent = false,\n    buildDOM = null,\n  }) {\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n    this.getContext = getContext;\n    this.component = component;\n\n    getContext().addGlimmerNodeView(this);\n\n    if (buildDOM) {\n      const { dom, contentDOM } = buildDOM(node);\n      this.dom = dom;\n      this.contentDOM = contentDOM;\n    } else {\n      this.dom = document.createElement(node.isInline ? \"span\" : \"div\");\n      this.dom.classList.add(`composer-${name}-node`);\n\n      if (hasContent) {\n        this.contentDOM = document.createElement(\n          node.isInline ? \"span\" : \"div\"\n        );\n        this.dom.appendChild(this.contentDOM);\n      }\n    }\n  }\n\n  @action\n  setComponentInstance(instance) {\n    this.#componentInstance = instance;\n\n    if (this.#componentInstance?.setSelection) {\n      this.setSelection = this.#componentInstance.setSelection.bind(\n        this.#componentInstance\n      );\n    } else {\n      this.setSelection = undefined;\n    }\n  }\n\n  update(node, decorations, innerDecorations) {\n    this.node = node;\n    return (\n      this.#componentInstance?.update?.(node, decorations, innerDecorations) ??\n      true\n    );\n  }\n\n  selectNode() {\n    next(() => this.#componentInstance?.selectNode?.());\n  }\n\n  deselectNode() {\n    next(() => this.#componentInstance?.deselectNode?.());\n  }\n\n  stopEvent(event) {\n    return this.#componentInstance?.stopEvent?.(event) ?? false;\n  }\n\n  ignoreMutation(mutation) {\n    return this.#componentInstance?.ignoreMutation?.(mutation) ?? true;\n  }\n\n  destroy() {\n    this.#componentInstance?.destroy?.();\n    this.#componentInstance = null;\n\n    this.getContext().removeGlimmerNodeView(this);\n  }\n}\n","import CalloutNodeView from \"../../components/callout-node-view\";\nimport CalloutTitleNodeView from \"../../components/callout-title-node-view\";\nimport GlimmerNodeView from \"../../lib/glimmer-node-view\";\nimport { DEFAULT_CALLOUT_TYPE, findCalloutOptions } from \"../config\";\n\n// TODO: Get rid of a custom glimmer-node-view with this syntax?\n//\n// nodeViews: {\n//   callout: {\n//     component: CalloutNodeView,\n//     hasContent: true,\n//   },\n// },\n\nconst calloutNodeView =\n  ({ getContext }) =>\n  (node, view, getPos) => {\n    const name = \"callout\";\n\n    return new GlimmerNodeView({\n      node,\n      view,\n      getPos,\n      getContext,\n      component: CalloutNodeView,\n      name,\n      buildDOM() {\n        const dom = document.createElement(\"div\");\n        dom.className = `composer-${name}-node`;\n\n        const contentDOM = document.createElement(\"blockquote\");\n        contentDOM.classList.add(name);\n        contentDOM.setAttribute(\"data-callout-type\", node.attrs.type);\n\n        const options = findCalloutOptions(node.attrs.type);\n\n        if (options) {\n          if (options?.mainType) {\n            contentDOM.setAttribute(\"data-callout-type\", options.mainType);\n            contentDOM.setAttribute(\"data-callout-alias\", options.type);\n          } else {\n            contentDOM.setAttribute(\"data-callout-type\", options.type);\n          }\n        } else {\n          contentDOM.setAttribute(\"data-callout-type\", DEFAULT_CALLOUT_TYPE);\n        }\n\n        if (node.attrs.isCollapsed) {\n          contentDOM.classList.add(\"is-collapsed\");\n        }\n\n        if (node.attrs.isCollapsible) {\n          contentDOM.classList.add(\"is-collapsible\");\n        }\n\n        dom.appendChild(contentDOM);\n\n        return { dom, contentDOM };\n      },\n    });\n  };\n\nconst calloutTitleNodeView =\n  ({ getContext }) =>\n  (node, view, getPos) => {\n    const name = \"callout-title\";\n\n    return new GlimmerNodeView({\n      node,\n      view,\n      getPos,\n      getContext,\n      component: CalloutTitleNodeView,\n      name,\n      buildDOM() {\n        const dom = document.createElement(\"div\");\n        dom.className = `composer-${name}-node ${name}`;\n\n        const contentDOM = document.createElement(\"span\");\n        contentDOM.className = `${name}-inner`;\n        dom.appendChild(contentDOM);\n\n        return { dom, contentDOM };\n      },\n    });\n  };\n\nclass calloutBodyNodeView {\n  constructor() {\n    const dom = document.createElement(\"div\");\n    dom.className = \"callout-content\";\n    this.dom = dom;\n    this.contentDOM = dom;\n  }\n\n  ignoreMutation(mutation) {\n    return mutation.type !== \"selection\";\n  }\n}\n\nexport const nodeViews = {\n  callout: calloutNodeView,\n  callout_title: calloutTitleNodeView,\n  callout_body: calloutBodyNodeView,\n};\n","import { findAncestor } from \"../rich-editor-utils\";\n\n// Some QoL improvements when navigating callouts using arrow keys\n// to make easier to move in and out of nested callouts.\nexport function handleArrowDown({\n  view,\n  $from,\n  schema,\n  dispatch,\n  state,\n  TextSelection,\n}) {\n  if (!view.endOfTextblock(\"down\")) {\n    return false;\n  }\n\n  const parent = $from.parent;\n  const isEmptyParagraph =\n    parent.type === schema.nodes.paragraph && parent.content.size === 0;\n\n  // From the title into an empty body:\n  // insert a paragraph and move cursor into it.\n  //\n  //   Before                   After (↓)\n  //   ┌─ callout ────────┐     ┌─ callout ────────┐\n  //   │  Title|          │     │  Title           │\n  //   │  (empty body)    │     │  |               │\n  //   └──────────────────┘     └──────────────────┘\n  const titleAncestor = findAncestor(state, schema.nodes.callout_title);\n  if (titleAncestor) {\n    const calloutNode = $from.node(titleAncestor.depth - 1);\n    const bodyNode = calloutNode.childCount > 1 ? calloutNode.child(1) : null;\n\n    if (bodyNode && bodyNode.content.size === 0) {\n      const bodyContentStart =\n        titleAncestor.pos + titleAncestor.node.nodeSize + 1;\n      const tr = state.tr.insert(\n        bodyContentStart,\n        schema.nodes.paragraph.create()\n      );\n\n      tr.setMeta(\"callout:keyboardNav\", true);\n      tr.setSelection(TextSelection.create(tr.doc, bodyContentStart + 1));\n      dispatch(tr.scrollIntoView());\n\n      return true;\n    }\n    return false;\n  }\n\n  // On a trailing empty paragraph inside the body:\n  // remove it and move cursor after the callout (inserting a paragraph there\n  // only when no content already exists).\n  //\n  //   Before                          After (↓)\n  //   ┌─ outer ──────────────────┐    ┌─ outer ──────────────────┐\n  //   │  ┌─ inner ───────────┐   │    │  ┌─ inner ───────────┐   │\n  //   │  │  Title            │   │    │  │  Title            │   │\n  //   │  │  Content          │   │    │  │  Content          │   │\n  //   │  │  |                │   │    │  └───────────────────┘   │\n  //   │  └───────────────────┘   │    │  |                       │\n  //   └──────────────────────────┘    └──────────────────────────┘\n  if (isEmptyParagraph) {\n    const bodyAncestor = findAncestor(state, schema.nodes.callout_body);\n\n    if (bodyAncestor) {\n      const index = $from.index($from.depth - 1);\n\n      if (index + 1 === bodyAncestor.node.childCount) {\n        const trailingParaPos = $from.before($from.depth);\n        const calloutAncestor = findAncestor(state, schema.nodes.callout);\n        const posAfterCallout =\n          calloutAncestor.pos + calloutAncestor.node.nodeSize;\n\n        let tr = state.tr;\n\n        tr.delete(trailingParaPos, trailingParaPos + parent.nodeSize);\n        const newAfterPos = posAfterCallout - parent.nodeSize;\n\n        // Only create a new paragraph when nothing exists after the callout.\n        if (!state.doc.nodeAt(posAfterCallout)) {\n          tr.insert(newAfterPos, schema.nodes.paragraph.create());\n        }\n\n        tr.setMeta(\"callout:keyboardNav\", true);\n        tr.setSelection(TextSelection.create(tr.doc, newAfterPos + 1));\n\n        dispatch(tr.scrollIntoView());\n        return true;\n      }\n    }\n  }\n\n  // At the last position in the callout:\n  // insert a paragraph after.\n  //\n  //   Before                          After (↓)\n  //   ┌─ outer ──────────────────┐    ┌─ outer ──────────────────┐\n  //   │  ┌─ inner ───────────┐   │    │  ┌─ inner ───────────┐   │\n  //   │  │  Title            │   │    │  │  Title            │   │\n  //   │  │  Content|         │   │    │  │  Content          │   │\n  //   │  └───────────────────┘   │    │  └───────────────────┘   │\n  //   └──────────────────────────┘    │  |                       │\n  //                                   └──────────────────────────┘\n  const calloutAncestor = findAncestor(state, schema.nodes.callout);\n  if (calloutAncestor) {\n    const index = $from.index(calloutAncestor.depth - 1);\n    const parentNode = $from.node(calloutAncestor.depth - 1);\n\n    if (index + 1 === parentNode.childCount) {\n      const afterPara = $from.after($from.depth);\n      const calloutEnd = calloutAncestor.pos + calloutAncestor.node.nodeSize;\n\n      if (calloutEnd - afterPara > 2) {\n        return false;\n      }\n\n      const afterPos = calloutEnd;\n      const tr = state.tr.insert(afterPos, schema.nodes.paragraph.create());\n\n      tr.setMeta(\"callout:keyboardNav\", true);\n      tr.setSelection(TextSelection.create(tr.doc, afterPos + 1));\n      dispatch(tr.scrollIntoView());\n\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function handleArrowUp({\n  view,\n  $from,\n  schema,\n  dispatch,\n  state,\n  TextSelection,\n}) {\n  // From a position right after a callout whose body ends with a\n  // nested callout (no paragraph to land on):\n  // insert a paragraph at the end of that callout's body.\n  //\n  //   Before                          After (↑)\n  //   ┌─ callout ──────────────────┐  ┌─ callout ──────────────────┐\n  //   │  ┌─ nested ───────────┐    │  │  ┌─ nested ───────────┐    │\n  //   │  │  ...               │    │  │  │  ...               │    │\n  //   │  └────────────────────┘    │  │  └────────────────────┘    │\n  //   └────────────────────────────┘  │  |                         │\n  //   Text|                           └────────────────────────────┘\n  if (view.endOfTextblock(\"up\")) {\n    const index = $from.index($from.depth - 1);\n    if (index > 0) {\n      const prevNode = $from.node($from.depth - 1).child(index - 1);\n\n      if (prevNode.type === schema.nodes.callout) {\n        const body = prevNode.child(1);\n        const lastBodyChild = body.lastChild;\n\n        if (!lastBodyChild || lastBodyChild.type === schema.nodes.callout) {\n          const bodyEnd = $from.before($from.depth) - 2;\n          const tr = state.tr;\n          const isOnEmptyPara =\n            $from.parent.type === schema.nodes.paragraph &&\n            $from.parent.content.size === 0;\n\n          if (isOnEmptyPara) {\n            tr.delete($from.before($from.depth), $from.after($from.depth));\n          }\n\n          tr.insert(bodyEnd, schema.nodes.paragraph.create());\n          tr.setSelection(TextSelection.create(tr.doc, bodyEnd + 1));\n          dispatch(tr.scrollIntoView());\n          return true;\n        }\n\n        // Body ends with a regular block (e.g. paragraph with text):\n        // move cursor to the end of that block instead of creating a new one.\n        if (lastBodyChild) {\n          const tr = state.tr;\n          const isOnEmptyPara =\n            $from.parent.type === schema.nodes.paragraph &&\n            $from.parent.content.size === 0;\n\n          if (isOnEmptyPara) {\n            tr.delete($from.before($from.depth), $from.after($from.depth));\n          }\n\n          const endOfBody = $from.before($from.depth) - 1;\n          tr.setSelection(TextSelection.near(tr.doc.resolve(endOfBody), -1));\n          dispatch(tr.scrollIntoView());\n          return true;\n        }\n      }\n    }\n  }\n\n  const isEmptyParagraph =\n    $from.parent.type === schema.nodes.paragraph &&\n    $from.parent.content.size === 0;\n\n  // From an empty paragraph right after the callout:\n  // move back into the nested callout body.\n  //\n  //   Before                   After (↑)\n  //   ┌─ callout ────────┐     ┌─ callout ────────┐\n  //   │  ┌─ nested ────┐ │     │  ┌─ nested ────┐ │\n  //   │  │  Content    │ │     │  │  Content    │ │\n  //   │  └─────────────┘ │     │  │  |          │ │\n  //   │  |               │     │  └─────────────┘ │\n  //   └──────────────────┘     └──────────────────┘\n  if (isEmptyParagraph) {\n    const parentNode = $from.node($from.depth - 1);\n    const index = $from.index($from.depth - 1);\n\n    if (index > 0) {\n      const prevNode = parentNode.child(index - 1);\n\n      if (prevNode.type === schema.nodes.callout) {\n        const tr = state.tr.delete(\n          $from.before($from.depth),\n          $from.after($from.depth)\n        );\n\n        const prevCalloutBody = prevNode.child(1);\n        const lastBodyChild = prevCalloutBody.lastChild;\n        const hasTrailingEmpty =\n          lastBodyChild?.type === schema.nodes.paragraph &&\n          lastBodyChild.content.size === 0;\n\n        const bodyEndPos = $from.before($from.depth) - 2;\n\n        if (hasTrailingEmpty) {\n          tr.setMeta(\"callout:keyboardNav\", true);\n          tr.setSelection(TextSelection.create(tr.doc, bodyEndPos));\n        } else {\n          tr.insert(bodyEndPos, schema.nodes.paragraph.create());\n          tr.setMeta(\"callout:keyboardNav\", true);\n          tr.setSelection(TextSelection.create(tr.doc, bodyEndPos + 1));\n        }\n\n        dispatch(tr.scrollIntoView());\n        return true;\n      }\n    }\n\n    // From the only empty paragraph in a callout body, move up to the title\n    // and remove the paragraph. This is the reverse of ArrowDown/Enter from\n    // the title which inserted it.\n    //\n    //   Before                   After (↑)\n    //   ┌─ callout ────────┐     ┌─ callout ────────┐\n    //   │  Title           │     │  Title|          │\n    //   │  |               │     │  (empty body)    │\n    //   └──────────────────┘     └──────────────────┘\n    const bodyAncestor = findAncestor(state, schema.nodes.callout_body);\n    if (bodyAncestor && bodyAncestor.node.childCount === 1) {\n      const calloutAncestor = findAncestor(state, schema.nodes.callout);\n      if (calloutAncestor) {\n        const titleNode = calloutAncestor.node.child(0);\n        const titleEndPos = calloutAncestor.pos + 2 + titleNode.content.size;\n\n        const paraPos = $from.before($from.depth);\n        const tr = state.tr.delete(paraPos, paraPos + $from.parent.nodeSize);\n\n        tr.setMeta(\"callout:keyboardNav\", true);\n        tr.setSelection(TextSelection.create(tr.doc, titleEndPos));\n\n        dispatch(tr.scrollIntoView());\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n// Inside the title:\n// move cursor into the body (inserting a paragraph first if the body is empty).\n//\n//   Before                   After (Enter)\n//   ┌─ callout ────────┐     ┌─ callout ────────┐\n//   │  Title|          │     │  Title           │\n//   │  Some content    │     │  Some content|   │\n//   └──────────────────┘     └──────────────────┘\nexport function handleEnter(\n  { $from, schema, dispatch, state, TextSelection },\n  event\n) {\n  const titleAncestor = findAncestor(state, schema.nodes.callout_title);\n  if (!titleAncestor) {\n    return false;\n  }\n\n  const { node: titleNode, depth: titleDepth, pos: titlePos } = titleAncestor;\n  const calloutNode = $from.node(titleDepth - 1);\n  if (calloutNode.type !== schema.nodes.callout || calloutNode.childCount < 2) {\n    return false;\n  }\n\n  const bodyNode = calloutNode.child(1);\n  if (bodyNode.type !== schema.nodes.callout_body) {\n    return false;\n  }\n\n  event.preventDefault();\n\n  const bodyContentStart = $from.after(titleDepth) + 1;\n  let tr = state.tr;\n\n  if (calloutNode.attrs.isCollapsed) {\n    const calloutPos = $from.before(titleDepth - 1);\n    tr = tr\n      .setNodeMarkup(calloutPos, null, {\n        ...calloutNode.attrs,\n        isCollapsed: false,\n        fold: \"+\",\n      })\n      .setNodeMarkup(titlePos, null, {\n        ...titleNode.attrs,\n        isCollapsed: false,\n        fold: \"+\",\n      });\n  }\n\n  if (\n    bodyNode.childCount === 0 ||\n    bodyNode.firstChild.type !== schema.nodes.paragraph\n  ) {\n    tr = tr.insert(bodyContentStart, schema.nodes.paragraph.create());\n  }\n\n  dispatch(\n    tr\n      .setMeta(\"callout:keyboardNav\", true)\n      .setSelection(TextSelection.create(tr.doc, bodyContentStart + 1))\n      .scrollIntoView()\n  );\n\n  return true;\n}\n\n// Inside the title:\n// ArrowLeft at position 0 in the callout title opens the callout chooser.\nexport function handleArrowLeft({ view, $from, schema, state }) {\n  const titleAncestor = findAncestor(state, schema.nodes.callout_title);\n  if (!titleAncestor) {\n    return false;\n  }\n\n  if ($from.parentOffset !== 0) {\n    return false;\n  }\n\n  const titleDOM = view.nodeDOM(titleAncestor.pos);\n  const chooserTrigger = titleDOM\n    ?.closest(\".composer-callout-node\")\n    ?.querySelector(\".callout-chooser-trigger\");\n\n  if (chooserTrigger) {\n    chooserTrigger.click();\n    return true;\n  }\n\n  return false;\n}\n","import { CALLOUT_REGEX, findCalloutOptions } from \"../config\";\nimport { capitalizeFirstLetter } from \"../utils\";\n\n// Converts pasted markdown callout syntax (e.g. `> [!note]`) into callout\n// nodes. Handles both blockquote-based and plain-text `> ` pastes, with\n// recursive support for nested callouts.\n\nconst PLAIN_TEXT_QUOTE_PREFIX = /^\\s*>\\s?/;\n\n// Strips `stripLen` leading characters from the text content of a fragment.\nfunction sliceFragment(fragment, stripLen, schema) {\n  const nodes = [];\n  let remaining = stripLen;\n\n  fragment.forEach((node) => {\n    if (node.isText && remaining > 0) {\n      const len = node.text.length;\n      if (len > remaining) {\n        nodes.push(schema.text(node.text.slice(remaining), node.marks));\n      }\n      remaining -= len;\n    } else {\n      nodes.push(node);\n    }\n  });\n\n  return fragment.constructor.from(nodes);\n}\n\n// Tries to convert a blockquote node into a callout.\n// Returns null if the first paragraph doesn't match the `[!type]` pattern.\nfunction convertBlockquoteToCallout(blockquote, schema) {\n  const firstPara = blockquote.firstChild;\n  const match =\n    firstPara?.type === schema.nodes.paragraph &&\n    firstPara.textContent.match(CALLOUT_REGEX);\n\n  if (!match) {\n    return null;\n  }\n\n  const { callout: type, fold, marker } = match.groups;\n  const lowerType = type.toLowerCase();\n  const foldAttr = fold || \"\";\n\n  const titleContent = sliceFragment(firstPara.content, marker.length, schema);\n  const defaultTitle =\n    findCalloutOptions(lowerType)?.title ?? capitalizeFirstLetter(lowerType);\n\n  const titleNode = schema.nodes.callout_title.create(\n    { type: lowerType, fold: foldAttr },\n    titleContent.size ? titleContent : [schema.text(defaultTitle)]\n  );\n\n  const bodyContent = Array.from(\n    { length: blockquote.childCount - 1 },\n    (_, i) => blockquote.child(i + 1)\n  );\n\n  if (!bodyContent.length) {\n    bodyContent.push(schema.nodes.paragraph.create());\n  }\n\n  return schema.nodes.callout.create({ type: lowerType, fold: foldAttr }, [\n    titleNode,\n    schema.nodes.callout_body.create(null, bodyContent),\n  ]);\n}\n\n// Recursively walks a fragment, converting callout-like content into callout\n// nodes. Plain-text `> ` paragraphs are buffered, then flushed as a\n// blockquote and converted. Existing blockquotes are converted directly.\nexport function transformFragmentsToCallouts(fragment, schema) {\n  const nodes = [];\n  let buffer = [];\n  let changed = false;\n\n  const flush = () => {\n    if (!buffer.length) {\n      return;\n    }\n\n    changed = true;\n\n    const content = fragment.constructor.from(buffer);\n    buffer = [];\n\n    const transformed = transformFragmentsToCallouts(content, schema);\n    const bq = schema.nodes.blockquote.create(null, transformed);\n    nodes.push(convertBlockquoteToCallout(bq, schema) || bq);\n  };\n\n  fragment.forEach((node) => {\n    const match =\n      node.type === schema.nodes.paragraph &&\n      node.textContent.match(PLAIN_TEXT_QUOTE_PREFIX);\n\n    if (match) {\n      buffer.push(\n        node.copy(sliceFragment(node.content, match[0].length, schema))\n      );\n      return;\n    }\n\n    flush();\n\n    let newNode = node;\n    const newContent = transformFragmentsToCallouts(node.content, schema);\n\n    if (newContent !== node.content) {\n      newNode = node.copy(newContent);\n      changed = true;\n    }\n\n    if (newNode.type === schema.nodes.blockquote) {\n      const callout = convertBlockquoteToCallout(newNode, schema);\n      if (callout) {\n        newNode = callout;\n        changed = true;\n      }\n    }\n\n    nodes.push(newNode);\n  });\n\n  flush();\n\n  return changed ? fragment.constructor.from(nodes) : fragment;\n}\n","import {\n  CALLOUT_EXCERPT_REGEX,\n  CALLOUT_MARKER_REGEX,\n  DEFAULT_CALLOUT_TYPE,\n  findCalloutOptions,\n} from \"../config\";\nimport { findAncestor } from \"../rich-editor-utils\";\nimport { capitalizeFirstLetter, hexToRGBA, isNodeEmpty } from \"../utils\";\nimport {\n  handleArrowDown,\n  handleArrowLeft,\n  handleArrowUp,\n  handleEnter,\n} from \"./keyboard\";\nimport { transformFragmentsToCallouts } from \"./paste-handler\";\n\nexport function plugins({\n  pmState: { Plugin, TextSelection, PluginKey },\n  pmView: { Decoration, DecorationSet },\n  pmModel: { Fragment, Slice },\n  utils: { convertFromMarkdown },\n  getContext,\n}) {\n  const calloutPlugin = new Plugin({\n    key: new PluginKey(\"callout\"),\n\n    props: {\n      decorations(state) {\n        const { doc, schema } = state;\n        const calloutType = schema.nodes.callout;\n        if (!calloutType) {\n          return null;\n        }\n\n        const decos = [];\n        doc.descendants((node, pos) => {\n          if (node.type !== calloutType) {\n            return;\n          }\n\n          const type = node.attrs.type || DEFAULT_CALLOUT_TYPE;\n          const options = findCalloutOptions(type);\n          const color = options?.color || settings.callout_fallback_color;\n          const bg = hexToRGBA(\n            color,\n            settings.callout_background_opacity / 100\n          );\n          const darker = hexToRGBA(color, 0.3);\n\n          if (color) {\n            decos.push(\n              Decoration.node(pos, pos + node.nodeSize, {\n                style: `\n                  --q-callout-background: ${bg}; \n                  --q-callout-color-darker: ${darker}; \n                  --q-callout-color: ${color};`,\n              })\n            );\n          }\n        });\n\n        return DecorationSet.create(doc, decos);\n      },\n\n      handlePaste(view, event) {\n        const clipboard = event.clipboardData;\n        const hasHtml = clipboard?.types?.includes(\"text/html\");\n        const plainText = clipboard?.getData(\"text/plain\");\n\n        // When both HTML and plain text are present ProseMirror prefers the HTML\n        // which often contains syntax-highlighted elements rather than\n        // markdown structure. If the plain text contains callout markers, re-parse\n        // it as markdown so callouts are created correctly.\n        if (hasHtml && plainText && CALLOUT_MARKER_REGEX.test(plainText)) {\n          const doc = convertFromMarkdown(plainText);\n          const slice = Slice.maxOpen(Fragment.from(doc.content));\n          const tr = view.state.tr.replaceSelection(slice);\n          view.dispatch(tr);\n          return true;\n        }\n\n        return false;\n      },\n\n      transformPasted(slice, view) {\n        const schema = view.state.schema;\n        const newContent = transformFragmentsToCallouts(slice.content, schema);\n\n        if (newContent !== slice.content) {\n          return new slice.constructor(\n            newContent,\n            slice.openStart,\n            slice.openEnd\n          );\n        }\n\n        return slice;\n      },\n\n      // Inserts a paragraph when clicking below the last nested callout\n      // in a body, so the user has a place to type after it.\n      //\n      //   ┌─ callout ──────────────┐\n      //   │  Title                 │\n      //   │  ┌─ nested ─────────┐  │\n      //   │  │  ...             │  │\n      //   │  └──────────────────┘  │\n      //   │      click here        │\n      //   └────────────────────────┘\n      handleClick(view, pos) {\n        const { state, dispatch } = view;\n        const $pos = state.doc.resolve(pos);\n        const {\n          callout: calloutType,\n          callout_body: bodyType,\n          paragraph: pType,\n        } = state.schema.nodes;\n\n        if (!calloutType || !bodyType || !pType) {\n          return false;\n        }\n\n        if (view.dom.querySelector(\".callout-chooser-trigger.-expanded\")) {\n          return false;\n        }\n\n        const parent = $pos.parent;\n\n        if (parent.type === bodyType || parent.type === calloutType) {\n          // title: skip if click is at/before the title\n          if (\n            parent.type === calloutType &&\n            (parent.lastChild?.type !== bodyType ||\n              $pos.parentOffset <= parent.child(0).nodeSize)\n          ) {\n            return false;\n          }\n\n          // body: skip if click is not at the end (e.g. above nested callout)\n          if (\n            parent.type === bodyType &&\n            $pos.parentOffset < parent.content.size\n          ) {\n            return false;\n          }\n\n          const bodyNode = parent.type === bodyType ? parent : parent.lastChild;\n\n          const lastChild = bodyNode.lastChild;\n          if (!lastChild || lastChild.type !== calloutType) {\n            return false;\n          }\n\n          const insertPos =\n            parent.type === bodyType\n              ? $pos.end($pos.depth)\n              : $pos.end($pos.depth) - 1;\n\n          const tr = state.tr.insert(insertPos, pType.create());\n          tr.setSelection(TextSelection.create(tr.doc, insertPos + 1));\n          dispatch(tr.scrollIntoView());\n\n          return true;\n        }\n\n        return false;\n      },\n\n      handleKeyDown(view, event) {\n        const { state, dispatch } = view;\n        const { selection, schema } = state;\n        const { $from, empty } = selection;\n\n        if (!empty) {\n          return false;\n        }\n\n        const ctx = { view, $from, schema, dispatch, state, TextSelection };\n\n        const handlers = {\n          ArrowDown: () => handleArrowDown(ctx),\n          ArrowUp: () => handleArrowUp(ctx),\n          Enter: () => handleEnter(ctx, event),\n        };\n\n        return handlers[event.key]?.() || false;\n      },\n      handleDOMEvents: {\n        // Bypasses gapcursor\n        // which intercepts ArrowLeft before handleKeyDown can run.\n        keydown(view, event) {\n          if (event.key === \"ArrowLeft\") {\n            const { state } = view;\n            const { selection, schema } = state;\n            const { $from, empty } = selection;\n\n            if (empty && handleArrowLeft({ view, $from, schema, state })) {\n              event.preventDefault();\n              return true;\n            }\n          }\n\n          return false;\n        },\n\n        dragstart(_view, event) {\n          if (event.target.nodeType === Node.ELEMENT_NODE) {\n            event.target\n              .closest(\".composer-callout-node\")\n              ?.classList.add(\"is-dragging\");\n          }\n        },\n\n        dragend(_view, event) {\n          if (event.target.nodeType === Node.ELEMENT_NODE) {\n            event.target\n              .closest(\".composer-callout-node\")\n              ?.classList.remove(\"is-dragging\");\n          }\n        },\n      },\n    },\n\n    appendTransaction(transactions, oldState, newState) {\n      const { schema } = newState;\n      if (!schema.nodes.callout_title) {\n        return null;\n      }\n\n      const isDefaultRestore = transactions.some((tr) =>\n        tr.getMeta(\"callout:isDefaultTitle\")\n      );\n\n      // On doc changes, track hasCustomTitle and sync hasBody\n      if (transactions.some((tr) => tr.docChanged)) {\n        let tr = null;\n\n        newState.doc.descendants((node, pos) => {\n          if (node.type !== schema.nodes.callout) {\n            return;\n          }\n\n          if (!isDefaultRestore && !node.attrs.hasCustomTitle) {\n            const titleNode = node.child(0);\n            if (titleNode.content.size > 0) {\n              let oldPos = pos;\n              try {\n                for (let i = transactions.length - 1; i >= 0; i--) {\n                  oldPos = transactions[i].mapping.invert().map(oldPos);\n                }\n              } catch {\n                return false;\n              }\n\n              const oldCallout = oldState.doc.nodeAt(oldPos);\n              if (!oldCallout || oldCallout.type !== schema.nodes.callout) {\n                return false;\n              }\n\n              if (!oldCallout.child(0).content.eq(titleNode.content)) {\n                if (!tr) {\n                  tr = newState.tr;\n                }\n                tr.setNodeMarkup(pos, null, {\n                  ...node.attrs,\n                  hasCustomTitle: true,\n                });\n              }\n            }\n          }\n\n          // Sync hasBody attr with actual body content\n          const bodyNode = node.child(1);\n          const hasBody = bodyNode.childCount > 0;\n\n          if (node.attrs.hasBody !== hasBody) {\n            if (!tr) {\n              tr = newState.tr;\n            }\n            const calloutNode = tr.doc.nodeAt(pos);\n            tr.setNodeMarkup(pos, null, {\n              ...calloutNode.attrs,\n              hasBody,\n            });\n\n            const titlePos = pos + 1;\n            const titleNode = tr.doc.nodeAt(titlePos);\n            if (titleNode?.type === schema.nodes.callout_title) {\n              tr.setNodeMarkup(titlePos, null, {\n                ...titleNode.attrs,\n                hasBody,\n              });\n            }\n          }\n        });\n\n        if (tr) {\n          return tr;\n        }\n      }\n\n      // On selection changes, restore default title if user\n      // left an empty callout title\n      if (transactions.some((tr) => tr.selectionSet)) {\n        const calloutTitleType = schema.nodes.callout_title;\n        const oldTitleAncestor = findAncestor(oldState, calloutTitleType);\n\n        if (oldTitleAncestor) {\n          let titlePos = oldTitleAncestor.pos;\n          for (const tr of transactions) {\n            try {\n              titlePos = tr.mapping.map(titlePos);\n            } catch {\n              return null;\n            }\n          }\n\n          const titleNode = newState.doc.nodeAt(titlePos);\n          if (\n            titleNode &&\n            titleNode.type === calloutTitleType &&\n            titleNode.content.size === 0 &&\n            findAncestor(newState, calloutTitleType)?.pos !== titlePos\n          ) {\n            const { type } = titleNode.attrs;\n            const options = findCalloutOptions(type);\n            const defaultTitle = options?.title || capitalizeFirstLetter(type);\n\n            const calloutPos = titlePos - 1;\n\n            const tr = newState.tr\n              .insertText(defaultTitle, titlePos + 1)\n              .setMeta(\"callout:isDefaultTitle\", true);\n\n            const calloutNode = tr.doc.nodeAt(calloutPos);\n\n            if (calloutNode?.attrs.hasCustomTitle) {\n              tr.setNodeMarkup(calloutPos, null, {\n                ...calloutNode.attrs,\n                hasCustomTitle: false,\n              });\n            }\n\n            return tr;\n          }\n        }\n      }\n\n      return null;\n    },\n  });\n\n  const calloutSelectionPlugin = new Plugin({\n    key: new PluginKey(\"calloutSelection\"),\n    props: {\n      handleClickOn(view, pos, node, nodePos, event) {\n        if (node.type.name !== \"callout\") {\n          return false;\n        }\n\n        let target = event.target;\n        const $pos = view.state.doc.resolve(pos);\n\n        if (!target.classList.contains(\"callout-title-inner\")) {\n          if (\n            $pos.nodeBefore?.type.name === \"callout_title\" &&\n            $pos.nodeAfter?.type.name === \"callout_body\"\n          ) {\n            target = target.querySelector(\".callout-title-inner\");\n          } else if (target.classList.contains(\"callout-left-controls\")) {\n            target = null;\n          } else {\n            return false;\n          }\n        }\n\n        // Don't force selection if title content is not empty\n        if (target && !isNodeEmpty(target)) {\n          if (\n            !target.lastChild ||\n            target.lastChild.nodeType !== Node.ELEMENT_NODE ||\n            $pos.textOffset !== 0\n          ) {\n            return false;\n          }\n        }\n\n        const titleNode = node.child(0);\n        const titleEndPos = nodePos + 2 + titleNode.content.size;\n        const tr = view.state.tr.setSelection(\n          TextSelection.create(view.state.doc, titleEndPos)\n        );\n        view.dispatch(tr);\n        return true;\n      },\n    },\n    view() {\n      return {\n        update(view, prevState) {\n          const { selection, schema } = view.state;\n\n          if (selection.eq(prevState.selection)) {\n            return;\n          }\n\n          let activeCalloutPos = null;\n\n          if (selection.node?.type === schema.nodes.callout) {\n            activeCalloutPos = selection.from;\n          } else {\n            const ancestor = findAncestor(view.state, schema.nodes.callout);\n            if (ancestor) {\n              activeCalloutPos = ancestor.pos;\n            }\n          }\n\n          getContext().appEvents.trigger(\n            \"callout:selection-changed\",\n            activeCalloutPos\n          );\n\n          view.dom\n            .querySelectorAll(\".composer-callout-node.has-selection\")\n            .forEach((el) => el.classList.remove(\"has-selection\"));\n\n          if (activeCalloutPos !== null) {\n            view.nodeDOM(activeCalloutPos)?.classList.add(\"has-selection\");\n          }\n        },\n      };\n    },\n  });\n\n  const oneboxMarkerStripPlugin = new Plugin({\n    key: new PluginKey(\"oneboxMarkerStrip\"),\n    appendTransaction(transactions, _oldState, newState) {\n      if (!transactions.some((tr) => tr.docChanged)) {\n        return null;\n      }\n\n      const oneboxType = newState.schema.nodes.onebox;\n      if (!oneboxType) {\n        return null;\n      }\n\n      let tr = null;\n\n      newState.doc.descendants((node, pos) => {\n        if (node.type !== oneboxType) {\n          return;\n        }\n\n        const html = node.attrs.html;\n        if (!html) {\n          return;\n        }\n\n        const stripped = html.replace(CALLOUT_EXCERPT_REGEX, \"\");\n        if (stripped === html) {\n          return;\n        }\n\n        tr ??= newState.tr;\n        tr.setNodeMarkup(pos, null, { ...node.attrs, html: stripped });\n      });\n\n      return tr;\n    },\n  });\n\n  return [calloutPlugin, calloutSelectionPlugin, oneboxMarkerStripPlugin];\n}\n","import { DEFAULT_CALLOUT_TYPE, findCalloutOptions } from \"../config\";\nimport { plugins } from \"./plugins\";\n\nexport const nodeSpec = {\n  callout: {\n    group: \"block\",\n    content: \"callout_title callout_body\",\n    defining: true,\n    createGapCursor: true,\n    selectable: true,\n    draggable: true,\n    attrs: {\n      type: { default: DEFAULT_CALLOUT_TYPE },\n      title: { default: \"\" },\n      fold: { default: \"\" },\n      isCollapsed: { default: false },\n      isCollapsible: { default: false },\n      hasBody: { default: false },\n      hasCustomTitle: { default: false },\n    },\n    toDOM(node) {\n      const { type, fold, isCollapsed, isCollapsible } = node.attrs;\n      const classes = [\"callout\"];\n\n      if (fold !== \"\") {\n        if (isCollapsed) {\n          classes.push(\"is-collapsed\");\n        }\n\n        if (isCollapsible) {\n          classes.push(\"is-collapsible\");\n        }\n      }\n\n      return [\n        \"blockquote\",\n        { class: classes.join(\" \"), \"data-callout-type\": type },\n        0,\n      ];\n    },\n    parseDOM: [\n      {\n        tag: \"blockquote.callout\",\n        getAttrs(dom) {\n          let type = dom.getAttribute(\"data-callout-type\");\n\n          const title =\n            dom.querySelector(\".callout-title-inner\")?.textContent.trim() || \"\";\n\n          const fold = dom.classList.contains(\"is-collapsible\")\n            ? dom.classList.contains(\"is-collapsed\")\n              ? \"-\"\n              : \"+\"\n            : \"\";\n\n          const options = findCalloutOptions(type);\n          const defaultTitle =\n            (options && (options.title || options.label)) || \"\";\n          const hasCustomTitle = title.length > 0 && title !== defaultTitle;\n\n          return { type, title, fold, hasCustomTitle };\n        },\n      },\n    ],\n  },\n\n  callout_title: {\n    content: \"inline*\",\n    defining: true,\n    selectable: true,\n    attrs: {\n      type: { default: DEFAULT_CALLOUT_TYPE },\n      fold: { default: \"\" },\n      isCollapsed: { default: false },\n      isCollapsible: { default: false },\n      hasBody: { default: false },\n    },\n    toDOM() {\n      return [\n        \"div\",\n        { class: \"callout-title\" },\n        [\"span\", { class: \"callout-title-inner\" }, 0],\n      ];\n    },\n    parseDOM: [\n      {\n        tag: \"div.callout-title\",\n        contentElement: \"span.callout-title-inner\",\n      },\n    ],\n  },\n\n  callout_body: {\n    content: \"block*\",\n    defining: true,\n    selectable: false,\n    createGapCursor: true,\n    toDOM() {\n      return [\"div\", { class: \"callout-content\" }, 0];\n    },\n    parseDOM: [{ tag: \"div.callout-content\" }],\n  },\n\n  plugins,\n};\n","import { commands } from \"./commands\";\nimport { inputRules } from \"./input-rules\";\nimport { parse, serializeNode } from \"./markdown\";\nimport { nodeViews } from \"./node-views\";\nimport { plugins } from \"./plugins\";\nimport { nodeSpec } from \"./schema\";\n\n/** @type {RichEditorExtension} */\nconst extension = {\n  name: \"callout\",\n  nodeViews,\n  commands,\n  nodeSpec,\n  parse,\n  serializeNode,\n  inputRules,\n  plugins,\n};\n\nexport default extension;\n","import { action, computed } from \"@ember/object\";\nimport { setOwner } from \"@ember/owner\";\nimport { service } from \"@ember/service\";\nimport { convertIconClass, iconHTML } from \"discourse/lib/icon-library\";\nimport { withPluginApi } from \"discourse/lib/plugin-api\";\nimport { i18n } from \"discourse-i18n\";\nimport Callout from \"../components/callout\";\nimport CalloutChooserPanel from \"../components/callout-chooser-panel\";\nimport {\n  CALLOUT_EXCERPT_REGEX,\n  CALLOUT_REGEX,\n  DEFAULT_CALLOUT_TYPE,\n} from \"../lib/config\";\nimport richEditorExtension from \"../lib/rich-editor-extension/index\";\nimport { createSafeSVG } from \"../lib/svg\";\nimport {\n  capitalizeFirstLetter,\n  collectNodesUntil,\n  firstMeaningfulNode,\n  hexToRGBA,\n  isNodeEmpty,\n  leadingTextFromNode,\n} from \"../lib/utils\";\n\nconst ONEBOX_SELECTOR = \"aside.onebox, aside.quote[data-topic]\";\nconst PENDING_ONEBOX_SELECTOR = \"a.onebox\";\n\nclass QuoteCallouts {\n  @service calloutSettings;\n\n  constructor(owner, api) {\n    setOwner(this, owner);\n    this.api = api;\n    this.hasChatContext = !!api.decorateChatMessage;\n\n    api.registerRichEditorExtension(richEditorExtension);\n\n    const fallbackLocale = window.I18n.fallbackLocale || \"en\";\n    if (!window.I18n.translations[fallbackLocale].js.composer) {\n      window.I18n.translations[fallbackLocale].js.composer = {};\n    }\n    window.I18n.translations[fallbackLocale].js.composer.callout_sample = \"\";\n\n    api.addComposerToolbarPopupMenuOption({\n      action: (toolbarEvent) => {\n        const defaultType = DEFAULT_CALLOUT_TYPE;\n        if (toolbarEvent.commands) {\n          toolbarEvent.commands.insertCallout(defaultType);\n        } else {\n          toolbarEvent.applySurround(\n            `> [!${defaultType}]\\n> `,\n            \" \",\n            \"callout_sample\"\n          );\n        }\n      },\n      icon: \"callout\",\n      label: themePrefix(\"composer.callout\"),\n      shortcut: \"alt+C\",\n    });\n\n    // Add callout to keyboard shortcuts help modal\n    // TODO: Remove this if core generates the list later.\n    api.modifyClass(\"component:modal/keyboard-shortcuts-help\", (Superclass) => {\n      return class extends Superclass {\n        get shortcuts() {\n          const shortcuts = super.shortcuts;\n          if (!shortcuts?.composing?.shortcuts) {\n            return shortcuts;\n          }\n\n          shortcuts.composing.shortcuts.callout = {\n            shortcut: `\n              <span class=\"delimiter-or\" dir=\"ltr\">\n                <kbd>Ctrl</kbd>\n                <kbd>Alt</kbd>\n                <kbd>C</kbd>\n              </span>`,\n            shortcutTexts: [\"Ctrl Alt C\"],\n            description: i18n(themePrefix(\"composer.insert_callout\")),\n          };\n          return shortcuts;\n        }\n      };\n    });\n\n    const instance = this;\n    api.modifyClass(\"component:modal/history\", (Superclass) => {\n      return class extends Superclass {\n        @action\n        async calculateBodyDiff(_, [bodyDiff]) {\n          await super.calculateBodyDiff(_, [bodyDiff]);\n\n          if (this.viewMode === \"side_by_side_markdown\" || !this.bodyDiff) {\n            return;\n          }\n\n          const root = document.createElement(\"div\");\n          root.innerHTML = this.bodyDiff;\n          instance.renderStaticCallouts(root, this.viewMode);\n          this.bodyDiff = root.innerHTML;\n        }\n      };\n    });\n\n    const hasTransformer = api.registerValueTransformer(\n      \"topic-escaped-excerpt\",\n      ({ value }) => value?.replace(CALLOUT_EXCERPT_REGEX, \"\")\n    );\n\n    // Fallback for Discourse < 2026.8\n    if (!hasTransformer) {\n      api.modifyClass(\"model:topic\", (Superclass) => {\n        return class extends Superclass {\n          @computed(\"excerpt\")\n          get escapedExcerpt() {\n            return super.escapedExcerpt?.replace(CALLOUT_EXCERPT_REGEX, \"\");\n          }\n        };\n      });\n    }\n\n    // Strips callout marker only on collapsed quote (see PostQuotedContent)\n    api.modifyClass(\"component:post/cooked-html\", (Superclass) => {\n      return class extends Superclass {\n        get cooked() {\n          const value = super.cooked;\n          const isCollapsedQuote =\n            this.args.cooked &&\n            this.args.className === \"post__contents-cooked-quote\";\n\n          if (!isCollapsedQuote || !value) {\n            return value;\n          }\n\n          // `value` may be a TrustedHTML wrapper. Template re-wraps via `trustHTML`.\n          return value.toString().replace(CALLOUT_EXCERPT_REGEX, \"\");\n        }\n      };\n    });\n\n    api.decorateCookedElement((cooked, helper) => {\n      this.processCookedElement(cooked, helper);\n      return () => this.disconnectPreviewObserver(cooked);\n    });\n\n    if (this.hasChatContext) {\n      api.decorateChatMessage(\n        (element, helper) => {\n          this.processCookedElement(element, helper, { isChat: true });\n        },\n        {\n          id: \"quote-callouts\",\n        }\n      );\n\n      api.registerChatComposerButton?.({\n        id: \"quote-callouts\",\n        icon: \"callout\",\n        label: themePrefix(\"composer.insert_callout\"),\n        position: \"dropdown\",\n        action() {\n          const identifier = \"callout-chooser\";\n          const trigger = document.querySelector(\n            \".chat-composer-dropdown__trigger-btn\"\n          );\n\n          this.menu.show(trigger, {\n            identifier,\n            component: <template>\n              <CalloutChooserPanel\n                @onSelect={{@data.onSelect}}\n                @close={{@data.close}}\n              />\n            </template>,\n            data: {\n              onSelect: (type) => {\n                const markup = `> [!${type}]\\n> `;\n                this.composer.textarea.addText(\n                  this.composer.textarea.getSelected(),\n                  markup\n                );\n                this.composer.focus();\n              },\n              close: () => {\n                this.menu.close(identifier);\n              },\n            },\n          });\n        },\n      });\n    }\n  }\n\n  renderStaticCallouts(element, viewMode) {\n    if (viewMode !== \"inline\" && viewMode !== \"side_by_side\") {\n      return;\n    }\n\n    for (const blockquote of element.querySelectorAll(\"blockquote\")) {\n      if (!blockquote.parentElement) {\n        continue;\n      }\n\n      let typeChanged = false;\n      let previousType;\n\n      if (\n        blockquote.classList.contains(\"diff-ins\") ||\n        blockquote.classList.contains(\"diff-del\")\n      ) {\n        blockquote\n          .querySelectorAll(\"ins, del\")\n          .forEach((node) => node.replaceWith(...node.childNodes));\n        blockquote.normalize();\n      } else {\n        const firstParagraph = blockquote.firstElementChild;\n        if (firstParagraph?.tagName === \"P\") {\n          firstParagraph.innerHTML = firstParagraph.innerHTML.replace(\n            /\\[!.*?\\]/,\n            (marker) => {\n              if (/<ins[\\s>]/.test(marker) && /<del[\\s>]/.test(marker)) {\n                typeChanged = true;\n\n                const oldMarker = marker\n                  .replace(/<ins[^>]*>.*?<\\/ins>/g, \"\")\n                  .replace(/<\\/?del[^>]*>/g, \"\");\n                const oldMatch = oldMarker.match(/^\\[!([^\\]]+)\\]/);\n\n                if (oldMatch) {\n                  previousType = oldMatch[1].toLowerCase();\n                }\n\n                return marker\n                  .replace(/<del[^>]*>.*?<\\/del>/g, \"\")\n                  .replace(/<\\/?ins[^>]*>/g, \"\");\n              }\n              return marker.replace(/<\\/?(?:ins|del)[^>]*>/g, \"\");\n            }\n          );\n        }\n      }\n\n      const preservedClasses = [\"diff-ins\", \"diff-del\"].filter((className) =>\n        blockquote.classList.contains(className)\n      );\n\n      const calloutTree = this.parseHeaders(blockquote);\n      if (calloutTree?.isCallout) {\n        if (typeChanged && previousType) {\n          calloutTree.previousType = previousType;\n        }\n\n        const built = this.buildStaticCallout(calloutTree);\n        preservedClasses.forEach((className) => built.classList.add(className));\n\n        if (typeChanged) {\n          built.classList.add(\"callout-type-changed\");\n        }\n\n        calloutTree.root.replaceWith(built);\n      }\n    }\n\n    if (viewMode !== \"side_by_side\") {\n      return;\n    }\n\n    const sideCallouts = (selector) =>\n      [...element.querySelectorAll(`${selector} .callout`)].filter(\n        (callout) =>\n          !callout.classList.contains(\"diff-ins\") &&\n          !callout.classList.contains(\"diff-del\")\n      );\n    const prevCallouts = sideCallouts(\".revision-content.--previous\");\n    const currCallouts = sideCallouts(\".revision-content.--current\");\n    const pairs = Math.min(prevCallouts.length, currCallouts.length);\n\n    for (let i = 0; i < pairs; i++) {\n      if (\n        prevCallouts[i].dataset.calloutType !==\n        currCallouts[i].dataset.calloutType\n      ) {\n        prevCallouts[i].classList.add(\"callout-type-changed\");\n        currCallouts[i].classList.add(\"callout-type-changed\");\n      }\n    }\n  }\n\n  buildStaticCallout(tree) {\n    const options = this.calloutSettings.find(tree.type);\n    const resolvedType = options?.mainType || options?.type || tree.type;\n    const alias = options?.type ? tree.type : resolvedType;\n    const iconSource = options?.icon || settings.callout_fallback_icon;\n    const color = options?.color || settings.callout_fallback_color;\n\n    const bq = document.createElement(\"blockquote\");\n    bq.className = \"callout\";\n    bq.dataset.calloutType = resolvedType;\n    bq.dataset.calloutAlias = alias;\n    bq.style.setProperty(\"--q-callout-color\", color);\n    bq.style.setProperty(\n      \"--q-callout-background\",\n      hexToRGBA(color, settings.callout_background_opacity / 100)\n    );\n\n    const titleElement = document.createElement(\"div\");\n    titleElement.className = \"callout-title\";\n\n    if (tree.previousType) {\n      const prevOptions = this.calloutSettings.find(tree.previousType);\n      const prevIconSource =\n        prevOptions?.icon || settings.callout_fallback_icon;\n\n      if (prevIconSource) {\n        const prevIcon = document.createElement(\"span\");\n        prevIcon.className = \"callout-icon callout-icon--old\";\n        prevIcon.innerHTML = prevIconSource.startsWith(\"<svg\")\n          ? createSafeSVG(prevIconSource)\n          : iconHTML(convertIconClass(prevIconSource));\n        titleElement.append(prevIcon);\n      }\n    }\n\n    if (iconSource) {\n      const iconElement = document.createElement(\"span\");\n      iconElement.className = tree.previousType\n        ? \"callout-icon callout-icon--new\"\n        : \"callout-icon\";\n      iconElement.innerHTML = iconSource.startsWith(\"<svg\")\n        ? createSafeSVG(iconSource)\n        : iconHTML(convertIconClass(iconSource));\n      titleElement.append(iconElement);\n    }\n\n    const titleInner = document.createElement(\"span\");\n    titleInner.className = \"callout-title-inner\";\n\n    if (tree.title.hasInline && tree.title.nodes.length) {\n      tree.title.nodes.forEach((node) => titleInner.append(node));\n    } else {\n      titleInner.textContent =\n        tree.title.text ||\n        options?.title ||\n        capitalizeFirstLetter(resolvedType);\n    }\n\n    titleElement.append(titleInner);\n    bq.append(titleElement);\n\n    if (tree.children?.length) {\n      const content = document.createElement(\"div\");\n      content.className = \"callout-content\";\n\n      for (const child of tree.children) {\n        if (child.isCallout) {\n          content.append(this.buildStaticCallout(child));\n        } else if (child.content) {\n          content.append(child.content);\n        }\n      }\n\n      bq.append(content);\n    }\n\n    return bq;\n  }\n\n  processCookedElement(element, helper, { isChat = false } = {}) {\n    const isPreview = !isChat && !helper.model;\n    const calloutCounter = { value: 0 };\n\n    // Removes marker from onebox excerpts\n    element\n      .querySelectorAll(ONEBOX_SELECTOR)\n      .forEach((aside) => this.stripMarkerFromExcerpt(aside));\n\n    if (isPreview) {\n      this.observePreviewOneboxes(element);\n    }\n\n    for (const blockquote of element.querySelectorAll(\"blockquote\")) {\n      // Skip if already processed (replaced with container)\n      if (!blockquote.parentElement) {\n        continue;\n      }\n\n      const calloutTrees = this.parseHeaders(blockquote);\n      if (!calloutTrees?.isCallout) {\n        continue;\n      }\n\n      if (isPreview) {\n        this.assignPreviewMetadata(calloutTrees, calloutCounter);\n      }\n\n      const { root } = calloutTrees;\n      const container = document.createElement(\"div\");\n\n      root.replaceWith(container);\n      helper.renderGlimmer(container, Callout, { ...calloutTrees });\n    }\n  }\n\n  stripMarkerFromExcerpt(blockquote) {\n    const walker = document.createTreeWalker(blockquote, NodeFilter.SHOW_TEXT);\n    let node;\n    while ((node = walker.nextNode())) {\n      node.nodeValue = node.nodeValue.replace(CALLOUT_EXCERPT_REGEX, \"\");\n    }\n  }\n\n  // Covers the first time the markdown preview is opened.\n  observePreviewOneboxes(preview) {\n    this.previewObservers ??= new WeakMap();\n\n    if (this.previewObservers.has(preview)) {\n      return;\n    }\n\n    if (!preview.querySelector(PENDING_ONEBOX_SELECTOR)) {\n      return;\n    }\n\n    const observer = new MutationObserver((mutations) => {\n      for (const mutation of mutations) {\n        for (const node of mutation.addedNodes) {\n          if (\n            node.nodeType === Node.ELEMENT_NODE &&\n            node.matches(ONEBOX_SELECTOR)\n          ) {\n            this.stripMarkerFromExcerpt(node);\n          }\n        }\n      }\n\n      if (!preview.querySelector(PENDING_ONEBOX_SELECTOR)) {\n        this.disconnectPreviewObserver(preview);\n      }\n    });\n\n    observer.observe(preview, { childList: true, subtree: true });\n    this.previewObservers.set(preview, observer);\n  }\n\n  disconnectPreviewObserver(preview) {\n    const observer = this.previewObservers?.get(preview);\n    if (observer) {\n      observer.disconnect();\n      this.previewObservers.delete(preview);\n    }\n  }\n\n  parseHeaders(blockquoteElement) {\n    // First element must be a paragraph\n    const firstParagraph = blockquoteElement?.firstElementChild;\n    if (!firstParagraph || firstParagraph.tagName !== \"P\") {\n      return null;\n    }\n\n    // Ignore leading whitespace.\n    // Allow a single inline wrapper around the marker (like accidental strong or em).\n    const first = firstMeaningfulNode(firstParagraph);\n    const leading = leadingTextFromNode(first);\n\n    if (!leading) {\n      return null;\n    }\n\n    // Matches [!<callout>]<fold>? <title>?\n    const match = leading.match(CALLOUT_REGEX);\n    if (!match) {\n      return null;\n    }\n\n    const type = match.groups.callout.toLowerCase() || DEFAULT_CALLOUT_TYPE;\n    const fold = match.groups.fold || \"\";\n    const title = match.groups.title?.trim() || \"\";\n\n    // Strips the marker from the content\n    firstParagraph.innerHTML = firstParagraph.innerHTML\n      .replace(match.groups.marker, \"\")\n      .trimLeft();\n\n    // Supports inline element such as date in the title\n    // Loops through the nodes until a newline appears\n    const { nodes: titleNodes, hasInline: titleHasInline } =\n      this.collectTitleNodes(firstParagraph);\n\n    // Single callout without content\n    if (isNodeEmpty(firstParagraph)) {\n      firstParagraph.remove();\n    }\n\n    // Check recursively blockquotes, treat others as content\n    const children = Array.from(blockquoteElement.children).map((child) => {\n      if (child.tagName === \"BLOCKQUOTE\") {\n        const parsed = this.parseHeaders(child);\n        if (parsed) {\n          return parsed;\n        }\n      }\n      return { content: child, isCallout: false };\n    });\n\n    return {\n      root: blockquoteElement,\n      isCallout: true,\n      type,\n      title: {\n        text: title,\n        nodes: titleNodes,\n        hasInline: titleHasInline,\n      },\n      fold,\n      children,\n    };\n  }\n\n  assignPreviewMetadata(calloutData, counter) {\n    calloutData.isPreview = true;\n    calloutData.calloutIndex = counter.value++;\n\n    if (calloutData.children) {\n      for (const child of calloutData.children) {\n        if (child.isCallout) {\n          this.assignPreviewMetadata(child, counter);\n        }\n      }\n    }\n  }\n\n  collectTitleNodes(paragraphEl) {\n    const nodes = collectNodesUntil(\n      paragraphEl,\n      (node) =>\n        node.nodeName === \"BR\" ||\n        (node.nodeType === Node.TEXT_NODE && node.textContent.startsWith(\"\\n\")),\n      {\n        onStop: (node) => node.remove(),\n      }\n    );\n    const hasInline = nodes.some((node) => node.nodeType === Node.ELEMENT_NODE);\n\n    // Detach nodes from the DOM\n    nodes.forEach((node) => node.remove());\n\n    return {\n      nodes,\n      hasInline,\n    };\n  }\n}\n\nexport default {\n  name: \"discourse-quote-callouts\",\n\n  initialize(owner) {\n    withPluginApi((api) => {\n      this.instance = new QuoteCallouts(owner, api);\n    });\n  },\n\n  teardown() {\n    this.instance = null;\n  },\n};\n","import { tracked } from \"@glimmer/tracking\";\nimport Service from \"@ember/service\";\n\nexport default class CalloutMoveState extends Service {\n  @tracked calloutPos = null;\n\n  get isEnabled() {\n    return this.calloutPos !== null;\n  }\n\n  toggle(pos) {\n    this.calloutPos = this.calloutPos === pos ? null : pos;\n  }\n\n  enable(pos) {\n    this.calloutPos = pos;\n  }\n\n  reset() {\n    this.calloutPos = null;\n  }\n\n  isEnabledFor(pos) {\n    return this.calloutPos === pos;\n  }\n}\n","import * as Mod1 from \"./discourse/api-initializers/callouts\";\nimport * as Mod2 from \"./discourse/components/callout-chooser-panel\";\nimport * as Mod3 from \"./discourse/components/callout-chooser\";\nimport * as Mod4 from \"./discourse/components/callout-node-view\";\nimport * as Mod5 from \"./discourse/components/callout-title-node-view\";\nimport * as Mod6 from \"./discourse/components/callout\";\nimport * as Mod7 from \"./discourse/helpers/icon-or-svg\";\nimport * as Mod8 from \"./discourse/lib/config\";\nimport * as Mod9 from \"./discourse/lib/glimmer-node-view\";\nimport * as Mod10 from \"./discourse/lib/rich-editor-extension/commands\";\nimport * as Mod11 from \"./discourse/lib/rich-editor-extension/index\";\nimport * as Mod12 from \"./discourse/lib/rich-editor-extension/input-rules\";\nimport * as Mod13 from \"./discourse/lib/rich-editor-extension/keyboard\";\nimport * as Mod14 from \"./discourse/lib/rich-editor-extension/markdown\";\nimport * as Mod15 from \"./discourse/lib/rich-editor-extension/node-views\";\nimport * as Mod16 from \"./discourse/lib/rich-editor-extension/paste-handler\";\nimport * as Mod17 from \"./discourse/lib/rich-editor-extension/plugins\";\nimport * as Mod18 from \"./discourse/lib/rich-editor-extension/schema\";\nimport * as Mod19 from \"./discourse/lib/rich-editor-utils\";\nimport * as Mod20 from \"./discourse/lib/svg\";\nimport * as Mod21 from \"./discourse/lib/utils\";\nimport * as Mod22 from \"./discourse/lib/vendor/dom-purify\";\nimport * as Mod23 from \"./discourse/services/callout-move-state\";\nimport * as Mod24 from \"./discourse/services/callout-settings\";\nconst compatModules = {\n  \"discourse/api-initializers/callouts\": Mod1,\n  \"discourse/components/callout-chooser-panel\": Mod2,\n  \"discourse/components/callout-chooser\": Mod3,\n  \"discourse/components/callout-node-view\": Mod4,\n  \"discourse/components/callout-title-node-view\": Mod5,\n  \"discourse/components/callout\": Mod6,\n  \"discourse/helpers/icon-or-svg\": Mod7,\n  \"discourse/lib/config\": Mod8,\n  \"discourse/lib/glimmer-node-view\": Mod9,\n  \"discourse/lib/rich-editor-extension/commands\": Mod10,\n  \"discourse/lib/rich-editor-extension/index\": Mod11,\n  \"discourse/lib/rich-editor-extension/input-rules\": Mod12,\n  \"discourse/lib/rich-editor-extension/keyboard\": Mod13,\n  \"discourse/lib/rich-editor-extension/markdown\": Mod14,\n  \"discourse/lib/rich-editor-extension/node-views\": Mod15,\n  \"discourse/lib/rich-editor-extension/paste-handler\": Mod16,\n  \"discourse/lib/rich-editor-extension/plugins\": Mod17,\n  \"discourse/lib/rich-editor-extension/schema\": Mod18,\n  \"discourse/lib/rich-editor-utils\": Mod19,\n  \"discourse/lib/svg\": Mod20,\n  \"discourse/lib/utils\": Mod21,\n  \"discourse/lib/vendor/dom-purify\": Mod22,\n  \"discourse/services/callout-move-state\": Mod23,\n  \"discourse/services/callout-settings\": Mod24,\n};\nexport { compatModules };\nexport default compatModules;\n","import Service from \"@ember/service\";\nimport {\n  findCalloutOptions,\n  getAllCallouts,\n  getAllCalloutTypes,\n  getChooserCallouts,\n  searchCallouts,\n} from \"../lib/config\";\n\nexport default class CalloutSettings extends Service {\n  allTypes() {\n    return getAllCalloutTypes();\n  }\n\n  all() {\n    return getAllCallouts();\n  }\n\n  chooser() {\n    return getChooserCallouts();\n  }\n\n  find(type) {\n    return findCalloutOptions(type);\n  }\n\n  search(term) {\n    return searchCallouts(term);\n  }\n}\n"],"names":["settings","getObjectForTheme","themePrefix","key","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","x","fun","thisValue","args","Func","arrayForEach","unapply","Array","prototype","forEach","arrayLastIndexOf","lastIndexOf","arrayPop","pop","arrayPush","push","arraySplice","splice","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","objectHasOwnProperty","hasOwnProperty","regExpTest","RegExp","test","typeErrorCreate","func","TypeError","_len2","arguments","length","_key2","thisArg","_len","_key","addToSet","set","array","transformCaseFunc","undefined","l","element","lcElement","cleanArray","index","clone","object","newObject","property","value","isArray","constructor","lookupGetter","prop","desc","get","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","__proto__","NODE_TYPE","getGlobal","window","purify","createDOMPurify","DOMPurify","root","version","removed","document","nodeType","Element","isSupported","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","afterSanitizeAttributes","afterSanitizeElements","afterSanitizeShadowDOM","beforeSanitizeAttributes","beforeSanitizeElements","beforeSanitizeShadowDOM","uponSanitizeAttribute","uponSanitizeElement","uponSanitizeShadowNode","createHTMLDocument","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","writable","configurable","enumerable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","TRUSTED_TYPES_POLICY","createHTML","createScriptURL","purifyHostElement","createPolicy","suffix","ATTR_NAME","hasAttribute","getAttribute","policyName","scriptUrl","_","console","warn","_createTrustedTypesPolicy","ALL_SVG_TAGS","ALL_MATHML_TAGS","_forceRemove","node","removeChild","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createNodeIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","SHOW_PROCESSING_INSTRUCTION","SHOW_CDATA_SECTION","_isClobbered","nodeName","textContent","attributes","namespaceURI","hasChildNodes","_isNode","_executeHooks","currentNode","data","hook","_sanitizeElements","tagName","allowedTags","firstElementChild","_isBasicCustomElement","parentNode","i","childClone","__removalCount","parent","parentTagName","Boolean","_checkValidNamespace","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","attr","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmode","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","entryPoint","hookFunction","removeHook","removeHooks","removeAllHooks","SVG_SANITIZER_CONFIG","ALLOW_NAMESPACES","createSafeSVG","svgString","size","svgElement","SVGSVGElement","iconOrSvg","source","isEmpty","startsWith","htmlSafe","iconHTML","convertIconClass","toggleCalloutCollapse","isCollapsing","onUpdate","classList","add","CSS","supports","addEventListener","once","style","height","scrollHeight","offsetHeight","display","hexToRGBA","hexCode","opacity","hex","parseInt","substring","capitalizeFirstLetter","string","charAt","toUpperCase","slice","isNodeEmpty","hasNoText","hasNoElements","children","hasNoTextNodes","filter","TEXT_NODE","every","collectNodesUntil","stopWhen","onEach","onStop","onEnd","collected","firstMeaningfulNode","child","nextSibling","leadingTextFromNode","ELEMENT_NODE","inner","CALLOUT_EXCERPT_REGEX","CALLOUT_REGEX","CALLOUT_MARKER_REGEX","DEFAULT_CALLOUT_TYPE","callout_fallback_type","cache","getCalloutData","isTesting","callouts","callout","aliases","alias","split","map","type","title","hasExplicitTitle","mainType","buildCalloutData","findCalloutOptions","find","getAllCallouts","getChooserCallouts","getAllCalloutTypes","searchCallouts","term","CalloutChooserPanel","Component","dt7948","g","this","service","calloutSettings","tracked","searchTerm","selectedTypeIndex","filteredCallouts","all","chooser","includes","some","search","event","target","n","action","handleKeydown","items","preventDefault","Math","min","max","item","selectType","focus","preventScroll","next","findIndex","selectedType","onSelect","close","calloutColorStyle","color","bg","callout_fallback_color","callout_background_opacity","trustHTML","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","TextField","i18n","on","didInsert","icon","DropdownMenu","DButton","concatClass","eq","fn","scrollIntoView","isStrictMode","CalloutChooser","menuApi","options","callout_fallback_icon","onRegisterApi","api","onClose","onChange","DMenu","Callout","isCollapsed","contentElement","super","calloutType","fold","setupContent","setupColor","setProperty","preventSelection","detail","toggleCollapse","isCollapsible","onTypeChange","newType","calloutIndex","textarea","querySelector","markerRegex","count","exec","lineStart","prefix","newMarker","setSelectionRange","execCommand","noop","findAncestor","state","attrs","$from","selection","hasAttrs","keys","depth","pos","before","activeCalloutPosFromView","view","schema","nodes","ancestor","buildCallout","bodyNodes","titleText","titleNode","callout_title","bodyContent","paragraph","bodyNode","callout_body","hasCustomTitle","insertBlockAtInlineSelection","tr","$to","blockStart","nodeBefore","hard_break","to","nodeAfter","replaceWith","insertedPos","nodesBetween","nd","afterPos","nodeAt","nodeSize","delete","resolve","stripPrefix","inlineToken","prefixLen","remaining","out","tok","len","splitAtFirstLineBreak","rest","foundBreak","splitIdx","remainder","$cursor","endOfTextblock","parentOffset","changedDescendants","old","cur","f","offset","oldSize","childCount","curSize","outer","j","scan","e","sameMarkup","empty","nodeRanges","isText","relativeFrom","relativeTo","selectionRange","matchedNodeRanges","nodeRange","reduce","sum","commands","utils","insertCallout","dispatch","createCallout","setCursorAtBodyEnd","calloutStart","nearPos","minPos","foundPos","searchEnd","foundNode","bodyEnd","setSelection","near","isNodeActive","d","existingCallout","newCallout","replaceSelectionWith","isBlock","range","blockRange","start","end","inlineContent","calloutPos","inputRules","calloutInputHandler","insertPos","bodyParaPos","handler","parse","blockquote_open","_token","tokens","_bqStack","firstLine","openNode","blockquote","rawCallout","marker","groups","shift","defaultTitle","foldOptions","hasBody","nesting","paragraph_open","top","paragraph_close","closeNode","blockquote_close","kind","topType","serializeNode","only","_offset","render","prev","prevDelim","delim","prevClosed","closed","prevAtBlockStart","atBlockStart","renderInline","titleStr","wrapBlock","write","paraToBlock","flushClose","CalloutNodeView","appEvents","calloutMoveState","activeCalloutPos","hasEmptyBody","needsInsertAfter","canNestUp","canNestDown","canMoveUp","canMoveDown","onSetup","updateState","onSelectionChanged","willDestroy","off","isSelected","getPos","showMoveControls","isEnabledFor","dom","childElementCount","$pos","prevSibling","isNested","isEmptyParagraph","isLeadingEmpty","isTrailingEmpty","hasPrev","hasNext","calloutNode","resolveCallout","finishMove","newCalloutPos","$newPos","enable","trigger","addBody","ctx","bodyContentStart","insert","insertAfter","posAfter","moveUp","prevSiblingPos","shifted","parentCalloutPos","moveDown","nextSiblingPos","afterParentPos","after","nestUp","bodyEndPos","nestDown","nextCalloutPos","nextCalloutNode","update","toggle","or","CalloutTitleNodeView","capabilities","isMoveEnabled","canShowMoreOptions","touch","ignoreMutation","mutation","parentElement","inControls","closest","inTitle","fallbackType","updateNodeMarkup","titlePos","setNodeMarkup","focusEditor","isConnected","setMeta","setFold","deleteCallout","toggleMoveControls","trans","label","className","not","DToggleSwitch","and","GlimmerNodeView","componentInstance","getContext","component","hasContent","buildDOM","addGlimmerNodeView","contentDOM","isInline","setComponentInstance","instance","bind","decorations","innerDecorations","selectNode","deselectNode","stopEvent","destroy","removeGlimmerNodeView","nodeViews","calloutNodeView","calloutTitleNodeView","handleArrowDown","TextSelection","titleAncestor","bodyAncestor","trailingParaPos","calloutAncestor","posAfterCallout","newAfterPos","afterPara","calloutEnd","handleArrowUp","prevNode","lastBodyChild","lastChild","endOfBody","hasTrailingEmpty","titleEndPos","paraPos","handleEnter","titleDepth","handleArrowLeft","titleDOM","nodeDOM","chooserTrigger","click","PLAIN_TEXT_QUOTE_PREFIX","sliceFragment","stripLen","marks","convertBlockquoteToCallout","firstPara","lowerType","foldAttr","titleContent","transformFragmentsToCallouts","buffer","changed","flush","transformed","bq","copy","newNode","newContent","plugins","pmState","Plugin","PluginKey","pmView","Decoration","DecorationSet","pmModel","Fragment","Slice","convertFromMarkdown","calloutPlugin","props","decos","descendants","darker","handlePaste","clipboard","clipboardData","hasHtml","types","plainText","getData","maxOpen","replaceSelection","transformPasted","openStart","openEnd","handleClick","bodyType","pType","handleKeyDown","handlers","ArrowDown","ArrowUp","Enter","handleDOMEvents","keydown","dragstart","_view","dragend","appendTransaction","transactions","oldState","newState","isDefaultRestore","getMeta","docChanged","oldPos","mapping","invert","oldCallout","selectionSet","calloutTitleType","oldTitleAncestor","insertText","calloutSelectionPlugin","handleClickOn","nodePos","contains","textOffset","prevState","querySelectorAll","el","oneboxMarkerStripPlugin","_oldState","oneboxType","onebox","stripped","nodeSpec","group","defining","createGapCursor","selectable","draggable","default","toDOM","classes","class","join","parseDOM","getAttrs","extension","ONEBOX_SELECTOR","PENDING_ONEBOX_SELECTOR","QuoteCallouts","owner","setOwner","hasChatContext","decorateChatMessage","registerRichEditorExtension","richEditorExtension","fallbackLocale","I18n","translations","js","composer","callout_sample","addComposerToolbarPopupMenuOption","toolbarEvent","defaultType","applySurround","shortcut","modifyClass","Superclass","shortcuts","composing","shortcutTexts","description","calculateBodyDiff","bodyDiff","viewMode","renderStaticCallouts","registerValueTransformer","escapedExcerpt","computed","cooked","decorateCookedElement","helper","processCookedElement","disconnectPreviewObserver","isChat","registerChatComposerButton","position","identifier","menu","show","templateOnly","markup","addText","getSelected","previousType","typeChanged","normalize","firstParagraph","oldMatch","preservedClasses","calloutTree","parseHeaders","isCallout","built","buildStaticCallout","sideCallouts","selector","prevCallouts","currCallouts","pairs","dataset","tree","resolvedType","iconSource","calloutAlias","titleElement","prevOptions","prevIconSource","prevIcon","append","iconElement","titleInner","hasInline","isPreview","model","calloutCounter","aside","stripMarkerFromExcerpt","observePreviewOneboxes","calloutTrees","assignPreviewMetadata","container","renderGlimmer","walker","createTreeWalker","nodeValue","preview","previewObservers","WeakMap","has","observer","MutationObserver","mutations","addedNodes","observe","childList","subtree","disconnect","blockquoteElement","leading","trimLeft","titleNodes","titleHasInline","collectTitleNodes","parsed","calloutData","counter","paragraphEl","initialize","withPluginApi","teardown","CalloutMoveState","Service","isEnabled","reset","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12","Mod13","Mod14","Mod15","Mod16","Mod17","Mod18","Mod19","Mod20","Mod21","Mod22","Mod23","allTypes"],"mappings":"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CA,KACA,YACA,MACA,UACA,MACA,SACA,MACA,MACA,KACA,KACA,UACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,UACA,OACA,WACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,SACA,QACA,SACA,SACA,OACA,SACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,QAEI0E,GAAQ1E,EAAO,CACnB,MACA,IACA,WACA,cACA,eACA,eACA,gBACA,mBACA,SACA,WACA,OACA,OACA,UACA,SACA,OACA,IACA,QACA,WACA,QACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,iBACA,OACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,OACA,QACA,OACA,UAEI2E,GAAa3E,EAAO,CACxB,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,iBAMI4E,GAAgB5E,EAAO,CAC3B,UACA,gBACA,SACA,UACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAEI6E,GAAW7E,EAAO,CACtB,OACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,SACA,QACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,aACA,gBAII8E,GAAmB9E,EAAO,CAC9B,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAEI+E,GAAO/E,EAAO,CAAC,UAEfgF,GAAOhF,EAAO,CAClB,SACA,SACA,QACA,MACA,iBACA,eACA,uBACA,WACA,aACA,UACA,SACA,UACA,cACA,cACA,UACA,OACA,QACA,QACA,QACA,OACA,UACA,WACA,eACA,SACA,cACA,WACA,WACA,UACA,MACA,WACA,0BACA,wBACA,WACA,YACA,UACA,eACA,OACA,MACA,UACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,YACA,QACA,OACA,QACA,OACA,OACA,UACA,OACA,MACA,MACA,YACA,QACA,SACA,MACA,YACA,WACA,QACA,OACA,QACA,UACA,aACA,SACA,OACA,UACA,UACA,cACA,cACA,UACA,gBACA,sBACA,SACA,UACA,UACA,aACA,WACA,MACA,WACA,MACA,WACA,OACA,OACA,UACA,aACA,QACA,WACA,QACA,OACA,QACA,OACA,UACA,QACA,MACA,SACA,OACA,QACA,UACA,WACA,QACA,YACA,OACA,SACA,SACA,QACA,QACA,OACA,QACA,SAEIiF,GAAMjF,EAAO,CACjB,gBACA,aACA,WACA,qBACA,YACA,SACA,gBACA,gBACA,UACA,gBACA,iBACA,QACA,OACA,KACA,QACA,OACA,gBACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,KACA,KACA,IACA,KACA,KACA,kBACA,YACA,UACA,UACA,MACA,WACA,YACA,MACA,WACA,OACA,eACA,YACA,SACA,cACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,KACA,KACA,KACA,KACA,aACA,WACA,gBACA,oBACA,SACA,OACA,KACA,kBACA,KACA,MACA,YACA,IACA,KACA,KACA,KACA,KACA,UACA,YACA,aACA,WACA,OACA,eACA,iBACA,eACA,mBACA,iBACA,QACA,aACA,aACA,eACA,eACA,cACA,cACA,mBACA,YACA,MACA,OACA,QACA,SACA,OACA,MACA,OACA,aACA,SACA,WACA,UACA,QACA,SACA,cACA,SACA,WACA,cACA,OACA,aACA,sBACA,mBACA,eACA,SACA,gBACA,sBACA,iBACA,IACA,KACA,KACA,SACA,OACA,OACA,cACA,YACA,UACA,SACA,SACA,QACA,OACA,kBACA,QACA,mBACA,mBACA,eACA,cACA,eACA,cACA,aACA,eACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,SACA,eACA,QACA,eACA,iBACA,WACA,cACA,UACA,UACA,YACA,mBACA,cACA,kBACA,iBACA,aACA,OACA,KACA,KACA,UACA,SACA,UACA,aACA,UACA,aACA,gBACA,gBACA,QACA,eACA,OACA,eACA,mBACA,mBACA,IACA,KACA,KACA,QACA,IACA,KACA,KACA,IACA,eAEIkF,GAASlF,EAAO,CACpB,SACA,cACA,QACA,WACA,QACA,eACA,cACA,aACA,aACA,QACA,MACA,UACA,eACA,WACA,QACA,QACA,SACA,OACA,KACA,UACA,SACA,gBACA,SACA,SACA,iBACA,YACA,WACA,cACA,UACA,UACA,gBACA,WACA,WACA,OACA,WACA,WACA,aACA,UACA,SACA,SACA,cACA,gBACA,uBACA,YACA,YACA,aACA,WACA,iBACA,iBACA,YACA,UACA,QACA,UAEImF,GAAMnF,EAAO,CACjB,aACA,SACA,cACA,YACA,gBAIIoF,GAAgBnF,EAAK,6BACrBoF,GAAWpF,EAAK,yBAChBqF,GAAcrF,EAAK,iBACnBsF,GAAYtF,EAAK,gCACjBuF,GAAYvF,EAAK,kBACjBwF,GAAiBxF,EACrB,6FAEIyF,GAAoBzF,EAAK,yBACzB0F,GAAkB1F,EACtB,+DAEI2F,GAAe3F,EAAK,WACpB4F,GAAiB5F,EAAK;AAE5B,IAAI6F,GAA4B/F,OAAOC,OAAO,CAC5C+F,UAAW,KACXP,aACAG,mBACAE,kBACAN,aACAK,gBACAP,YACAI,kBACAC,qBACAN,iBACAE;AAKF,MAAMU,GACK,EADLA,GAGE,EAHFA,GASoB,EATpBA,GAUK,EAVLA,GAWM,EAKNC,GAAY,WAChB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"}