supamde 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1228 -2
- package/dist/commands/block.d.ts +20 -0
- package/dist/commands/code-indent.d.ts +38 -0
- package/dist/commands/history.d.ts +6 -0
- package/dist/commands/indent.d.ts +28 -0
- package/dist/commands/inline.d.ts +9 -0
- package/dist/commands/keymap.d.ts +8 -0
- package/dist/commands/link-image.d.ts +13 -0
- package/dist/commands/list.d.ts +20 -0
- package/dist/commands/prefixes.d.ts +29 -0
- package/dist/commands/queries.d.ts +25 -0
- package/dist/commands/table.d.ts +7 -0
- package/dist/commands/types.d.ts +17 -0
- package/dist/editor/extensions.d.ts +14 -0
- package/dist/editor/highlight.d.ts +11 -0
- package/dist/editor/link-click.d.ts +53 -0
- package/dist/editor/link-hover-cursor.d.ts +44 -0
- package/dist/editor/math.d.ts +8 -0
- package/dist/editor/setup.d.ts +26 -0
- package/dist/editor/theme.d.ts +7 -0
- package/dist/editor/tokens.d.ts +16 -0
- package/dist/editor/value.d.ts +10 -0
- package/dist/features/autosave.d.ts +31 -0
- package/dist/features/image-upload.d.ts +73 -0
- package/dist/features/storage.d.ts +30 -0
- package/dist/features/upload-dom.d.ts +20 -0
- package/dist/features/upload-placeholder.d.ts +35 -0
- package/dist/features/word-count.d.ts +5 -0
- package/dist/i18n/de.d.ts +3 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/facet.d.ts +9 -0
- package/dist/i18n/translator.d.ts +17 -0
- package/dist/i18n/types.d.ts +82 -0
- package/dist/index.d.ts +133 -0
- package/dist/livepreview/index.d.ts +22 -0
- package/dist/livepreview/plugin.d.ts +3 -0
- package/dist/livepreview/ranges.d.ts +62 -0
- package/dist/markdown/katex-marked.d.ts +20 -0
- package/dist/markdown/parse.d.ts +27 -0
- package/dist/markdown/sanitize.d.ts +6 -0
- package/dist/options.d.ts +83 -0
- package/dist/supamde.css +2 -0
- package/dist/supamde.mjs +3617 -0
- package/dist/supamde.mjs.map +1 -0
- package/dist/ui/actions.d.ts +51 -0
- package/dist/ui/fullscreen.d.ts +16 -0
- package/dist/ui/icons.d.ts +4 -0
- package/dist/ui/inject-styles.d.ts +13 -0
- package/dist/ui/preview.d.ts +27 -0
- package/dist/ui/shortcut-label.d.ts +24 -0
- package/dist/ui/statusbar.d.ts +28 -0
- package/dist/ui/toolbar-config.d.ts +36 -0
- package/dist/ui/toolbar.d.ts +16 -0
- package/dist/ui/update-listener.d.ts +15 -0
- package/dist/util/text-format.d.ts +11 -0
- package/dist/utils/html.d.ts +2 -0
- package/dist/utils/text.d.ts +41 -0
- package/dist/version.d.ts +2 -0
- package/package.json +96 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supamde.mjs","names":["t","Math","Math","toolbarCss","statusbarCss","previewCss","fullscreenCss","de","Marked","VERSION","withoutParentFilter","names","name","hasPrefix","parentName","prefix","DEFAULT_MARK_SETS","isActive","ranges","r","parent","widenBlockMark","line","state","node","text","from","to","computeHiddenRanges","selection","result","tree","syntaxTree","visible","visibleRanges","nodeRef","isInline","marks","isBlock","filter","a","b","merged","range","last","hideMark","Decoration","buildDecorations","view","RangeSet","livePreviewPlugin","ViewPlugin","update","value","EditorView","plugin","EDITOR_MODES","livePreviewExtension","livePreviewCompartment","Compartment","livePreviewFor","mode","resolveEditorMode","resolveCodeIndentUnit","indentUnit","resolveOptions","options","codeIndent","Facet","values","isCodeLine","code","first","codeTreeUpTo","ensureSyntaxTree","upTo","codeIndentAnchor","quoteEnd","hasSpace","colors","fontStack","supaHighlightStyle","HighlightStyle","tags","highlightExtension","syntaxHighlighting","DOLLAR","parseBlockMath","next","cx","start","close","end","parseInlineMath","Math$1","SAFE_SCHEME","BARE_EMAIL","BARE_WWW","URL_CONTINUATION_CHARS","normalizeBareUrl","precedingChar","enclosingLink","current","enclosingBareUrl","linkUrlAt","resolved","pos","link","url","bareUrl","handleLinkMousedown","event","linkClickExtension","LINK_HOVER_CLASS","isLinkModifier","LinkHoverCursorPlugin","shouldShow","linkHoverCursorExtension","supaTheme","LINE_PREFIXES","stripLinePrefix","indent","body","re","m","dedentWidth","width","unit","dispatchLineChanges","changeSet","changes","selectedLineRange","sel","mapSelectedLines","n","change","build","toggleLinePrefix","allHavePrefix","wrapSelection","before","after","resolveEnclosingNode","nodeName","firstSelectedLineText","firstLine","isBold","isItalic","isStrikethrough","isInlineCode","activeHeadingLevel","match","isQuote","isInUnorderedList","isInOrderedList","isInCheckList","applyHeading","existing","oldLen","insert","level","c","setHeading","headingSmaller","headingBigger","quote","codeBlock","pre","post","horizontalRule","cleanBlock","stripped","BULLET_PREFIX","splitBullet","isBullet","toggleBulletList","lines","allHaveMarker","l","marker","markerFrom","bullet","unorderedList","unorderedListStar","checkList","orderedList","allNumbered","counter","len","continuationPrefix","currentPrefix","ordered","continueList","contentFrom","indentLines","textIndent","getIndentUnit","at","missingSpace","dedentLines","textUnit","codeUnit","enclosingNode","spec","unwrap","child","markName","toggle","bold","italic","strikethrough","inlineCode","en","formatText","template","schlüssel","treffer","formatBytes","bytes","FALLBACK_CODE","TIME_FORMAT","isUsable","reference","mergeTexts","layer","layers","key","createIntl","createTranslator","locale","texts","intl","lookup","params","entry","candidate","count","date","defaultTranslator","translatorFacet","insertLink","insertImage","altText","drawLink","drawImage","table","translator","skeleton","headingQuery","BUILTIN_ACTIONS","undo","redo","editor","getAction","DISPLAY_ONLY","bindKeyOf","shortcut","derived","action","extras","deleteMarkupBackward","deleteLine","copyLineDown","copyLineUp","moveLineDown","moveLineUp","supaKeymap","updateListenerExtension","sink","buildExtensions","extensions","markdown","GFM","history","keymap","historyKeymap","defaultKeymap","EditorState","placeholder","extraExtensions","editorFromTextArea","element","textarea","doc","previousDisplay","forceSync","onSubmit","form","readValue","writeValue","val","DEFAULT_TOOLBAR","resolveToolbar","option","items","defaultAttributes","createSVGElement","tag","attrs","children","childElement","createElement","customAttrs","iconNode","ICONS","renderIcon","data","detectMac","nav","formatShortcut","platform","isMac","segments","keySegment","modifiers","formatMac","formatNonMac","normalized","hasMod","hasCmd","hasCtrl","hasAlt","hasShift","mod","upperKey","isSupaLike","buildItem","item","sep","btn","title","label","cmd","activeButtons","run","viewButtons","button","icon","createToolbar","dom","supaLikeWarned","query","active","wordCount","trimmed","DEFAULT_STATUS","BUILTIN_NAMES","STICKY_NAMES","builtinContent","head","createStatusbar","builtins","customs","span","opts","el","found","content","createSideBySide","classes","sync","rerender","syncingFrom","scroller","scheduleGuardReset","release","onEditorScroll","denom","ratio","onPreviewScroll","set","fullscreenCount","savedBodyOverflow","createFullscreen","container","onKeydown","toolbar_default","statusbar_default","preview_default","fullscreen_default","MARKER","CSS","injectStyles","style","I","P","W","A","C","e","t","s","h","o","x","_e","N","$e","Le","ze","G","Ae","J","he","de$1","Ee","V","Me","Y","Ie","Ce","ee","Be","ke","De","qe","te","ue","Ze","He","Ge","Ne","ge","Qe","$","B","Q","je","Fe","fe","Ue","Ke","We","me","Xe","Je","Ye","xe","et","tt","rt","st","ot","ut","pt","ct","ht","dt","be","U","kt","gt","ft","pe","mt","xt","ce","Rt","ne","Tt","X","Ot","j","D","wt","Re","O","Te","se","u","i","L","ie","q","oe","ae","Oe","p","d","Pt","we","y","g","w","f","M","v","Z","le","Pe","ye","K","H","Se","R","S","z","T","_","F","E","k","yt","escapeHtml","resolveKatex","render","katex","expr","raw","katexMarkedExtension","src","token","addAnchorTargetBlank","html","renderOptionsFrom","markdownToHtml","marked","STORAGE_PREFIX","createLocalStorage","full","isStorageAvailable","probe","storage","wert","createAutosave","enabled","delay","ausgangswert","hooks","aktiv","timer","gewarnt","warnEinmal","nachricht","stop","speichere","gespeichert","aktuell","addPlaceholder","StateEffect","removePlaceholder","uploadPlaceholderField","StateField","tr","gemappt","id","effect","kopie","placeholderRange","createIdSource","zähler","DEFAULT_UPLOAD_ACCEPT","STATUS_DONE_MS","STATUS_ERROR_MS","ERROR_TEXT_KEYS","imageMarkdown","alt","validateFile","file","createImageUploader","maxSize","accept","nächsteId","offen","rückfallTimer","zeige","rückfallNach","meldeFehler","werte","kind","ladeEine","fehler","bereich","ursache","files","imageFilesFrom","uploadDropPasteExtension","onFiles","openFilePicker","input","aufräumen","de","SupaMDE","uploadAktiv","uploadExtensions","toolbarOption","eintrag","time","viewDom","itemName","on"],"sources":["../src/version.ts","../src/livepreview/ranges.ts","../src/livepreview/plugin.ts","../src/livepreview/index.ts","../src/options.ts","../src/commands/code-indent.ts","../src/editor/tokens.ts","../src/editor/highlight.ts","../src/editor/math.ts","../src/editor/link-click.ts","../src/editor/link-hover-cursor.ts","../src/editor/theme.ts","../src/commands/prefixes.ts","../src/utils/text.ts","../src/commands/queries.ts","../src/commands/block.ts","../src/commands/list.ts","../src/commands/indent.ts","../src/commands/inline.ts","../src/i18n/en.ts","../src/util/text-format.ts","../src/i18n/translator.ts","../src/i18n/facet.ts","../src/commands/link-image.ts","../src/commands/table.ts","../src/ui/actions.ts","../src/commands/keymap.ts","../src/ui/update-listener.ts","../src/editor/extensions.ts","../src/editor/setup.ts","../src/editor/value.ts","../src/ui/toolbar-config.ts","../node_modules/lucide/dist/esm/defaultAttributes.mjs","../node_modules/lucide/dist/esm/createElement.mjs","../node_modules/lucide/dist/esm/icons/bold.mjs","../node_modules/lucide/dist/esm/icons/code.mjs","../node_modules/lucide/dist/esm/icons/columns-2.mjs","../node_modules/lucide/dist/esm/icons/eraser.mjs","../node_modules/lucide/dist/esm/icons/eye.mjs","../node_modules/lucide/dist/esm/icons/fullscreen.mjs","../node_modules/lucide/dist/esm/icons/heading.mjs","../node_modules/lucide/dist/esm/icons/image-up.mjs","../node_modules/lucide/dist/esm/icons/image.mjs","../node_modules/lucide/dist/esm/icons/italic.mjs","../node_modules/lucide/dist/esm/icons/link.mjs","../node_modules/lucide/dist/esm/icons/list-checks.mjs","../node_modules/lucide/dist/esm/icons/list-ordered.mjs","../node_modules/lucide/dist/esm/icons/list.mjs","../node_modules/lucide/dist/esm/icons/maximize-2.mjs","../node_modules/lucide/dist/esm/icons/minus.mjs","../node_modules/lucide/dist/esm/icons/quote.mjs","../node_modules/lucide/dist/esm/icons/redo.mjs","../node_modules/lucide/dist/esm/icons/square-code.mjs","../node_modules/lucide/dist/esm/icons/strikethrough.mjs","../node_modules/lucide/dist/esm/icons/table.mjs","../node_modules/lucide/dist/esm/icons/undo.mjs","../src/ui/icons.ts","../src/ui/shortcut-label.ts","../src/ui/toolbar.ts","../src/features/word-count.ts","../src/ui/statusbar.ts","../src/ui/preview.ts","../src/ui/fullscreen.ts","../src/ui/toolbar.css?inline","../src/ui/statusbar.css?inline","../src/ui/preview.css?inline","../src/ui/fullscreen.css?inline","../src/ui/inject-styles.ts","../node_modules/marked/lib/marked.esm.js","../src/utils/html.ts","../src/markdown/katex-marked.ts","../src/markdown/sanitize.ts","../src/markdown/parse.ts","../src/features/storage.ts","../src/features/autosave.ts","../src/features/upload-placeholder.ts","../src/features/image-upload.ts","../src/features/upload-dom.ts","../src/i18n/de.ts","../src/index.ts"],"sourcesContent":["/** Aktuelle SupaMDE-Version (wird beim Release synchron zur package.json gehalten). */\nexport const VERSION = '0.1.0';\n","import type { EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNode } from '@lezer/common';\n\n/** Ein auszublendender Dokumentbereich. */\nexport interface HiddenRange {\n from: number;\n to: number;\n}\n\n/**\n * Bedingung an den Elternknoten eines Markers, unter der er als Markup zählt.\n * `undefined` heißt: jeder Elternknoten genügt (keine Einschränkung).\n *\n * Nötig, weil manche Lezer-Knotennamen mehrdeutig sind: `CodeMark` markiert\n * sowohl den Backtick von Inline-Code (Elternknoten `InlineCode`) als auch die\n * Zäune eines Fenced Code Blocks (Elternknoten `FencedCode`); `HeaderMark`\n * markiert sowohl das `#`-Präfix einer ATX-Überschrift (Elternknoten\n * `ATXHeading1`…`ATXHeading6`) als auch die Unterstreichung einer\n * Setext-Überschrift (Elternknoten `SetextHeading1`/`SetextHeading2`). Ohne\n * diese Prüfung würden Fenced Code Blocks und Setext-Überschriften fälschlich\n * als Markup behandelt und im Live-Modus unvollständig bzw. mit einer\n * leeren Zeile dargestellt.\n */\nexport type ParentFilter = (parentName: string) => boolean;\n\n/** Welche Lezer-Knotennamen als Markup gelten, mit optionaler Elternknoten-Bedingung. */\nexport interface MarkSets {\n /** Marker, die exakt ihren eigenen Bereich ausblenden. */\n inline: ReadonlyMap<string, ParentFilter | undefined>;\n /** Marker, deren angrenzendes Leerzeichen mit ausgeblendet wird. */\n block: ReadonlyMap<string, ParentFilter | undefined>;\n}\n\n/** Baut aus einfachen Knotennamen eine `MarkSets`-Menge ohne Elternknoten-Einschränkung. */\nfunction withoutParentFilter(names: readonly string[]): ReadonlyMap<string, ParentFilter | undefined> {\n return new Map(names.map((name) => [name, undefined]));\n}\n\n/** Ob `parentName` mit `prefix` beginnt (z. B. `ATXHeading` für `ATXHeading1`…`ATXHeading6`). */\nfunction hasPrefix(prefix: string): ParentFilter {\n return (parentName) => parentName.startsWith(prefix);\n}\n\n/**\n * Die Marker der aktuell unterstützten Formatierungen. Am realen\n * `@lezer/markdown`-Parser (mit `[GFM, Math]`) verifiziert; `StrikethroughMark`\n * hat bewusst einen eigenen Namen und ist NICHT `EmphasisMark`.\n *\n * `CodeMark` gilt nur mit Elternknoten `InlineCode` als Markup (Fenced Code\n * Blocks bleiben vollständig sichtbar), `HeaderMark` nur mit einem\n * `ATXHeading*`-Elternknoten (Setext-Unterstreichungen bleiben sichtbar).\n * Siehe `ParentFilter` für die Begründung.\n *\n * Exportiert und als Parameter durchgereicht, damit sich der Umfang erweitern\n * lässt (Listen-Marker, Link-Syntax), ohne diese Datei zu editieren.\n */\nexport const DEFAULT_MARK_SETS: MarkSets = {\n inline: new Map<string, ParentFilter | undefined>([\n ...withoutParentFilter(['EmphasisMark', 'StrikethroughMark']),\n ['CodeMark', (parentName) => parentName === 'InlineCode'],\n ]),\n block: new Map<string, ParentFilter | undefined>([\n ...withoutParentFilter(['QuoteMark']),\n ['HeaderMark', hasPrefix('ATXHeading')],\n ]),\n};\n\n/** Ob `parent` einen der Selektionsbereiche berührt (Grenzen zählen als Berührung). */\nfunction isActive(\n parent: { from: number; to: number },\n ranges: readonly { from: number; to: number }[],\n): boolean {\n return ranges.some((r) => r.from <= parent.to && r.to >= parent.from);\n}\n\n/**\n * Erweitert einen Block-Marker um das angrenzende Leerzeichen — begrenzt auf die\n * eigene Zeile, damit eine Zeile aus nur `#` oder `>` nicht in die Folgezeile läuft.\n *\n * Öffnender Marker (`# Titel`): nach rechts. Schließender (`# Titel #`): nach links,\n * damit kein freistehendes Leerzeichen am Zeilenende zurückbleibt.\n */\nfunction widenBlockMark(\n state: EditorState,\n node: SyntaxNode,\n parent: { from: number; to: number },\n): HiddenRange {\n const line = state.doc.lineAt(node.from);\n const text = state.doc.sliceString(line.from, line.to);\n // Schließender Marker: berührt das Ende des Elternknotens.\n const isClosing = node.to >= parent.to;\n\n if (isClosing) {\n let from = node.from;\n while (from > line.from && text[from - line.from - 1] === ' ') from--;\n return { from, to: node.to };\n }\n\n let to = node.to;\n while (to < line.to && text[to - line.from] === ' ') to++;\n return { from: node.from, to };\n}\n\n/**\n * Berechnet die auszublendenden Markup-Bereiche für den Live-Modus.\n *\n * Regel (knoten-genau): Das Markup eines Knotens wird ausgeblendet, solange der\n * Knoten KEINEN Cursor und keinen Selektionsbereich berührt. Sobald der Cursor ihn\n * berührt — Grenzen eingeschlossen —, wird sein Markup sichtbar und normal editierbar.\n *\n * Bezugspunkt ist der ELTERNknoten, nicht der Marker: Bei einem mehrzeiligen\n * Blockquote hängen alle `QuoteMark` am selben `Blockquote`, ein Cursor in einer\n * beliebigen Zeile macht daher die Marker aller Zeilen sichtbar. Bewusst so — das\n * Zitat ist eine Einheit.\n *\n * Reine Funktion: kein DOM, keine View, keine Dekorationen. Rückgabe ist nach `from`\n * aufsteigend sortiert und überlappungsfrei (Vertrag für `RangeSet.of()`, das\n * unsortierte Eingaben mit einem Fehler quittiert).\n */\nexport function computeHiddenRanges(\n state: EditorState,\n visibleRanges: readonly { from: number; to: number }[],\n marks: MarkSets = DEFAULT_MARK_SETS,\n): HiddenRange[] {\n const selection = state.selection.ranges;\n const result: HiddenRange[] = [];\n const tree = syntaxTree(state);\n\n for (const visible of visibleRanges) {\n tree.iterate({\n from: visible.from,\n to: visible.to,\n enter: (nodeRef) => {\n const name = nodeRef.name;\n const isInline = marks.inline.has(name);\n const isBlock = marks.block.has(name);\n if (!isInline && !isBlock) return;\n\n const parent = nodeRef.node.parent;\n if (!parent) return;\n\n // Elternknoten-Bedingung prüfen (z. B. CodeMark nur unter InlineCode).\n const filter = isBlock ? marks.block.get(name) : marks.inline.get(name);\n if (filter && !filter(parent.name)) return;\n\n if (isActive(parent, selection)) return;\n\n result.push(\n isBlock\n ? widenBlockMark(state, nodeRef.node, parent)\n : { from: nodeRef.from, to: nodeRef.to },\n );\n },\n });\n }\n\n // Mehrere sichtbare Bereiche liefern getrennt sortierte Teillisten — global\n // sortieren und Duplikate/Überlappungen an den Bereichsgrenzen zusammenfassen.\n result.sort((a, b) => a.from - b.from || a.to - b.to);\n const merged: HiddenRange[] = [];\n for (const range of result) {\n const last = merged[merged.length - 1];\n if (last && range.from <= last.to) {\n if (range.to > last.to) last.to = range.to;\n continue;\n }\n merged.push({ ...range });\n }\n return merged;\n}\n","import { RangeSet, type Extension } from '@codemirror/state';\nimport {\n Decoration,\n EditorView,\n ViewPlugin,\n type DecorationSet,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { computeHiddenRanges } from './ranges';\n\n/** Blendet einen Bereich vollständig aus (ersetzt ihn durch nichts). */\nconst hideMark = Decoration.replace({});\n\n/** Baut den DecorationSet für den aktuellen View-Zustand. */\nfunction buildDecorations(view: EditorView): DecorationSet {\n const ranges = computeHiddenRanges(view.state, view.visibleRanges);\n return RangeSet.of(\n ranges.map((r) => hideMark.range(r.from, r.to)),\n // Bereits sortiert (Vertrag von computeHiddenRanges), daher kein erneutes Sortieren.\n false,\n );\n}\n\n/**\n * ViewPlugin, das inaktives Markdown-Markup ausblendet.\n *\n * Bewusst ein ViewPlugin und kein StateField: Die Dekoration hängt von der\n * CURSORPOSITION ab, die sich ständig ohne Dokumentänderung ändert. Ein StateField\n * müsste bei jeder Cursorbewegung ohnehin neu rechnen — sein inkrementelles Mapping\n * wäre wertlos — und liefe dabei über das ganze Dokument statt über den sichtbaren\n * Ausschnitt.\n */\nconst hidePlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate): void {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n // Dieselbe Menge speist die atomaren Bereiche. EINE Quelle: ein Drift zwischen\n // \"ausgeblendet\" und \"atomar\" ist damit konstruktiv ausgeschlossen — ein\n // atomarer Bereich ohne Ausblendung machte sichtbaren Text unnavigierbar.\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.decorations ?? Decoration.none),\n },\n);\n\n/** Die fertige Live-Preview-Extension (Ausblenden + atomare Bereiche). */\nexport const livePreviewPlugin: Extension = hidePlugin;\n","import { Compartment, type Extension } from '@codemirror/state';\nimport { livePreviewPlugin } from './plugin';\n\nexport type { HiddenRange, MarkSets } from './ranges';\nexport { computeHiddenRanges, DEFAULT_MARK_SETS } from './ranges';\n\n/**\n * Darstellungsmodus des Editors.\n *\n * - `'source'` — Markdown-Markup bleibt sichtbar (easyMDE-Parität). Default.\n * - `'live'` — Markup wird ausgeblendet und nur am Cursor sichtbar (Obsidian-Stil).\n */\nexport type EditorMode = 'source' | 'live';\n\n/** Alle gültigen Modus-Werte — Grundlage der Options-Normalisierung. */\nexport const EDITOR_MODES: readonly EditorMode[] = ['source', 'live'];\n\n/** Die Live-Preview-Extension: blendet inaktives Markup aus. */\nexport const livePreviewExtension: Extension = livePreviewPlugin;\n\n/**\n * Compartment für den Modus-Wechsel zur Laufzeit. Ein `reconfigure` darauf tauscht\n * die Extension aus, ohne die View neu zu bauen — Dokument, Cursor, Selektion,\n * Undo-Historie und Scrollposition bleiben erhalten.\n */\nexport const livePreviewCompartment = new Compartment();\n\n/** Die zum Modus gehörende Extension (leer im Source-Modus). */\nexport function livePreviewFor(mode: EditorMode): Extension {\n return mode === 'live' ? livePreviewExtension : [];\n}\n","import type { ToolbarOption } from './ui/toolbar-config';\nimport type { StatusOption } from './ui/statusbar';\nimport type { KeyBinding } from '@codemirror/view';\nimport { EDITOR_MODES, type EditorMode } from './livepreview';\nimport type { AutosaveOptions } from './features/autosave';\nimport type { UploadImageOptions } from './features/image-upload';\nimport type { Locale, LocaleTexts } from './i18n/types';\n\n/** Öffentliche Konfigurationsoptionen für SupaMDE (Kern-Set, M1). */\nexport interface SupaMDEOptions {\n /** Das Textarea-Element, an das der Editor gebunden wird. */\n element?: HTMLElement | null;\n /** Zeilenumbruch statt horizontalem Scrollen (Default: true). */\n lineWrapping?: boolean;\n /** Platzhaltertext im leeren Editor. */\n placeholder?: string;\n /** Fokussiert den Editor nach Erzeugung (Default: false). */\n autofocus?: boolean;\n /** Tab-Breite in Spalten (Default: 2). */\n tabSize?: number;\n /** Einrücktiefe in Leerzeichen (Default: 2). */\n indentUnit?: number;\n /** Einrücktiefe in Code-Blöcken: Leerzeichen-Anzahl oder 'tab' (Default: indentUnit). */\n codeIndentUnit?: number | 'tab';\n /** Startwert; überschreibt den Textarea-Inhalt, falls gesetzt. */\n initialValue?: string;\n /** Eigene Tastenkürzel; haben Vorrang vor den SupaMDE-Defaults bei Konflikten. */\n extraKeys?: KeyBinding[];\n /**\n * Darstellungsmodus: `'source'` zeigt das Markdown-Markup (Default),\n * `'live'` blendet es aus und zeigt es nur am Cursor (Obsidian-Stil).\n */\n editorMode?: EditorMode;\n /** Toolbar-Konfiguration: false (aus), oder Liste aus Built-in-Namen/Custom-Buttons. */\n toolbar?: ToolbarOption;\n /** Statusbar-Konfiguration: false (aus), oder Liste aus Built-in-Namen/Custom-Items. */\n status?: StatusOption;\n /** Ersetzt den eingebauten Markdown-Renderer der Vorschau komplett. */\n previewRender?: (text: string) => string;\n /** Zusätzliche CSS-Klasse(n) aufs Vorschau-Panel. */\n previewClass?: string | string[];\n /** marked-Feintuning für die Vorschau. */\n renderingConfig?: { singleLineBreaks?: boolean };\n /** Bidirektionaler Scroll-Sync im Side-by-Side (Default true). */\n syncSideBySidePreviewScroll?: boolean;\n /** Callback bei Fullscreen-Wechsel. */\n onToggleFullScreen?: (active: boolean) => void;\n /**\n * Fügt die SupaMDE-Styles automatisch als `<style>`-Tag in den Head ein\n * (Default: true). Auf `false` setzen, wenn das Host-Projekt die Styles\n * selbst kontrolliert — dann muss `supamde/style.css` manuell eingebunden\n * werden, sonst bleiben Toolbar und Statusbar ungestylt.\n */\n injectStyles?: boolean;\n /**\n * Autosave (M5). Der Inhalt überlebt Absturz, Schließen und Reload.\n * Per Default aus; `key` ist bei `enabled: true` Pflicht.\n */\n autosave?: AutosaveOptions;\n /**\n * Bild-Upload (M5). Drag & Drop, Einfügen aus der Zwischenablage und\n * Dateiauswahl. Per Default aus; `upload` ist Pflicht.\n */\n uploadImage?: UploadImageOptions;\n /** Sprache der UI-Texte (Default: en). */\n locale?: Locale;\n /** Überschreibt einzelne Texte; Vorrang vor `locale`. */\n texts?: Partial<LocaleTexts>;\n}\n\n/** Normalisierte, immer vollständig belegte Optionen für die Extension-Erzeugung. */\nexport interface ResolvedOptions {\n lineWrapping: boolean;\n placeholder: string | null;\n autofocus: boolean;\n tabSize: number;\n indentUnit: number;\n codeIndentUnit: number | 'tab';\n extraKeys: KeyBinding[];\n editorMode: EditorMode;\n}\n\n/**\n * Prüft den Modus-Wert und fällt bei Unsinn auf `'source'` zurück. Bewusst kein\n * Wurf: Ein falscher DARSTELLUNGSmodus darf den Editor nicht am Starten hindern\n * (gleiches Muster wie `resolveToolbar` bei unbekannten Aktionsnamen).\n */\nfunction resolveEditorMode(mode: EditorMode | undefined): EditorMode {\n if (mode === undefined) return 'source';\n if (EDITOR_MODES.includes(mode)) return mode;\n console.warn(`SupaMDE: unknown editorMode \"${String(mode)}\" — using \"source\".`);\n return 'source';\n}\n\n/**\n * Prüft die Code-Einrücktiefe und fällt bei Unsinn mit Warnung auf `indentUnit`\n * zurück — kein Wurf, gleiches Muster wie `resolveEditorMode`.\n */\nfunction resolveCodeIndentUnit(\n value: number | 'tab' | undefined,\n indentUnit: number,\n): number | 'tab' {\n if (value === undefined) return indentUnit;\n if (value === 'tab' || (Number.isInteger(value) && value > 0)) return value;\n console.warn(\n `SupaMDE: invalid codeIndentUnit \"${String(value)}\" — using indentUnit (${indentUnit}).`,\n );\n return indentUnit;\n}\n\n/** Füllt fehlende Optionen mit Defaults und liefert eine vollständige Form. */\nexport function resolveOptions(options: SupaMDEOptions): ResolvedOptions {\n const indentUnit = options.indentUnit ?? 2;\n return {\n lineWrapping: options.lineWrapping ?? true,\n placeholder: options.placeholder ?? null,\n autofocus: options.autofocus ?? false,\n tabSize: options.tabSize ?? 2,\n indentUnit,\n codeIndentUnit: resolveCodeIndentUnit(options.codeIndentUnit, indentUnit),\n extraKeys: options.extraKeys ?? [],\n editorMode: resolveEditorMode(options.editorMode),\n };\n}\n","import { Facet, type EditorState, type Line } from '@codemirror/state';\nimport { ensureSyntaxTree, syntaxTree } from '@codemirror/language';\nimport type { Tree } from '@lezer/common';\n\n/**\n * Einfüge-String für `Tab` in Code-Zeilen (`'\\t'` oder Leerzeichen), gesetzt aus\n * der Option `codeIndentUnit`. `null` = nicht gesetzt — dann gilt in Code-Zeilen\n * dieselbe Einheit wie im Text (`indentUnit`).\n */\nexport const codeIndent = Facet.define<string, string | null>({\n combine: (values) => values[0] ?? null,\n});\n\n/**\n * Liegt die Zeile im Inhalt eines Code-Blocks? Zählt: jede Zeile eines\n * eingerückten `CodeBlock` und die Inhaltszeilen eines `FencedCode`. Die Zaunzeilen\n * selbst zählen als Text; ein ungeschlossener Fenced Block reicht bis Dokumentende.\n *\n * `tree` sollte bis `line.to` geparst sein (siehe `codeTreeUpTo`); ohne Angabe\n * wird der aktuelle, ggf. unvollständige Baum genommen.\n */\nexport function isCodeLine(\n state: EditorState,\n line: Line,\n tree: Tree = syntaxTree(state),\n): boolean {\n let code = false;\n tree.iterate({\n from: line.from,\n to: line.to,\n enter: (node) => {\n if (code) return false;\n if (node.name === 'CodeBlock') {\n code = true;\n return false;\n }\n if (node.name !== 'FencedCode') return undefined;\n // Öffnende Zaunzeile: der Knoten beginnt in dieser Zeile.\n if (node.from >= line.from) return false;\n // Schließende Zaunzeile: abschließender CodeMark (≠ öffnender) in dieser Zeile.\n const first = node.node.firstChild;\n const last = node.node.lastChild;\n const closingHere =\n last !== null &&\n last.name === 'CodeMark' &&\n last.from !== first?.from &&\n last.from >= line.from &&\n last.from <= line.to;\n if (!closingHere) code = true;\n return false;\n },\n });\n return code;\n}\n\n/**\n * Syntaxbaum, der bis `upTo` geparst ist. Eine große Auswahl (z. B. Alles markieren)\n * reicht über den Viewport hinaus, wo der Hintergrund-Parser noch nicht war —\n * dort würden Code-Zeilen sonst als Text gelten. Gelingt das Nachparsen nicht\n * innerhalb des Zeitbudgets, bleibt der vorhandene Baum (bestmöglich).\n */\nexport function codeTreeUpTo(state: EditorState, upTo: number): Tree {\n return ensureSyntaxTree(state, upTo, 200) ?? syntaxTree(state);\n}\n\n/** Wo in einer Code-Zeile die Einrückung beginnt (siehe `codeIndentAnchor`). */\nexport interface CodeIndentAnchor {\n /** Doc-Offset, an dem eingefügt bzw. ausgerückt wird. */\n at: number;\n /** Fehlt hinter dem Zitatzeichen das Leerzeichen, das es „schluckt\"? */\n missingSpace: boolean;\n}\n\n/**\n * Einrück-Position einer Code-Zeile. Ohne Zitat ist das der Zeilenanfang. In einem\n * Zitat liegt sie hinter dem letzten `QuoteMark` der Zeile und einem direkt folgenden\n * Leerzeichen — am Zeilenanfang würde das `>` ab 4 Spalten Einrückung kein\n * Zitatzeichen mehr sein und Standard-Renderer beendeten Zitat und Code-Block.\n */\nexport function codeIndentAnchor(state: EditorState, line: Line, tree: Tree): CodeIndentAnchor {\n let quoteEnd = -1;\n tree.iterate({\n from: line.from,\n to: line.to,\n enter: (node) => {\n if (node.name === 'QuoteMark' && node.from >= line.from && node.to <= line.to) {\n quoteEnd = Math.max(quoteEnd, node.to);\n }\n },\n });\n if (quoteEnd < 0) return { at: line.from, missingSpace: false };\n const hasSpace = state.doc.sliceString(quoteEnd, quoteEnd + 1) === ' ' && quoteEnd < line.to;\n return { at: hasSpace ? quoteEnd + 1 : quoteEnd, missingSpace: !hasSpace };\n}\n","/**\n * Geteilte Style-Tokens für Highlight (`highlight.ts`) und Theme (`theme.ts`).\n * EINE Quelle für Farben und Font-Stack, damit der Feinschliff in M3/M6 nur hier\n * ansetzt. Exakte Werte sind bewusst vorläufig (easyMDE-Look, keine px-Parität).\n */\n\n/** Kern-Farbwerte des SupaMDE-Basis-Looks. */\nexport const colors = {\n /** Blockquote-Text (gedämpftes Grau). */\n quote: '#6a737d',\n /** Links (GitHub-Blau). */\n link: '#0366d6',\n /** Container-Rahmen. */\n border: '#ddd',\n} as const;\n\n/** System-Font-Stack (kein Web-Font-Load in M1). */\nexport const fontStack = 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif';\n","import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport { tags as t } from '@lezer/highlight';\nimport { colors } from './tokens';\n\n/**\n * Kern-Formatierungen für die easyMDE-„Quasi-WYSIWYG\"-Parität: der Markdown-\n * Quelltext bleibt sichtbar, wird aber live formatiert. Farben stammen aus\n * `tokens.ts`; exakte px/Farben sind bewusst NICHT Teil von M1 (Feinschliff\n * folgt in M3/M6, dann nur an der Token-Quelle).\n */\nexport const supaHighlightStyle: HighlightStyle = HighlightStyle.define([\n { tag: t.heading1, fontSize: '1.6em', fontWeight: 'bold' },\n { tag: t.heading2, fontSize: '1.4em', fontWeight: 'bold' },\n { tag: t.heading3, fontSize: '1.25em', fontWeight: 'bold' },\n { tag: t.heading4, fontSize: '1.15em', fontWeight: 'bold' },\n { tag: [t.heading5, t.heading6], fontWeight: 'bold' },\n { tag: t.strong, fontWeight: 'bold' },\n { tag: t.emphasis, fontStyle: 'italic' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.monospace, fontFamily: 'monospace' },\n { tag: t.quote, color: colors.quote, fontStyle: 'italic' },\n { tag: t.link, color: colors.link, textDecoration: 'underline' },\n { tag: t.url, color: colors.link },\n]);\n\n/** Fertige Extension: Syntax-Highlighting mit dem SupaMDE-Stil. */\nexport const highlightExtension: Extension = syntaxHighlighting(supaHighlightStyle);\n","import type { InlineContext, MarkdownConfig } from '@lezer/markdown';\n\nconst DOLLAR = 36; // '$'\n\n/**\n * Erkennt `$$…$$` (BlockMath) eagerly ab der ersten `$`, bevor Emphasis/Link\n * geprüft wird — analog zum InlineCode-Parser aus `@lezer/markdown`. Der\n * Inhalt wird dabei NICHT weiter als Markdown geparst (keine Kind-Knoten),\n * wodurch `**…**`/`[…]()` innerhalb der Formel unangetastet bleiben.\n */\nfunction parseBlockMath(cx: InlineContext, next: number, start: number): number {\n if (next != DOLLAR || cx.char(start + 1) != DOLLAR) return -1;\n const close = cx.text.indexOf('$$', start + 2 - cx.offset);\n if (close < 0) return -1;\n const end = close + cx.offset + 2;\n return cx.addElement(cx.elt('BlockMath', start, end));\n}\n\n/** Erkennt `$…$` (InlineMath) nach demselben Prinzip wie `parseBlockMath`. */\nfunction parseInlineMath(cx: InlineContext, next: number, start: number): number {\n if (next != DOLLAR) return -1;\n const close = cx.text.indexOf('$', start + 1 - cx.offset);\n if (close < 0) return -1;\n const end = close + cx.offset + 1;\n if (end == start + 2) return -1; // `$$` ohne Inhalt: kein leeres InlineMath\n return cx.addElement(cx.elt('InlineMath', start, end));\n}\n\n/**\n * Lezer-Markdown-Extension, die LaTeX-Bereiche (`$…$`, `$$…$$`) als eigene,\n * in sich geschlossene Knoten erkennt. Ohne dies parst der Standard-Parser\n * den Inhalt als normalen Markdown-Fließtext, wodurch z. B. `**…**` oder\n * `[…]()` innerhalb einer Formel fälschlich als Fett/Link interpretiert wird.\n */\nexport const Math: MarkdownConfig = {\n defineNodes: ['InlineMath', 'BlockMath'],\n parseInline: [\n { name: 'BlockMath', before: 'Escape', parse: parseBlockMath },\n { name: 'InlineMath', before: 'Escape', parse: parseInlineMath },\n ],\n};\n","import type { EditorState, Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNode } from '@lezer/common';\n\n/**\n * Nur diese Schemata werden geöffnet — `javascript:` und `data:` sind\n * Angriffsvektoren. `http`/`https` erzwingen zwingend \"//\" — ohne das wäre\n * z.B. \"https:evil.com\" (kein vollständiger Schema-Trenner) fälschlich\n * erlaubt. Dieselbe Konstante dient zwei Zwecken (bewusst EINE einzige\n * Quelle, damit beide nicht wieder auseinanderdriften können — genau das\n * war zuvor die Ursache einer Sicherheitslücke):\n * 1. In `linkUrlAt` als finale Allowlist-Prüfung.\n * 2. In `normalizeBareUrl`, um zu erkennen, ob im Dokumenttext bereits ein\n * Schema steht (dann keine Normalisierung, keine Verdopplung).\n * `mailto:` ist Teil der Allowlist — unkritisch, weil es nur bei explizit im\n * Dokument stehendem `mailto:`-Text oder nach der `normalizeBareUrl`-Prüfung\n * greift und nicht von beliebigem Linktext erzeugt werden kann.\n */\nconst SAFE_SCHEME = /^(https?:\\/\\/|mailto:)/i;\n\n/** Erkennt eine (mutmaßliche) E-Mail-Adresse ohne Schema, z.B. \"foo@example.com\". */\nconst BARE_EMAIL = /^[^\\s@]+@[^\\s@]+$/;\n\n/** Erkennt eine nackte www.-Adresse ohne Schema, z.B. \"www.example.com\". */\nconst BARE_WWW = /^www\\./i;\n\n/**\n * Zeichen, die — unmittelbar vor einem `URL`-Knoten stehend — verraten, dass\n * dieser Knoten NICHT eigenständig ist, sondern Teil einer größeren URL im\n * Dokument. Hintergrund: GFM erzeugt für eine nackte URL mit Benutzerteil\n * (z.B. `https://admin@github.com/repo`) einen `URL`-Knoten NUR für den\n * Teilstring ab dem Benutzernamen (`admin@github.com`) — dieser Teilstring\n * sieht für sich genommen aus wie eine nackte E-Mail-Adresse. Ohne diese\n * Kontextprüfung würde `normalizeBareUrl` daraus fälschlich\n * `mailto:admin@github.com` machen, obwohl im Dokument nie eine E-Mail-Adresse\n * stand — ein Klick hätte dann das Mailprogramm statt die Website geöffnet.\n * `/`, `:`, `@` und `.` decken die Fortsetzung eines Schemas (`https://`,\n * `http:`), eines weiteren Benutzerteils (`user:pass@`) oder eines\n * vorangehenden Hostnamen-Teils ab.\n */\nconst URL_CONTINUATION_CHARS = new Set(['/', ':', '@', '.']);\n\n/**\n * Normalisiert den Text eines nackten `URL`-Knotens (GFM-Autoerkennung ohne\n * Link/Autolink-Elternknoten) zu einer vollständigen URL mit Schema.\n *\n * - Steht bereits ein Schema im Text (`http://`, `https://`, `mailto:`),\n * bleibt der Text unverändert (keine Verdopplung).\n * - `www.example.com` bekommt das Schema `https://` vorangestellt.\n * - Eine nackte E-Mail-Adresse (`@` enthalten, kein Schema) bekommt das\n * Präfix `mailto:` vorangestellt — ABER NUR, wenn `precedingChar` (das\n * Dokumentzeichen unmittelbar vor dem Knoten) keine Fortsetzung einer\n * größeren URL anzeigt (siehe `URL_CONTINUATION_CHARS`). Die Schema-Prüfung\n * läuft dabei ZUERST, damit z.B. `https://user@host/pfad` (URL mit\n * Benutzerteil, hier bereits vollständig im Knoten enthalten) nicht\n * fälschlich als E-Mail behandelt wird.\n * - Erkennt die Kontextprüfung eine Fortsetzung, liefert die Funktion `null`\n * (konservativ: lieber kein Link öffnen als versehentlich das Mailprogramm).\n * - Alles andere (z.B. bereits vollständige http/https-URLs) bleibt unverändert.\n *\n * Reine Funktion — ohne DOM/Editor-State testbar. `precedingChar` ist\n * `undefined`, wenn der Knoten am Dokumentanfang steht.\n */\nexport function normalizeBareUrl(text: string, precedingChar: string | undefined): string | null {\n if (SAFE_SCHEME.test(text)) return text;\n if (BARE_WWW.test(text)) return `https://${text}`;\n if (BARE_EMAIL.test(text)) {\n if (precedingChar !== undefined && URL_CONTINUATION_CHARS.has(precedingChar)) return null;\n return `mailto:${text}`;\n }\n return text;\n}\n\n/** Sucht vom Knoten aufwärts den umschließenden Link- oder Autolink-Knoten. */\nfunction enclosingLink(node: SyntaxNode | null): SyntaxNode | null {\n for (let current = node; current; current = current.parent) {\n if (current.name === 'Link' || current.name === 'Autolink') return current;\n }\n return null;\n}\n\n/**\n * Sucht vom Knoten aufwärts (und, falls nötig, im Knoten selbst) einen\n * `URL`-Knoten OHNE umschließenden `Link`/`Autolink`-Elternknoten — das ist\n * der Fall bei nackten URLs, die GFM direkt unter `Paragraph` erzeugt.\n * `resolveInner` liefert an einer Position innerhalb einer nackten URL\n * entweder den `URL`-Knoten selbst oder einen Nachfahren davon.\n */\nfunction enclosingBareUrl(node: SyntaxNode | null): SyntaxNode | null {\n for (let current = node; current; current = current.parent) {\n if (current.name === 'URL') return current;\n // Sobald ein Link/Autolink erreicht ist, gehört die URL dorthin — das\n // behandelt bereits `enclosingLink`, hier also abbrechen.\n if (current.name === 'Link' || current.name === 'Autolink') return null;\n }\n return null;\n}\n\n/**\n * Liefert die Ziel-URL des Links an `pos`, oder `null`.\n *\n * Deckt drei Fälle ab: Markdown-Links (`[Text](url)`), Autolinks (`<url>`)\n * und nackte URLs (GFM-Autoerkennung, `URL`-Knoten direkt unter `Paragraph`).\n * Bei nackten URLs wird der Text normalisiert (`normalizeBareUrl`), bevor die\n * Schema-Prüfung läuft.\n *\n * `null` bei: keinem Link an der Position, fehlendem URL-Knoten, oder einem\n * normalisierten Schema außerhalb der Allowlist. Reine Funktion — ohne DOM\n * testbar.\n */\nexport function linkUrlAt(state: EditorState, pos: number): string | null {\n const resolved = syntaxTree(state).resolveInner(pos, 0);\n\n const link = enclosingLink(resolved);\n if (link) {\n const url = link.getChild('URL');\n if (!url) return null;\n const text = state.doc.sliceString(url.from, url.to);\n return SAFE_SCHEME.test(text) ? text : null;\n }\n\n const bareUrl = enclosingBareUrl(resolved);\n if (bareUrl) {\n // Zeichen unmittelbar vor dem Knoten: entscheidet, ob eine nackte\n // E-Mail-Adresse eigenständig ist oder Teil einer größeren URL (siehe\n // Doc-Kommentar von `normalizeBareUrl`). `undefined` am Dokumentanfang.\n const precedingChar = bareUrl.from > 0 ? state.doc.sliceString(bareUrl.from - 1, bareUrl.from) : undefined;\n const text = normalizeBareUrl(state.doc.sliceString(bareUrl.from, bareUrl.to), precedingChar);\n if (text === null) return null;\n return SAFE_SCHEME.test(text) ? text : null;\n }\n\n return null;\n}\n\n/**\n * Der mousedown-Handler als benannte Funktion: liefert `true`, wenn er den Klick\n * behandelt hat (Link geöffnet), sonst `false`. Separat exportiert, damit sich\n * die Entscheidungslogik ohne DOM-Layout testen lässt — `event.defaultPrevented`\n * taugt dafür nicht, weil CodeMirror bei simuliertem mousedown selbst\n * `preventDefault()` aufruft (auch mit leerer Extension-Liste).\n */\nexport function handleLinkMousedown(event: MouseEvent, view: EditorView): boolean {\n if (!event.metaKey && !event.ctrlKey) return false;\n\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos === null) return false;\n\n const url = linkUrlAt(view.state, pos);\n if (!url) return false;\n\n // noopener/noreferrer: die geöffnete Seite darf weder auf `window.opener`\n // zugreifen noch den Referrer sehen.\n window.open(url, '_blank', 'noopener,noreferrer');\n event.preventDefault();\n return true;\n}\n\n/**\n * Cmd/Ctrl+Klick öffnet den Link unter dem Zeiger in einem neuen Tab.\n *\n * Bewusst MODUSUNABHÄNGIG (fest in der Extension-Liste, außerhalb des\n * Live-Preview-Compartments) — es gibt keinen Grund, nützliche Navigation an den\n * Darstellungsmodus zu koppeln.\n */\nexport const linkClickExtension: Extension = EditorView.domEventHandlers({\n mousedown: handleLinkMousedown,\n});\n","import { EditorView, ViewPlugin, type PluginValue, type ViewUpdate } from '@codemirror/view';\nimport { linkUrlAt } from './link-click';\n\n/** CSS-Klasse auf `view.contentDOM`, die den Mauszeiger zur Klickhand macht. */\nexport const LINK_HOVER_CLASS = 'supamde-link-hover';\n\n/** Wahr, wenn genau der Modifier gedrückt ist, der Cmd/Ctrl+Klick auslöst. */\nfunction isLinkModifier(event: KeyboardEvent | MouseEvent): boolean {\n return event.ctrlKey || event.metaKey;\n}\n\n/**\n * Hält den Zustand \"Zeiger steht auf einem klickbaren Link UND Modifier ist\n * gedrückt\" und spiegelt ihn als CSS-Klasse auf `view.contentDOM` — wie in\n * VS Code soll der Mauszeiger dann zur Klickhand werden.\n *\n * Die Klasse muss laut Vorgabe SOFORT bei Tastendruck erscheinen (nicht erst\n * bei der nächsten Mausbewegung) und sofort beim Loslassen verschwinden.\n * Deshalb wird zusätzlich zu `mousemove` die zuletzt bekannte Mausposition\n * vorgehalten und bei `keydown`/`keyup` sofort neu bewertet.\n *\n * `keydown`/`keyup` hängen bewusst am `window` und nicht am `view.contentDOM`:\n * Modifier-Tasten sollen auch dann erkannt werden, wenn der Editor gerade\n * nicht fokussiert ist (z.B. Fokus in einem Toolbar-Button), weil der Nutzer\n * die Taste schon VOR dem Zurückbewegen der Maus in den Editor drücken kann.\n * Ein Editor-lokaler Listener würde dieses Timing verpassen.\n */\nclass LinkHoverCursorPlugin implements PluginValue {\n private view: EditorView;\n private lastX = 0;\n private lastY = 0;\n private hasMousePosition = false;\n private modifierDown = false;\n\n // Als gebundene Instanzmethoden gespeichert, damit dieselbe Referenz bei\n // add-/removeEventListener verwendet werden kann (sonst kein Entfernen möglich).\n private readonly onMouseMove = (event: MouseEvent): void => {\n this.lastX = event.clientX;\n this.lastY = event.clientY;\n this.hasMousePosition = true;\n this.updateState();\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!isLinkModifier(event)) return;\n this.modifierDown = true;\n this.updateState();\n };\n\n private readonly onKeyUp = (event: KeyboardEvent): void => {\n // Beim Loslassen EINER der beiden Modifier-Tasten (Ctrl/Meta) sofort neu\n // bewerten — `event.ctrlKey`/`event.metaKey` spiegeln bereits den Zustand\n // NACH dem Loslassen wider.\n if (event.key !== 'Control' && event.key !== 'Meta') return;\n this.modifierDown = event.ctrlKey || event.metaKey;\n this.updateState();\n };\n\n private readonly onBlur = (): void => {\n // Fenster verloren den Fokus (z.B. App-Wechsel bei gehaltenem Cmd) — der\n // Modifier-Zustand ist dann nicht mehr zuverlässig beobachtbar, also\n // zurücksetzen, damit keine \"hängende\" Klickhand stehen bleibt.\n this.modifierDown = false;\n this.updateState();\n };\n\n constructor(view: EditorView) {\n this.view = view;\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n window.addEventListener('blur', this.onBlur);\n }\n\n update(_update: ViewUpdate): void {\n // Nach jeder View-Änderung (z.B. Bearbeitung, Cursorbewegung) neu bewerten:\n // derselbe Bildschirmpunkt kann jetzt auf anderen Dokumentinhalt zeigen.\n //\n // Bewusst NICHT direkt `updateState()`: dessen `posAtCoords()` liest das\n // Editor-Layout, und das ist während eines laufenden View-Updates verboten\n // (\"Reading the editor layout isn't allowed during an update\"). CM6 fing das\n // als \"CodeMirror plugin crashed\" ab, z.B. bei Cmd+Pfeil-links. In der\n // Measure-Phase ist das Lesen erlaubt, also dorthin verschieben.\n if (!this.modifierDown || !this.hasMousePosition) return;\n this.view.requestMeasure({ read: () => this.updateState() });\n }\n\n destroy(): void {\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('blur', this.onBlur);\n }\n\n private updateState(): void {\n const shouldShow = this.modifierDown && this.hasMousePosition && this.pointerIsOverLink();\n this.view.contentDOM.classList.toggle(LINK_HOVER_CLASS, shouldShow);\n }\n\n private pointerIsOverLink(): boolean {\n const pos = this.view.posAtCoords({ x: this.lastX, y: this.lastY });\n if (pos === null) return false;\n return linkUrlAt(this.view.state, pos) !== null;\n }\n}\n\n/**\n * Zeigt beim Hover mit gedrücktem Cmd/Ctrl-Modifier über einem klickbaren\n * Link den Mauszeiger als Klickhand (`cursor: pointer`) — wie in VS Code.\n * Die CSS-Regel dazu steht in `theme.ts` (`.${LINK_HOVER_CLASS}`).\n *\n * Modusunabhängig einzuhängen, analog zu `linkClickExtension`.\n */\nexport const linkHoverCursorExtension = ViewPlugin.fromClass(LinkHoverCursorPlugin);\n","import { EditorView } from '@codemirror/view';\nimport type { Extension } from '@codemirror/state';\nimport { fontStack } from './tokens';\nimport { LINK_HOVER_CLASS } from './link-hover-cursor';\n\n/**\n * Basis-Erscheinungsbild des SupaMDE-Editors (Container, Font, Padding).\n * Ersetzt das CM5-'easymde'-Theme. Farben/Font stammen aus `tokens.ts`;\n * Feinschliff (Farben/Abstände) folgt in M3/M6, dann nur an der Token-Quelle.\n */\nexport const supaTheme: Extension = EditorView.theme({\n // Kein eigener Rahmen: den zieht der `.supamde-container`, der Toolbar,\n // Editor und Statusleiste umschließt (siehe `ui/toolbar.css`).\n '&': {\n fontFamily: fontStack,\n fontSize: '16px',\n },\n '.cm-content': {\n padding: '10px 12px',\n lineHeight: '1.5',\n },\n '.cm-scroller': {\n fontFamily: 'inherit',\n },\n // Klickhand bei Modifier+Hover über einem klickbaren Link (siehe\n // `link-hover-cursor.ts`). Die Klasse landet auf `view.contentDOM`, das\n // bereits `.cm-content` trägt — beide Klassen sitzen also auf demselben\n // Element (kein Nachfahren-Selektor nötig).\n [`.cm-content.${LINK_HOVER_CLASS}`]: {\n cursor: 'pointer',\n },\n});\n","/**\n * Zentrale Definition aller markdown-Zeilen-Präfixe, die von mehreren Command-\n * Modulen erkannt/entfernt werden. Eine einzige Quelle verhindert, dass sich\n * `block.ts`, `list.ts` und `cleanBlock` in ihren Regexes auseinanderentwickeln.\n * Reihenfolge ist bedeutsam: spezifischere Muster (Checkliste) VOR allgemeineren\n * (Aufzählungsstrich) prüfen.\n */\nexport const LINE_PREFIXES: readonly RegExp[] = [\n /^#{1,6} /, // Heading\n /^> /, // Blockzitat\n /^- \\[[ xX]\\] /, // Checkliste (vor \"- \")\n /^\\d+\\. /, // geordnete Liste\n /^[-*] /, // ungeordnete Liste: SupaMDE erzeugt \"* \", erkennt aber auch \"- \"\n];\n\n/**\n * Trennt ein erkanntes Zeilen-Präfix vom Rest der Zeile. Liefert `null`, wenn die\n * Zeile mit keinem bekannten Präfix beginnt.\n *\n * Führender Whitespace (verschachtelte Listen) wird übersprungen und separat als\n * `indent` zurückgegeben — `prefix` bleibt dadurch der reine Marker. Nur so kann\n * `continueList` die Einrückung einer Unterliste fortführen, während `cleanBlock`\n * unverändert ab `line.from + indent.length` genau den Marker entfernt.\n */\nexport function stripLinePrefix(text: string): { indent: string; prefix: string; rest: string } | null {\n const indent = /^[ \\t]*/.exec(text)![0];\n const body = text.slice(indent.length);\n for (const re of LINE_PREFIXES) {\n const m = re.exec(body);\n if (m) return { indent, prefix: m[0], rest: body.slice(m[0].length) };\n }\n return null;\n}\n\n/**\n * Zählt den zu entfernenden führenden Whitespace einer Zeile: bis zu `unit`\n * Leerzeichen, weniger wenn weniger vorhanden sind. Ein führendes Tab-Zeichen\n * zählt als eine vollständige Einrückstufe und wird als Ganzes entfernt.\n * `0`, wenn die Zeile nicht mit Whitespace beginnt.\n */\nexport function dedentWidth(text: string, unit: number): number {\n if (text.startsWith('\\t')) return 1;\n let width = 0;\n while (width < unit && text[width] === ' ') width++;\n return width;\n}\n","import type { EditorState, Line } from '@codemirror/state';\nimport type { EditorView } from '@codemirror/view';\nimport type { DocChange } from '../commands/types';\n\n/**\n * Dispatcht zeilenweise Präfix-Änderungen und mappt die bestehende Selektion mit\n * Rechts-Bias (`assoc: 1`) durch die Änderungen. Ohne diesen Bias lässt CM6 den\n * Cursor an einer Einfügegrenze VOR dem eingefügten Marker stehen — auf einer\n * leeren Zeile (Cursor == Zeilenanfang == Einfüge-`from`) bliebe er dadurch auf\n * Spalte 1 statt hinter dem frisch gesetzten Marker.\n */\nexport function dispatchLineChanges(view: EditorView, changes: DocChange[]): void {\n const changeSet = view.state.changes(changes);\n view.dispatch({\n changes: changeSet,\n selection: view.state.selection.map(changeSet, 1),\n });\n}\n\n/** Der volle Zeilenbereich, den die Hauptselektion berührt. */\nexport interface LineRange {\n /** Doc-Offset am Anfang der ersten berührten Zeile. */\n from: number;\n /** Doc-Offset am Ende der letzten berührten Zeile. */\n to: number;\n /** 1-basierte Nummer der ersten Zeile. */\n firstLine: number;\n /** 1-basierte Nummer der letzten Zeile. */\n lastLine: number;\n}\n\n/** Ermittelt den vollständigen Zeilenbereich der Hauptselektion. */\nexport function selectedLineRange(state: EditorState): LineRange {\n const sel = state.selection.main;\n const first = state.doc.lineAt(sel.from);\n const last = state.doc.lineAt(sel.to);\n return {\n from: first.from,\n to: last.to,\n firstLine: first.number,\n lastLine: last.number,\n };\n}\n\n/**\n * Wendet `build` auf jede von der Hauptselektion berührte Zeile an und dispatcht\n * die gesammelten Änderungen mit Selektionserhalt (siehe `dispatchLineChanges`).\n * `build` liefert `null` für Zeilen ohne Änderung. Bleibt jede Zeile unverändert,\n * wird nicht dispatcht — kein leerer Undo-Schritt. Liefert, ob dispatcht wurde.\n */\nexport function mapSelectedLines(view: EditorView, build: (line: Line) => DocChange | null): boolean {\n const range = selectedLineRange(view.state);\n const changes: DocChange[] = [];\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const change = build(view.state.doc.line(n));\n if (change !== null) changes.push(change);\n }\n if (changes.length === 0) return false;\n dispatchLineChanges(view, changes);\n return true;\n}\n\n/**\n * Toggelt ein Zeilen-Präfix über den Selektions-Zeilenbereich: tragen ALLE\n * Zeilen das Präfix, wird es entfernt, sonst überall hinzugefügt.\n */\nexport function toggleLinePrefix(view: EditorView, prefix: string): boolean {\n const { state } = view;\n const range = selectedLineRange(state);\n const changes: DocChange[] = [];\n\n let allHavePrefix = true;\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = state.doc.line(n);\n if (!line.text.startsWith(prefix)) {\n allHavePrefix = false;\n break;\n }\n }\n\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = state.doc.line(n);\n if (allHavePrefix) {\n changes.push({ from: line.from, to: line.from + prefix.length, insert: '' });\n } else if (!line.text.startsWith(prefix)) {\n changes.push({ from: line.from, to: line.from, insert: prefix });\n }\n }\n\n if (changes.length === 0) return false;\n dispatchLineChanges(view, changes);\n return true;\n}\n\n/**\n * Umschließt die Hauptselektion mit `before`/`after`. Bei leerer Selektion\n * wird ein Marker-Paar eingefügt und der Cursor dazwischen platziert.\n */\nexport function wrapSelection(view: EditorView, before: string, after: string): boolean {\n const sel = view.state.selection.main;\n view.dispatch({\n changes: [\n { from: sel.from, insert: before },\n { from: sel.to, insert: after },\n ],\n selection: sel.empty\n ? { anchor: sel.from + before.length }\n : {\n anchor: sel.from + before.length,\n head: sel.to + before.length,\n },\n });\n return true;\n}\n","import type { EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNode } from '@lezer/common';\nimport { selectedLineRange } from '../utils/text';\n\n/**\n * Die gemeinsame Syntaxbaum-Traversierung: liefert den Knoten namens `nodeName`,\n * der die Hauptselektion umschließt (oder `null`). EINZIGE Quelle dieser\n * Traversierung im Projekt — `inline.ts` setzt hierauf auf (es braucht die Node\n * zum Entfernen der Marker), die Bool-Queries sind `!== null` darüber.\n */\nexport function resolveEnclosingNode(\n state: EditorState,\n nodeName: string,\n): SyntaxNode | null {\n const sel = state.selection.main;\n let node: SyntaxNode | null = syntaxTree(state).resolveInner(sel.from, 1);\n while (node) {\n if (node.name === nodeName && node.from <= sel.from && node.to >= sel.to) {\n return node;\n }\n node = node.parent;\n }\n return null;\n}\n\n/** Text der ersten von der Selektion berührten Zeile. */\nfunction firstSelectedLineText(state: EditorState): string {\n const { firstLine } = selectedLineRange(state);\n return state.doc.line(firstLine).text;\n}\n\nexport function isBold(state: EditorState): boolean {\n return resolveEnclosingNode(state, 'StrongEmphasis') !== null;\n}\n\nexport function isItalic(state: EditorState): boolean {\n return resolveEnclosingNode(state, 'Emphasis') !== null;\n}\n\nexport function isStrikethrough(state: EditorState): boolean {\n return resolveEnclosingNode(state, 'Strikethrough') !== null;\n}\n\nexport function isInlineCode(state: EditorState): boolean {\n return resolveEnclosingNode(state, 'InlineCode') !== null;\n}\n\n/**\n * Aktuelle Heading-Ebene der ersten Selektionszeile (0 = keine). EINZIGE\n * Heading-Regex im Projekt — `block.ts` (`setHeading`, `headingSmaller`,\n * `headingBigger`) ruft diese Funktion statt einer eigenen `currentLevel`.\n * `match[0].length - 1` = #-Zeichen ohne das trennende Leerzeichen (identisch\n * zur bisherigen `currentLevel`-Semantik).\n */\nexport function activeHeadingLevel(state: EditorState): number {\n const match = /^(#{1,6}) /.exec(firstSelectedLineText(state));\n return match ? match[0].length - 1 : 0;\n}\n\nexport function isQuote(state: EditorState): boolean {\n return firstSelectedLineText(state).startsWith('> ');\n}\n\nexport function isInUnorderedList(state: EditorState): boolean {\n const text = firstSelectedLineText(state);\n // Bullet, aber NICHT die Checklisten-Form (die zählt als eigene Query).\n return /^[-*] /.test(text) && !/^- \\[[ xX]\\] /.test(text);\n}\n\nexport function isInOrderedList(state: EditorState): boolean {\n return /^\\d+\\. /.test(firstSelectedLineText(state));\n}\n\nexport function isInCheckList(state: EditorState): boolean {\n return /^- \\[[ xX]\\] /.test(firstSelectedLineText(state));\n}\n","import type { EditorView } from '@codemirror/view';\nimport type { DocChange, SupaCommand } from './types';\nimport { stripLinePrefix } from './prefixes';\nimport { activeHeadingLevel } from './queries';\nimport { selectedLineRange, toggleLinePrefix, wrapSelection } from '../utils/text';\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n/** Setzt jede Selektionszeile auf `level` #-Zeichen; `level === 0` entfernt sie. */\nfunction applyHeading(view: EditorView, level: number): boolean {\n const range = selectedLineRange(view.state);\n const changes: DocChange[] = [];\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = view.state.doc.line(n);\n const existing = /^(#{1,6}) /.exec(line.text);\n const oldLen = existing ? existing[0].length : 0;\n const insert = level === 0 ? '' : '#'.repeat(level) + ' ';\n changes.push({ from: line.from, to: line.from + oldLen, insert });\n }\n const hasRealChange = changes.some((c) => c.from !== c.to || c.insert !== '');\n if (!hasRealChange) return false;\n view.dispatch({ changes });\n return true;\n}\n\n/** Setzt ein absolutes Heading-Level; erneutes Setzen desselben Levels entfernt es. */\nexport function setHeading(level: HeadingLevel): SupaCommand {\n return (view) => applyHeading(view, activeHeadingLevel(view.state) === level ? 0 : level);\n}\n\n/** Verkleinert die Überschrift (mehr #, Grenze 6); aus Klartext wird H1. */\nexport const headingSmaller: SupaCommand = (view) => {\n const next = Math.min(activeHeadingLevel(view.state) + 1, 6);\n return applyHeading(view, next);\n};\n\n/** Vergrößert die Überschrift (weniger #); H1 → Klartext, bleibt bei Klartext. */\nexport const headingBigger: SupaCommand = (view) => {\n const next = Math.max(activeHeadingLevel(view.state) - 1, 0);\n return applyHeading(view, next);\n};\n\n/** Blockzitat (`> `) je Zeile ein-/ausschalten. */\nexport const quote: SupaCommand = (view) => toggleLinePrefix(view, '> ');\n\n/**\n * Umschließt die Selektion mit ```-Fences (Codeblock) bzw. entfernt sie, wenn die\n * Selektion bereits exakt von einem `` ```-Fence-Paar `` umschlossen ist (Toggle).\n */\nexport const codeBlock: SupaCommand = (view) => {\n const sel = view.state.selection.main;\n const before = '```\\n';\n const after = '\\n```';\n const pre = view.state.sliceDoc(Math.max(0, sel.from - before.length), sel.from);\n const post = view.state.sliceDoc(sel.to, Math.min(view.state.doc.length, sel.to + after.length));\n if (pre === before && post === after) {\n // Toggle-Off: die umschließenden Fences entfernen.\n view.dispatch({\n changes: [\n { from: sel.from - before.length, to: sel.from, insert: '' },\n { from: sel.to, to: sel.to + after.length, insert: '' },\n ],\n });\n return true;\n }\n return wrapSelection(view, before, after);\n};\n\n/** Fügt eine horizontale Trennlinie (`\\n---\\n`) an der Cursorzeile ein. */\nexport const horizontalRule: SupaCommand = (view) => {\n const line = view.state.doc.lineAt(view.state.selection.main.head);\n view.dispatch({ changes: { from: line.to, insert: '\\n---\\n' } });\n return true;\n};\n\n/** Entfernt erkannte Block-/Listen-Präfixe (#, >, -, 1., - [ ]) der selektierten Zeilen. */\nexport const cleanBlock: SupaCommand = (view) => {\n const range = selectedLineRange(view.state);\n const changes: DocChange[] = [];\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = view.state.doc.line(n);\n const stripped = stripLinePrefix(line.text);\n if (stripped) {\n // Ab dem Ende der Einrückung schneiden: die Einrückung einer verschachtelten\n // Liste bleibt erhalten, entfernt wird nur der Marker selbst.\n const start = line.from + stripped.indent.length;\n changes.push({ from: start, to: start + stripped.prefix.length, insert: '' });\n }\n }\n if (changes.length === 0) return false;\n view.dispatch({ changes });\n return true;\n};\n","import type { EditorView } from '@codemirror/view';\nimport type { DocChange, SupaCommand } from './types';\nimport { stripLinePrefix } from './prefixes';\nimport { dispatchLineChanges, selectedLineRange, toggleLinePrefix } from '../utils/text';\n\n/**\n * Ein ungeordneter Bullet-Marker (`- ` oder `* `), ohne führende Einrückung.\n * Vollständig verankert (`$`), damit das Checklisten-Präfix `- [ ] ` NICHT als\n * Bullet durchgeht — es beginnt zwar mit `- `, ist aber ein eigener Präfix-Typ.\n */\nconst BULLET_PREFIX = /^[-*] $/;\n\n/**\n * Zerlegt eine Zeile in Einrückung, einen etwaigen Bullet-Marker und die Frage,\n * ob überhaupt ein bekanntes Präfix vorliegt. Checklisten, geordnete Listen,\n * Headings und Zitate liefern `bullet: null` bei `hasPrefix: true` — sie werden\n * vom Bullet-Toggle bewusst nicht angefasst.\n */\nfunction splitBullet(text: string): { indent: string; bullet: string | null; hasPrefix: boolean } {\n const stripped = stripLinePrefix(text);\n if (stripped === null) {\n return { indent: /^[ \\t]*/.exec(text)![0], bullet: null, hasPrefix: false };\n }\n const isBullet = BULLET_PREFIX.test(stripped.prefix);\n return { indent: stripped.indent, bullet: isBullet ? stripped.prefix : null, hasPrefix: true };\n}\n\n/**\n * Toggelt einen ungeordneten Bullet-Marker über die Selektion mit Konvertier-\n * Semantik, sodass NIE ein zweiter Marker davorgesetzt wird:\n * - Tragen ALLE Zeilen bereits exakt `marker`, wird er entfernt (Toggle-Off).\n * - Sonst wird jede Zeile auf `marker` gebracht: ein vorhandener Fremd-Bullet\n * (`- ` ↔ `* `) wird ERSETZT (Konvertierung), Klartextzeilen bekommen `marker`.\n *\n * Alle Eingriffe erfolgen HINTER der Einrückung, damit verschachtelte Listen ihre\n * Ebene behalten; die Einrückung selbst bleibt auch beim Toggle-Off erhalten.\n * Checklisten (`- [ ] `) und geordnete Listen (`1. `) bleiben unberührt.\n */\nfunction toggleBulletList(view: EditorView, marker: '- ' | '* '): boolean {\n const range = selectedLineRange(view.state);\n const lines = [];\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = view.state.doc.line(n);\n lines.push({ from: line.from, ...splitBullet(line.text) });\n }\n\n // Toggle-Off nur, wenn wirklich JEDE Zeile den Ziel-Marker trägt. Nicht-Bullets\n // (Checkliste, geordnet) verhindern das und lösen stattdessen ein Setzen aus.\n const allHaveMarker = lines.every((l) => l.bullet === marker);\n\n const changes: DocChange[] = [];\n for (const line of lines) {\n const { indent, bullet, hasPrefix } = line;\n // Ab hier ist der Marker-Bereich der Zeile: [markerFrom, markerFrom + bullet.length).\n const markerFrom = line.from + indent.length;\n if (allHaveMarker) {\n // Toggle-Off: den (überall gleichen) Marker entfernen, Einrückung behalten.\n changes.push({ from: markerFrom, to: markerFrom + marker.length, insert: '' });\n } else if (bullet !== null) {\n // Fremd-Bullet → auf den Ziel-Marker konvertieren.\n changes.push({ from: markerFrom, to: markerFrom + bullet.length, insert: marker });\n } else if (!hasPrefix) {\n // Klartext → Ziel-Marker hinter der Einrückung setzen.\n changes.push({ from: markerFrom, to: markerFrom, insert: marker });\n }\n // Checkliste/geordnete Liste/Heading/Zitat: keine Änderung.\n }\n\n if (changes.length === 0) return false;\n dispatchLineChanges(view, changes);\n return true;\n}\n\n/** Ungeordnete Liste mit Spiegelstrich (`- `) ein-/ausschalten (Default, Cmd+L). */\nexport const unorderedList: SupaCommand = (view) => toggleBulletList(view, '- ');\n\n/** Ungeordnete Liste mit Sternchen (`* `) ein-/ausschalten (Shift+Alt+Cmd+L). */\nexport const unorderedListStar: SupaCommand = (view) => toggleBulletList(view, '* ');\n\n/** Checkliste (`- [ ] `) je Zeile ein-/ausschalten. */\nexport const checkList: SupaCommand = (view) => toggleLinePrefix(view, '- [ ] ');\n\n/** Geordnete Liste (`1. `, `2. `, …) fortlaufend setzen bzw. entfernen. */\nexport const orderedList: SupaCommand = (view) => {\n const range = selectedLineRange(view.state);\n // Wenn ALLE Zeilen bereits nummeriert sind → entfernen.\n let allNumbered = true;\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n if (!/^\\d+\\. /.test(view.state.doc.line(n).text)) {\n allNumbered = false;\n break;\n }\n }\n const changes: DocChange[] = [];\n let counter = 1;\n for (let n = range.firstLine; n <= range.lastLine; n++) {\n const line = view.state.doc.line(n);\n if (allNumbered) {\n const match = /^\\d+\\. /.exec(line.text);\n const len = match ? match[0].length : 0;\n changes.push({ from: line.from, to: line.from + len, insert: '' });\n } else {\n changes.push({ from: line.from, to: line.from, insert: `${counter}. ` });\n counter++;\n }\n }\n dispatchLineChanges(view, changes);\n return true;\n};\n\n/**\n * Berechnet aus einem erkannten Ist-Präfix das Präfix für die FORTSETZUNGSZEILE:\n * geordnete Listen werden inkrementiert (`3. ` → `4. `), Checklisten starten leer\n * (`- [x] ` → `- [ ] `), ungeordnete behalten ihren Marker (`* ` oder Bestands-`- `).\n * `null`, wenn kein Listenpräfix.\n */\nfunction continuationPrefix(currentPrefix: string): string | null {\n if (/^- \\[[ xX]\\] $/.test(currentPrefix)) return '- [ ] ';\n const ordered = /^(\\d+)\\. $/.exec(currentPrefix);\n if (ordered) return `${Number(ordered[1]) + 1}. `;\n // Bullet-Marker der aktuellen Zeile beibehalten (`* ` oder ein Bestands-`- `).\n if (currentPrefix === '* ' || currentPrefix === '- ') return currentPrefix;\n return null;\n}\n\n/**\n * Enter-Handler für Listen: setzt Einrückung und Präfix in der neuen Zeile fort;\n * ist die aktuelle Listenzeile leer (nur Einrückung + Präfix), wird die Liste\n * beendet — die Zeile wird geleert, der Cursor bleibt an ihrem Anfang stehen.\n * `false`, wenn die Cursorzeile keine Liste ist (Standard-Enter greift dann).\n *\n * Die Präfix-Erkennung teilt sich mit `cleanBlock` die zentrale `stripLinePrefix`\n * (Task 1); nur die Fortsetzungs-Logik (Inkrement) ist listenspezifisch.\n */\nexport function continueList(view: EditorView): boolean {\n const sel = view.state.selection.main;\n const line = view.state.doc.lineAt(sel.head);\n const stripped = stripLinePrefix(line.text);\n if (stripped === null) return false;\n // Heading/Quote sind zwar Präfixe, aber keine Listen → Standard-Enter.\n const prefix = continuationPrefix(stripped.prefix);\n if (prefix === null) return false;\n\n // Steht der Cursor noch IM Präfixbereich (Einrückung oder Marker), gehört er\n // logisch nicht zum Listeninhalt: eine Fortsetzung würde das Präfix vor sich\n // selbst duplizieren (`* Hallo` + Enter an Position 0 → `\\n* * Hallo`). Hier\n // greift bewusst das Standard-Enter, das nur eine Zeile umbricht.\n const contentFrom = line.from + stripped.indent.length + stripped.prefix.length;\n if (sel.from < contentFrom) return false;\n\n if (stripped.rest.length === 0) {\n // Leere Listenzeile → Liste beenden: Einrückung UND Marker entfernen, die Zeile\n // selbst aber behalten. Der Cursor landet dadurch am Anfang derselben Zeile —\n // es entsteht KEINE zusätzliche Leerzeile.\n view.dispatch({\n changes: { from: line.from, to: line.to, insert: '' },\n selection: { anchor: line.from },\n });\n return true;\n }\n\n // Fortsetzung erbt die Einrückung der aktuellen Zeile, damit Unterlisten auf\n // ihrer Ebene bleiben.\n const insert = `\\n${stripped.indent}${prefix}`;\n view.dispatch({\n changes: { from: sel.head, insert },\n selection: { anchor: sel.head + insert.length },\n });\n return true;\n}\n","import { getIndentUnit } from '@codemirror/language';\nimport type { SupaCommand } from './types';\nimport { mapSelectedLines } from '../utils/text';\nimport { dedentWidth } from './prefixes';\nimport { codeIndent, codeIndentAnchor, codeTreeUpTo, isCodeLine } from './code-indent';\n\n/**\n * Rückt alle von der Hauptselektion berührten Zeilen um ein `indentUnit` ein\n * (Leerzeichen, Default 2). Die Einrückung wird IMMER am Zeilenanfang eingefügt,\n * unabhängig davon, wo der Cursor in der Zeile steht — anders als der CM6-\n * Standard `indentWithTab`, der mitten im Text ein Tab-Zeichen setzen würde.\n *\n * In Markdown ergibt sich die Listen-Verschachtelung genau aus dieser\n * Leerzeichen-Einrückung, deshalb braucht es keinen Listen-Sonderfall.\n *\n * Zeilen im Inhalt eines Code-Blocks nutzen stattdessen die Einheit aus dem\n * `codeIndent`-Facet (Option `codeIndentUnit`, ggf. ein Tab-Zeichen) — pro Zeile\n * entschieden, damit eine gemischte Auswahl jede Zeile passend einrückt. In\n * Zitaten wird bei Code-Zeilen hinter dem Zitatzeichen eingefügt (`codeIndentAnchor`).\n */\nexport const indentLines: SupaCommand = (view) => {\n const { state } = view;\n const textIndent = ' '.repeat(getIndentUnit(state));\n const code = state.facet(codeIndent);\n // Nur parsen, wenn sich die Code-Einheit überhaupt vom Text unterscheidet.\n const tree =\n code !== null && code !== textIndent\n ? codeTreeUpTo(state, state.doc.lineAt(state.selection.main.to).to)\n : null;\n mapSelectedLines(view, (line) => {\n if (tree === null || code === null || !isCodeLine(state, line, tree)) {\n return { from: line.from, to: line.from, insert: textIndent };\n }\n const { at, missingSpace } = codeIndentAnchor(state, line, tree);\n return { from: at, to: at, insert: (missingSpace ? ' ' : '') + code };\n });\n // Immer `true`: die Taste wird in jedem Fall konsumiert, damit der Browser\n // den Fokus nicht aus dem Editor bewegt.\n return true;\n};\n\n/**\n * Rückt alle von der Hauptselektion berührten Zeilen um bis zu ein `indentUnit`\n * aus. Zeilen ohne führenden Whitespace bleiben unverändert — der Command gibt\n * dennoch `true` zurück, damit `Shift-Tab` die Taste konsumiert und den Fokus\n * nicht aus dem Editor bewegt.\n *\n * In Code-Zeilen gilt die Code-Einheit: bei Leerzeichen deren Anzahl, bei einem\n * Tab-Zeichen bis zu `tabSize` Leerzeichen (ein führendes Tab entfernt\n * `dedentWidth` ohnehin als Ganzes). In Zitaten wird hinter dem Zitatzeichen\n * ausgerückt.\n */\nexport const dedentLines: SupaCommand = (view) => {\n const { state } = view;\n const textUnit = getIndentUnit(state);\n const code = state.facet(codeIndent);\n const codeUnit = code === null ? textUnit : code === '\\t' ? state.tabSize : code.length;\n // Nur parsen, wenn sich die Code-Einheit überhaupt vom Text unterscheidet.\n const tree =\n codeUnit !== textUnit\n ? codeTreeUpTo(state, state.doc.lineAt(state.selection.main.to).to)\n : null;\n mapSelectedLines(view, (line) => {\n if (tree === null || !isCodeLine(state, line, tree)) {\n const width = dedentWidth(line.text, textUnit);\n return width > 0 ? { from: line.from, to: line.from + width, insert: '' } : null;\n }\n const { at } = codeIndentAnchor(state, line, tree);\n const width = dedentWidth(state.doc.sliceString(at, line.to), codeUnit);\n return width > 0 ? { from: at, to: at + width, insert: '' } : null;\n });\n return true;\n};\n","import type { EditorView } from '@codemirror/view';\nimport type { SyntaxNode } from '@lezer/common';\nimport type { SupaCommand } from './types';\nimport { resolveEnclosingNode } from './queries';\nimport { wrapSelection } from '../utils/text';\n\n/** Lezer-Knoten je Inline-Formatierung + zugehöriger Marker-Kindname. */\ninterface InlineSpec {\n /** Umschließender Syntaxknoten (z. B. StrongEmphasis). */\n node: string;\n /** Name der Marker-Kindknoten (EmphasisMark bzw. CodeMark). */\n mark: string;\n /** Vor der Selektion einzufügender Marker. */\n before: string;\n /** Nach der Selektion einzufügender Marker. */\n after: string;\n}\n\n/** Sucht den umschließenden Knoten `spec.node` um die Selektion (teilt die Traversierung mit queries.ts). */\nfunction enclosingNode(view: EditorView, spec: InlineSpec): SyntaxNode | null {\n return resolveEnclosingNode(view.state, spec.node);\n}\n\n/** Entfernt die Marker-Kinder eines Formatierungs-Knotens (Toggle-Off). */\nfunction unwrap(view: EditorView, node: SyntaxNode, markName: string): boolean {\n const marks: { from: number; to: number }[] = [];\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.name === markName) marks.push({ from: child.from, to: child.to });\n }\n if (marks.length === 0) return false;\n view.dispatch({ changes: marks.map((m) => ({ from: m.from, to: m.to, insert: '' })) });\n return true;\n}\n\nfunction toggle(spec: InlineSpec): SupaCommand {\n return (view) => {\n const node = enclosingNode(view, spec);\n if (node) return unwrap(view, node, spec.mark);\n return wrapSelection(view, spec.before, spec.after);\n };\n}\n\n/** Fettdruck (`**…**`) ein-/ausschalten. */\nexport const bold: SupaCommand = toggle({\n node: 'StrongEmphasis',\n mark: 'EmphasisMark',\n before: '**',\n after: '**',\n});\n\n/** Kursiv (`*…*`) ein-/ausschalten. */\nexport const italic: SupaCommand = toggle({\n node: 'Emphasis',\n mark: 'EmphasisMark',\n before: '*',\n after: '*',\n});\n\n/** Durchstreichen (`~~…~~`) ein-/ausschalten. */\nexport const strikethrough: SupaCommand = toggle({\n node: 'Strikethrough',\n mark: 'StrikethroughMark',\n before: '~~',\n after: '~~',\n});\n\n/** Inline-Code (`` `…` ``) ein-/ausschalten. */\nexport const inlineCode: SupaCommand = toggle({\n node: 'InlineCode',\n mark: 'CodeMark',\n before: '`',\n after: '`',\n});\n","import type { Locale } from './types';\n\n/** Englisch — Default-Sprache und Rückfall für fehlende Schlüssel. Reine Daten. */\nexport const en: Locale = {\n code: 'en',\n texts: {\n 'toolbar.bold': 'Bold',\n 'toolbar.italic': 'Italic',\n 'toolbar.strikethrough': 'Strikethrough',\n 'toolbar.code': 'Inline code',\n 'toolbar.heading-smaller': 'Smaller heading',\n 'toolbar.heading-bigger': 'Bigger heading',\n 'toolbar.heading-1': 'Heading 1',\n 'toolbar.heading-2': 'Heading 2',\n 'toolbar.heading-3': 'Heading 3',\n 'toolbar.heading-4': 'Heading 4',\n 'toolbar.heading-5': 'Heading 5',\n 'toolbar.heading-6': 'Heading 6',\n 'toolbar.quote': 'Blockquote',\n 'toolbar.code-block': 'Code block',\n 'toolbar.horizontal-rule': 'Horizontal rule',\n 'toolbar.clean-block': 'Clear formatting',\n 'toolbar.unordered-list': 'Bulleted list',\n 'toolbar.ordered-list': 'Numbered list',\n 'toolbar.check-list': 'Checklist',\n 'toolbar.link': 'Link',\n 'toolbar.image': 'Image',\n 'toolbar.table': 'Table',\n 'toolbar.undo': 'Undo',\n 'toolbar.redo': 'Redo',\n 'toolbar.side-by-side': 'Side-by-side preview',\n 'toolbar.fullscreen': 'Fullscreen',\n 'toolbar.preview-fullscreen': 'Fullscreen preview',\n 'toolbar.editor-mode': 'Live preview',\n 'toolbar.upload-image': 'Upload image',\n\n 'status.lines': { one: '{count} line', other: '{count} lines' },\n 'status.words': { one: '{count} word', other: '{count} words' },\n 'status.autosaved': 'Saved: {time}',\n\n 'upload.placeholder': '![Uploading {name}…]()',\n 'upload.statusInit': 'Drag an image here or paste it',\n 'upload.statusUploading': 'Uploading {name}…',\n 'upload.statusDone': '{name} uploaded',\n 'upload.errorTooLarge': '{name} is too large (max. {maxSize}).',\n 'upload.errorType': '{name} is not a supported image format.',\n 'upload.errorFailed': 'Upload of {name} failed.',\n\n 'prompt.linkUrl': 'Link URL:',\n 'prompt.imageUrl': 'Image URL:',\n\n 'table.column': 'Column {n}',\n },\n};\n","/**\n * Ersetzt ALLE Vorkommen von `{schlüssel}`. Benannte Platzhalter statt easyMDEs\n * `#image_name#`, und bewusst alle Vorkommen: ein Text darf `{name}` mehrfach\n * verwenden.\n *\n * Eingesetzte Werte werden NICHT erneut durchsucht — enthielte ein Wert selbst\n * `{…}`, hinge das Ergebnis sonst von der Schlüsselreihenfolge ab.\n */\nexport function formatText(template: string, values: Record<string, string>): string {\n return template.replace(/\\{(\\w+)\\}/g, (treffer: string, schlüssel: string): string =>\n Object.prototype.hasOwnProperty.call(values, schlüssel) ? (values[schlüssel] as string) : treffer,\n );\n}\n\n/** Bytes als lesbare Größe — nur für die Anzeige, keine exakte Rechnung. */\nexport function formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) return `${Math.round(bytes / (1024 * 1024))} MB`;\n if (bytes >= 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${bytes} B`;\n}\n","import type { Locale, LocaleTexts, PluralText, PluralTextKey, SimpleTextKey } from './types';\nimport { en } from './en';\nimport { formatText } from '../util/text-format';\n\n/** Liefert die UI-Texte einer Instanz. Einmal pro Instanz erzeugt, danach unveränderlich. */\nexport interface Translator {\n /** Effektiver Locale-Code (nach Gültigkeitsprüfung). */\n readonly code: string;\n /** Einfacher Text mit Platzhaltern. */\n t(key: SimpleTextKey, params?: Record<string, string>): string;\n /** Pluralform zu `count`; setzt `{count}` und weitere Platzhalter ein. */\n plural(key: PluralTextKey, count: number, params?: Record<string, string>): string;\n /** Uhrzeit HH:MM im Format des Locale-Codes. */\n formatTime(date: Date): string;\n}\n\nconst FALLBACK_CODE = 'en';\nconst TIME_FORMAT: Intl.DateTimeFormatOptions = { hour: '2-digit', minute: '2-digit' };\n\n/**\n * Prüft, ob `value` als Wert für einen Schlüssel taugt, dessen en-Wert `reference`\n * ist: ein String für einfache Texte, ein Objekt mit String-`other` für\n * Pluraltexte. Alles andere (undefined, Zahlen, String statt PluralText, …) kommt\n * nur aus JavaScript oder Casts — es fällt still auf die nächste Ebene zurück,\n * statt `undefined` ins UI zu schreiben.\n */\nfunction isUsable(reference: string | PluralText, value: unknown): boolean {\n if (typeof reference === 'string') return typeof value === 'string';\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Partial<PluralText>).other === 'string'\n );\n}\n\n/**\n * Führt die Ebenen zu EINEM vollständigen Textobjekt zusammen; spätere Ebenen\n * haben Vorrang. Iteriert über die en-Schlüssel — unbekannte Schlüssel in\n * `texts` fallen dadurch von selbst heraus. Mutiert keine Eingabe.\n */\nfunction mergeTexts(layers: Array<Partial<LocaleTexts> | undefined>): LocaleTexts {\n const merged: Record<string, string | PluralText> = { ...en.texts };\n for (const layer of layers) {\n if (typeof layer !== 'object' || layer === null) continue;\n for (const key of Object.keys(en.texts) as (keyof LocaleTexts)[]) {\n const value: unknown = layer[key];\n if (isUsable(en.texts[key], value)) merged[key] = value as string | PluralText;\n }\n }\n return merged as unknown as LocaleTexts;\n}\n\n/**\n * Erzeugt Pluralregeln und Zeitformat EINMAL — `plural()` läuft bei jeder\n * Dokumentänderung. Bei ungültigem Code (Intl wirft `RangeError`) genau eine\n * Warnung und Rückfall auf `'en'`: wie bei `resolveEditorMode` darf eine\n * Fehlkonfiguration den Editor nicht am Starten hindern.\n */\nfunction createIntl(code: unknown): {\n code: string;\n rules: Intl.PluralRules;\n time: Intl.DateTimeFormat;\n} {\n if (typeof code === 'string') {\n try {\n return {\n code,\n rules: new Intl.PluralRules(code),\n time: new Intl.DateTimeFormat(code, TIME_FORMAT),\n };\n } catch {\n // fällt auf den Rückfall unten durch\n }\n }\n console.warn(\n `SupaMDE: invalid locale code \"${String(code)}\" — using \"${FALLBACK_CODE}\" for plural rules and time format.`,\n );\n return {\n code: FALLBACK_CODE,\n rules: new Intl.PluralRules(FALLBACK_CODE),\n time: new Intl.DateTimeFormat(FALLBACK_CODE, TIME_FORMAT),\n };\n}\n\n/**\n * Baut den Translator einer Instanz. Rangfolge pro Schlüssel:\n * `texts` → `locale.texts` → `en.texts`.\n */\nexport function createTranslator(locale?: Locale, texts?: Partial<LocaleTexts>): Translator {\n const merged = mergeTexts([locale?.texts, texts]);\n const intl = createIntl(locale == null ? FALLBACK_CODE : locale.code);\n // Für Laufzeitzugriffe mit Schlüsseln, die der Typ nicht kennt (Toolbar-Cast).\n const lookup = merged as unknown as Record<string, unknown>;\n\n return {\n code: intl.code,\n t(key, params = {}) {\n const text = lookup[key];\n return typeof text === 'string' ? formatText(text, params) : key;\n },\n plural(key, count, params = {}) {\n const entry = merged[key];\n const candidate: unknown = entry[intl.rules.select(count)];\n // Nur ein String taugt als Form: `isUsable` prüft bei Pluraltexten nur `other`,\n // eine Zahl oder ein Objekt als Einzelform käme sonst bis `formatText`.\n const form = typeof candidate === 'string' ? candidate : entry.other;\n // `count` zuletzt: der Zählwert ist maßgeblich, auch wenn `params` ihn enthält.\n return formatText(form, { ...params, count: String(count) });\n },\n formatTime(date) {\n return intl.time.format(date);\n },\n };\n}\n","import { Facet } from '@codemirror/state';\nimport { createTranslator, type Translator } from './translator';\n\n/** Englischer Default — stabil, damit `combine` ohne Provider stets dasselbe Objekt liefert. */\nconst defaultTranslator = createTranslator();\n\n/**\n * Der Translator im Editor-State. Commands sind reine `(view) => boolean`-\n * Funktionen ohne Zugriff auf die SupaMDE-Instanz; die Facet ist der\n * idiomatische CM6-Weg, ihnen Konfiguration mitzugeben. Ohne Provider (z. B. in\n * Unit-Tests ohne Instanz) gilt Englisch.\n */\nexport const translatorFacet = Facet.define<Translator, Translator>({\n combine: (values) => values[0] ?? defaultTranslator,\n});\n","import type { EditorView } from '@codemirror/view';\nimport type { SupaCommand } from './types';\nimport { translatorFacet } from '../i18n/facet';\n\n/** Fügt `[text](url)` ein; ohne `text` wird die Selektion verwendet. */\nexport function insertLink(url: string, text?: string): SupaCommand {\n return (view) => {\n if (!url) return false;\n const sel = view.state.selection.main;\n const label = text ?? view.state.sliceDoc(sel.from, sel.to);\n const insert = `[${label}](${url})`;\n view.dispatch({\n changes: { from: sel.from, to: sel.to, insert },\n selection: { anchor: sel.from + insert.length },\n });\n return true;\n };\n}\n\n/** Fügt `` ein; ohne `altText` wird die Selektion verwendet. */\nexport function insertImage(url: string, altText?: string): SupaCommand {\n return (view) => {\n if (!url) return false;\n const sel = view.state.selection.main;\n const alt = altText ?? view.state.sliceDoc(sel.from, sel.to);\n const insert = ``;\n view.dispatch({\n changes: { from: sel.from, to: sel.to, insert },\n selection: { anchor: sel.from + insert.length },\n });\n return true;\n };\n}\n\n/**\n * Toolbar-/Shortcut-Wrapper: fragt die URL per `window.prompt` ab und ruft den\n * reinen `insertLink`. Der Seiteneffekt (Prompt) ist bewusst hier isoliert.\n */\nexport function drawLink(view: EditorView): boolean {\n const url = window.prompt(view.state.facet(translatorFacet).t('prompt.linkUrl'), 'https://');\n if (!url) return false;\n return insertLink(url)(view);\n}\n\n/** Wie `drawLink`, aber für ein Bild (`insertImage`). */\nexport function drawImage(view: EditorView): boolean {\n const url = window.prompt(view.state.facet(translatorFacet).t('prompt.imageUrl'), 'https://');\n if (!url) return false;\n return insertImage(url)(view);\n}\n","import type { SupaCommand } from './types';\nimport { translatorFacet } from '../i18n/facet';\n\n/**\n * Fügt ein GFM-Tabellengerüst (Header, Trennzeile, eine Datenzeile) am Cursor ein.\n * Die Spaltenköpfe kommen aus dem Translator im State — ohne Provider englisch,\n * damit der Command auch ohne SupaMDE-Instanz läuft.\n */\nexport const table: SupaCommand = (view) => {\n const translator = view.state.facet(translatorFacet);\n const column1 = translator.t('table.column', { n: '1' });\n const column2 = translator.t('table.column', { n: '2' });\n const skeleton = `| ${column1} | ${column2} |\\n| --- | --- |\\n| | |\\n`;\n const sel = view.state.selection.main;\n view.dispatch({\n changes: { from: sel.from, to: sel.to, insert: skeleton },\n selection: { anchor: sel.from + skeleton.length },\n });\n return true;\n};\n","import type { EditorState } from '@codemirror/state';\nimport type { SupaCommand } from '../commands/types';\nimport type { EditorMode } from '../livepreview';\nimport { bold, italic, strikethrough, inlineCode } from '../commands/inline';\nimport {\n setHeading,\n headingSmaller,\n headingBigger,\n quote,\n codeBlock,\n horizontalRule,\n cleanBlock,\n} from '../commands/block';\nimport { unorderedList, orderedList, checkList } from '../commands/list';\nimport { drawLink, drawImage } from '../commands/link-image';\nimport { table } from '../commands/table';\nimport { undo, redo } from '../commands/history';\nimport {\n isBold,\n isItalic,\n isStrikethrough,\n isInlineCode,\n isQuote,\n isInUnorderedList,\n isInOrderedList,\n isInCheckList,\n activeHeadingLevel,\n} from '../commands/queries';\n\n/** Plattformabhängiges Anzeige-Kürzel (unverändert). */\ntype Shortcut = string | { default: string; mac: string };\n\n/** Strukturelles Minimal-Interface der SupaMDE-Instanz für view-Aktionen. */\nexport interface SupaLike {\n toggleSideBySide(): void;\n toggleFullScreen(): void;\n isSideBySideActive(): boolean;\n isFullscreenActive(): boolean;\n togglePreviewFullScreen(): void;\n isPreviewFullScreenActive(): boolean;\n toggleEditorMode(): void;\n getEditorMode(): EditorMode;\n /** Startet den Upload für die übergebenen Dateien (M5). */\n uploadImages(files: FileList | File[]): void;\n /** Öffnet die Dateiauswahl (M5). */\n openBrowseFileWindow(): void;\n}\n\n/** Ein Built-in-Toolbar-Eintrag: entweder CM6-Command oder Instanz-Aktion. */\nexport type ToolbarAction =\n | {\n kind: 'command';\n command: SupaCommand;\n query?: (state: EditorState) => boolean;\n icon: string;\n /**\n * Anzeige-Kürzel für den Toolbar-Button-Title. Normalfall: einheitlicher\n * String für alle Plattformen. Für Fälle, in denen macOS eine abweichende\n * Bindung hat (z.B. redo via CM6-`historyKeymap`: `Mod-y` non-Mac,\n * `Mod-Shift-z` auf Mac), ein `{ default, mac }`-Objekt verwenden.\n */\n shortcut?: Shortcut;\n }\n | {\n kind: 'view';\n run: (editor: SupaLike) => void;\n active?: (editor: SupaLike) => boolean;\n icon: string;\n shortcut?: Shortcut;\n };\n\n/** Erzeugt die query für eine absolute Überschrift `level`. */\nfunction headingQuery(level: number): (state: EditorState) => boolean {\n return (state) => activeHeadingLevel(state) === level;\n}\n\n/**\n * Registry: Built-in-Name → ToolbarAction. Die Anzeigetitel stehen NICHT hier,\n * sondern als `toolbar.${name}` in den Locales (`src/i18n/`).\n */\nexport const BUILTIN_ACTIONS: Record<string, ToolbarAction> = {\n bold: { kind: 'command', command: bold, query: isBold, icon: 'bold', shortcut: 'Mod-b' },\n italic: {\n kind: 'command',\n command: italic,\n query: isItalic,\n icon: 'italic',\n shortcut: 'Mod-i',\n },\n strikethrough: {\n kind: 'command',\n command: strikethrough,\n query: isStrikethrough,\n icon: 'strikethrough',\n },\n code: {\n kind: 'command',\n command: inlineCode,\n query: isInlineCode,\n icon: 'code',\n },\n\n 'heading-smaller': {\n kind: 'command',\n command: headingSmaller,\n icon: 'heading',\n shortcut: 'Mod-h',\n },\n 'heading-bigger': {\n kind: 'command',\n command: headingBigger,\n icon: 'heading',\n shortcut: 'Shift-Mod-h',\n },\n 'heading-1': {\n kind: 'command',\n command: setHeading(1),\n query: headingQuery(1),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-1',\n },\n 'heading-2': {\n kind: 'command',\n command: setHeading(2),\n query: headingQuery(2),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-2',\n },\n 'heading-3': {\n kind: 'command',\n command: setHeading(3),\n query: headingQuery(3),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-3',\n },\n 'heading-4': {\n kind: 'command',\n command: setHeading(4),\n query: headingQuery(4),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-4',\n },\n 'heading-5': {\n kind: 'command',\n command: setHeading(5),\n query: headingQuery(5),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-5',\n },\n 'heading-6': {\n kind: 'command',\n command: setHeading(6),\n query: headingQuery(6),\n icon: 'heading',\n shortcut: 'Ctrl-Alt-6',\n },\n\n quote: {\n kind: 'command',\n command: quote,\n query: isQuote,\n icon: 'quote',\n shortcut: \"Mod-'\",\n },\n 'code-block': {\n kind: 'command',\n command: codeBlock,\n icon: 'code-block',\n shortcut: 'Mod-Alt-c',\n },\n 'horizontal-rule': {\n kind: 'command',\n command: horizontalRule,\n icon: 'horizontal-rule',\n },\n 'clean-block': {\n kind: 'command',\n command: cleanBlock,\n icon: 'clean-block',\n shortcut: 'Mod-e',\n },\n\n 'unordered-list': {\n kind: 'command',\n command: unorderedList,\n query: isInUnorderedList,\n icon: 'unordered-list',\n shortcut: 'Mod-l',\n },\n 'ordered-list': {\n kind: 'command',\n command: orderedList,\n query: isInOrderedList,\n icon: 'ordered-list',\n shortcut: 'Mod-Alt-l',\n },\n 'check-list': {\n kind: 'command',\n command: checkList,\n query: isInCheckList,\n icon: 'check-list',\n shortcut: 'Shift-Mod-l',\n },\n\n link: { kind: 'command', command: drawLink, icon: 'link', shortcut: 'Mod-k' },\n image: {\n kind: 'command',\n command: drawImage,\n icon: 'image',\n shortcut: 'Mod-Alt-i',\n },\n table: { kind: 'command', command: table, icon: 'table' },\n\n undo: { kind: 'command', command: undo, icon: 'undo', shortcut: 'Mod-z' },\n // Auf Mac bindet CM6s historyKeymap redo an Mod-Shift-z statt Mod-y (siehe\n // editor/extensions.ts) — das plattformabhängige Kürzel-Objekt sorgt dafür, dass\n // der Toolbar-Button-Title auf Mac das tatsächlich wirksame Kürzel anzeigt.\n redo: {\n kind: 'command',\n command: redo,\n icon: 'redo',\n shortcut: { default: 'Mod-y', mac: 'Mod-Shift-z' },\n },\n\n 'side-by-side': {\n kind: 'view',\n run: (editor) => editor.toggleSideBySide(),\n active: (editor) => editor.isSideBySideActive(),\n icon: 'side-by-side',\n shortcut: 'F9',\n },\n fullscreen: {\n kind: 'view',\n run: (editor) => editor.toggleFullScreen(),\n active: (editor) => editor.isFullscreenActive(),\n icon: 'fullscreen',\n // F11 bleibt gebunden, wird aber auf Mac vom OS abgefangen — deshalb zeigt der\n // Button-Title dort das zuverlässig funktionierende Mod-Shift-F (siehe index.ts).\n shortcut: { default: 'F11', mac: 'Mod-Shift-F' },\n },\n 'preview-fullscreen': {\n kind: 'view',\n run: (editor) => editor.togglePreviewFullScreen(),\n active: (editor) => editor.isPreviewFullScreenActive(),\n icon: 'preview-fullscreen',\n shortcut: 'F8',\n },\n 'editor-mode': {\n kind: 'view',\n run: (editor) => editor.toggleEditorMode(),\n active: (editor) => editor.getEditorMode() === 'live',\n icon: 'editor-mode',\n shortcut: 'F10',\n },\n 'upload-image': {\n kind: 'view',\n run: (editor) => editor.openBrowseFileWindow(),\n // Bewusst OHNE `active`: Bild hochladen ist eine Handlung, kein Zustand —\n // ein Aktiv-Zustand hätte nichts anzuzeigen.\n icon: 'upload-image',\n },\n};\n\n/** Liefert die Action zu einem Built-in-Namen, oder undefined. */\nexport function getAction(name: string): ToolbarAction | undefined {\n return BUILTIN_ACTIONS[name];\n}\n","import type { KeyBinding } from '@codemirror/view';\nimport { deleteLine, copyLineUp, copyLineDown, moveLineUp, moveLineDown } from '@codemirror/commands';\nimport { deleteMarkupBackward } from '@codemirror/lang-markdown';\nimport { quote } from './block';\nimport { unorderedListStar, continueList } from './list';\nimport { indentLines, dedentLines } from './indent';\nimport { BUILTIN_ACTIONS, type ToolbarAction } from '../ui/actions';\n\n/**\n * Built-ins, deren `shortcut` NICHT als KeyBinding abgeleitet werden darf.\n * undo/redo werden bereits über CM6s `historyKeymap` (siehe editor/extensions.ts)\n * an Mod-z/Mod-y/Mod-Shift-z gebunden — ihr `shortcut` in actions.ts dient nur der\n * Anzeige im Toolbar-Button-Title. Eine zusätzliche Ableitung hier würde dieselbe\n * Taste doppelt binden.\n */\nconst DISPLAY_ONLY = new Set(['undo', 'redo']);\n\n/**\n * Zieht den zu bindenden `key`-String aus `ToolbarAction['shortcut']`. Bei einem\n * plattformabhängigen Kürzel-Objekt (`{ default, mac }`) ist `default` der Bind-Key:\n * CM6-KeyBinding-`key`-Felder sind bereits plattformneutral (z.B. `Mod-*` löst sich\n * intern zu Cmd auf Mac / Ctrl sonst auf) — das `mac`-Feld dient nur der Anzeige im\n * Toolbar-Title (siehe shortcut-label.ts). Robust auch für künftige, nicht per\n * DISPLAY_ONLY ausgeschlossene Einträge mit Objekt-Kürzel.\n */\nfunction bindKeyOf(shortcut: NonNullable<ToolbarAction['shortcut']>): string {\n return typeof shortcut === 'string' ? shortcut : shortcut.default;\n}\n\n/**\n * Aus jedem Built-in mit `shortcut` (außer DISPLAY_ONLY) eine KeyBinding ableiten.\n * `BUILTIN_ACTIONS` (ui/actions.ts) ist damit die alleinige Quelle für Kürzel, die zu\n * einem Toolbar-Button gehören — keine doppelte Pflege mehr in keymap.ts.\n *\n * Nur `kind: 'command'`-Actions liefern eine CM6-`run`-Funktion (`(view) => boolean`).\n * `kind: 'view'`-Actions (side-by-side/fullscreen) sind Instanz-Aktionen auf\n * `SupaLike`, keine CM6-Commands — ihr `shortcut` wird stattdessen in Task 5 direkt\n * verdrahtet (SupaMDE-eigener Keydown-Handler auf F9/F11), nicht über diesen\n * CM6-Keymap.\n */\nconst derived: KeyBinding[] = Object.entries(BUILTIN_ACTIONS)\n .filter(\n (entry): entry is [string, Extract<ToolbarAction, { kind: 'command' }>] =>\n entry[1].kind === 'command' && !!entry[1].shortcut && !DISPLAY_ONLY.has(entry[0]),\n )\n .map(([, action]) => ({ key: bindKeyOf(action.shortcut!), run: action.command, preventDefault: true }));\n\n/**\n * Sonderfälle OHNE Toolbar-Button — bleiben handgepflegt, da sie nicht aus\n * BUILTIN_ACTIONS ableitbar sind.\n */\nconst extras: KeyBinding[] = [\n // Zweitkürzel für Blockzitat: Mod-' (Primärkürzel, wird oben aus dem quote-Button\n // abgeleitet) liegt auf DE-Mac-Tastaturen auf Shift+# und ist dort unzuverlässig.\n // Ctrl-Alt-Q ist layout-unabhängig erreichbar und passt zum Ctrl-Alt-Schema der\n // absoluten Überschriften (Ctrl-Alt-1…6). Derselbe quote-Import wie in actions.ts,\n // damit Primär- und Zweitkürzel dieselbe Command-Instanz teilen.\n { key: 'Ctrl-Alt-q', run: quote, preventDefault: true },\n // Ungeordnete Liste mit Sternchen-Marker (kein eigener Button, Alternative zum\n // Spiegelstrich-Default).\n { key: 'Shift-Alt-Mod-l', run: unorderedListStar, preventDefault: true },\n // Listen-Fortsetzung: greift nur in Listenzeilen, sonst false → Standard-Enter.\n { key: 'Enter', run: continueList },\n // Backspace am Anfang eines Listen-/Zitat-Eintrags entfernt die Markup-Ebene.\n // Stammt aus `markdownKeymap`, das in editor/extensions.ts per `addKeymap: false`\n // abgeschaltet ist (dessen Enter-Bindung würde `continueList` verdrängen) — diese\n // zweite Bindung des Keymaps ist davon unabhängig nützlich und bleibt erhalten.\n { key: 'Backspace', run: deleteMarkupBackward },\n // Ein-/Ausrücken der Zeile bzw. aller selektierten Zeilen — greift in JEDER\n // Zeile und an jeder Cursorposition. Tab wird bewusst ausnahmslos konsumiert\n // (keine Escape-Hatch, siehe Spec 2026-07-25).\n { key: 'Tab', run: indentLines, preventDefault: true },\n { key: 'Shift-Tab', run: dedentLines, preventDefault: true },\n // Zeilenoperationen nach VS-Code-Konvention (Löschen/Duplizieren/Verschieben).\n { key: 'Shift-Mod-k', run: deleteLine, preventDefault: true },\n { key: 'Shift-Alt-ArrowDown', run: copyLineDown, preventDefault: true },\n { key: 'Shift-Alt-ArrowUp', run: copyLineUp, preventDefault: true },\n { key: 'Alt-ArrowDown', run: moveLineDown, preventDefault: true },\n { key: 'Alt-ArrowUp', run: moveLineUp, preventDefault: true },\n];\n\n/**\n * Default-Tastenkürzel aus easyMDE (Cmd → CM6 `Mod`, plattformgerecht). Der Großteil\n * wird aus `BUILTIN_ACTIONS` (ui/actions.ts) abgeleitet — das ist die Single Source of\n * Truth für Kürzel, die zu einem Toolbar-Button gehören. Nur Bindungen ohne Button\n * (quote-Zweitkürzel, Sternchen-Liste, Listen-Fortsetzung) bleiben hier explizit.\n */\nexport const supaKeymap: KeyBinding[] = [...derived, ...extras];\n","import type { Extension, EditorState } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\n/** Empfänger für Editor-Updates (Toolbar-Aktiv-Zustand, Statusbar …). */\nexport interface UpdateSink {\n onUpdate(update: {\n state: EditorState;\n docChanged: boolean;\n selectionSet: boolean;\n }): void;\n}\n\n/**\n * Der EINE zentrale updateListener: bei jedem relevanten ViewUpdate wird\n * `sink.onUpdate` mit dem neuen State und den Flags gerufen. Entkoppelt UI ↔\n * Editor an einer Stelle (CM6-Design §5, „roter Faden\").\n */\nexport function updateListenerExtension(sink: UpdateSink): Extension {\n return EditorView.updateListener.of((update) => {\n if (!update.docChanged && !update.selectionSet) return;\n sink.onUpdate({\n state: update.state,\n docChanged: update.docChanged,\n selectionSet: update.selectionSet,\n });\n });\n}\n","import { EditorState, type Extension } from '@codemirror/state';\nimport { EditorView, placeholder, keymap } from '@codemirror/view';\nimport { history, historyKeymap, defaultKeymap } from '@codemirror/commands';\nimport { indentUnit } from '@codemirror/language';\nimport { codeIndent } from '../commands/code-indent';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { GFM } from '@lezer/markdown';\nimport type { ResolvedOptions } from '../options';\nimport { highlightExtension } from './highlight';\nimport { Math } from './math';\nimport { supaTheme } from './theme';\nimport { supaKeymap } from '../commands/keymap';\nimport { updateListenerExtension, type UpdateSink } from '../ui/update-listener';\nimport { livePreviewCompartment, livePreviewFor } from '../livepreview';\nimport { linkClickExtension } from './link-click';\nimport { linkHoverCursorExtension } from './link-hover-cursor';\n\n/**\n * Übersetzt normalisierte Optionen in die CM6-Extension-Liste. Jede easyMDE-\n * Option wird hier zur echten Extension (kein Flag-Layer). `autofocus` ist\n * bewusst nicht enthalten — es ist eine View-Konstruktor-Option, keine Extension.\n * GFM-Extensions sind aktiviert, um GitHub Flavored Markdown (Strikethrough, Tabellen, etc.) zu parsen.\n * `Math` erkennt `$…$`/`$$…$$` als eigene Knoten, damit LaTeX-Inhalt nicht als\n * Markdown (Fett, Links, …) interpretiert wird.\n * `livePreviewCompartment` hält die Live-Modus-Extension — im Source-Modus leer,\n * per `reconfigure` zur Laufzeit umschaltbar.\n */\nexport function buildExtensions(\n resolved: ResolvedOptions,\n sink?: UpdateSink,\n extraExtensions?: Extension[],\n): Extension[] {\n const extensions: Extension[] = [\n // `addKeymap: false`: `markdown()` bindet Enter sonst per `Prec.high` an\n // `insertNewlineContinueMarkup` — also VOR dem `supaKeymap`, wodurch SupaMDEs\n // `continueList` nie liefe. Dessen Listen-Ende ist zudem mehrstufig (erst eine\n // Leerzeile einschieben, dann ausrücken, dann den Marker entfernen); SupaMDE\n // beendet die Liste stattdessen mit einem einzigen Enter. Die übrigen\n // Markdown-Bindungen der Extension sind für SupaMDE ohne Belang.\n markdown({ extensions: [GFM, Math], addKeymap: false }),\n highlightExtension,\n // Compartment: erlaubt den Modus-Wechsel zur Laufzeit ohne View-Neuaufbau.\n livePreviewCompartment.of(livePreviewFor(resolved.editorMode)),\n // Modusunabhängig: Cmd/Ctrl+Klick öffnet Links in beiden Darstellungsmodi.\n linkClickExtension,\n // Modusunabhängig: Klickhand bei Modifier+Hover über einem Link.\n linkHoverCursorExtension,\n history(),\n keymap.of([...resolved.extraKeys, ...supaKeymap, ...historyKeymap, ...defaultKeymap]),\n supaTheme,\n EditorState.tabSize.of(resolved.tabSize),\n indentUnit.of(' '.repeat(resolved.indentUnit)),\n codeIndent.of(resolved.codeIndentUnit === 'tab' ? '\\t' : ' '.repeat(resolved.codeIndentUnit)),\n ];\n\n if (resolved.lineWrapping) {\n extensions.push(EditorView.lineWrapping);\n }\n if (resolved.placeholder !== null) {\n extensions.push(placeholder(resolved.placeholder));\n }\n if (sink) {\n extensions.push(updateListenerExtension(sink));\n }\n\n // Von der Fassade eingeschleuste Extensions (M5: Platzhalter-StateField,\n // Drop/Paste-Handler). Bewusst ZULETZT: Sie sollen die Basis ergänzen, nicht\n // ihr vorgreifen.\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return extensions;\n}\n","import { EditorView } from '@codemirror/view';\nimport type { Extension } from '@codemirror/state';\nimport type { SupaMDEOptions } from '../options';\nimport { resolveOptions, type ResolvedOptions } from '../options';\nimport { buildExtensions } from './extensions';\nimport type { UpdateSink } from '../ui/update-listener';\n\n/** Steuerungs-Handle über den erzeugten Editor inkl. Rückbau. */\nexport interface EditorHandle {\n /** Die zugrunde liegende CM6-EditorView. */\n view: EditorView;\n /** Baut den Editor zurück und liefert die wiederhergestellte Textarea. */\n toTextArea(): HTMLTextAreaElement;\n /** Schreibt den aktuellen Doc-Inhalt sofort in die Textarea. */\n forceSync(): void;\n /**\n * Die normalisierten Optionen dieser Instanz. Herausgegeben, damit die Fassade\n * (`src/index.ts`) sie NICHT erneut auflösen muss — `resolveOptions` läuft pro\n * Instanz genau einmal, Warnungen erscheinen daher genau einmal.\n */\n resolved: ResolvedOptions;\n}\n\n/**\n * CM6-Nachbau von `fromTextArea`: erzeugt eine EditorView aus dem Textarea-\n * Inhalt, fügt sie davor ein, versteckt die Textarea und hält den Form-Submit-\n * Wert synchron. Der Textarea-Wert ist die Quelle NUR bei Konstruktion.\n */\nexport function editorFromTextArea(\n options: SupaMDEOptions,\n sink?: UpdateSink,\n extraExtensions?: Extension[],\n): EditorHandle {\n const element = options.element;\n if (!element) {\n throw new Error('SupaMDE: `element` is required (a <textarea>).');\n }\n if (!(element instanceof HTMLTextAreaElement)) {\n throw new Error('SupaMDE: `element` must be a <textarea>.');\n }\n const textarea = element;\n\n const resolved = resolveOptions(options);\n const doc = options.initialValue ?? textarea.value;\n\n // Ohne `parent` erzeugt; view.dom wird gleich manuell vor der Textarea platziert.\n const view = new EditorView({\n doc,\n extensions: buildExtensions(resolved, sink, extraExtensions),\n });\n\n // vor die Textarea einfügen, Textarea verstecken\n textarea.parentNode?.insertBefore(view.dom, textarea);\n const previousDisplay = textarea.style.display;\n textarea.style.display = 'none';\n\n const forceSync = (): void => {\n textarea.value = view.state.doc.toString();\n };\n\n // Form-Submit-Listener referenziert halten, damit toTextArea ihn entfernen kann\n const onSubmit = (): void => forceSync();\n const form = textarea.form;\n form?.addEventListener('submit', onSubmit);\n\n if (resolved.autofocus) {\n view.focus();\n }\n\n const toTextArea = (): HTMLTextAreaElement => {\n forceSync();\n form?.removeEventListener('submit', onSubmit);\n view.destroy();\n view.dom.remove();\n textarea.style.display = previousDisplay;\n return textarea;\n };\n\n return { view, toTextArea, forceSync, resolved };\n}\n","import type { EditorView } from '@codemirror/view';\n\n/**\n * Headless value-Logik über einer `EditorView`. Bewusst aus der `SupaMDE`-\n * Fassade herausgezogen: so ist sie ohne Textarea/Konstruktor testbar (Spec\n * Abschnitt 3) und in M2 (Commands) wiederverwendbar.\n */\n\n/** Liefert den aktuellen Editor-Inhalt als String. */\nexport function readValue(view: EditorView): string {\n return view.state.doc.toString();\n}\n\n/** Ersetzt den gesamten Editor-Inhalt durch `val`. */\nexport function writeValue(view: EditorView, val: string): void {\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: val },\n });\n}\n","import { getAction, type ToolbarAction } from './actions';\n\n/** Ein Custom-Toolbar-Button (easyMDE-kompatibel): eigenes action(editor). */\nexport interface CustomToolbarButton {\n name: string;\n action: (editor: unknown) => void;\n className?: string;\n title?: string;\n}\n\n/** Die `toolbar`-Option: false, oder Liste aus Built-in-Namen/Custom-Buttons. */\nexport type ToolbarOption = false | Array<string | CustomToolbarButton>;\n\n/**\n * Default-Toolbar. `'|'` ist ein Separator.\n *\n * Ansicht: der Default zeigt den kombinierten `'preview-fullscreen'`-Button\n * (Vorschau + Vollbild in einem Schritt). Die Einzel-Buttons `'side-by-side'`\n * und `'fullscreen'` bleiben registriert und lassen sich über die\n * `toolbar`-Option weiterhin einzeln einsetzen.\n */\nexport const DEFAULT_TOOLBAR: string[] = [\n 'bold',\n 'italic',\n 'strikethrough',\n 'code',\n '|',\n 'heading-smaller',\n 'heading-bigger',\n '|',\n 'quote',\n 'unordered-list',\n 'ordered-list',\n 'check-list',\n '|',\n 'code-block',\n 'horizontal-rule',\n '|',\n 'link',\n 'image',\n 'table',\n '|',\n 'clean-block',\n '|',\n 'undo',\n 'redo',\n '|',\n 'preview-fullscreen',\n];\n\n/** Aufgelöster Toolbar-Eintrag. */\nexport type ResolvedToolbarItem =\n | { kind: 'separator' }\n | { kind: 'builtin'; name: string; action: ToolbarAction }\n | { kind: 'custom'; button: CustomToolbarButton };\n\n/**\n * Normalisiert die `toolbar`-Option zu einer aufgelösten Item-Liste.\n * `false` → null (keine Toolbar). `undefined` → DEFAULT_TOOLBAR.\n * Unbekannte Built-in-Strings werden mit Warnung übersprungen.\n */\nexport function resolveToolbar(option: ToolbarOption | undefined): ResolvedToolbarItem[] | null {\n if (option === false) return null;\n const items = option ?? DEFAULT_TOOLBAR;\n\n const resolved: ResolvedToolbarItem[] = [];\n for (const entry of items) {\n if (typeof entry === 'string') {\n if (entry === '|') {\n resolved.push({ kind: 'separator' });\n continue;\n }\n const action = getAction(entry);\n if (!action) {\n console.warn(`SupaMDE: unknown toolbar action \"${entry}\" is skipped.`);\n continue;\n }\n resolved.push({ kind: 'builtin', name: entry, action });\n } else {\n resolved.push({ kind: 'custom', button: entry });\n }\n }\n return resolved;\n}\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport defaultAttributes from './defaultAttributes.mjs';\n\nconst createSVGElement = ([tag, attrs, children]) => {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n Object.keys(attrs).forEach((name) => {\n element.setAttribute(name, String(attrs[name]));\n });\n if (children?.length) {\n children.forEach((child) => {\n const childElement = createSVGElement(child);\n element.appendChild(childElement);\n });\n }\n return element;\n};\nconst createElement = (iconNode, customAttrs = {}) => {\n const tag = \"svg\";\n const attrs = {\n ...defaultAttributes,\n ...customAttrs\n };\n return createSVGElement([tag, attrs, iconNode]);\n};\n\nexport { createElement as default };\n//# sourceMappingURL=createElement.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Bold = [\n [\"path\", { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" }]\n];\n\nexport { Bold as default };\n//# sourceMappingURL=bold.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Code = [\n [\"path\", { d: \"m16 18 6-6-6-6\" }],\n [\"path\", { d: \"m8 6-6 6 6 6\" }]\n];\n\nexport { Code as default };\n//# sourceMappingURL=code.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Columns2 = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\" }],\n [\"path\", { d: \"M12 3v18\" }]\n];\n\nexport { Columns2 as default };\n//# sourceMappingURL=columns-2.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Eraser = [\n [\n \"path\",\n {\n d: \"M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21\"\n }\n ],\n [\"path\", { d: \"m5.082 11.09 8.828 8.828\" }]\n];\n\nexport { Eraser as default };\n//# sourceMappingURL=eraser.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Eye = [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\" }]\n];\n\nexport { Eye as default };\n//# sourceMappingURL=eye.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Fullscreen = [\n [\"path\", { d: \"M3 7V5a2 2 0 0 1 2-2h2\" }],\n [\"path\", { d: \"M17 3h2a2 2 0 0 1 2 2v2\" }],\n [\"path\", { d: \"M21 17v2a2 2 0 0 1-2 2h-2\" }],\n [\"path\", { d: \"M7 21H5a2 2 0 0 1-2-2v-2\" }],\n [\"rect\", { width: \"10\", height: \"8\", x: \"7\", y: \"8\", rx: \"1\" }]\n];\n\nexport { Fullscreen as default };\n//# sourceMappingURL=fullscreen.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Heading = [\n [\"path\", { d: \"M6 12h12\" }],\n [\"path\", { d: \"M6 20V4\" }],\n [\"path\", { d: \"M18 20V4\" }]\n];\n\nexport { Heading as default };\n//# sourceMappingURL=heading.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst ImageUp = [\n [\n \"path\",\n {\n d: \"M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10l-3.1-3.1a2 2 0 0 0-2.814.014L6 21\"\n }\n ],\n [\"path\", { d: \"m14 19.5 3-3 3 3\" }],\n [\"path\", { d: \"M17 22v-5.5\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\" }]\n];\n\nexport { ImageUp as default };\n//# sourceMappingURL=image-up.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Image = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" }]\n];\n\nexport { Image as default };\n//# sourceMappingURL=image.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Italic = [\n [\"line\", { x1: \"19\", x2: \"10\", y1: \"4\", y2: \"4\" }],\n [\"line\", { x1: \"14\", x2: \"5\", y1: \"20\", y2: \"20\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"4\", y2: \"20\" }]\n];\n\nexport { Italic as default };\n//# sourceMappingURL=italic.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Link = [\n [\"path\", { d: \"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" }],\n [\"path\", { d: \"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" }]\n];\n\nexport { Link as default };\n//# sourceMappingURL=link.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst ListChecks = [\n [\"path\", { d: \"M13 5h8\" }],\n [\"path\", { d: \"M13 12h8\" }],\n [\"path\", { d: \"M13 19h8\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\" }],\n [\"path\", { d: \"m3 7 2 2 4-4\" }]\n];\n\nexport { ListChecks as default };\n//# sourceMappingURL=list-checks.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst ListOrdered = [\n [\"path\", { d: \"M11 5h10\" }],\n [\"path\", { d: \"M11 12h10\" }],\n [\"path\", { d: \"M11 19h10\" }],\n [\"path\", { d: \"M4 4h1v5\" }],\n [\"path\", { d: \"M4 9h2\" }],\n [\"path\", { d: \"M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02\" }]\n];\n\nexport { ListOrdered as default };\n//# sourceMappingURL=list-ordered.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst List = [\n [\"path\", { d: \"M3 5h.01\" }],\n [\"path\", { d: \"M3 12h.01\" }],\n [\"path\", { d: \"M3 19h.01\" }],\n [\"path\", { d: \"M8 5h13\" }],\n [\"path\", { d: \"M8 12h13\" }],\n [\"path\", { d: \"M8 19h13\" }]\n];\n\nexport { List as default };\n//# sourceMappingURL=list.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Maximize2 = [\n [\"path\", { d: \"M15 3h6v6\" }],\n [\"path\", { d: \"m21 3-7 7\" }],\n [\"path\", { d: \"m3 21 7-7\" }],\n [\"path\", { d: \"M9 21H3v-6\" }]\n];\n\nexport { Maximize2 as default };\n//# sourceMappingURL=maximize-2.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Minus = [[\"path\", { d: \"M5 12h14\" }]];\n\nexport { Minus as default };\n//# sourceMappingURL=minus.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Quote = [\n [\n \"path\",\n {\n d: \"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\"\n }\n ],\n [\n \"path\",\n {\n d: \"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\"\n }\n ]\n];\n\nexport { Quote as default };\n//# sourceMappingURL=quote.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Redo = [\n [\"path\", { d: \"M21 7v6h-6\" }],\n [\"path\", { d: \"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\" }]\n];\n\nexport { Redo as default };\n//# sourceMappingURL=redo.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst SquareCode = [\n [\"path\", { d: \"m10 9-3 3 3 3\" }],\n [\"path\", { d: \"m14 15 3-3-3-3\" }],\n [\"rect\", { x: \"3\", y: \"3\", width: \"18\", height: \"18\", rx: \"2\" }]\n];\n\nexport { SquareCode as default };\n//# sourceMappingURL=square-code.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Strikethrough = [\n [\"path\", { d: \"M16 4H9a3 3 0 0 0-2.83 4\" }],\n [\"path\", { d: \"M14 12a4 4 0 0 1 0 8H6\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"12\", y2: \"12\" }]\n];\n\nexport { Strikethrough as default };\n//# sourceMappingURL=strikethrough.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Table = [\n [\"path\", { d: \"M12 3v18\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\" }],\n [\"path\", { d: \"M3 9h18\" }],\n [\"path\", { d: \"M3 15h18\" }]\n];\n\nexport { Table as default };\n//# sourceMappingURL=table.mjs.map\n","/**\n * @license lucide v1.53.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Undo = [\n [\"path\", { d: \"M3 7v6h6\" }],\n [\"path\", { d: \"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" }]\n];\n\nexport { Undo as default };\n//# sourceMappingURL=undo.mjs.map\n","import {\n createElement,\n Bold,\n Italic,\n Strikethrough,\n Code,\n Heading,\n Quote,\n SquareCode,\n Minus,\n Eraser,\n ImageUp,\n List,\n ListOrdered,\n ListChecks,\n Link,\n Image,\n Table,\n Undo,\n Redo,\n Columns2,\n Fullscreen,\n Maximize2,\n Eye,\n type IconNode,\n} from 'lucide';\n\n/**\n * Mapping Built-in-Icon-Name → Lucide-Icon-Daten. Die Namen sind die von der\n * Toolbar-Registry (`ui/actions.ts`) verwendeten Built-in-Schlüssel.\n */\nconst ICONS: Record<string, IconNode> = {\n bold: Bold,\n italic: Italic,\n strikethrough: Strikethrough,\n code: Code,\n heading: Heading,\n quote: Quote,\n 'code-block': SquareCode,\n 'horizontal-rule': Minus,\n 'clean-block': Eraser,\n 'unordered-list': List,\n 'ordered-list': ListOrdered,\n 'check-list': ListChecks,\n link: Link,\n image: Image,\n table: Table,\n undo: Undo,\n redo: Redo,\n 'side-by-side': Columns2,\n fullscreen: Fullscreen,\n 'preview-fullscreen': Maximize2,\n 'editor-mode': Eye,\n 'upload-image': ImageUp,\n};\n\n/** Ob ein Icon-Name bekannt ist. */\nexport function hasIcon(name: string): boolean {\n return name in ICONS;\n}\n\n/** Liefert ein fertiges Lucide-SVGElement für `name`; wirft bei unbekanntem Namen. */\nexport function renderIcon(name: string): SVGElement {\n const data = ICONS[name];\n if (!data) {\n throw new Error(`SupaMDE: unknown icon \"${name}\".`);\n }\n return createElement(data);\n}\n","/**\n * Erkennt, ob die aktuelle Plattform macOS ist.\n * Nutzt `navigator.userAgentData?.platform` mit Fallback auf `navigator.userAgent`.\n */\nfunction detectMac(): boolean {\n try {\n // `navigator.userAgentData` ist nur in modernen Browsern verfügbar\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nav = navigator as any;\n if (typeof navigator !== 'undefined' && nav.userAgentData?.platform) {\n return nav.userAgentData.platform.toLowerCase().includes('mac');\n }\n // Fallback auf userAgent (deprecated, aber breit unterstützt)\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return /mac/i.test(navigator.userAgent);\n }\n } catch {\n // In Nicht-Browser-Umgebungen (Node.js, etc.) — Default zu false\n }\n return false;\n}\n\n/**\n * Plattformabhängiges Shortcut-Kürzel: `default` gilt für alle Plattformen außer Mac,\n * `mac` überschreibt die Anzeige (und ggf. Bindung) auf macOS. Nötig für Fälle wie\n * redo, wo CM6s `historyKeymap` auf Mac `Mod-Shift-z` statt `Mod-y` bindet.\n */\nexport interface PlatformShortcut {\n default: string;\n mac: string;\n}\n\n/**\n * Formatiert einen CM6-Shortcut-String lesbar für die UI.\n *\n * Eingabeformat: CM6-kompatible Strings wie 'Mod-b', 'Shift-Mod-h', 'Mod-Alt-c', etc.\n * Segmente sind mit `-` getrennt; alle außer dem letzten sind Modifier.\n *\n * Alternativ akzeptiert die Funktion ein plattformabhängiges Kürzel-Objekt\n * `{ default, mac }` — auf Mac wird dann `mac` formatiert, sonst `default`.\n *\n * @param shortcut Der zu formatierende Shortcut-String (z.B. 'Mod-b') oder ein\n * plattformabhängiges Kürzel-Objekt (z.B. `{ default: 'Mod-y', mac: 'Mod-Shift-z' }`)\n * @param isMac Optionales Flag, um Plattform zu überschreiben (Default: auto-erkannt)\n * @returns Formatierter Shortcut (z.B. '⌘B' auf Mac, 'Ctrl+B' sonst)\n */\nexport function formatShortcut(shortcut: string | PlatformShortcut, isMac?: boolean): string {\n const platform = isMac ?? detectMac();\n\n // Bei plattformabhängigem Objekt zuerst den passenden String auflösen.\n const resolved = typeof shortcut === 'string' ? shortcut : platform ? shortcut.mac : shortcut.default;\n\n // Shortcut in Segmente zerlegen\n const segments = resolved.split('-');\n if (segments.length === 0) {\n return resolved;\n }\n\n // Letztes Segment ist die Taste; alle anderen sind Modifier\n const keySegment = segments[segments.length - 1];\n if (!keySegment) {\n return resolved;\n }\n const key = keySegment;\n const modifiers = segments.slice(0, -1);\n\n if (platform) {\n return formatMac(modifiers, key);\n } else {\n return formatNonMac(modifiers, key);\n }\n}\n\n/**\n * Formatiert macOS-Style: zusammengezogene Symbole, Taste groß.\n * Reihenfolge: Ctrl/Cmd-Cluster (Mod→⌘, Cmd→⌘, Ctrl→⌃), dann Alt/Option, dann Shift, dann Taste.\n * KRITISCH: Ctrl bleibt auf Mac als ⌃ (Control), nur Mod wird zu ⌘ (Cmd).\n */\nfunction formatMac(modifiers: string[], key: string): string {\n // Normalisiere und ordne Modifier\n const normalized: string[] = [];\n let hasMod = false;\n let hasCmd = false;\n let hasCtrl = false;\n let hasAlt = false;\n let hasShift = false;\n\n for (const mod of modifiers) {\n if (mod === 'Mod') {\n hasMod = true;\n } else if (mod === 'Cmd') {\n hasCmd = true;\n } else if (mod === 'Ctrl') {\n hasCtrl = true;\n } else if (mod === 'Alt') {\n hasAlt = true;\n } else if (mod === 'Shift') {\n hasShift = true;\n }\n }\n\n // Baue in Reihenfolge auf: Mod/Cmd/Ctrl, Alt, Shift\n if (hasMod) {\n normalized.push('⌘');\n }\n if (hasCmd) {\n normalized.push('⌘');\n }\n if (hasCtrl) {\n normalized.push('⌃');\n }\n if (hasAlt) {\n normalized.push('⌥');\n }\n if (hasShift) {\n normalized.push('⇧');\n }\n\n // Taste großschreiben und zusammensetzen\n const upperKey = key.length === 1 ? key.toUpperCase() : key;\n return normalized.join('') + upperKey;\n}\n\n/**\n * Formatiert non-Mac-Style: mit `+` getrennte Modifier, Taste groß.\n * Reihenfolge: Ctrl, dann Alt, dann Shift, dann Taste.\n */\nfunction formatNonMac(modifiers: string[], key: string): string {\n // Normalisiere und ordne Modifier\n const normalized: string[] = [];\n let hasCtrl = false;\n let hasAlt = false;\n let hasShift = false;\n\n for (const mod of modifiers) {\n if (mod === 'Mod' || mod === 'Ctrl') {\n hasCtrl = true;\n } else if (mod === 'Alt') {\n hasAlt = true;\n } else if (mod === 'Shift') {\n hasShift = true;\n }\n }\n\n // Baue in Reihenfolge auf\n if (hasCtrl) {\n normalized.push('Ctrl');\n }\n if (hasAlt) {\n normalized.push('Alt');\n }\n if (hasShift) {\n normalized.push('Shift');\n }\n\n // Taste großschreiben und zusammensetzen\n const upperKey = key.length === 1 ? key.toUpperCase() : key;\n normalized.push(upperKey);\n return normalized.join('+');\n}\n","import type { EditorView } from '@codemirror/view';\nimport type { EditorState } from '@codemirror/state';\nimport { resolveToolbar, type ResolvedToolbarItem, type ToolbarOption } from './toolbar-config';\nimport { renderIcon } from './icons';\nimport { formatShortcut } from './shortcut-label';\nimport type { SupaLike } from './actions';\nimport { createTranslator, type Translator } from '../i18n/translator';\nimport type { SimpleTextKey } from '../i18n/types';\n\n/** Ein gerendertes Toolbar-Widget mit reaktivem Aktiv-Zustand. */\nexport interface Toolbar {\n dom: HTMLElement;\n update(state: EditorState): void;\n destroy(): void;\n}\n\n/** Ein Built-in-Button samt seiner query, um bei update() .active zu setzen. */\ninterface ActiveButton {\n el: HTMLButtonElement;\n query: (state: EditorState) => boolean;\n}\n\n/** Ein view-Button samt seiner active-Funktion, um bei update() .active zu setzen. */\ninterface ViewButton {\n el: HTMLButtonElement;\n active: (editor: SupaLike) => boolean;\n}\n\n/**\n * Laufzeit-Typwächter: erfüllt `editor` strukturell `SupaLike`? Nötig, weil\n * `createToolbar` ein `editor: unknown` entgegennimmt (Custom-Buttons erlauben\n * beliebige Werte) und die Toolbar auch mit Fremdobjekten umgehen muss.\n *\n * Geprüft werden bewusst nur diese vier Methoden — nicht die später ergänzten\n * `togglePreviewFullScreen`/`isPreviewFullScreenActive`. Sonst fielen Host-Objekte\n * durch die Prüfung, die nur die vier alten Methoden implementieren, und verlören\n * den Aktiv-Zustand aller view-Buttons.\n */\nfunction isSupaLike(editor: unknown): editor is SupaLike {\n return (\n typeof editor === 'object' &&\n editor !== null &&\n typeof (editor as Partial<SupaLike>).toggleSideBySide === 'function' &&\n typeof (editor as Partial<SupaLike>).toggleFullScreen === 'function' &&\n typeof (editor as Partial<SupaLike>).isSideBySideActive === 'function' &&\n typeof (editor as Partial<SupaLike>).isFullscreenActive === 'function'\n );\n}\n\n/** Baut den DOM-Knoten für einen aufgelösten Toolbar-Eintrag. */\nfunction buildItem(\n view: EditorView,\n item: ResolvedToolbarItem,\n editor: unknown,\n translator: Translator,\n activeButtons: ActiveButton[],\n viewButtons: ViewButton[],\n): HTMLElement {\n if (item.kind === 'separator') {\n const sep = document.createElement('i');\n sep.className = 'supamde-separator';\n return sep;\n }\n\n const btn = document.createElement('button');\n btn.type = 'button';\n\n if (item.kind === 'builtin') {\n const { action, name } = item;\n // Der Cast ist sicher: i18n/__tests__/locales.test.ts stellt sicher, dass jede\n // Built-in-Aktion einen `toolbar.*`-Schlüssel hat.\n const title = translator.t(`toolbar.${name}` as SimpleTextKey);\n const label = action.shortcut ? `${title} (${formatShortcut(action.shortcut)})` : title;\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.dataset.action = name;\n btn.appendChild(renderIcon(action.icon));\n if (action.kind === 'command') {\n const cmd = action.command;\n btn.addEventListener('click', () => {\n view.focus();\n cmd(view);\n });\n if (action.query) {\n activeButtons.push({ el: btn, query: (state) => action.query!(state) });\n }\n } else {\n const run = action.run;\n btn.addEventListener('click', () => run(editor as SupaLike));\n if (action.active) {\n viewButtons.push({ el: btn, active: action.active });\n }\n }\n } else {\n // UNVERÄNDERT: Custom-Button-Zweig (item.kind === 'custom') — exakt wie bisher.\n const { button } = item;\n btn.title = button.title ?? button.name;\n btn.dataset.action = button.name;\n if (button.className) {\n const icon = document.createElement('i');\n icon.className = button.className;\n btn.appendChild(icon);\n } else {\n btn.textContent = button.name;\n }\n btn.addEventListener('click', () => button.action(editor));\n }\n\n return btn;\n}\n\n/**\n * Erzeugt die Toolbar aus der `toolbar`-Option. `null` bei `false`.\n * `editor` ist die SupaMDE-Instanz, die Custom-Buttons als action-Argument bekommen.\n * `translator` liefert die Titel der Built-in-Buttons; ohne Angabe englisch.\n */\nexport function createToolbar(\n view: EditorView,\n option: ToolbarOption | undefined,\n editor: unknown,\n translator: Translator = createTranslator(),\n): Toolbar | null {\n const items = resolveToolbar(option);\n if (items === null) return null;\n\n const dom = document.createElement('div');\n dom.className = 'supamde-toolbar';\n\n const activeButtons: ActiveButton[] = [];\n const viewButtons: ViewButton[] = [];\n for (const item of items) {\n dom.appendChild(buildItem(view, item, editor, translator, activeButtons, viewButtons));\n }\n\n // Warnt höchstens einmal pro Toolbar-Instanz (nicht bei jedem update()-Tick).\n let supaLikeWarned = false;\n\n const update = (state: EditorState): void => {\n for (const { el, query } of activeButtons) {\n el.classList.toggle('active', query(state));\n }\n // `editor` implementiert SupaLike nur, wenn eine echte SupaMDE-Instanz\n // toggleSideBySide/toggleFullScreen/isSideBySideActive/isFullscreenActive\n // bereitstellt. Bis dahin (bzw. bei einem Host ohne diese Methoden) still\n // überspringen statt zu werfen — verhindert einen crashenden Toolbar-Update\n // allein durch das Vorhandensein der view-Buttons in DEFAULT_TOOLBAR.\n if (viewButtons.length > 0) {\n if (isSupaLike(editor)) {\n for (const { el, active } of viewButtons) {\n el.classList.toggle('active', active(editor));\n }\n } else if (!supaLikeWarned) {\n // Beobachtbar statt lautlos: verhindert, dass ein Tippfehler in einer der\n // vier SupaLike-Methoden (z.B. bei künftigen Umbenennungen) die\n // view-Buttons dauerhaft und fehlerfrei \"totlaufen\" lässt.\n supaLikeWarned = true;\n console.warn(\n 'SupaMDE: toolbar contains view buttons (preview-fullscreen/side-by-side/' +\n 'fullscreen/editor-mode), but the given editor instance does not satisfy ' +\n 'SupaLike (toggleSideBySide/toggleFullScreen/isSideBySideActive/' +\n 'isFullscreenActive) — the active state of these buttons is not updated.',\n );\n }\n }\n };\n\n const destroy = (): void => {\n dom.remove();\n };\n\n return { dom, update, destroy };\n}\n","/**\n * Zählt Wörter in `text`: durch Whitespace getrennte, nicht-leere Tokens.\n * Reine Funktion — das neue Sicherheitsnetz, das easyMDE fehlt.\n */\nexport function wordCount(text: string): number {\n const trimmed = text.trim();\n if (trimmed.length === 0) return 0;\n return trimmed.split(/\\s+/).length;\n}\n","import type { EditorState } from '@codemirror/state';\nimport { wordCount } from '../features/word-count';\nimport { createTranslator, type Translator } from '../i18n/translator';\n\n/** Ein Custom-Statusbar-Item (easyMDE-kompatibel). */\nexport interface CustomStatusItem {\n className: string;\n defaultValue?: string;\n onUpdate?(el: HTMLElement): void;\n onActivity?(el: HTMLElement): void;\n}\n\n/** Die `status`-Option: false, oder Liste aus Built-in-Namen/Custom-Items. */\nexport type StatusOption = false | Array<string | CustomStatusItem>;\n\n/** Default-Statusbar-Items. */\nexport const DEFAULT_STATUS: string[] = ['lines', 'words', 'cursor'];\n\n/** Built-in-Namen, die SupaMDE selbst befüllt. */\nconst BUILTIN_NAMES = new Set(['lines', 'words', 'cursor', 'autosave', 'upload-image']);\n\n/**\n * Built-ins, deren Inhalt AUSSCHLIESSLICH über `setItem()` kommt. `update()`\n * lässt sie unberührt — sonst löschte der nächste Tastendruck den gerade\n * gesetzten Zeitstempel bzw. die Upload-Meldung wieder (`builtinContent`\n * liefert für beide `''`).\n */\nconst STICKY_NAMES = new Set(['autosave', 'upload-image']);\n\n/** Ein gerendertes Statusbar-Widget. */\nexport interface Statusbar {\n dom: HTMLElement;\n update(state: EditorState, opts: { docChanged: boolean; selectionSet: boolean }): void;\n setItem(name: string, content: string): void;\n destroy(): void;\n}\n\ninterface BuiltinEntry {\n name: string;\n el: HTMLElement;\n}\n\ninterface CustomEntry {\n item: CustomStatusItem;\n el: HTMLElement;\n}\n\n/** Berechnet den Textinhalt eines Built-in-Items aus dem State. */\nfunction builtinContent(name: string, state: EditorState, translator: Translator): string {\n switch (name) {\n case 'lines':\n return translator.plural('status.lines', state.doc.lines);\n case 'words':\n return translator.plural('status.words', wordCount(state.doc.toString()));\n case 'cursor': {\n const head = state.selection.main.head;\n const line = state.doc.lineAt(head);\n return `${line.number}:${head - line.from + 1}`;\n }\n case 'autosave':\n case 'upload-image':\n // Werden nie hier berechnet, sondern nur über setItem() gesetzt (STICKY_NAMES).\n return '';\n default:\n return '';\n }\n}\n\n/**\n * Erzeugt die Statusbar aus der `status`-Option. `null` bei `false`.\n * `translator` liefert die Texte der Built-ins; ohne Angabe englisch.\n */\nexport function createStatusbar(\n option: StatusOption | undefined,\n translator: Translator = createTranslator(),\n): Statusbar | null {\n if (option === false) return null;\n const items = option ?? DEFAULT_STATUS;\n\n const dom = document.createElement('div');\n dom.className = 'supamde-statusbar';\n\n const builtins: BuiltinEntry[] = [];\n const customs: CustomEntry[] = [];\n\n for (const entry of items) {\n const span = document.createElement('span');\n if (typeof entry === 'string') {\n span.className = `supamde-status-${entry}`;\n dom.appendChild(span);\n if (BUILTIN_NAMES.has(entry)) {\n builtins.push({ name: entry, el: span });\n }\n } else {\n span.className = `supamde-status-custom ${entry.className}`;\n span.textContent = entry.defaultValue ?? '';\n dom.appendChild(span);\n customs.push({ item: entry, el: span });\n }\n }\n\n const update = (\n state: EditorState,\n opts: { docChanged: boolean; selectionSet: boolean },\n ): void => {\n for (const { name, el } of builtins) {\n if (STICKY_NAMES.has(name)) continue;\n el.textContent = builtinContent(name, state, translator);\n }\n for (const { item, el } of customs) {\n if (opts.docChanged) item.onUpdate?.(el);\n if (opts.selectionSet) item.onActivity?.(el);\n }\n };\n\n const setItem = (name: string, content: string): void => {\n const found = builtins.find((b) => b.name === name);\n if (found) found.el.textContent = content;\n };\n\n const destroy = (): void => {\n dom.remove();\n };\n\n return { dom, update, setItem, destroy };\n}\n","import type { EditorView } from '@codemirror/view';\nimport type { EditorState } from '@codemirror/state';\n\nexport interface SideBySideOptions {\n /** Markdown→HTML-Funktion (aus markdown/parse.ts, mit Optionen gebunden). */\n render: (text: string) => string;\n /** Zusätzliche CSS-Klassen aufs Panel. */\n previewClass?: string | string[];\n /** Bidirektionaler Scroll-Sync (Default true). */\n syncScroll?: boolean;\n}\n\nexport interface SideBySide {\n dom: HTMLElement;\n /** Schaltet gezielt auf `next`. Idempotent — gleicher Wert ändert nichts. */\n set(next: boolean): void;\n toggle(): void;\n isActive(): boolean;\n update(state: EditorState): void;\n destroy(): void;\n}\n\n/**\n * Side-by-Side-Vorschau: baut ein Panel neben `view.dom`. Das Layout-Toggle\n * (Flexbox 50/50) übernimmt CSS über die Klasse `supamde-sided` auf dem\n * Container (in index.ts gesetzt); dieses Modul verwaltet Panel-Inhalt,\n * Sichtbarkeit und Scroll-Sync. Live-Update erfolgt über `update()`, das der\n * zentrale updateListener-Sink ruft.\n */\nexport function createSideBySide(view: EditorView, opts: SideBySideOptions): SideBySide {\n const dom = document.createElement('div');\n dom.className = 'supamde-preview-side';\n if (opts.previewClass) {\n const classes = Array.isArray(opts.previewClass) ? opts.previewClass : [opts.previewClass];\n dom.classList.add(...classes);\n }\n dom.style.display = 'none';\n\n let active = false;\n const sync = opts.syncScroll ?? true;\n\n const rerender = (state: EditorState): void => {\n dom.innerHTML = opts.render(state.doc.toString());\n };\n\n // Scroll-Sync (ratio-basiert, mit Feedback-Guard).\n let syncingFrom: 'editor' | 'preview' | null = null;\n const scroller = view.scrollDOM;\n\n // Das Guard-Flag NICHT allein vom Gegen-Scroll-Event löschen lassen: eine\n // programmatische scrollTop-Zuweisung feuert KEIN scroll-Event, wenn der Wert\n // sich nicht ändert (beide Panes am Rand, Ziel nicht scrollbar, Sub-Pixel-\n // Rundung auf denselben Integer). Dann bliebe das Flag hängen und der nächste\n // echte User-Scroll würde einmalig als Echo verschluckt. Deshalb zusätzlich\n // per rAF (mit Fallback für jsdom/Nicht-Browser) im nächsten Frame freigeben.\n const scheduleGuardReset = (from: 'editor' | 'preview'): void => {\n const release = (): void => {\n if (syncingFrom === from) syncingFrom = null;\n };\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(release);\n } else {\n // jsdom/SSR: kein rAF → synchroner Fallback (Test-Determinismus).\n release();\n }\n };\n\n const onEditorScroll = (): void => {\n if (!active || !sync) return;\n if (syncingFrom === 'preview') { syncingFrom = null; return; }\n syncingFrom = 'editor';\n const denom = scroller.scrollHeight - scroller.clientHeight;\n const ratio = denom > 0 ? scroller.scrollTop / denom : 0;\n dom.scrollTop = (dom.scrollHeight - dom.clientHeight) * ratio;\n scheduleGuardReset('editor');\n };\n const onPreviewScroll = (): void => {\n if (!active || !sync) return;\n if (syncingFrom === 'editor') { syncingFrom = null; return; }\n syncingFrom = 'preview';\n const denom = dom.scrollHeight - dom.clientHeight;\n const ratio = denom > 0 ? dom.scrollTop / denom : 0;\n scroller.scrollTop = (scroller.scrollHeight - scroller.clientHeight) * ratio;\n scheduleGuardReset('preview');\n };\n\n if (sync) {\n scroller.addEventListener('scroll', onEditorScroll);\n dom.addEventListener('scroll', onPreviewScroll);\n }\n\n const set = (next: boolean): void => {\n if (next === active) return;\n active = next;\n dom.style.display = active ? '' : 'none';\n if (active) rerender(view.state);\n };\n\n const toggle = (): void => set(!active);\n\n const update = (state: EditorState): void => {\n if (active) rerender(state);\n };\n\n const destroy = (): void => {\n if (sync) {\n scroller.removeEventListener('scroll', onEditorScroll);\n dom.removeEventListener('scroll', onPreviewScroll);\n }\n dom.remove();\n };\n\n return { dom, toggle, set, isActive: () => active, update, destroy };\n}\n","export interface FullscreenOptions {\n onToggleFullScreen?: (active: boolean) => void;\n}\n\nexport interface Fullscreen {\n toggle(): void;\n /** Schaltet gezielt auf `next`. Idempotent — gleicher Wert ändert nichts. */\n set(next: boolean): void;\n isActive(): boolean;\n destroy(): void;\n}\n\n/**\n * Modulweiter Zustand für die body-Scroll-Sperre. Bewusst nicht instanz-lokal:\n * Mehrere Editoren teilen sich einen `document.body`. Würde jede Instanz ihren\n * eigenen Snapshot halten, sicherte die zweite Instanz den bereits gesperrten\n * Wert `'hidden'` als vermeintlichen Ausgangszustand — und schriebe ihn beim\n * Verlassen zurück. Der body bliebe dauerhaft gesperrt.\n *\n * Nur der Übergang 0 → 1 sichert und sperrt, nur 1 → 0 stellt wieder her.\n */\nlet fullscreenCount = 0;\nlet savedBodyOverflow = '';\n\n/**\n * Fullscreen-Toggle: reines CSS über die Klasse `supamde-fullscreen` auf dem\n * Container. Sperrt zusätzlich body-Scroll und lässt Escape den Modus\n * verlassen. Unabhängig von Side-by-Side (keine Zwangskopplung).\n */\nexport function createFullscreen(container: HTMLElement, opts: FullscreenOptions = {}): Fullscreen {\n let active = false;\n\n const set = (next: boolean): void => {\n if (next === active) return;\n active = next;\n container.classList.toggle('supamde-fullscreen', active);\n if (active) {\n // Erst die Instanz, die die Sperre auslöst, sichert den Ausgangswert.\n if (fullscreenCount === 0) savedBodyOverflow = document.body.style.overflow;\n fullscreenCount += 1;\n document.body.style.overflow = 'hidden';\n } else {\n fullscreenCount = Math.max(0, fullscreenCount - 1);\n // Erst wenn keine Instanz mehr im Vollbild ist, kehrt der Ausgangswert zurück.\n if (fullscreenCount === 0) document.body.style.overflow = savedBodyOverflow;\n }\n opts.onToggleFullScreen?.(active);\n };\n\n const onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && active) set(false);\n };\n container.addEventListener('keydown', onKeydown);\n\n return {\n toggle: () => set(!active),\n set,\n isActive: () => active,\n destroy: () => {\n container.removeEventListener('keydown', onKeydown);\n if (active) set(false);\n },\n };\n}\n","/* Custom Properties für das Container-Styling.\n Jede Linie ist EINZELN steuerbar; es gibt bewusst keinen Sammelschalter über\n alle Linien hinweg. `--supamde-border-width` wirkt NUR auf den Außenrahmen —\n die Trennlinien zwischen Toolbar, Inhalt, Statusleiste und Vorschau bleiben\n davon unberührt und haben je einen eigenen Default (`1px`).\n Der Außenrahmen ist zusätzlich pro Kante überschreibbar\n (`--supamde-border-{top,right,bottom,left}-width`), jeweils mit\n `--supamde-border-width` als Vorgabe. Farbe ist für alle Linien EINE:\n `--supamde-border-color`. */\n.supamde-container {\n --supamde-border-color: #d0d0d0;\n --supamde-border-width: 1px;\n --supamde-border-top-width: var(--supamde-border-width);\n --supamde-border-right-width: var(--supamde-border-width);\n --supamde-border-bottom-width: var(--supamde-border-width);\n --supamde-border-left-width: var(--supamde-border-width);\n --supamde-radius: 4px;\n --supamde-divider-toolbar-width: 1px;\n --supamde-divider-statusbar-width: 1px;\n --supamde-divider-preview-width: 1px;\n --supamde-toolbar-bg: #f7f7f7;\n --supamde-btn-hover: #e6e6e6;\n --supamde-btn-active: #d8e6ff;\n --supamde-btn-text: #333;\n\n /* Longhands statt `border`-Shorthand: nur so greifen die vier Kanten-Variablen. */\n border-style: solid;\n border-color: var(--supamde-border-color);\n border-top-width: var(--supamde-border-top-width);\n border-right-width: var(--supamde-border-right-width);\n border-bottom-width: var(--supamde-border-bottom-width);\n border-left-width: var(--supamde-border-left-width);\n border-radius: var(--supamde-radius);\n overflow: hidden;\n}\n\n.supamde-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px;\n border-bottom: var(--supamde-divider-toolbar-width) solid var(--supamde-border-color);\n background: var(--supamde-toolbar-bg);\n flex-wrap: wrap;\n}\n\n.supamde-toolbar button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 3px;\n background: transparent;\n color: var(--supamde-btn-text);\n cursor: pointer;\n}\n\n.supamde-toolbar button:hover {\n background: var(--supamde-btn-hover);\n}\n\n.supamde-toolbar button.active {\n background: var(--supamde-btn-active);\n}\n\n.supamde-toolbar button svg {\n width: 16px;\n height: 16px;\n}\n\n.supamde-separator {\n display: inline-block;\n width: 1px;\n height: 20px;\n margin: 0 4px;\n background: var(--supamde-border-color);\n}\n",".supamde-statusbar {\n display: flex;\n gap: 12px;\n padding: 4px 8px;\n border-top: var(--supamde-divider-statusbar-width, 1px) solid var(--supamde-border-color, #d0d0d0);\n background: var(--supamde-statusbar-bg, #f7f7f7);\n font-size: 12px;\n color: #666;\n}\n\n.supamde-statusbar span {\n white-space: nowrap;\n}\n","/* Side-by-Side: die Editor-Zeile (nicht der ganze Container) ist der\n Flex-Container, damit Toolbar/Statusbar außerhalb volle Breite behalten. */\n.supamde-editor-row {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n}\n.supamde-editor-row .cm-editor {\n flex: 1;\n min-width: 0;\n}\n.supamde-container.supamde-sided .supamde-editor-row .cm-editor {\n flex: 0 0 50%;\n width: 50%;\n}\n.supamde-preview-side {\n width: 50%;\n overflow-y: auto;\n padding: 0.5rem 1rem;\n border-left: var(--supamde-divider-preview-width, 1px) solid var(--supamde-border-color, #ddd);\n box-sizing: border-box;\n}\n",".supamde-container.supamde-fullscreen {\n position: fixed;\n inset: 0;\n z-index: 1000;\n background: var(--supamde-bg, #fff);\n max-width: none;\n\n /* Höhenkette Teil 1: Der Container spannt den Viewport auf und verteilt ihn\n als Flex-Spalte auf Toolbar (auto), Editor-Zeile (Rest) und Statusbar (auto). */\n display: flex;\n flex-direction: column;\n}\n\n/* Höhenkette Teil 2: Die Editor-Zeile nimmt die Resthöhe. `min-height: 0` hebt\n die Flex-Default-Mindesthöhe (`auto`) auf — ohne sie wüchse die Zeile mit dem\n Dokument über den Viewport hinaus, statt intern zu scrollen. */\n.supamde-container.supamde-fullscreen .supamde-editor-row {\n flex: 1;\n min-height: 0;\n}\n\n/* Höhenkette Teil 3: Editor und Vorschau füllen die Zeile; gescrollt wird\n innen im `.cm-scroller` bzw. im Panel (das bereits `overflow-y: auto` hat). */\n.supamde-container.supamde-fullscreen .supamde-editor-row .cm-editor {\n height: 100%;\n}\n","import toolbarCss from './toolbar.css?inline';\nimport statusbarCss from './statusbar.css?inline';\nimport previewCss from './preview.css?inline';\nimport fullscreenCss from './fullscreen.css?inline';\n\n/**\n * Marker-Attribut am erzeugten `<style>`-Tag. Dient zwei Zwecken: Idempotenz\n * (mehrere SupaMDE-Instanzen teilen sich EIN Tag) und Auffindbarkeit für\n * Host-Projekte, die die Regeln gezielt überschreiben oder entfernen wollen.\n */\nconst MARKER = 'data-supamde-styles';\n\n/** Die gebündelten SupaMDE-Styles als String — dieselben Quellen wie `dist/supamde.css`. */\nconst CSS = [toolbarCss, statusbarCss, previewCss, fullscreenCss].join('\\n');\n\n/**\n * Fügt die SupaMDE-Styles EINMALIG als `<style>`-Tag in den Head ein.\n *\n * Im Library-Build extrahiert Vite `import './x.css'` in eine separate Datei\n * (`dist/supamde.css`), die ein blosses `import SupaMDE from 'supamde'` NICHT\n * mitlädt — die Toolbar käme ungestylt an. Deshalb liegt das CSS zusätzlich\n * per `?inline` als String im Bundle und wird hier zur Laufzeit gesetzt.\n *\n * Das Tag landet als ERSTES Kind im Head, damit Host-Stylesheets bei gleicher\n * Spezifität gewinnen (spätere Regel schlägt frühere) und Overrides ohne\n * `!important` möglich bleiben.\n */\nexport function injectStyles(doc: Document = document): void {\n // SSR-/Nicht-DOM-Umgebungen: ohne Head gibt es nichts zu tun.\n const head = doc.head;\n if (!head) return;\n if (head.querySelector(`style[${MARKER}]`)) return;\n\n const style = doc.createElement('style');\n style.setAttribute(MARKER, '');\n style.textContent = CSS;\n head.insertBefore(style, head.firstChild);\n}\n","/**\n * marked v18.1.0 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction I(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var P=I();function W(l){P=l}var A={exec:()=>null};function C(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function h(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(s,r)=>{let o=typeof r==\"string\"?r:r.source;return o=o.replace(x.caret,\"$1\"),t=t.replace(s,o),n},getRegex:()=>new RegExp(t,e)};return n}var _e=((l=\"\")=>{try{return!!new RegExp(\"(?<=1)(?<!1)\"+l)}catch{return!1}})(),x={codeRemoveIndent:/^(?: {0,3}\\t| {1,4})/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \\t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,leadingSpaceTab:/^[ \\t]+/,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,numericCharacterReference:/&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:C(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:C(l=>new RegExp(`^ {0,${l}}((?:-[ \t]*){3,}|(?:_[ \t]*){3,}|(?:\\\\*[ \t]*){3,})(?:\\\\n+|$)`)),fencesBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:C(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:</?(?:${N})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,\"i\")),blockquoteBeginRegex:C(l=>new RegExp(`^ {0,${l}}>`))},$e=/^(?:[ \\t]*(?:\\n|$))+/,Le=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,ze=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,G=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Ae=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,J=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,he=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,de=h(he).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Ee=h(he).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),V=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,Me=/^[^\\n]+/,Y=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ie=h(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",Y).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Ce=h(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,J).getRegex(),N=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",ee=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Be=h(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",ee).replace(\"tag\",N).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ke=l=>h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",l).replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),De=ke(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),qe=ke(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),ve=h(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",qe).getRegex(),te={blockquote:ve,code:Le,def:Ie,fences:ze,heading:Ae,hr:G,html:Be,lheading:de,list:Ce,newline:$e,paragraph:De,table:A,text:Me},ue=h(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),Ze={...te,lheading:Ee,table:ue,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",ue).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex()},He={...te,html:h(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",ee).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:A,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",de).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ge=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ne=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ge=/^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/,Qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,$=/[\\p{P}\\p{S}]/u,B=/[\\s\\p{P}\\p{S}]/u,Q=/[^\\s\\p{P}\\p{S}]/u,je=h(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,B).getRegex(),Fe=/[\\p{Pi}\\p{Ps}\"']/u,fe=/(?!~)[\\p{P}\\p{S}]/u,Ue=/(?!~)[\\s\\p{P}\\p{S}]/u,Ke=/(?:[^\\s\\p{P}\\p{S}]|~)/u,We=h(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",_e?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),me=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Xe=h(me,\"u\").replace(/punct/g,$).getRegex(),Je=h(me,\"u\").replace(/punct/g,fe).getRegex(),Ve=/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,Ye=h(Ve,\"u\").replace(/openQuote/g,Fe).replace(/punct/g,$).getRegex(),xe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",et=h(xe,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),tt=h(xe,\"gu\").replace(/notPunctSpace/g,Ke).replace(/punctSpace/g,Ue).replace(/punct/g,fe).getRegex(),nt=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)\",rt=h(nt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),st=h(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),it=\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)\",ot=h(it,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),at=h(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,$).getRegex(),lt=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",ut=h(lt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),pt=h(/\\\\(punct)/,\"gu\").replace(/punct/g,$).getRegex(),ct=h(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ht=h(ee).replace(\"(?:-->|$)\",\"-->\").getRegex(),dt=h(\"^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",ht).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),be=/\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/,U=h(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/).replace(\"brackets\",be).getRegex(),kt=h(/^!?\\[(label)\\]\\([ \\t\\n]*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?[ \\t\\n]*\\)/).replace(\"label\",U).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),gt=h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",U).replace(\"ref\",Y).getRegex(),ft=h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",Y).getRegex(),pe=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/,mt=h(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/).replace(\"brackets\",be).getRegex(),xt=h(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",mt).replace(\"ref\",pe).getRegex()).replace(\"nolink\",h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",pe).getRegex()).getRegex(),ce=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,bt=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/,Rt=h(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/).replace(/email/g,bt).getRegex(),ne={_backpedal:A,anyPunctuation:pt,autolink:ct,blockSkip:We,br:ge,code:Ne,del:A,delLDelim:A,delRDelim:A,emStrongLDelim:Xe,emStrongRDelimAst:et,emStrongRDelimUnd:st,escape:Ge,link:kt,nolink:ft,punctuation:je,reflink:gt,reflinkSearch:xt,tag:dt,text:Qe,url:A},Tt={...ne,emStrongLDelim:Ye,emStrongRDelimAst:rt,emStrongRDelimUnd:ot,link:h(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",U).getRegex(),reflink:h(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",U).getRegex()},X={...ne,emStrongRDelimAst:tt,emStrongLDelim:Je,delLDelim:at,delRDelim:ut,url:h(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"emailProtocol\",Rt).replace(\"protocol\",ce).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:h(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/).replace(\"protocol\",ce).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},Ot={...X,br:h(ge).replace(\"{2,}\",\"*\").getRegex(),text:h(X.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},j={normal:te,gfm:Ze,pedantic:He},D={normal:ne,gfm:X,breaks:Ot,pedantic:Tt};var wt={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},Re=l=>wt[l];function O(l,e){if(e){if(x.escapeTest.test(l))return l.replace(x.escapeReplace,Re)}else if(x.escapeTestNoEncode.test(l))return l.replace(x.escapeReplaceNoEncode,Re);return l}function Te(l){return l.replace(x.numericCharacterReference,(e,t,n)=>{let s=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return s===0||s>1114111||s>=55296&&s<=57343?\"\\uFFFD\":String.fromCodePoint(s)})}function re(l){try{l=encodeURI(l).replace(x.percentDecode,\"%\")}catch{return null}return l}function se(l,e){let t=l.replace(x.findPipe,(r,o,i)=>{let u=!1,a=o;for(;--a>=0&&i[a]===\"\\\\\";)u=!u;return u?\"|\":\" |\"}),n=t.split(x.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;s<n.length;s++)n[s]=n[s].trim().replace(x.slashPipe,\"|\");return n}function L(l,e,t){let n=l.length;if(n===0)return\"\";let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function ie(l){let e=l.split(`\n`),t=e.length-1;for(;t>=0&&x.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`\n`)}function q(l){return l.trim().toLowerCase().toUpperCase().toLowerCase()}function oe(l,e){if(l.indexOf(e[0])===-1&&l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ae(l,e=0){let t=e,n=\"\";for(let s of l)if(s===\"\t\"){let r=4-t%4;n+=\" \".repeat(r),t+=r}else n+=s,t++;return n}function Oe(l,e,t,n,s){let r=e.href,o=e.title||null,i=l[1].replace(s.other.outputLinkReplace,\"$1\"),u=l[0].charAt(0)===\"!\";n.state.inLink=!0;let a=n.state.linkEmitted,p=n.state.inRawBlock;n.state.linkEmitted=!1;let c=n.inlineTokens(i),d=n.state.linkEmitted;if(n.state.linkEmitted=a,n.state.inLink=!1,!u){if(d){n.state.inRawBlock=p;return}n.state.linkEmitted=!0}return{type:u?\"image\":\"link\",raw:t,href:r,title:o,text:i,tokens:c}}function Pt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`\n`).map(r=>{let o=r.match(t.other.beginningSpace);if(o===null)return r;let[i]=o;return r.slice(Math.min(i.length,s.length))}).join(`\n`)}function we(l,e,t,n){if(!e.includes(\"<\"))return!1;for(let s=0;s<e.length;s++){if(e[s]===\"\\\\\"){s++;continue}if(e[s]===\"`\"){let i=n.inline.code.exec(e.slice(s));if(i){s+=i[0].length-1;continue}}if(e[s]!==\"<\")continue;let r=l.slice(t+s),o=n.inline.tag.exec(r)||n.inline.autolink.exec(r);if(o){if(o[0].length>e.length-s)return!0;s+=o[0].length-1}}return!1}var y=class{options;rules;lexer;constructor(e){this.options=e||P}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:ie(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:n,codeBlockStyle:\"indented\",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Pt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=L(n,\"#\");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:\"heading\",raw:L(t[0],`\n`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:L(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=L(t[0],`\n`).split(`\n`),s=\"\",r=\"\",o=[];for(;n.length>0;){let i=!1,u=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))u.push(n[a]),i=!0;else if(!i)u.push(n[a]);else break;n=n.slice(a);let p=u.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");s=s?`${s}\n${p}`:p,r=r?`${r}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,o,!0),this.lexer.state.top=d,n.length===0)break;let m=o.at(-1);if(m?.type===\"code\")break;if(m?.type===\"blockquote\"){let b=m,g=n.join(`\n`),w=b.raw+`\n`+g.replace(this.rules.other.blockquoteSetextReplace2,\"\"),f=this.blockquote(w);o[o.length-1]=f;let M=w.substring(f.raw.length).replace(/^\\n/,\"\"),v=M?M.split(`\n`).length:0,Z=v?n.slice(0,-v):n;Z.length>0&&(s=`${s}\n${Z.join(`\n`)}`),r=r.substring(0,r.length-b.text.length)+f.text;break}else if(m?.type===\"list\"){let b=m,g=b.raw+`\n`+n.join(`\n`),w=this.list(g);o[o.length-1]=w,s=s.substring(0,s.length-m.raw.length)+w.raw,r=r.substring(0,r.length-b.raw.length)+w.raw,n=g.substring(o.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:\"list\",raw:\"\",ordered:s,start:s?+n.slice(0,-1):\"\",loose:!1,items:[]};n=s?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=s?n:\"[*+-]\");let o=this.rules.other.listItemRegex(n),i=!1;for(;e;){let a=!1,p=\"\",c=\"\";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=t[2].split(`\n`,1)[0],m=t[1].length,b=this.options.pedantic?ae(d,m):d.replace(this.rules.other.leadingSpaceTab,M=>ae(M,m)),g=e.split(`\n`,1)[0],w=!b.trim(),f=0;if(this.options.pedantic?(f=2,c=b.trimStart()):w?f=m+1:(f=b.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=b.slice(f),f+=m),w&&this.rules.other.blankLine.test(g)&&(p+=g+`\n`,e=e.substring(g.length+1),a=!0),!a){let M=this.rules.other.nextBulletRegex(f),v=this.rules.other.hrRegex(f),Z=this.rules.other.fencesBeginRegex(f),le=this.rules.other.headingBeginRegex(f),Pe=this.rules.other.htmlBeginRegex(f),ye=this.rules.other.blockquoteBeginRegex(f);for(;e;){let K=e.split(`\n`,1)[0],H;if(g=K,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting,\" \"),H=g):H=g.replace(this.rules.other.leadingSpaceTab,Se=>Se.replace(this.rules.other.tabCharGlobal,\" \")),Z.test(g)||le.test(g)||Pe.test(g)||ye.test(g)||M.test(g)||v.test(g))break;if(H.search(this.rules.other.nonSpaceChar)>=f||!g.trim())c+=`\n`+H.slice(f);else{if(w||b.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Z.test(b)||le.test(b)||v.test(b))break;c+=`\n`+g}w=!g.trim(),p+=K+`\n`,e=e.substring(K.length+1),b=H.slice(f)}}r.loose||(i?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0)),r.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=p}let u=r.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let p=a.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));r.loose=c}for(let a of r.items){let p=a.tokens[0];if(a.task&&(p?.type===\"text\"||p?.type===\"paragraph\")){a.text=a.text.replace(this.rules.other.listReplaceTask,\"\"),p.raw=p.raw.replace(this.rules.other.listReplaceTask,\"\"),p.text=p.text.replace(this.rules.other.listReplaceTask,\"\");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,\"\");break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let d={type:\"checkbox\",raw:c[0]+\" \",checked:c[0]!==\"[ ]\"};a.checked=d.checked,r.loose?a.tokens[0]&&[\"paragraph\",\"text\"].includes(a.tokens[0].type)&&\"tokens\"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=d.raw+a.tokens[0].raw,a.tokens[0].text=d.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(d)):a.tokens.unshift({type:\"paragraph\",raw:d.raw,text:d.raw,tokens:[d]}):a.tokens.unshift(d)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let p of a.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=ie(t[0]);return{type:\"html\",block:!0,raw:n,pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){if(!this.rules.other.startAngleBracket.test(t[2])&&oe(t[2],\"()\")!==-1)return;let n=q(t[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:L(t[0],`\n`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=se(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],o={type:\"table\",raw:L(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===s.length){for(let i of s)this.rules.other.tableAlignRight.test(i)?o.align.push(\"right\"):this.rules.other.tableAlignCenter.test(i)?o.align.push(\"center\"):this.rules.other.tableAlignLeft.test(i)?o.align.push(\"left\"):o.align.push(null);for(let i=0;i<n.length;i++)o.header.push({text:n[i],tokens:this.lexer.inline(n[i]),header:!0,align:o.align[i]});for(let i of r)o.rows.push(se(i,o.header.length).map((u,a)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:o.align[a]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:L(t[0],`\n`),depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,t[1],n,this.rules))return;let s=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=L(s.slice(0,-1),\"\\\\\");if((s.length-i.length)%2===0)return}else{let i=oe(t[2],\"()\");if(i===-2)return;if(i>-1){let a=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,a).trim(),t[3]=\"\"}}let r=t[2],o=\"\";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(r);i&&(r=i[1],o=i[3])}else o=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?r=r.slice(1):r=r.slice(1,-1)),Oe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:o&&o.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=n[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,n[1],s,this.rules))return;let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),o=t[q(r)];if(!o){let i=n[0].charAt(0);return{type:\"text\",raw:i,text:i}}return Oe(n,o,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=0,c=s[0][0],d=n===c,m=c===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,t=t.slice(-1*e.length+o);(s=m.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(u=[...i].length,s[3]||s[4]){a+=u;continue}else if(s[5]||s[6]){if(o%3&&!((o+u)%3)){p+=u;continue}if(d)break}if(a-=u,a>0)continue;u=Math.min(u,u+a+p);let b=[...s[0]][0].length,g=e.slice(0,o+s.index+b+u);if(Math.min(o,u)%2){let f=g.slice(1,-1);return{type:\"em\",raw:g,text:f,tokens:this.lexer.inlineTokens(f)}}let w=g.slice(2,-2);return{type:\"strong\",raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+o);(s=p.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(u=[...i].length,u!==o))continue;if(s[3]||s[4]){a+=u;continue}if(a-=u,a>0)continue;u=Math.min(u,u+a);let c=[...s[0]][0].length,d=e.slice(0,o+s.index+c+u),m=d.slice(o,-o);return{type:\"del\",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===\"@\"?(n=t[1],s=\"mailto:\"+n):(n=t[1],s=n),{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===\"@\")n=t[0],s=\"mailto:\"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(r!==t[0]);n=t[0],t[1]===\"www.\"?s=\"http://\"+t[0]:s=t[0]}return{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:n?t[0]:Te(t[0]),escaped:n}}}};var R=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||P,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let t={other:x,block:j.normal,inline:D.normal};this.options.pedantic?(t.block=j.pedantic,t.inline=D.pedantic):this.options.gfm&&(t.block=j.gfm,this.options.breaks?t.inline=D.breaks:t.inline=D.gfm),this.tokenizer.rules=t}static get rules(){return{block:j,inline:D}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(x.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(x.tabCharGlobal,\" \").replace(x.spaceLine,\"\"));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(i=>(r=i.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let i=t.at(-1);r.raw.length===1&&i!==void 0?i.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},u),typeof a==\"number\"&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(r=this.tokenizer.paragraph(o))){let i=t.at(-1);n&&i?.type===\"paragraph\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r),n=o.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(\"[\"))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==\"!\")return!0;for(let n of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let s=n[0],r=s.lastIndexOf(\"[\");if(!(s.charAt(0)===\"!\"||!Object.hasOwn(this.tokens.links,q(s.slice(r+1,-1))))&&!(r>1&&this.linkInText(s.slice(1,r-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=this.state.linkParenPossible;this.state.linkParenPossible=n&&e.includes(\")\");try{return this.#e(e,t)}finally{this.state.linkParenPossible=n}}#e(e,t){let n=e;if(this.tokens.links&&e.includes(\"[\")){let i=this.tokenizer.rules.inline.reflinkSearch,u=a=>{let p=a.lastIndexOf(\"[\");if(!Object.hasOwn(this.tokens.links,q(a.slice(p+1,-1))))return a;if(p>1&&a.charAt(0)!==\"!\"){let c=a.slice(1,p-1);if(this.linkInText(c))return\"[\"+c.replace(i,u)+\"][\"+\"a\".repeat(a.length-p-2)+\"]\"}return\"[\"+\"a\".repeat(a.length-2)+\"]\"};n=n.replace(i,u)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,i=>\"+\".repeat(i.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(i,u,a)=>{let p=a?a.length:0;return i.slice(0,p)+\"[\"+\"a\".repeat(i.length-p-2)+\"]\"}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=\"\",o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=\"\"),s=!1;let i;if(this.options.extensions?.inline?.some(a=>(i=a.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let a=t.at(-1);i.type===\"text\"&&a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(i=this.tokenizer.emStrong(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.del(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),t.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),t.push(i);continue}let u=e;if(this.options.extensions?.startInline){let a=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(d=>{c=d.call({lexer:this},p),typeof c==\"number\"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(u=e.substring(0,a+1))}if(i=this.tokenizer.inlineText(u)){e=e.substring(i.raw.length),i.raw.slice(-1)!==\"_\"&&(r=i.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=\"Infinite loop on byte: \"+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var S=class{options;parser;constructor(e){this.options=e||P}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let s=(t||\"\").match(x.notSpaceStart)?.[0],r=e?e.replace(x.endingNewline,\"\")+`\n`:\"\";return s?'<pre><code class=\"language-'+O(s)+'\">'+(n?r:O(r,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?r:O(r,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,s=\"\";for(let i=0;i<e.items.length;i++){let u=e.items[i];s+=this.listitem(u)}let r=t?\"ol\":\"ul\",o=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+r+o+`>\n`+s+\"</\"+r+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=\"\";for(let r=0;r<e.rows.length;r++){let o=e.rows[r];n=\"\";for(let i=0;i<o.length;i++)n+=this.tablecell(o[i]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+s+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:s,autolink:r}){let o=r?O(n,!0):this.parser.parseInline(s),i=re(e);if(i===null)return o;e=O(i,r);let u='<a href=\"'+e+'\"';return t&&(u+=' title=\"'+O(t)+'\"'),u+=\">\"+o+\"</a>\",u}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=re(e);if(r===null)return O(n);e=r;let o=`<img src=\"${O(e)}\" alt=\"${O(n)}\"`;return t&&(o+=` title=\"${O(t)}\"`),o+=\">\",o}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var z=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var T=class l{options;renderer;textRenderer;constructor(e){this.options=e||P,this.options.renderer=this.options.renderer||new S,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new z}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let o=s,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"checkbox\",\"html\",\"def\",\"paragraph\",\"text\"].includes(o.type)){t+=i||\"\";continue}}let r=s;switch(r.type){case\"space\":{t+=this.renderer.space(r);break}case\"hr\":{t+=this.renderer.hr(r);break}case\"heading\":{t+=this.renderer.heading(r);break}case\"code\":{t+=this.renderer.code(r);break}case\"table\":{t+=this.renderer.table(r);break}case\"blockquote\":{t+=this.renderer.blockquote(r);break}case\"list\":{t+=this.renderer.list(r);break}case\"checkbox\":{t+=this.renderer.checkbox(r);break}case\"html\":{t+=this.renderer.html(r);break}case\"def\":{t+=this.renderer.def(r);break}case\"paragraph\":{t+=this.renderer.paragraph(r);break}case\"text\":{t+=this.renderer.text(r);break}default:{let o='Token with \"'+r.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||![\"escape\",\"html\",\"link\",\"image\",\"checkbox\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(r.type)){n+=i||\"\";continue}}let o=r;switch(o.type){case\"escape\":{n+=t.text(o);break}case\"html\":{n+=t.html(o);break}case\"link\":{n+=t.link(o);break}case\"image\":{n+=t.image(o);break}case\"checkbox\":{n+=t.checkbox(o);break}case\"strong\":{n+=t.strong(o);break}case\"em\":{n+=t.em(o);break}case\"codespan\":{n+=t.codespan(o);break}case\"br\":{n+=t.br(o);break}case\"del\":{n+=t.del(o);break}case\"text\":{n+=t.text(o);break}default:{let i='Token with \"'+o.type+'\" type was not found.';if(this.options.silent)return console.error(i),\"\";throw new Error(i)}}}return n}};var _=class{options;block;constructor(e){this.options=e||P}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?R.lex:R.lexInline}provideParser(e=this.block){return e?T.parse:T.parseInline}};var F=class{defaults=I();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=T;Renderer=S;TextRenderer=z;Lexer=R;Tokenizer=y;Hooks=_;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case\"table\":{let r=s;for(let o of r.header)n=n.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let i of o)n=n.concat(this.walkTokens(i.tokens,t));break}case\"list\":{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let i=r[o].flat(1/0);n=n.concat(this.walkTokens(i,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(\"extension name required\");if(\"renderer\"in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...i){let u=r.renderer.apply(this,i);return u===!1&&(u=o.apply(this,i)),u}:t.renderers[r.name]=r.renderer}if(\"tokenizer\"in r){if(!r.level||r.level!==\"block\"&&r.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===\"block\"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===\"inline\"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}\"childTokens\"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new S(this.defaults);for(let o in n.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if([\"options\",\"parser\"].includes(o))continue;let i=o,u=n.renderer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c||\"\"}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new y(this.defaults);for(let o in n.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(o))continue;let i=o,u=n.tokenizer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new _;for(let o in n.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if([\"options\",\"block\"].includes(o))continue;let i=o,u=n.hooks[i],a=r[i];_.passThroughHooks.has(o)?r[i]=p=>{if(this.defaults.async&&_.passThroughHooksRespectAsync.has(o))return(async()=>{let d=await u.call(r,p);return a.call(r,d)})();let c=u.call(r,p);return a.call(r,c)}:r[i]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await u.apply(r,p);return d===!1&&(d=await a.apply(r,p)),d})();let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(i){let u=[];return u.push(o.call(this,i)),r&&(u=u.concat(r.call(this,i))),u}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return R.lex(e,t??this.defaults)}parser(e,t){return T.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},o={...this.defaults,...r},i=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return i(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return i(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(o.hooks&&(o.hooks.options=o,o.hooks.block=e),o.async)return(async()=>{let u=o.hooks?await o.hooks.preprocess(n):n,p=await(o.hooks?await o.hooks.provideLexer(e):e?R.lex:R.lexInline)(u,o),c=o.hooks?await o.hooks.processAllTokens(p):p;o.walkTokens&&await Promise.all(this.walkTokens(c,o.walkTokens));let m=await(o.hooks?await o.hooks.provideParser(e):e?T.parse:T.parseInline)(c,o);return o.hooks?await o.hooks.postprocess(m):m})().catch(i);try{o.hooks&&(n=o.hooks.preprocess(n));let a=(o.hooks?o.hooks.provideLexer(e):e?R.lex:R.lexInline)(n,o);o.hooks&&(a=o.hooks.processAllTokens(a)),o.walkTokens&&this.walkTokens(a,o.walkTokens);let c=(o.hooks?o.hooks.provideParser(e):e?T.parse:T.parseInline)(a,o);return o.hooks&&(c=o.hooks.postprocess(c)),c}catch(u){return i(u)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let s=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var E=new F;function k(l,e){return E.parse(l,e)}k.options=k.setOptions=function(l){return E.setOptions(l),k.defaults=E.defaults,W(k.defaults),k};k.getDefaults=I;k.defaults=P;function yt(...l){return E.use(...l),k.defaults=E.defaults,W(k.defaults),k}k.use=yt;k.walkTokens=function(l,e){return E.walkTokens(l,e)};k.parseInline=E.parseInline;k.Parser=T;k.parser=T.parse;k.Renderer=S;k.TextRenderer=z;k.Lexer=R;k.lexer=R.lex;k.Tokenizer=y;k.Hooks=_;k.parse=k;var gn=k.options,fn=k.setOptions,mn=k.walkTokens,xn=k.parseInline,bn=k,Rn=T.parse,Tn=R.lex;export{_ as Hooks,R as Lexer,F as Marked,T as Parser,S as Renderer,z as TextRenderer,y as Tokenizer,P as defaults,I as getDefaults,Tn as lexer,k as marked,gn as options,bn as parse,xn as parseInline,Rn as parser,fn as setOptions,yt as use,mn as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","/** Escaped die fünf HTML-kritischen Zeichen für sichere Text-in-HTML-Einbettung. */\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","import type { MarkedExtension, TokenizerAndRendererExtension } from 'marked';\nimport { escapeHtml } from '../utils/html';\n\n/** Signatur von `katex.renderToString`. */\ntype KatexRender = (expr: string, opts: { displayMode: boolean; throwOnError: boolean }) => string;\n/** Minimale Form des KaTeX-Objekts (global oder injiziert). */\ninterface KatexLike { renderToString: KatexRender }\n/** Token-Objekt aus marked, mit text und raw. */\ninterface MathToken { text: string; raw: string }\n\n/**\n * KaTeX defensiv & SYNCHRON auflösen. KaTeX ist eine OPTIONALE Peer-Dependency\n * (Design §3.3). Auflösungs-Reihenfolge, jedes Mal beim Rendern ausgewertet\n * (nicht gecacht → spätere Injektion/Late-CDN-Load wirkt sofort):\n * 1. explizit via `setKatex(...)` injiziert (Bundler-Host reicht sein KaTeX rein)\n * 2. `globalThis.katex` (CDN-`<script>`, z.B. im Example)\n * Fehlt beides, bleibt die Auflösung `null` → Renderer geben Rohtext zurück\n * (graceful degradation, kein Crash).\n */\nlet injected: KatexLike | null = null;\n\n/**\n * Injiziert eine KaTeX-Instanz (für Bundler-Setups, die `katex` als echtes\n * Modul importieren und reinreichen). Fluchtluke — im Example/CDN-Fall nicht nötig.\n */\nexport function setKatex(katex: KatexLike | null): void {\n injected = katex;\n}\n\n/** Aktuelle KaTeX-Instanz oder null (synchron, ohne Import-Race). */\nfunction resolveKatex(): KatexLike | null {\n if (injected) return injected;\n const g = (globalThis as { katex?: KatexLike }).katex;\n return g ?? null;\n}\n\n/** Rendert eine Formel; ohne KaTeX Rohtext (HTML-escaped) zurück. */\nfunction render(expr: string, displayMode: boolean, raw: string): string {\n const katex = resolveKatex();\n if (!katex) return escapeHtml(raw);\n return katex.renderToString(expr, { displayMode, throwOnError: false });\n}\n\n/** Block-Formel: $$ … $$ (mehrzeilig, \\begin{align} darin). displayMode. */\nconst blockMath: TokenizerAndRendererExtension = {\n name: 'blockMath',\n level: 'block',\n start(src) {\n return src.indexOf('$$');\n },\n tokenizer(src) {\n const match = /^\\$\\$([\\s\\S]+?)\\$\\$/.exec(src);\n if (!match || !match[1]) return undefined;\n return { type: 'blockMath', raw: match[0], text: match[1].trim() };\n },\n renderer(token) {\n const t = token as unknown as MathToken;\n return render(t.text, true, t.raw);\n },\n};\n\n/**\n * Inline-Formel: $ … $ (einzeilig). Kein-Leerzeichen-Regel (Design §3.2):\n * kein Space direkt nach dem öffnenden bzw. vor dem schließenden $, damit\n * Preistext (\"$5 und $10\") nicht als Formel erkannt wird, ziffern-beginnende\n * Formeln (\"$x_5$\") aber schon.\n */\nconst inlineMath: TokenizerAndRendererExtension = {\n name: 'inlineMath',\n level: 'inline',\n start(src) {\n return src.indexOf('$');\n },\n tokenizer(src) {\n const match = /^\\$(?! )((?:[^$\\n]|\\\\\\$)*?[^ $\\n])\\$/.exec(src);\n if (!match || !match[1]) return undefined;\n return { type: 'inlineMath', raw: match[0], text: match[1] };\n },\n renderer(token) {\n const t = token as unknown as MathToken;\n return render(t.text, false, t.raw);\n },\n};\n\n/** marked-Extension-Bündel für $$-Block- und $-Inline-Math. */\nexport const katexMarkedExtension: MarkedExtension = {\n extensions: [blockMath, inlineMath],\n};\n\n/** Ob KaTeX aktuell verfügbar ist (für Tests/Diagnose). Synchron, ohne Race. */\nexport function isKatexAvailable(): boolean {\n return resolveKatex() !== null;\n}\n","/**\n * Ergänzt bei allen <a>-Tags ohne target ein target=\"_blank\" plus\n * rel=\"noopener noreferrer\". Minimales Sanitizing für die Preview — kein\n * DOMPurify (bewusste Scope-Grenze, siehe Design §3.4).\n */\nexport function addAnchorTargetBlank(html: string): string {\n return html.replace(/<a\\b(?![^>]*\\btarget=)([^>]*)>/gi, '<a target=\"_blank\" rel=\"noopener noreferrer\"$1>');\n}\n","import { Marked } from 'marked';\nimport { katexMarkedExtension } from './katex-marked';\nimport { addAnchorTargetBlank } from './sanitize';\n\nexport interface RenderOptions {\n /** marked `breaks`: einfacher Zeilenumbruch → <br>. Default true. */\n singleLineBreaks?: boolean;\n /** Ersetzt den eingebauten Renderer komplett (Fluchtluke). */\n previewRender?: (text: string) => string;\n}\n\n/**\n * Baut `RenderOptions` aus den (rohen) SupaMDE-Optionen — die EINE Stelle, an\n * der die Render-Relevanten Felder aus `SupaMDEOptions` extrahiert werden.\n * Panel-Verdrahtung UND `markdown()`-Fassade nutzen sie beide (keine\n * doppelte Inline-Konstruktion, Design §3.1 „eine Quelle der Wahrheit\").\n *\n * Typ bewusst strukturell (`Pick`), damit `parse.ts` NICHT `options.ts`\n * importieren muss — bleibt frei von Editor-/Fassaden-Abhängigkeiten.\n */\nexport function renderOptionsFrom(o: {\n renderingConfig?: { singleLineBreaks?: boolean };\n previewRender?: (text: string) => string;\n}): RenderOptions {\n return {\n singleLineBreaks: o.renderingConfig?.singleLineBreaks,\n previewRender: o.previewRender,\n };\n}\n\n/**\n * Markdown → HTML. Ohne `previewRender`: marked (GFM) + KaTeX-Extensions +\n * addAnchorTargetBlank. Reine Funktion (kein DOM, kein Editor) — Basis der\n * öffentlichen `markdown()`-Methode UND der Side-by-Side-Vorschau.\n */\nexport function markdownToHtml(text: string, opts: RenderOptions = {}): string {\n if (opts.previewRender) return opts.previewRender(text);\n const marked = new Marked({ gfm: true, breaks: opts.singleLineBreaks ?? true });\n marked.use(katexMarkedExtension);\n const html = marked.parse(text, { async: false }) as string;\n return addAnchorTargetBlank(html);\n}\n","/**\n * Der Speicher-Vertrag des Autosave. Async-fähig, damit ein Server-Backend oder\n * IndexedDB ohne Zusatzschicht passt — die eingebaute localStorage-Variante ist\n * synchron, SupaMDE behandelt beide Fälle über `await` gleich.\n */\nexport interface SupaStorage {\n load(key: string): string | null | Promise<string | null>;\n save(key: string, value: string): void | Promise<void>;\n clear(key: string): void | Promise<void>;\n}\n\n/** Default-Prefix im localStorage: Einträge liegen unter `supamde:<key>`. */\nexport const STORAGE_PREFIX = 'supamde:';\n\n/** localStorage-Implementierung. Synchron; wirft bei Quota/Private Mode durch. */\nexport function createLocalStorage(prefix: string = STORAGE_PREFIX): SupaStorage {\n const full = (key: string): string => `${prefix}${key}`;\n return {\n load: (key) => localStorage.getItem(full(key)),\n save: (key, value) => {\n localStorage.setItem(full(key), value);\n },\n clear: (key) => {\n localStorage.removeItem(full(key));\n },\n };\n}\n\n/**\n * In-Memory-Speicher. Primär als Testdouble gedacht, aber auch als bewusste\n * Host-Wahl brauchbar (\"nur für diese Sitzung merken\").\n */\nexport function createMemoryStorage(): SupaStorage {\n const map = new Map<string, string>();\n return {\n load: (key) => map.get(key) ?? null,\n save: (key, value) => {\n map.set(key, value);\n },\n clear: (key) => {\n map.delete(key);\n },\n };\n}\n\n/**\n * Probe-Schreibvorgang: schreibt einen Wegwerf-Eintrag, liest ihn zurück und\n * räumt ihn wieder ab. Fängt JEDEN Wurf — im Private Mode wirft schon der\n * Zugriff auf `localStorage`, nicht erst `setItem`.\n *\n * Wichtig: Die Verfügbarkeit ist nur die halbe Miete. Der spätere `save()` mit\n * echtem Inhalt läuft trotzdem in `try/catch` (siehe `autosave.ts`) — easyMDE\n * prüfte nur mit einem Ein-Byte-Probeschreiben und ließ die echte\n * Quota-Exception beim Speichern großer Inhalte ungefangen durchschlagen.\n */\nexport async function isStorageAvailable(storage: SupaStorage): Promise<boolean> {\n const probe = '__supamde_probe__';\n try {\n await storage.save(probe, '1');\n const wert = await storage.load(probe);\n await storage.clear(probe);\n return wert === '1';\n } catch {\n return false;\n }\n}\n","import { createLocalStorage, isStorageAvailable, type SupaStorage } from './storage';\n\n/** Konfiguration des Autosave. */\nexport interface AutosaveOptions {\n /** Aktiviert Autosave. Default: false. */\n enabled?: boolean;\n /** Pflicht. Identifiziert das Dokument im Speicher. */\n key: string;\n /** Debounce nach der letzten Änderung, in ms. Default: 1000. */\n delay?: number;\n /** Eigener Speicher. Default: localStorage unter `supamde:<key>`. */\n storage?: SupaStorage;\n /** Wird gerufen, wenn beim Start ein Entwurf geladen wurde. */\n onRestore?: (saved: string) => void;\n}\n\n/** Die Hooks, über die Autosave das Dokument erreicht — ohne CM6-Abhängigkeit. */\nexport interface AutosaveHooks {\n getValue(): string;\n setValue(value: string): void;\n onSaved(time: Date): void;\n}\n\n/** Das Steuerungs-Handle über eine Autosave-Instanz. */\nexport interface Autosave {\n start(): Promise<void>;\n schedule(): void;\n clear(): Promise<void>;\n stop(): void;\n isActive(): boolean;\n}\n\n/** Default-Debounce in Millisekunden. */\nexport const DEFAULT_AUTOSAVE_DELAY = 1000;\n\nexport function createAutosave(options: AutosaveOptions, hooks: AutosaveHooks): Autosave {\n const enabled = options.enabled ?? false;\n const delay = options.delay ?? DEFAULT_AUTOSAVE_DELAY;\n const storage = options.storage ?? createLocalStorage();\n const key = options.key;\n\n /**\n * Der Dokumentinhalt zum Zeitpunkt der Erzeugung. Referenzpunkt für den\n * Restore: Nur wenn das Dokument seither UNBERÜHRT ist, darf ein Entwurf es\n * überschreiben. `start()` ist async — ein Host, der direkt nach der\n * Konstruktion `setValue()` ruft, wäre sonst um seinen Wert gebracht, weil ein\n * Vergleich gegen den dann-aktuellen Inhalt die Host-Änderung als \"weicht vom\n * Entwurf ab\" liest und damit als Grund zum Wiederherstellen.\n */\n const ausgangswert = hooks.getValue();\n\n let aktiv = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n /**\n * Nur EINE Warnung pro Instanz. easyMDE warnte bei jedem Tastendruck erneut —\n * bei vollem Speicher füllte das die Konsole schneller, als man lesen konnte.\n */\n let gewarnt = false;\n\n const warnEinmal = (nachricht: string): void => {\n if (gewarnt) return;\n gewarnt = true;\n console.warn(`SupaMDE: ${nachricht}`);\n };\n\n const stop = (): void => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const speichere = async (): Promise<void> => {\n if (!aktiv) return;\n const wert = hooks.getValue();\n try {\n // Leerer Inhalt löscht statt zu speichern — sonst legte sich beim nächsten\n // Start ein leerer Entwurf über einen befüllten Ausgangsinhalt.\n if (wert.trim() === '') {\n await storage.clear(key);\n } else {\n await storage.save(key, wert);\n }\n hooks.onSaved(new Date());\n } catch {\n // Die Verfügbarkeitsprobe hat nur ein Byte geschrieben; die echte Quota\n // schlägt erst bei großem Inhalt zu. Ab hier still abschalten statt bei\n // jedem Tastendruck erneut zu werfen.\n aktiv = false;\n stop();\n warnEinmal('autosave storage is not writable — autosave is disabled.');\n }\n };\n\n const start = async (): Promise<void> => {\n if (!enabled) return;\n if (!key) {\n warnEinmal('autosave.key is required — autosave stays off.');\n return;\n }\n if (!(await isStorageAvailable(storage))) {\n warnEinmal('autosave storage is not available — autosave is disabled.');\n return;\n }\n aktiv = true;\n\n let gespeichert: string | null;\n try {\n gespeichert = await storage.load(key);\n } catch {\n aktiv = false;\n warnEinmal('autosave storage is not readable — autosave is disabled.');\n return;\n }\n\n const aktuell = hooks.getValue();\n\n // Hat der Host das Dokument seit der Erzeugung angefasst, gewinnt ER. Er\n // weiß mehr über seinen Fall (Inhalt nachgeladen, Formular vorbefüllt) als\n // der Editor, und ein stilles Überschreiben wäre der schlimmere Fehler als\n // ein nicht wiederhergestellter Entwurf. Der Entwurf bleibt im Speicher\n // erhalten und ist beim nächsten Öffnen wieder ein Kandidat.\n if (aktuell !== ausgangswert) return;\n\n // Der gespeicherte Stand gewinnt gegenüber dem Ausgangsinhalt — das IST der\n // Zweck des Features. Aber nur, wenn es überhaupt etwas anderes ist: Gleicht\n // der Stand dem Dokument, gibt es keinen Entwurf wiederherzustellen, und\n // `onRestore` würde den Host grundlos alarmieren.\n //\n // `trim()` in der Leerprüfung — dieselbe Definition von \"leer\" wie beim\n // Speichern. Sonst legte sich ein Entwurf aus reinem Whitespace über einen\n // befüllten Ausgangsinhalt, obwohl genau dieser Inhalt nie hätte\n // gespeichert werden können (dort löst er `clear()` aus).\n if (gespeichert && gespeichert.trim() !== '' && gespeichert !== aktuell) {\n hooks.setValue(gespeichert);\n options.onRestore?.(gespeichert);\n }\n };\n\n const schedule = (): void => {\n if (!aktiv) return;\n stop();\n timer = setTimeout(() => {\n timer = null;\n void speichere();\n }, delay);\n };\n\n /**\n * Löscht den Eintrag UND stoppt den Timer. Das Stoppen ist wesentlich: Ohne es\n * schriebe ein noch laufender Debounce den gerade gelöschten Eintrag sofort\n * zurück — genau der easyMDE-Fehler, wegen dem `clearAutosavedValue()` dort\n * wirkungslos schien.\n */\n const clear = async (): Promise<void> => {\n stop();\n try {\n await storage.clear(key);\n } catch {\n warnEinmal('autosave entry could not be deleted.');\n }\n };\n\n return { start, schedule, clear, stop, isActive: () => aktiv };\n}\n","import { StateEffect, StateField, type EditorState } from '@codemirror/state';\n\n/** Der aktuelle Bereich eines offenen Platzhalters im Dokument. */\nexport interface PlaceholderRange {\n from: number;\n to: number;\n}\n\n/** Nimmt einen neuen Platzhalter unter `id` in die Verfolgung auf. */\nexport const addPlaceholder = StateEffect.define<{ id: number; from: number; to: number }>();\n\n/** Nimmt den Platzhalter mit dieser `id` wieder heraus. */\nexport const removePlaceholder = StateEffect.define<number>();\n\n/**\n * Hält die offenen Platzhalter und mappt sie bei JEDER Transaktion durch\n * `tr.changes`. Bewusst ein StateField und kein Instanzfeld mit gemerkten\n * Zahlen: Genau daran scheiterte easyMDE — dort wurde das fertige Bild\n * nachträglich am dann-aktuellen Cursor eingefügt, sodass es bei Weitertippen\n * an falscher Stelle landete.\n */\nexport const uploadPlaceholderField = StateField.define<Map<number, PlaceholderRange>>({\n create() {\n return new Map();\n },\n\n update(value, tr) {\n let next = value;\n\n if (tr.docChanged && next.size > 0) {\n const gemappt = new Map<number, PlaceholderRange>();\n for (const [id, range] of next) {\n // `assoc: +1` für `from`, `-1` für `to` — der Bereich SCHRUMPFT an\n // beiden Grenzen. Text, der genau davor oder genau dahinter eingefügt\n // wird, bleibt draußen; sonst verschluckte ihn die spätere Ersetzung\n // durch das fertige Bild. Am realen CM6 verifiziert: nur diese\n // Kombination hält beide Grenzen dicht (`-1`/`+1` tut das Gegenteil).\n const from = tr.changes.mapPos(range.from, 1);\n const to = tr.changes.mapPos(range.to, -1);\n // Auf Länge 0 zusammengefallen heißt: der Nutzer hat den Platzhalter\n // gelöscht (oder `setValue()` hat das Dokument ersetzt). Dann ist der\n // Eintrag hinfällig — das Ergebnis darf nirgendwo mehr landen.\n if (to > from) gemappt.set(id, { from, to });\n }\n next = gemappt;\n }\n\n for (const effect of tr.effects) {\n if (effect.is(addPlaceholder)) {\n const kopie = new Map(next);\n kopie.set(effect.value.id, { from: effect.value.from, to: effect.value.to });\n next = kopie;\n } else if (effect.is(removePlaceholder)) {\n if (next.has(effect.value)) {\n const kopie = new Map(next);\n kopie.delete(effect.value);\n next = kopie;\n }\n }\n }\n\n return next;\n },\n});\n\n/**\n * Der AKTUELLE Bereich eines Platzhalters, oder `null`, wenn er nicht mehr\n * existiert. Die einzige erlaubte Quelle für die Ersetzungsposition.\n */\nexport function placeholderRange(state: EditorState, id: number): PlaceholderRange | null {\n return state.field(uploadPlaceholderField, false)?.get(id) ?? null;\n}\n\n/**\n * Erzeugt eine unabhängige ID-Quelle. Bewusst eine Factory statt eines\n * modul-globalen Zählers: Der wäre gemeinsamer Zustand über alle Instanzen und\n * alle Testdateien hinweg und machte jeden Test auf eine konkrete ID von der\n * Ausführungsreihenfolge abhängig. Eindeutigkeit ist nur PRO View nötig — die\n * IDs sind Schlüssel in der Map genau eines `uploadPlaceholderField`.\n */\nexport function createIdSource(): () => number {\n let zähler = 0;\n return () => {\n zähler += 1;\n return zähler;\n };\n}\n","import type { EditorView } from '@codemirror/view';\nimport {\n addPlaceholder,\n removePlaceholder,\n createIdSource,\n placeholderRange,\n} from './upload-placeholder';\nimport { formatBytes } from '../util/text-format';\nimport { createTranslator, type Translator } from '../i18n/translator';\nimport type { SimpleTextKey } from '../i18n/types';\n\n/**\n * Ein Upload-Fehler — strukturiert statt vorformatiert, damit der Host selbst\n * darstellen und übersetzen kann.\n */\nexport interface UploadError {\n kind: 'too-large' | 'type-not-allowed' | 'upload-failed';\n file: File;\n /** Der ursprüngliche Fehler aus `upload()`, bei `kind === 'upload-failed'`. */\n cause?: unknown;\n}\n\n/** Konfiguration des Bild-Uploads. */\nexport interface UploadImageOptions {\n /** Aktiviert den Bild-Upload. Default: false. */\n enabled?: boolean;\n /** Pflicht. Lädt die Datei hoch und liefert die URL; wirft bei Fehler. */\n upload: (file: File) => Promise<string>;\n /** Maximale Dateigröße in Bytes. Default: 2 MB. */\n maxSize?: number;\n /** Erlaubte MIME-Typen. */\n accept?: string[];\n /** Wird bei jedem Fehler gerufen. Default: keiner (nur Statusbar). */\n onError?: (error: UploadError) => void;\n}\n\n/** Das Steuerungs-Handle über den Uploader. */\nexport interface ImageUploader {\n uploadFiles(files: FileList | File[]): void;\n /** Die erlaubten MIME-Typen — für das `accept`-Attribut des File-Inputs. */\n accept(): string[];\n isActive(): boolean;\n /**\n * Räumt den Rückfall-Timer ab. Beim Rückbau des Editors zu rufen — sonst\n * feuerte er nach `toTextArea()` gegen eine bereits zerstörte Statusbar.\n * Laufende Uploads werden NICHT abgebrochen: Ihre `upload()`-Promise gehört\n * dem Host, und ihr Ergebnis findet über den dann leeren Platzhalter-Bereich\n * ohnehin kein Ziel mehr.\n */\n destroy(): void;\n}\n\n/** Default-Obergrenze: 2 MB. */\nexport const DEFAULT_UPLOAD_MAX_SIZE = 2 * 1024 * 1024;\n\n/** Default-Liste erlaubter MIME-Typen. */\nexport const DEFAULT_UPLOAD_ACCEPT: string[] = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/avif',\n 'image/svg+xml',\n];\n\n/** Anzeigedauer der Erfolgsmeldung, bevor auf `statusInit` zurückgefallen wird. */\nexport const STATUS_DONE_MS = 2000;\n/** Anzeigedauer der Fehlermeldung. Länger, weil sie gelesen werden muss. */\nexport const STATUS_ERROR_MS = 6000;\n\n/** Fehlerart → Textschlüssel der Statusmeldung. */\nconst ERROR_TEXT_KEYS = {\n 'too-large': 'upload.errorTooLarge',\n 'type-not-allowed': 'upload.errorType',\n 'upload-failed': 'upload.errorFailed',\n} as const satisfies Record<UploadError['kind'], SimpleTextKey>;\n\n/**\n * Die Markdown-Textform eines fertigen Bildes.\n *\n * Bewusst NICHT über `insertImage()` aus `commands/link-image.ts`: Jenes fügt an\n * der aktuellen SELEKTION ein — genau der Weg, den die Positionsregel verbietet.\n * Der Upload muss an der gemappten Platzhalter-Position ersetzen, nicht an der\n * Cursorposition. Geteilt wird deshalb nur die Textform, hier als eine Zeile.\n */\nexport function imageMarkdown(alt: string, url: string): string {\n // `]` und `[` im Alt-Text und `(`/`)`/Leerzeichen in der URL brechen die\n // Markdown-Bildsyntax. Alt-Text maskieren, URL in spitze Klammern setzen —\n // die von CommonMark vorgesehene Form für URLs mit Sonderzeichen.\n const altSicher = alt.replace(/([[\\]\\\\])/g, '\\\\$1');\n const urlSicher = /[\\s()<>]/.test(url) ? `<${url.replace(/([<>\\\\])/g, '\\\\$1')}>` : url;\n return ``;\n}\n\n/**\n * Prüft eine Datei. `null` heißt: in Ordnung. Größe zuerst — eine zu große\n * Datei ist auch dann zu groß, wenn ihr Typ zusätzlich nicht passt, und die\n * Größe ist die häufigere Ursache.\n */\nexport function validateFile(\n file: File,\n opts: { maxSize: number; accept: string[] },\n): UploadError['kind'] | null {\n if (file.size > opts.maxSize) return 'too-large';\n if (!opts.accept.includes(file.type)) return 'type-not-allowed';\n return null;\n}\n\n/**\n * Erzeugt den Uploader. `translator` liefert Platzhalter und Statusmeldungen\n * (`upload.*`-Schlüssel); ohne Angabe englisch.\n */\nexport function createImageUploader(\n view: EditorView,\n options: UploadImageOptions,\n hooks: { setStatus(text: string): void },\n translator: Translator = createTranslator(),\n): ImageUploader {\n const enabled = options.enabled ?? false;\n const maxSize = options.maxSize ?? DEFAULT_UPLOAD_MAX_SIZE;\n const accept = options.accept ?? DEFAULT_UPLOAD_ACCEPT;\n /** Eigene ID-Sequenz pro Uploader — kein geteilter Modulzustand. */\n const nächsteId = createIdSource();\n\n /** Zahl der noch laufenden Uploads — steuert den Rückfall auf `statusInit`. */\n let offen = 0;\n let rückfallTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Setzt den Status und plant den Rückfall auf `statusInit`. Der Rückfall\n * greift nur, wenn dann KEIN Upload mehr läuft — sonst überschriebe die\n * Erfolgsmeldung der ersten Datei die Fortschrittsmeldung der zweiten.\n */\n const zeige = (text: string, rückfallNach?: number): void => {\n hooks.setStatus(text);\n if (rückfallTimer !== null) {\n clearTimeout(rückfallTimer);\n rückfallTimer = null;\n }\n if (rückfallNach === undefined) return;\n rückfallTimer = setTimeout(() => {\n rückfallTimer = null;\n if (offen === 0) hooks.setStatus(translator.t('upload.statusInit'));\n }, rückfallNach);\n };\n\n const meldeFehler = (kind: UploadError['kind'], file: File, cause?: unknown): void => {\n const werte = { name: file.name, maxSize: formatBytes(maxSize) };\n zeige(translator.t(ERROR_TEXT_KEYS[kind], werte), STATUS_ERROR_MS);\n options.onError?.({ kind, file, cause });\n };\n\n const ladeEine = (file: File): void => {\n const fehler = validateFile(file, { maxSize, accept });\n if (fehler) {\n // Bei Ablehnung passiert im Dokument NICHTS — kein Platzhalter, kein Link.\n meldeFehler(fehler, file);\n return;\n }\n\n const id = nächsteId();\n const text = translator.t('upload.placeholder', { name: file.name });\n // Eine bestehende Selektion wird ERSETZT, nicht umschlossen — gleiches\n // Verhalten wie beim Einfügen von Text. Bei mehreren Dateien setzt die\n // vorige Einfügung den Cursor hinter sich, sodass die zweite Datei dahinter\n // landet statt die erste zu überschreiben.\n const sel = view.state.selection.main;\n // Platzhalter und Effect in EINER Transaktion: das Feld kennt den Bereich ab\n // exakt der Transaktion, die ihn erzeugt hat — kein Fenster, in dem eine\n // dazwischenfunkende Änderung nicht mitgemappt würde.\n view.dispatch({\n changes: { from: sel.from, to: sel.to, insert: text },\n effects: addPlaceholder.of({ id, from: sel.from, to: sel.from + text.length }),\n selection: { anchor: sel.from + text.length },\n });\n\n offen += 1;\n zeige(translator.t('upload.statusUploading', { name: file.name }));\n\n // `Promise.resolve().then(...)` statt eines direkten Aufrufs: wirft der\n // Host-Code in `upload()` SYNCHRON statt eine abgelehnte Promise zu\n // liefern, propagierte der Fehler sonst aus `ladeEine()` heraus — der\n // Platzhalter bliebe für immer stehen, `offen` würde nie dekrementiert.\n // So wird ein synchroner Wurf zu einer Ablehnung und läuft durch den\n // bestehenden Fehlerpfad unten.\n Promise.resolve()\n .then(() => options.upload(file))\n .then(\n (url) => {\n offen -= 1;\n // AUSSCHLIESSLICH die gemappte Position — nie die beim Einfügen\n // gemerkte. Ist der Eintrag weg, hat der Nutzer den Platzhalter\n // gelöscht oder das Dokument ersetzt: dann wird NICHTS eingefügt. Ein\n // Bild, das in ein inzwischen fremdes Dokument hineinspringt, wäre\n // schlimmer als ein verlorener Upload.\n const bereich = placeholderRange(view.state, id);\n if (!bereich) return;\n view.dispatch({\n changes: { from: bereich.from, to: bereich.to, insert: imageMarkdown(file.name, url) },\n effects: removePlaceholder.of(id),\n });\n zeige(translator.t('upload.statusDone', { name: file.name }), STATUS_DONE_MS);\n },\n (ursache: unknown) => {\n offen -= 1;\n const bereich = placeholderRange(view.state, id);\n if (bereich) {\n // Ersatzlos entfernen — der Platzhaltertext darf nicht im Dokument\n // stehen bleiben.\n view.dispatch({\n changes: { from: bereich.from, to: bereich.to, insert: '' },\n effects: removePlaceholder.of(id),\n });\n }\n meldeFehler('upload-failed', file, ursache);\n },\n );\n };\n\n const uploadFiles = (files: FileList | File[]): void => {\n if (!enabled) return;\n // Jede Datei EINZELN validieren und behandeln: eine gemischte Auswahl lädt\n // die gültigen Dateien hoch und meldet die ungültigen einzeln.\n for (const file of Array.from(files)) ladeEine(file);\n };\n\n /**\n * Nur der Timer. Laufende `upload()`-Promises gehören dem Host und lassen\n * sich von hier weder abbrechen noch sollten sie es — ihr Ergebnis findet\n * über den dann verschwundenen Platzhalter-Bereich ohnehin kein Ziel mehr.\n * Mehrfach aufrufbar.\n */\n const destroy = (): void => {\n if (rückfallTimer !== null) {\n clearTimeout(rückfallTimer);\n rückfallTimer = null;\n }\n };\n\n return { uploadFiles, accept: () => accept, isActive: () => enabled, destroy };\n}\n","import type { Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\n/**\n * Die Bilddateien aus einem DataTransfer. Nicht-Bilder werden hier bereits\n * ausgesiebt: Ein Drop mit einem PDF darf NICHT als Bild-Upload gelten und soll\n * ungestört den Standardweg gehen.\n */\nexport function imageFilesFrom(data: DataTransfer | null): File[] {\n if (!data) return [];\n const files = data.files;\n if (!files || files.length === 0) return [];\n return Array.from(files).filter((f) => f.type.startsWith('image/'));\n}\n\n/**\n * Drop- und Paste-Handler. Greift NUR ein, wenn Bilddateien im Spiel sind —\n * reiner Text-Drop und Text-Paste laufen unverändert durch den CM6-Standardweg.\n */\nexport function uploadDropPasteExtension(onFiles: (files: File[]) => void): Extension {\n return EditorView.domEventHandlers({\n drop(event) {\n const files = imageFilesFrom(event.dataTransfer);\n if (files.length === 0) return false;\n event.preventDefault();\n onFiles(files);\n return true;\n },\n paste(event) {\n const files = imageFilesFrom(event.clipboardData);\n if (files.length === 0) return false;\n event.preventDefault();\n onFiles(files);\n return true;\n },\n });\n}\n\n/**\n * Öffnet die Dateiauswahl über einen bei Bedarf erzeugten, versteckten Input.\n *\n * Bewusst NICHT in der Toolbar geparkt: So funktioniert `openBrowseFileWindow()`\n * auch bei `toolbar: false` — bei easyMDE warf derselbe Aufruf ohne Toolbar\n * einen Fehler, weil der Input am Toolbar-DOM hing.\n */\nexport function openFilePicker(accept: string[], onFiles: (files: File[]) => void): void {\n const input = document.createElement('input');\n input.type = 'file';\n input.multiple = true;\n input.accept = accept.join(',');\n input.style.display = 'none';\n\n const aufräumen = (): void => {\n input.remove();\n };\n\n input.addEventListener('change', () => {\n const files = input.files ? Array.from(input.files) : [];\n aufräumen();\n if (files.length > 0) onFiles(files);\n });\n\n // Bricht der Nutzer den Systemdialog ab, feuert `change` NICHT — ohne diesen\n // Listener bliebe der Input für immer im Body hängen und sammelte sich bei\n // jedem weiteren Klick auf den Toolbar-Button an. `cancel` ist in Firefox erst\n // ab 109 und in Safari erst ab 16.4 verfügbar; wo es fehlt, bleibt genau ein\n // leerer, versteckter Input pro Abbruch liegen — unschön, aber folgenlos, und\n // die Alternative (ein `focus`-Handler auf `window` mit Zeitfenster-Heuristik)\n // wäre für den Gewinn zu viel Maschinerie.\n input.addEventListener('cancel', aufräumen);\n\n document.body.appendChild(input);\n input.click();\n}\n","import type { Locale } from './types';\n\n/** Deutsch — die bis zur Internationalisierung fest verdrahteten Texte. Reine Daten. */\nexport const de: Locale = {\n code: 'de',\n texts: {\n 'toolbar.bold': 'Fett',\n 'toolbar.italic': 'Kursiv',\n 'toolbar.strikethrough': 'Durchgestrichen',\n 'toolbar.code': 'Inline-Code',\n 'toolbar.heading-smaller': 'Überschrift kleiner',\n 'toolbar.heading-bigger': 'Überschrift größer',\n 'toolbar.heading-1': 'Überschrift 1',\n 'toolbar.heading-2': 'Überschrift 2',\n 'toolbar.heading-3': 'Überschrift 3',\n 'toolbar.heading-4': 'Überschrift 4',\n 'toolbar.heading-5': 'Überschrift 5',\n 'toolbar.heading-6': 'Überschrift 6',\n 'toolbar.quote': 'Blockzitat',\n 'toolbar.code-block': 'Codeblock',\n 'toolbar.horizontal-rule': 'Trennlinie',\n 'toolbar.clean-block': 'Formatierung entfernen',\n 'toolbar.unordered-list': 'Liste',\n 'toolbar.ordered-list': 'Nummerierte Liste',\n 'toolbar.check-list': 'Checkliste',\n 'toolbar.link': 'Link',\n 'toolbar.image': 'Bild',\n 'toolbar.table': 'Tabelle',\n 'toolbar.undo': 'Rückgängig',\n 'toolbar.redo': 'Wiederholen',\n 'toolbar.side-by-side': 'Nebeneinander-Vorschau',\n 'toolbar.fullscreen': 'Vollbild',\n 'toolbar.preview-fullscreen': 'Vorschau im Vollbild',\n 'toolbar.editor-mode': 'Live-Vorschau',\n 'toolbar.upload-image': 'Bild hochladen',\n\n 'status.lines': { one: '{count} Zeile', other: '{count} Zeilen' },\n 'status.words': { one: '{count} Wort', other: '{count} Wörter' },\n 'status.autosaved': 'Gespeichert: {time}',\n\n 'upload.placeholder': '![Uploading {name}…]()',\n 'upload.statusInit': 'Bild hierher ziehen oder einfügen',\n 'upload.statusUploading': 'Lade {name} hoch…',\n 'upload.statusDone': '{name} hochgeladen',\n 'upload.errorTooLarge': '{name} ist zu groß (max. {maxSize}).',\n 'upload.errorType': '{name} ist kein unterstütztes Bildformat.',\n 'upload.errorFailed': 'Upload von {name} fehlgeschlagen.',\n\n 'prompt.linkUrl': 'Link-URL:',\n 'prompt.imageUrl': 'Bild-URL:',\n\n 'table.column': 'Spalte {n}',\n },\n};\n","// Diese vier Imports erzeugen im Library-Build `dist/supamde.css` — die Datei,\n// die Host-Projekte über `supamde/style.css` einbinden können. Sie wird NICHT\n// automatisch geladen; dafür sorgt `injectStyles()`, das dieselben Quellen per\n// `?inline` als String im Bundle mitführt.\nimport './ui/toolbar.css';\nimport './ui/statusbar.css';\nimport './ui/preview.css';\nimport './ui/fullscreen.css';\n\nimport type { EditorView } from '@codemirror/view';\nimport type { EditorState } from '@codemirror/state';\nimport { VERSION } from './version';\nimport type { SupaMDEOptions } from './options';\nimport { editorFromTextArea, type EditorHandle } from './editor/setup';\nimport { readValue, writeValue } from './editor/value';\nimport { createToolbar, type Toolbar } from './ui/toolbar';\nimport { createStatusbar, type Statusbar } from './ui/statusbar';\nimport { createSideBySide, type SideBySide } from './ui/preview';\nimport { createFullscreen, type Fullscreen } from './ui/fullscreen';\nimport { injectStyles } from './ui/inject-styles';\nimport { markdownToHtml, renderOptionsFrom, type RenderOptions } from './markdown/parse';\nimport type { SupaLike } from './ui/actions';\nimport { livePreviewCompartment, livePreviewFor, type EditorMode } from './livepreview';\nimport { createAutosave, type Autosave } from './features/autosave';\nimport { createImageUploader, type ImageUploader } from './features/image-upload';\nimport { uploadPlaceholderField } from './features/upload-placeholder';\nimport { uploadDropPasteExtension, openFilePicker } from './features/upload-dom';\nimport { createTranslator, type Translator } from './i18n/translator';\nimport { translatorFacet } from './i18n/facet';\n\nexport type { SupaMDEOptions } from './options';\nexport type { KeyBinding } from '@codemirror/view';\nexport type { EditorMode } from './livepreview';\nexport type { SupaStorage } from './features/storage';\nexport type { AutosaveOptions } from './features/autosave';\nexport type { UploadImageOptions, UploadError } from './features/image-upload';\nexport type { Locale, LocaleTexts, PluralText } from './i18n/types';\n\n/**\n * SupaMDE — moderner Markdown-Editor auf Basis von CodeMirror 6.\n *\n * Dünne Fassade: der Konstruktor baut über `editor/setup.ts` eine EditorView aus\n * der übergebenen Textarea, umgibt sie mit Toolbar und Statusbar und verdrahtet\n * beide über EINEN updateListener. Alle Methoden delegieren an die Module.\n */\nexport class SupaMDE {\n /** Aktuelle SupaMDE-Version. */\n static readonly version = VERSION;\n\n /** Die (rohen) Optionen dieser Instanz. */\n readonly options: SupaMDEOptions;\n\n /** Die zugrunde liegende CM6-EditorView (NICHT das CM5-Objekt). */\n readonly codemirror: EditorView;\n\n private readonly handle: EditorHandle;\n private readonly container: HTMLElement;\n private readonly editorRow: HTMLElement;\n private readonly toolbar: Toolbar | null;\n private readonly statusbar: Statusbar | null;\n private readonly preview: SideBySide | null;\n private readonly fullscreen: Fullscreen;\n /**\n * Autosave dieser Instanz. Immer erzeugt, aber nur aktiv, wenn die Option es\n * verlangt UND der Speicher trägt — `isActive()` ist die Wahrheit, nicht die\n * Option.\n */\n private readonly autosave: Autosave;\n /**\n * Der Uploader dieser Instanz. Wird NACH der View erzeugt (er braucht sie),\n * die Drop/Paste-Extension zeigt daher über eine Closure auf dieses Feld statt\n * direkt auf den Uploader.\n */\n private uploader: ImageUploader | null = null;\n /** Referenz auf den F8/F9/F10/F11-Keydown-Handler, damit toTextArea() ihn abräumt. */\n private readonly onViewShortcuts: (event: KeyboardEvent) => void;\n /**\n * EINMALIG im Konstruktor berechneter Render-Options-Snapshot — Panel UND\n * `markdown()` nutzen GENAU dieses Feld (nicht `renderOptionsFrom(this.options)`\n * bei jedem Aufruf neu), damit beide auch bei einer nachträglichen Mutation von\n * `this.options` konsistent bleiben (eine Quelle der Wahrheit, kein stiller Split).\n */\n private readonly renderOpts: RenderOptions;\n /**\n * Aktueller Darstellungsmodus. Bewusst ein Instanzfeld und KEIN StateField:\n * Der Modus ist eine Eigenschaft der Ansicht, nicht des Dokuments — gleiches\n * Muster wie bei Fullscreen und Side-by-Side.\n */\n private editorMode: EditorMode;\n /**\n * Die UI-Texte dieser Instanz — EINMAL im Konstruktor aus `locale`/`texts`\n * erzeugt und an Toolbar, Statusbar, Uploader und Autosave weitergereicht;\n * Commands lesen ihn über `translatorFacet` aus dem State. Kein Sprachwechsel\n * zur Laufzeit.\n */\n private readonly translator: Translator;\n\n constructor(options: SupaMDEOptions = {}) {\n this.options = options;\n\n // VOR dem DOM-Aufbau: sonst hinge der Editor kurz ungestylt in der Seite.\n // Idempotent — mehrere Instanzen teilen sich EIN <style>-Tag.\n if (options.injectStyles !== false) injectStyles();\n\n // Vor allem anderen: Toolbar, Statusbar, Uploader und die Facet brauchen ihn.\n this.translator = createTranslator(options.locale, options.texts);\n\n // Der EINE Sink: speist Toolbar-Aktiv-Zustand, Statusbar UND Vorschau-Panel.\n const sink = {\n onUpdate: (u: { state: EditorState; docChanged: boolean; selectionSet: boolean }): void => {\n this.toolbar?.update(u.state);\n this.statusbar?.update(u.state, { docChanged: u.docChanged, selectionSet: u.selectionSet });\n this.preview?.update(u.state);\n // Nur bei echter Dokumentänderung — eine Cursorbewegung ist kein Grund\n // zu speichern und würde den Debounce sinnlos verlängern.\n if (u.docChanged) this.autosave.schedule();\n },\n };\n\n // Die Extension wird VOR dem Uploader gebaut — sie kann ihn also nicht\n // direkt referenzieren. Die Closure löst das: Sie liest `this.uploader`\n // erst beim Drop/Paste, wenn das Feld längst gesetzt ist.\n const uploadAktiv = options.uploadImage?.enabled === true;\n const uploadExtensions = uploadAktiv\n ? [\n uploadPlaceholderField,\n uploadDropPasteExtension((files) => this.uploader?.uploadFiles(files)),\n ]\n : [];\n\n this.handle = editorFromTextArea(options, sink, [\n // Über extraExtensions statt in buildExtensions: der Translator entsteht\n // hier in der Fassade, buildExtensions sieht nur ResolvedOptions.\n translatorFacet.of(this.translator),\n ...uploadExtensions,\n ]);\n this.codemirror = this.handle.view;\n\n // Aus dem Handle, NICHT über einen zweiten resolveOptions()-Aufruf: die\n // Extension-Erzeugung hat die Optionen bereits normalisiert. Ein zweiter\n // Aufruf ergäbe zwei unabhängige Auswertungen und eine doppelte Warnung bei\n // ungültigem editorMode. Eine Quelle der Wahrheit — hier wörtlich.\n this.editorMode = this.handle.resolved.editorMode;\n\n // Spec §4.2: Der Button wird NUR bei aktiviertem Bild-Upload gerendert. Ein\n // Button, dessen Klick folgenlos bleibt, ist schlimmer als gar keiner.\n // Gefiltert wird hier statt in `resolveToolbar`, weil nur die Fassade die\n // `uploadImage`-Option kennt — und ohne Warnung, denn der Name IST gültig.\n // `filter` liefert eine neue Liste; die übergebene Option bleibt unberührt.\n const toolbarOption =\n !uploadAktiv && Array.isArray(options.toolbar)\n ? options.toolbar.filter((eintrag) => eintrag !== 'upload-image')\n : options.toolbar;\n\n this.toolbar = createToolbar(this.codemirror, toolbarOption, this, this.translator);\n this.statusbar = createStatusbar(options.status, this.translator);\n\n // NACH der Statusbar: onSaved schreibt in sie hinein. Die Instanz wird immer\n // erzeugt (der sink referenziert sie), bleibt ohne autosave-Option aber\n // inaktiv — `start()` verlässt sich bei fehlendem `enabled` sofort wieder.\n //\n // `createAutosave` liest hier den Ausgangswert des Dokuments und merkt ihn\n // als Referenzpunkt für den Restore. Diese Zeile muss deshalb NACH dem\n // View-Aufbau stehen (sonst gäbe es kein Dokument zu lesen) und VOR jeder\n // Gelegenheit, bei der der Host `setValue()` rufen könnte — beides ist im\n // Konstruktor gegeben.\n this.autosave = createAutosave(options.autosave ?? { enabled: false, key: '' }, {\n getValue: () => this.getValue(),\n setValue: (v) => this.setValue(v),\n onSaved: (time) => {\n // Uhrzeit im Format des Locale-Codes, nicht der Browser-Locale — sonst\n // stünde in einer deutschen Oberfläche „Gespeichert: 02:05 PM\".\n // Instanz-eigene Statusbar statt easyMDEs globalem\n // getElementById('autosaved') — zwei Editoren auf einer Seite störten\n // sich dort gegenseitig. `setItem` schreibt textContent, kein innerHTML.\n this.statusbar?.setItem(\n 'autosave',\n this.translator.t('status.autosaved', { time: this.translator.formatTime(time) }),\n );\n },\n });\n\n // Nur bei aktivierter Option: ohne `upload`-Funktion gibt es nichts zu tun,\n // und `uploadImages()` soll dann folgenlos bleiben.\n if (uploadAktiv && options.uploadImage) {\n // SupaMDE ist eine Bibliothek mit JavaScript-Hosts — der Typ macht\n // `upload` zur Pflicht, das schützt zur Laufzeit aber niemanden. Ohne\n // diese Prüfung passierte bei der Konstruktion nichts, und erst beim\n // ersten Drop würfe `options.upload is not a function` mitten im\n // Ablauf. Deshalb dieselbe Warnpraxis wie unten: EINE Meldung, der\n // Editor läuft weiter, aber es entsteht KEIN Uploader — `uploadImages()`\n // und `openBrowseFileWindow()` bleiben dann folgenlos.\n if (typeof options.uploadImage.upload !== 'function') {\n console.warn(\n 'SupaMDE: uploadImage.enabled is true, but uploadImage.upload is not a ' +\n 'function — image upload stays off.',\n );\n } else {\n this.uploader = createImageUploader(\n this.codemirror,\n options.uploadImage,\n { setStatus: (text) => this.statusbar?.setItem('upload-image', text) },\n this.translator,\n );\n\n // `setItem` findet ein Item nur, wenn es tatsächlich gerendert wurde —\n // also nur, wenn sein Name in der `status`-Option steht (siehe\n // ui/statusbar.ts). Fehlt es UND fehlt `onError`, verschwinden sämtliche\n // Rückmeldungen des Uploads spurlos: kein Fortschritt, keine Fehler. Das\n // ist eine gültige Konfiguration (ein Host kann das bewusst wollen), aber\n // fast immer ein Versehen. Genau EINE Warnung — der Editor läuft weiter.\n const statusZeigtUpload =\n Array.isArray(options.status) && options.status.includes('upload-image');\n if (!statusZeigtUpload && !options.uploadImage.onError) {\n console.warn(\n \"SupaMDE: uploadImage is enabled, but neither the status bar item 'upload-image' \" +\n '(status option) nor uploadImage.onError is set — upload progress and errors ' +\n 'stay invisible.',\n );\n }\n\n // Der Slot zeigt von Anfang an den Einladungstext, nicht erst nach dem\n // ersten Upload — sonst bliebe er beim frisch geöffneten Editor leer.\n this.statusbar?.setItem('upload-image', this.translator.t('upload.statusInit'));\n }\n }\n\n // EINE Quelle für die Render-Optionen (Panel + markdown()-Fassade teilen sie).\n this.renderOpts = renderOptionsFrom(options);\n this.preview = createSideBySide(this.codemirror, {\n render: (text) => markdownToHtml(text, this.renderOpts),\n previewClass: options.previewClass,\n syncScroll: options.syncSideBySidePreviewScroll,\n });\n\n // Container um view.dom bauen: Toolbar oben, Editor-Zeile Mitte, Statusbar unten.\n this.container = document.createElement('div');\n this.container.className = 'supamde-container';\n const viewDom = this.codemirror.dom;\n viewDom.parentNode?.insertBefore(this.container, viewDom);\n if (this.toolbar) this.container.appendChild(this.toolbar.dom);\n\n // Editor-Zeile: Editor + Vorschau-Panel nebeneinander (Flex via CSS), damit\n // Toolbar/Statusbar außerhalb der Flex-Zeile volle Breite behalten.\n this.editorRow = document.createElement('div');\n this.editorRow.className = 'supamde-editor-row';\n this.editorRow.appendChild(viewDom);\n this.editorRow.appendChild(this.preview.dom);\n this.container.appendChild(this.editorRow);\n\n if (this.statusbar) this.container.appendChild(this.statusbar.dom);\n\n this.fullscreen = createFullscreen(this.container, {\n // Jeder Fullscreen-Wechsel läuft hier durch — auch der modul-interne\n // Escape-Pfad, der NICHT über setFullScreen() kommt. Deshalb ist das die\n // richtige Stelle für das Toolbar-Update: eine Pflegestelle statt zwei.\n // Die Nutzer-Option wird weitergereicht, nicht ersetzt.\n onToggleFullScreen: (active) => {\n this.toolbar?.update(this.codemirror.state);\n options.onToggleFullScreen?.(active);\n },\n });\n\n // F8/F9/F10/F11 sind view-Aktionen (preview-fullscreen/side-by-side/editorMode/fullscreen), keine\n // CM6-Commands — sie lassen sich nicht über die CM6-keymap (commands/keymap.ts)\n // ableiten, da sie nicht auf der EditorView, sondern auf der SupaMDE-Instanz\n // wirken (siehe Kommentar dort). Deshalb hier ein eigener Keydown-Handler auf\n // dem Container, der `event.preventDefault()` für F11 aufruft, damit der\n // Browser nicht zusätzlich ins native Vollbild wechselt. Vollbild hört\n // zusätzlich auf Mod-Shift-F, weil F11 auf macOS vom OS abgefangen wird.\n this.onViewShortcuts = (event: KeyboardEvent): void => {\n if (event.key === 'F8') {\n // Vorschau + Vollbild gemeinsam (Alles-oder-nichts, siehe togglePreviewFullScreen).\n event.preventDefault();\n this.togglePreviewFullScreen();\n } else if (event.key === 'F9') {\n event.preventDefault();\n this.toggleSideBySide();\n } else if (event.key === 'F10') {\n // preventDefault, weil F10 in einigen Browsern die Menüleiste fokussiert.\n event.preventDefault();\n this.toggleEditorMode();\n } else if (event.key === 'F11') {\n event.preventDefault();\n this.toggleFullScreen();\n } else if (\n // Zweitbindung für Vollbild: macOS belegt F11 systemweit (Mission Control /\n // \"Schreibtisch einblenden\"), die Taste erreicht die Seite dort oft gar nicht.\n // Cmd/Ctrl+Shift+F kollidiert weder mit dem OS noch mit Browser-Defaults\n // (Cmd+Ctrl+F wäre das native macOS-Vollbild des Fensters).\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n !event.altKey &&\n (event.key === 'F' || event.key === 'f')\n ) {\n event.preventDefault();\n this.toggleFullScreen();\n }\n };\n this.container.addEventListener('keydown', this.onViewShortcuts);\n\n // Initialer Zustand, damit Statusbar/Aktiv-Zustand sofort stimmen.\n const state = this.codemirror.state;\n this.toolbar?.update(state);\n this.statusbar?.update(state, { docChanged: true, selectionSet: true });\n\n // Async und bewusst nicht awaited — ein Konstruktor kann nicht warten. Ein\n // eventueller Restore landet als normale Transaktion im Dokument, sobald\n // der Speicher geantwortet hat.\n void this.autosave.start();\n }\n\n value(): string;\n value(val: string): void;\n value(val?: string): string | void {\n if (val === undefined) return this.getValue();\n this.setValue(val);\n }\n\n getValue(): string {\n return readValue(this.codemirror);\n }\n\n setValue(val: string): void {\n writeValue(this.codemirror, val);\n }\n\n /** Überschreibt den Inhalt eines Statusbar-Items (API-kompatibel zu easyMDE). */\n updateStatusBar(itemName: string, content: string): void {\n this.statusbar?.setItem(itemName, content);\n }\n\n /** Rendert Markdown (inkl. LaTeX) zu HTML. Teilt exakt denselben Render-Options-Snapshot wie das Panel. */\n markdown(text: string): string {\n return markdownToHtml(text, this.renderOpts);\n }\n\n /**\n * Schaltet die Nebeneinander-Vorschau gezielt an oder aus. Idempotent —\n * ein Aufruf mit dem bereits aktiven Zustand ändert nichts.\n */\n setSideBySide(on: boolean): void {\n this.preview?.set(on);\n this.container.classList.toggle('supamde-sided', this.isSideBySideActive());\n this.toolbar?.update(this.codemirror.state);\n }\n toggleSideBySide(): void {\n this.setSideBySide(!this.isSideBySideActive());\n }\n isSideBySideActive(): boolean {\n return this.preview?.isActive() ?? false;\n }\n\n /** Schaltet den Vollbildmodus gezielt an oder aus. Idempotent. */\n setFullScreen(on: boolean): void {\n this.fullscreen.set(on);\n this.toolbar?.update(this.codemirror.state);\n }\n toggleFullScreen(): void {\n this.setFullScreen(!this.isFullscreenActive());\n }\n isFullscreenActive(): boolean {\n return this.fullscreen.isActive();\n }\n\n /**\n * Vorschau UND Vollbild gemeinsam schalten (Alles-oder-nichts): Ist nicht\n * bereits beides aktiv, wird beides eingeschaltet — auch aus einem\n * Teilzustand heraus. Sind beide aktiv, wird beides ausgeschaltet.\n */\n togglePreviewFullScreen(): void {\n const on = !this.isPreviewFullScreenActive();\n this.setSideBySide(on);\n this.setFullScreen(on);\n }\n /** Ob Vorschau und Vollbild gleichzeitig aktiv sind. */\n isPreviewFullScreenActive(): boolean {\n return this.isSideBySideActive() && this.isFullscreenActive();\n }\n\n /** Der aktuelle Darstellungsmodus. */\n getEditorMode(): EditorMode {\n return this.editorMode;\n }\n\n /**\n * Setzt den Darstellungsmodus. Idempotent — ein Aufruf mit dem bereits aktiven\n * Modus dispatcht nichts. Der Wechsel läuft über ein Compartment-`reconfigure`,\n * daher bleiben Dokument, Cursor, Historie und Scrollposition erhalten.\n */\n setEditorMode(mode: EditorMode): void {\n if (mode === this.editorMode) return;\n this.editorMode = mode;\n this.codemirror.dispatch({\n effects: livePreviewCompartment.reconfigure(livePreviewFor(mode)),\n });\n this.toolbar?.update(this.codemirror.state);\n }\n\n /** Wechselt zwischen `'source'` und `'live'`. */\n toggleEditorMode(): void {\n this.setEditorMode(this.editorMode === 'live' ? 'source' : 'live');\n }\n\n /**\n * Löscht den gespeicherten Entwurf UND stoppt den laufenden Debounce-Timer.\n * Nach erfolgreichem Speichern im eigenen Backend zu rufen — sonst holt der\n * Editor beim nächsten Öffnen den alten Entwurf zurück.\n */\n async clearAutosavedValue(): Promise<void> {\n await this.autosave.clear();\n this.statusbar?.setItem('autosave', '');\n }\n\n /** Ob Autosave aktiv ist (aktiviert, `key` gültig, Speicher verfügbar). */\n isAutosaveActive(): boolean {\n return this.autosave.isActive();\n }\n\n /**\n * Startet den Upload für die übergebenen Dateien. Jede Datei wird einzeln\n * validiert; ungültige werden über `onError` gemeldet, ohne die gültigen\n * aufzuhalten. Ohne aktivierten Bild-Upload folgenlos.\n */\n uploadImages(files: FileList | File[]): void {\n this.uploader?.uploadFiles(files);\n }\n\n /**\n * Öffnet die Dateiauswahl. Der Input wird bei Bedarf erzeugt und nicht in der\n * Toolbar geparkt — funktioniert deshalb auch bei `toolbar: false`.\n */\n openBrowseFileWindow(): void {\n if (!this.uploader) return;\n openFilePicker(this.uploader.accept(), (files) => this.uploader?.uploadFiles(files));\n }\n\n /** Baut den Editor zurück und stellt die ursprüngliche Textarea wieder her. */\n toTextArea(): HTMLTextAreaElement {\n // Nur den Timer abräumen: Der gespeicherte Wert bleibt erhalten — Rückbau\n // des Editors ist kein Signal, den Entwurf zu verwerfen.\n this.autosave.stop();\n // Wie beim Autosave nur die Zeitgeber: Der Rückfall-Timer der Statusanzeige\n // liefe sonst nach dem Rückbau weiter und schriebe gegen eine zerstörte\n // Statusbar. Laufende Uploads bleiben unangetastet — ihre Promise gehört dem\n // Host, und ihr Ergebnis findet über den verschwundenen Platzhalter ohnehin\n // kein Ziel mehr.\n this.uploader?.destroy();\n this.container.removeEventListener('keydown', this.onViewShortcuts);\n this.toolbar?.destroy();\n this.statusbar?.destroy();\n this.preview?.destroy();\n this.fullscreen.destroy();\n const textarea = this.handle.toTextArea();\n this.container.remove();\n return textarea;\n }\n}\n\n// Stellt sicher, dass SupaMDE strukturell SupaLike erfüllt (die Toolbar reicht\n// `this` als SupaLike durch). Bricht der Vertrag, schlägt der Typecheck HIER fehl —\n// nicht erst indirekt an der Durchreich-Stelle in toolbar.ts.\nconst _supaLikeCheck: SupaLike = null as unknown as SupaMDE;\nvoid _supaLikeCheck;\n\nexport { VERSION } from './version';\nexport { en } from './i18n/en';\nexport { de } from './i18n/de';\nexport default SupaMDE;\n"],"ignoreList":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,68],"mappings":"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"}
|