@markput/react 0.14.0 → 0.14.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#map","#counter","getOrCreate","tokensToString","#generation","#scope","#subscribeParse","#subscribeReactiveParse","#disposers","#rawRangeForMatch","#scope","#handleCopy","#domIndex","#pendingControls","#pendingChildSequences","#scope","#handleRendered","#isComposing","#nextControlId","#nextChildSequenceId","#reconcileStructuralTextSurfaces","#elementRoles","#pathElements","#findTextTargetForRawPosition","#focusMarkBoundaryForRawPosition","#placeCaretInTextSurface","#placeCollapsedBoundary","#rawPositionFromContainerBoundary","#rawPositionFromTokenChildBoundary","#rendering","#queuedRender","#commitRendered","#indexBlockTokens","#indexTokenSequence","#generation","#clearStaleCaretLocation","#applyPendingRecovery","#childSequenceHostsFor","#elementChildren","#isControlRoot","#indexTokenElement","#indexNestedTokenSequence","#locateRegisteredDescendant","#boundaryInTextSurface","#placeSelection","#unsub","#reorder","#add","#delete","#duplicate","#recoverAfterDrag","rawRangeFromInputEvent","rawRangeFromTargetRange","rawSelectionReason","#disposers","#shape","#resolve","#serialize","#probeTriggerFromRecovery","#scope","#probeTrigger","#pending","#controlledEcho","#scope","#commitAccepted","#commitCandidate","#emit","#blockIndex","#dragAction","#cleanupContainer","#cleanupGrip","#cleanupMenu","#map","styles","styles","styles","styles","styles","styles","styles","CoreMarkController"],"sources":["../../../core/src/shared/utils/shallow.ts","../../../core/src/shared/utils/cx.ts","../../../core/src/shared/utils/merge.ts","../../../core/src/shared/constants.ts","../../../core/src/shared/classes/MarkputHandler.ts","../../../core/src/shared/classes/KeyGenerator.ts","../../../core/src/shared/signals/alien-signals/system.ts","../../../core/src/shared/signals/signal.ts","../../../core/src/features/parsing/parser/constants.ts","../../../core/src/features/parsing/parser/core/MarkupDescriptor.ts","../../../core/src/features/parsing/parser/core/MarkupRegistry.ts","../../../core/src/features/parsing/parser/utils/getSegmentIndex.ts","../../../core/src/features/parsing/parser/core/Match.ts","../../../core/src/features/parsing/parser/core/PatternMatcher.ts","../../../core/src/shared/escape.ts","../../../core/src/features/parsing/parser/core/SegmentMatcher.ts","../../../core/src/features/parsing/parser/utils/createTextToken.ts","../../../core/src/features/parsing/parser/core/TreeBuilder.ts","../../../core/src/features/parsing/parser/utils/processTokens.ts","../../../core/src/features/parsing/parser/utils/annotate.ts","../../../core/src/features/parsing/parser/utils/toString.ts","../../../core/src/features/parsing/parser/Parser.ts","../../../core/src/features/parsing/parser/utils/denote.ts","../../../core/src/features/parsing/utils/findToken.ts","../../../core/src/features/parsing/utils/valueParser.ts","../../../core/src/features/parsing/tokenIndex.ts","../../../core/src/features/parsing/ParseFeature.ts","../../../core/src/shared/checkers/domGuards.ts","../../../core/src/features/caret/Caret.ts","../../../core/src/features/caret/focus.ts","../../../core/src/features/caret/selection.ts","../../../core/src/features/caret/CaretFeature.ts","../../../core/src/features/caret/selectionHelpers.ts","../../../core/src/features/caret/TriggerFinder.ts","../../../core/src/features/clipboard/pasteMarkup.ts","../../../core/src/features/clipboard/ClipboardFeature.ts","../../../core/src/features/dom/DomFeature.ts","../../../core/src/features/editing/createRowContent.ts","../../../core/src/features/drag/operations.ts","../../../core/src/features/drag/tokens.ts","../../../core/src/features/drag/DragFeature.ts","../../../core/src/shared/utils/dragUtils.ts","../../../core/src/features/drag/config.ts","../../../core/src/features/keyboard/arrowNav.ts","../../../core/src/features/keyboard/blockEdit.ts","../../../core/src/features/keyboard/input.ts","../../../core/src/features/keyboard/KeyboardFeature.ts","../../../core/src/features/lifecycle/LifecycleFeature.ts","../../../core/src/features/mark/MarkController.ts","../../../core/src/shared/utils/dataAttributes.ts","../../../core/src/features/slots/resolveOptionSlot.ts","../../../core/src/features/slots/resolveSlot.ts","../../../core/src/features/slots/SlotsFeature.ts","../../../core/src/features/mark/MarkFeature.ts","../../../core/src/features/overlay/filterSuggestions.ts","../../../core/src/features/overlay/createMarkFromOverlay.ts","../../../core/src/features/overlay/OverlayFeature.ts","../../../core/src/features/overlay/suggestionNavigation.ts","../../../core/src/features/props/PropsFeature.ts","../../../core/src/features/value/ControlledEcho.ts","../../../core/src/features/value/ValueFeature.ts","../../../core/src/shared/utils/menuUtils.ts","../../../core/src/store/BlockStore.ts","../../../core/src/store/BlockRegistry.ts","../../../core/src/store/Store.ts","../src/lib/providers/StoreContext.ts","../src/lib/hooks/useMarkput.ts","../src/components/Popup/List.tsx","../src/components/Popup/ListItem.tsx","../src/components/Popup/Popup.tsx","../src/components/BlockMenu.tsx","../src/components/DragHandle.tsx","../src/components/DropIndicator.tsx","../src/lib/providers/TokenContext.ts","../src/components/TokenChildren.tsx","../src/components/Token.tsx","../src/components/Block.tsx","../src/components/Container.tsx","../src/lib/hooks/useOverlay.tsx","../src/components/Suggestions/Suggestions.tsx","../src/components/OverlayRenderer.tsx","../src/components/MarkedInput.tsx","../src/lib/hooks/useMark.tsx","../src/lib/hooks/useMarkInfo.tsx"],"sourcesContent":["export function shallow(objA: unknown, objB: unknown) {\n\tif (Object.is(objA, objB)) {\n\t\treturn true\n\t}\n\tif (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n\t\treturn false\n\t}\n\tconst keysA = Object.keys(objA)\n\tif (keysA.length !== Object.keys(objB).length) {\n\t\treturn false\n\t}\n\tfor (const key of keysA) {\n\t\tif (!Object.prototype.hasOwnProperty.call(objB, key)) {\n\t\t\treturn false\n\t\t}\n\t\tif (!Object.is(Reflect.get(objA, key), Reflect.get(objB, key))) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}","export function cx(...classes: (string | undefined | null | false)[]): string | undefined {\n\treturn classes.filter(Boolean).join(' ') || undefined\n}","export function merge<T extends object>(...objects: (T | undefined | null | false)[]): T | undefined {\n\t// oxlint-disable-next-line no-unsafe-argument, no-unsafe-call, no-unsafe-return, no-unsafe-type-assertion\n\tconst result = Object.assign({}, ...objects.filter(Boolean)) as T\n\treturn Object.keys(result).length > 0 ? result : undefined\n}","import type {Markup} from '../features/parsing/parser/types'\nimport type {CoreOption} from './types'\n\nexport interface DefaultOverlayConfig {\n\ttrigger?: string\n\tdata?: string[]\n}\n\nexport interface DefaultOption extends CoreOption {\n\toverlay?: DefaultOverlayConfig\n}\n\nexport const KEYBOARD = {\n\t// Navigation Keys\n\tUP: 'ArrowUp',\n\tDOWN: 'ArrowDown',\n\tLEFT: 'ArrowLeft',\n\tRIGHT: 'ArrowRight',\n\tEND: 'End',\n\tHOME: 'Home',\n\tPAGE_DOWN: 'PageDown',\n\tPAGE_UP: 'PageUp',\n\n\t// Whitespace Keys\n\tENTER: 'Enter',\n\tTAB: 'Tab',\n\tSPACE: ' ',\n\n\t// Editing Keys\n\tBACKSPACE: 'Backspace',\n\tDELETE: 'Delete',\n\tCOMMA: ',',\n\n\t// UI Keys\n\tESC: 'Escape',\n} as const\nexport type KEYBOARD = (typeof KEYBOARD)[keyof typeof KEYBOARD]\n\nexport const DEFAULT_OVERLAY_TRIGGER = '@'\n\nexport const DEFAULT_MARKUP: Markup = '@[__value__](__meta__)'\n\nexport const DEFAULT_OPTIONS: DefaultOption[] = [\n\t{\n\t\tmarkup: DEFAULT_MARKUP,\n\t\toverlay: {\n\t\t\ttrigger: DEFAULT_OVERLAY_TRIGGER,\n\t\t\tdata: [],\n\t\t},\n\t},\n]","import type {Store} from '../../store'\n\nexport class MarkputHandler {\n\tconstructor(private readonly store: Store) {}\n\n\tget container() {\n\t\treturn this.store.dom.container()\n\t}\n\n\tget overlay() {\n\t\treturn this.store.overlay.element()\n\t}\n\n\tfocus() {\n\t\tconst firstAddress = this.store.parsing.index().addressFor([0])\n\t\tif (firstAddress && this.store.dom.focusAddress(firstAddress).ok) return\n\t\tthis.container?.focus()\n\t}\n}","export class KeyGenerator {\n\t#counter = 1\n\treadonly #map = new WeakMap<object, number>()\n\n\tget(object: object) {\n\t\tif (this.#map.has(object)) return this.#map.get(object)\n\n\t\tthis.#map.set(object, this.#counter)\n\t\treturn this.#counter++\n\t}\n}","export interface ReactiveNode {\n\tdeps?: Link\n\tdepsTail?: Link\n\tsubs?: Link\n\tsubsTail?: Link\n\tflags: ReactiveFlags\n}\n\nexport interface Link {\n\tversion: number\n\tdep: ReactiveNode\n\tsub: ReactiveNode\n\tprevSub: Link | undefined\n\tnextSub: Link | undefined\n\tprevDep: Link | undefined\n\tnextDep: Link | undefined\n}\n\ninterface Stack<T> {\n\tvalue: T\n\tprev: Stack<T> | undefined\n}\n\nexport const enum ReactiveFlags {\n\tNone = 0,\n\tMutable = 1,\n\tWatching = 2,\n\tRecursedCheck = 4,\n\tRecursed = 8,\n\tDirty = 16,\n\tPending = 32,\n}\n\nexport function createReactiveSystem({\n\tupdate,\n\tnotify,\n\tunwatched,\n}: {\n\tupdate(sub: ReactiveNode): boolean\n\tnotify(sub: ReactiveNode): void\n\tunwatched(sub: ReactiveNode): void\n}) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate,\n\t}\n\n\tfunction link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n\t\tconst prevDep = sub.depsTail\n\t\tif (prevDep !== undefined && prevDep.dep === dep) {\n\t\t\treturn\n\t\t}\n\t\tconst nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n\t\tif (nextDep !== undefined && nextDep.dep === dep) {\n\t\t\tnextDep.version = version\n\t\t\tsub.depsTail = nextDep\n\t\t\treturn\n\t\t}\n\t\tconst prevSub = dep.subsTail\n\t\tif (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n\t\t\treturn\n\t\t}\n\t\tconst newLink =\n\t\t\t(sub.depsTail =\n\t\t\tdep.subsTail =\n\t\t\t\t{\n\t\t\t\t\tversion,\n\t\t\t\t\tdep,\n\t\t\t\t\tsub,\n\t\t\t\t\tprevDep,\n\t\t\t\t\tnextDep,\n\t\t\t\t\tprevSub,\n\t\t\t\t\tnextSub: undefined,\n\t\t\t\t})\n\t\tif (nextDep !== undefined) {\n\t\t\tnextDep.prevDep = newLink\n\t\t}\n\t\tif (prevDep !== undefined) {\n\t\t\tprevDep.nextDep = newLink\n\t\t} else {\n\t\t\tsub.deps = newLink\n\t\t}\n\t\tif (prevSub !== undefined) {\n\t\t\tprevSub.nextSub = newLink\n\t\t} else {\n\t\t\tdep.subs = newLink\n\t\t}\n\t}\n\n\tfunction unlink(link: Link, sub = link.sub): Link | undefined {\n\t\tconst dep = link.dep\n\t\tconst prevDep = link.prevDep\n\t\tconst nextDep = link.nextDep\n\t\tconst nextSub = link.nextSub\n\t\tconst prevSub = link.prevSub\n\t\tif (nextDep !== undefined) {\n\t\t\tnextDep.prevDep = prevDep\n\t\t} else {\n\t\t\tsub.depsTail = prevDep\n\t\t}\n\t\tif (prevDep !== undefined) {\n\t\t\tprevDep.nextDep = nextDep\n\t\t} else {\n\t\t\tsub.deps = nextDep\n\t\t}\n\t\tif (nextSub !== undefined) {\n\t\t\tnextSub.prevSub = prevSub\n\t\t} else {\n\t\t\tdep.subsTail = prevSub\n\t\t}\n\t\tif (prevSub !== undefined) {\n\t\t\tprevSub.nextSub = nextSub\n\t\t} else if ((dep.subs = nextSub) === undefined) {\n\t\t\tunwatched(dep)\n\t\t}\n\t\treturn nextDep\n\t}\n\n\tfunction propagate(link: Link): void {\n\t\tlet next = link.nextSub\n\t\tlet stack: Stack<Link | undefined> | undefined\n\n\t\ttop: do {\n\t\t\tconst sub = link.sub\n\t\t\tlet flags = sub.flags\n\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tflags &\n\t\t\t\t\t(ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed | ReactiveFlags.Dirty | ReactiveFlags.Pending)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsub.flags = flags | ReactiveFlags.Pending\n\t\t\t} else if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))) {\n\t\t\t\tflags = ReactiveFlags.None\n\t\t\t} else if (!(flags & ReactiveFlags.RecursedCheck)) {\n\t\t\t\tsub.flags = (flags & ~ReactiveFlags.Recursed) | ReactiveFlags.Pending\n\t\t\t} else if (!(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending)\n\t\t\t\tflags &= ReactiveFlags.Mutable\n\t\t\t} else {\n\t\t\t\tflags = ReactiveFlags.None\n\t\t\t}\n\n\t\t\tif (flags & ReactiveFlags.Watching) {\n\t\t\t\tnotify(sub)\n\t\t\t}\n\n\t\t\tif (flags & ReactiveFlags.Mutable) {\n\t\t\t\tconst subSubs = sub.subs\n\t\t\t\tif (subSubs !== undefined) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub\n\t\t\t\t\tif (nextSub !== undefined) {\n\t\t\t\t\t\tstack = {value: next, prev: stack}\n\t\t\t\t\t\tnext = nextSub\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((link = next!) !== undefined) {\n\t\t\t\tnext = link.nextSub\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\twhile (stack !== undefined) {\n\t\t\t\tlink = stack.value!\n\t\t\t\tstack = stack.prev\n\t\t\t\tif (link !== undefined) {\n\t\t\t\t\tnext = link.nextSub\n\t\t\t\t\tcontinue top\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak\n\t\t} while (true)\n\t}\n\n\tfunction checkDirty(link: Link, sub: ReactiveNode): boolean {\n\t\tlet stack: Stack<Link> | undefined\n\t\tlet checkDepth = 0\n\t\tlet dirty = false\n\n\t\ttop: do {\n\t\t\tconst dep = link.dep\n\t\t\tconst flags = dep.flags\n\n\t\t\tif (sub.flags & ReactiveFlags.Dirty) {\n\t\t\t\tdirty = true\n\t\t\t} else if (\n\t\t\t\t(flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n\t\t\t\t(ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n\t\t\t) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs!\n\t\t\t\t\tif (subs.nextSub !== undefined) {\n\t\t\t\t\t\tshallowPropagate(subs)\n\t\t\t\t\t}\n\t\t\t\t\tdirty = true\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n\t\t\t\t(ReactiveFlags.Mutable | ReactiveFlags.Pending)\n\t\t\t) {\n\t\t\t\tif (link.nextSub !== undefined || link.prevSub !== undefined) {\n\t\t\t\t\tstack = {value: link, prev: stack}\n\t\t\t\t}\n\t\t\t\tlink = dep.deps!\n\t\t\t\tsub = dep\n\t\t\t\t++checkDepth\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep\n\t\t\t\tif (nextDep !== undefined) {\n\t\t\t\t\tlink = nextDep\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs!\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== undefined\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack!.value\n\t\t\t\t\tstack = stack!.prev\n\t\t\t\t} else {\n\t\t\t\t\tlink = firstSub\n\t\t\t\t}\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\t\t\tshallowPropagate(firstSub)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsub = link.sub\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false\n\t\t\t\t} else {\n\t\t\t\t\tsub.flags &= ~ReactiveFlags.Pending\n\t\t\t\t}\n\t\t\t\tsub = link.sub\n\t\t\t\tconst nextDep = link.nextDep\n\t\t\t\tif (nextDep !== undefined) {\n\t\t\t\t\tlink = nextDep\n\t\t\t\t\tcontinue top\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dirty\n\t\t} while (true)\n\t}\n\n\tfunction shallowPropagate(link: Link): void {\n\t\tdo {\n\t\t\tconst sub = link.sub\n\t\t\tconst flags = sub.flags\n\t\t\tif ((flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) === ReactiveFlags.Pending) {\n\t\t\t\tsub.flags = flags | ReactiveFlags.Dirty\n\t\t\t\tif ((flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) === ReactiveFlags.Watching) {\n\t\t\t\t\tnotify(sub)\n\t\t\t\t}\n\t\t\t}\n\t\t} while ((link = link.nextSub!) !== undefined)\n\t}\n\n\tfunction isValidLink(checkLink: Link, sub: ReactiveNode): boolean {\n\t\tlet link = sub.depsTail\n\t\twhile (link !== undefined) {\n\t\t\tif (link === checkLink) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tlink = link.prevDep\n\t\t}\n\t\treturn false\n\t}\n}","// oxlint-disable typescript/no-explicit-any -- reactive node interfaces need flexible generic defaults\nimport {createReactiveSystem, ReactiveFlags, type ReactiveNode} from './alien-signals/system'\n\n// ---------------------------------------------------------------------------\n// Node types\n// ---------------------------------------------------------------------------\n\ninterface SignalNode<T = any> extends ReactiveNode {\n\tcurrentValue: T\n\tpendingValue: T\n\tdefaultValue: T | undefined\n\thasDefault: boolean\n\tequalsFn: ((a: T, b: T) => boolean) | undefined\n\tisReadonly: boolean\n}\n\ninterface ComputedNode<T = any> extends ReactiveNode {\n\tvalue: T | undefined\n\tgetter: (previousValue?: T) => T\n\tequalsFn: ((a: T, b: T) => boolean) | undefined\n}\n\ninterface EffectNode extends ReactiveNode {\n\tfn(): void | (() => void)\n\tcleanup?: () => void\n}\n\ninterface EventNode<T = any> extends ReactiveNode {\n\tpayload: T | undefined\n\tseq: number\n}\n\n// ---------------------------------------------------------------------------\n// Module state\n// ---------------------------------------------------------------------------\n\nlet cycle = 0\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedLength = 0\nlet activeSub: ReactiveNode | undefined\nlet mutableScope = false\n\nconst queued: (EffectNode | undefined)[] = []\n\n// ---------------------------------------------------------------------------\n// Reactive system\n// ---------------------------------------------------------------------------\n\nconst {link, unlink, propagate, checkDirty, shallowPropagate} = createReactiveSystem({\n\tupdate(node: SignalNode | ComputedNode | EventNode): boolean {\n\t\tif ('getter' in node) {\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\t\treturn updateComputed(node)\n\t\t}\n\t\tif ('seq' in node) {\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\t\treturn updateEvent(node)\n\t\t}\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\treturn updateSignal(node)\n\t},\n\tnotify(effect: EffectNode) {\n\t\tlet insertIndex = queuedLength\n\t\tlet firstInsertedIndex = insertIndex\n\n\t\tdo {\n\t\t\tqueued[insertIndex++] = effect\n\t\t\teffect.flags &= ~ReactiveFlags.Watching\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- subs chain is always an EffectNode here\n\t\t\teffect = effect.subs?.sub as EffectNode\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition -- cast from sub?: ReactiveNode can be undefined\n\t\t\tif (effect === undefined || !(effect.flags & ReactiveFlags.Watching)) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition, no-constant-condition -- intentional infinite loop with break\n\t\t} while (true)\n\n\t\tqueuedLength = insertIndex\n\n\t\twhile (firstInsertedIndex < --insertIndex) {\n\t\t\tconst left = queued[firstInsertedIndex]\n\t\t\tqueued[firstInsertedIndex++] = queued[insertIndex]\n\t\t\tqueued[insertIndex] = left\n\t\t}\n\t},\n\tunwatched(node) {\n\t\tif (!(node.flags & ReactiveFlags.Mutable)) {\n\t\t\tif ('fn' in node) {\n\t\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime 'fn' in node check\n\t\t\t\tconst e = node as EffectNode\n\t\t\t\tif (e.cleanup !== undefined) {\n\t\t\t\t\te.cleanup()\n\t\t\t\t\te.cleanup = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\teffectScopeOper.call(node)\n\t\t} else if (node.depsTail !== undefined) {\n\t\t\tnode.depsTail = undefined\n\t\t\tnode.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\t\tpurgeDeps(node)\n\t\t}\n\t},\n})\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction setActiveSub(sub?: ReactiveNode) {\n\tconst prevSub = activeSub\n\tactiveSub = sub\n\treturn prevSub\n}\n\nfunction updateSignal(s: SignalNode): boolean {\n\ts.flags = ReactiveFlags.Mutable\n\treturn s.currentValue !== (s.currentValue = s.pendingValue)\n}\n\nfunction updateComputed(c: ComputedNode): boolean {\n\t++cycle\n\tc.depsTail = undefined\n\tc.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n\tconst prevSub = setActiveSub(c)\n\ttry {\n\t\tconst oldValue = c.value\n\t\tconst newValue = c.getter(oldValue)\n\t\tif (c.equalsFn !== undefined && oldValue !== undefined && c.equalsFn(oldValue, newValue)) {\n\t\t\treturn false\n\t\t}\n\t\treturn oldValue !== (c.value = newValue)\n\t} finally {\n\t\tactiveSub = prevSub\n\t\tc.flags &= ~ReactiveFlags.RecursedCheck\n\t\tpurgeDeps(c)\n\t}\n}\n\nfunction updateEvent(e: EventNode): boolean {\n\te.flags = ReactiveFlags.Mutable\n\treturn true\n}\n\nfunction run(e: EffectNode): void {\n\tconst flags = e.flags\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- deps is guaranteed present when Pending\n\tif (flags & ReactiveFlags.Dirty || (flags & ReactiveFlags.Pending && checkDirty(e.deps!, e))) {\n\t\tif (e.cleanup !== undefined) {\n\t\t\te.cleanup()\n\t\t\te.cleanup = undefined\n\t\t}\n\t\t++cycle\n\t\te.depsTail = undefined\n\t\te.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n\t\tconst prevSub = setActiveSub(e)\n\t\ttry {\n\t\t\tconst result = e.fn()\n\t\t\tif (typeof result === 'function') {\n\t\t\t\te.cleanup = result as () => void\n\t\t\t}\n\t\t} finally {\n\t\t\tactiveSub = prevSub\n\t\t\te.flags &= ~ReactiveFlags.RecursedCheck\n\t\t\tpurgeDeps(e)\n\t\t}\n\t} else {\n\t\te.flags = ReactiveFlags.Watching\n\t}\n}\n\nfunction flush(): void {\n\ttry {\n\t\twhile (notifyIndex < queuedLength) {\n\t\t\t// oxlint-disable-next-line typescript/no-non-null-assertion -- index < queuedLength guarantees non-undefined\n\t\t\tconst effect = queued[notifyIndex]!\n\t\t\tqueued[notifyIndex++] = undefined\n\t\t\trun(effect)\n\t\t}\n\t} finally {\n\t\twhile (notifyIndex < queuedLength) {\n\t\t\t// oxlint-disable-next-line typescript/no-non-null-assertion -- index < queuedLength guarantees non-undefined\n\t\t\tconst effect = queued[notifyIndex]!\n\t\t\tqueued[notifyIndex++] = undefined\n\t\t\teffect.flags |= ReactiveFlags.Watching | ReactiveFlags.Recursed\n\t\t}\n\t\tnotifyIndex = 0\n\t\tqueuedLength = 0\n\t}\n}\n\nfunction purgeDeps(sub: ReactiveNode) {\n\tconst depsTail = sub.depsTail\n\tlet dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n\twhile (dep !== undefined) {\n\t\tdep = unlink(dep, sub)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Oper functions (bound to nodes)\n// ---------------------------------------------------------------------------\n\nfunction signalOper<T>(this: SignalNode<T>, ...value: [T | undefined] | []): T | void {\n\tif (value.length) {\n\t\tif (this.isReadonly && !mutableScope) return\n\t\tconst v = value[0]\n\t\tif (v === undefined) {\n\t\t\tconst isAtDefault = this.hasDefault\n\t\t\t\t? this.pendingValue === undefined || this.pendingValue === this.defaultValue\n\t\t\t\t: this.pendingValue === undefined\n\t\t\tif (isAtDefault) return\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- undefined is valid for T when reverting to default\n\t\t\tthis.pendingValue = undefined as T\n\t\t} else {\n\t\t\tconst current = this.pendingValue\n\t\t\tconst effectiveCurrent = current === undefined && this.hasDefault ? this.defaultValue : current\n\t\t\tif (this.equalsFn !== undefined) {\n\t\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- effectiveCurrent is T when equalsFn is defined and either current !== undefined or hasDefault\n\t\t\t\tif (this.equalsFn(effectiveCurrent as T, v)) return\n\t\t\t} else {\n\t\t\t\tif (effectiveCurrent === v) return\n\t\t\t}\n\t\t\tthis.pendingValue = v\n\t\t}\n\t\tthis.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\tconst subs = this.subs\n\t\tif (subs !== undefined) {\n\t\t\tpropagate(subs)\n\t\t\tif (!batchDepth) {\n\t\t\t\tflush()\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (this.flags & ReactiveFlags.Dirty) {\n\t\t\tif (updateSignal(this)) {\n\t\t\t\tconst subs = this.subs\n\t\t\t\tif (subs !== undefined) {\n\t\t\t\t\tshallowPropagate(subs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Walk to the nearest subscriber with Mutable or Watching flags.\n\t\t// Needed when activeSub is a non-tracking scope node (e.g. effectScope with flags: None)\n\t\t// rather than a computed/effect. computedOper/eventReadOper can link directly because they\n\t\t// are only called inside reactive contexts that guarantee a valid subscriber, but signals\n\t\t// may be read in broader scopes.\n\t\tlet sub = activeSub\n\t\twhile (sub !== undefined) {\n\t\t\tif (sub.flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) {\n\t\t\t\tlink(this, sub, cycle)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tsub = sub.subs?.sub\n\t\t}\n\t\tconst v = this.currentValue\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- defaultValue is T when hasDefault is true\n\t\tif (v === undefined && this.hasDefault) return this.defaultValue as T\n\t\treturn v\n\t}\n}\n\nfunction computedOper<T>(this: ComputedNode<T>): T {\n\tconst flags = this.flags\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- deps is guaranteed present when Pending\n\tconst deps = this.deps!\n\tif (\n\t\tflags & ReactiveFlags.Dirty ||\n\t\t(flags & ReactiveFlags.Pending &&\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition -- comma expr with false is intentional for side effect\n\t\t\t(checkDirty(deps, this) || ((this.flags = flags & ~ReactiveFlags.Pending), false)))\n\t) {\n\t\tif (updateComputed(this)) {\n\t\t\tconst subs = this.subs\n\t\t\tif (subs !== undefined) {\n\t\t\t\tshallowPropagate(subs)\n\t\t\t}\n\t\t}\n\t} else if (!flags) {\n\t\tthis.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n\t\tconst prevSub = setActiveSub(this)\n\t\ttry {\n\t\t\tthis.value = this.getter()\n\t\t} finally {\n\t\t\tactiveSub = prevSub\n\t\t\tthis.flags &= ~ReactiveFlags.RecursedCheck\n\t\t}\n\t}\n\tconst sub = activeSub\n\tif (sub !== undefined) {\n\t\tlink(this, sub, cycle)\n\t}\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- value is always set before read\n\treturn this.value!\n}\n\nfunction eventReadOper<T>(this: EventNode<T>): T | undefined {\n\tif (this.flags & ReactiveFlags.Dirty) {\n\t\tupdateEvent(this)\n\t}\n\tconst sub = activeSub\n\tif (sub !== undefined) {\n\t\tlink(this, sub, cycle)\n\t}\n\treturn this.payload\n}\n\nfunction effectOper(this: EffectNode): void {\n\tif (this.cleanup !== undefined) {\n\t\tthis.cleanup()\n\t\tthis.cleanup = undefined\n\t}\n\teffectScopeOper.call(this)\n}\n\nfunction effectScopeOper(this: ReactiveNode): void {\n\tthis.depsTail = undefined\n\tthis.flags = ReactiveFlags.None\n\tpurgeDeps(this)\n\tconst sub = this.subs\n\tif (sub !== undefined) {\n\t\tunlink(sub)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Signal<T> — reactive state value\n// ---------------------------------------------------------------------------\n\nexport interface Signal<T> {\n\t(): T\n\t(value: T | undefined): void\n}\n\nexport type SignalValues<T> = {\n\t[K in keyof T]: T[K] extends Signal<infer V> | Computed<infer V> ? V : T[K]\n}\n\nexport function isReactive(fn: unknown): fn is Signal<unknown> | Computed<unknown> {\n\tif (typeof fn !== 'function') return false\n\tconst name = (fn as {name: string}).name\n\treturn name === 'bound ' + signalOper.name || name === 'bound ' + computedOper.name\n}\n\ninterface SignalOptions<T> {\n\tequals?: (a: T, b: T) => boolean\n\treadonly?: boolean\n}\n\nexport function signal<T>(initial: T, opts?: SignalOptions<T>): Signal<T> {\n\tconst node: SignalNode<T> = {\n\t\tcurrentValue: initial,\n\t\tpendingValue: initial,\n\t\tdefaultValue: initial,\n\t\thasDefault: initial !== undefined,\n\t\tequalsFn: opts?.equals ?? undefined,\n\t\tisReadonly: !!opts?.readonly,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.Mutable,\n\t}\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Signal<T> interface but TS can't verify the overloaded call signature\n\treturn (signalOper as (this: SignalNode<T>, ...value: [T | undefined] | []) => T | void).bind(\n\t\tnode\n\t) as unknown as Signal<T>\n}\n\n// ---------------------------------------------------------------------------\n// Computed<T> — derived reactive value\n// ---------------------------------------------------------------------------\n\nexport interface Computed<T> {\n\t(): T\n}\n\ninterface ComputedOptions<T> {\n\tequals?: (a: T, b: T) => boolean\n}\n\nexport function computed<T>(getter: (previousValue?: T) => T, opts?: ComputedOptions<T>): Computed<T> {\n\tconst node: ComputedNode<T> = {\n\t\tvalue: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.None,\n\t\tgetter: getter as (previousValue?: T) => T,\n\t\tequalsFn: opts?.equals ?? undefined,\n\t}\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Computed<T> interface but TS can't verify the call signature\n\treturn (computedOper as (this: ComputedNode<T>) => T).bind(node) as unknown as Computed<T>\n}\n\n// ---------------------------------------------------------------------------\n// Event<T> — unified reactive event primitive\n// ---------------------------------------------------------------------------\n\nexport interface Event<T = void> {\n\t(payload: T): void\n\tread(): T | undefined\n}\n\nexport function event<T = void>(): Event<T> {\n\tconst node: EventNode<T> = {\n\t\tpayload: undefined,\n\t\tseq: 0,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.Mutable,\n\t}\n\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Event<T> interface but TS can't verify the call signature\n\tconst callable = function eventCallable(payload: T) {\n\t\tnode.payload = payload\n\t\tnode.seq++\n\t\tnode.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\tconst subs = node.subs\n\t\tif (subs !== undefined) {\n\t\t\tpropagate(subs)\n\t\t\tif (!batchDepth) {\n\t\t\t\tflush()\n\t\t\t}\n\t\t}\n\t} as unknown as Event<T>\n\n\tcallable.read = (eventReadOper as (this: EventNode<T>) => T | undefined).bind(node)\n\n\treturn callable\n}\n\n// ---------------------------------------------------------------------------\n// effect() / effectScope()\n// ---------------------------------------------------------------------------\n\nexport {alienEffect as effect}\n\nfunction alienEffect(fn: () => void | (() => void)): () => void {\n\tconst e: EffectNode = {\n\t\tfn,\n\t\tcleanup: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\t}\n\tconst prevSub = setActiveSub(e)\n\tif (prevSub !== undefined) {\n\t\tlink(e, prevSub, 0)\n\t}\n\ttry {\n\t\tconst result = e.fn()\n\t\tif (typeof result === 'function') {\n\t\t\te.cleanup = result as () => void\n\t\t}\n\t} finally {\n\t\tactiveSub = prevSub\n\t\te.flags &= ~ReactiveFlags.RecursedCheck\n\t}\n\treturn effectOper.bind(e)\n}\n\nexport function effectScope(fn: () => void): () => void {\n\tconst e: ReactiveNode = {\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.None,\n\t}\n\tconst prevSub = setActiveSub(e)\n\tif (prevSub !== undefined) {\n\t\tlink(e, prevSub, 0)\n\t}\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tactiveSub = prevSub\n\t}\n\treturn effectScopeOper.bind(e)\n}\n\n// ---------------------------------------------------------------------------\n// watch() — skip-first-run helper for event subscriptions\n// ---------------------------------------------------------------------------\n\nexport function watch<T>(dep: Signal<T>, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(dep: Event<T>, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(dep: () => T, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(\n\tdep: Signal<T> | Event<T> | (() => T),\n\tfn: (newValue: T, oldValue: T | undefined) => void\n): () => void {\n\tlet initialized = false\n\tlet oldValue: T | undefined\n\treturn alienEffect(() => {\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- Event<T> returns T | undefined before first emit, but watch skips the first run so callback always receives T\n\t\tconst newValue = ('read' in dep ? dep.read() : dep()) as T\n\t\tif (!initialized) {\n\t\t\tinitialized = true\n\t\t\toldValue = newValue\n\t\t\treturn\n\t\t}\n\t\tconst prev = oldValue\n\t\toldValue = newValue\n\t\tuntracked(() => fn(newValue, prev))\n\t})\n}\n\n// ---------------------------------------------------------------------------\n// batch() — defer effect flush until callback completes\n// ---------------------------------------------------------------------------\n\ninterface BatchOptions {\n\tmutable?: boolean\n}\n\nexport function batch(fn: () => void, opts?: BatchOptions): void {\n\tconst prevMutable = mutableScope\n\tif (opts?.mutable) mutableScope = true\n\t++batchDepth\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tif (!--batchDepth) {\n\t\t\tflush()\n\t\t}\n\t\tmutableScope = prevMutable\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// trigger() — re-run code that reads signals and propagate the result\n// ---------------------------------------------------------------------------\n\nexport function trigger(fn: () => void) {\n\tconst sub: ReactiveNode = {\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.Watching,\n\t}\n\tconst prevSub = setActiveSub(sub)\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tactiveSub = prevSub\n\t\tlet dep = sub.deps\n\t\twhile (dep !== undefined) {\n\t\t\tconst subs = dep.dep.subs\n\t\t\tdep = unlink(dep, sub)\n\t\t\tif (subs !== undefined) {\n\t\t\t\tsub.flags = ReactiveFlags.None\n\t\t\t\tpropagate(subs)\n\t\t\t\tshallowPropagate(subs)\n\t\t\t}\n\t\t}\n\t\tif (!batchDepth) {\n\t\t\tflush()\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// untracked() — run a function without tracking reactive dependencies\n// ---------------------------------------------------------------------------\n\nexport function untracked<T>(fn: () => T): T {\n\tconst prev = setActiveSub(undefined)\n\ttry {\n\t\treturn fn()\n\t} finally {\n\t\tsetActiveSub(prev)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// listen() — scope-aware DOM event listener\n// ---------------------------------------------------------------------------\n\nexport function listen<K extends keyof WindowEventMap>(\n\ttarget: Window,\n\tevent: K,\n\thandler: (e: WindowEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen<K extends keyof DocumentEventMap>(\n\ttarget: Document,\n\tevent: K,\n\thandler: (e: DocumentEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen<K extends keyof HTMLElementEventMap>(\n\ttarget: HTMLElement,\n\tevent: K,\n\thandler: (e: HTMLElementEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: EventListenerOrEventListenerObject,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: EventListenerOrEventListenerObject,\n\toptions?: boolean | AddEventListenerOptions\n): () => void {\n\treturn alienEffect(() => {\n\t\ttarget.addEventListener(event, handler, options)\n\t\treturn () => target.removeEventListener(event, handler, options)\n\t})\n}","/**\n * Constants for ParserV2 - modern markup parser with nesting support\n *\n * This module contains the placeholder constants used by ParserV2.\n * Unlike the legacy Parser, ParserV2 supports:\n * - `__value__` - main content (replaces `__label__`)\n * - `__meta__` - metadata (replaces `__value__`)\n * - `__slot__` - nested content (new feature)\n *\n * For legacy Parser compatibility, see ../Parser/constants.ts\n * For Markup types, see ./types.ts\n */\nexport const PLACEHOLDER = {\n\tValue: '__value__',\n\tMeta: '__meta__',\n\tSlot: '__slot__',\n} as const\n\n/**\n * Gap types used in markup descriptors\n * Represents the content type in gaps between segments\n */\nexport const GAP_TYPE = {\n\tValue: 'value',\n\tMeta: 'meta',\n\tSlot: 'slot',\n} as const\n\nexport type GapType = (typeof GAP_TYPE)[keyof typeof GAP_TYPE]","import type {GapType} from '../constants'\nimport {GAP_TYPE, PLACEHOLDER} from '../constants'\nimport type {Markup} from '../types'\nimport type {SegmentDefinition} from './SegmentMatcher'\n\n/**\n * Descriptor for segment-based markup parsing\n * Converts markup templates into arrays of static or dynamic segments\n */\nexport interface MarkupDescriptor {\n\t/** Original markup template string */\n\tmarkup: Markup\n\t/** Index of this markup in the original markups array */\n\tindex: number\n\t/** Array of segment definitions (can be static strings or dynamic patterns) */\n\tsegments: SegmentDefinition[]\n\t/** Type of content in each gap between segments */\n\tgapTypes: GapType[]\n\t/** True if this markup contains a __slot__ placeholder */\n\thasSlot: boolean\n\t/** True if this markup contains exactly two __value__ placeholders */\n\thasTwoValues: boolean\n\t/** Global indices of segments in registry segments array (parallel to segments array) */\n\tsegmentGlobalIndices: number[]\n}\n\n/**\n * Creates a segment-based markup descriptor from a markup template\n *\n * Examples:\n * - `#[__value__]` -> segments: [\"#[\", \"]\"], gapTypes: [\"value\"]\n * - `#[__slot__]` -> segments: [\"#[\", \"]\"], gapTypes: [\"slot\"]\n * - `@[__value__](__meta__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"value\", \"meta\"]\n * - `@[__slot__](__meta__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"slot\", \"meta\"]\n * - `@[__value__](__slot__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"value\", \"slot\"]\n * - `<__value__>__meta__</__value__>` -> segments: [{pattern: '<([^>]+)>'}, {pattern: '</([^>]+)>'}], gapTypes: [\"value\", \"meta\", \"value\"] (dynamic)\n * - `<__value__ __meta__>__slot__</__value__>` -> segments: [{pattern: '<([^> ]+) '}, \" \", {pattern: '>__slot__</([^>]+)>'}], gapTypes: [\"value\", \"meta\", \"slot\", \"value\"] (dynamic)\n */\nexport function createMarkupDescriptor(markup: Markup, index: number): MarkupDescriptor {\n\tconst {segments: rawSegments, gapTypes: rawGapTypes, counts, valueGapIndices} = scanMarkupStructure(markup)\n\n\tvalidateMarkup(counts, markup)\n\n\tconst hasTwoValues = counts.value === 2\n\n\tconst {segments, gapTypes} = hasTwoValues\n\t\t? convertTwoValuePattern(rawSegments, rawGapTypes, valueGapIndices)\n\t\t: {segments: rawSegments, gapTypes: rawGapTypes}\n\n\treturn {\n\t\tmarkup,\n\t\tindex,\n\t\tsegments,\n\t\tgapTypes,\n\t\thasSlot: counts.slot === 1,\n\t\thasTwoValues,\n\t\tsegmentGlobalIndices: Array.from({length: segments.length}), // Will be populated by MarkupRegistry\n\t}\n}\n\n/**\n * Maps placeholder types to their text representations\n */\nconst PLACEHOLDER_TEXT: Record<GapType, string> = {\n\t[GAP_TYPE.Value]: PLACEHOLDER.Value,\n\t[GAP_TYPE.Meta]: PLACEHOLDER.Meta,\n\t[GAP_TYPE.Slot]: PLACEHOLDER.Slot,\n} as const\n\n/**\n * Parses markup template into segments, gap types and placeholder counts\n */\nfunction scanMarkupStructure(markup: string) {\n\tconst segments: string[] = []\n\tconst gapTypes: GapType[] = []\n\tconst valueGapIndices: number[] = []\n\tconst counts: Record<GapType, number> = {\n\t\tvalue: 0,\n\t\tmeta: 0,\n\t\tslot: 0,\n\t}\n\n\t// Find all placeholders and sort by position\n\tconst placeholders: Array<{type: GapType; position: number}> = []\n\tconst placeholderTypes = [GAP_TYPE.Value, GAP_TYPE.Meta, GAP_TYPE.Slot] as const\n\n\tfor (const type of placeholderTypes) {\n\t\tconst text = PLACEHOLDER_TEXT[type]\n\t\tlet position = markup.indexOf(text)\n\t\twhile (position !== -1) {\n\t\t\tplaceholders.push({type, position})\n\t\t\tposition = markup.indexOf(text, position + text.length)\n\t\t}\n\t}\n\n\tplaceholders.sort((a, b) => a.position - b.position)\n\n\t// Process placeholders in order\n\tlet currentParsePosition = 0\n\tfor (const placeholder of placeholders) {\n\t\tconst segment = markup.substring(currentParsePosition, placeholder.position)\n\t\tif (segment.length > 0) {\n\t\t\tsegments.push(segment)\n\t\t}\n\n\t\tgapTypes.push(placeholder.type)\n\t\tcounts[placeholder.type]++\n\n\t\tif (placeholder.type === GAP_TYPE.Value) {\n\t\t\tvalueGapIndices.push(gapTypes.length - 1)\n\t\t}\n\n\t\tcurrentParsePosition = placeholder.position + PLACEHOLDER_TEXT[placeholder.type].length\n\t}\n\n\tconst finalSegment = markup.substring(currentParsePosition)\n\tif (finalSegment.length > 0) {\n\t\tsegments.push(finalSegment)\n\t}\n\n\treturn {\n\t\tsegments,\n\t\tgapTypes,\n\t\tcounts,\n\t\tvalueGapIndices,\n\t}\n}\n\n/**\n * Validates markup placeholder counts\n */\nfunction validateMarkup(counts: Record<GapType, number>, markup: string): void {\n\tconst rules = [\n\t\t{count: counts.value, max: 2, name: PLACEHOLDER.Value},\n\t\t{count: counts.meta, max: 1, name: PLACEHOLDER.Meta},\n\t\t{count: counts.slot, max: 1, name: PLACEHOLDER.Slot},\n\t]\n\n\tfor (const {count, max, name} of rules) {\n\t\tif (count > max) {\n\t\t\tthrow new Error(`Invalid markup: \"${markup}\". Max ${max} \"${name}\" placeholders, got ${count}`)\n\t\t}\n\t}\n\n\tif (counts.value === 0 && counts.slot === 0) {\n\t\tthrow new Error(\n\t\t\t`Invalid markup: \"${markup}\". Need at least one \"${PLACEHOLDER.Value}\" or \"${PLACEHOLDER.Slot}\"`\n\t\t)\n\t}\n}\n\n/**\n * Converts static segments around __value__ placeholders to dynamic patterns\n * For pattern like <__value__>__meta__</__value__>:\n * - Original: segments [\"<\", \">\", \"</\", \">\"], gapTypes [\"value\", \"meta\", \"value\"]\n * - Result: segments [['<', '>', exclusions], ['</', '>', exclusions]], gapTypes [\"meta\"]\n * Dynamic segments \"absorb\" the __value__ gaps they surround\n */\nfunction convertTwoValuePattern(\n\tsegments: string[],\n\tgapTypes: GapType[],\n\tvalueGapIndices: number[]\n): {segments: SegmentDefinition[]; gapTypes: GapType[]} {\n\tif (valueGapIndices.length !== 2) {\n\t\treturn {segments, gapTypes}\n\t}\n\n\tconst [firstValueGapIdx, secondValueGapIdx] = valueGapIndices\n\n\tconst newSegments: SegmentDefinition[] = []\n\n\tconst beforeFirst = segments[firstValueGapIdx]\n\tconst afterFirst = segments[firstValueGapIdx + 1]\n\tif (beforeFirst && afterFirst) {\n\t\tnewSegments.push(createDynamicDefinition(beforeFirst, afterFirst, segments[firstValueGapIdx + 2]))\n\t}\n\n\tfor (let i = firstValueGapIdx + 2; i < secondValueGapIdx; i++) {\n\t\tnewSegments.push(segments[i])\n\t}\n\n\tconst beforeSecond = segments[secondValueGapIdx]\n\tconst afterSecond = segments[secondValueGapIdx + 1]\n\tif (beforeSecond && afterSecond) {\n\t\tnewSegments.push(createDynamicDefinition(beforeSecond, afterSecond, segments[secondValueGapIdx + 2]))\n\t}\n\n\tconst filteredGapTypes = gapTypes.filter(type => type !== GAP_TYPE.Value)\n\n\treturn {segments: newSegments, gapTypes: filteredGapTypes}\n}\n\nfunction createDynamicDefinition(\n\tbeforeSegment: string,\n\tafterSegment: string,\n\tnextSegment?: string\n): [string, string, string] {\n\tif (!nextSegment) return [beforeSegment, afterSegment, '']\n\n\tconst firstChar = nextSegment.charAt(0)\n\tconst exclusion =\n\t\tfirstChar && !afterSegment.includes(firstChar) && !nextSegment.startsWith(beforeSegment) ? firstChar : ''\n\n\treturn [beforeSegment, afterSegment, exclusion]\n}","import type {Markup} from '../types'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport {createMarkupDescriptor} from './MarkupDescriptor'\nimport type {SegmentDefinition} from './SegmentMatcher'\n\nfunction getOrCreate<K, V>(map: Map<K, V[]>, key: K): V[] {\n\tlet arr = map.get(key)\n\tif (!arr) {\n\t\tarr = []\n\t\tmap.set(key, arr)\n\t}\n\treturn arr\n}\n\n/**\n * Registry for managing markup descriptors\n * Centralizes access to all markup patterns and their descriptors\n */\nexport class MarkupRegistry {\n\treadonly markups: (Markup | undefined)[]\n\treadonly descriptors: MarkupDescriptor[]\n\t/** Deduplicated list of unique segment definitions (static strings or dynamic patterns) */\n\treadonly segments: SegmentDefinition[] = []\n\t/** Map from first segment index to descriptors that start with this segment (for O(1) lookup) */\n\treadonly firstSegmentIndexMap: Map<number, MarkupDescriptor[]> = new Map()\n\n\tconstructor(markups: (Markup | undefined)[]) {\n\t\tthis.markups = markups\n\n\t\tconst segmentIndexMap = new Map<string, number>()\n\n\t\tthis.descriptors = markups\n\t\t\t.map((markup, index) => {\n\t\t\t\t// Skip undefined markups but preserve original indices\n\t\t\t\tif (markup === undefined) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tconst descriptor = createMarkupDescriptor(markup, index)\n\n\t\t\t\t// Process segments and register them\n\t\t\t\tdescriptor.segments.forEach((segment, segmentIndex) => {\n\t\t\t\t\tthis.processSegment(descriptor, segment, segmentIndex, segmentIndexMap)\n\t\t\t\t})\n\n\t\t\t\tthis.addToFirstSegmentIndexMap(descriptor)\n\n\t\t\t\treturn descriptor\n\t\t\t})\n\t\t\t.filter((descriptor): descriptor is MarkupDescriptor => descriptor !== null)\n\t}\n\n\t/**\n\t * Adds a descriptor to the firstSegmentIndexMap using its first segment's global index\n\t */\n\tprivate addToFirstSegmentIndexMap(descriptor: MarkupDescriptor): void {\n\t\tconst firstSegmentIndex = descriptor.segmentGlobalIndices[0]\n\n\t\tgetOrCreate(this.firstSegmentIndexMap, firstSegmentIndex).push(descriptor)\n\t}\n\n\tprivate processSegment(\n\t\tdescriptor: MarkupDescriptor,\n\t\tsegment: SegmentDefinition,\n\t\tsegmentIndex: number,\n\t\tsegmentIndexMap: Map<string, number>\n\t): void {\n\t\tconst segmentKey = this.getSegmentKey(segment)\n\t\tif (!segmentKey) return\n\n\t\tconst globalIndex = this.registerSegment(segment, segmentKey, segmentIndexMap)\n\n\t\tdescriptor.segmentGlobalIndices[segmentIndex] = globalIndex\n\n\t\t// Register static parts of dynamic segments\n\t\tif (typeof segment !== 'string') {\n\t\t\tconst [before, after] = segment\n\t\t\tif (before) {\n\t\t\t\tthis.registerSegment(before, before, segmentIndexMap)\n\t\t\t}\n\t\t\tif (after) {\n\t\t\t\tthis.registerSegment(after, after, segmentIndexMap)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate registerSegment(\n\t\tsegment: SegmentDefinition,\n\t\tsegmentKey: string,\n\t\tsegmentIndexMap: Map<string, number>\n\t): number {\n\t\tconst existing = segmentIndexMap.get(segmentKey)\n\t\tif (existing !== undefined) return existing\n\t\tconst globalIndex = this.segments.length\n\t\tthis.segments.push(segment)\n\t\tsegmentIndexMap.set(segmentKey, globalIndex)\n\t\treturn globalIndex\n\t}\n\n\t/**\n\t * Gets a unique key for a segment definition\n\t * For static segments (strings), returns the string itself if non-empty\n\t * For dynamic segments (arrays), returns before|after|exclusions if before or after is non-empty\n\t * Returns empty string for segments that should be ignored\n\t */\n\tprivate getSegmentKey(segment: SegmentDefinition): string {\n\t\tif (typeof segment === 'string') {\n\t\t\treturn segment\n\t\t}\n\t\t// For dynamic segments, create a key from before+after+exclusions\n\t\tconst [before, after, exclusions] = segment\n\t\t// Only return a key if there's something to match (before or after is non-empty)\n\t\tif (before || after) {\n\t\t\treturn `${before}|${after}|${exclusions}`\n\t\t}\n\t\treturn ''\n\t}\n}","/**\n * Creates a value-specific index using djb2 hash algorithm for dynamic segments\n * For static segments, returns the base index directly to avoid unnecessary hashing\n *\n * @param baseIndex - The base index of the segment type\n * @param value - The actual value of the segment (optional, for dynamic segments only)\n * @returns Value-specific index for dynamic segments, or base index for static segments\n */\nexport function getSegmentIndex(baseIndex: number, value?: string): number {\n\tif (!value) {\n\t\treturn baseIndex\n\t}\n\n\tlet hash = 5381\n\tfor (let i = 0; i < value.length; i++) {\n\t\thash = (hash * 33) ^ value.charCodeAt(i)\n\t}\n\thash = hash >>> 0 // Unsigned 32-bit integer\n\n\treturn baseIndex * 1000000 + (hash & 0xfffff)\n}","import type {GapType} from '../constants'\nimport type {PositionRange} from '../types'\nimport {getSegmentIndex} from '../utils/getSegmentIndex'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport type {SegmentMatch} from './SegmentMatcher'\n\n/**\n * Unified match structure for pattern matching states\n *\n * Represents the state of a pattern matching process in the parser's state machine:\n * - Active: tracks progress through pattern segments (expectedSegmentIndex >= 0)\n * - Completed: all segments found, match is valid (expectedSegmentIndex = NaN)\n * - Invalid: match cannot be completed due to malformed segments (expectedSegmentIndex = -1)\n *\n * State detection:\n * - isCompleted: expectedSegmentIndex is NaN\n * - isInvalid: expectedSegmentIndex is -1\n * - isActive: expectedSegmentIndex >= 0 (not NaN and not -1)\n */\n\nexport class Match {\n\tpublic readonly gaps: Partial<Record<GapType, PositionRange>> = {}\n\t/** Captured value from first dynamic segment (for hasTwoValues patterns) */\n\tprivate readonly captured?: string\n\n\t/**\n\t * Index of expected next segment:\n\t * - >= 0: active, waiting for segment at this index\n\t * - NaN: completed successfully\n\t * - -1: invalid, should be discarded\n\t */\n\tpublic expectedSegmentIndex: number\n\tpublic start: number\n\tpublic end: number\n\n\tconstructor(\n\t\tpublic readonly descriptor: MarkupDescriptor,\n\t\tfirstSegment: SegmentMatch\n\t) {\n\t\tthis.expectedSegmentIndex = 1\n\t\tthis.start = firstSegment.start\n\t\tthis.end = firstSegment.end\n\n\t\t// Auto-complete single segment patterns\n\t\tif (descriptor.segments.length === 1) {\n\t\t\tthis.expectedSegmentIndex = NaN\n\n\t\t\t//TODO need review it. before it was only value gap type\n\t\t\tconst gapType = descriptor.gapTypes[0] ?? 'value'\n\t\t\tif (gapType === 'slot') {\n\t\t\t\t// Slot-leading: real range resolved by PatternMatcher.resolveSlotLeadingMatches\n\t\t\t\tthis.gaps.slot = {start: this.start, end: this.start}\n\t\t\t} else {\n\t\t\t\tthis.gaps[gapType] = {start: this.start, end: this.end}\n\t\t\t}\n\t\t}\n\n\t\tif (descriptor.hasTwoValues && firstSegment.captured) {\n\t\t\tthis.captured = firstSegment.captured\n\t\t\tconst capturedStart = firstSegment.start + firstSegment.value.indexOf(firstSegment.captured)\n\t\t\tconst capturedEnd = capturedStart + firstSegment.captured.length\n\t\t\tthis.gaps.value = {start: capturedStart, end: capturedEnd}\n\t\t}\n\t}\n\n\t/**\n\t * Check if the match is invalid and should be discarded\n\t */\n\tget isInvalid(): boolean {\n\t\treturn this.expectedSegmentIndex === -1\n\t}\n\n\t/**\n\t * Check if the pattern is completed (computed property)\n\t */\n\tget isCompleted(): boolean {\n\t\treturn isNaN(this.expectedSegmentIndex)\n\t}\n\n\t/**\n\t * Check if the match is waiting for the last segment (high priority)\n\t */\n\tget isAwaitingLastSegment(): boolean {\n\t\treturn this.expectedSegmentIndex === this.descriptor.segments.length - 1\n\t}\n\n\t/**\n\t * Get the next expected segment index\n\t */\n\tget nextSegment(): number | undefined {\n\t\tif (this.isCompleted || this.isInvalid) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst baseIndex = this.descriptor.segmentGlobalIndices[this.expectedSegmentIndex]\n\t\tconst segmentDef = this.descriptor.segments[this.expectedSegmentIndex]\n\n\t\t// Only hash for hasTwoValues closing tags that need value-specific matching\n\t\tif (\n\t\t\ttypeof segmentDef === 'object' &&\n\t\t\tthis.descriptor.hasTwoValues &&\n\t\t\tthis.captured &&\n\t\t\tthis.isAwaitingLastSegment\n\t\t) {\n\t\t\tconst [before, after] = segmentDef\n\t\t\tconst value = before + this.captured + after\n\t\t\treturn getSegmentIndex(baseIndex, value)\n\t\t}\n\n\t\treturn baseIndex\n\t}\n\n\t/**\n\t * Update state with new segment by setting gap positions\n\t */\n\tprocessNext(segment: SegmentMatch): void {\n\t\tconst start = this.end\n\t\tconst end = segment.start\n\t\tconst gapType = this.descriptor.gapTypes[this.expectedSegmentIndex - 1]\n\n\t\t// VALIDATION: Next segment must start after previous segment ends\n\t\t// If not, this match is permanently invalid\n\t\tif (end < start) {\n\t\t\tthis.expectedSegmentIndex = -1\n\t\t\treturn\n\t\t}\n\n\t\tthis.gaps[gapType] = {start, end}\n\n\t\tthis.end = segment.end\n\t\tthis.expectedSegmentIndex++\n\n\t\t// Auto-complete if all segments are processed\n\t\tif (this.expectedSegmentIndex >= this.descriptor.segments.length) {\n\t\t\tthis.expectedSegmentIndex = NaN\n\t\t}\n\t}\n\n\t/**\n\t * Checks if this match conflicts with another match (overlaps and cannot nest properly)\n\t */\n\tconflictsWith(previousMatch?: Match | null): boolean {\n\t\t// No conflict if there's no previous match to conflict with\n\t\tif (!previousMatch) return false\n\n\t\t// No conflict if there's no overlap\n\t\tif (this.start >= previousMatch.end) return false\n\n\t\t// If there's overlap, check if it's valid nesting\n\t\tif (!previousMatch.descriptor.hasSlot) return true\n\t\tif (previousMatch.gaps.slot === undefined) return true\n\n\t\t// Valid nesting: this match is completely inside the slot section\n\t\treturn !(this.start >= previousMatch.gaps.slot.start && this.end <= previousMatch.gaps.slot.end)\n\t}\n}","/**\n * PatternMatcher - State Machine for Markup Pattern Recognition\n *\n * Implements a high-performance state machine that processes segments to identify\n * and match markup patterns. Manages Match objects representing parsing states\n * for different markup descriptors, handling gap positions and completion logic.\n *\n * Key features:\n * - State machine approach for pattern matching\n * - Position-based indexing for efficient lookups\n * - Processing order-based conflict resolution for overlapping matches\n * - Gap position management for nested content extraction\n */\n\nimport {getSegmentIndex} from '../utils/getSegmentIndex'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport type {MarkupRegistry} from './MarkupRegistry'\nimport {Match} from './Match'\nimport type {SegmentMatch} from './SegmentMatcher'\n\nfunction getOrCreate<K, V>(map: Map<K, V[]>, key: K): V[] {\n\tlet arr = map.get(key)\n\tif (!arr) {\n\t\tarr = []\n\t\tmap.set(key, arr)\n\t}\n\treturn arr\n}\n\n/**\n * Optimized parser using state machine approach\n */\nexport class PatternMatcher {\n\tprivate readonly pendingStates: Map<number, Match[]> = new Map()\n\tprivate readonly completingStates: Map<number, Match[]> = new Map()\n\tprivate readonly completedStates: Array<{position: number; match: Match}> = []\n\n\tconstructor(private readonly registry: MarkupRegistry) {}\n\n\t/** Main method that converts found segments into structured matches */\n\tprocess(segments: SegmentMatch[]): Match[] {\n\t\tthis.pendingStates.clear()\n\t\tthis.completingStates.clear()\n\t\tthis.completedStates.length = 0\n\n\t\tfor (const segment of segments) {\n\t\t\tthis.processWaitingStates(segment)\n\t\t\tthis.tryStartNewStates(segment)\n\t\t}\n\n\t\t//TODO need review it\n\t\tthis.resolveSlotLeadingMatches()\n\n\t\treturn this.completedStates.map(entry => entry.match)\n\t}\n\n\t/**\n\t * Process states waiting for this segment\n\t * Try states by priority until one is valid, keeping rejected states for later attempts\n\t * Process completing states first (higher priority), then pending states\n\t * Process only one state per call\n\t */\n\tprivate processWaitingStates(segment: SegmentMatch): void {\n\t\tconst match = this.dequeueWaitingMatch(segment)\n\t\tif (!match) return\n\n\t\tmatch.processNext(segment)\n\n\t\tif (match.isInvalid) return\n\n\t\tif (match.isCompleted) return this.addToCompleted(match)\n\n\t\tthis.addToWaiting(match)\n\t}\n\n\tprivate tryStartNewStates(segment: SegmentMatch): void {\n\t\tthis.registry.firstSegmentIndexMap.get(segment.index)?.forEach((descriptor: MarkupDescriptor) => {\n\t\t\tconst match = new Match(descriptor, segment)\n\n\t\t\tif (match.isInvalid) return\n\n\t\t\tif (match.isCompleted) return this.addToCompleted(match)\n\n\t\t\tthis.addToWaiting(match)\n\t\t})\n\t}\n\n\t/**\n\t * Gets the next waiting match for the given segment\n\t * Uses value-specific index for dynamic segments, base index for static segments\n\t */\n\tprivate dequeueWaitingMatch(segment: SegmentMatch): Match | undefined {\n\t\tconst index = segment.captured ? getSegmentIndex(segment.index, segment.value) : segment.index\n\n\t\tconst completingArray = this.completingStates.get(index)\n\t\tif (completingArray?.length) return completingArray.pop()\n\n\t\tconst pendingArray = this.pendingStates.get(index)\n\t\tif (pendingArray?.length) return pendingArray.pop()\n\t}\n\n\t/**\n\t * Adds a state to the waiting list for the next expected segment\n\t */\n\tprivate addToWaiting(match: Match): void {\n\t\tconst segmentIndex = match.nextSegment\n\t\tif (segmentIndex === undefined) return\n\t\tconst map = match.isAwaitingLastSegment ? this.completingStates : this.pendingStates\n\t\tgetOrCreate(map, segmentIndex).push(match)\n\t}\n\n\t/**\n\t * Resolves slot-leading single-segment matches by extending their start backwards.\n\t *\n\t * For patterns like `__slot__\\n\\n`, the segment `\\n\\n` is a suffix delimiter and\n\t * the slot content precedes it. After normal processing, such matches only cover\n\t * the delimiter. This pass extends each slot-leading match backwards to the end\n\t * of the previous slot-leading match (or input start), so that non-slot-leading\n\t * matches between them become nested children rather than siblings.\n\t */\n\tprivate resolveSlotLeadingMatches(): void {\n\t\tlet hasSlotLeading = false\n\t\tfor (const entry of this.completedStates) {\n\t\t\tif (this.isSlotLeading(entry.match)) {\n\t\t\t\thasSlotLeading = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!hasSlotLeading) return\n\n\t\t// Only slot-leading match boundaries matter — other matches become nested children\n\t\tlet boundary = 0\n\t\tfor (const entry of this.completedStates) {\n\t\t\tconst {match} = entry\n\t\t\tif (this.isSlotLeading(match)) {\n\t\t\t\tconst segmentStart = match.start\n\t\t\t\tmatch.start = boundary\n\t\t\t\tentry.position = boundary\n\t\t\t\tmatch.gaps.slot = {start: boundary, end: segmentStart}\n\t\t\t\tboundary = match.end\n\t\t\t}\n\t\t}\n\n\t\tthis.completedStates.sort((a, b) => a.position - b.position)\n\t}\n\n\tprivate isSlotLeading(match: Match): boolean {\n\t\treturn match.descriptor.segments.length === 1 && match.descriptor.hasSlot\n\t}\n\n\t/**\n\t * Add match to position-indexed array, replacing any existing match at the same position\n\t * Uses binary search to find insertion point and maintains sorted order\n\t * Relies on processing order to determine which match to keep\n\t */\n\tprivate addToCompleted(match: Match): void {\n\t\tconst position = match.start\n\n\t\t// Binary search to find the insertion point or existing position\n\t\tlet left = 0\n\t\tlet right = this.completedStates.length\n\n\t\twhile (left < right) {\n\t\t\tconst mid = Math.floor((left + right) / 2)\n\t\t\tif (this.completedStates[mid].position < position) {\n\t\t\t\tleft = mid + 1\n\t\t\t} else {\n\t\t\t\tright = mid\n\t\t\t}\n\t\t}\n\n\t\t// Check if we found an existing entry at this position\n\t\tif (left < this.completedStates.length && this.completedStates[left].position === position) {\n\t\t\t// Position exists - replace with the new match\n\t\t\tthis.completedStates[left].match = match\n\t\t} else {\n\t\t\t// New position - insert new entry at the correct position\n\t\t\tthis.completedStates.splice(left, 0, {position, match})\n\t\t}\n\t}\n}","// escape RegExp special characters to match RegExp.escape behavior\n// Escapes all characters that have special meaning in regular expressions\nexport const escape = (str: string): string => {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\\\\\]/g, '\\\\$&')\n}","import {escape} from '../../../../shared/escape'\n\n/**\n * Result of a segment match in the text\n */\nexport interface SegmentMatch {\n\t/** Index in the patterns array */\n\tindex: number\n\t/** Start position in text */\n\tstart: number\n\t/** End position in text (exclusive) */\n\tend: number\n\t/** Matched text */\n\tvalue: string\n\t/** Captured content from dynamic pattern (if any) */\n\tcaptured?: string\n}\n\n/**\n * Segment definition - can be a static string or a dynamic pattern\n * For dynamic patterns: [before, after, exclusions]\n */\nexport type SegmentDefinition = string | readonly [before: string, after: string, exclusions: string]\n\n/**\n * Internal representation of a segment with its regex pattern\n */\ninterface SegmentEntry {\n\t/** Original index in the segments array */\n\tindex: number\n\t/** Regex pattern for this segment (escaped static or dynamic pattern) */\n\tpattern: string\n\t/** Original definition for reference */\n\tdefinition: SegmentDefinition\n}\n\n/**\n * Computes regex pattern for dynamic segment using pre-computed exclusions\n */\nfunction computeDynamicPattern(before: string, after: string, exclusions: string): string {\n\tconst escapedBefore = escape(before)\n\tconst escapedAfter = escape(after)\n\tconst escapedDelimiters = escape(after + exclusions)\n\n\t// Non-greedy quantifier to stop at first occurrence of after\n\treturn `${escapedBefore}([^${escapedDelimiters}]+?)${escapedAfter}`\n}\n\ninterface StaticMatcher {\n\tregex: RegExp\n\ttoIndex: Map<string, number>\n}\n\ninterface DynamicMatcher {\n\tregex: RegExp\n\tentries: SegmentEntry[]\n\tindices: Set<number>\n}\n\n/**\n * Segment matcher using dual strategy for optimal performance\n */\nexport class SegmentMatcher {\n\tprivate static?: StaticMatcher\n\tprivate dynamic?: DynamicMatcher\n\n\tconstructor(segments: SegmentDefinition[]) {\n\t\tthis.initializeDual(segments)\n\t}\n\n\tprivate initializeDual(segments: SegmentDefinition[]) {\n\t\tconst statics: string[] = []\n\t\tconst dynamics: Array<{segment: SegmentDefinition; index: number}> = []\n\t\tconst staticToIndex = new Map<string, number>()\n\n\t\t// Separate segments and build static index map\n\t\tsegments.forEach((segment, index) => {\n\t\t\tif (typeof segment === 'string') {\n\t\t\t\tstatics.push(segment)\n\t\t\t\tstaticToIndex.set(segment, index)\n\t\t\t} else {\n\t\t\t\tdynamics.push({segment, index})\n\t\t\t}\n\t\t})\n\n\t\t// Create static matcher\n\t\tif (statics.length > 0) {\n\t\t\tconst sorted = [...statics].toSorted((a, b) => b.length - a.length)\n\t\t\tconst escaped = sorted.map(escape)\n\t\t\tthis.static = {\n\t\t\t\tregex: new RegExp(`(?:${escaped.join('|')})`, 'gu'),\n\t\t\t\ttoIndex: staticToIndex,\n\t\t\t}\n\t\t}\n\n\t\t// Create dynamic matcher\n\t\tif (dynamics.length > 0) {\n\t\t\tconst indices = new Set<number>()\n\t\t\tconst entries: SegmentEntry[] = []\n\n\t\t\tdynamics.forEach(({segment, index}) => {\n\t\t\t\tif (typeof segment === 'string') return\n\t\t\t\tconst [before, after, exclusions] = segment\n\t\t\t\tindices.add(index)\n\t\t\t\tconst pattern = computeDynamicPattern(before, after, exclusions)\n\t\t\t\tconst namedPattern = pattern.replace('(', `(?<content${index}>`)\n\t\t\t\tentries.push({index, pattern: namedPattern, definition: segment})\n\t\t\t})\n\n\t\t\t// Sort by pattern length (longest first) for optimal matching\n\t\t\tentries.sort((a, b) => {\n\t\t\t\tconst aLen = typeof a.definition === 'string' ? a.definition.length : a.pattern.length\n\t\t\t\tconst bLen = typeof b.definition === 'string' ? b.definition.length : b.pattern.length\n\t\t\t\treturn bLen - aLen\n\t\t\t})\n\n\t\t\tthis.dynamic = {\n\t\t\t\tentries,\n\t\t\t\tindices,\n\t\t\t\tregex: new RegExp(entries.map((e, i) => `(?<seg${i}>${e.pattern})`).join('|'), 'gu'),\n\t\t\t}\n\t\t}\n\t}\n\n\tsearch(text: string): SegmentMatch[] {\n\t\tconst results: SegmentMatch[] = []\n\t\tconst dynamicResults: SegmentMatch[] = []\n\n\t\t// Static segments\n\t\tif (this.static) {\n\t\t\tconst {regex, toIndex} = this.static\n\t\t\tfor (const match of text.matchAll(regex)) {\n\t\t\t\tconst index = toIndex.get(match[0])\n\t\t\t\tif (index !== undefined) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tstart: match.index,\n\t\t\t\t\t\tend: match.index + match[0].length,\n\t\t\t\t\t\tvalue: match[0],\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Dynamic segments\n\t\tif (this.dynamic) {\n\t\t\tconst {regex, entries, indices} = this.dynamic\n\t\t\tfor (const match of text.matchAll(regex)) {\n\t\t\t\tconst matchedText = match[0]\n\t\t\t\tconst start = match.index\n\n\t\t\t\tlet matchedIndex: number | undefined\n\t\t\t\tlet captured: string | undefined\n\n\t\t\t\tif (match.groups) {\n\t\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\t\tconst groupValue = match.groups[`seg${i}`]\n\t\t\t\t\t\t// oxlint-disable-next-line no-unnecessary-condition\n\t\t\t\t\t\tif (groupValue !== undefined) {\n\t\t\t\t\t\t\tmatchedIndex = entries[i].index\n\t\t\t\t\t\t\tif (indices.has(matchedIndex)) {\n\t\t\t\t\t\t\t\tcaptured = match.groups[`content${matchedIndex}`]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matchedIndex !== undefined) {\n\t\t\t\t\tdynamicResults.push({\n\t\t\t\t\t\tindex: matchedIndex,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend: start + matchedText.length,\n\t\t\t\t\t\tvalue: matchedText,\n\t\t\t\t\t\tcaptured,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Filter overlapping static matches and merge\n\t\tconst finalResults = [...dynamicResults]\n\t\tfor (const staticMatch of results) {\n\t\t\tconst overlaps = dynamicResults.some(\n\t\t\t\tdynamic => staticMatch.start < dynamic.end && staticMatch.end > dynamic.start\n\t\t\t)\n\t\t\tif (!overlaps) {\n\t\t\t\tfinalResults.push(staticMatch)\n\t\t\t}\n\t\t}\n\n\t\tfinalResults.sort((a, b) => a.start - b.start)\n\t\treturn finalResults\n\t}\n}","import type {TextToken} from '../types'\n\n/**\n * Creates a text token for a range in the input\n *\n * @param input - Original input text\n * @param start - Start position (inclusive)\n * @param end - End position (exclusive)\n * @returns TextToken with extracted content and position\n */\nexport const createTextToken = (input: string, start = 0, end = input.length): TextToken => {\n\treturn {\n\t\ttype: 'text',\n\t\tcontent: input.substring(start, end),\n\t\tposition: {start, end},\n\t}\n}","import type {MarkToken, ParseOptions, PositionRange, TextToken, Token} from '../types'\nimport {createTextToken} from '../utils/createTextToken'\nimport type {Match} from './Match'\n\n/**\n * Parent context for tracking active nesting during tree building\n */\ninterface ParentContext {\n\tmatch: Match\n\ttoken: MarkToken\n\ttextPos: number // Current position for adding text tokens\n}\n\n/**\n * TreeBuilder - Optimized single-pass tree building algorithm\n *\n * Algorithm: Single-pass approach with direct token creation\n * - Processes matches in order, maintaining a stack of active parents\n * - Creates tokens directly without intermediate data structures\n * - Handles text gaps and nesting in a single traversal\n *\n * Key optimizations:\n * - Single pass through matches (no separate relationship building phase)\n * - Direct token creation eliminates intermediate allocations\n * - Stack-based parent tracking with O(D) memory where D is nesting depth\n * - No need for parent indices array or children lists\n * - Simpler algorithm that's easier to understand and maintain\n *\n * Complexity: O(M) where M is number of matches\n * Memory: O(D) for active parents stack where D is nesting depth (typically 3-5)\n */\nexport class TreeBuilder {\n\t// Instance fields - only what's needed for single pass\n\tprivate input!: string\n\tprivate readonly options: ParseOptions\n\n\tconstructor(options?: ParseOptions) {\n\t\tthis.options = options ?? {}\n\t}\n\n\t// ===== PUBLIC API =====\n\n\t/**\n\t * Builds nested token tree from pre-processed matches in a single pass\n\t *\n\t * Algorithm:\n\t * 1. Iterate through matches in order\n\t * 2. For each match:\n\t * - Close any parents whose content ends before this match\n\t * - Skip matches that conflict with the last accepted match\n\t * - Add text token before this match\n\t * - Create mark token and push to appropriate parent\n\t * - If match has nested content, push to active parents stack\n\t * 3. After all matches, close remaining parents and add final text\n\t *\n\t * Complexity: O(M) where M is number of matches\n\t * Memory: O(D) for active parents stack where D is nesting depth\n\t */\n\tpublic build(matches: Match[], input: string): Token[] {\n\t\tthis.input = input\n\n\t\tif (matches.length === 0) {\n\t\t\treturn this.filterTokens([this.createTextToken(0, input.length)])\n\t\t}\n\n\t\tconst tokens = this.buildSinglePass(matches)\n\t\treturn this.filterTokens(tokens)\n\t}\n\n\t// ===== SINGLE-PASS ALGORITHM =====\n\n\t/**\n\t * Builds token tree in a single pass through matches\n\t *\n\t * This is the core algorithm that processes matches sequentially,\n\t * maintaining a stack of active parents and creating tokens directly.\n\t */\n\tprivate buildSinglePass(matches: Match[]): Token[] {\n\t\tconst roots: Token[] = []\n\t\tconst parentStack: ParentContext[] = []\n\t\tlet lastAcceptedMatch: Match | null = null\n\t\tlet rootTextPos = 0\n\n\t\tfor (const match of matches) {\n\t\t\t// Skip conflicting matches\n\t\t\tif (lastAcceptedMatch && match.conflictsWith(lastAcceptedMatch)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlastAcceptedMatch = match\n\n\t\t\t// Close parents whose content ends before this match\n\t\t\twhile (parentStack.length > 0) {\n\t\t\t\tconst parent = parentStack[parentStack.length - 1]\n\t\t\t\tconst parentBounds = this.getContentBounds(parent.match)\n\n\t\t\t\tif (parentBounds.end <= match.start) {\n\t\t\t\t\t// Parent is complete - finalize it\n\t\t\t\t\tthis.finalizeParent(parent, parentBounds.end)\n\t\t\t\t\tparentStack.pop()\n\n\t\t\t\t\t// Add to appropriate container\n\t\t\t\t\tif (parentStack.length > 0) {\n\t\t\t\t\t\tparentStack[parentStack.length - 1].token.children.push(parent.token)\n\t\t\t\t\t} else {\n\t\t\t\t\t\troots.push(parent.token)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Determine where to add this match\n\t\t\tconst container = parentStack.length > 0 ? parentStack[parentStack.length - 1] : null\n\n\t\t\tif (container) {\n\t\t\t\t// Add text before this match within parent\n\t\t\t\tconst textToken = this.createTextToken(container.textPos, match.start)\n\t\t\t\tcontainer.token.children.push(textToken)\n\t\t\t\tcontainer.textPos = match.end\n\t\t\t} else {\n\t\t\t\t// Add text before this match at root level\n\t\t\t\tconst textToken = this.createTextToken(rootTextPos, match.start)\n\t\t\t\troots.push(textToken)\n\t\t\t\trootTextPos = match.end\n\t\t\t}\n\n\t\t\t// Create mark token for this match\n\t\t\tconst markToken = this.createMarkToken(match)\n\n\t\t\t// If match has children content, push to stack for processing children\n\t\t\tif (this.hasSlotContent(match)) {\n\t\t\t\tconst bounds = this.getContentBounds(match)\n\t\t\t\tparentStack.push({\n\t\t\t\t\tmatch,\n\t\t\t\t\ttoken: markToken,\n\t\t\t\t\ttextPos: bounds.start,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// No nested content - add directly to container\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.token.children.push(markToken)\n\t\t\t\t} else {\n\t\t\t\t\troots.push(markToken)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Close remaining parents\n\t\twhile (parentStack.length > 0) {\n\t\t\tconst parent = parentStack[parentStack.length - 1]\n\t\t\tparentStack.pop()\n\t\t\tconst parentBounds = this.getContentBounds(parent.match)\n\t\t\tthis.finalizeParent(parent, parentBounds.end)\n\n\t\t\tif (parentStack.length > 0) {\n\t\t\t\tparentStack[parentStack.length - 1].token.children.push(parent.token)\n\t\t\t} else {\n\t\t\t\troots.push(parent.token)\n\t\t\t}\n\t\t}\n\n\t\t// Add final text token at root level\n\t\troots.push(this.createTextToken(rootTextPos, this.input.length))\n\n\t\treturn roots\n\t}\n\n\t/**\n\t * Finalizes a parent token by adding final text token if needed\n\t */\n\tprivate finalizeParent(parent: ParentContext, endPos: number): void {\n\t\tparent.token.children.push(this.createTextToken(parent.textPos, endPos))\n\t}\n\n\t/**\n\t * Creates a mark token from a match (without children - those are added later)\n\t */\n\tprivate createMarkToken(match: Match): MarkToken {\n\t\t// Extract content using helper functions\n\t\tconst value = this.extractSubstring(match.gaps.value?.start, match.gaps.value?.end)\n\t\tconst slotStr = this.extractSubstring(match.gaps.slot?.start, match.gaps.slot?.end)\n\t\tconst metaStr = this.extractSubstring(match.gaps.meta?.start, match.gaps.meta?.end)\n\n\t\t// Convert empty strings to undefined for slot, but meta can be empty string\n\t\tconst slotContent = slotStr || undefined\n\t\tconst meta = match.gaps.meta !== undefined ? metaStr : undefined\n\n\t\treturn {\n\t\t\ttype: 'mark',\n\t\t\tcontent: this.input.substring(match.start, match.end),\n\t\t\tchildren: [], // Will be populated if match has slot content\n\t\t\tdescriptor: match.descriptor,\n\t\t\tvalue,\n\t\t\tmeta,\n\t\t\tposition: {start: match.start, end: match.end},\n\t\t\tslot: this.createSlotSourceInfo(match, slotContent),\n\t\t}\n\t}\n\n\t// ===== UTILITY METHODS =====\n\n\t/**\n\t * Gets the content boundaries for a match\n\t * Priority: nested content if present, otherwise value content\n\t */\n\tprivate getContentBounds(match: Match): PositionRange {\n\t\tif (match.gaps.slot) {\n\t\t\treturn match.gaps.slot\n\t\t}\n\t\tif (match.gaps.value) {\n\t\t\treturn match.gaps.value\n\t\t}\n\t\treturn {\n\t\t\tstart: match.start,\n\t\t\tend: match.start,\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a match has children content capability\n\t */\n\tprivate hasSlotContent(match: Match): boolean {\n\t\treturn match.gaps.slot !== undefined\n\t}\n\n\t/**\n\t * Extracts substring safely, returns empty string if positions are undefined\n\t */\n\tprivate extractSubstring(start: number | undefined, end: number | undefined): string {\n\t\treturn start !== undefined && end !== undefined ? this.input.substring(start, end) : ''\n\t}\n\n\t/**\n\t * Creates a text token for a range in the input\n\t */\n\tprivate createTextToken(start: number, end: number): TextToken {\n\t\treturn createTextToken(this.input, start, end)\n\t}\n\n\t/**\n\t * Creates children source info object if children content exists\n\t */\n\tprivate createSlotSourceInfo(match: Match, slotContent: string | undefined): MarkToken['slot'] {\n\t\tif (!slotContent || match.gaps.slot === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\tcontent: slotContent,\n\t\t\tstart: match.gaps.slot.start,\n\t\t\tend: match.gaps.slot.end,\n\t\t}\n\t}\n\n\t// ===== TOKEN FILTERING. TODO: Is a hack =====\n\n\tprivate filterTokens(tokens: Token[]): Token[] {\n\t\tconst {marksOnly, skipEmptyText} = this.options\n\t\tif (!marksOnly && !skipEmptyText) return tokens\n\n\t\treturn tokens.filter(token => {\n\t\t\tif (token.type !== 'text') return true\n\t\t\tif (marksOnly) return false\n\t\t\tif (skipEmptyText && token.position.start === token.position.end) return false\n\t\t\treturn true\n\t\t})\n\t}\n}","import type {MarkToken, Token} from '../types'\n\n/**\n * Internal function to process tokens with a callback\n * @param tokens - Tokens to process\n * @param callback - Function to transform each MarkToken\n * @returns Transformed text\n */\nexport function processTokensWithCallback(tokens: Token[], callback: (mark: MarkToken) => string): string {\n\tlet result = ''\n\tfor (const token of tokens) {\n\t\tif (token.type === 'text') {\n\t\t\tresult += token.content\n\t\t} else {\n\t\t\t// For MarkToken with children, we need to decide:\n\t\t\t// - If we want to transform the mark itself AND its children\n\t\t\t// - Or transform children and include them in the mark's transformation\n\n\t\t\tif (token.children.length > 0) {\n\t\t\t\t// Recursively process children to get their transformed content\n\t\t\t\tconst processedChildren = processTokensWithCallback(token.children, callback)\n\n\t\t\t\t// Create a modified token with processed children as the value\n\t\t\t\t// This allows the callback to use the already-processed nested content\n\t\t\t\tconst modifiedToken: MarkToken = {\n\t\t\t\t\t...token,\n\t\t\t\t\tvalue: processedChildren,\n\t\t\t\t}\n\t\t\t\tresult += callback(modifiedToken)\n\t\t\t} else {\n\t\t\t\tresult += callback(token)\n\t\t\t}\n\t\t}\n\t}\n\treturn result\n}","import {PLACEHOLDER} from '../constants'\nimport type {Markup} from '../types'\n\n/**\n * Make annotation from the markup for ParserV2\n *\n * @param markup - Markup pattern with __value__, __meta__, and/or __slot__ placeholders\n * @param params - Object with optional value, meta, and slot strings\n * @returns Annotated string with placeholders replaced\n *\n * @example\n * ```typescript\n * annotate('@[__value__]', { value: 'Hello' }) // '@[Hello]'\n * annotate('@[__value__](__meta__)', { value: 'Hello', meta: 'world' }) // '@[Hello](world)'\n * annotate('@[__slot__]', { slot: 'content' }) // '@[content]'\n * ```\n */\nexport function annotate(\n\tmarkup: Markup,\n\tparams: {\n\t\tvalue?: string\n\t\tmeta?: string\n\t\tslot?: string\n\t}\n): string {\n\treturn (markup as string)\n\t\t.replaceAll(PLACEHOLDER.Value, params.value ?? '')\n\t\t.replaceAll(PLACEHOLDER.Meta, params.meta ?? '')\n\t\t.replaceAll(PLACEHOLDER.Slot, params.slot ?? '')\n}","import type {Token} from '../types'\nimport {annotate} from './annotate'\n\n/**\n * Convert parsed tokens back to annotated string (inverse of `parse`).\n *\n * This function is useful for reconstructing annotated text from tokens,\n * similar to toString in text-manipulation/utils but for ParserV2\n *\n * @param tokens - Array of parsed tokens (from ParserV2.parse)\n * @returns Reconstructed annotated string\n *\n * @example\n * ```typescript\n * const markups = ['@[__value__](__meta__)', '#[__slot__]']\n * const tokens = new ParserV2(markups).parse('@[Hello](world) #[test]')\n * const result = toString(tokens)\n * // Returns: '@[Hello](world) #[test]'\n * ```\n */\nexport function toString(tokens: Token[]): string {\n\tlet result = ''\n\n\tfor (const token of tokens) {\n\t\tif (token.type === 'text') {\n\t\t\tresult += token.content\n\t\t\tcontinue\n\t\t}\n\n\t\tconst {markup, hasSlot} = token.descriptor\n\t\tconst slot = hasSlot ? (token.children.length > 0 ? toString(token.children) : token.slot?.content) : undefined\n\n\t\tresult += annotate(markup, {\n\t\t\tvalue: token.value,\n\t\t\tmeta: token.meta,\n\t\t\tslot,\n\t\t})\n\t}\n\n\treturn result\n}","import {MarkupRegistry} from './core/MarkupRegistry'\nimport {PatternMatcher} from './core/PatternMatcher'\nimport {SegmentMatcher} from './core/SegmentMatcher'\nimport {TreeBuilder} from './core/TreeBuilder'\nimport type {MarkToken, Markup, ParseOptions, Token} from './types'\nimport {createTextToken} from './utils/createTextToken'\nimport {processTokensWithCallback} from './utils/processTokens'\nimport {toString as tokensToString} from './utils/toString'\n\n/**\n * Parser - High-performance tree-based markup parser\n *\n * Parses text with markup patterns into a nested token tree structure.\n * Supports complex patterns with metadata, nesting, and HTML-like constructs.\n *\n * @example\n * ```typescript\n * const parser = new Parser(['@[__value__](__meta__)', '#[__slot__]'])\n * const tokens = parser.parse('Hello @[world](test) and #[tag]')\n * const text = parser.stringify(tokens)\n * ```\n */\nexport class Parser {\n\tprivate readonly registry: MarkupRegistry\n\tprivate readonly segmentMatcher: SegmentMatcher\n\tprivate readonly patternMatcher: PatternMatcher\n\tprivate readonly treeBuilder: TreeBuilder\n\tprivate readonly parseOptions: ParseOptions\n\n\t/**\n\t * Creates a new Parser instance with the specified markup patterns\n\t *\n\t * @param markups - Array of markup pattern strings with placeholders (can include undefined values):\n\t * - `__value__` - main content (plain text, no nesting)\n\t * - `__meta__` - metadata (plain text, no nesting)\n\t * - `__slot__` - content supporting nested structures\n\t * - `undefined` - skipped, but original array indices are preserved for descriptor matching\n\t * @param options - Optional parse options to control token output:\n\t * - `marksOnly` - return only MarkTokens, drop all TextTokens\n\t * - `skipEmptyText` - drop zero-length TextTokens (where start === end)\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser([\n\t * '@[__value__](__meta__)', // @[label](value) - descriptor.index = 0\n\t * undefined, // skipped\n\t * '#[__slot__]', // #[nested content] - descriptor.index = 2\n\t * '**__slot__**' // **bold text** - descriptor.index = 3\n\t * ])\n\t * ```\n\t */\n\tconstructor(markups: (Markup | undefined)[], options?: ParseOptions) {\n\t\tthis.registry = new MarkupRegistry(markups)\n\t\tthis.segmentMatcher = new SegmentMatcher(this.registry.segments)\n\t\tthis.patternMatcher = new PatternMatcher(this.registry)\n\t\tthis.parseOptions = options ?? {}\n\t\tthis.treeBuilder = new TreeBuilder(this.parseOptions)\n\t}\n\n\t/**\n\t * Parses text into tokens (static convenience method)\n\t *\n\t * @param value - Text to parse\n\t * @param options - Options with markup patterns and token filtering\n\t * @returns Array of tokens (TextToken and MarkToken)\n\t *\n\t * @example\n\t * ```typescript\n\t * const tokens = Parser.parse('Hello @[world]', {\n\t * markup: ['@[__value__]']\n\t * })\n\t * ```\n\t */\n\tstatic parse(value: string, options?: {markup: Markup[]} & ParseOptions): Token[] {\n\t\tconst markups = options?.markup\n\t\tif (!markups || markups.length === 0) {\n\t\t\treturn [createTextToken(value)]\n\t\t}\n\t\tconst {markup: _, ...parseOptions} = options\n\t\treturn new Parser(markups, parseOptions).parse(value)\n\t}\n\n\t/**\n\t * Converts tokens back to text (static convenience method)\n\t *\n\t * @param tokens - Array of tokens to convert\n\t * @returns Reconstructed text string\n\t *\n\t * @example\n\t * ```typescript\n\t * const text = Parser.stringify(tokens)\n\t * ```\n\t */\n\tstatic stringify(tokens: Token[]): string {\n\t\treturn tokensToString(tokens)\n\t}\n\n\t/**\n\t * Parses text into a nested token tree\n\t *\n\t * This is the main parsing method. It processes the input text through\n\t * three stages:\n\t * 1. Segment matching - finds all markup segments (O(N + M))\n\t * 2. Pattern matching - builds complete patterns from segments (O(M))\n\t * 3. Tree building - constructs nested token tree (O(M·D))\n\t *\n\t * @param value - Text to parse\n\t * @returns Array of tokens representing the parsed structure\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['@[__value__](__meta__)'])\n\t * const tokens = parser.parse('Hello @[world](test)')\n\t * // Returns: [\n\t * // TextToken('Hello '),\n\t * // MarkToken('@[world](test)', value='world', meta='test'),\n\t * // TextToken('')\n\t * // ]\n\t * ```\n\t */\n\tparse(value: string): Token[] {\n\t\tconst segments = this.segmentMatcher.search(value)\n\t\tconst matches = this.patternMatcher.process(segments)\n\t\treturn this.treeBuilder.build(matches, value)\n\t}\n\n\t/**\n\t * Converts tokens back to the original text\n\t *\n\t * This is the inverse operation of parse(). It reconstructs the original\n\t * text from a token tree, preserving all markup and structure.\n\t *\n\t * @param tokens - Array of tokens to convert\n\t * @returns Reconstructed text string\n\t *\n\t * @example\n\t * ```typescript\n\t * const text = 'Hello @[world](test)'\n\t * const tokens = parser.parse(text)\n\t * const reconstructed = parser.stringify(tokens)\n\t * console.log(reconstructed === text) // true\n\t * ```\n\t */\n\tstringify(tokens: Token[]): string {\n\t\treturn tokensToString(tokens)\n\t}\n\n\t/**\n\t * Transforms annotated text by processing all mark tokens with a callback\n\t *\n\t * This method parses the text, recursively processes all MarkTokens\n\t * (including nested ones) with the provided callback, and returns\n\t * the transformed text.\n\t *\n\t * @param value - Annotated text to process\n\t * @param callback - Function to transform each MarkToken\n\t * @returns Transformed text\n\t *\n\t * @example\n\t * ```typescript\n\t * // Extract all values\n\t * const text = '@[Hello](world) and #[tag]'\n\t * const result = parser.transform(text, mark => mark.value)\n\t * // Returns: 'Hello and tag'\n\t *\n\t * // Custom transformation\n\t * const result = parser.transform(text, mark =>\n\t * mark.meta ? `${mark.value}:${mark.meta}` : mark.value\n\t * )\n\t * // Returns: 'Hello:world and tag'\n\t * ```\n\t */\n\ttransform(value: string, callback: (mark: MarkToken) => string): string {\n\t\tconst tokens = this.parse(value)\n\t\treturn processTokensWithCallback(tokens, callback)\n\t}\n\n\t/**\n\t * Escapes markup segments in the given text using backslash\n\t *\n\t * This method uses the registry's unique segments and escapes them by adding\n\t * a backslash before each character of each segment, preventing them from being\n\t * parsed as markup when the text is processed again.\n\t *\n\t * @param text - Text to escape segments in\n\t * @returns Text with escaped segments\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['**__slot__**', '@[__value__]'])\n\t * const escaped = parser.escape('Hello **world** and @[user]')\n\t * // Returns: 'Hello \\*\\*world\\*\\* and \\@[user]'\n\t * ```\n\t */\n\tescape(text: string): string {\n\t\treturn this.registry.segments\n\t\t\t.filter((segment): segment is string => typeof segment === 'string')\n\t\t\t.toSorted((a, b) => b.length - a.length)\n\t\t\t.reduce((result, segment) => result.replaceAll(segment, segment.replace(/(.)/g, '\\\\$1')), text)\n\t}\n\n\t/**\n\t * Unescapes markup patterns in the given text\n\t *\n\t * This method removes escape characters from segments that were previously\n\t * escaped using escape(), allowing the patterns to be parsed normally.\n\t *\n\t * @param text - Text to unescape patterns in\n\t * @returns Text with unescaped patterns\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['**__slot__**', '@[__value__]'])\n\t * const unescaped = parser.unescape('Hello \\*\\*world\\*\\* and \\@[user]')\n\t * // Returns: 'Hello **world** and @[user]'\n\t * ```\n\t */\n\tunescape(text: string): string {\n\t\treturn text.replaceAll(/\\\\(.)/g, '$1')\n\t}\n}","import {Parser} from '../Parser'\nimport type {MarkToken, Markup} from '../types'\nimport {processTokensWithCallback} from './processTokens'\n\n/**\n * Transform annotated text to another text by recursively processing all tokens\n *\n * @param value - Annotated text to process\n * @param callback - Function to transform each MarkToken\n * @param markups - Array of markup patterns to parse\n * @returns Transformed text\n *\n * @example\n * ```typescript\n * const text = '@[Hello](world) and #[nested @[content]]'\n * const result = denote(text, mark => mark.value, ['@[__value__](__meta__)', '#[__slot__]'])\n * // Returns: 'Hello and nested content'\n * ```\n */\nexport function denote(value: string, callback: (mark: MarkToken) => string, markups: Markup[]): string {\n\tif (!markups.length) return value\n\n\tconst tokens = new Parser(markups).parse(value)\n\n\treturn processTokensWithCallback(tokens, callback)\n}","import type {MarkToken, Token} from '../parser/types'\n\nexport interface TokenContext {\n\tdepth: number\n\tparent?: MarkToken\n}\n\nexport function findToken(tokens: Token[], target: Token, depth = 0, parent?: MarkToken): TokenContext | undefined {\n\tfor (const token of tokens) {\n\t\tif (token === target) return {depth, parent}\n\t\tif (token.type === 'mark') {\n\t\t\tconst result = findToken(token.children, target, depth + 1, token)\n\t\t\tif (result) return result\n\t\t}\n\t}\n}","import type {Store} from '../../../store/Store'\nimport type {Token} from '../parser/types'\n\nexport function computeTokensFromValue(store: Store, value: string): Token[] {\n\treturn parseWithParser(store, value)\n}\n\nexport function parseUnionLabels(store: Store, ...indexes: number[]): Token[] {\n\tlet span = ''\n\tconst tokens = store.parsing.tokens()\n\tfor (const index of indexes) {\n\t\tconst token = tokens[index]\n\t\tspan += token.content\n\t}\n\n\treturn parseWithParser(store, span)\n}\n\nexport function getRangeMap(store: Store): number[] {\n\tlet position = 0\n\tconst tokens = store.parsing.tokens()\n\treturn tokens.map(token => {\n\t\tconst length = token.content.length\n\t\tposition += length\n\t\treturn position - length\n\t})\n}\n\nexport function parseWithParser(store: Store, value: string): Token[] {\n\tconst parser = store.parsing.parser()\n\tif (!parser) {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: 'text' as const,\n\t\t\t\tcontent: value,\n\t\t\t\tposition: {start: 0, end: value.length},\n\t\t\t},\n\t\t]\n\t}\n\n\treturn parser.parse(value)\n}","import type {Result, TokenAddress, TokenPath, TokenShapeSnapshot} from '../../shared/editorContracts'\nimport type {Token} from './parser/types'\n\nexport type TokenIndex = {\n\treadonly generation: number\n\tpathFor(token: Token): TokenPath | undefined\n\taddressFor(path: TokenPath): TokenAddress | undefined\n\tresolve(path: TokenPath): Token | undefined\n\tresolveAddress(address: TokenAddress, expected?: TokenShapeSnapshot): Result<Token, 'stale'>\n\tkey(path: TokenPath): string\n\tequals(a: TokenPath, b: TokenPath): boolean\n}\n\nexport function pathEquals(a: TokenPath, b: TokenPath): boolean {\n\treturn a.length === b.length && a.every((part, index) => part === b[index])\n}\n\nexport function pathKey(path: TokenPath): string {\n\treturn path.join('.')\n}\n\nexport function resolvePath(tokens: readonly Token[], path: TokenPath): Token | undefined {\n\tif (path.length === 0) return undefined\n\tlet current: readonly Token[] = tokens\n\tlet token: Token | undefined\n\tfor (const index of path) {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= current.length) return undefined\n\t\ttoken = current[index]\n\t\tcurrent = token.type === 'mark' ? token.children : []\n\t}\n\treturn token\n}\n\nexport function snapshotTokenShape(token: Token): TokenShapeSnapshot {\n\tif (token.type === 'text') return {kind: 'text'}\n\treturn {kind: 'mark', descriptor: token.descriptor, descriptorIndex: token.descriptor.index}\n}\n\nfunction shapeMatches(token: Token, expected: TokenShapeSnapshot): boolean {\n\tif (expected.kind === 'text') return token.type === 'text'\n\treturn (\n\t\ttoken.type === 'mark' &&\n\t\ttoken.descriptor === expected.descriptor &&\n\t\ttoken.descriptor.index === expected.descriptorIndex\n\t)\n}\n\nexport function createTokenIndex(tokens: readonly Token[], generation: number): TokenIndex {\n\tconst paths = new WeakMap<Token, TokenPath>()\n\n\tconst visit = (items: readonly Token[], parent: TokenPath) => {\n\t\titems.forEach((token, index) => {\n\t\t\tconst path = [...parent, index]\n\t\t\tpaths.set(token, path)\n\t\t\tif (token.type === 'mark') visit(token.children, path)\n\t\t})\n\t}\n\n\tvisit(tokens, [])\n\n\treturn {\n\t\tgeneration,\n\t\tpathFor: token => paths.get(token),\n\t\taddressFor: path => (resolvePath(tokens, path) ? {path: [...path], parseGeneration: generation} : undefined),\n\t\tresolve: path => resolvePath(tokens, path),\n\t\tresolveAddress(address, expected) {\n\t\t\tif (address.parseGeneration !== generation) return {ok: false, reason: 'stale'}\n\t\t\tconst token = resolvePath(tokens, address.path)\n\t\t\tif (!token) return {ok: false, reason: 'stale'}\n\t\t\tif (expected && !shapeMatches(token, expected)) return {ok: false, reason: 'stale'}\n\t\t\treturn {ok: true, value: token}\n\t\t},\n\t\tkey: pathKey,\n\t\tequals: pathEquals,\n\t}\n}","import {signal, computed, event, effectScope, watch, batch} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Feature} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {Parser} from './parser/Parser'\nimport type {Token} from './parser/types'\nimport {toString} from './parser/utils/toString'\nimport {createTokenIndex, type TokenIndex} from './tokenIndex'\nimport {parseWithParser} from './utils/valueParser'\n\nexport class ParsingFeature implements Feature {\n\treadonly tokens = signal<Token[]>([])\n\treadonly #generation = signal(0)\n\treadonly index: Computed<TokenIndex> = computed(() => createTokenIndex(this.tokens(), this.#generation()))\n\n\treadonly parser: Computed<Parser | undefined> = computed(() => {\n\t\tif (!this._store.mark.enabled()) return\n\n\t\tconst markups = this._store.props.options().map(opt => opt.markup)\n\t\tif (!markups.some(Boolean)) return\n\n\t\treturn new Parser(markups, this._store.slots.isBlock() ? {skipEmptyText: true} : undefined)\n\t})\n\n\treadonly reparse = event()\n\n\t#scope?: () => void\n\n\tconstructor(private readonly _store: Store) {}\n\n\tparseValue(value: string): Token[] {\n\t\treturn parseWithParser(this._store, value)\n\t}\n\n\tacceptTokens(tokens: Token[]): void {\n\t\tbatch(\n\t\t\t() => {\n\t\t\t\tthis.tokens(tokens)\n\t\t\t\tthis.#generation(this.#generation() + 1)\n\t\t\t},\n\t\t\t{mutable: true}\n\t\t)\n\t}\n\n\tenable() {\n\t\tif (this.#scope) return\n\t\tthis.sync()\n\t\tthis.#scope = effectScope(() => {\n\t\t\tthis.#subscribeParse()\n\t\t\tthis.#subscribeReactiveParse()\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#scope?.()\n\t\tthis.#scope = undefined\n\t}\n\n\tsync(value = this._store.value.current()) {\n\t\tthis.acceptTokens(this.parseValue(value))\n\t}\n\n\t#subscribeParse() {\n\t\twatch(this.reparse, () => {\n\t\t\tif (this._store.caret.recovery()) {\n\t\t\t\tconst text = toString(this.tokens())\n\t\t\t\tthis.acceptTokens(this.parseValue(text))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.sync()\n\t\t})\n\t}\n\n\t#subscribeReactiveParse() {\n\t\tconst deps = computed(() => this.parser())\n\n\t\twatch(deps, () => {\n\t\t\tif (!this._store.caret.recovery()) {\n\t\t\t\tthis.sync(this._store.value.current())\n\t\t\t}\n\t\t})\n\t}\n}","/** Type guard: checks if a value is an HTMLElement. */\nexport function isHtmlElement(el: unknown): el is HTMLElement {\n\treturn typeof HTMLElement !== 'undefined' && el instanceof HTMLElement\n}\n\n/** Type guard: checks if a value is a Text node. */\nexport function isTextNode(node: unknown): node is Text {\n\treturn node instanceof Text\n}\n\n/** Get the i-th child of an element as HTMLElement, or undefined if out of bounds or wrong type. */\nexport function childAt(parent: Element | null | undefined, index: number): HTMLElement | undefined {\n\tconst child = parent?.children[index]\n\treturn child instanceof HTMLElement ? child : undefined\n}\n\n/** Get all children of an element as HTMLElement[], filtering out non-HTML elements. */\nexport function htmlChildren(parent: Element | null | undefined): HTMLElement[] {\n\tif (!parent) return []\n\treturn Array.from(parent.children).filter((child): child is HTMLElement => child instanceof HTMLElement)\n}\n\n/** Get the first element child as HTMLElement, or null. */\nexport function firstHtmlChild(parent: Element | null | undefined): HTMLElement | null {\n\tconst child = parent?.firstElementChild\n\treturn child instanceof HTMLElement ? child : null\n}\n\n/** Get the last element child as HTMLElement, or null. */\nexport function lastHtmlChild(parent: Element | null | undefined): HTMLElement | null {\n\tconst child = parent?.lastElementChild\n\treturn child instanceof HTMLElement ? child : null\n}\n\n/** Safely narrow an event's target to HTMLElement. */\nexport function htmlTarget(event: {target: EventTarget | null}): HTMLElement | null {\n\tconst {target} = event\n\treturn target instanceof HTMLElement ? target : null\n}\n\n/** Safely narrow an event's target to Node. */\nexport function nodeTarget(event: {target: EventTarget | null}): Node | null {\n\tconst {target} = event\n\treturn target instanceof Node ? target : null\n}\n\n/** Get the next node from a TreeWalker as Text, or null. */\nexport function nextText(walker: TreeWalker): Text | null {\n\tconst node = walker.nextNode()\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- nodeType === 3 guarantees Text; instanceof Text breaks in test envs\n\treturn node?.nodeType === 3 ? (node as Text) : null\n}","import {nextText} from '../../shared/checkers'\n\n/** Firefox-only CaretPosition (absent from TypeScript DOM lib) */\ninterface CaretPosition {\n\treadonly offsetNode: Node\n\treadonly offset: number\n}\n\n/** Non-standard document caret APIs absent from TypeScript DOM lib */\ninterface DocumentWithCaretFromPoint {\n\tcaretRangeFromPoint?(x: number, y: number): Range | null\n\tcaretPositionFromPoint?(x: number, y: number): CaretPosition | null\n}\n\n//TODO refact caret\nexport class Caret {\n\tstatic get isSelectedPosition() {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\t\treturn selection.isCollapsed\n\t}\n\n\tstatic getCurrentPosition() {\n\t\treturn window.getSelection()?.anchorOffset ?? 0\n\t}\n\n\t//TODO get span from state?\n\tstatic getFocusedSpan() {\n\t\treturn window.getSelection()?.anchorNode?.textContent ?? ''\n\t}\n\n\tstatic getSelectedNode() {\n\t\tconst node = window.getSelection()?.anchorNode\n\t\tif (node && document.contains(node)) return node\n\t\tthrow new Error('Anchor node of selection is not exists!')\n\t}\n\n\t//TODO add the returned type: \"{left: CSSProperties[\"left\"], top: CSSProperties[\"top\"]}\"?\n\tstatic getAbsolutePosition() {\n\t\tconst rect = window.getSelection()?.getRangeAt(0).getBoundingClientRect()\n\t\tif (rect) return {left: rect.left, top: rect.top + rect.height + 1}\n\t\treturn {left: 0, top: 0}\n\t}\n\n\t/** Returns the raw DOMRect of the current caret position, or null if unavailable. */\n\tstatic getCaretRect(): DOMRect | null {\n\t\ttry {\n\t\t\tconst range = window.getSelection()?.getRangeAt(0)\n\t\t\treturn range?.getBoundingClientRect() ?? null\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if the caret is on the first visual line of the element.\n\t */\n\tstatic isCaretOnFirstLine(element: HTMLElement): boolean {\n\t\tconst caretRect = this.getCaretRect()\n\t\tif (!caretRect || caretRect.height === 0) return true\n\t\tconst elRect = element.getBoundingClientRect()\n\t\treturn caretRect.top < elRect.top + caretRect.height + 2\n\t}\n\n\t/**\n\t * Returns true if the caret is on the last visual line of the element.\n\t */\n\tstatic isCaretOnLastLine(element: HTMLElement): boolean {\n\t\tconst caretRect = this.getCaretRect()\n\t\tif (!caretRect || caretRect.height === 0) return true\n\t\tconst elRect = element.getBoundingClientRect()\n\t\treturn caretRect.bottom > elRect.bottom - caretRect.height - 2\n\t}\n\n\t/**\n\t * Positions the caret in `element` at the character closest to the given x coordinate.\n\t * `y` defaults to the vertical center of the element.\n\t */\n\tstatic setAtX(element: HTMLElement, x: number, y?: number): void {\n\t\tconst elRect = element.getBoundingClientRect()\n\t\tconst targetY = y ?? elRect.top + elRect.height / 2\n\n\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- non-standard DOM APIs not in TS lib\n\t\tconst caretDoc = document as unknown as DocumentWithCaretFromPoint\n\t\tconst caretPos = caretDoc.caretRangeFromPoint?.(x, targetY) ?? caretDoc.caretPositionFromPoint?.(x, targetY)\n\n\t\tif (!caretPos) return\n\n\t\tconst sel = window.getSelection()\n\t\tif (!sel) return\n\n\t\tlet domRange: Range\n\t\tif (caretPos instanceof Range) {\n\t\t\tdomRange = caretPos\n\t\t} else if ('offsetNode' in caretPos) {\n\t\t\t// Firefox CaretPosition\n\t\t\tdomRange = document.createRange()\n\t\t\tdomRange.setStart(caretPos.offsetNode, caretPos.offset)\n\t\t\tdomRange.collapse(true)\n\t\t} else {\n\t\t\treturn\n\t\t}\n\n\t\tif (!element.contains(domRange.startContainer)) {\n\t\t\t// Clicked outside: clamp to end\n\t\t\tthis.setIndex(element, Infinity)\n\t\t\treturn\n\t\t}\n\n\t\tsel.removeAllRanges()\n\t\tsel.addRange(domRange)\n\t}\n\n\tstatic trySetIndex(element: HTMLElement, offset: number) {\n\t\ttry {\n\t\t\tthis.setIndex(element, offset)\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t/**\n\t * Sets the caret at character `offset` within `element` by walking text nodes.\n\t * Use Infinity to position at the very end of all text.\n\t */\n\tstatic setIndex(element: HTMLElement, offset: number) {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\n\t\tconst walker = document.createTreeWalker(element, 4 /* NodeFilter.SHOW_TEXT */)\n\t\tlet node = nextText(walker)\n\t\tif (!node) return\n\n\t\tlet remaining = isFinite(offset) ? Math.max(0, offset) : Infinity\n\n\t\tfor (;;) {\n\t\t\tconst next = nextText(walker)\n\t\t\tif (!next || remaining <= node.length) {\n\t\t\t\tconst charOffset = isFinite(remaining) ? Math.min(remaining, node.length) : node.length\n\t\t\t\tconst range = document.createRange()\n\t\t\t\trange.setStart(node, charOffset)\n\t\t\t\trange.collapse(true)\n\t\t\t\tselection.removeAllRanges()\n\t\t\t\tselection.addRange(range)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tremaining -= node.length\n\t\t\tnode = next\n\t\t}\n\t}\n\n\tstatic getCaretIndex(element: HTMLElement) {\n\t\tlet position = 0\n\n\t\tconst selection = window.getSelection()\n\t\t// Check if there is a selection (i.e. cursor in place)\n\t\tif (!selection?.rangeCount) return position\n\n\t\t// Store the original range\n\t\tconst range = selection.getRangeAt(0)\n\t\t// Clone the range\n\t\tconst preCaretRange = range.cloneRange()\n\t\t// Select all textual contents from the contenteditable element\n\t\tpreCaretRange.selectNodeContents(element)\n\t\t// And set the range end to the original clicked position\n\t\tpreCaretRange.setEnd(range.endContainer, range.endOffset)\n\t\t// Return the text length from contenteditable start to the range end\n\t\tposition = preCaretRange.toString().length\n\n\t\treturn position\n\t}\n\n\tstatic setCaretToEnd(element: HTMLElement | null | undefined) {\n\t\tif (!element) return\n\t\tthis.setIndex(element, Infinity)\n\t}\n\n\tstatic getIndex() {\n\t\tconst selection = window.getSelection()\n\t\treturn selection?.anchorOffset ?? NaN\n\t}\n\n\tstatic setIndex1(offset: number) {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection?.anchorNode || !selection.rangeCount) return\n\n\t\tconst range = selection.getRangeAt(0)\n\t\trange.setStart(range.startContainer.firstChild ?? range.startContainer, offset)\n\t\trange.setEnd(range.startContainer.firstChild ?? range.startContainer, offset)\n\t}\n\n\tsetCaretRightTo(element: HTMLElement, offset: number) {\n\t\tconst selection = window.getSelection()\n\t\tconst range = selection?.getRangeAt(0)\n\t\trange?.setStart(range.endContainer, offset)\n\t\trange?.setEnd(range.endContainer, offset)\n\t}\n}","import {firstHtmlChild, isHtmlElement} from '../../shared/checkers'\nimport {effectScope, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\n\nexport function enableFocus(store: Store): () => void {\n\tconst container = store.dom.container()\n\tif (!container) return () => {}\n\n\tconst scope = effectScope(() => {\n\t\tlisten(container, 'focusin', e => {\n\t\t\tconst target = isHtmlElement(e.target) ? e.target : undefined\n\t\t\tif (!target) {\n\t\t\t\tstore.caret.location(undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst result = store.dom.locateNode(target)\n\t\t\tif (!result.ok) {\n\t\t\t\tif (result.reason === 'control') return\n\t\t\t\tstore.caret.location(undefined)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst role = result.value.textElement?.contains(target) ? 'text' : 'markDescendant'\n\t\t\tstore.caret.location({address: result.value.address, role})\n\t\t})\n\n\t\tlisten(container, 'focusout', () => {\n\t\t\tstore.caret.location(undefined)\n\t\t})\n\n\t\tlisten(container, 'click', () => {\n\t\t\tconst tokens = store.parsing.tokens()\n\t\t\tif (tokens.length === 1 && tokens[0].type === 'text' && tokens[0].content === '') {\n\t\t\t\tconst container = store.dom.container()\n\t\t\t\tconst element = container ? firstHtmlChild(container) : null\n\t\t\t\telement?.focus()\n\t\t\t}\n\t\t})\n\t})\n\n\treturn () => scope()\n}","import {nodeTarget} from '../../shared/checkers'\nimport {effectScope, effect, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\n\nexport function enableSelection(store: Store): () => void {\n\tlet pressedNode: Node | null = null\n\tlet isPressed = false\n\n\tconst scope = effectScope(() => {\n\t\tlisten(document, 'mousedown', e => {\n\t\t\tpressedNode = nodeTarget(e)\n\t\t\tisPressed = true\n\t\t})\n\n\t\tlisten(document, 'mousemove', e => {\n\t\t\tconst container = store.dom.container()\n\t\t\tif (!container) return\n\t\t\tconst currentIsPressed = isPressed\n\t\t\tconst isNotInnerSome = !container.contains(pressedNode) || pressedNode !== e.target\n\t\t\tconst isInside = window.getSelection()?.containsNode(container, true)\n\n\t\t\tif (currentIsPressed && isNotInnerSome && isInside) {\n\t\t\t\tif (store.caret.selecting() !== 'drag') {\n\t\t\t\t\tstore.caret.selecting('drag')\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tlisten(document, 'mouseup', () => {\n\t\t\tisPressed = false\n\t\t\tpressedNode = null\n\t\t\tif (store.caret.selecting() === 'drag') {\n\t\t\t\tconst sel = window.getSelection()\n\t\t\t\tif (!sel || sel.isCollapsed) {\n\t\t\t\t\tstore.caret.selecting(undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tlisten(document, 'selectionchange', () => {\n\t\t\tconst sel = window.getSelection()\n\t\t\tif (store.caret.selecting() === 'drag' && (!sel || sel.isCollapsed)) {\n\t\t\t\tstore.caret.selecting(undefined)\n\t\t\t}\n\t\t\tif (!sel?.focusNode) return\n\n\t\t\tconst result = store.dom.locateNode(sel.focusNode)\n\t\t\tif (!result.ok) {\n\t\t\t\tif (result.reason === 'control') return\n\t\t\t\tstore.caret.location(undefined)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst role = result.value.textElement?.contains(sel.focusNode) ? 'text' : 'markDescendant'\n\t\t\tstore.caret.location({address: result.value.address, role})\n\t\t})\n\n\t\teffect(() => {\n\t\t\tconst value = store.caret.selecting()\n\t\t\tif (value === 'drag') store.dom.reconcile()\n\t\t})\n\t})\n\n\treturn () => {\n\t\tif (store.caret.selecting() === 'drag') {\n\t\t\tstore.caret.selecting(undefined)\n\t\t}\n\n\t\tscope()\n\t\tpressedNode = null\n\t\tisPressed = false\n\t}\n}","import type {CaretLocation, CaretRecovery, Result, TokenAddress} from '../../shared/editorContracts'\nimport {signal} from '../../shared/signals'\nimport type {Feature} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {enableFocus} from './focus'\nimport {enableSelection} from './selection'\n\nexport class CaretFeature implements Feature {\n\treadonly recovery = signal<CaretRecovery | undefined>(undefined)\n\treadonly location = signal<CaretLocation | undefined>(undefined)\n\treadonly selecting = signal<'drag' | 'all' | undefined>(undefined)\n\n\t#disposers: Array<() => void> = []\n\n\tconstructor(private readonly _store: Store) {}\n\n\tenable() {\n\t\tif (this.#disposers.length) return\n\t\tthis.#disposers = [enableFocus(this._store), enableSelection(this._store)]\n\t}\n\n\tdisable() {\n\t\tthis.#disposers.forEach(d => d())\n\t\tthis.#disposers = []\n\t}\n\n\tplaceAt(\n\t\trawPosition: number,\n\t\taffinity: 'before' | 'after' = 'after'\n\t): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\treturn this._store.dom.placeCaretAtRawPosition(rawPosition, affinity)\n\t}\n\n\tfocus(address: TokenAddress, boundary: 'start' | 'end' = 'start'): Result<void, 'notIndexed' | 'stale'> {\n\t\treturn this._store.dom.focusAddress(address, boundary)\n\t}\n}","import type {Store} from '../../store'\n\nexport function isFullSelection(store: Store): boolean {\n\tconst sel = window.getSelection()\n\tconst container = store.dom.container()\n\tif (!sel?.rangeCount || !container?.firstChild || !container.lastChild) return false\n\n\ttry {\n\t\tconst range = sel.getRangeAt(0)\n\t\treturn (\n\t\t\tcontainer.contains(range.startContainer) &&\n\t\t\tcontainer.contains(range.endContainer) &&\n\t\t\trange.toString().length > 0\n\t\t)\n\t} catch {\n\t\treturn false\n\t}\n}\n\nexport function selectAllText(store: Store, event: KeyboardEvent): void {\n\tif ((event.ctrlKey || event.metaKey) && event.code === 'KeyA') {\n\t\t// In block mode, let the browser handle Ctrl+A natively so it selects\n\t\t// text within the focused block only, not across all blocks.\n\t\tif (store.slots.isBlock()) return\n\n\t\tevent.preventDefault()\n\n\t\tconst selection = window.getSelection()\n\t\tconst anchorNode = store.dom.container()?.firstChild\n\t\tconst focusNode = store.dom.container()?.lastChild\n\n\t\tif (!selection || !anchorNode || !focusNode) return\n\t\tselection.setBaseAndExtent(anchorNode, 0, focusNode, 1)\n\n\t\tstore.caret.selecting('all')\n\t}\n}","import {escape} from '../../shared/escape'\nimport type {OverlayMatch} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {Caret} from './Caret'\n\n/** Regex to match word characters from the start of a string */\nconst wordRegex = new RegExp(/^\\w*/)\n\n/**\n * Function type for extracting trigger from option\n * @template T - Type of option\n * @param option - The option object\n * @param index - Index of option in array\n * @returns Trigger string or undefined\n */\ntype TriggerExtractor<T> = (option: T, index: number) => string | undefined\n\nexport class TriggerFinder {\n\tspan: string\n\tnode: Node\n\tdividedText: {left: string; right: string}\n\n\tconstructor(private readonly store?: Store) {\n\t\tconst caretPosition = Caret.getCurrentPosition()\n\t\tthis.node = Caret.getSelectedNode()\n\t\tthis.span = Caret.getFocusedSpan()\n\t\tthis.dividedText = this.getDividedTextBy(caretPosition)\n\t}\n\n\t/**\n\t * Find overlay match in text using provided options and trigger extractor.\n\t * @template T - Type of option objects\n\t * @param options - Array of options to search through\n\t * @param getTrigger - Function that extracts trigger from each option\n\t * @returns OverlayMatch with correct option type or undefined\n\t *\n\t * @example\n\t * // React usage\n\t * TriggerFinder.find(options, (opt) => opt.slotProps?.overlay?.trigger ?? '@')\n\t *\n\t * @example\n\t * // Other framework usage\n\t * TriggerFinder.find(vueOptions, (opt) => opt.overlay?.trigger ?? '@')\n\t */\n\tstatic find<T>(\n\t\toptions: T[] | undefined,\n\t\tgetTrigger: TriggerExtractor<T>,\n\t\tstore?: Store\n\t): OverlayMatch<T> | undefined {\n\t\tif (!options) return\n\t\tif (!Caret.isSelectedPosition) return\n\t\ttry {\n\t\t\treturn new TriggerFinder(store).find(options, getTrigger)\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t}\n\n\tgetDividedTextBy(position: number) {\n\t\treturn {left: this.span.slice(0, position), right: this.span.slice(position)}\n\t}\n\n\t/**\n\t * Find overlay match in provided options.\n\t * @template T - Type of option objects\n\t * @param options - Array of options\n\t * @param getTrigger - Function to extract trigger from each option\n\t */\n\tfind<T>(options: T[], getTrigger: TriggerExtractor<T>): OverlayMatch<T> | undefined {\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst option = options[i]\n\t\t\tconst trigger = getTrigger(option, i)\n\t\t\tif (!trigger) continue\n\n\t\t\tconst match = this.matchInTextVia(trigger)\n\t\t\tif (match) {\n\t\t\t\tconst range = this.#rawRangeForMatch(match.annotation, match.index)\n\t\t\t\tif (!range) return undefined\n\t\t\t\treturn {\n\t\t\t\t\tvalue: match.word,\n\t\t\t\t\tsource: match.annotation,\n\t\t\t\t\trange,\n\t\t\t\t\tspan: this.span,\n\t\t\t\t\tnode: this.node,\n\t\t\t\t\toption,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#rawRangeForMatch(source: string, index: number) {\n\t\tif (!this.store) return {start: index, end: index + source.length}\n\t\tconst boundary = this.store.dom.rawPositionFromBoundary(this.node, index + source.length, 'after')\n\t\tif (!boundary.ok) return undefined\n\t\treturn {\n\t\t\tstart: boundary.value - source.length,\n\t\t\tend: boundary.value,\n\t\t}\n\t}\n\n\tmatchInTextVia(trigger: string = '@') {\n\t\tconst rightMatch = this.matchRightPart()\n\t\tconst leftMatch = this.matchLeftPart(trigger)\n\t\tif (leftMatch)\n\t\t\treturn {\n\t\t\t\tword: leftMatch.word + rightMatch.word,\n\t\t\t\tannotation: leftMatch.annotation + rightMatch.word,\n\t\t\t\tindex: leftMatch.index,\n\t\t\t}\n\t}\n\n\tmatchRightPart() {\n\t\tconst {right} = this.dividedText\n\t\treturn {word: right.match(wordRegex)?.[0]}\n\t}\n\n\tmatchLeftPart(trigger: string) {\n\t\tconst regex = this.makeTriggerRegex(trigger)\n\t\tconst {left} = this.dividedText\n\t\tconst match = left.match(regex)\n\n\t\tif (!match) return\n\n\t\tconst [annotation, word] = match\n\t\treturn {word, annotation, index: match.index ?? 0}\n\t}\n\n\t//TODO new overlayMatch option if (isSpaceBeforeRequired) append space check for not first words '\\\\s'\n\tmakeTriggerRegex(trigger: string): RegExp {\n\t\tconst patten = escape(trigger) + '(\\\\w*)$'\n\t\treturn new RegExp(patten)\n\t}\n}","/** Custom MIME type for markput markup syntax. */\nexport const MARKPUT_MIME = 'application/x-markput'\n\nconst pendingMarkupByContainer = new WeakMap<HTMLElement, string>()\n\n/**\n * Capture markup data from a paste event, scoped to a specific container.\n * Call this from the `paste` event handler — custom MIME types are readable\n * on ClipboardEvent.clipboardData but not reliably on InputEvent.dataTransfer.\n *\n * Scoping to the container prevents multiple editor instances from consuming\n * each other's clipboard data.\n */\nexport function captureMarkupPaste(event: ClipboardEvent, container: HTMLElement): void {\n\tconst raw = event.clipboardData?.getData(MARKPUT_MIME)\n\tif (raw) {\n\t\tpendingMarkupByContainer.set(container, raw)\n\t} else {\n\t\tpendingMarkupByContainer.delete(container)\n\t}\n}\n\n/**\n * Consume the pending markup data (if any) for the given container.\n * Returns undefined if no markup was captured or the data was already consumed.\n */\nexport function consumeMarkupPaste(container: HTMLElement): string | undefined {\n\tconst markup = pendingMarkupByContainer.get(container)\n\tpendingMarkupByContainer.delete(container)\n\treturn markup\n}\n\n/**\n * Clear the pending markup buffer for the given container. Useful for test cleanup.\n */\nexport function clearMarkupPaste(container: HTMLElement): void {\n\tpendingMarkupByContainer.delete(container)\n}","import type {RawRange} from '../../shared/editorContracts'\nimport {effectScope, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store'\nimport {toString} from '../parsing'\nimport type {Token} from '../parsing'\nimport {MARKPUT_MIME} from './pasteMarkup'\n\nfunction htmlFromRange(range: Range): string {\n\tconst fragment = range.cloneContents()\n\tconst div = document.createElement('div')\n\tdiv.appendChild(fragment)\n\treturn div.innerHTML\n}\n\nfunction serializeRawRange(tokens: readonly Token[], range: RawRange): string {\n\treturn toString(trimTokensForRawRange(tokens, range))\n}\n\nfunction trimTokensForRawRange(tokens: readonly Token[], range: RawRange): Token[] {\n\treturn tokens\n\t\t.filter(token => token.position.end > range.start && token.position.start < range.end)\n\t\t.map(token => {\n\t\t\tif (token.type === 'text') {\n\t\t\t\tconst start = Math.max(0, range.start - token.position.start)\n\t\t\t\tconst end = Math.min(token.content.length, range.end - token.position.start)\n\t\t\t\treturn Object.assign({}, token, {content: token.content.slice(start, end)})\n\t\t\t}\n\n\t\t\tif (token.children.length === 0) return token\n\t\t\treturn Object.assign({}, token, {children: trimTokensForRawRange(token.children, range)})\n\t\t})\n}\n\nexport class ClipboardFeature {\n\t#scope?: () => void\n\n\tconstructor(private readonly store: Store) {}\n\n\tenable() {\n\t\tif (this.#scope) return\n\n\t\tconst container = this.store.dom.container()\n\t\tif (!container) return\n\n\t\tthis.#scope = effectScope(() => {\n\t\t\tlisten(container, 'copy', e => {\n\t\t\t\tthis.#handleCopy(e)\n\t\t\t})\n\n\t\t\tlisten(container, 'cut', e => {\n\t\t\t\tif (!this.#handleCopy(e)) return\n\n\t\t\t\tconst raw = this.store.dom.readRawSelection()\n\t\t\t\tif (!raw.ok || raw.value.range.start === raw.value.range.end) return\n\n\t\t\t\tthis.store.value.replaceRange(raw.value.range, '', {\n\t\t\t\t\tsource: 'cut',\n\t\t\t\t\trecover: {kind: 'caret', rawPosition: raw.value.range.start},\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#scope?.()\n\t\tthis.#scope = undefined\n\t}\n\n\t#handleCopy(e: ClipboardEvent): boolean {\n\t\tconst container = this.store.dom.container()\n\t\tif (!container) return false\n\n\t\tconst raw = this.store.dom.readRawSelection()\n\t\tif (!raw.ok || raw.value.range.start === raw.value.range.end) return false\n\n\t\t// text/plain: visual selected text\n\t\tconst sel = window.getSelection()\n\t\tconst range = sel?.rangeCount ? sel.getRangeAt(0) : undefined\n\t\tif (!range) return false\n\t\tconst plainText = range.toString()\n\n\t\t// text/html: rendered DOM HTML from the actual selection\n\t\tconst html = htmlFromRange(range)\n\n\t\t// application/x-markput: raw-selected text tokens are trimmed; overlapping plain marks keep markup syntax.\n\t\tconst markup = serializeRawRange(this.store.parsing.tokens(), raw.value.range)\n\n\t\te.preventDefault()\n\t\te.clipboardData?.setData('text/plain', plainText)\n\t\te.clipboardData?.setData('text/html', html)\n\t\te.clipboardData?.setData(MARKPUT_MIME, markup)\n\t\treturn true\n\t}\n}","import type {\n\tBoundaryPositionResult,\n\tDomDiagnostic,\n\tDomIndex,\n\tDomRef,\n\tNodeLocationResult,\n\tRawSelection,\n\tRawSelectionResult,\n\tResult,\n\tTokenAddress,\n\tTokenPath,\n} from '../../shared/editorContracts'\nimport {batch, computed, effectScope, event, signal, watch} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\nimport type {Token} from '../parsing'\nimport {pathEquals, pathKey} from '../parsing/tokenIndex'\n\ntype RegisteredRole =\n\t| {readonly role: 'control'}\n\t| {\n\t\t\treadonly role: 'childSequence' | 'row' | 'token' | 'text'\n\t\t\treadonly path: TokenPath\n\t\t\treadonly address: TokenAddress\n\t }\n\ntype PathElements = {\n\tpath: TokenPath\n\taddress: TokenAddress\n\trowElement?: HTMLElement\n\ttokenElement: HTMLElement\n\ttextElement?: HTMLElement\n}\n\ntype ControlRegistration = {\n\treadonly ownerPath?: TokenPath\n\treadonly element: HTMLElement\n}\n\ntype ChildSequenceRegistration = {\n\treadonly ownerPath: TokenPath\n\treadonly element: HTMLElement\n}\n\nfunction nextTextNode(walker: TreeWalker): Text | null {\n\tconst node = walker.nextNode()\n\treturn node instanceof Text ? node : null\n}\n\nfunction splitsSurrogatePair(text: string, offset: number): boolean {\n\tif (offset <= 0 || offset >= text.length) return false\n\tconst prev = text.charCodeAt(offset - 1)\n\tconst next = text.charCodeAt(offset)\n\treturn prev >= 0xd800 && prev <= 0xdbff && next >= 0xdc00 && next <= 0xdfff\n}\n\nfunction textOffsetWithin(surface: HTMLElement, node: Node, offset: number): number | undefined {\n\tif (node.nodeType === Node.TEXT_NODE) {\n\t\tconst text = node.textContent ?? ''\n\t\tif (splitsSurrogatePair(text, offset)) return undefined\n\t\treturn node instanceof Text ? textOffsetFromTreeWalker(surface, node, offset) : undefined\n\t}\n\n\tif (node === surface) return elementBoundaryOffset(surface, offset)\n\treturn undefined\n}\n\nfunction textOffsetFromTreeWalker(surface: HTMLElement, target: Text, targetOffset: number): number | undefined {\n\tlet total = 0\n\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\tlet current = nextTextNode(walker)\n\twhile (current) {\n\t\tif (current === target) return total + targetOffset\n\t\ttotal += current.length\n\t\tcurrent = nextTextNode(walker)\n\t}\n\treturn undefined\n}\n\nfunction textLength(surface: HTMLElement): number {\n\tlet total = 0\n\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\tlet current = nextTextNode(walker)\n\twhile (current) {\n\t\ttotal += current.length\n\t\tcurrent = nextTextNode(walker)\n\t}\n\treturn total\n}\n\nfunction elementBoundaryOffset(surface: HTMLElement, offset: number): number | undefined {\n\tif (offset <= 0) return 0\n\tif (offset >= surface.childNodes.length) return textLength(surface)\n\n\tlet total = 0\n\tfor (let i = 0; i < offset; i++) {\n\t\tconst child = surface.childNodes.item(i)\n\t\tif (child.nodeType === Node.TEXT_NODE && child instanceof Text) {\n\t\t\ttotal += child.length\n\t\t\tcontinue\n\t\t}\n\t\tif (child instanceof HTMLElement) total += textLength(child)\n\t}\n\treturn total\n}\n\nfunction hasEditableAncestorBefore(node: Node, boundary: HTMLElement): boolean {\n\tlet current = node instanceof HTMLElement ? node : node.parentElement\n\twhile (current && current !== boundary) {\n\t\tif (\n\t\t\tcurrent.isContentEditable ||\n\t\t\tcurrent.contentEditable === 'true' ||\n\t\t\tcurrent.contentEditable === 'plaintext-only'\n\t\t) {\n\t\t\treturn true\n\t\t}\n\t\tcurrent = current.parentElement\n\t}\n\treturn false\n}\n\nexport class DomFeature {\n\treadonly #domIndex = signal<DomIndex | undefined>(undefined, {readonly: true})\n\treadonly index: Computed<DomIndex | undefined> = computed(() => this.#domIndex())\n\treadonly container = signal<HTMLElement | null>(null)\n\treadonly diagnostics = event<DomDiagnostic>()\n\n\treadonly #pendingControls = new Map<string, ControlRegistration>()\n\treadonly #pendingChildSequences = new Map<string, ChildSequenceRegistration>()\n\t#nextControlId = 0\n\t#nextChildSequenceId = 0\n\t#elementRoles = new WeakMap<HTMLElement, RegisteredRole>()\n\t#pathElements = new Map<string, PathElements>()\n\t#generation = 0\n\t#rendering = false\n\t#isComposing = false\n\t#queuedRender = false\n\t#scope?: () => void\n\n\tconstructor(private readonly _store: Store) {}\n\n\tenable() {\n\t\tif (this.#scope) return\n\t\tthis.#scope = effectScope(() => {\n\t\t\twatch(this._store.lifecycle.rendered, () => {\n\t\t\t\tthis.#handleRendered()\n\t\t\t})\n\t\t\twatch(\n\t\t\t\tcomputed(() => ({\n\t\t\t\t\treadOnly: this._store.props.readOnly(),\n\t\t\t\t\tselecting: this._store.caret.selecting(),\n\t\t\t\t})),\n\t\t\t\t() => this.reconcile()\n\t\t\t)\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#scope?.()\n\t\tthis.#scope = undefined\n\t}\n\n\tcompositionStarted(): void {\n\t\tthis.#isComposing = true\n\t}\n\n\tcompositionEnded(): void {\n\t\tif (!this.#isComposing) return\n\t\tthis.#isComposing = false\n\t}\n\n\tcontrolFor(ownerPath?: TokenPath): DomRef {\n\t\tconst key = `control:${ownerPath ? pathKey(ownerPath) : 'global'}:${++this.#nextControlId}`\n\n\t\tconst callback: DomRef = element => {\n\t\t\tif (element) {\n\t\t\t\tthis.#pendingControls.set(key, {ownerPath: ownerPath ? [...ownerPath] : undefined, element})\n\t\t\t} else {\n\t\t\t\tthis.#pendingControls.delete(key)\n\t\t\t}\n\t\t}\n\t\treturn callback\n\t}\n\n\tchildrenFor(ownerPath: TokenPath): DomRef {\n\t\tconst key = `children:${pathKey(ownerPath)}:${++this.#nextChildSequenceId}`\n\n\t\tconst callback: DomRef = element => {\n\t\t\tif (element) {\n\t\t\t\tthis.#pendingChildSequences.set(key, {ownerPath: [...ownerPath], element})\n\t\t\t} else {\n\t\t\t\tthis.#pendingChildSequences.delete(key)\n\t\t\t}\n\t\t}\n\t\treturn callback\n\t}\n\n\treconcile(): void {\n\t\tthis.#reconcileStructuralTextSurfaces()\n\t}\n\n\tlocateNode(node: Node): NodeLocationResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst container = this.container()\n\t\tif (!container || !container.contains(node)) return {ok: false, reason: 'outsideEditor'}\n\n\t\tlet current: Node | null = node\n\t\twhile (current) {\n\t\t\tif (current instanceof HTMLElement) {\n\t\t\t\tconst role = this.#elementRoles.get(current)\n\t\t\t\tif (role?.role === 'control') return {ok: false, reason: 'control'}\n\t\t\t\tif (role) {\n\t\t\t\t\tconst elements = this.#pathElements.get(pathKey(role.path))\n\t\t\t\t\tif (!elements?.tokenElement) return {ok: false, reason: 'notIndexed'}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: true,\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\taddress: role.address,\n\t\t\t\t\t\t\ttokenElement: elements.tokenElement,\n\t\t\t\t\t\t\ttextElement: elements.textElement,\n\t\t\t\t\t\t\trowElement: elements.rowElement,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (current === container) break\n\t\t\tcurrent = current.parentNode\n\t\t}\n\n\t\treturn {ok: false, reason: 'outsideEditor'}\n\t}\n\n\tplaceCaretAtRawPosition(\n\t\trawPosition: number,\n\t\taffinity: 'before' | 'after' = 'after'\n\t): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst target = this.#findTextTargetForRawPosition(rawPosition, affinity)\n\t\tif (!target) return this.#focusMarkBoundaryForRawPosition(rawPosition)\n\n\t\ttarget.element.focus()\n\t\tthis.#placeCaretInTextSurface(target.element, rawPosition - target.start)\n\t\treturn {ok: true, value: undefined}\n\t}\n\n\tfocusAddress(address: TokenAddress, boundary: 'start' | 'end' = 'start'): Result<void, 'notIndexed' | 'stale'> {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst resolved = this._store.parsing.index().resolveAddress(address)\n\t\tif (!resolved.ok) return {ok: false, reason: 'stale'}\n\n\t\tconst elements = this.#pathElements.get(pathKey(address.path))\n\t\tconst target = elements?.textElement ?? elements?.tokenElement ?? elements?.rowElement\n\t\tif (!target) return {ok: false, reason: 'notIndexed'}\n\n\t\ttarget.focus()\n\t\tconst role =\n\t\t\ttarget === elements?.textElement ? 'text' : target === elements?.rowElement ? 'row' : 'markDescendant'\n\t\tif (role === 'markDescendant') {\n\t\t\tthis.#placeCollapsedBoundary(target, boundary === 'end' ? target.childNodes.length : 0)\n\t\t}\n\t\tthis._store.caret.location({address, role})\n\t\treturn {ok: true, value: undefined}\n\t}\n\n\trawPositionFromBoundary(\n\t\tnode: Node,\n\t\toffset: number,\n\t\taffinity: 'before' | 'after' = 'after'\n\t): BoundaryPositionResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tif (this.#isComposing) return {ok: false, reason: 'composing'}\n\n\t\tconst container = this.container()\n\t\tif (container && node === container) {\n\t\t\treturn this.#rawPositionFromContainerBoundary(offset, affinity)\n\t\t}\n\n\t\tconst location = this.locateNode(node)\n\t\tif (!location.ok) return location.reason === 'control' ? {ok: false, reason: 'control'} : location\n\n\t\tconst token = this._store.parsing.index().resolveAddress(location.value.address)\n\t\tif (!token.ok) return {ok: false, reason: 'notIndexed'}\n\n\t\tif (node instanceof HTMLElement) {\n\t\t\tconst role = this.#elementRoles.get(node)\n\t\t\tif (role?.role === 'childSequence') {\n\t\t\t\tconst childCount = node.childNodes.length\n\t\t\t\tif (offset <= 0) return {ok: true, value: token.value.position.start}\n\t\t\t\tif (offset >= childCount) return {ok: true, value: token.value.position.end}\n\t\t\t\treturn this.#rawPositionFromTokenChildBoundary(node, offset, token.value, affinity)\n\t\t\t}\n\t\t}\n\n\t\tconst textElement = location.value.textElement\n\t\tif (textElement?.contains(node)) {\n\t\t\tconst local = textOffsetWithin(textElement, node, offset)\n\t\t\tif (local === undefined) return {ok: false, reason: 'invalidBoundary'}\n\t\t\treturn {ok: true, value: token.value.position.start + local}\n\t\t}\n\n\t\tif (node === location.value.tokenElement) {\n\t\t\tconst childCount = location.value.tokenElement.childNodes.length\n\t\t\tif (offset <= 0) return {ok: true, value: token.value.position.start}\n\t\t\tif (offset >= childCount) return {ok: true, value: token.value.position.end}\n\t\t\treturn this.#rawPositionFromTokenChildBoundary(location.value.tokenElement, offset, token.value, affinity)\n\t\t}\n\n\t\tif (token.value.type === 'mark' && location.value.tokenElement.contains(node)) {\n\t\t\tif (hasEditableAncestorBefore(node, location.value.tokenElement)) {\n\t\t\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tvalue: affinity === 'after' ? token.value.position.start : token.value.position.end,\n\t\t\t}\n\t\t}\n\n\t\tif (location.value.rowElement && node === location.value.rowElement) {\n\t\t\treturn {ok: true, value: offset <= 0 ? token.value.position.start : token.value.position.end}\n\t\t}\n\n\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t}\n\n\treadRawSelection(): RawSelectionResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst selection = window.getSelection()\n\t\tif (!selection || selection.rangeCount === 0) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst range = selection.getRangeAt(0)\n\t\tconst start = this.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\t\tconst end = this.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\n\t\tif (!start.ok) {\n\t\t\tconst reason = start.reason === 'composing' ? 'invalidBoundary' : start.reason\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\treason: reason === 'control' || reason === 'outsideEditor' ? 'mixedBoundary' : reason,\n\t\t\t}\n\t\t}\n\t\tif (!end.ok) {\n\t\t\tconst reason = end.reason === 'composing' ? 'invalidBoundary' : end.reason\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\treason: reason === 'control' || reason === 'outsideEditor' ? 'mixedBoundary' : reason,\n\t\t\t}\n\t\t}\n\n\t\tconst rangeValue =\n\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value}\n\t\tconst direction =\n\t\t\trangeValue.start === rangeValue.end\n\t\t\t\t? undefined\n\t\t\t\t: selection.anchorNode === range.endContainer && selection.anchorOffset === range.endOffset\n\t\t\t\t\t? 'backward'\n\t\t\t\t\t: 'forward'\n\n\t\treturn {ok: true, value: direction ? {range: rangeValue, direction} : {range: rangeValue}}\n\t}\n\n\t#handleRendered(): void {\n\t\tif (this.#rendering) {\n\t\t\tthis.#queuedRender = true\n\t\t\tthis.diagnostics({kind: 'renderReentry', reason: 'rendered event queued during DOM indexing'})\n\t\t\treturn\n\t\t}\n\n\t\tthis.#rendering = true\n\t\ttry {\n\t\t\tthis.#commitRendered()\n\t\t} finally {\n\t\t\tthis.#rendering = false\n\t\t\tconst queued = this.#queuedRender\n\t\t\tthis.#queuedRender = false\n\t\t\tif (queued) this.#handleRendered()\n\t\t}\n\t}\n\n\t#commitRendered(): void {\n\t\tconst container = this.container()\n\t\tif (!container) {\n\t\t\tthis.diagnostics({kind: 'missingContainer', reason: 'container is not registered'})\n\t\t\treturn\n\t\t}\n\n\t\tconst tokenIndex = this._store.parsing.index()\n\t\tconst pathElements = new Map<string, PathElements>()\n\t\tconst elementRoles = new WeakMap<HTMLElement, RegisteredRole>()\n\t\tconst controlElements = new Set<HTMLElement>()\n\n\t\tfor (const {element} of this.#pendingControls.values()) {\n\t\t\tcontrolElements.add(element)\n\t\t\telementRoles.set(element, {role: 'control'})\n\t\t}\n\n\t\tconst tokens = this._store.parsing.tokens()\n\t\tif (this._store.props.layout() === 'block') {\n\t\t\tthis.#indexBlockTokens(container, tokens, tokenIndex, controlElements, pathElements, elementRoles)\n\t\t} else {\n\t\t\tthis.#indexTokenSequence(\n\t\t\t\tcontainer,\n\t\t\t\ttokens,\n\t\t\t\t[],\n\t\t\t\tundefined,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t}\n\n\t\tthis.#pathElements = pathElements\n\t\tthis.#elementRoles = elementRoles\n\t\tthis.#reconcileStructuralTextSurfaces()\n\n\t\tbatch(() => this.#domIndex({generation: ++this.#generation}), {mutable: true})\n\t\tthis.#clearStaleCaretLocation()\n\t\tthis.#applyPendingRecovery()\n\t}\n\n\t#elementChildren(element: HTMLElement): HTMLElement[] {\n\t\treturn Array.from(element.children).filter(child => child instanceof HTMLElement)\n\t}\n\n\t#isControlRoot(element: HTMLElement, controlElements: Set<HTMLElement>): boolean {\n\t\tif (controlElements.has(element)) return true\n\t\tfor (const control of controlElements) {\n\t\t\tif (element.contains(control)) return true\n\t\t}\n\t\treturn false\n\t}\n\n\t#childSequenceHostsFor(ownerPath: TokenPath): HTMLElement[] {\n\t\tconst hosts: HTMLElement[] = []\n\t\tfor (const registration of this.#pendingChildSequences.values()) {\n\t\t\tif (pathEquals(registration.ownerPath, ownerPath)) hosts.push(registration.element)\n\t\t}\n\t\treturn hosts\n\t}\n\n\t#indexNestedTokenSequence(\n\t\ttoken: Token,\n\t\tpath: TokenPath,\n\t\taddress: TokenAddress,\n\t\townerElement: HTMLElement,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: ReturnType<Store['parsing']['index']>,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tif (token.type !== 'mark' || token.children.length === 0) return\n\n\t\tconst hosts = this.#childSequenceHostsFor(path)\n\t\tif (hosts.length === 0) {\n\t\t\tthis.#indexTokenSequence(\n\t\t\t\townerElement,\n\t\t\t\ttoken.children,\n\t\t\t\tpath,\n\t\t\t\trowElement,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst ownerKey = pathKey(path)\n\t\tif (hosts.length !== 1) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath,\n\t\t\t\treason: `expected exactly 1 child sequence host for owner path ${ownerKey} but found ${hosts.length}`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tconst host = hosts[0]\n\t\tif (!ownerElement.contains(host)) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath,\n\t\t\t\treason: `child sequence host for owner path ${ownerKey} is not contained by owner token element`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\telementRoles.set(host, {role: 'childSequence', path, address})\n\t\tthis.#indexTokenSequence(\n\t\t\thost,\n\t\t\ttoken.children,\n\t\t\tpath,\n\t\t\trowElement,\n\t\t\ttokenIndex,\n\t\t\tcontrolElements,\n\t\t\tpathElements,\n\t\t\telementRoles\n\t\t)\n\t}\n\n\t#indexBlockTokens(\n\t\tcontainer: HTMLElement,\n\t\ttokens: readonly Token[],\n\t\ttokenIndex: ReturnType<Store['parsing']['index']>,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst rows = this.#elementChildren(container)\n\t\tif (rows.length !== tokens.length) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\treason: `expected ${tokens.length} block rows but found ${rows.length}`,\n\t\t\t})\n\t\t}\n\n\t\ttokens.forEach((token, i) => {\n\t\t\tconst row = rows.at(i)\n\t\t\tif (!row) return\n\t\t\tconst candidates = this.#elementChildren(row).filter(child => !this.#isControlRoot(child, controlElements))\n\t\t\tif (candidates.length !== 1) {\n\t\t\t\tthis.diagnostics({\n\t\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\t\tpath: [i],\n\t\t\t\t\treason: `expected 1 block token element but found ${candidates.length}`,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#indexTokenElement(\n\t\t\t\ttoken,\n\t\t\t\t[i],\n\t\t\t\tcandidates[0],\n\t\t\t\trow,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t})\n\t}\n\n\t#indexTokenSequence(\n\t\tparent: HTMLElement,\n\t\ttokens: readonly Token[],\n\t\tbasePath: TokenPath,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: ReturnType<Store['parsing']['index']>,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst elements = this.#elementChildren(parent).filter(child => !this.#isControlRoot(child, controlElements))\n\t\tif (elements.length !== tokens.length) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath: basePath.length ? basePath : undefined,\n\t\t\t\treason: `expected ${tokens.length} child token elements but found ${elements.length}`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\ttokens.forEach((token, i) => {\n\t\t\tconst element = elements.at(i)\n\t\t\tif (!element) return\n\t\t\tthis.#indexTokenElement(\n\t\t\t\ttoken,\n\t\t\t\t[...basePath, i],\n\t\t\t\telement,\n\t\t\t\trowElement,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t})\n\t}\n\n\t#indexTokenElement(\n\t\ttoken: Token,\n\t\tpath: TokenPath,\n\t\telement: HTMLElement,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: ReturnType<Store['parsing']['index']>,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst address = tokenIndex.addressFor(path)\n\t\tif (!address) {\n\t\t\tthis.diagnostics({kind: 'stalePath', path, reason: 'structural path no longer resolves'})\n\t\t\treturn\n\t\t}\n\n\t\tconst record: PathElements = {\n\t\t\tpath: [...path],\n\t\t\taddress,\n\t\t\ttokenElement: element,\n\t\t\ttextElement: token.type === 'text' ? element : undefined,\n\t\t\trowElement,\n\t\t}\n\t\tpathElements.set(tokenIndex.key(path), record)\n\t\telementRoles.set(element, {role: token.type === 'text' ? 'text' : 'token', path, address})\n\t\tif (rowElement && path.length === 1) elementRoles.set(rowElement, {role: 'row', path, address})\n\n\t\tthis.#indexNestedTokenSequence(\n\t\t\ttoken,\n\t\t\tpath,\n\t\t\taddress,\n\t\t\telement,\n\t\t\trowElement,\n\t\t\ttokenIndex,\n\t\t\tcontrolElements,\n\t\t\tpathElements,\n\t\t\telementRoles\n\t\t)\n\t}\n\n\t#reconcileStructuralTextSurfaces(): void {\n\t\tconst tokenIndex = this._store.parsing.index()\n\t\tconst editable = this._store.props.readOnly() || this._store.caret.selecting() ? 'false' : 'true'\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok) {\n\t\t\t\tthis.diagnostics({\n\t\t\t\t\tkind: 'stalePath',\n\t\t\t\t\tpath: record.path,\n\t\t\t\t\treason: 'structural path became stale during reconciliation',\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (record.textElement) {\n\t\t\t\tif (resolved.value.type !== 'text') {\n\t\t\t\t\tthis.diagnostics({\n\t\t\t\t\t\tkind: 'missingRole',\n\t\t\t\t\t\tpath: record.path,\n\t\t\t\t\t\treason: 'text role registered for non-text token',\n\t\t\t\t\t})\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (record.textElement.textContent !== resolved.value.content) {\n\t\t\t\t\trecord.textElement.textContent = resolved.value.content\n\t\t\t\t}\n\t\t\t\trecord.textElement.contentEditable = editable\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (resolved.value.type === 'mark') {\n\t\t\t\tif (this._store.props.readOnly()) {\n\t\t\t\t\trecord.tokenElement.removeAttribute('tabindex')\n\t\t\t\t} else {\n\t\t\t\t\trecord.tokenElement.tabIndex = 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#rawPositionFromContainerBoundary(offset: number, affinity: 'before' | 'after'): BoundaryPositionResult {\n\t\tconst tokens = this._store.parsing.tokens()\n\t\tif (tokens.length === 0) return {ok: true, value: 0}\n\t\tif (offset <= 0) return {ok: true, value: tokens[0].position.start}\n\t\tif (offset >= tokens.length) return {ok: true, value: tokens[tokens.length - 1].position.end}\n\n\t\tconst before = tokens[offset - 1]\n\t\tconst after = tokens[offset]\n\t\treturn {ok: true, value: affinity === 'before' ? before.position.end : after.position.start}\n\t}\n\n\t#rawPositionFromTokenChildBoundary(\n\t\ttokenElement: HTMLElement,\n\t\toffset: number,\n\t\ttoken: Token,\n\t\taffinity: 'before' | 'after'\n\t): BoundaryPositionResult {\n\t\tif (token.type === 'text') {\n\t\t\tconst textElement = this.#pathElements.get(\n\t\t\t\tpathKey(this._store.parsing.index().pathFor(token) ?? [])\n\t\t\t)?.textElement\n\t\t\tif (!textElement || textLength(textElement) === 0) return {ok: true, value: token.position.start}\n\t\t}\n\n\t\tconst before = this.#locateRegisteredDescendant(tokenElement.childNodes.item(offset - 1))\n\t\tconst after = this.#locateRegisteredDescendant(tokenElement.childNodes.item(offset))\n\t\tif (before?.ok && after?.ok) {\n\t\t\tconst beforeToken = this._store.parsing.index().resolveAddress(before.value.address)\n\t\t\tconst afterToken = this._store.parsing.index().resolveAddress(after.value.address)\n\t\t\tif (beforeToken.ok && afterToken.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\tvalue: affinity === 'before' ? beforeToken.value.position.end : afterToken.value.position.start,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {ok: true, value: affinity === 'before' ? token.position.start : token.position.end}\n\t}\n\n\t#locateRegisteredDescendant(node: Node | null): NodeLocationResult | undefined {\n\t\tif (!node) return undefined\n\t\treturn this.locateNode(node)\n\t}\n\n\t#findTextTargetForRawPosition(\n\t\trawPosition: number,\n\t\taffinity: 'before' | 'after'\n\t): {element: HTMLElement; start: number; end: number} | undefined {\n\t\tconst candidates: Array<{element: HTMLElement; start: number; end: number}> = []\n\t\tconst tokenIndex = this._store.parsing.index()\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tif (!record.textElement) continue\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok || resolved.value.type !== 'text') continue\n\t\t\tcandidates.push({\n\t\t\t\telement: record.textElement,\n\t\t\t\tstart: resolved.value.position.start,\n\t\t\t\tend: resolved.value.position.end,\n\t\t\t})\n\t\t}\n\n\t\tcandidates.sort((a, b) => a.start - b.start)\n\t\tconst containing = candidates.find(candidate => rawPosition >= candidate.start && rawPosition <= candidate.end)\n\t\tif (containing) return containing\n\t\tif (affinity === 'before') return [...candidates].toReversed().find(candidate => candidate.end <= rawPosition)\n\t\treturn candidates.find(candidate => candidate.start >= rawPosition)\n\t}\n\n\t#focusMarkBoundaryForRawPosition(rawPosition: number): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\tconst tokenIndex = this._store.parsing.index()\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok || resolved.value.type !== 'mark') continue\n\t\t\tif (rawPosition !== resolved.value.position.start && rawPosition !== resolved.value.position.end) continue\n\n\t\t\tconst boundary = rawPosition === resolved.value.position.end ? 'end' : 'start'\n\t\t\trecord.tokenElement.focus()\n\t\t\tthis.#placeCollapsedBoundary(\n\t\t\t\trecord.tokenElement,\n\t\t\t\tboundary === 'end' ? record.tokenElement.childNodes.length : 0\n\t\t\t)\n\t\t\tthis._store.caret.location({address: record.address, role: 'markDescendant'})\n\t\t\treturn {ok: true, value: undefined}\n\t\t}\n\n\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t}\n\n\t#placeCaretInTextSurface(surface: HTMLElement, offset: number): void {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\n\t\tconst boundary = this.#boundaryInTextSurface(surface, offset)\n\t\tif (!boundary) return\n\t\tconst range = document.createRange()\n\t\trange.setStart(boundary.node, boundary.offset)\n\t\trange.collapse(true)\n\t\tselection.removeAllRanges()\n\t\tselection.addRange(range)\n\t}\n\n\t#placeCollapsedBoundary(element: HTMLElement, offset: number): void {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\n\t\tconst range = document.createRange()\n\t\trange.setStart(element, Math.min(Math.max(offset, 0), element.childNodes.length))\n\t\trange.collapse(true)\n\t\tselection.removeAllRanges()\n\t\tselection.addRange(range)\n\t}\n\n\t#applyPendingRecovery(): void {\n\t\tconst recovery = this._store.caret.recovery()\n\t\tif (!recovery) return\n\n\t\tif (recovery.kind === 'caret') {\n\t\t\tconst result = this._store.caret.placeAt(recovery.rawPosition, recovery.affinity)\n\t\t\tthis._store.caret.recovery(undefined)\n\t\t\tif (!result.ok) {\n\t\t\t\tthis.diagnostics({\n\t\t\t\t\tkind: 'recoveryFailed',\n\t\t\t\t\treason: `pending caret recovery could not be applied: ${result.reason}`,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst result = this.#placeSelection(recovery.selection)\n\t\tthis._store.caret.recovery(undefined)\n\t\tif (!result.ok) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'recoveryFailed',\n\t\t\t\treason: `pending selection recovery could not be applied: ${result.reason}`,\n\t\t\t})\n\t\t}\n\t}\n\n\t#placeSelection(selection: RawSelection): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\tconst start = this.#findTextTargetForRawPosition(selection.range.start, 'after')\n\t\tconst end = this.#findTextTargetForRawPosition(selection.range.end, 'before')\n\t\tconst browserSelection = window.getSelection()\n\t\tif (!start || !end || !browserSelection) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst startBoundary = this.#boundaryInTextSurface(start.element, selection.range.start - start.start)\n\t\tconst endBoundary = this.#boundaryInTextSurface(end.element, selection.range.end - end.start)\n\t\tif (!startBoundary || !endBoundary) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst range = document.createRange()\n\t\trange.setStart(startBoundary.node, startBoundary.offset)\n\t\trange.setEnd(endBoundary.node, endBoundary.offset)\n\t\tbrowserSelection.removeAllRanges()\n\t\tbrowserSelection.addRange(range)\n\t\treturn {ok: true, value: undefined}\n\t}\n\n\t#boundaryInTextSurface(surface: HTMLElement, offset: number): {node: Text; offset: number} | undefined {\n\t\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\t\tlet remaining = Math.max(0, offset)\n\t\tlet node = nextTextNode(walker)\n\t\twhile (node) {\n\t\t\tif (remaining <= node.length) return {node, offset: remaining}\n\t\t\tremaining -= node.length\n\t\t\tnode = nextTextNode(walker)\n\t\t}\n\n\t\tconst text = surface.firstChild instanceof Text ? surface.firstChild : document.createTextNode('')\n\t\tif (!text.parentNode) surface.append(text)\n\t\treturn {node: text, offset: text.length}\n\t}\n\n\t#clearStaleCaretLocation(): void {\n\t\tconst location = this._store.caret.location()\n\t\tif (!location) return\n\t\tconst resolved = this._store.parsing.index().resolveAddress(location.address)\n\t\tif (!resolved.ok || !this.#pathElements.has(pathKey(location.address.path))) {\n\t\t\tthis._store.caret.location(undefined)\n\t\t}\n\t}\n}","import type {CoreOption} from '../../shared/types'\nimport {annotate} from '../parsing'\n\nexport function createRowContent(options: CoreOption[]): string {\n\tconst firstOption = options[0]\n\tif (!firstOption.markup) return '\\n'\n\treturn annotate(firstOption.markup, {value: '', slot: '', meta: ''})\n}","import type {MarkToken, Token} from '../parsing'\n\nfunction gapText(value: string, a: Token, b: Token): string {\n\treturn value.substring(a.position.end, b.position.start)\n}\n\nfunction isSlotLeadingMark(token: Token): token is MarkToken {\n\treturn token.type === 'mark' && token.descriptor.hasSlot && token.descriptor.segments.length === 1\n}\n\n/**\n * Returns whether two adjacent rows can be merged (Backspace/Delete).\n * Text rows merge when there's a gap between them.\n * Slot-leading mark rows of the same descriptor merge by removing the first mark's suffix.\n */\nexport function canMergeRows(a: Token, b: Token): boolean {\n\tif (a.type === 'text' && b.type === 'text' && b.position.start > a.position.end) return true\n\tif (isSlotLeadingMark(a) && isSlotLeadingMark(b) && a.descriptor === b.descriptor) return true\n\treturn false\n}\n\nexport function addDragRow(value: string, rows: Token[], afterIndex: number, newRowContent: string): string {\n\tif (rows.length === 0) return value + newRowContent\n\tif (value === '' || (rows.length === 1 && rows[0].type === 'text' && rows[0].content === ''))\n\t\treturn newRowContent + newRowContent\n\tif (afterIndex >= rows.length - 1) return value + newRowContent\n\n\tconst insertPos = rows[afterIndex + 1].position.start\n\treturn value.slice(0, insertPos) + newRowContent + value.slice(insertPos)\n}\n\nexport function deleteDragRow(value: string, rows: Token[], index: number): string {\n\tif (rows.length <= 1) return ''\n\n\tif (index >= rows.length - 1) {\n\t\treturn value.slice(0, rows[index - 1].position.end)\n\t}\n\n\treturn value.slice(0, rows[index].position.start) + value.slice(rows[index + 1].position.start)\n}\n\nexport function duplicateDragRow(value: string, rows: Token[], index: number): string {\n\tconst row = rows[index]\n\tconst rowText = value.substring(row.position.start, row.position.end)\n\n\tif (index >= rows.length - 1) return value + rowText\n\n\tconst next = rows[index + 1]\n\tconst gap = gapText(value, row, next)\n\treturn value.slice(0, next.position.start) + rowText + gap + value.slice(next.position.start)\n}\n\n/**\n * Returns the raw-value position of the join point between row[index-1] and row[index]\n * for use as the caret position after a merge.\n */\nexport function getMergeDragRowJoinPos(rows: Token[], index: number): number {\n\tif (index <= 0 || index >= rows.length) return 0\n\tconst prev = rows[index - 1]\n\tif (isSlotLeadingMark(prev) && prev.slot) return prev.slot.end\n\treturn prev.position.end\n}\n\n/**\n * Merges row[index] into row[index - 1] by removing the boundary between them.\n * For text rows: removes the gap between them.\n * For slot-leading marks: removes the first mark's literal suffix, merging slot content.\n */\nexport function mergeDragRows(value: string, rows: Token[], index: number): string {\n\tif (index <= 0 || index >= rows.length) return value\n\tconst prev = rows[index - 1]\n\tconst curr = rows[index]\n\tif (isSlotLeadingMark(prev) && isSlotLeadingMark(curr)) {\n\t\tconst slotEnd = prev.slot ? prev.slot.end : prev.position.end\n\t\treturn value.slice(0, slotEnd) + value.slice(curr.position.start)\n\t}\n\treturn value.slice(0, prev.position.end) + value.slice(curr.position.start)\n}\n\n/**\n * Reorders rows by moving the row at `sourceIndex` to `targetIndex`.\n * Gaps between adjacent rows are extracted from the original value and preserved.\n */\nexport function reorderDragRows(value: string, rows: Token[], sourceIndex: number, targetIndex: number): string {\n\tif (sourceIndex === targetIndex || sourceIndex === targetIndex - 1) return value\n\tif (rows.length < 2) return value\n\tif (sourceIndex < 0 || sourceIndex >= rows.length) return value\n\tif (targetIndex < 0 || targetIndex > rows.length) return value\n\n\tconst texts = rows.map(row => value.substring(row.position.start, row.position.end))\n\tconst gaps = rows.slice(0, -1).map((row, i) => gapText(value, row, rows[i + 1]))\n\n\tconst [movedText] = texts.splice(sourceIndex, 1)\n\t// Remove the gap associated with the source position\n\tconst gapIndex = sourceIndex < gaps.length ? sourceIndex : sourceIndex - 1\n\tgaps.splice(gapIndex, 1)\n\n\tconst insertAt = targetIndex > sourceIndex ? targetIndex - 1 : targetIndex\n\ttexts.splice(insertAt, 0, movedText)\n\t// Insert a gap for the new position (use '' — marks are self-delimiting)\n\tif (insertAt < texts.length - 1) {\n\t\tgaps.splice(insertAt, 0, '')\n\t}\n\n\tconst parts: string[] = []\n\tfor (let i = 0; i < texts.length; i++) {\n\t\tparts.push(texts[i])\n\t\tif (i < gaps.length) {\n\t\t\tparts.push(gaps[i])\n\t\t}\n\t}\n\n\treturn parts.join('')\n}","import type {Token} from '../parsing'\n\nexport const EMPTY_TEXT_TOKEN: Token = {type: 'text', content: '', position: {start: 0, end: 0}}","import type {CaretRecovery} from '../../shared/editorContracts'\nimport {event, watch} from '../../shared/signals'\nimport type {DragAction} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {createRowContent} from '../editing'\nimport type {Token} from '../parsing'\nimport {addDragRow, deleteDragRow, duplicateDragRow, reorderDragRows} from './operations'\nimport {EMPTY_TEXT_TOKEN} from './tokens'\n\nexport class DragFeature {\n\treadonly action = event<DragAction>()\n\n\tconstructor(private readonly store: Store) {}\n\n\t#unsub?: () => void\n\n\tenable() {\n\t\tif (this.#unsub) return\n\n\t\tthis.#unsub = watch(this.action, action => {\n\t\t\tswitch (action.type) {\n\t\t\t\tcase 'reorder':\n\t\t\t\t\tthis.#reorder(action)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'add':\n\t\t\t\t\tthis.#add(action)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.#delete(action)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tthis.#duplicate(action)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#unsub?.()\n\t\tthis.#unsub = undefined\n\t}\n\n\t#reorder(action: Extract<DragAction, {type: 'reorder'}>) {\n\t\tconst value = this.store.value.current()\n\t\tconst rows = this.store.parsing.tokens()\n\t\tconst newValue = reorderDragRows(value, rows, action.source, action.target)\n\t\tif (newValue !== value) {\n\t\t\tthis.store.value.replaceAll(newValue, {\n\t\t\t\tsource: 'drag',\n\t\t\t\trecover: this.#recoverAfterDrag(action, rows, newValue),\n\t\t\t})\n\t\t}\n\t}\n\n\t#add(action: Extract<DragAction, {type: 'add'}>) {\n\t\tconst value = this.store.value.current()\n\t\tconst rawRows = this.store.parsing.tokens()\n\t\tconst rows = rawRows.length > 0 ? rawRows : [EMPTY_TEXT_TOKEN]\n\t\tconst newRowContent = createRowContent(this.store.props.options())\n\t\tconst newValue = addDragRow(value, rows, action.afterIndex, newRowContent)\n\t\tthis.store.value.replaceAll(newValue, {\n\t\t\tsource: 'drag',\n\t\t\trecover: this.#recoverAfterDrag(action, rows, newValue),\n\t\t})\n\t}\n\n\t#delete(action: Extract<DragAction, {type: 'delete'}>) {\n\t\tconst value = this.store.value.current()\n\t\tconst rows = this.store.parsing.tokens()\n\t\tconst newValue = deleteDragRow(value, rows, action.index)\n\t\tthis.store.value.replaceAll(newValue, {\n\t\t\tsource: 'drag',\n\t\t\trecover: this.#recoverAfterDrag(action, rows, newValue),\n\t\t})\n\t}\n\n\t#duplicate(action: Extract<DragAction, {type: 'duplicate'}>) {\n\t\tconst value = this.store.value.current()\n\t\tconst rows = this.store.parsing.tokens()\n\t\tconst newValue = duplicateDragRow(value, rows, action.index)\n\t\tthis.store.value.replaceAll(newValue, {\n\t\t\tsource: 'drag',\n\t\t\trecover: this.#recoverAfterDrag(action, rows, newValue),\n\t\t})\n\t}\n\n\t#recoverAfterDrag(\n\t\taction: DragAction,\n\t\tpreviousRows: readonly Token[],\n\t\tnextValue: string\n\t): CaretRecovery | undefined {\n\t\tif (action.type === 'add') {\n\t\t\tconst after = previousRows.at(action.afterIndex)\n\t\t\tconst rawPosition = after ? after.position.end : nextValue.length\n\t\t\treturn {kind: 'caret', rawPosition}\n\t\t}\n\t\tif (action.type === 'duplicate') {\n\t\t\tconst row = previousRows.at(action.index)\n\t\t\treturn row ? {kind: 'caret', rawPosition: row.position.end} : undefined\n\t\t}\n\t\tif (action.type === 'delete') {\n\t\t\tconst next =\n\t\t\t\tpreviousRows.at(action.index + 1) ?? (action.index > 0 ? previousRows.at(action.index - 1) : undefined)\n\t\t\treturn next\n\t\t\t\t? {kind: 'caret', rawPosition: Math.min(next.position.start, nextValue.length)}\n\t\t\t\t: {kind: 'caret', rawPosition: 0}\n\t\t}\n\t\tconst moved = previousRows.at(action.source)\n\t\treturn moved ? {kind: 'caret', rawPosition: Math.min(moved.position.start, nextValue.length)} : undefined\n\t}\n}","export function getDragDropPosition(clientY: number, rect: DOMRect): 'before' | 'after' {\n\treturn clientY < rect.top + rect.height / 2 ? 'before' : 'after'\n}\n\nexport function parseDragSourceIndex(dataTransfer: DataTransfer): number | null {\n\tconst index = parseInt(dataTransfer.getData('text/plain'), 10)\n\treturn isNaN(index) ? null : index\n}\n\nexport function getDragTargetIndex(blockIndex: number, position: 'before' | 'after'): number {\n\treturn position === 'before' ? blockIndex : blockIndex + 1\n}","import type {DraggableConfig} from '../../shared/types'\n\nexport function getAlwaysShowHandle(draggable: boolean | DraggableConfig): boolean {\n\treturn typeof draggable === 'object' && !!draggable.alwaysShowHandle\n}","import {KEYBOARD} from '../../shared/constants'\nimport {effectScope, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\nimport {selectAllText} from '../caret'\n\nexport function enableArrowNav(store: Store): () => void {\n\tconst container = store.dom.container()\n\tif (!container) return () => {}\n\n\tconst scope = effectScope(() => {\n\t\tlisten(container, 'keydown', e => {\n\t\t\tif (store.slots.isBlock()) return\n\n\t\t\tif (e.key === KEYBOARD.LEFT) {\n\t\t\t\tshiftFocus(store, e, 'prev')\n\t\t\t} else if (e.key === KEYBOARD.RIGHT) {\n\t\t\t\tshiftFocus(store, e, 'next')\n\t\t\t}\n\n\t\t\tselectAllText(store, e)\n\t\t})\n\t})\n\n\treturn () => scope()\n}\n\nfunction shiftFocus(store: Store, event: KeyboardEvent, direction: 'prev' | 'next'): boolean {\n\tconst location = store.caret.location()\n\tif (!location) return false\n\n\tconst token = store.parsing.index().resolveAddress(location.address)\n\tif (!token.ok) return false\n\n\tconst focusedMark = token.value.type === 'mark' && location.role !== 'text'\n\tif (!focusedMark) {\n\t\tconst selection = store.dom.readRawSelection()\n\t\tif (!selection.ok || selection.value.range.start !== selection.value.range.end) return false\n\n\t\tconst atStart = selection.value.range.start <= token.value.position.start\n\t\tconst atEnd = selection.value.range.end >= token.value.position.end\n\t\tif (direction === 'prev' && !atStart) return false\n\t\tif (direction === 'next' && !atEnd) return false\n\t}\n\n\tconst path = location.address.path\n\tconst siblingIndex = direction === 'prev' ? path[path.length - 1] - 1 : path[path.length - 1] + 1\n\tconst siblingPath = [...path.slice(0, -1), siblingIndex]\n\tconst siblingAddress = store.parsing.index().addressFor(siblingPath)\n\tif (!siblingAddress) return false\n\n\tevent.preventDefault()\n\tconst result = store.caret.focus(siblingAddress, direction === 'prev' ? 'end' : 'start')\n\tif (!result.ok) return false\n\tconst sibling = store.parsing.index().resolve(siblingPath)\n\tif (sibling?.type === 'mark') return true\n\n\tif (direction === 'prev') {\n\t\tstore.caret.placeAt(sibling?.position.end ?? 0, 'before')\n\t\treturn true\n\t}\n\tstore.caret.placeAt(sibling?.position.start ?? 0, 'after')\n\treturn true\n}","import {htmlChildren, isHtmlElement} from '../../shared/checkers'\nimport {KEYBOARD} from '../../shared/constants'\nimport type {BoundaryPositionResult, RawRange, RawSelectionResult} from '../../shared/editorContracts'\nimport {effectScope, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\nimport {Caret} from '../caret'\nimport {consumeMarkupPaste} from '../clipboard'\nimport {addDragRow, getMergeDragRowJoinPos, mergeDragRows, canMergeRows} from '../drag/operations'\nimport {createRowContent} from '../editing'\nimport type {Token} from '../parsing'\n\ntype InputTargetRange = {\n\treadonly startContainer: Node\n\treadonly startOffset: number\n\treadonly endContainer: Node\n\treadonly endOffset: number\n}\n\ntype RawSelectionFailureReason = Extract<RawSelectionResult, {ok: false}>['reason']\n\nfunction isTextLikeRow(token: Token): boolean {\n\tif (token.type === 'text') return true\n\treturn token.descriptor.hasSlot && token.descriptor.segments.length === 1\n}\n\nexport function enableBlockEdit(store: Store): () => void {\n\tconst container = store.dom.container()\n\tif (!container) return () => {}\n\n\tconst scope = effectScope(() => {\n\t\tlisten(container, 'keydown', e => {\n\t\t\tif (!store.slots.isBlock()) return\n\n\t\t\tif (e.key === KEYBOARD.LEFT || e.key === KEYBOARD.RIGHT) {\n\t\t\t\thandleBlockArrowLeftRight(store, e, e.key === KEYBOARD.LEFT ? 'left' : 'right')\n\t\t\t} else if (e.key === KEYBOARD.UP || e.key === KEYBOARD.DOWN) {\n\t\t\t\thandleArrowUpDown(store, e)\n\t\t\t}\n\n\t\t\thandleDelete(store, e)\n\t\t\thandleEnter(store, e)\n\t\t})\n\n\t\tlisten(\n\t\t\tcontainer,\n\t\t\t'beforeinput',\n\t\t\te => {\n\t\t\t\tif (!store.slots.isBlock()) return\n\t\t\t\tif (e.defaultPrevented) return\n\t\t\t\thandleBlockBeforeInput(store, e)\n\t\t\t},\n\t\t\ttrue\n\t\t)\n\t})\n\n\treturn () => scope()\n}\n\nfunction handleDelete(store: Store, event: KeyboardEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(\n\t\tdiv => div === document.activeElement || div.contains(document.activeElement)\n\t)\n\tif (blockIndex === -1) return\n\n\tconst rows = store.parsing.tokens()\n\tif (blockIndex >= rows.length) return\n\n\tconst token = rows[blockIndex]\n\tconst value = store.value.current()\n\n\tif (event.key === KEYBOARD.BACKSPACE) {\n\t\tconst blockDiv = blockDivs[blockIndex]\n\t\tconst caretAtStart = Caret.getCaretIndex(blockDiv) === 0\n\n\t\tconst blockText = 'content' in token ? token.content : ''\n\t\tif (blockText === '') {\n\t\t\tevent.preventDefault()\n\t\t\tconst newValue =\n\t\t\t\trows.length <= 1\n\t\t\t\t\t? ''\n\t\t\t\t\t: (() => {\n\t\t\t\t\t\t\tif (blockIndex >= rows.length - 1) return value.slice(0, rows[blockIndex - 1].position.end)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tvalue.slice(0, rows[blockIndex].position.start) +\n\t\t\t\t\t\t\t\tvalue.slice(rows[blockIndex + 1].position.start)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})()\n\t\t\tconst previous = rows.at(Math.max(0, blockIndex - 1))\n\t\t\tstore.value.replaceAll(newValue, {\n\t\t\t\tsource: 'block',\n\t\t\t\trecover: {kind: 'caret', rawPosition: previous ? previous.position.end : 0},\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (caretAtStart && blockIndex > 0) {\n\t\t\tconst prevToken = rows[blockIndex - 1]\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tif (canMergeRows(prevToken, currToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex)\n\t\t\t\tstore.value.replaceAll(newValue, {\n\t\t\t\t\tsource: 'block',\n\t\t\t\t\trecover: {kind: 'caret', rawPosition: joinPos},\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst target = blockDivs[blockIndex - 1]\n\t\t\t\tfocusRow(store, prevToken, target, 'end')\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n\n\tif (event.key === KEYBOARD.DELETE) {\n\t\tconst blockDiv = blockDivs[blockIndex]\n\t\tconst caretIndex = Caret.getCaretIndex(blockDiv)\n\t\tconst caretAtEnd = caretIndex === blockDiv.textContent.length\n\t\tconst caretAtStart = caretIndex === 0\n\n\t\tif (caretAtStart && blockIndex > 0) {\n\t\t\tconst prevToken = rows[blockIndex - 1]\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tif (canMergeRows(prevToken, currToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex)\n\t\t\t\tstore.value.replaceAll(newValue, {\n\t\t\t\t\tsource: 'block',\n\t\t\t\t\trecover: {kind: 'caret', rawPosition: joinPos},\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst target = blockDivs[blockIndex - 1]\n\t\t\t\tfocusRow(store, prevToken, target, 'end')\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (caretAtEnd && blockIndex < rows.length - 1) {\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tconst nextToken = rows[blockIndex + 1]\n\t\t\tif (canMergeRows(currToken, nextToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex + 1)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex + 1)\n\t\t\t\tstore.value.replaceAll(newValue, {\n\t\t\t\t\tsource: 'block',\n\t\t\t\t\trecover: {kind: 'caret', rawPosition: joinPos},\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst target = blockDivs[blockIndex + 1]\n\t\t\t\tfocusRow(store, nextToken, target, 'start')\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction handleEnter(store: Store, event: KeyboardEvent) {\n\tif (event.key !== KEYBOARD.ENTER) return\n\tif (event.shiftKey) return\n\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tevent.preventDefault()\n\n\tconst blockDivs = htmlChildren(container)\n\tlet blockIndex = -1\n\tfor (let i = 0; i < blockDivs.length; i++) {\n\t\tif (blockDivs[i] === activeElement || blockDivs[i].contains(activeElement)) {\n\t\t\tblockIndex = i\n\t\t\tbreak\n\t\t}\n\t}\n\tif (blockIndex === -1) return\n\n\tconst rows = store.parsing.tokens()\n\tconst token = rows[blockIndex]\n\tconst value = store.value.current()\n\n\tconst newRowContent = createRowContent(store.props.options())\n\n\tif (!isTextLikeRow(token)) {\n\t\tconst newValue = addDragRow(value, rows, blockIndex, newRowContent)\n\t\tstore.value.replaceAll(newValue, {\n\t\t\tsource: 'block',\n\t\t\trecover: {kind: 'caret', rawPosition: token.position.end + newRowContent.length},\n\t\t})\n\t\treturn\n\t}\n\n\tconst raw = store.dom.readRawSelection()\n\tconst absolutePos = raw.ok ? raw.value.range.start : token.position.end\n\tstore.value.replaceRange({start: absolutePos, end: absolutePos}, newRowContent, {\n\t\tsource: 'block',\n\t\trecover: {kind: 'caret', rawPosition: absolutePos + newRowContent.length},\n\t})\n}\n\nfunction focusRow(store: Store, token: Token, row: HTMLElement, caret: 'start' | 'end'): void {\n\tif (token.type === 'mark') {\n\t\tconst path = store.parsing.index().pathFor(token)\n\t\tconst address = path ? store.parsing.index().addressFor(path) : undefined\n\t\tif (address && store.caret.focus(address).ok) return\n\t}\n\n\trow.focus()\n\tif (caret === 'start') {\n\t\tCaret.trySetIndex(row, 0)\n\t\treturn\n\t}\n\tCaret.setCaretToEnd(row)\n}\n\nfunction handleBlockArrowLeftRight(store: Store, event: KeyboardEvent, direction: 'left' | 'right'): boolean {\n\tconst container = store.dom.container()\n\tif (!container) return false\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return false\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return false\n\n\tconst blockDiv = blockDivs[blockIndex]\n\n\tif (direction === 'left') {\n\t\tif (Caret.getCaretIndex(blockDiv) !== 0) return false\n\t\tif (blockIndex === 0) return true\n\t\tevent.preventDefault()\n\t\tconst prevBlock = blockDivs[blockIndex - 1]\n\t\tprevBlock.focus()\n\t\tCaret.setCaretToEnd(prevBlock)\n\t\treturn true\n\t}\n\n\tconst caretIndex = Caret.getCaretIndex(blockDiv)\n\tconst textLen = blockDiv.textContent.length\n\tif (caretIndex !== textLen) return false\n\tif (blockIndex >= blockDivs.length - 1) return true\n\tevent.preventDefault()\n\tconst nextBlock = blockDivs[blockIndex + 1]\n\tnextBlock.focus()\n\tCaret.trySetIndex(nextBlock, 0)\n\treturn true\n}\n\nfunction handleArrowUpDown(store: Store, event: KeyboardEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return\n\n\tconst blockDiv = blockDivs[blockIndex]\n\n\tif (event.key === KEYBOARD.UP) {\n\t\tif (!Caret.isCaretOnFirstLine(blockDiv)) return\n\t\tif (blockIndex === 0) return\n\n\t\tevent.preventDefault()\n\t\tconst caretRect = Caret.getCaretRect()\n\t\tconst caretX = caretRect?.left ?? blockDiv.getBoundingClientRect().left\n\t\tconst prevBlockDiv = blockDivs[blockIndex - 1]\n\t\tprevBlockDiv.focus()\n\t\tconst prevRect = prevBlockDiv.getBoundingClientRect()\n\t\tCaret.setAtX(prevBlockDiv, caretX, prevRect.bottom - 4)\n\t} else if (event.key === KEYBOARD.DOWN) {\n\t\tif (!Caret.isCaretOnLastLine(blockDiv)) return\n\t\tif (blockIndex >= blockDivs.length - 1) return\n\n\t\tevent.preventDefault()\n\t\tconst caretRect = Caret.getCaretRect()\n\t\tconst caretX = caretRect?.left ?? blockDiv.getBoundingClientRect().left\n\t\tconst nextBlockDiv = blockDivs[blockIndex + 1]\n\t\tnextBlockDiv.focus()\n\t\tconst nextRect = nextBlockDiv.getBoundingClientRect()\n\t\tCaret.setAtX(nextBlockDiv, caretX, nextRect.top + 4)\n\t}\n}\n\nfunction handleBlockBeforeInput(store: Store, event: InputEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return\n\n\tswitch (event.inputType) {\n\t\tcase 'insertText': {\n\t\t\tconst data = event.data ?? ''\n\t\t\treplaceBlockRange(store, event, data)\n\t\t\tbreak\n\t\t}\n\t\tcase 'insertFromPaste':\n\t\tcase 'insertReplacementText': {\n\t\t\tconst c = store.dom.container()\n\t\t\tconst markup = c ? consumeMarkupPaste(c) : undefined\n\t\t\tconst pasteData = markup ?? event.dataTransfer?.getData('text/plain') ?? ''\n\t\t\treplaceBlockRange(store, event, pasteData)\n\t\t\tbreak\n\t\t}\n\t\tcase 'deleteContentBackward':\n\t\tcase 'deleteContentForward':\n\t\tcase 'deleteWordBackward':\n\t\tcase 'deleteWordForward':\n\t\tcase 'deleteSoftLineBackward':\n\t\tcase 'deleteSoftLineForward': {\n\t\t\treplaceBlockRange(store, event, '')\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction replaceBlockRange(store: Store, event: InputEvent, replacement: string): void {\n\tconst raw = rawRangeFromInputEvent(store, event)\n\tif (!raw.ok) return\n\tconst range = rangeForBlockInput(store, event, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.value.replaceRange(range, replacement, {\n\t\tsource: 'block',\n\t\trecover: {kind: 'caret', rawPosition: range.start + replacement.length},\n\t})\n}\n\nfunction rawRangeFromInputEvent(store: Store, event: InputEvent): RawSelectionResult {\n\tconst ranges = event.getTargetRanges()\n\tif (ranges.length === 0) return store.dom.readRawSelection()\n\treturn rawRangeFromTargetRange(store, ranges[0])\n}\n\nfunction rawRangeFromTargetRange(store: Store, range: InputTargetRange): RawSelectionResult {\n\tconst start = store.dom.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\tconst end = store.dom.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\tif (!start.ok) return {ok: false, reason: rawSelectionReason(start)}\n\tif (!end.ok) return {ok: false, reason: rawSelectionReason(end)}\n\treturn {\n\t\tok: true,\n\t\tvalue: {\n\t\t\trange:\n\t\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value},\n\t\t},\n\t}\n}\n\nfunction rawSelectionReason(result: BoundaryPositionResult): RawSelectionFailureReason {\n\tif (result.ok) return 'invalidBoundary'\n\tif (result.reason === 'composing') return 'invalidBoundary'\n\treturn result.reason\n}\n\nfunction rangeForBlockInput(store: Store, event: InputEvent, range: RawRange): RawRange | undefined {\n\tif (!event.inputType.startsWith('delete')) return range\n\tif (range.start !== range.end) return range\n\n\tif (event.inputType.endsWith('Backward') && range.start > 0) {\n\t\treturn {start: range.start - 1, end: range.start}\n\t}\n\tif (event.inputType.endsWith('Forward') && range.end < store.value.current().length) {\n\t\treturn {start: range.start, end: range.end + 1}\n\t}\n\treturn undefined\n}","import {KEYBOARD} from '../../shared/constants'\nimport type {BoundaryPositionResult, RawRange, RawSelectionResult} from '../../shared/editorContracts'\nimport {effectScope, listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\nimport {isFullSelection} from '../caret'\nimport {captureMarkupPaste, consumeMarkupPaste} from '../clipboard'\nimport type {Token} from '../parsing'\n\ntype InputTargetRange = {\n\treadonly startContainer: Node\n\treadonly startOffset: number\n\treadonly endContainer: Node\n\treadonly endOffset: number\n}\n\ntype SpanInputTarget = {\n\tcontent: string\n\tcaret: number\n}\n\ntype RawSelectionFailureReason = Extract<RawSelectionResult, {ok: false}>['reason']\n\nexport function enableInput(store: Store): () => void {\n\tconst container = store.dom.container()\n\tif (!container) return () => {}\n\tlet compositionRange: RawRange | undefined\n\n\tconst scope = effectScope(() => {\n\t\tlisten(container, 'paste', e => {\n\t\t\tconst c = store.dom.container()\n\t\t\tif (c) captureMarkupPaste(e, c)\n\t\t\thandlePaste(store, e)\n\t\t})\n\n\t\tlisten(container, 'compositionstart', () => {\n\t\t\tconst selection = store.dom.readRawSelection()\n\t\t\tcompositionRange = selection.ok ? selection.value.range : undefined\n\t\t\tstore.dom.compositionStarted()\n\t\t})\n\n\t\tlisten(container, 'compositionend', e => {\n\t\t\tconst range = compositionRange\n\t\t\tcompositionRange = undefined\n\t\t\tstore.dom.compositionEnded()\n\t\t\tif (store.slots.isBlock()) return\n\t\t\tif (!range) return\n\t\t\tconst data = e.data\n\t\t\tstore.value.replaceRange(range, data, {\n\t\t\t\tsource: 'input',\n\t\t\t\trecover: {kind: 'caret', rawPosition: range.start + data.length},\n\t\t\t})\n\t\t})\n\n\t\tlisten(\n\t\t\tcontainer,\n\t\t\t'beforeinput',\n\t\t\te => {\n\t\t\t\thandleBeforeInput(store, e)\n\t\t\t},\n\t\t\ttrue\n\t\t)\n\n\t\tlisten(container, 'keydown', e => {\n\t\t\thandleDeleteKey(store, e)\n\t\t})\n\t})\n\n\treturn () => scope()\n}\n\nfunction handleDeleteKey(store: Store, event: KeyboardEvent): void {\n\tif (store.slots.isBlock()) return\n\tif (event.key !== KEYBOARD.BACKSPACE && event.key !== KEYBOARD.DELETE) return\n\n\tif (store.caret.selecting() === 'all' && isFullSelection(store)) {\n\t\tevent.preventDefault()\n\t\treplaceAllContentWith(store, '')\n\t\treturn\n\t}\n\tif (store.caret.selecting() === 'all') store.caret.selecting(undefined)\n\n\tconst raw = store.dom.readRawSelection()\n\tif (!raw.ok) return\n\n\tconst inputType = event.key === KEYBOARD.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward'\n\tconst range = rangeForDelete(store, inputType, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.value.replaceRange(range, '', {\n\t\tsource: 'input',\n\t\trecover: {kind: 'caret', rawPosition: range.start},\n\t})\n}\n\nexport function handleBeforeInput(store: Store, event: InputEvent): void {\n\tconst selecting = store.caret.selecting()\n\tif (selecting === 'all' && isFullSelection(store)) {\n\t\tif (event.inputType === 'insertFromPaste') {\n\t\t\tevent.preventDefault()\n\t\t\treturn\n\t\t}\n\t\tevent.preventDefault()\n\t\tconst newContent = event.inputType.startsWith('delete') ? '' : (event.data ?? '')\n\t\treplaceAllContentWith(store, newContent)\n\t\treturn\n\t}\n\tif (selecting === 'all') store.caret.selecting(undefined)\n\n\tif (store.slots.isBlock()) return\n\n\tconst raw = rawRangeFromInputEvent(store, event)\n\tif (!raw.ok) return\n\n\tconst replacement = replacementForInput(store, event)\n\tif (replacement === undefined) return\n\n\tconst range = rangeForInput(store, event, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.value.replaceRange(range, replacement, {\n\t\tsource: 'input',\n\t\trecover: {kind: 'caret', rawPosition: range.start + replacement.length},\n\t})\n}\n\nexport function applySpanInput(focus: SpanInputTarget, event: InputEvent): boolean {\n\tconst offset = focus.caret\n\tconst content = focus.content\n\tlet newContent: string\n\tlet newCaret: number\n\n\tswitch (event.inputType) {\n\t\tcase 'insertText': {\n\t\t\tevent.preventDefault()\n\t\t\tconst data = event.data ?? ''\n\t\t\tnewContent = content.slice(0, offset) + data + content.slice(offset)\n\t\t\tnewCaret = offset + data.length\n\t\t\tbreak\n\t\t}\n\t\tcase 'deleteContentBackward':\n\t\tcase 'deleteContentForward':\n\t\tcase 'deleteWordBackward':\n\t\tcase 'deleteWordForward':\n\t\tcase 'deleteSoftLineBackward':\n\t\tcase 'deleteSoftLineForward': {\n\t\t\tconst ranges = event.getTargetRanges()\n\t\t\tlet startOffset: number\n\t\t\tlet endOffset: number\n\t\t\tif (ranges.length > 0 && ranges[0].startOffset !== ranges[0].endOffset) {\n\t\t\t\tstartOffset = ranges[0].startOffset\n\t\t\t\tendOffset = ranges[0].endOffset\n\t\t\t} else {\n\t\t\t\tif (event.inputType === 'deleteContentBackward' && offset > 0) {\n\t\t\t\t\tstartOffset = offset - 1\n\t\t\t\t\tendOffset = offset\n\t\t\t\t} else if (event.inputType === 'deleteContentForward' && offset < content.length) {\n\t\t\t\t\tstartOffset = offset\n\t\t\t\t\tendOffset = offset + 1\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tnewContent = content.slice(0, startOffset) + content.slice(endOffset)\n\t\t\tnewCaret = startOffset\n\t\t\tbreak\n\t\t}\n\t\tcase 'insertFromPaste':\n\t\tcase 'insertReplacementText': {\n\t\t\tconst text = event.dataTransfer?.getData('text/plain') ?? ''\n\t\t\tconst ranges = event.getTargetRanges()\n\t\t\tconst start = ranges[0]?.startOffset ?? offset\n\t\t\tconst end = ranges[0]?.endOffset ?? offset\n\t\t\tevent.preventDefault()\n\t\t\tnewContent = content.slice(0, start) + text + content.slice(end)\n\t\t\tnewCaret = start + text.length\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\treturn false\n\t}\n\n\tfocus.content = newContent\n\tfocus.caret = newCaret\n\treturn true\n}\n\nfunction rawRangeFromInputEvent(store: Store, event: InputEvent): RawSelectionResult {\n\tconst ranges = getTargetRanges(event)\n\tif (ranges.length === 0) return store.dom.readRawSelection()\n\treturn rawRangeFromTargetRange(store, ranges[0])\n}\n\nfunction rawRangeFromTargetRange(store: Store, range: InputTargetRange): RawSelectionResult {\n\tconst start = store.dom.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\tconst end = store.dom.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\tif (!start.ok) return {ok: false, reason: rawSelectionReason(start)}\n\tif (!end.ok) return {ok: false, reason: rawSelectionReason(end)}\n\treturn {\n\t\tok: true,\n\t\tvalue: {\n\t\t\trange:\n\t\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value},\n\t\t},\n\t}\n}\n\nfunction rawSelectionReason(result: BoundaryPositionResult): RawSelectionFailureReason {\n\tif (result.ok) return 'invalidBoundary'\n\tif (result.reason === 'composing') return 'invalidBoundary'\n\treturn result.reason\n}\n\nfunction getTargetRanges(event: InputEvent): readonly InputTargetRange[] {\n\treturn event.getTargetRanges()\n}\n\nfunction replacementForInput(store: Store, event: InputEvent): string | undefined {\n\tif (event.inputType.startsWith('delete')) return ''\n\tif (event.inputType === 'insertFromPaste' || event.inputType === 'insertReplacementText') {\n\t\tconst container = store.dom.container()\n\t\tconst markup = container ? consumeMarkupPaste(container) : undefined\n\t\treturn markup ?? event.dataTransfer?.getData('text/plain') ?? event.data ?? ''\n\t}\n\tif (event.inputType === 'insertText') return event.data ?? ''\n\treturn undefined\n}\n\nfunction rangeForInput(store: Store, event: InputEvent, range: RawRange): RawRange | undefined {\n\tif (!event.inputType.startsWith('delete')) return range\n\treturn rangeForDelete(store, event.inputType, range)\n}\n\nfunction rangeForDelete(store: Store, inputType: string, range: RawRange): RawRange | undefined {\n\tif (range.start !== range.end) return range\n\n\tconst adjacentMark = adjacentMarkRange(store.parsing.tokens(), range.start, inputType.endsWith('Backward'))\n\tif (adjacentMark) return adjacentMark\n\n\tif (inputType.endsWith('Backward') && range.start > 0) {\n\t\treturn {start: range.start - 1, end: range.start}\n\t}\n\tif (inputType.endsWith('Forward') && range.end < store.value.current().length) {\n\t\treturn {start: range.start, end: range.end + 1}\n\t}\n\treturn undefined\n}\n\nfunction adjacentMarkRange(tokens: readonly Token[], position: number, backward: boolean): RawRange | undefined {\n\tfor (const token of tokens) {\n\t\tconst nested = token.type === 'mark' ? adjacentMarkRange(token.children, position, backward) : undefined\n\t\tif (nested) return nested\n\t\tif (token.type === 'mark' && (backward ? token.position.end === position : token.position.start === position)) {\n\t\t\treturn token.position\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function handlePaste(store: Store, event: ClipboardEvent): void {\n\tconst selecting = store.caret.selecting()\n\tif (selecting !== 'all' || !isFullSelection(store)) {\n\t\tif (selecting === 'all') store.caret.selecting(undefined)\n\t\treturn\n\t}\n\n\tevent.preventDefault()\n\tconst c = store.dom.container()\n\tconst markup = c ? consumeMarkupPaste(c) : undefined\n\tconst newContent = markup ?? event.clipboardData?.getData('text/plain') ?? ''\n\treplaceAllContentWith(store, newContent)\n}\n\nexport function replaceAllContentWith(store: Store, newContent: string): void {\n\tstore.caret.selecting(undefined)\n\tstore.value.replaceAll(newContent, {\n\t\tsource: 'input',\n\t\trecover: {kind: 'caret', rawPosition: newContent.length},\n\t})\n}","import type {Feature} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {enableArrowNav} from './arrowNav'\nimport {enableBlockEdit} from './blockEdit'\nimport {enableInput} from './input'\n\nexport class KeyboardFeature implements Feature {\n\t#disposers: Array<() => void> = []\n\n\tconstructor(private readonly _store: Store) {}\n\n\tenable() {\n\t\tif (this.#disposers.length) return\n\t\tthis.#disposers = [enableInput(this._store), enableBlockEdit(this._store), enableArrowNav(this._store)]\n\t}\n\n\tdisable() {\n\t\tthis.#disposers.forEach(d => d())\n\t\tthis.#disposers = []\n\t}\n}","import {event} from '../../shared/signals'\nimport type {Feature} from '../../shared/types'\n\nexport class LifecycleFeature implements Feature {\n\treadonly mounted = event()\n\treadonly unmounted = event()\n\treadonly rendered = event()\n\n\tenable() {}\n\tdisable() {}\n}","import type {EditResult, MarkPatch, MarkSnapshot, TokenAddress, TokenShapeSnapshot} from '../../shared/editorContracts'\nimport type {Store} from '../../store'\nimport type {MarkToken} from '../parsing'\nimport {annotate} from '../parsing/parser/utils/annotate'\nimport {snapshotTokenShape} from '../parsing/tokenIndex'\n\nexport class MarkController {\n\treadonly #shape: TokenShapeSnapshot\n\n\tconstructor(\n\t\tprivate readonly store: Store,\n\t\tprivate readonly address: TokenAddress,\n\t\tprivate readonly snapshot: MarkSnapshot,\n\t\tshape: TokenShapeSnapshot\n\t) {\n\t\tthis.#shape = shape\n\t}\n\n\tstatic fromToken(store: Store, token: MarkToken): MarkController {\n\t\tconst index = store.parsing.index()\n\t\tconst path = index.pathFor(token)\n\t\tif (!path) throw new Error('Cannot create MarkController for unindexed token')\n\t\tconst address = index.addressFor(path)\n\t\tif (!address) throw new Error('Cannot create MarkController for unresolved token path')\n\n\t\treturn new MarkController(\n\t\t\tstore,\n\t\t\taddress,\n\t\t\t{\n\t\t\t\tvalue: token.value,\n\t\t\t\tmeta: token.meta,\n\t\t\t\tslot: token.slot?.content,\n\t\t\t\treadOnly: store.props.readOnly(),\n\t\t\t},\n\t\t\tsnapshotTokenShape(token)\n\t\t)\n\t}\n\n\tget value(): string {\n\t\treturn this.snapshot.value\n\t}\n\n\tget meta(): string | undefined {\n\t\treturn this.snapshot.meta\n\t}\n\n\tget slot(): string | undefined {\n\t\treturn this.snapshot.slot\n\t}\n\n\tget readOnly(): boolean {\n\t\treturn this.snapshot.readOnly\n\t}\n\n\tremove(): EditResult {\n\t\tconst resolved = this.#resolve()\n\t\tif (!resolved.ok) return resolved\n\t\treturn this.store.value.replaceRange(resolved.value.position, '', {source: 'mark'})\n\t}\n\n\tupdate(patch: MarkPatch): EditResult {\n\t\tconst resolved = this.#resolve()\n\t\tif (!resolved.ok) return resolved\n\n\t\tconst token = resolved.value\n\t\tconst value = patch.value ?? token.value\n\t\tconst meta =\n\t\t\tpatch.meta?.kind === 'clear' ? undefined : patch.meta?.kind === 'set' ? patch.meta.value : token.meta\n\t\tconst slot =\n\t\t\tpatch.slot?.kind === 'clear'\n\t\t\t\t? undefined\n\t\t\t\t: patch.slot?.kind === 'set'\n\t\t\t\t\t? patch.slot.value\n\t\t\t\t\t: token.slot?.content\n\t\tconst serialized = this.#serialize(token, {value, meta, slot})\n\n\t\treturn this.store.value.replaceRange(token.position, serialized, {source: 'mark'})\n\t}\n\n\t#serialize(token: MarkToken, fields: {value: string; meta?: string; slot?: string}): string {\n\t\treturn annotate(token.descriptor.markup, {\n\t\t\tvalue: fields.value,\n\t\t\tmeta: token.descriptor.gapTypes.includes('meta') ? (fields.meta ?? '') : undefined,\n\t\t\tslot: token.descriptor.hasSlot ? (fields.slot ?? '') : undefined,\n\t\t})\n\t}\n\n\t#resolve(): {ok: true; value: MarkToken} | {ok: false; reason: 'stale' | 'readOnly'} {\n\t\tif (this.store.props.readOnly()) return {ok: false, reason: 'readOnly'}\n\t\tconst resolved = this.store.parsing.index().resolveAddress(this.address, this.#shape)\n\t\tif (!resolved.ok || resolved.value.type !== 'mark') return {ok: false, reason: 'stale'}\n\t\treturn {ok: true, value: resolved.value}\n\t}\n}","/**\n * Converts object with camelCase data attribute keys to kebab-case data-* attributes\n *\n * Takes keys like 'dataUserId' and converts to 'data-user-id'\n *\n * @param obj - Object potentially containing camelCase data attribute keys\n * @returns New object with converted data attributes\n *\n * @example\n * convertDataAttrs({ dataUserId: '123', dataUserName: 'John', className: 'test' })\n * // Returns: { 'data-user-id': '123', 'data-user-name': 'John', className: 'test' }\n *\n * convertDataAttrs({ dataTestId * @example\n: 'test', dataFoo: 'bar' })\n * // Returns: { 'data-test-id': 'test', 'data-foo': 'bar' }\n */\nexport function convertDataAttrs(obj: Record<string, unknown> | undefined): Record<string, unknown> {\n\tif (!obj) return {}\n\n\treturn Object.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => {\n\t\t\tif (key.startsWith('data') && key.length > 4 && key[4] === key[4].toUpperCase()) {\n\t\t\t\tconst kebab = key\n\t\t\t\t\t.slice(4)\n\t\t\t\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t\t\t\t.toLowerCase()\n\t\t\t\treturn [`data-${kebab}`, value]\n\t\t\t}\n\t\t\treturn [key, value]\n\t\t})\n\t)\n}","export function resolveOptionSlot<T extends object>(optionConfig: T | ((base: T) => T) | undefined, baseProps: T): T {\n\tif (optionConfig !== undefined) {\n\t\treturn typeof optionConfig === 'function' ? optionConfig(baseProps) : optionConfig\n\t}\n\treturn baseProps\n}","import type {CoreOption, CoreSlotProps, CoreSlots, Slot} from '../../shared/types'\nimport {convertDataAttrs} from '../../shared/utils/dataAttributes'\nimport type {Token} from '../parsing'\nimport {resolveOptionSlot} from './resolveOptionSlot'\n\nexport type SlotName = 'container' | 'block' | 'span'\n\nconst defaultSlots: Record<SlotName, string> = {\n\tcontainer: 'div',\n\tblock: 'div',\n\tspan: 'span',\n}\n\nexport function resolveSlot(slotName: SlotName, slots: unknown): Slot {\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- `slots` is `CoreSlots | undefined` at runtime; typed as unknown for Vue Ref<T> cross-framework compat\n\treturn ((slots as CoreSlots | undefined)?.[slotName] ?? defaultSlots[slotName]) as Slot\n}\n\nexport function resolveSlotProps(slotName: SlotName, slotProps: unknown): Record<string, unknown> | undefined {\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- `slotProps` is `CoreSlotProps | undefined` at runtime; typed as unknown for Vue Ref<T> cross-framework compat\n\tconst props = (slotProps as CoreSlotProps | undefined)?.[slotName]\n\treturn props ? convertDataAttrs(props) : undefined\n}\n\ntype SlotProp = Record<string, unknown> | ((base: Record<string, unknown>) => Record<string, unknown>)\n\n/**\n * Internal view of a framework-specific Option for slot resolution.\n * Framework Option types (React, Vue) extend CoreOption with these properties.\n */\nexport interface SlotOption extends Omit<CoreOption, 'overlay'> {\n\tMark?: Slot\n\tmark?: SlotProp\n\tOverlay?: Slot\n\toverlay?: SlotProp\n}\n\nexport function resolveOverlaySlot(\n\tglobalComponent: Slot | undefined,\n\toption?: SlotOption,\n\tdefaultComponent?: Slot\n): readonly [Slot, Record<string, unknown>] {\n\tconst Component = option?.Overlay ?? globalComponent ?? defaultComponent\n\tif (!Component)\n\t\tthrow new Error(\n\t\t\t'No overlay component found. Provide either option.Overlay, global Overlay, or a defaultComponent.'\n\t\t)\n\tconst props = resolveOptionSlot<Record<string, unknown>>(option?.overlay, {})\n\treturn [Component, props]\n}\n\nexport function resolveMarkSlot(\n\ttoken: Token,\n\ttokenOptions: SlotOption[] | undefined,\n\tGlobalMark: Slot | undefined,\n\tGlobalSpan: Slot | undefined\n): readonly [Slot, Record<string, unknown>] {\n\tif (token.type === 'text') {\n\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- `'span'` literal is widened to Slot which (unaugmented) is `unknown`\n\t\tconst fallback = (GlobalSpan ?? 'span') as Slot\n\t\treturn [fallback, GlobalSpan ? {value: token.content} : {}]\n\t}\n\tconst option = tokenOptions?.[token.descriptor.index]\n\tconst baseProps = {value: token.value, meta: token.meta}\n\tconst props = resolveOptionSlot(option?.mark, baseProps)\n\tconst Component = option?.Mark ?? GlobalMark\n\tif (!Component) throw new Error('No mark component found. Provide either option.Mark or global Mark.')\n\treturn [Component, props]\n}","import {computed} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {CSSProperties, CoreSlotProps, Feature, Slot} from '../../shared/types'\nimport {cx} from '../../shared/utils/cx'\nimport {merge} from '../../shared/utils/merge'\nimport {shallow} from '../../shared/utils/shallow'\nimport type {Store} from '../../store/Store'\nimport {resolveSlot, resolveSlotProps} from './resolveSlot'\n\nimport styles from '../../../styles.module.css'\n\nconst DRAG_HANDLE_WIDTH = 24\n\nfunction buildContainerProps(\n\tisDraggableBlock: boolean,\n\treadOnly: boolean,\n\tclassName: string | undefined,\n\tstyle: CSSProperties | undefined,\n\tslotProps: CoreSlotProps | undefined\n): {className: string | undefined; style?: CSSProperties; [key: string]: unknown} {\n\tconst containerSlotProps = slotProps?.container\n\tconst baseStyle = merge(style, containerSlotProps?.style)\n\tconst mergedStyle = isDraggableBlock && !readOnly ? {paddingLeft: DRAG_HANDLE_WIDTH, ...baseStyle} : baseStyle\n\n\tconst {className: _, style: __, ...otherSlotProps} = resolveSlotProps('container', slotProps) ?? {}\n\n\treturn {\n\t\tclassName: cx(styles.Container, className, containerSlotProps?.className),\n\t\tstyle: mergedStyle,\n\t\t...otherSlotProps,\n\t}\n}\n\nexport class SlotsFeature implements Feature {\n\treadonly isBlock: Computed<boolean> = computed(() => this._store.props.layout() === 'block')\n\treadonly isDraggable: Computed<boolean> = computed(() => !!this._store.props.draggable())\n\treadonly containerComponent: Computed<Slot> = computed(() => resolveSlot('container', this._store.props.slots()))\n\treadonly containerProps: Computed<{className: string | undefined; style?: CSSProperties; [key: string]: unknown}> =\n\t\tcomputed(\n\t\t\t() =>\n\t\t\t\tbuildContainerProps(\n\t\t\t\t\tthis.isDraggable() && this.isBlock(),\n\t\t\t\t\tthis._store.props.readOnly(),\n\t\t\t\t\tthis._store.props.className(),\n\t\t\t\t\tthis._store.props.style(),\n\t\t\t\t\tthis._store.props.slotProps()\n\t\t\t\t),\n\t\t\t{equals: shallow}\n\t\t)\n\treadonly blockComponent: Computed<Slot> = computed(() => resolveSlot('block', this._store.props.slots()))\n\treadonly blockProps: Computed<Record<string, unknown> | undefined> = computed(() =>\n\t\tresolveSlotProps('block', this._store.props.slotProps())\n\t)\n\treadonly spanComponent: Computed<Slot> = computed(() => resolveSlot('span', this._store.props.slots()))\n\treadonly spanProps: Computed<Record<string, unknown> | undefined> = computed(() =>\n\t\tresolveSlotProps('span', this._store.props.slotProps())\n\t)\n\n\tconstructor(private readonly _store: Store) {}\n\tenable() {}\n\tdisable() {}\n}","import {computed} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Feature} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport type {Token} from '../parsing'\nimport {resolveMarkSlot} from '../slots'\nimport type {MarkSlot} from '../slots'\n\nexport class MarkFeature implements Feature {\n\treadonly enabled: Computed<boolean> = computed(() => {\n\t\tconst Mark = this._store.props.Mark()\n\t\tif (Mark) return true\n\t\treturn this._store.props.options().some(opt => 'Mark' in opt && opt.Mark != null)\n\t})\n\n\treadonly slot: MarkSlot = computed(() => {\n\t\tconst options = this._store.props.options()\n\t\tconst Mark = this._store.props.Mark()\n\t\tconst Span = this._store.props.Span()\n\t\treturn (token: Token) => resolveMarkSlot(token, options, Mark, Span)\n\t})\n\n\tconstructor(private readonly _store: Store) {}\n\n\tenable() {}\n\n\tdisable() {}\n}","export function filterSuggestions(data: string[], search: string): string[] {\n\tconst query = search.toLowerCase()\n\treturn data.filter(s => s.toLowerCase().includes(query))\n}","import type {OverlayMatch} from '../../shared/types'\nimport type {MarkToken} from '../parsing'\n\nexport function createMarkFromOverlay(match: OverlayMatch, value: string, meta?: string): MarkToken {\n\tconst markup = match.option.markup\n\tif (!markup) throw new Error('createMarkFromOverlay: option.markup is required')\n\treturn {\n\t\ttype: 'mark',\n\t\tvalue,\n\t\tmeta,\n\t\tcontent: '',\n\t\tposition: {\n\t\t\tstart: match.range.start,\n\t\t\tend: match.range.end,\n\t\t},\n\t\tdescriptor: {\n\t\t\tmarkup,\n\t\t\tindex: 0,\n\t\t\tsegments: [],\n\t\t\tgapTypes: [],\n\t\t\thasSlot: false,\n\t\t\thasTwoValues: false,\n\t\t\tsegmentGlobalIndices: [],\n\t\t},\n\t\tchildren: [],\n\t\tslot: undefined,\n\t}\n}","import {KEYBOARD} from '../../shared/constants'\nimport {escape} from '../../shared/escape'\nimport {signal, computed, event, effectScope, effect, watch, listen} from '../../shared/signals/index.js'\nimport type {CoreOption, Feature, OverlayMatch, OverlayTrigger, Slot} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {TriggerFinder} from '../caret'\nimport type {Token} from '../parsing'\nimport {annotate} from '../parsing'\nimport {resolveOverlaySlot} from '../slots'\nimport type {OverlaySlot} from '../slots'\n\nexport class OverlayFeature implements Feature {\n\treadonly match = signal<OverlayMatch | undefined>(undefined)\n\treadonly element = signal<HTMLElement | null>(null)\n\n\treadonly slot: OverlaySlot = computed(() => {\n\t\tconst Overlay = this._store.props.Overlay()\n\t\treturn (option?: CoreOption, defaultComponent?: Slot) => resolveOverlaySlot(Overlay, option, defaultComponent)\n\t})\n\n\treadonly select = event<{mark: Token; match: OverlayMatch}>()\n\treadonly close = event()\n\n\t#scope?: () => void\n\n\tconstructor(private readonly _store: Store) {}\n\n\t#probeTrigger() {\n\t\tconst match =\n\t\t\tTriggerFinder.find(this._store.props.options(), option => option.overlay?.trigger, this._store) ??\n\t\t\tthis.#probeTriggerFromRecovery()\n\t\tthis.match(match)\n\t}\n\n\t#probeTriggerFromRecovery(): OverlayMatch | undefined {\n\t\tconst recovery = this._store.caret.recovery()\n\t\tif (recovery?.kind !== 'caret') return\n\n\t\tconst value = this._store.value.current()\n\t\tconst cursor = recovery.rawPosition\n\t\tconst left = value.slice(0, cursor)\n\t\tconst right = value.slice(cursor)\n\t\tconst rightWord = right.match(/^\\w*/)?.[0] ?? ''\n\n\t\tfor (const option of this._store.props.options()) {\n\t\t\tconst trigger = option.overlay?.trigger\n\t\t\tif (!trigger) continue\n\n\t\t\tconst match = left.match(new RegExp(`${escape(trigger)}(\\\\w*)$`))\n\t\t\tif (!match) continue\n\n\t\t\tconst [sourceLeft, wordLeft] = match\n\t\t\tconst source = sourceLeft + rightWord\n\t\t\tconst start = cursor - sourceLeft.length\n\t\t\treturn {\n\t\t\t\tvalue: wordLeft + rightWord,\n\t\t\t\tsource,\n\t\t\t\trange: {start, end: start + source.length},\n\t\t\t\tspan: value,\n\t\t\t\tnode: window.getSelection()?.anchorNode ?? this._store.dom.container() ?? document.body,\n\t\t\t\toption,\n\t\t\t}\n\t\t}\n\t}\n\n\tenable() {\n\t\tif (this.#scope) return\n\n\t\tthis.#scope = effectScope(() => {\n\t\t\twatch(this.close, () => {\n\t\t\t\tthis.match(undefined)\n\t\t\t})\n\n\t\t\twatch(this._store.value.change, () => {\n\t\t\t\tconst showOverlayOn = this._store.props.showOverlayOn()\n\t\t\t\tconst type: OverlayTrigger = 'change'\n\n\t\t\t\tif (showOverlayOn === type || (Array.isArray(showOverlayOn) && showOverlayOn.includes(type))) {\n\t\t\t\t\tthis.#probeTrigger()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\teffect(() => {\n\t\t\t\tconst match = this.match()\n\t\t\t\tif (match) {\n\t\t\t\t\tlisten(window, 'keydown', e => {\n\t\t\t\t\t\tif (e.key === KEYBOARD.ESC) {\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tlisten(\n\t\t\t\t\t\tdocument,\n\t\t\t\t\t\t'click',\n\t\t\t\t\t\te => {\n\t\t\t\t\t\t\tconst target = e.target instanceof HTMLElement ? e.target : null\n\t\t\t\t\t\t\tif (this.element()?.contains(target)) return\n\t\t\t\t\t\t\tif (this._store.dom.container()?.contains(target)) return\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst selectionChangeHandler = () => {\n\t\t\t\tconst container = this._store.dom.container()\n\t\t\t\tif (!container?.contains(document.activeElement)) return\n\n\t\t\t\tconst showOverlayOn = this._store.props.showOverlayOn()\n\t\t\t\tconst type: OverlayTrigger = 'selectionChange'\n\n\t\t\t\tif (showOverlayOn === type || (Array.isArray(showOverlayOn) && showOverlayOn.includes(type))) {\n\t\t\t\t\tthis.#probeTrigger()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlisten(document, 'selectionchange', selectionChangeHandler)\n\n\t\t\twatch(this.select, overlayEvent => {\n\t\t\t\tconst {\n\t\t\t\t\tmark,\n\t\t\t\t\tmatch: {option, range},\n\t\t\t\t} = overlayEvent\n\n\t\t\t\tconst markup = option.markup\n\t\t\t\tif (!markup) return\n\n\t\t\t\tconst annotation =\n\t\t\t\t\tmark.type === 'mark'\n\t\t\t\t\t\t? annotate(markup, {\n\t\t\t\t\t\t\t\tvalue: mark.value,\n\t\t\t\t\t\t\t\tmeta: mark.meta,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: annotate(markup, {\n\t\t\t\t\t\t\t\tvalue: mark.content,\n\t\t\t\t\t\t\t})\n\n\t\t\t\tthis._store.value.replaceRange(range, annotation, {\n\t\t\t\t\tsource: 'overlay',\n\t\t\t\t\trecover: {kind: 'caret', rawPosition: range.start + annotation.length},\n\t\t\t\t})\n\t\t\t\tthis.match(undefined)\n\t\t\t})\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#scope?.()\n\t\tthis.#scope = undefined\n\t}\n}","import {KEYBOARD} from '../../shared/constants'\n\nexport type NavigationAction = 'up' | 'down' | 'select' | 'none'\n\nexport interface NavigationResult {\n\taction: NavigationAction\n\tindex: number\n}\n\nexport function navigateSuggestions(key: string, activeIndex: number, length: number): NavigationResult {\n\tif (length === 0) return {action: 'none', index: activeIndex}\n\n\tconst hasActive = !isNaN(activeIndex)\n\n\tswitch (key) {\n\t\tcase KEYBOARD.UP:\n\t\t\treturn {action: 'up', index: hasActive ? (length + ((activeIndex - 1) % length)) % length : 0}\n\t\tcase KEYBOARD.DOWN:\n\t\t\treturn {action: 'down', index: hasActive ? (activeIndex + 1) % length : 0}\n\t\tcase KEYBOARD.ENTER:\n\t\t\treturn hasActive ? {action: 'select', index: activeIndex} : {action: 'none', index: activeIndex}\n\t\tdefault:\n\t\t\treturn {action: 'none', index: activeIndex}\n\t}\n}","import {DEFAULT_OPTIONS} from '../../shared/constants'\nimport {signal, batch} from '../../shared/signals'\nimport type {SignalValues} from '../../shared/signals'\nimport type {\n\tCoreOption,\n\tOverlayTrigger,\n\tCSSProperties,\n\tCoreSlots,\n\tCoreSlotProps,\n\tDraggableConfig,\n\tSlot,\n} from '../../shared/types'\nimport {shallow} from '../../shared/utils/shallow'\nimport type {Store} from '../../store/Store'\n\nexport class PropsFeature {\n\treadonly value = signal<string | undefined>(undefined, {readonly: true})\n\treadonly defaultValue = signal<string | undefined>(undefined, {readonly: true})\n\n\treadonly onChange = signal<((value: string) => void) | undefined>(undefined, {readonly: true})\n\n\treadonly options = signal<CoreOption[]>(DEFAULT_OPTIONS, {readonly: true})\n\treadonly readOnly = signal<boolean>(false, {readonly: true})\n\n\treadonly layout = signal<'inline' | 'block'>('inline', {readonly: true})\n\treadonly draggable = signal<boolean | DraggableConfig>(false, {readonly: true})\n\n\treadonly showOverlayOn = signal<OverlayTrigger>('change', {readonly: true})\n\n\treadonly Span = signal<Slot | undefined>(undefined, {readonly: true})\n\treadonly Mark = signal<Slot | undefined>(undefined, {readonly: true})\n\treadonly Overlay = signal<Slot | undefined>(undefined, {readonly: true})\n\n\treadonly className = signal<string | undefined>(undefined, {readonly: true})\n\treadonly style = signal<CSSProperties | undefined>(undefined, {equals: shallow, readonly: true})\n\n\treadonly slots = signal<CoreSlots | undefined>(undefined, {readonly: true})\n\treadonly slotProps = signal<CoreSlotProps | undefined>(undefined, {readonly: true})\n\n\tconstructor(private readonly _store: Store) {}\n\n\tset(values: Partial<SignalValues<typeof this>>): void {\n\t\tbatch(\n\t\t\t() => {\n\t\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- heterogeneous signal map: per-key types verified by SignalValues<T> at the call site\n\t\t\t\tfor (const key of Object.keys(values) as (keyof typeof this)[]) {\n\t\t\t\t\tif (!(key in this))\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- heterogeneous signal map: per-key types verified by SignalValues<T> at the call site\n\t\t\t\t\t;(this[key] as (v: unknown) => void)(values[key] as never)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{mutable: true}\n\t\t)\n\t}\n}","import type {CaretRecovery} from '../../shared/editorContracts'\n\ntype Pending = {\n\treadonly candidate: string\n\treadonly recovery: CaretRecovery | undefined\n}\n\nexport class ControlledEcho {\n\t#pending: Pending | undefined\n\n\tpropose(candidate: string, recovery?: CaretRecovery): void {\n\t\tthis.#pending = {candidate, recovery}\n\t}\n\n\tonEcho(value: string): CaretRecovery | undefined {\n\t\tconst pending = this.#pending\n\t\tif (!pending) return undefined\n\t\tthis.#pending = undefined\n\t\treturn pending.candidate === value ? pending.recovery : undefined\n\t}\n\n\tsupersede(): void {\n\t\tthis.#pending = undefined\n\t}\n}","import type {CaretRecovery, EditResult, EditSource, RawRange} from '../../shared/editorContracts'\nimport {signal, computed, event, batch, effectScope, watch} from '../../shared/signals/index.js'\nimport type {Feature} from '../../shared/types'\nimport type {Store} from '../../store/Store'\nimport {ControlledEcho} from './ControlledEcho'\n\nexport class ValueFeature implements Feature {\n\treadonly current = signal('')\n\treadonly isControlledMode = computed(() => this._store.props.value() !== undefined)\n\treadonly change = event()\n\n\treadonly #controlledEcho = new ControlledEcho()\n\t#scope?: () => void\n\n\tconstructor(private readonly _store: Store) {}\n\n\tenable() {\n\t\tif (this.#scope) return\n\t\tthis.#commitAccepted(this._store.props.value() ?? this._store.props.defaultValue() ?? '')\n\t\tthis.#scope = effectScope(() => {\n\t\t\twatch(this._store.props.value, value => {\n\t\t\t\tif (value === undefined) return\n\t\t\t\tif (value === this.current()) return\n\t\t\t\tconst recovery = this.#controlledEcho.onEcho(value)\n\t\t\t\tthis.#commitAccepted(value)\n\t\t\t\tif (recovery) this._store.caret.recovery(recovery)\n\t\t\t\tthis.change()\n\t\t\t})\n\t\t})\n\t}\n\n\tdisable() {\n\t\tthis.#scope?.()\n\t\tthis.#scope = undefined\n\t}\n\n\treplaceRange(\n\t\trange: RawRange,\n\t\treplacement: string,\n\t\toptions?: {recover?: CaretRecovery; source?: EditSource}\n\t): EditResult {\n\t\tconst current = this.current()\n\t\tif (this._store.props.readOnly()) return {ok: false, reason: 'readOnly'}\n\t\tif (range.start < 0 || range.end < range.start || range.end > current.length) {\n\t\t\treturn {ok: false, reason: 'invalidRange'}\n\t\t}\n\n\t\tconst candidate = current.slice(0, range.start) + replacement + current.slice(range.end)\n\t\treturn this.#commitCandidate(candidate, options?.recover)\n\t}\n\n\treplaceAll(next: string, options?: {recover?: CaretRecovery; source?: EditSource}): EditResult {\n\t\treturn this.replaceRange({start: 0, end: this.current().length}, next, options)\n\t}\n\n\t#commitCandidate(candidate: string, recovery?: CaretRecovery): EditResult {\n\t\tif (this.isControlledMode()) {\n\t\t\tthis.#controlledEcho.propose(candidate, recovery)\n\t\t\tthis._store.props.onChange()?.(candidate)\n\t\t\treturn {ok: true, accepted: 'pendingControlledEcho', value: candidate}\n\t\t}\n\n\t\tthis._store.props.onChange()?.(candidate)\n\t\tthis.#commitAccepted(candidate)\n\t\tthis._store.caret.recovery(recovery)\n\t\tthis.change()\n\t\treturn {ok: true, accepted: 'immediate', value: candidate}\n\t}\n\n\t#commitAccepted(value: string) {\n\t\tconst tokens = this._store.parsing.parseValue(value)\n\t\tbatch(() => {\n\t\t\tthis._store.parsing.acceptTokens(tokens)\n\t\t\tthis.current(value)\n\t\t})\n\t}\n}","/**\n * Returns true when `target` is outside `element` (i.e. not contained by it).\n * Useful for closing a menu when the user clicks outside of it.\n */\nexport function isClickOutside(target: EventTarget | null, element: Element | null): boolean {\n\treturn !!element && !element.contains(target instanceof Node ? target : null)\n}\n\n/**\n * Returns true when the keyboard event is the Escape key.\n */\nexport function isEscapeKey(e: KeyboardEvent): boolean {\n\treturn e.key === 'Escape'\n}","import {signal} from '../shared/signals'\nimport type {DragAction, DragActions} from '../shared/types'\nimport {getDragDropPosition, getDragTargetIndex, parseDragSourceIndex} from '../shared/utils/dragUtils'\nimport {isClickOutside, isEscapeKey} from '../shared/utils/menuUtils'\n\nexport type DropPosition = 'before' | 'after' | null\n\nexport class BlockStore {\n\treadonly refs = {\n\t\tcontainer: null as HTMLElement | null,\n\t}\n\n\treadonly state = {\n\t\tisHovered: signal(false),\n\t\tisDragging: signal(false),\n\t\tdropPosition: signal<DropPosition>(null),\n\t\tmenuOpen: signal(false),\n\t\tmenuPosition: signal({top: 0, left: 0}),\n\t}\n\n\t#blockIndex = 0\n\t#dragAction: DragActions['action'] | null = null\n\t#cleanupContainer?: () => void\n\t#cleanupGrip?: () => void\n\t#cleanupMenu?: () => void\n\n\tattachContainer(el: HTMLElement | null, blockIndex: number, actions: DragActions) {\n\t\tthis.#blockIndex = blockIndex\n\t\tthis.#dragAction = actions.action\n\t\tif (el === this.refs.container) return\n\t\tthis.#cleanupContainer?.()\n\t\tthis.refs.container = el\n\t\tif (!el) return\n\n\t\tconst onMouseEnter = () => this.state.isHovered(true)\n\t\tconst onMouseLeave = () => this.state.isHovered(false)\n\t\tconst onDragOver = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.preventDefault()\n\t\t\te.dataTransfer.dropEffect = 'move'\n\t\t\tthis.state.dropPosition(getDragDropPosition(e.clientY, el.getBoundingClientRect()))\n\t\t}\n\t\tconst onDragLeave = (e: DragEvent) => {\n\t\t\tconst ct = e.currentTarget\n\t\t\tif (ct instanceof Node && ct.contains(e.relatedTarget instanceof Node ? e.relatedTarget : null)) return\n\t\t\tthis.state.dropPosition(null)\n\t\t}\n\t\tconst onDrop = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.preventDefault()\n\t\t\tconst sourceIndex = parseDragSourceIndex(e.dataTransfer)\n\t\t\tif (sourceIndex === null) return\n\t\t\tconst targetIndex = getDragTargetIndex(this.#blockIndex, this.state.dropPosition() ?? 'after')\n\t\t\tthis.state.dropPosition(null)\n\t\t\tthis.#emit({type: 'reorder', source: sourceIndex, target: targetIndex})\n\t\t}\n\n\t\tel.addEventListener('mouseenter', onMouseEnter)\n\t\tel.addEventListener('mouseleave', onMouseLeave)\n\t\tel.addEventListener('dragover', onDragOver)\n\t\tel.addEventListener('dragleave', onDragLeave)\n\t\tel.addEventListener('drop', onDrop)\n\t\tthis.#cleanupContainer = () => {\n\t\t\tel.removeEventListener('mouseenter', onMouseEnter)\n\t\t\tel.removeEventListener('mouseleave', onMouseLeave)\n\t\t\tel.removeEventListener('dragover', onDragOver)\n\t\t\tel.removeEventListener('dragleave', onDragLeave)\n\t\t\tel.removeEventListener('drop', onDrop)\n\t\t}\n\t}\n\n\tattachGrip(el: HTMLButtonElement | null, blockIndex: number, actions: DragActions) {\n\t\tthis.#blockIndex = blockIndex\n\t\tthis.#dragAction = actions.action\n\t\tthis.#cleanupGrip?.()\n\t\tif (!el) return\n\n\t\tconst onDragStart = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.dataTransfer.effectAllowed = 'move'\n\t\t\te.dataTransfer.setData('text/plain', String(this.#blockIndex))\n\t\t\tthis.state.isDragging(true)\n\t\t\tif (this.refs.container) e.dataTransfer.setDragImage(this.refs.container, 0, 0)\n\t\t}\n\t\tconst onDragEnd = () => {\n\t\t\tthis.state.isDragging(false)\n\t\t\tthis.state.dropPosition(null)\n\t\t}\n\t\tconst onClick = (e: MouseEvent) => {\n\t\t\te.preventDefault()\n\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\tthis.state.menuPosition({top: rect.bottom + 4, left: rect.left})\n\t\t\tthis.state.menuOpen(true)\n\t\t}\n\n\t\tel.addEventListener('dragstart', onDragStart)\n\t\tel.addEventListener('dragend', onDragEnd)\n\t\tel.addEventListener('click', onClick)\n\t\tthis.#cleanupGrip = () => {\n\t\t\tel.removeEventListener('dragstart', onDragStart)\n\t\t\tel.removeEventListener('dragend', onDragEnd)\n\t\t\tel.removeEventListener('click', onClick)\n\t\t}\n\t}\n\n\tattachMenu(el: HTMLElement | null) {\n\t\tthis.#cleanupMenu?.()\n\t\tif (!el) return\n\n\t\tconst onMouseDown = (e: MouseEvent) => {\n\t\t\tif (isClickOutside(e.target, el)) this.closeMenu()\n\t\t}\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (isEscapeKey(e)) this.closeMenu()\n\t\t}\n\t\tdocument.addEventListener('mousedown', onMouseDown)\n\t\tdocument.addEventListener('keydown', onKeyDown)\n\t\tthis.#cleanupMenu = () => {\n\t\t\tdocument.removeEventListener('mousedown', onMouseDown)\n\t\t\tdocument.removeEventListener('keydown', onKeyDown)\n\t\t}\n\t}\n\n\tcloseMenu = () => this.state.menuOpen(false)\n\taddBlock = () => {\n\t\tthis.#emit({type: 'add', afterIndex: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\tdeleteBlock = () => {\n\t\tthis.#emit({type: 'delete', index: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\tduplicateBlock = () => {\n\t\tthis.#emit({type: 'duplicate', index: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\n\t#emit(action: DragAction) {\n\t\tthis.#dragAction?.(action)\n\t}\n}","import {BlockStore} from './BlockStore'\n\nexport class BlockRegistry {\n\treadonly #map = new WeakMap<object, BlockStore>()\n\n\tget(token: object): BlockStore {\n\t\tlet store = this.#map.get(token)\n\t\tif (!store) {\n\t\t\tstore = new BlockStore()\n\t\t\tthis.#map.set(token, store)\n\t\t}\n\t\treturn store\n\t}\n}","import {CaretFeature} from '../features/caret'\nimport {ClipboardFeature} from '../features/clipboard'\nimport {DomFeature} from '../features/dom'\nimport {DragFeature} from '../features/drag'\nimport {KeyboardFeature} from '../features/keyboard'\nimport {LifecycleFeature} from '../features/lifecycle'\nimport {MarkFeature} from '../features/mark'\nimport {OverlayFeature} from '../features/overlay'\nimport {ParsingFeature} from '../features/parsing/ParseFeature'\nimport {PropsFeature} from '../features/props/PropsFeature'\nimport {SlotsFeature} from '../features/slots'\nimport {ValueFeature} from '../features/value'\nimport {KeyGenerator, MarkputHandler} from '../shared/classes'\nimport {watch} from '../shared/signals'\nimport type {Feature} from '../shared/types'\nimport {BlockRegistry} from './BlockRegistry'\n\nexport type {DragAction} from '../shared/types'\n\nexport class Store {\n\treadonly key = new KeyGenerator()\n\treadonly blocks = new BlockRegistry()\n\n\treadonly props = new PropsFeature(this)\n\treadonly handler = new MarkputHandler(this)\n\n\treadonly lifecycle = new LifecycleFeature()\n\treadonly value = new ValueFeature(this)\n\treadonly mark = new MarkFeature(this)\n\treadonly overlay = new OverlayFeature(this)\n\treadonly slots = new SlotsFeature(this)\n\treadonly caret = new CaretFeature(this)\n\treadonly keyboard = new KeyboardFeature(this)\n\treadonly dom = new DomFeature(this)\n\treadonly drag = new DragFeature(this)\n\treadonly clipboard = new ClipboardFeature(this)\n\treadonly parsing = new ParsingFeature(this)\n\n\tconstructor() {\n\t\tconst features: Feature[] = [\n\t\t\tthis.lifecycle,\n\t\t\tthis.value,\n\t\t\tthis.mark,\n\t\t\tthis.overlay,\n\t\t\tthis.slots,\n\t\t\tthis.caret,\n\t\t\tthis.keyboard,\n\t\t\tthis.dom,\n\t\t\tthis.drag,\n\t\t\tthis.clipboard,\n\t\t\tthis.parsing,\n\t\t]\n\t\twatch(this.lifecycle.mounted, () => features.forEach(f => f.enable()))\n\t\twatch(this.lifecycle.unmounted, () => features.forEach(f => f.disable()))\n\t}\n}","import type {Store} from '@markput/core'\nimport {createContext} from 'react'\n\nexport const StoreContext = createContext<Store | undefined>(undefined)\nStoreContext.displayName = 'StoreContext'","import {computed, watch, isReactive} from '@markput/core'\nimport type {Signal, Computed, SignalValues, Store} from '@markput/core'\nimport {useSyncExternalStore, useContext, useRef} from 'react'\n\nimport {StoreContext} from '../providers/StoreContext'\n\ntype Selectable<T> = Signal<T> | Computed<T>\ntype ObjectSelector = Record<string, Selectable<unknown> | unknown>\n\ntype StableRef = {\n\tderived: Computed<unknown>\n\tsubscribe: (cb: () => void) => () => void\n\tgetSnapshot: () => unknown\n}\n\nexport function useMarkput<T>(selector: (store: Store) => Selectable<T>): T\nexport function useMarkput<R extends ObjectSelector>(selector: (store: Store) => R): SignalValues<R>\nexport function useMarkput(selector: (store: Store) => Selectable<unknown> | ObjectSelector): unknown {\n\tconst store = useContext(StoreContext)\n\tif (store === undefined) throw new Error('Store not found. Make sure to wrap component in StoreContext.')\n\n\t// Holds stable computed + subscribe + snapshot — created once, never recreated.\n\tconst stableRef = useRef<StableRef | null>(null)\n\n\tif (stableRef.current === null) {\n\t\tconst target = selector(store)\n\n\t\tconst derived = computed((): unknown => {\n\t\t\tif (typeof target === 'function') {\n\t\t\t\treturn target()\n\t\t\t}\n\t\t\tconst out: Record<string, unknown> = {}\n\t\t\tfor (const k in target) {\n\t\t\t\tconst val = target[k]\n\t\t\t\tout[k] = isReactive(val) ? (val as () => unknown)() : val\n\t\t\t}\n\t\t\treturn out\n\t\t})\n\n\t\tstableRef.current = {\n\t\t\tderived,\n\t\t\tsubscribe: cb => watch(derived, cb),\n\t\t\tgetSnapshot: () => derived(),\n\t\t}\n\t}\n\n\tconst {subscribe, getSnapshot} = stableRef.current\n\treturn useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}","import type {ReactNode} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const List = ({children}: {children: ReactNode}) => <ul className={styles.PopupList}>{children}</ul>","import {cx} from '@markput/core'\nimport type {MouseEvent, ReactNode} from 'react'\nimport {useEffect, useRef} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const ListItem = ({\n\tonClick,\n\tonMouseDown,\n\tactive,\n\tchildren,\n}: {\n\tonClick?: (e: MouseEvent<HTMLLIElement>) => void\n\tonMouseDown?: (e: MouseEvent<HTMLLIElement>) => void\n\tactive?: boolean\n\tchildren: ReactNode\n}) => {\n\tconst ref = useRef<HTMLLIElement>(null)\n\n\tuseEffect(() => {\n\t\tif (active) ref.current?.scrollIntoView(false)\n\t}, [active])\n\n\treturn (\n\t\t<li\n\t\t\tref={ref}\n\t\t\tclassName={cx(styles.PopupItem, active && styles.PopupItemActive)}\n\t\t\tonClick={onClick}\n\t\t\tonMouseDown={onMouseDown}\n\t\t>\n\t\t\t{children}\n\t\t</li>\n\t)\n}","import type {CSSProperties, ReactNode, Ref} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const Popup = ({ref, style, children}: {ref?: Ref<HTMLElement>; style?: CSSProperties; children: ReactNode}) => {\n\t// oxlint-disable-next-line no-unsafe-type-assertion\n\tconst divRef = ref as Ref<HTMLDivElement> | undefined\n\treturn (\n\t\t<div ref={divRef} className={styles.Popup} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}","import {cx} from '@markput/core'\nimport type {Token} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {List} from './Popup/List'\nimport {ListItem} from './Popup/ListItem'\nimport {Popup} from './Popup/Popup'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const BlockMenu = memo(({token}: {token: Token}) => {\n\tconst {blockStore, menuOpen, menuPosition, dom, index} = useMarkput(s => {\n\t\tconst blockStore = s.blocks.get(token)\n\n\t\treturn {\n\t\t\tblockStore,\n\t\t\tmenuOpen: blockStore.state.menuOpen,\n\t\t\tmenuPosition: blockStore.state.menuPosition,\n\t\t\tdom: s.dom,\n\t\t\tindex: s.parsing.index,\n\t\t}\n\t})\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (!menuOpen) return null\n\n\treturn (\n\t\t<Popup\n\t\t\tref={(el: HTMLDivElement | null) => {\n\t\t\t\tblockStore.attachMenu(el)\n\t\t\t\tcontrolRef?.(el)\n\t\t\t}}\n\t\t\tstyle={{top: menuPosition.top, left: menuPosition.left}}\n\t\t>\n\t\t\t<List>\n\t\t\t\t<ListItem onClick={() => blockStore.addBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconAdd)} />\n\t\t\t\t\t<span>Add below</span>\n\t\t\t\t</ListItem>\n\t\t\t\t<ListItem onClick={() => blockStore.duplicateBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconDuplicate)} />\n\t\t\t\t\t<span>Duplicate</span>\n\t\t\t\t</ListItem>\n\t\t\t\t<ListItem onClick={() => blockStore.deleteBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconTrash)} />\n\t\t\t\t\t<span>Delete</span>\n\t\t\t\t</ListItem>\n\t\t\t</List>\n\t\t</Popup>\n\t)\n})\n\nBlockMenu.displayName = 'BlockMenu'","import {cx, getAlwaysShowHandle} from '@markput/core'\nimport type {Token as TokenType} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nimport styles from '@markput/core/styles.module.css'\n\nconst iconGrip = `${styles.Icon} ${styles.IconGrip}`\n\nexport const DragHandle = memo(({token, blockIndex}: {token: TokenType; blockIndex: number}) => {\n\tconst {blockStore, action, readOnly, draggable, isDragging, isHovered, dom, index} = useMarkput(s => {\n\t\tconst blockStore = s.blocks.get(token)\n\n\t\treturn {\n\t\t\tblockStore,\n\t\t\taction: s.drag.action,\n\t\t\treadOnly: s.props.readOnly,\n\t\t\tdraggable: s.props.draggable,\n\t\t\tisDragging: blockStore.state.isDragging,\n\t\t\tisHovered: blockStore.state.isHovered,\n\t\t\tdom: s.dom,\n\t\t\tindex: s.parsing.index,\n\t\t}\n\t})\n\tconst alwaysShowHandle = useMemo(() => getAlwaysShowHandle(draggable), [draggable])\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (readOnly) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={controlRef}\n\t\t\tclassName={cx(\n\t\t\t\tstyles.SidePanel,\n\t\t\t\talwaysShowHandle ? styles.SidePanelAlways : isHovered && !isDragging && styles.SidePanelVisible\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={(el: HTMLButtonElement | null) => {\n\t\t\t\t\tblockStore.attachGrip(el, blockIndex, {action})\n\t\t\t\t}}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdraggable\n\t\t\t\tclassName={cx(styles.GripButton, isDragging && styles.GripButtonDragging)}\n\t\t\t\taria-label=\"Drag to reorder or click for options\"\n\t\t\t>\n\t\t\t\t<span className={iconGrip} />\n\t\t\t</button>\n\t\t</div>\n\t)\n})\n\nDragHandle.displayName = 'DragHandle'","import type {Token as TokenType} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const DropIndicator = memo(({token, position}: {token: TokenType; position: 'before' | 'after'}) => {\n\tconst dropPosition = useMarkput(s => s.blocks.get(token).state.dropPosition)\n\tconst {dom, index} = useMarkput(s => ({dom: s.dom, index: s.parsing.index}))\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (dropPosition !== position) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={controlRef}\n\t\t\tclassName={styles.DropIndicator}\n\t\t\tstyle={position === 'before' ? {top: -1} : {bottom: -1}}\n\t\t/>\n\t)\n})\n\nDropIndicator.displayName = 'DropIndicator'","import type {Store, Token, TokenAddress} from '@markput/core'\nimport {createContext, useContext} from 'react'\n\nexport type TokenContextValue = {\n\treadonly store: Store\n\treadonly token: Token\n\treadonly address?: TokenAddress\n}\n\nexport const TokenContext = createContext<TokenContextValue | undefined>(undefined)\nTokenContext.displayName = 'TokenProvider'\n\nexport function useToken(): Token {\n\tconst value = useContext(TokenContext)\n\tif (value === undefined) {\n\t\tthrow new Error('Token not found. Make sure to wrap component in TokenContext.Provider.')\n\t}\n\treturn value.token\n}\n\nexport function useTokenContext(): TokenContextValue {\n\tconst value = useContext(TokenContext)\n\tif (value === undefined) {\n\t\tthrow new Error('Token not found. Make sure to wrap component in TokenContext.Provider.')\n\t}\n\treturn value\n}","import type {TokenPath} from '@markput/core'\nimport type {CSSProperties, ReactNode} from 'react'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nconst sequenceHostStyle: CSSProperties = {display: 'contents'}\n\nexport const TokenChildren = memo(({ownerPath, children}: {ownerPath: TokenPath; children: ReactNode}) => {\n\tconst {dom} = useMarkput(s => ({dom: s.dom}))\n\tconst ref = useMemo(() => dom.childrenFor(ownerPath), [dom, ownerPath])\n\n\treturn (\n\t\t<span ref={ref} style={sequenceHostStyle}>\n\t\t\t{children}\n\t\t</span>\n\t)\n})\n\nTokenChildren.displayName = 'TokenChildren'","import type {Token as TokenType} from '@markput/core'\nimport {memo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {TokenContext} from '../lib/providers/TokenContext'\nimport {TokenChildren} from './TokenChildren'\n\nexport const Token = memo(({token}: {token: TokenType}) => {\n\tconst {resolveMarkSlot, key, index, store} = useMarkput(s => ({\n\t\tresolveMarkSlot: s.mark.slot,\n\t\tkey: s.key,\n\t\tindex: s.parsing.index,\n\t\tstore: s,\n\t}))\n\tconst path = index.pathFor(token)\n\tconst address = path ? index.addressFor(path) : undefined\n\tif (!path || !address) return null\n\n\tconst [Component, props] = resolveMarkSlot(token)\n\tconst children =\n\t\ttoken.type === 'mark' && token.children.length > 0 ? (\n\t\t\t<TokenChildren ownerPath={path}>\n\t\t\t\t{token.children.map(child => (\n\t\t\t\t\t<Token key={key.get(child)} token={child} />\n\t\t\t\t))}\n\t\t\t</TokenChildren>\n\t\t) : undefined\n\n\treturn (\n\t\t<TokenContext value={{store, token, address}}>\n\t\t\t{children ? <Component {...props}>{children}</Component> : <Component {...props} />}\n\t\t</TokenContext>\n\t)\n})\n\nToken.displayName = 'Token'","import type {Token as TokenType} from '@markput/core'\nimport {cx} from '@markput/core'\nimport type {CSSProperties} from 'react'\nimport {memo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {BlockMenu} from './BlockMenu'\nimport {DragHandle} from './DragHandle'\nimport {DropIndicator} from './DropIndicator'\nimport {Token} from './Token'\n\nimport styles from '@markput/core/styles.module.css'\n\ninterface BlockProps {\n\ttoken: TokenType\n}\n\nexport const Block = memo(({token}: BlockProps) => {\n\tconst {blockStore, action, Component, slotProps, isDragging, tokens} = useMarkput(s => ({\n\t\tblockStore: s.blocks.get(token),\n\t\taction: s.drag.action,\n\t\tComponent: s.slots.blockComponent,\n\t\tslotProps: s.slots.blockProps,\n\t\tisDragging: s.blocks.get(token).state.isDragging,\n\t\ttokens: s.parsing.tokens,\n\t}))\n\tconst blockIndex = tokens.indexOf(token)\n\n\tconst setBlockRef = (el: HTMLElement | null) => {\n\t\tblockStore.attachContainer(el, blockIndex, {action})\n\t}\n\n\treturn (\n\t\t<Component\n\t\t\tref={setBlockRef}\n\t\t\tdata-testid=\"block\"\n\t\t\t{...slotProps}\n\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- slotProps.className is raw and needs casting to string\n\t\t\tclassName={cx(styles.Block, slotProps?.className as string | undefined)}\n\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- slotProps.style is raw and needs casting to CSSProperties\n\t\t\tstyle={{opacity: isDragging ? 0.4 : 1, ...(slotProps?.style as CSSProperties | undefined)}}\n\t\t>\n\t\t\t<DropIndicator token={token} position=\"before\" />\n\n\t\t\t<DragHandle token={token} blockIndex={blockIndex} />\n\n\t\t\t<Token token={token} />\n\n\t\t\t<DropIndicator token={token} position=\"after\" />\n\n\t\t\t<BlockMenu token={token} />\n\t\t</Component>\n\t)\n})\n\nBlock.displayName = 'Block'","import {memo, useLayoutEffect} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {Block} from './Block'\nimport {Token} from './Token'\n\nexport const Container = memo(() => {\n\tconst {dom, lifecycle, isBlock, tokens, key, Component, props} = useMarkput(s => ({\n\t\tdom: s.dom,\n\t\tlifecycle: s.lifecycle,\n\t\tisBlock: s.slots.isBlock,\n\t\ttokens: s.parsing.tokens,\n\t\tkey: s.key,\n\t\tComponent: s.slots.containerComponent,\n\t\tprops: s.slots.containerProps,\n\t}))\n\n\tuseLayoutEffect(() => {\n\t\tlifecycle.rendered()\n\t})\n\n\treturn (\n\t\t<Component ref={dom.container} {...props}>\n\t\t\t{isBlock\n\t\t\t\t? tokens.map(t => <Block key={key.get(t)} token={t} />)\n\t\t\t\t: tokens.map(t => <Token key={key.get(t)} token={t} />)}\n\t\t</Component>\n\t)\n})\n\nContainer.displayName = 'Container'","import type {OverlayMatch} from '@markput/core'\nimport {Caret, createMarkFromOverlay} from '@markput/core'\nimport type {RefObject} from 'react'\nimport {useCallback, useMemo} from 'react'\n\nimport type {Option} from '../../types'\nimport {useMarkput} from './useMarkput'\n\nexport interface OverlayHandler {\n\tstyle: {\n\t\tleft: number\n\t\ttop: number\n\t}\n\tclose: () => void\n\tselect: (value: {value: string; meta?: string}) => void\n\tmatch: OverlayMatch<Option> | undefined\n\tref: RefObject<HTMLElement | null>\n}\n\nexport function useOverlay(): OverlayHandler {\n\tconst {match, overlay} = useMarkput(s => ({match: s.overlay.match, overlay: s.overlay}))\n\n\tconst style = useMemo(() => {\n\t\tif (!match) return {left: 0, top: 0}\n\t\treturn Caret.getAbsolutePosition()\n\t}, [match])\n\n\tconst close = useCallback(() => overlay.close(), [overlay])\n\tconst select = useCallback(\n\t\t(value: {value: string; meta?: string}) => {\n\t\t\tif (!match) return\n\t\t\tconst mark = createMarkFromOverlay(match, value.value, value.meta)\n\t\t\toverlay.select({mark, match})\n\t\t\toverlay.close()\n\t\t},\n\t\t[match, overlay]\n\t)\n\n\tconst ref = useMemo(\n\t\t(): RefObject<HTMLElement | null> => ({\n\t\t\tget current() {\n\t\t\t\treturn overlay.element()\n\t\t\t},\n\t\t\tset current(v: HTMLElement | null) {\n\t\t\t\toverlay.element(v)\n\t\t\t},\n\t\t}),\n\t\t[overlay]\n\t)\n\n\treturn {match, style, select, close, ref}\n}","import {filterSuggestions, navigateSuggestions} from '@markput/core'\nimport {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {useMarkput} from '../../lib/hooks/useMarkput'\nimport {useOverlay} from '../../lib/hooks/useOverlay'\nimport {List} from '../Popup/List'\nimport {ListItem} from '../Popup/ListItem'\nimport {Popup} from '../Popup/Popup'\n\nexport const Suggestions = () => {\n\tconst container = useMarkput(s => s.dom.container)\n\tconst {match, select, style, ref} = useOverlay()\n\tconst [active, setActive] = useState(NaN)\n\tconst data = match?.option.overlay?.data ?? []\n\tconst filtered = useMemo(() => (match ? filterSuggestions(data, match.value) : []), [match, data])\n\tconst length = filtered.length\n\n\tconst activeRef = useRef(active)\n\tactiveRef.current = active\n\tconst filteredRef = useRef(filtered)\n\tfilteredRef.current = filtered\n\n\tuseEffect(() => {\n\t\tif (!container) return\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tconst result = navigateSuggestions(event.key, activeRef.current, length)\n\t\t\tswitch (result.action) {\n\t\t\t\tcase 'up':\n\t\t\t\tcase 'down':\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tsetActive(result.index)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'select': {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tconst suggestion = filteredRef.current[result.index]\n\t\t\t\t\tselect({value: suggestion, meta: result.index.toString()})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'none':\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tcontainer.addEventListener('keydown', handler)\n\t\treturn () => container.removeEventListener('keydown', handler)\n\t}, [container, length, select])\n\n\tif (!filtered.length) return null\n\n\treturn (\n\t\t<Popup ref={ref} style={style}>\n\t\t\t<List>\n\t\t\t\t{filtered.map((suggestion, index) => (\n\t\t\t\t\t<ListItem\n\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\tactive={index === active}\n\t\t\t\t\t\tonClick={() => select({value: suggestion, meta: index.toString()})}\n\t\t\t\t\t>\n\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t</ListItem>\n\t\t\t\t))}\n\t\t\t</List>\n\t\t</Popup>\n\t)\n}","import {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {Suggestions} from './Suggestions'\n\nexport const OverlayRenderer = memo(() => {\n\tconst {\n\t\tmatch,\n\t\tkey: keyGen,\n\t\tresolveOverlay,\n\t} = useMarkput(s => ({\n\t\tmatch: s.overlay.match,\n\t\tkey: s.key,\n\t\tresolveOverlay: s.overlay.slot,\n\t}))\n\tconst key = useMemo(() => (match ? keyGen.get(match.option) : undefined), [match])\n\n\tconst [Overlay, props] = resolveOverlay(match?.option, Suggestions)\n\n\tif (!key) return\n\n\treturn <Overlay key={key} {...props} />\n})\n\nOverlayRenderer.displayName = 'OverlayRenderer'","import type {CoreOption, DraggableConfig, MarkputHandler, OverlayTrigger} from '@markput/core'\nimport {Store} from '@markput/core'\nimport type {ComponentType, CSSProperties, Ref} from 'react'\nimport {useImperativeHandle, useLayoutEffect, useState} from 'react'\n\nimport {StoreContext} from '../lib/providers/StoreContext'\nimport type {MarkProps, Option, OverlayProps, SlotProps, Slots} from '../types'\nimport {Container} from './Container'\nimport {OverlayRenderer} from './OverlayRenderer'\n\n/**\n * Props for MarkedInput component.\n *\n * @template TMarkProps - Type of props for the global Mark component\n * @template TOverlayProps - Type of props for the global Overlay component\n *\n * @example\n * ```tsx\n * <MarkedInput<ChipProps>\n * Mark={Chip}\n * options={[{\n * markup: '@[__value__]',\n * mark: { label: 'Click me' }\n * }]}\n * />\n * ```\n */\nexport interface MarkedInputProps<TMarkProps = MarkProps, TOverlayProps extends CoreOption['overlay'] = OverlayProps> {\n\t/** Ref to handler */\n\tref?: Ref<MarkputHandler>\n\t/** Global component used for rendering text tokens (default: built-in Span) */\n\tSpan?: ComponentType<MarkProps>\n\t/** Global component used for rendering markups (fallback for option.Mark) */\n\tMark?: ComponentType<TMarkProps>\n\t/** Global component used for rendering overlays (fallback for option.Overlay) */\n\tOverlay?: ComponentType<TOverlayProps>\n\t/**\n\t * Configuration options for markups and overlays.\n\t * Each option can specify its own component via option.Mark or option.Overlay.\n\t * Falls back to global Mark/Overlay components when not specified.\n\t */\n\toptions?: Option<TMarkProps, TOverlayProps>[]\n\t/** Additional classes */\n\tclassName?: string\n\t/** Additional style */\n\tstyle?: CSSProperties\n\t/**\n\t * Override internal components using slots\n\t * @example slots={{ container: 'div', span: 'span' }}\n\t */\n\tslots?: Slots\n\t/**\n\t * Props to pass to slot components\n\t * @example slotProps={{ container: { onKeyDown: handler }, span: { className: 'custom' } }}\n\t */\n\tslotProps?: SlotProps\n\t/**\n\t * Events that trigger overlay display\n\t * @default 'change'\n\t */\n\tshowOverlayOn?: OverlayTrigger\n\t/** Annotated text with markups */\n\tvalue?: string\n\t/** Initial value for uncontrolled mode */\n\tdefaultValue?: string\n\t/** Change event handler */\n\tonChange?: (value: string) => void\n\t/** Read-only mode */\n\treadOnly?: boolean\n\t/** Layout mode: 'inline' renders tokens in a single flow, 'block' stacks each token as its own row.\n\t * @default 'inline'\n\t */\n\tlayout?: 'inline' | 'block'\n\t/** Enable drag interaction on block rows. Only effective when layout='block'.\n\t * @default false\n\t */\n\tdraggable?: boolean | DraggableConfig\n}\n\nexport function MarkedInput<TMarkProps = MarkProps, TOverlayProps extends CoreOption['overlay'] = OverlayProps>(\n\tprops: MarkedInputProps<TMarkProps, TOverlayProps>\n) {\n\tconst [store] = useState(() => {\n\t\tconst nextStore = new Store()\n\t\tnextStore.props.set(props)\n\t\treturn nextStore\n\t})\n\n\tuseLayoutEffect(() => {\n\t\tstore.props.set(props)\n\t})\n\n\tuseLayoutEffect(() => {\n\t\tstore.lifecycle.mounted()\n\t\treturn () => store.lifecycle.unmounted()\n\t}, [])\n\n\tuseImperativeHandle(props.ref, () => store.handler, [store])\n\n\treturn (\n\t\t<StoreContext value={store}>\n\t\t\t<Container />\n\t\t\t<OverlayRenderer />\n\t\t</StoreContext>\n\t)\n}","import type {MarkController} from '@markput/core'\nimport {MarkController as CoreMarkController} from '@markput/core'\nimport {useMemo} from 'react'\n\nimport {useTokenContext} from '../providers/TokenContext'\nimport {useMarkput} from './useMarkput'\n\nexport const useMark = (): MarkController => {\n\tconst {store, token} = useTokenContext()\n\tconst readOnly = useMarkput(s => s.props.readOnly)\n\tif (token.type !== 'mark') throw new Error('useMark must be called within a mark token context')\n\n\treturn useMemo(() => CoreMarkController.fromToken(store, token), [store, token, readOnly])\n}","import type {MarkInfo} from '@markput/core'\nimport {findToken} from '@markput/core'\n\nimport {useTokenContext} from '../providers/TokenContext'\n\nexport const useMarkInfo = (): MarkInfo => {\n\tconst {store, token} = useTokenContext()\n\tif (token.type !== 'mark') throw new Error('useMarkInfo must be called within a mark token context')\n\n\tconst index = store.parsing.index()\n\tconst path = index.pathFor(token)\n\tif (!path) throw new Error('Mark token is not indexed')\n\tconst address = index.addressFor(path)\n\tif (!address) throw new Error('Mark token path is stale')\n\n\tconst info = findToken(store.parsing.tokens(), token)\n\treturn {\n\t\taddress,\n\t\tdepth: info?.depth ?? 0,\n\t\thasNestedMarks: token.children.some(child => child.type === 'mark'),\n\t\tkey: index.key(path),\n\t}\n}"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["#map","#counter","getOrCreate","tokensToString","#generation","#parseValue","#subscribeValue","#scope","#subscribeReactiveParse","#subscribeReparse","#enableFocusTracking","#enableSelectionTracking","#applyRangeToDOM","#rawRangeForMatch","#handleCopy","#domIndex","#pendingControls","#pendingChildSequences","#handleRendered","#isComposing","#nextControlId","#nextChildSequenceId","#reconcileStructuralTextSurfaces","#elementRoles","#pathElements","#findTextTargetForRawPosition","#focusMarkBoundaryForRawPosition","#placeCaretInTextSurface","#placeSelection","#placeCollapsedBoundary","#rawPositionFromContainerBoundary","#rawPositionFromTokenChildBoundary","#rendering","#queuedRender","#commitRendered","#indexBlockTokens","#indexTokenSequence","#generation","#childSequenceHostsFor","#elementChildren","#isControlRoot","#indexTokenElement","#indexNestedTokenSequence","#locateRegisteredDescendant","#boundaryInTextSurface","#unsub","#reorder","#add","#delete","#duplicate","#rangeAfterDrag","caretDom.getCaretIndex","caretDom.isOnFirstLine","caretDom.getRect","caretDom.isOnLastLine","rawRangeFromInputEvent","rawRangeFromTargetRange","rawSelectionReason","#shape","#resolve","#serialize","caretDom.getRect","#scope","#probeTrigger","#probeTriggerFromCaretRange","#emit","#blockIndex","#dragAction","#cleanupContainer","#cleanupGrip","#cleanupMenu","#map","styles","styles","styles","styles","styles","styles","styles","CoreMarkController"],"sources":["../../../core/src/shared/utils/shallow.ts","../../../core/src/shared/utils/cx.ts","../../../core/src/shared/utils/merge.ts","../../../core/src/shared/utils/replaceInString.ts","../../../core/src/shared/constants.ts","../../../core/src/shared/classes/MarkputHandler.ts","../../../core/src/shared/classes/KeyGenerator.ts","../../../core/src/shared/signals/alien-signals/system.ts","../../../core/src/shared/signals/signal.ts","../../../core/src/features/parsing/parser/constants.ts","../../../core/src/features/parsing/parser/core/MarkupDescriptor.ts","../../../core/src/features/parsing/parser/core/MarkupRegistry.ts","../../../core/src/features/parsing/parser/utils/getSegmentIndex.ts","../../../core/src/features/parsing/parser/core/Match.ts","../../../core/src/features/parsing/parser/core/PatternMatcher.ts","../../../core/src/shared/escape.ts","../../../core/src/features/parsing/parser/core/SegmentMatcher.ts","../../../core/src/features/parsing/parser/utils/createTextToken.ts","../../../core/src/features/parsing/parser/core/TreeBuilder.ts","../../../core/src/features/parsing/parser/utils/processTokens.ts","../../../core/src/features/parsing/parser/utils/annotate.ts","../../../core/src/features/parsing/parser/utils/toString.ts","../../../core/src/features/parsing/parser/Parser.ts","../../../core/src/features/parsing/parser/utils/denote.ts","../../../core/src/features/parsing/utils/findToken.ts","../../../core/src/features/parsing/tokenIndex.ts","../../../core/src/features/parsing/ParseController.ts","../../../core/src/shared/checkers/domGuards.ts","../../../core/src/features/caret/CaretModel.ts","../../../core/src/features/caret/TriggerFinder.ts","../../../core/src/features/caret/caretDom.ts","../../../core/src/features/clipboard/pasteMarkup.ts","../../../core/src/features/clipboard/ClipboardController.ts","../../../core/src/features/dom/DomController.ts","../../../core/src/features/editing/createRowContent.ts","../../../core/src/features/drag/operations.ts","../../../core/src/features/drag/tokens.ts","../../../core/src/features/drag/DragController.ts","../../../core/src/shared/utils/dragUtils.ts","../../../core/src/features/drag/config.ts","../../../core/src/features/edit/EditController.ts","../../../core/src/features/keyboard/arrowNav.ts","../../../core/src/features/keyboard/blockEdit.ts","../../../core/src/features/keyboard/input.ts","../../../core/src/features/keyboard/KeyboardController.ts","../../../core/src/features/lifecycle/Lifecycle.ts","../../../core/src/features/mark/MarkController.ts","../../../core/src/shared/utils/dataAttributes.ts","../../../core/src/features/slots/resolveOptionSlot.ts","../../../core/src/features/slots/resolveSlot.ts","../../../core/src/features/slots/SlotsFeature.ts","../../../core/src/features/mark/MarkFeature.ts","../../../core/src/features/overlay/filterSuggestions.ts","../../../core/src/features/overlay/createMarkFromOverlay.ts","../../../core/src/features/overlay/OverlayController.ts","../../../core/src/features/overlay/suggestionNavigation.ts","../../../core/src/features/props/PropsModel.ts","../../../core/src/features/value/ValueModel.ts","../../../core/src/shared/utils/menuUtils.ts","../../../core/src/store/BlockStore.ts","../../../core/src/store/BlockRegistry.ts","../../../core/src/store/Store.ts","../src/lib/providers/StoreContext.ts","../src/lib/hooks/useMarkput.ts","../src/components/Popup/List.tsx","../src/components/Popup/ListItem.tsx","../src/components/Popup/Popup.tsx","../src/components/BlockMenu.tsx","../src/components/DragHandle.tsx","../src/components/DropIndicator.tsx","../src/lib/providers/TokenContext.ts","../src/components/TokenChildren.tsx","../src/components/Token.tsx","../src/components/Block.tsx","../src/components/Container.tsx","../src/lib/hooks/useOverlay.tsx","../src/components/Suggestions/Suggestions.tsx","../src/components/OverlayRenderer.tsx","../src/components/MarkedInput.tsx","../src/lib/hooks/useMark.tsx","../src/lib/hooks/useMarkInfo.tsx"],"sourcesContent":["export function shallow(objA: unknown, objB: unknown) {\n\tif (Object.is(objA, objB)) {\n\t\treturn true\n\t}\n\tif (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n\t\treturn false\n\t}\n\tconst keysA = Object.keys(objA)\n\tif (keysA.length !== Object.keys(objB).length) {\n\t\treturn false\n\t}\n\tfor (const key of keysA) {\n\t\tif (!Object.prototype.hasOwnProperty.call(objB, key)) {\n\t\t\treturn false\n\t\t}\n\t\tif (!Object.is(Reflect.get(objA, key), Reflect.get(objB, key))) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}","export function cx(...classes: (string | undefined | null | false)[]): string | undefined {\n\treturn classes.filter(Boolean).join(' ') || undefined\n}","export function merge<T extends object>(...objects: (T | undefined | null | false)[]): T | undefined {\n\t// oxlint-disable-next-line no-unsafe-argument, no-unsafe-call, no-unsafe-return, no-unsafe-type-assertion\n\tconst result = Object.assign({}, ...objects.filter(Boolean)) as T\n\treturn Object.keys(result).length > 0 ? result : undefined\n}","import type {Range} from '../editorContracts'\n\nexport function replaceInString(current: string, range: Range, replacement: string): string | undefined {\n\tif (range.start < 0 || range.end < range.start || range.end > current.length) return undefined\n\treturn current.slice(0, range.start) + replacement + current.slice(range.end)\n}","import type {Markup} from '../features/parsing/parser/types'\nimport type {CoreOption} from './types'\n\nexport interface DefaultOverlayConfig {\n\ttrigger?: string\n\tdata?: string[]\n}\n\nexport interface DefaultOption extends CoreOption {\n\toverlay?: DefaultOverlayConfig\n}\n\nexport const KEYBOARD = {\n\t// Navigation Keys\n\tUP: 'ArrowUp',\n\tDOWN: 'ArrowDown',\n\tLEFT: 'ArrowLeft',\n\tRIGHT: 'ArrowRight',\n\tEND: 'End',\n\tHOME: 'Home',\n\tPAGE_DOWN: 'PageDown',\n\tPAGE_UP: 'PageUp',\n\n\t// Whitespace Keys\n\tENTER: 'Enter',\n\tTAB: 'Tab',\n\tSPACE: ' ',\n\n\t// Editing Keys\n\tBACKSPACE: 'Backspace',\n\tDELETE: 'Delete',\n\tCOMMA: ',',\n\n\t// UI Keys\n\tESC: 'Escape',\n} as const\nexport type KEYBOARD = (typeof KEYBOARD)[keyof typeof KEYBOARD]\n\nexport const DEFAULT_OVERLAY_TRIGGER = '@'\n\nexport const DEFAULT_MARKUP: Markup = '@[__value__](__meta__)'\n\nexport const DEFAULT_OPTIONS: DefaultOption[] = [\n\t{\n\t\tmarkup: DEFAULT_MARKUP,\n\t\toverlay: {\n\t\t\ttrigger: DEFAULT_OVERLAY_TRIGGER,\n\t\t\tdata: [],\n\t\t},\n\t},\n]","import type {DomController} from '../../features/dom/DomController'\nimport type {OverlayController} from '../../features/overlay/OverlayController'\nimport type {ParseController} from '../../features/parsing/ParseController'\n\nexport class MarkputHandler {\n\tconstructor(\n\t\tprivate readonly dom: DomController,\n\t\tprivate readonly overlayFeature: OverlayController,\n\t\tprivate readonly parsing: ParseController\n\t) {}\n\n\tget container() {\n\t\treturn this.dom.container()\n\t}\n\n\tget overlay() {\n\t\treturn this.overlayFeature.element()\n\t}\n\n\tfocus() {\n\t\tconst firstAddress = this.parsing.index().addressFor([0])\n\t\tif (firstAddress && this.dom.focusAddress(firstAddress).ok) return\n\t\tthis.container?.focus()\n\t}\n}","export class KeyGenerator {\n\t#counter = 1\n\treadonly #map = new WeakMap<object, number>()\n\n\tget(object: object) {\n\t\tif (this.#map.has(object)) return this.#map.get(object)\n\n\t\tthis.#map.set(object, this.#counter)\n\t\treturn this.#counter++\n\t}\n}","export interface ReactiveNode {\n\tdeps?: Link\n\tdepsTail?: Link\n\tsubs?: Link\n\tsubsTail?: Link\n\tflags: ReactiveFlags\n}\n\nexport interface Link {\n\tversion: number\n\tdep: ReactiveNode\n\tsub: ReactiveNode\n\tprevSub: Link | undefined\n\tnextSub: Link | undefined\n\tprevDep: Link | undefined\n\tnextDep: Link | undefined\n}\n\ninterface Stack<T> {\n\tvalue: T\n\tprev: Stack<T> | undefined\n}\n\nexport const enum ReactiveFlags {\n\tNone = 0,\n\tMutable = 1,\n\tWatching = 2,\n\tRecursedCheck = 4,\n\tRecursed = 8,\n\tDirty = 16,\n\tPending = 32,\n}\n\nexport function createReactiveSystem({\n\tupdate,\n\tnotify,\n\tunwatched,\n}: {\n\tupdate(sub: ReactiveNode): boolean\n\tnotify(sub: ReactiveNode): void\n\tunwatched(sub: ReactiveNode): void\n}) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate,\n\t}\n\n\tfunction link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n\t\tconst prevDep = sub.depsTail\n\t\tif (prevDep !== undefined && prevDep.dep === dep) {\n\t\t\treturn\n\t\t}\n\t\tconst nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n\t\tif (nextDep !== undefined && nextDep.dep === dep) {\n\t\t\tnextDep.version = version\n\t\t\tsub.depsTail = nextDep\n\t\t\treturn\n\t\t}\n\t\tconst prevSub = dep.subsTail\n\t\tif (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n\t\t\treturn\n\t\t}\n\t\tconst newLink =\n\t\t\t(sub.depsTail =\n\t\t\tdep.subsTail =\n\t\t\t\t{\n\t\t\t\t\tversion,\n\t\t\t\t\tdep,\n\t\t\t\t\tsub,\n\t\t\t\t\tprevDep,\n\t\t\t\t\tnextDep,\n\t\t\t\t\tprevSub,\n\t\t\t\t\tnextSub: undefined,\n\t\t\t\t})\n\t\tif (nextDep !== undefined) {\n\t\t\tnextDep.prevDep = newLink\n\t\t}\n\t\tif (prevDep !== undefined) {\n\t\t\tprevDep.nextDep = newLink\n\t\t} else {\n\t\t\tsub.deps = newLink\n\t\t}\n\t\tif (prevSub !== undefined) {\n\t\t\tprevSub.nextSub = newLink\n\t\t} else {\n\t\t\tdep.subs = newLink\n\t\t}\n\t}\n\n\tfunction unlink(link: Link, sub = link.sub): Link | undefined {\n\t\tconst dep = link.dep\n\t\tconst prevDep = link.prevDep\n\t\tconst nextDep = link.nextDep\n\t\tconst nextSub = link.nextSub\n\t\tconst prevSub = link.prevSub\n\t\tif (nextDep !== undefined) {\n\t\t\tnextDep.prevDep = prevDep\n\t\t} else {\n\t\t\tsub.depsTail = prevDep\n\t\t}\n\t\tif (prevDep !== undefined) {\n\t\t\tprevDep.nextDep = nextDep\n\t\t} else {\n\t\t\tsub.deps = nextDep\n\t\t}\n\t\tif (nextSub !== undefined) {\n\t\t\tnextSub.prevSub = prevSub\n\t\t} else {\n\t\t\tdep.subsTail = prevSub\n\t\t}\n\t\tif (prevSub !== undefined) {\n\t\t\tprevSub.nextSub = nextSub\n\t\t} else if ((dep.subs = nextSub) === undefined) {\n\t\t\tunwatched(dep)\n\t\t}\n\t\treturn nextDep\n\t}\n\n\tfunction propagate(link: Link): void {\n\t\tlet next = link.nextSub\n\t\tlet stack: Stack<Link | undefined> | undefined\n\n\t\ttop: do {\n\t\t\tconst sub = link.sub\n\t\t\tlet flags = sub.flags\n\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tflags &\n\t\t\t\t\t(ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed | ReactiveFlags.Dirty | ReactiveFlags.Pending)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsub.flags = flags | ReactiveFlags.Pending\n\t\t\t} else if (!(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))) {\n\t\t\t\tflags = ReactiveFlags.None\n\t\t\t} else if (!(flags & ReactiveFlags.RecursedCheck)) {\n\t\t\t\tsub.flags = (flags & ~ReactiveFlags.Recursed) | ReactiveFlags.Pending\n\t\t\t} else if (!(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending)\n\t\t\t\tflags &= ReactiveFlags.Mutable\n\t\t\t} else {\n\t\t\t\tflags = ReactiveFlags.None\n\t\t\t}\n\n\t\t\tif (flags & ReactiveFlags.Watching) {\n\t\t\t\tnotify(sub)\n\t\t\t}\n\n\t\t\tif (flags & ReactiveFlags.Mutable) {\n\t\t\t\tconst subSubs = sub.subs\n\t\t\t\tif (subSubs !== undefined) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub\n\t\t\t\t\tif (nextSub !== undefined) {\n\t\t\t\t\t\tstack = {value: next, prev: stack}\n\t\t\t\t\t\tnext = nextSub\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((link = next!) !== undefined) {\n\t\t\t\tnext = link.nextSub\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\twhile (stack !== undefined) {\n\t\t\t\tlink = stack.value!\n\t\t\t\tstack = stack.prev\n\t\t\t\tif (link !== undefined) {\n\t\t\t\t\tnext = link.nextSub\n\t\t\t\t\tcontinue top\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak\n\t\t} while (true)\n\t}\n\n\tfunction checkDirty(link: Link, sub: ReactiveNode): boolean {\n\t\tlet stack: Stack<Link> | undefined\n\t\tlet checkDepth = 0\n\t\tlet dirty = false\n\n\t\ttop: do {\n\t\t\tconst dep = link.dep\n\t\t\tconst flags = dep.flags\n\n\t\t\tif (sub.flags & ReactiveFlags.Dirty) {\n\t\t\t\tdirty = true\n\t\t\t} else if (\n\t\t\t\t(flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n\t\t\t\t(ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n\t\t\t) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs!\n\t\t\t\t\tif (subs.nextSub !== undefined) {\n\t\t\t\t\t\tshallowPropagate(subs)\n\t\t\t\t\t}\n\t\t\t\t\tdirty = true\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n\t\t\t\t(ReactiveFlags.Mutable | ReactiveFlags.Pending)\n\t\t\t) {\n\t\t\t\tif (link.nextSub !== undefined || link.prevSub !== undefined) {\n\t\t\t\t\tstack = {value: link, prev: stack}\n\t\t\t\t}\n\t\t\t\tlink = dep.deps!\n\t\t\t\tsub = dep\n\t\t\t\t++checkDepth\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep\n\t\t\t\tif (nextDep !== undefined) {\n\t\t\t\t\tlink = nextDep\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs!\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== undefined\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack!.value\n\t\t\t\t\tstack = stack!.prev\n\t\t\t\t} else {\n\t\t\t\t\tlink = firstSub\n\t\t\t\t}\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\t\t\tshallowPropagate(firstSub)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsub = link.sub\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false\n\t\t\t\t} else {\n\t\t\t\t\tsub.flags &= ~ReactiveFlags.Pending\n\t\t\t\t}\n\t\t\t\tsub = link.sub\n\t\t\t\tconst nextDep = link.nextDep\n\t\t\t\tif (nextDep !== undefined) {\n\t\t\t\t\tlink = nextDep\n\t\t\t\t\tcontinue top\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dirty\n\t\t} while (true)\n\t}\n\n\tfunction shallowPropagate(link: Link): void {\n\t\tdo {\n\t\t\tconst sub = link.sub\n\t\t\tconst flags = sub.flags\n\t\t\tif ((flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) === ReactiveFlags.Pending) {\n\t\t\t\tsub.flags = flags | ReactiveFlags.Dirty\n\t\t\t\tif ((flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) === ReactiveFlags.Watching) {\n\t\t\t\t\tnotify(sub)\n\t\t\t\t}\n\t\t\t}\n\t\t} while ((link = link.nextSub!) !== undefined)\n\t}\n\n\tfunction isValidLink(checkLink: Link, sub: ReactiveNode): boolean {\n\t\tlet link = sub.depsTail\n\t\twhile (link !== undefined) {\n\t\t\tif (link === checkLink) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tlink = link.prevDep\n\t\t}\n\t\treturn false\n\t}\n}","// oxlint-disable typescript/no-explicit-any -- reactive node interfaces need flexible generic defaults\nimport {createReactiveSystem, ReactiveFlags, type ReactiveNode} from './alien-signals/system'\n\n// ---------------------------------------------------------------------------\n// Node types\n// ---------------------------------------------------------------------------\n\ninterface SignalNode<T = any> extends ReactiveNode {\n\tcurrentValue: T\n\tpendingValue: T\n\tdefaultValue: T | undefined\n\thasDefault: boolean\n\tequalsFn: ((a: T, b: T) => boolean) | undefined\n\tisReadonly: boolean\n}\n\ninterface ComputedNode<T = any> extends ReactiveNode {\n\tvalue: T | undefined\n\tgetter: (previousValue?: T) => T\n\tequalsFn: ((a: T, b: T) => boolean) | undefined\n}\n\ninterface EffectNode extends ReactiveNode {\n\tfn(): void | (() => void)\n\tcleanup?: () => void\n}\n\ninterface EventNode<T = any> extends ReactiveNode {\n\tpayload: T | undefined\n\tseq: number\n}\n\n// ---------------------------------------------------------------------------\n// Module state\n// ---------------------------------------------------------------------------\n\nlet cycle = 0\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedLength = 0\nlet activeSub: ReactiveNode | undefined\nlet mutableScope = false\n\nconst queued: (EffectNode | undefined)[] = []\n\n// ---------------------------------------------------------------------------\n// Reactive system\n// ---------------------------------------------------------------------------\n\nconst {link, unlink, propagate, checkDirty, shallowPropagate} = createReactiveSystem({\n\tupdate(node: SignalNode | ComputedNode | EventNode): boolean {\n\t\tif ('getter' in node) {\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\t\treturn updateComputed(node)\n\t\t}\n\t\tif ('seq' in node) {\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\t\treturn updateEvent(node)\n\t\t}\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime property check\n\t\treturn updateSignal(node)\n\t},\n\tnotify(effect: EffectNode) {\n\t\tlet insertIndex = queuedLength\n\t\tlet firstInsertedIndex = insertIndex\n\n\t\tdo {\n\t\t\tqueued[insertIndex++] = effect\n\t\t\teffect.flags &= ~ReactiveFlags.Watching\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- subs chain is always an EffectNode here\n\t\t\teffect = effect.subs?.sub as EffectNode\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition -- cast from sub?: ReactiveNode can be undefined\n\t\t\tif (effect === undefined || !(effect.flags & ReactiveFlags.Watching)) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition, no-constant-condition -- intentional infinite loop with break\n\t\t} while (true)\n\n\t\tqueuedLength = insertIndex\n\n\t\twhile (firstInsertedIndex < --insertIndex) {\n\t\t\tconst left = queued[firstInsertedIndex]\n\t\t\tqueued[firstInsertedIndex++] = queued[insertIndex]\n\t\t\tqueued[insertIndex] = left\n\t\t}\n\t},\n\tunwatched(node) {\n\t\tif (!(node.flags & ReactiveFlags.Mutable)) {\n\t\t\tif ('fn' in node) {\n\t\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- discriminated by runtime 'fn' in node check\n\t\t\t\tconst e = node as EffectNode\n\t\t\t\tif (e.cleanup !== undefined) {\n\t\t\t\t\te.cleanup()\n\t\t\t\t\te.cleanup = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\teffectScopeOper.call(node)\n\t\t} else if (node.depsTail !== undefined) {\n\t\t\tnode.depsTail = undefined\n\t\t\tnode.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\t\tpurgeDeps(node)\n\t\t}\n\t},\n})\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction setActiveSub(sub?: ReactiveNode) {\n\tconst prevSub = activeSub\n\tactiveSub = sub\n\treturn prevSub\n}\n\nfunction updateSignal(s: SignalNode): boolean {\n\ts.flags = ReactiveFlags.Mutable\n\treturn s.currentValue !== (s.currentValue = s.pendingValue)\n}\n\nfunction updateComputed(c: ComputedNode): boolean {\n\t++cycle\n\tc.depsTail = undefined\n\tc.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n\tconst prevSub = setActiveSub(c)\n\ttry {\n\t\tconst oldValue = c.value\n\t\tconst newValue = c.getter(oldValue)\n\t\tif (c.equalsFn !== undefined && oldValue !== undefined && c.equalsFn(oldValue, newValue)) {\n\t\t\treturn false\n\t\t}\n\t\treturn oldValue !== (c.value = newValue)\n\t} finally {\n\t\tactiveSub = prevSub\n\t\tc.flags &= ~ReactiveFlags.RecursedCheck\n\t\tpurgeDeps(c)\n\t}\n}\n\nfunction updateEvent(e: EventNode): boolean {\n\te.flags = ReactiveFlags.Mutable\n\treturn true\n}\n\nfunction run(e: EffectNode): void {\n\tconst flags = e.flags\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- deps is guaranteed present when Pending\n\tif (flags & ReactiveFlags.Dirty || (flags & ReactiveFlags.Pending && checkDirty(e.deps!, e))) {\n\t\tif (e.cleanup !== undefined) {\n\t\t\te.cleanup()\n\t\t\te.cleanup = undefined\n\t\t}\n\t\t++cycle\n\t\te.depsTail = undefined\n\t\te.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n\t\tconst prevSub = setActiveSub(e)\n\t\ttry {\n\t\t\tconst result = e.fn()\n\t\t\tif (typeof result === 'function') {\n\t\t\t\te.cleanup = result as () => void\n\t\t\t}\n\t\t} finally {\n\t\t\tactiveSub = prevSub\n\t\t\te.flags &= ~ReactiveFlags.RecursedCheck\n\t\t\tpurgeDeps(e)\n\t\t}\n\t} else {\n\t\te.flags = ReactiveFlags.Watching\n\t}\n}\n\nfunction flush(): void {\n\ttry {\n\t\twhile (notifyIndex < queuedLength) {\n\t\t\t// oxlint-disable-next-line typescript/no-non-null-assertion -- index < queuedLength guarantees non-undefined\n\t\t\tconst effect = queued[notifyIndex]!\n\t\t\tqueued[notifyIndex++] = undefined\n\t\t\trun(effect)\n\t\t}\n\t} finally {\n\t\twhile (notifyIndex < queuedLength) {\n\t\t\t// oxlint-disable-next-line typescript/no-non-null-assertion -- index < queuedLength guarantees non-undefined\n\t\t\tconst effect = queued[notifyIndex]!\n\t\t\tqueued[notifyIndex++] = undefined\n\t\t\teffect.flags |= ReactiveFlags.Watching | ReactiveFlags.Recursed\n\t\t}\n\t\tnotifyIndex = 0\n\t\tqueuedLength = 0\n\t}\n}\n\nfunction purgeDeps(sub: ReactiveNode) {\n\tconst depsTail = sub.depsTail\n\tlet dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n\twhile (dep !== undefined) {\n\t\tdep = unlink(dep, sub)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Oper functions (bound to nodes)\n// ---------------------------------------------------------------------------\n\nfunction signalOper<T>(this: SignalNode<T>, ...value: [T | undefined] | []): T | void {\n\tif (value.length) {\n\t\tif (this.isReadonly && !mutableScope) return\n\t\tconst v = value[0]\n\t\tif (v === undefined) {\n\t\t\tconst isAtDefault = this.hasDefault\n\t\t\t\t? this.pendingValue === undefined || this.pendingValue === this.defaultValue\n\t\t\t\t: this.pendingValue === undefined\n\t\t\tif (isAtDefault) return\n\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- undefined is valid for T when reverting to default\n\t\t\tthis.pendingValue = undefined as T\n\t\t} else {\n\t\t\tconst current = this.pendingValue\n\t\t\tconst effectiveCurrent = current === undefined && this.hasDefault ? this.defaultValue : current\n\t\t\tif (this.equalsFn !== undefined) {\n\t\t\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- effectiveCurrent is T when equalsFn is defined and either current !== undefined or hasDefault\n\t\t\t\tif (this.equalsFn(effectiveCurrent as T, v)) return\n\t\t\t} else {\n\t\t\t\tif (effectiveCurrent === v) return\n\t\t\t}\n\t\t\tthis.pendingValue = v\n\t\t}\n\t\tthis.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\tconst subs = this.subs\n\t\tif (subs !== undefined) {\n\t\t\tpropagate(subs)\n\t\t\tif (!batchDepth) {\n\t\t\t\tflush()\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (this.flags & ReactiveFlags.Dirty) {\n\t\t\tif (updateSignal(this)) {\n\t\t\t\tconst subs = this.subs\n\t\t\t\tif (subs !== undefined) {\n\t\t\t\t\tshallowPropagate(subs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Walk to the nearest subscriber with Mutable or Watching flags.\n\t\t// Needed when activeSub is a non-tracking scope node (e.g. effectScope with flags: None)\n\t\t// rather than a computed/effect. computedOper/eventReadOper can link directly because they\n\t\t// are only called inside reactive contexts that guarantee a valid subscriber, but signals\n\t\t// may be read in broader scopes.\n\t\tlet sub = activeSub\n\t\twhile (sub !== undefined) {\n\t\t\tif (sub.flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) {\n\t\t\t\tlink(this, sub, cycle)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tsub = sub.subs?.sub\n\t\t}\n\t\tconst v = this.currentValue\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- defaultValue is T when hasDefault is true\n\t\tif (v === undefined && this.hasDefault) return this.defaultValue as T\n\t\treturn v\n\t}\n}\n\nfunction computedOper<T>(this: ComputedNode<T>): T {\n\tconst flags = this.flags\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- deps is guaranteed present when Pending\n\tconst deps = this.deps!\n\tif (\n\t\tflags & ReactiveFlags.Dirty ||\n\t\t(flags & ReactiveFlags.Pending &&\n\t\t\t// oxlint-disable-next-line typescript/no-unnecessary-condition -- comma expr with false is intentional for side effect\n\t\t\t(checkDirty(deps, this) || ((this.flags = flags & ~ReactiveFlags.Pending), false)))\n\t) {\n\t\tif (updateComputed(this)) {\n\t\t\tconst subs = this.subs\n\t\t\tif (subs !== undefined) {\n\t\t\t\tshallowPropagate(subs)\n\t\t\t}\n\t\t}\n\t} else if (!flags) {\n\t\tthis.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n\t\tconst prevSub = setActiveSub(this)\n\t\ttry {\n\t\t\tthis.value = this.getter()\n\t\t} finally {\n\t\t\tactiveSub = prevSub\n\t\t\tthis.flags &= ~ReactiveFlags.RecursedCheck\n\t\t}\n\t}\n\tconst sub = activeSub\n\tif (sub !== undefined) {\n\t\tlink(this, sub, cycle)\n\t}\n\t// oxlint-disable-next-line typescript/no-non-null-assertion -- value is always set before read\n\treturn this.value!\n}\n\nfunction eventReadOper<T>(this: EventNode<T>): T | undefined {\n\tif (this.flags & ReactiveFlags.Dirty) {\n\t\tupdateEvent(this)\n\t}\n\tconst sub = activeSub\n\tif (sub !== undefined) {\n\t\tlink(this, sub, cycle)\n\t}\n\treturn this.payload\n}\n\nfunction effectOper(this: EffectNode): void {\n\tif (this.cleanup !== undefined) {\n\t\tthis.cleanup()\n\t\tthis.cleanup = undefined\n\t}\n\teffectScopeOper.call(this)\n}\n\nfunction effectScopeOper(this: ReactiveNode): void {\n\tthis.depsTail = undefined\n\tthis.flags = ReactiveFlags.None\n\tpurgeDeps(this)\n\tconst sub = this.subs\n\tif (sub !== undefined) {\n\t\tunlink(sub)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Signal<T> — reactive state value\n// ---------------------------------------------------------------------------\n\nexport interface Signal<T> {\n\t(): T\n\t(value: T | undefined): void\n}\n\nexport type SignalValues<T> = {\n\t[K in keyof T]: T[K] extends Signal<infer V> | Computed<infer V> ? V : T[K]\n}\n\nexport function isReactive(fn: unknown): fn is Signal<unknown> | Computed<unknown> {\n\tif (typeof fn !== 'function') return false\n\tconst name = (fn as {name: string}).name\n\treturn name === 'bound ' + signalOper.name || name === 'bound ' + computedOper.name\n}\n\ninterface SignalOptions<T> {\n\tequals?: (a: T, b: T) => boolean\n\treadonly?: boolean\n}\n\nexport function signal<T = never>(initial: undefined, opts?: SignalOptions<T | undefined>): Signal<T | undefined>\nexport function signal<T>(initial: T, opts?: SignalOptions<T>): Signal<T>\nexport function signal<T>(initial: T, opts?: SignalOptions<T>): Signal<T> {\n\tconst node: SignalNode<T> = {\n\t\tcurrentValue: initial,\n\t\tpendingValue: initial,\n\t\tdefaultValue: initial,\n\t\thasDefault: initial !== undefined,\n\t\tequalsFn: opts?.equals ?? undefined,\n\t\tisReadonly: !!opts?.readonly,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.Mutable,\n\t}\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Signal<T> interface but TS can't verify the overloaded call signature\n\treturn (signalOper as (this: SignalNode<T>, ...value: [T | undefined] | []) => T | void).bind(\n\t\tnode\n\t) as unknown as Signal<T>\n}\n\n// ---------------------------------------------------------------------------\n// Computed<T> — derived reactive value\n// ---------------------------------------------------------------------------\n\nexport interface Computed<T> {\n\t(): T\n}\n\ninterface ComputedOptions<T> {\n\tequals?: (a: T, b: T) => boolean\n}\n\nexport function computed<T>(opts: {\n\tget: (prev?: T) => T\n\tset: (next: T) => void\n\tequals?: (a: T, b: T) => boolean\n}): Signal<T>\nexport function computed<T>(getter: (previousValue?: T) => T, opts?: ComputedOptions<T>): Computed<T>\nexport function computed<T>(\n\tgetterOrOpts:\n\t\t| ((previousValue?: T) => T)\n\t\t| {\n\t\t\t\tget: (prev?: T) => T\n\t\t\t\tset: (next: T) => void\n\t\t\t\tequals?: (a: T, b: T) => boolean\n\t\t },\n\topts?: ComputedOptions<T>\n): Signal<T> | Computed<T> {\n\tconst isWritable = typeof getterOrOpts !== 'function'\n\tconst node: ComputedNode<T> = {\n\t\tvalue: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.None,\n\t\tgetter: isWritable ? getterOrOpts.get : (getterOrOpts as (previousValue?: T) => T),\n\t\tequalsFn: (isWritable ? getterOrOpts.equals : opts?.equals) ?? undefined,\n\t}\n\tconst readFn = (computedOper as (this: ComputedNode<T>) => T).bind(node)\n\n\tif (!isWritable) {\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Computed<T> interface but TS can't verify the call signature\n\t\treturn readFn as unknown as Computed<T>\n\t}\n\n\tconst writableComputed = function writableComputedOper(...args: [T | undefined] | []): T | void {\n\t\tif (args.length === 0) return readFn()\n\t\tconst next = args[0]\n\t\tif (next === undefined) return\n\t\tgetterOrOpts.set(next)\n\t}\n\tObject.defineProperty(writableComputed, 'name', {value: 'bound ' + computedOper.name})\n\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Signal<T> interface but TS can't verify the overloaded call signature\n\treturn writableComputed as unknown as Signal<T>\n}\n\n// ---------------------------------------------------------------------------\n// Event<T> — unified reactive event primitive\n// ---------------------------------------------------------------------------\n\nexport interface Event<T = void> {\n\t(payload: T): void\n\tread(): T | undefined\n}\n\nexport function event<T = void>(): Event<T> {\n\tconst node: EventNode<T> = {\n\t\tpayload: undefined,\n\t\tseq: 0,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.Mutable,\n\t}\n\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Event<T> interface but TS can't verify the call signature\n\tconst callable = function eventCallable(payload: T) {\n\t\tnode.payload = payload\n\t\tnode.seq++\n\t\tnode.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n\t\tconst subs = node.subs\n\t\tif (subs !== undefined) {\n\t\t\tpropagate(subs)\n\t\t\tif (!batchDepth) {\n\t\t\t\tflush()\n\t\t\t}\n\t\t}\n\t} as unknown as Event<T>\n\n\tcallable.read = (eventReadOper as (this: EventNode<T>) => T | undefined).bind(node)\n\n\treturn callable\n}\n\n// ---------------------------------------------------------------------------\n// effect() / effectScope()\n// ---------------------------------------------------------------------------\n\nexport function effect(fn: () => void | (() => void)): () => void {\n\tconst e: EffectNode = {\n\t\tfn,\n\t\tcleanup: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\t}\n\tconst prevSub = setActiveSub(e)\n\tif (prevSub !== undefined) {\n\t\tlink(e, prevSub, 0)\n\t}\n\ttry {\n\t\tconst result = e.fn()\n\t\tif (typeof result === 'function') {\n\t\t\te.cleanup = result as () => void\n\t\t}\n\t} finally {\n\t\tactiveSub = prevSub\n\t\te.flags &= ~ReactiveFlags.RecursedCheck\n\t}\n\treturn effectOper.bind(e)\n}\n\nexport function effectScope(fn: () => void): () => void {\n\tconst e: ReactiveNode = {\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tsubs: undefined,\n\t\tsubsTail: undefined,\n\t\tflags: ReactiveFlags.None,\n\t}\n\tconst prevSub = setActiveSub(e)\n\tif (prevSub !== undefined) {\n\t\tlink(e, prevSub, 0)\n\t}\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tactiveSub = prevSub\n\t}\n\treturn effectScopeOper.bind(e)\n}\n\n// ---------------------------------------------------------------------------\n// watch() — skip-first-run helper for event subscriptions\n// ---------------------------------------------------------------------------\n\nexport function watch<T>(dep: Signal<T>, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(dep: Event<T>, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(dep: () => T, fn: (newValue: T, oldValue: T | undefined) => void): () => void\nexport function watch<T>(\n\tdep: Signal<T> | Event<T> | (() => T),\n\tfn: (newValue: T, oldValue: T | undefined) => void\n): () => void {\n\tlet initialized = false\n\tlet oldValue: T | undefined\n\treturn effect(() => {\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- Event<T> returns T | undefined before first emit, but watch skips the first run so callback always receives T\n\t\tconst newValue = ('read' in dep ? dep.read() : dep()) as T\n\t\tif (!initialized) {\n\t\t\tinitialized = true\n\t\t\toldValue = newValue\n\t\t\treturn\n\t\t}\n\t\tconst prev = oldValue\n\t\toldValue = newValue\n\t\tuntracked(() => fn(newValue, prev))\n\t})\n}\n\n// ---------------------------------------------------------------------------\n// batch() — defer effect flush until callback completes\n// ---------------------------------------------------------------------------\n\ninterface BatchOptions {\n\tmutable?: boolean\n}\n\nexport function batch(fn: () => void, opts?: BatchOptions): void {\n\tconst prevMutable = mutableScope\n\tif (opts?.mutable) mutableScope = true\n\t++batchDepth\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tif (!--batchDepth) {\n\t\t\tflush()\n\t\t}\n\t\tmutableScope = prevMutable\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// trigger() — re-run code that reads signals and propagate the result\n// ---------------------------------------------------------------------------\n\nexport function trigger(fn: () => void) {\n\tconst sub: ReactiveNode = {\n\t\tdeps: undefined,\n\t\tdepsTail: undefined,\n\t\tflags: ReactiveFlags.Watching,\n\t}\n\tconst prevSub = setActiveSub(sub)\n\ttry {\n\t\tfn()\n\t} finally {\n\t\tactiveSub = prevSub\n\t\tlet dep = sub.deps\n\t\twhile (dep !== undefined) {\n\t\t\tconst subs = dep.dep.subs\n\t\t\tdep = unlink(dep, sub)\n\t\t\tif (subs !== undefined) {\n\t\t\t\tsub.flags = ReactiveFlags.None\n\t\t\t\tpropagate(subs)\n\t\t\t\tshallowPropagate(subs)\n\t\t\t}\n\t\t}\n\t\tif (!batchDepth) {\n\t\t\tflush()\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// untracked() — run a function without tracking reactive dependencies\n// ---------------------------------------------------------------------------\n\nexport function untracked<T>(fn: () => T): T {\n\tconst prev = setActiveSub(undefined)\n\ttry {\n\t\treturn fn()\n\t} finally {\n\t\tsetActiveSub(prev)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// model<T> — controlled/uncontrolled value primitive (Vue defineModel-inspired)\n// ---------------------------------------------------------------------------\n\nexport function model<T>(opts: {\n\tdefault?: undefined\n\tequals?: (a: T | undefined, b: T | undefined) => boolean\n\tget?: (value: T | undefined) => T | undefined\n\tset?: (next: T | undefined, previous: T | undefined) => T | undefined\n}): Signal<T | undefined>\nexport function model<T>(opts: {\n\tdefault: () => T\n\tequals?: (a: T, b: T) => boolean\n\tget?: (value: T) => T\n\tset?: (next: T | undefined, previous: T) => T\n}): Signal<T>\nexport function model<T>(opts: {\n\tdefault?: () => T\n\tequals?: (a: T, b: T) => boolean\n\tget?: (value: T) => T\n\tset?: (next: T | undefined, previous: T) => T\n}): Signal<T> {\n\tlet internal: Signal<T> | undefined\n\tconst ensureInternal = (): Signal<T> => {\n\t\tif (internal !== undefined) return internal\n\t\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- undefined is a valid seed for the no-default overload; signal() handles hasDefault correctly\n\t\tconst seed = opts.default !== undefined ? untracked(opts.default) : (undefined as T)\n\t\tinternal = signal<T>(seed, {equals: opts.equals})\n\t\treturn internal\n\t}\n\n\tconst getFn = opts.get ?? ((value: T) => value)\n\tconst setFn = opts.set ?? ((next: T | undefined, previous: T) => next ?? previous)\n\n\t// Reads go through computed so opts.get is memoized and external signals\n\t// read inside opts.get propagate to subscribers.\n\tconst reader = computed(() => getFn(ensureInternal()()))\n\n\tconst callable = function modelOper(...args: [T | undefined] | []): T | void {\n\t\tif (args.length === 0) return reader()\n\t\tconst sig = ensureInternal()\n\t\tsig(setFn(args[0], sig()))\n\t}\n\n\tObject.defineProperty(callable, 'name', {value: 'bound ' + computedOper.name})\n\n\t// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- callable matches Signal<T> interface but TS can't verify the overloaded call signature\n\treturn callable as unknown as Signal<T>\n}\n\n// ---------------------------------------------------------------------------\n// listen() — scope-aware DOM event listener\n// ---------------------------------------------------------------------------\n\nexport function listen<K extends keyof WindowEventMap>(\n\ttarget: Window,\n\tevent: K,\n\thandler: (e: WindowEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen<K extends keyof DocumentEventMap>(\n\ttarget: Document,\n\tevent: K,\n\thandler: (e: DocumentEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen<K extends keyof HTMLElementEventMap>(\n\ttarget: HTMLElement,\n\tevent: K,\n\thandler: (e: HTMLElementEventMap[K]) => void,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: EventListenerOrEventListenerObject,\n\toptions?: boolean | AddEventListenerOptions\n): () => void\nexport function listen(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: EventListenerOrEventListenerObject,\n\toptions?: boolean | AddEventListenerOptions\n): () => void {\n\treturn effect(() => {\n\t\ttarget.addEventListener(event, handler, options)\n\t\treturn () => target.removeEventListener(event, handler, options)\n\t})\n}","/**\n * Constants for ParserV2 - modern markup parser with nesting support\n *\n * This module contains the placeholder constants used by ParserV2.\n * Unlike the legacy Parser, ParserV2 supports:\n * - `__value__` - main content (replaces `__label__`)\n * - `__meta__` - metadata (replaces `__value__`)\n * - `__slot__` - nested content (new feature)\n *\n * For legacy Parser compatibility, see ../Parser/constants.ts\n * For Markup types, see ./types.ts\n */\nexport const PLACEHOLDER = {\n\tValue: '__value__',\n\tMeta: '__meta__',\n\tSlot: '__slot__',\n} as const\n\n/**\n * Gap types used in markup descriptors\n * Represents the content type in gaps between segments\n */\nexport const GAP_TYPE = {\n\tValue: 'value',\n\tMeta: 'meta',\n\tSlot: 'slot',\n} as const\n\nexport type GapType = (typeof GAP_TYPE)[keyof typeof GAP_TYPE]","import type {GapType} from '../constants'\nimport {GAP_TYPE, PLACEHOLDER} from '../constants'\nimport type {Markup} from '../types'\nimport type {SegmentDefinition} from './SegmentMatcher'\n\n/**\n * Descriptor for segment-based markup parsing\n * Converts markup templates into arrays of static or dynamic segments\n */\nexport interface MarkupDescriptor {\n\t/** Original markup template string */\n\tmarkup: Markup\n\t/** Index of this markup in the original markups array */\n\tindex: number\n\t/** Array of segment definitions (can be static strings or dynamic patterns) */\n\tsegments: SegmentDefinition[]\n\t/** Type of content in each gap between segments */\n\tgapTypes: GapType[]\n\t/** True if this markup contains a __slot__ placeholder */\n\thasSlot: boolean\n\t/** True if this markup contains exactly two __value__ placeholders */\n\thasTwoValues: boolean\n\t/** Global indices of segments in registry segments array (parallel to segments array) */\n\tsegmentGlobalIndices: number[]\n}\n\n/**\n * Creates a segment-based markup descriptor from a markup template\n *\n * Examples:\n * - `#[__value__]` -> segments: [\"#[\", \"]\"], gapTypes: [\"value\"]\n * - `#[__slot__]` -> segments: [\"#[\", \"]\"], gapTypes: [\"slot\"]\n * - `@[__value__](__meta__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"value\", \"meta\"]\n * - `@[__slot__](__meta__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"slot\", \"meta\"]\n * - `@[__value__](__slot__)` -> segments: [\"@[\", \"](\", \")\"], gapTypes: [\"value\", \"slot\"]\n * - `<__value__>__meta__</__value__>` -> segments: [{pattern: '<([^>]+)>'}, {pattern: '</([^>]+)>'}], gapTypes: [\"value\", \"meta\", \"value\"] (dynamic)\n * - `<__value__ __meta__>__slot__</__value__>` -> segments: [{pattern: '<([^> ]+) '}, \" \", {pattern: '>__slot__</([^>]+)>'}], gapTypes: [\"value\", \"meta\", \"slot\", \"value\"] (dynamic)\n */\nexport function createMarkupDescriptor(markup: Markup, index: number): MarkupDescriptor {\n\tconst {segments: rawSegments, gapTypes: rawGapTypes, counts, valueGapIndices} = scanMarkupStructure(markup)\n\n\tvalidateMarkup(counts, markup)\n\n\tconst hasTwoValues = counts.value === 2\n\n\tconst {segments, gapTypes} = hasTwoValues\n\t\t? convertTwoValuePattern(rawSegments, rawGapTypes, valueGapIndices)\n\t\t: {segments: rawSegments, gapTypes: rawGapTypes}\n\n\treturn {\n\t\tmarkup,\n\t\tindex,\n\t\tsegments,\n\t\tgapTypes,\n\t\thasSlot: counts.slot === 1,\n\t\thasTwoValues,\n\t\tsegmentGlobalIndices: Array.from({length: segments.length}), // Will be populated by MarkupRegistry\n\t}\n}\n\n/**\n * Maps placeholder types to their text representations\n */\nconst PLACEHOLDER_TEXT: Record<GapType, string> = {\n\t[GAP_TYPE.Value]: PLACEHOLDER.Value,\n\t[GAP_TYPE.Meta]: PLACEHOLDER.Meta,\n\t[GAP_TYPE.Slot]: PLACEHOLDER.Slot,\n} as const\n\n/**\n * Parses markup template into segments, gap types and placeholder counts\n */\nfunction scanMarkupStructure(markup: string) {\n\tconst segments: string[] = []\n\tconst gapTypes: GapType[] = []\n\tconst valueGapIndices: number[] = []\n\tconst counts: Record<GapType, number> = {\n\t\tvalue: 0,\n\t\tmeta: 0,\n\t\tslot: 0,\n\t}\n\n\t// Find all placeholders and sort by position\n\tconst placeholders: Array<{type: GapType; position: number}> = []\n\tconst placeholderTypes = [GAP_TYPE.Value, GAP_TYPE.Meta, GAP_TYPE.Slot] as const\n\n\tfor (const type of placeholderTypes) {\n\t\tconst text = PLACEHOLDER_TEXT[type]\n\t\tlet position = markup.indexOf(text)\n\t\twhile (position !== -1) {\n\t\t\tplaceholders.push({type, position})\n\t\t\tposition = markup.indexOf(text, position + text.length)\n\t\t}\n\t}\n\n\tplaceholders.sort((a, b) => a.position - b.position)\n\n\t// Process placeholders in order\n\tlet currentParsePosition = 0\n\tfor (const placeholder of placeholders) {\n\t\tconst segment = markup.substring(currentParsePosition, placeholder.position)\n\t\tif (segment.length > 0) {\n\t\t\tsegments.push(segment)\n\t\t}\n\n\t\tgapTypes.push(placeholder.type)\n\t\tcounts[placeholder.type]++\n\n\t\tif (placeholder.type === GAP_TYPE.Value) {\n\t\t\tvalueGapIndices.push(gapTypes.length - 1)\n\t\t}\n\n\t\tcurrentParsePosition = placeholder.position + PLACEHOLDER_TEXT[placeholder.type].length\n\t}\n\n\tconst finalSegment = markup.substring(currentParsePosition)\n\tif (finalSegment.length > 0) {\n\t\tsegments.push(finalSegment)\n\t}\n\n\treturn {\n\t\tsegments,\n\t\tgapTypes,\n\t\tcounts,\n\t\tvalueGapIndices,\n\t}\n}\n\n/**\n * Validates markup placeholder counts\n */\nfunction validateMarkup(counts: Record<GapType, number>, markup: string): void {\n\tconst rules = [\n\t\t{count: counts.value, max: 2, name: PLACEHOLDER.Value},\n\t\t{count: counts.meta, max: 1, name: PLACEHOLDER.Meta},\n\t\t{count: counts.slot, max: 1, name: PLACEHOLDER.Slot},\n\t]\n\n\tfor (const {count, max, name} of rules) {\n\t\tif (count > max) {\n\t\t\tthrow new Error(`Invalid markup: \"${markup}\". Max ${max} \"${name}\" placeholders, got ${count}`)\n\t\t}\n\t}\n\n\tif (counts.value === 0 && counts.slot === 0) {\n\t\tthrow new Error(\n\t\t\t`Invalid markup: \"${markup}\". Need at least one \"${PLACEHOLDER.Value}\" or \"${PLACEHOLDER.Slot}\"`\n\t\t)\n\t}\n}\n\n/**\n * Converts static segments around __value__ placeholders to dynamic patterns\n * For pattern like <__value__>__meta__</__value__>:\n * - Original: segments [\"<\", \">\", \"</\", \">\"], gapTypes [\"value\", \"meta\", \"value\"]\n * - Result: segments [['<', '>', exclusions], ['</', '>', exclusions]], gapTypes [\"meta\"]\n * Dynamic segments \"absorb\" the __value__ gaps they surround\n */\nfunction convertTwoValuePattern(\n\tsegments: string[],\n\tgapTypes: GapType[],\n\tvalueGapIndices: number[]\n): {segments: SegmentDefinition[]; gapTypes: GapType[]} {\n\tif (valueGapIndices.length !== 2) {\n\t\treturn {segments, gapTypes}\n\t}\n\n\tconst [firstValueGapIdx, secondValueGapIdx] = valueGapIndices\n\n\tconst newSegments: SegmentDefinition[] = []\n\n\tconst beforeFirst = segments[firstValueGapIdx]\n\tconst afterFirst = segments[firstValueGapIdx + 1]\n\tif (beforeFirst && afterFirst) {\n\t\tnewSegments.push(createDynamicDefinition(beforeFirst, afterFirst, segments[firstValueGapIdx + 2]))\n\t}\n\n\tfor (let i = firstValueGapIdx + 2; i < secondValueGapIdx; i++) {\n\t\tnewSegments.push(segments[i])\n\t}\n\n\tconst beforeSecond = segments[secondValueGapIdx]\n\tconst afterSecond = segments[secondValueGapIdx + 1]\n\tif (beforeSecond && afterSecond) {\n\t\tnewSegments.push(createDynamicDefinition(beforeSecond, afterSecond, segments[secondValueGapIdx + 2]))\n\t}\n\n\tconst filteredGapTypes = gapTypes.filter(type => type !== GAP_TYPE.Value)\n\n\treturn {segments: newSegments, gapTypes: filteredGapTypes}\n}\n\nfunction createDynamicDefinition(\n\tbeforeSegment: string,\n\tafterSegment: string,\n\tnextSegment?: string\n): [string, string, string] {\n\tif (!nextSegment) return [beforeSegment, afterSegment, '']\n\n\tconst firstChar = nextSegment.charAt(0)\n\tconst exclusion =\n\t\tfirstChar && !afterSegment.includes(firstChar) && !nextSegment.startsWith(beforeSegment) ? firstChar : ''\n\n\treturn [beforeSegment, afterSegment, exclusion]\n}","import type {Markup} from '../types'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport {createMarkupDescriptor} from './MarkupDescriptor'\nimport type {SegmentDefinition} from './SegmentMatcher'\n\nfunction getOrCreate<K, V>(map: Map<K, V[]>, key: K): V[] {\n\tlet arr = map.get(key)\n\tif (!arr) {\n\t\tarr = []\n\t\tmap.set(key, arr)\n\t}\n\treturn arr\n}\n\n/**\n * Registry for managing markup descriptors\n * Centralizes access to all markup patterns and their descriptors\n */\nexport class MarkupRegistry {\n\treadonly markups: (Markup | undefined)[]\n\treadonly descriptors: MarkupDescriptor[]\n\t/** Deduplicated list of unique segment definitions (static strings or dynamic patterns) */\n\treadonly segments: SegmentDefinition[] = []\n\t/** Map from first segment index to descriptors that start with this segment (for O(1) lookup) */\n\treadonly firstSegmentIndexMap: Map<number, MarkupDescriptor[]> = new Map()\n\n\tconstructor(markups: (Markup | undefined)[]) {\n\t\tthis.markups = markups\n\n\t\tconst segmentIndexMap = new Map<string, number>()\n\n\t\tthis.descriptors = markups\n\t\t\t.map((markup, index) => {\n\t\t\t\t// Skip undefined markups but preserve original indices\n\t\t\t\tif (markup === undefined) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tconst descriptor = createMarkupDescriptor(markup, index)\n\n\t\t\t\t// Process segments and register them\n\t\t\t\tdescriptor.segments.forEach((segment, segmentIndex) => {\n\t\t\t\t\tthis.processSegment(descriptor, segment, segmentIndex, segmentIndexMap)\n\t\t\t\t})\n\n\t\t\t\tthis.addToFirstSegmentIndexMap(descriptor)\n\n\t\t\t\treturn descriptor\n\t\t\t})\n\t\t\t.filter((descriptor): descriptor is MarkupDescriptor => descriptor !== null)\n\t}\n\n\t/**\n\t * Adds a descriptor to the firstSegmentIndexMap using its first segment's global index\n\t */\n\tprivate addToFirstSegmentIndexMap(descriptor: MarkupDescriptor): void {\n\t\tconst firstSegmentIndex = descriptor.segmentGlobalIndices[0]\n\n\t\tgetOrCreate(this.firstSegmentIndexMap, firstSegmentIndex).push(descriptor)\n\t}\n\n\tprivate processSegment(\n\t\tdescriptor: MarkupDescriptor,\n\t\tsegment: SegmentDefinition,\n\t\tsegmentIndex: number,\n\t\tsegmentIndexMap: Map<string, number>\n\t): void {\n\t\tconst segmentKey = this.getSegmentKey(segment)\n\t\tif (!segmentKey) return\n\n\t\tconst globalIndex = this.registerSegment(segment, segmentKey, segmentIndexMap)\n\n\t\tdescriptor.segmentGlobalIndices[segmentIndex] = globalIndex\n\n\t\t// Register static parts of dynamic segments\n\t\tif (typeof segment !== 'string') {\n\t\t\tconst [before, after] = segment\n\t\t\tif (before) {\n\t\t\t\tthis.registerSegment(before, before, segmentIndexMap)\n\t\t\t}\n\t\t\tif (after) {\n\t\t\t\tthis.registerSegment(after, after, segmentIndexMap)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate registerSegment(\n\t\tsegment: SegmentDefinition,\n\t\tsegmentKey: string,\n\t\tsegmentIndexMap: Map<string, number>\n\t): number {\n\t\tconst existing = segmentIndexMap.get(segmentKey)\n\t\tif (existing !== undefined) return existing\n\t\tconst globalIndex = this.segments.length\n\t\tthis.segments.push(segment)\n\t\tsegmentIndexMap.set(segmentKey, globalIndex)\n\t\treturn globalIndex\n\t}\n\n\t/**\n\t * Gets a unique key for a segment definition\n\t * For static segments (strings), returns the string itself if non-empty\n\t * For dynamic segments (arrays), returns before|after|exclusions if before or after is non-empty\n\t * Returns empty string for segments that should be ignored\n\t */\n\tprivate getSegmentKey(segment: SegmentDefinition): string {\n\t\tif (typeof segment === 'string') {\n\t\t\treturn segment\n\t\t}\n\t\t// For dynamic segments, create a key from before+after+exclusions\n\t\tconst [before, after, exclusions] = segment\n\t\t// Only return a key if there's something to match (before or after is non-empty)\n\t\tif (before || after) {\n\t\t\treturn `${before}|${after}|${exclusions}`\n\t\t}\n\t\treturn ''\n\t}\n}","/**\n * Creates a value-specific index using djb2 hash algorithm for dynamic segments\n * For static segments, returns the base index directly to avoid unnecessary hashing\n *\n * @param baseIndex - The base index of the segment type\n * @param value - The actual value of the segment (optional, for dynamic segments only)\n * @returns Value-specific index for dynamic segments, or base index for static segments\n */\nexport function getSegmentIndex(baseIndex: number, value?: string): number {\n\tif (!value) {\n\t\treturn baseIndex\n\t}\n\n\tlet hash = 5381\n\tfor (let i = 0; i < value.length; i++) {\n\t\thash = (hash * 33) ^ value.charCodeAt(i)\n\t}\n\thash = hash >>> 0 // Unsigned 32-bit integer\n\n\treturn baseIndex * 1000000 + (hash & 0xfffff)\n}","import type {GapType} from '../constants'\nimport type {PositionRange} from '../types'\nimport {getSegmentIndex} from '../utils/getSegmentIndex'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport type {SegmentMatch} from './SegmentMatcher'\n\n/**\n * Unified match structure for pattern matching states\n *\n * Represents the state of a pattern matching process in the parser's state machine:\n * - Active: tracks progress through pattern segments (expectedSegmentIndex >= 0)\n * - Completed: all segments found, match is valid (expectedSegmentIndex = NaN)\n * - Invalid: match cannot be completed due to malformed segments (expectedSegmentIndex = -1)\n *\n * State detection:\n * - isCompleted: expectedSegmentIndex is NaN\n * - isInvalid: expectedSegmentIndex is -1\n * - isActive: expectedSegmentIndex >= 0 (not NaN and not -1)\n */\n\nexport class Match {\n\tpublic readonly gaps: Partial<Record<GapType, PositionRange>> = {}\n\t/** Captured value from first dynamic segment (for hasTwoValues patterns) */\n\tprivate readonly captured?: string\n\n\t/**\n\t * Index of expected next segment:\n\t * - >= 0: active, waiting for segment at this index\n\t * - NaN: completed successfully\n\t * - -1: invalid, should be discarded\n\t */\n\tpublic expectedSegmentIndex: number\n\tpublic start: number\n\tpublic end: number\n\n\tconstructor(\n\t\tpublic readonly descriptor: MarkupDescriptor,\n\t\tfirstSegment: SegmentMatch\n\t) {\n\t\tthis.expectedSegmentIndex = 1\n\t\tthis.start = firstSegment.start\n\t\tthis.end = firstSegment.end\n\n\t\t// Auto-complete single segment patterns\n\t\tif (descriptor.segments.length === 1) {\n\t\t\tthis.expectedSegmentIndex = NaN\n\n\t\t\t//TODO need review it. before it was only value gap type\n\t\t\tconst gapType = descriptor.gapTypes[0] ?? 'value'\n\t\t\tif (gapType === 'slot') {\n\t\t\t\t// Slot-leading: real range resolved by PatternMatcher.resolveSlotLeadingMatches\n\t\t\t\tthis.gaps.slot = {start: this.start, end: this.start}\n\t\t\t} else {\n\t\t\t\tthis.gaps[gapType] = {start: this.start, end: this.end}\n\t\t\t}\n\t\t}\n\n\t\tif (descriptor.hasTwoValues && firstSegment.captured) {\n\t\t\tthis.captured = firstSegment.captured\n\t\t\tconst capturedStart = firstSegment.start + firstSegment.value.indexOf(firstSegment.captured)\n\t\t\tconst capturedEnd = capturedStart + firstSegment.captured.length\n\t\t\tthis.gaps.value = {start: capturedStart, end: capturedEnd}\n\t\t}\n\t}\n\n\t/**\n\t * Check if the match is invalid and should be discarded\n\t */\n\tget isInvalid(): boolean {\n\t\treturn this.expectedSegmentIndex === -1\n\t}\n\n\t/**\n\t * Check if the pattern is completed (computed property)\n\t */\n\tget isCompleted(): boolean {\n\t\treturn isNaN(this.expectedSegmentIndex)\n\t}\n\n\t/**\n\t * Check if the match is waiting for the last segment (high priority)\n\t */\n\tget isAwaitingLastSegment(): boolean {\n\t\treturn this.expectedSegmentIndex === this.descriptor.segments.length - 1\n\t}\n\n\t/**\n\t * Get the next expected segment index\n\t */\n\tget nextSegment(): number | undefined {\n\t\tif (this.isCompleted || this.isInvalid) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst baseIndex = this.descriptor.segmentGlobalIndices[this.expectedSegmentIndex]\n\t\tconst segmentDef = this.descriptor.segments[this.expectedSegmentIndex]\n\n\t\t// Only hash for hasTwoValues closing tags that need value-specific matching\n\t\tif (\n\t\t\ttypeof segmentDef === 'object' &&\n\t\t\tthis.descriptor.hasTwoValues &&\n\t\t\tthis.captured &&\n\t\t\tthis.isAwaitingLastSegment\n\t\t) {\n\t\t\tconst [before, after] = segmentDef\n\t\t\tconst value = before + this.captured + after\n\t\t\treturn getSegmentIndex(baseIndex, value)\n\t\t}\n\n\t\treturn baseIndex\n\t}\n\n\t/**\n\t * Update state with new segment by setting gap positions\n\t */\n\tprocessNext(segment: SegmentMatch): void {\n\t\tconst start = this.end\n\t\tconst end = segment.start\n\t\tconst gapType = this.descriptor.gapTypes[this.expectedSegmentIndex - 1]\n\n\t\t// VALIDATION: Next segment must start after previous segment ends\n\t\t// If not, this match is permanently invalid\n\t\tif (end < start) {\n\t\t\tthis.expectedSegmentIndex = -1\n\t\t\treturn\n\t\t}\n\n\t\tthis.gaps[gapType] = {start, end}\n\n\t\tthis.end = segment.end\n\t\tthis.expectedSegmentIndex++\n\n\t\t// Auto-complete if all segments are processed\n\t\tif (this.expectedSegmentIndex >= this.descriptor.segments.length) {\n\t\t\tthis.expectedSegmentIndex = NaN\n\t\t}\n\t}\n\n\t/**\n\t * Checks if this match conflicts with another match (overlaps and cannot nest properly)\n\t */\n\tconflictsWith(previousMatch?: Match | null): boolean {\n\t\t// No conflict if there's no previous match to conflict with\n\t\tif (!previousMatch) return false\n\n\t\t// No conflict if there's no overlap\n\t\tif (this.start >= previousMatch.end) return false\n\n\t\t// If there's overlap, check if it's valid nesting\n\t\tif (!previousMatch.descriptor.hasSlot) return true\n\t\tif (previousMatch.gaps.slot === undefined) return true\n\n\t\t// Valid nesting: this match is completely inside the slot section\n\t\treturn !(this.start >= previousMatch.gaps.slot.start && this.end <= previousMatch.gaps.slot.end)\n\t}\n}","/**\n * PatternMatcher - State Machine for Markup Pattern Recognition\n *\n * Implements a high-performance state machine that processes segments to identify\n * and match markup patterns. Manages Match objects representing parsing states\n * for different markup descriptors, handling gap positions and completion logic.\n *\n * Key features:\n * - State machine approach for pattern matching\n * - Position-based indexing for efficient lookups\n * - Processing order-based conflict resolution for overlapping matches\n * - Gap position management for nested content extraction\n */\n\nimport {getSegmentIndex} from '../utils/getSegmentIndex'\nimport type {MarkupDescriptor} from './MarkupDescriptor'\nimport type {MarkupRegistry} from './MarkupRegistry'\nimport {Match} from './Match'\nimport type {SegmentMatch} from './SegmentMatcher'\n\nfunction getOrCreate<K, V>(map: Map<K, V[]>, key: K): V[] {\n\tlet arr = map.get(key)\n\tif (!arr) {\n\t\tarr = []\n\t\tmap.set(key, arr)\n\t}\n\treturn arr\n}\n\n/**\n * Optimized parser using state machine approach\n */\nexport class PatternMatcher {\n\tprivate readonly pendingStates: Map<number, Match[]> = new Map()\n\tprivate readonly completingStates: Map<number, Match[]> = new Map()\n\tprivate readonly completedStates: Array<{position: number; match: Match}> = []\n\n\tconstructor(private readonly registry: MarkupRegistry) {}\n\n\t/** Main method that converts found segments into structured matches */\n\tprocess(segments: SegmentMatch[]): Match[] {\n\t\tthis.pendingStates.clear()\n\t\tthis.completingStates.clear()\n\t\tthis.completedStates.length = 0\n\n\t\tfor (const segment of segments) {\n\t\t\tthis.processWaitingStates(segment)\n\t\t\tthis.tryStartNewStates(segment)\n\t\t}\n\n\t\t//TODO need review it\n\t\tthis.resolveSlotLeadingMatches()\n\n\t\treturn this.completedStates.map(entry => entry.match)\n\t}\n\n\t/**\n\t * Process states waiting for this segment\n\t * Try states by priority until one is valid, keeping rejected states for later attempts\n\t * Process completing states first (higher priority), then pending states\n\t * Process only one state per call\n\t */\n\tprivate processWaitingStates(segment: SegmentMatch): void {\n\t\tconst match = this.dequeueWaitingMatch(segment)\n\t\tif (!match) return\n\n\t\tmatch.processNext(segment)\n\n\t\tif (match.isInvalid) return\n\n\t\tif (match.isCompleted) return this.addToCompleted(match)\n\n\t\tthis.addToWaiting(match)\n\t}\n\n\tprivate tryStartNewStates(segment: SegmentMatch): void {\n\t\tthis.registry.firstSegmentIndexMap.get(segment.index)?.forEach((descriptor: MarkupDescriptor) => {\n\t\t\tconst match = new Match(descriptor, segment)\n\n\t\t\tif (match.isInvalid) return\n\n\t\t\tif (match.isCompleted) return this.addToCompleted(match)\n\n\t\t\tthis.addToWaiting(match)\n\t\t})\n\t}\n\n\t/**\n\t * Gets the next waiting match for the given segment\n\t * Uses value-specific index for dynamic segments, base index for static segments\n\t */\n\tprivate dequeueWaitingMatch(segment: SegmentMatch): Match | undefined {\n\t\tconst index = segment.captured ? getSegmentIndex(segment.index, segment.value) : segment.index\n\n\t\tconst completingArray = this.completingStates.get(index)\n\t\tif (completingArray?.length) return completingArray.pop()\n\n\t\tconst pendingArray = this.pendingStates.get(index)\n\t\tif (pendingArray?.length) return pendingArray.pop()\n\t}\n\n\t/**\n\t * Adds a state to the waiting list for the next expected segment\n\t */\n\tprivate addToWaiting(match: Match): void {\n\t\tconst segmentIndex = match.nextSegment\n\t\tif (segmentIndex === undefined) return\n\t\tconst map = match.isAwaitingLastSegment ? this.completingStates : this.pendingStates\n\t\tgetOrCreate(map, segmentIndex).push(match)\n\t}\n\n\t/**\n\t * Resolves slot-leading single-segment matches by extending their start backwards.\n\t *\n\t * For patterns like `__slot__\\n\\n`, the segment `\\n\\n` is a suffix delimiter and\n\t * the slot content precedes it. After normal processing, such matches only cover\n\t * the delimiter. This pass extends each slot-leading match backwards to the end\n\t * of the previous slot-leading match (or input start), so that non-slot-leading\n\t * matches between them become nested children rather than siblings.\n\t */\n\tprivate resolveSlotLeadingMatches(): void {\n\t\tlet hasSlotLeading = false\n\t\tfor (const entry of this.completedStates) {\n\t\t\tif (this.isSlotLeading(entry.match)) {\n\t\t\t\thasSlotLeading = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!hasSlotLeading) return\n\n\t\t// Only slot-leading match boundaries matter — other matches become nested children\n\t\tlet boundary = 0\n\t\tfor (const entry of this.completedStates) {\n\t\t\tconst {match} = entry\n\t\t\tif (this.isSlotLeading(match)) {\n\t\t\t\tconst segmentStart = match.start\n\t\t\t\tmatch.start = boundary\n\t\t\t\tentry.position = boundary\n\t\t\t\tmatch.gaps.slot = {start: boundary, end: segmentStart}\n\t\t\t\tboundary = match.end\n\t\t\t}\n\t\t}\n\n\t\tthis.completedStates.sort((a, b) => a.position - b.position)\n\t}\n\n\tprivate isSlotLeading(match: Match): boolean {\n\t\treturn match.descriptor.segments.length === 1 && match.descriptor.hasSlot\n\t}\n\n\t/**\n\t * Add match to position-indexed array, replacing any existing match at the same position\n\t * Uses binary search to find insertion point and maintains sorted order\n\t * Relies on processing order to determine which match to keep\n\t */\n\tprivate addToCompleted(match: Match): void {\n\t\tconst position = match.start\n\n\t\t// Binary search to find the insertion point or existing position\n\t\tlet left = 0\n\t\tlet right = this.completedStates.length\n\n\t\twhile (left < right) {\n\t\t\tconst mid = Math.floor((left + right) / 2)\n\t\t\tif (this.completedStates[mid].position < position) {\n\t\t\t\tleft = mid + 1\n\t\t\t} else {\n\t\t\t\tright = mid\n\t\t\t}\n\t\t}\n\n\t\t// Check if we found an existing entry at this position\n\t\tif (left < this.completedStates.length && this.completedStates[left].position === position) {\n\t\t\t// Position exists - replace with the new match\n\t\t\tthis.completedStates[left].match = match\n\t\t} else {\n\t\t\t// New position - insert new entry at the correct position\n\t\t\tthis.completedStates.splice(left, 0, {position, match})\n\t\t}\n\t}\n}","// escape RegExp special characters to match RegExp.escape behavior\n// Escapes all characters that have special meaning in regular expressions\nexport const escape = (str: string): string => {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\\\\\]/g, '\\\\$&')\n}","import {escape} from '../../../../shared/escape'\n\n/**\n * Result of a segment match in the text\n */\nexport interface SegmentMatch {\n\t/** Index in the patterns array */\n\tindex: number\n\t/** Start position in text */\n\tstart: number\n\t/** End position in text (exclusive) */\n\tend: number\n\t/** Matched text */\n\tvalue: string\n\t/** Captured content from dynamic pattern (if any) */\n\tcaptured?: string\n}\n\n/**\n * Segment definition - can be a static string or a dynamic pattern\n * For dynamic patterns: [before, after, exclusions]\n */\nexport type SegmentDefinition = string | readonly [before: string, after: string, exclusions: string]\n\n/**\n * Internal representation of a segment with its regex pattern\n */\ninterface SegmentEntry {\n\t/** Original index in the segments array */\n\tindex: number\n\t/** Regex pattern for this segment (escaped static or dynamic pattern) */\n\tpattern: string\n\t/** Original definition for reference */\n\tdefinition: SegmentDefinition\n}\n\n/**\n * Computes regex pattern for dynamic segment using pre-computed exclusions\n */\nfunction computeDynamicPattern(before: string, after: string, exclusions: string): string {\n\tconst escapedBefore = escape(before)\n\tconst escapedAfter = escape(after)\n\tconst escapedDelimiters = escape(after + exclusions)\n\n\t// Non-greedy quantifier to stop at first occurrence of after\n\treturn `${escapedBefore}([^${escapedDelimiters}]+?)${escapedAfter}`\n}\n\ninterface StaticMatcher {\n\tregex: RegExp\n\ttoIndex: Map<string, number>\n}\n\ninterface DynamicMatcher {\n\tregex: RegExp\n\tentries: SegmentEntry[]\n\tindices: Set<number>\n}\n\n/**\n * Segment matcher using dual strategy for optimal performance\n */\nexport class SegmentMatcher {\n\tprivate static?: StaticMatcher\n\tprivate dynamic?: DynamicMatcher\n\n\tconstructor(segments: SegmentDefinition[]) {\n\t\tthis.initializeDual(segments)\n\t}\n\n\tprivate initializeDual(segments: SegmentDefinition[]) {\n\t\tconst statics: string[] = []\n\t\tconst dynamics: Array<{segment: SegmentDefinition; index: number}> = []\n\t\tconst staticToIndex = new Map<string, number>()\n\n\t\t// Separate segments and build static index map\n\t\tsegments.forEach((segment, index) => {\n\t\t\tif (typeof segment === 'string') {\n\t\t\t\tstatics.push(segment)\n\t\t\t\tstaticToIndex.set(segment, index)\n\t\t\t} else {\n\t\t\t\tdynamics.push({segment, index})\n\t\t\t}\n\t\t})\n\n\t\t// Create static matcher\n\t\tif (statics.length > 0) {\n\t\t\tconst sorted = [...statics].toSorted((a, b) => b.length - a.length)\n\t\t\tconst escaped = sorted.map(escape)\n\t\t\tthis.static = {\n\t\t\t\tregex: new RegExp(`(?:${escaped.join('|')})`, 'gu'),\n\t\t\t\ttoIndex: staticToIndex,\n\t\t\t}\n\t\t}\n\n\t\t// Create dynamic matcher\n\t\tif (dynamics.length > 0) {\n\t\t\tconst indices = new Set<number>()\n\t\t\tconst entries: SegmentEntry[] = []\n\n\t\t\tdynamics.forEach(({segment, index}) => {\n\t\t\t\tif (typeof segment === 'string') return\n\t\t\t\tconst [before, after, exclusions] = segment\n\t\t\t\tindices.add(index)\n\t\t\t\tconst pattern = computeDynamicPattern(before, after, exclusions)\n\t\t\t\tconst namedPattern = pattern.replace('(', `(?<content${index}>`)\n\t\t\t\tentries.push({index, pattern: namedPattern, definition: segment})\n\t\t\t})\n\n\t\t\t// Sort by pattern length (longest first) for optimal matching\n\t\t\tentries.sort((a, b) => {\n\t\t\t\tconst aLen = typeof a.definition === 'string' ? a.definition.length : a.pattern.length\n\t\t\t\tconst bLen = typeof b.definition === 'string' ? b.definition.length : b.pattern.length\n\t\t\t\treturn bLen - aLen\n\t\t\t})\n\n\t\t\tthis.dynamic = {\n\t\t\t\tentries,\n\t\t\t\tindices,\n\t\t\t\tregex: new RegExp(entries.map((e, i) => `(?<seg${i}>${e.pattern})`).join('|'), 'gu'),\n\t\t\t}\n\t\t}\n\t}\n\n\tsearch(text: string): SegmentMatch[] {\n\t\tconst results: SegmentMatch[] = []\n\t\tconst dynamicResults: SegmentMatch[] = []\n\n\t\t// Static segments\n\t\tif (this.static) {\n\t\t\tconst {regex, toIndex} = this.static\n\t\t\tfor (const match of text.matchAll(regex)) {\n\t\t\t\tconst index = toIndex.get(match[0])\n\t\t\t\tif (index !== undefined) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tstart: match.index,\n\t\t\t\t\t\tend: match.index + match[0].length,\n\t\t\t\t\t\tvalue: match[0],\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Dynamic segments\n\t\tif (this.dynamic) {\n\t\t\tconst {regex, entries, indices} = this.dynamic\n\t\t\tfor (const match of text.matchAll(regex)) {\n\t\t\t\tconst matchedText = match[0]\n\t\t\t\tconst start = match.index\n\n\t\t\t\tlet matchedIndex: number | undefined\n\t\t\t\tlet captured: string | undefined\n\n\t\t\t\tif (match.groups) {\n\t\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\t\tconst groupValue = match.groups[`seg${i}`]\n\t\t\t\t\t\t// oxlint-disable-next-line no-unnecessary-condition\n\t\t\t\t\t\tif (groupValue !== undefined) {\n\t\t\t\t\t\t\tmatchedIndex = entries[i].index\n\t\t\t\t\t\t\tif (indices.has(matchedIndex)) {\n\t\t\t\t\t\t\t\tcaptured = match.groups[`content${matchedIndex}`]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matchedIndex !== undefined) {\n\t\t\t\t\tdynamicResults.push({\n\t\t\t\t\t\tindex: matchedIndex,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend: start + matchedText.length,\n\t\t\t\t\t\tvalue: matchedText,\n\t\t\t\t\t\tcaptured,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Filter overlapping static matches and merge\n\t\tconst finalResults = [...dynamicResults]\n\t\tfor (const staticMatch of results) {\n\t\t\tconst overlaps = dynamicResults.some(\n\t\t\t\tdynamic => staticMatch.start < dynamic.end && staticMatch.end > dynamic.start\n\t\t\t)\n\t\t\tif (!overlaps) {\n\t\t\t\tfinalResults.push(staticMatch)\n\t\t\t}\n\t\t}\n\n\t\tfinalResults.sort((a, b) => a.start - b.start)\n\t\treturn finalResults\n\t}\n}","import type {TextToken} from '../types'\n\n/**\n * Creates a text token for a range in the input\n *\n * @param input - Original input text\n * @param start - Start position (inclusive)\n * @param end - End position (exclusive)\n * @returns TextToken with extracted content and position\n */\nexport const createTextToken = (input: string, start = 0, end = input.length): TextToken => {\n\treturn {\n\t\ttype: 'text',\n\t\tcontent: input.substring(start, end),\n\t\tposition: {start, end},\n\t}\n}","import type {MarkToken, ParseOptions, PositionRange, TextToken, Token} from '../types'\nimport {createTextToken} from '../utils/createTextToken'\nimport type {Match} from './Match'\n\n/**\n * Parent context for tracking active nesting during tree building\n */\ninterface ParentContext {\n\tmatch: Match\n\ttoken: MarkToken\n\ttextPos: number // Current position for adding text tokens\n}\n\n/**\n * TreeBuilder - Optimized single-pass tree building algorithm\n *\n * Algorithm: Single-pass approach with direct token creation\n * - Processes matches in order, maintaining a stack of active parents\n * - Creates tokens directly without intermediate data structures\n * - Handles text gaps and nesting in a single traversal\n *\n * Key optimizations:\n * - Single pass through matches (no separate relationship building phase)\n * - Direct token creation eliminates intermediate allocations\n * - Stack-based parent tracking with O(D) memory where D is nesting depth\n * - No need for parent indices array or children lists\n * - Simpler algorithm that's easier to understand and maintain\n *\n * Complexity: O(M) where M is number of matches\n * Memory: O(D) for active parents stack where D is nesting depth (typically 3-5)\n */\nexport class TreeBuilder {\n\t// Instance fields - only what's needed for single pass\n\tprivate input!: string\n\tprivate readonly options: ParseOptions\n\n\tconstructor(options?: ParseOptions) {\n\t\tthis.options = options ?? {}\n\t}\n\n\t// ===== PUBLIC API =====\n\n\t/**\n\t * Builds nested token tree from pre-processed matches in a single pass\n\t *\n\t * Algorithm:\n\t * 1. Iterate through matches in order\n\t * 2. For each match:\n\t * - Close any parents whose content ends before this match\n\t * - Skip matches that conflict with the last accepted match\n\t * - Add text token before this match\n\t * - Create mark token and push to appropriate parent\n\t * - If match has nested content, push to active parents stack\n\t * 3. After all matches, close remaining parents and add final text\n\t *\n\t * Complexity: O(M) where M is number of matches\n\t * Memory: O(D) for active parents stack where D is nesting depth\n\t */\n\tpublic build(matches: Match[], input: string): Token[] {\n\t\tthis.input = input\n\n\t\tif (matches.length === 0) {\n\t\t\treturn this.filterTokens([this.createTextToken(0, input.length)])\n\t\t}\n\n\t\tconst tokens = this.buildSinglePass(matches)\n\t\treturn this.filterTokens(tokens)\n\t}\n\n\t// ===== SINGLE-PASS ALGORITHM =====\n\n\t/**\n\t * Builds token tree in a single pass through matches\n\t *\n\t * This is the core algorithm that processes matches sequentially,\n\t * maintaining a stack of active parents and creating tokens directly.\n\t */\n\tprivate buildSinglePass(matches: Match[]): Token[] {\n\t\tconst roots: Token[] = []\n\t\tconst parentStack: ParentContext[] = []\n\t\tlet lastAcceptedMatch: Match | null = null\n\t\tlet rootTextPos = 0\n\n\t\tfor (const match of matches) {\n\t\t\t// Skip conflicting matches\n\t\t\tif (lastAcceptedMatch && match.conflictsWith(lastAcceptedMatch)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlastAcceptedMatch = match\n\n\t\t\t// Close parents whose content ends before this match\n\t\t\twhile (parentStack.length > 0) {\n\t\t\t\tconst parent = parentStack[parentStack.length - 1]\n\t\t\t\tconst parentBounds = this.getContentBounds(parent.match)\n\n\t\t\t\tif (parentBounds.end <= match.start) {\n\t\t\t\t\t// Parent is complete - finalize it\n\t\t\t\t\tthis.finalizeParent(parent, parentBounds.end)\n\t\t\t\t\tparentStack.pop()\n\n\t\t\t\t\t// Add to appropriate container\n\t\t\t\t\tif (parentStack.length > 0) {\n\t\t\t\t\t\tparentStack[parentStack.length - 1].token.children.push(parent.token)\n\t\t\t\t\t} else {\n\t\t\t\t\t\troots.push(parent.token)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Determine where to add this match\n\t\t\tconst container = parentStack.length > 0 ? parentStack[parentStack.length - 1] : null\n\n\t\t\tif (container) {\n\t\t\t\t// Add text before this match within parent\n\t\t\t\tconst textToken = this.createTextToken(container.textPos, match.start)\n\t\t\t\tcontainer.token.children.push(textToken)\n\t\t\t\tcontainer.textPos = match.end\n\t\t\t} else {\n\t\t\t\t// Add text before this match at root level\n\t\t\t\tconst textToken = this.createTextToken(rootTextPos, match.start)\n\t\t\t\troots.push(textToken)\n\t\t\t\trootTextPos = match.end\n\t\t\t}\n\n\t\t\t// Create mark token for this match\n\t\t\tconst markToken = this.createMarkToken(match)\n\n\t\t\t// If match has children content, push to stack for processing children\n\t\t\tif (this.hasSlotContent(match)) {\n\t\t\t\tconst bounds = this.getContentBounds(match)\n\t\t\t\tparentStack.push({\n\t\t\t\t\tmatch,\n\t\t\t\t\ttoken: markToken,\n\t\t\t\t\ttextPos: bounds.start,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// No nested content - add directly to container\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.token.children.push(markToken)\n\t\t\t\t} else {\n\t\t\t\t\troots.push(markToken)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Close remaining parents\n\t\twhile (parentStack.length > 0) {\n\t\t\tconst parent = parentStack[parentStack.length - 1]\n\t\t\tparentStack.pop()\n\t\t\tconst parentBounds = this.getContentBounds(parent.match)\n\t\t\tthis.finalizeParent(parent, parentBounds.end)\n\n\t\t\tif (parentStack.length > 0) {\n\t\t\t\tparentStack[parentStack.length - 1].token.children.push(parent.token)\n\t\t\t} else {\n\t\t\t\troots.push(parent.token)\n\t\t\t}\n\t\t}\n\n\t\t// Add final text token at root level\n\t\troots.push(this.createTextToken(rootTextPos, this.input.length))\n\n\t\treturn roots\n\t}\n\n\t/**\n\t * Finalizes a parent token by adding final text token if needed\n\t */\n\tprivate finalizeParent(parent: ParentContext, endPos: number): void {\n\t\tparent.token.children.push(this.createTextToken(parent.textPos, endPos))\n\t}\n\n\t/**\n\t * Creates a mark token from a match (without children - those are added later)\n\t */\n\tprivate createMarkToken(match: Match): MarkToken {\n\t\t// Extract content using helper functions\n\t\tconst value = this.extractSubstring(match.gaps.value?.start, match.gaps.value?.end)\n\t\tconst slotStr = this.extractSubstring(match.gaps.slot?.start, match.gaps.slot?.end)\n\t\tconst metaStr = this.extractSubstring(match.gaps.meta?.start, match.gaps.meta?.end)\n\n\t\t// Convert empty strings to undefined for slot, but meta can be empty string\n\t\tconst slotContent = slotStr || undefined\n\t\tconst meta = match.gaps.meta !== undefined ? metaStr : undefined\n\n\t\treturn {\n\t\t\ttype: 'mark',\n\t\t\tcontent: this.input.substring(match.start, match.end),\n\t\t\tchildren: [], // Will be populated if match has slot content\n\t\t\tdescriptor: match.descriptor,\n\t\t\tvalue,\n\t\t\tmeta,\n\t\t\tposition: {start: match.start, end: match.end},\n\t\t\tslot: this.createSlotSourceInfo(match, slotContent),\n\t\t}\n\t}\n\n\t// ===== UTILITY METHODS =====\n\n\t/**\n\t * Gets the content boundaries for a match\n\t * Priority: nested content if present, otherwise value content\n\t */\n\tprivate getContentBounds(match: Match): PositionRange {\n\t\tif (match.gaps.slot) {\n\t\t\treturn match.gaps.slot\n\t\t}\n\t\tif (match.gaps.value) {\n\t\t\treturn match.gaps.value\n\t\t}\n\t\treturn {\n\t\t\tstart: match.start,\n\t\t\tend: match.start,\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a match has children content capability\n\t */\n\tprivate hasSlotContent(match: Match): boolean {\n\t\treturn match.gaps.slot !== undefined\n\t}\n\n\t/**\n\t * Extracts substring safely, returns empty string if positions are undefined\n\t */\n\tprivate extractSubstring(start: number | undefined, end: number | undefined): string {\n\t\treturn start !== undefined && end !== undefined ? this.input.substring(start, end) : ''\n\t}\n\n\t/**\n\t * Creates a text token for a range in the input\n\t */\n\tprivate createTextToken(start: number, end: number): TextToken {\n\t\treturn createTextToken(this.input, start, end)\n\t}\n\n\t/**\n\t * Creates children source info object if children content exists\n\t */\n\tprivate createSlotSourceInfo(match: Match, slotContent: string | undefined): MarkToken['slot'] {\n\t\tif (!slotContent || match.gaps.slot === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\tcontent: slotContent,\n\t\t\tstart: match.gaps.slot.start,\n\t\t\tend: match.gaps.slot.end,\n\t\t}\n\t}\n\n\t// ===== TOKEN FILTERING. TODO: Is a hack =====\n\n\tprivate filterTokens(tokens: Token[]): Token[] {\n\t\tconst {marksOnly, skipEmptyText} = this.options\n\t\tif (!marksOnly && !skipEmptyText) return tokens\n\n\t\treturn tokens.filter(token => {\n\t\t\tif (token.type !== 'text') return true\n\t\t\tif (marksOnly) return false\n\t\t\tif (skipEmptyText && token.position.start === token.position.end) return false\n\t\t\treturn true\n\t\t})\n\t}\n}","import type {MarkToken, Token} from '../types'\n\n/**\n * Internal function to process tokens with a callback\n * @param tokens - Tokens to process\n * @param callback - Function to transform each MarkToken\n * @returns Transformed text\n */\nexport function processTokensWithCallback(tokens: Token[], callback: (mark: MarkToken) => string): string {\n\tlet result = ''\n\tfor (const token of tokens) {\n\t\tif (token.type === 'text') {\n\t\t\tresult += token.content\n\t\t} else {\n\t\t\t// For MarkToken with children, we need to decide:\n\t\t\t// - If we want to transform the mark itself AND its children\n\t\t\t// - Or transform children and include them in the mark's transformation\n\n\t\t\tif (token.children.length > 0) {\n\t\t\t\t// Recursively process children to get their transformed content\n\t\t\t\tconst processedChildren = processTokensWithCallback(token.children, callback)\n\n\t\t\t\t// Create a modified token with processed children as the value\n\t\t\t\t// This allows the callback to use the already-processed nested content\n\t\t\t\tconst modifiedToken: MarkToken = {\n\t\t\t\t\t...token,\n\t\t\t\t\tvalue: processedChildren,\n\t\t\t\t}\n\t\t\t\tresult += callback(modifiedToken)\n\t\t\t} else {\n\t\t\t\tresult += callback(token)\n\t\t\t}\n\t\t}\n\t}\n\treturn result\n}","import {PLACEHOLDER} from '../constants'\nimport type {Markup} from '../types'\n\n/**\n * Make annotation from the markup for ParserV2\n *\n * @param markup - Markup pattern with __value__, __meta__, and/or __slot__ placeholders\n * @param params - Object with optional value, meta, and slot strings\n * @returns Annotated string with placeholders replaced\n *\n * @example\n * ```typescript\n * annotate('@[__value__]', { value: 'Hello' }) // '@[Hello]'\n * annotate('@[__value__](__meta__)', { value: 'Hello', meta: 'world' }) // '@[Hello](world)'\n * annotate('@[__slot__]', { slot: 'content' }) // '@[content]'\n * ```\n */\nexport function annotate(\n\tmarkup: Markup,\n\tparams: {\n\t\tvalue?: string\n\t\tmeta?: string\n\t\tslot?: string\n\t}\n): string {\n\treturn (markup as string)\n\t\t.replaceAll(PLACEHOLDER.Value, params.value ?? '')\n\t\t.replaceAll(PLACEHOLDER.Meta, params.meta ?? '')\n\t\t.replaceAll(PLACEHOLDER.Slot, params.slot ?? '')\n}","import type {Token} from '../types'\nimport {annotate} from './annotate'\n\n/**\n * Convert parsed tokens back to annotated string (inverse of `parse`).\n *\n * This function is useful for reconstructing annotated text from tokens,\n * similar to toString in text-manipulation/utils but for ParserV2\n *\n * @param tokens - Array of parsed tokens (from ParserV2.parse)\n * @returns Reconstructed annotated string\n *\n * @example\n * ```typescript\n * const markups = ['@[__value__](__meta__)', '#[__slot__]']\n * const tokens = new ParserV2(markups).parse('@[Hello](world) #[test]')\n * const result = toString(tokens)\n * // Returns: '@[Hello](world) #[test]'\n * ```\n */\nexport function toString(tokens: Token[]): string {\n\tlet result = ''\n\n\tfor (const token of tokens) {\n\t\tif (token.type === 'text') {\n\t\t\tresult += token.content\n\t\t\tcontinue\n\t\t}\n\n\t\tconst {markup, hasSlot} = token.descriptor\n\t\tconst slot = hasSlot ? (token.children.length > 0 ? toString(token.children) : token.slot?.content) : undefined\n\n\t\tresult += annotate(markup, {\n\t\t\tvalue: token.value,\n\t\t\tmeta: token.meta,\n\t\t\tslot,\n\t\t})\n\t}\n\n\treturn result\n}","import {MarkupRegistry} from './core/MarkupRegistry'\nimport {PatternMatcher} from './core/PatternMatcher'\nimport {SegmentMatcher} from './core/SegmentMatcher'\nimport {TreeBuilder} from './core/TreeBuilder'\nimport type {MarkToken, Markup, ParseOptions, Token} from './types'\nimport {createTextToken} from './utils/createTextToken'\nimport {processTokensWithCallback} from './utils/processTokens'\nimport {toString as tokensToString} from './utils/toString'\n\n/**\n * Parser - High-performance tree-based markup parser\n *\n * Parses text with markup patterns into a nested token tree structure.\n * Supports complex patterns with metadata, nesting, and HTML-like constructs.\n *\n * @example\n * ```typescript\n * const parser = new Parser(['@[__value__](__meta__)', '#[__slot__]'])\n * const tokens = parser.parse('Hello @[world](test) and #[tag]')\n * const text = parser.stringify(tokens)\n * ```\n */\nexport class Parser {\n\tprivate readonly registry: MarkupRegistry\n\tprivate readonly segmentMatcher: SegmentMatcher\n\tprivate readonly patternMatcher: PatternMatcher\n\tprivate readonly treeBuilder: TreeBuilder\n\tprivate readonly parseOptions: ParseOptions\n\n\t/**\n\t * Creates a new Parser instance with the specified markup patterns\n\t *\n\t * @param markups - Array of markup pattern strings with placeholders (can include undefined values):\n\t * - `__value__` - main content (plain text, no nesting)\n\t * - `__meta__` - metadata (plain text, no nesting)\n\t * - `__slot__` - content supporting nested structures\n\t * - `undefined` - skipped, but original array indices are preserved for descriptor matching\n\t * @param options - Optional parse options to control token output:\n\t * - `marksOnly` - return only MarkTokens, drop all TextTokens\n\t * - `skipEmptyText` - drop zero-length TextTokens (where start === end)\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser([\n\t * '@[__value__](__meta__)', // @[label](value) - descriptor.index = 0\n\t * undefined, // skipped\n\t * '#[__slot__]', // #[nested content] - descriptor.index = 2\n\t * '**__slot__**' // **bold text** - descriptor.index = 3\n\t * ])\n\t * ```\n\t */\n\tconstructor(markups: (Markup | undefined)[], options?: ParseOptions) {\n\t\tthis.registry = new MarkupRegistry(markups)\n\t\tthis.segmentMatcher = new SegmentMatcher(this.registry.segments)\n\t\tthis.patternMatcher = new PatternMatcher(this.registry)\n\t\tthis.parseOptions = options ?? {}\n\t\tthis.treeBuilder = new TreeBuilder(this.parseOptions)\n\t}\n\n\t/**\n\t * Parses text into tokens (static convenience method)\n\t *\n\t * @param value - Text to parse\n\t * @param options - Options with markup patterns and token filtering\n\t * @returns Array of tokens (TextToken and MarkToken)\n\t *\n\t * @example\n\t * ```typescript\n\t * const tokens = Parser.parse('Hello @[world]', {\n\t * markup: ['@[__value__]']\n\t * })\n\t * ```\n\t */\n\tstatic parse(value: string, options?: {markup: Markup[]} & ParseOptions): Token[] {\n\t\tconst markups = options?.markup\n\t\tif (!markups || markups.length === 0) {\n\t\t\treturn [createTextToken(value)]\n\t\t}\n\t\tconst {markup: _, ...parseOptions} = options\n\t\treturn new Parser(markups, parseOptions).parse(value)\n\t}\n\n\t/**\n\t * Converts tokens back to text (static convenience method)\n\t *\n\t * @param tokens - Array of tokens to convert\n\t * @returns Reconstructed text string\n\t *\n\t * @example\n\t * ```typescript\n\t * const text = Parser.stringify(tokens)\n\t * ```\n\t */\n\tstatic stringify(tokens: Token[]): string {\n\t\treturn tokensToString(tokens)\n\t}\n\n\t/**\n\t * Parses text into a nested token tree\n\t *\n\t * This is the main parsing method. It processes the input text through\n\t * three stages:\n\t * 1. Segment matching - finds all markup segments (O(N + M))\n\t * 2. Pattern matching - builds complete patterns from segments (O(M))\n\t * 3. Tree building - constructs nested token tree (O(M·D))\n\t *\n\t * @param value - Text to parse\n\t * @returns Array of tokens representing the parsed structure\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['@[__value__](__meta__)'])\n\t * const tokens = parser.parse('Hello @[world](test)')\n\t * // Returns: [\n\t * // TextToken('Hello '),\n\t * // MarkToken('@[world](test)', value='world', meta='test'),\n\t * // TextToken('')\n\t * // ]\n\t * ```\n\t */\n\tparse(value: string): Token[] {\n\t\tconst segments = this.segmentMatcher.search(value)\n\t\tconst matches = this.patternMatcher.process(segments)\n\t\treturn this.treeBuilder.build(matches, value)\n\t}\n\n\t/**\n\t * Converts tokens back to the original text\n\t *\n\t * This is the inverse operation of parse(). It reconstructs the original\n\t * text from a token tree, preserving all markup and structure.\n\t *\n\t * @param tokens - Array of tokens to convert\n\t * @returns Reconstructed text string\n\t *\n\t * @example\n\t * ```typescript\n\t * const text = 'Hello @[world](test)'\n\t * const tokens = parser.parse(text)\n\t * const reconstructed = parser.stringify(tokens)\n\t * console.log(reconstructed === text) // true\n\t * ```\n\t */\n\tstringify(tokens: Token[]): string {\n\t\treturn tokensToString(tokens)\n\t}\n\n\t/**\n\t * Transforms annotated text by processing all mark tokens with a callback\n\t *\n\t * This method parses the text, recursively processes all MarkTokens\n\t * (including nested ones) with the provided callback, and returns\n\t * the transformed text.\n\t *\n\t * @param value - Annotated text to process\n\t * @param callback - Function to transform each MarkToken\n\t * @returns Transformed text\n\t *\n\t * @example\n\t * ```typescript\n\t * // Extract all values\n\t * const text = '@[Hello](world) and #[tag]'\n\t * const result = parser.transform(text, mark => mark.value)\n\t * // Returns: 'Hello and tag'\n\t *\n\t * // Custom transformation\n\t * const result = parser.transform(text, mark =>\n\t * mark.meta ? `${mark.value}:${mark.meta}` : mark.value\n\t * )\n\t * // Returns: 'Hello:world and tag'\n\t * ```\n\t */\n\ttransform(value: string, callback: (mark: MarkToken) => string): string {\n\t\tconst tokens = this.parse(value)\n\t\treturn processTokensWithCallback(tokens, callback)\n\t}\n\n\t/**\n\t * Escapes markup segments in the given text using backslash\n\t *\n\t * This method uses the registry's unique segments and escapes them by adding\n\t * a backslash before each character of each segment, preventing them from being\n\t * parsed as markup when the text is processed again.\n\t *\n\t * @param text - Text to escape segments in\n\t * @returns Text with escaped segments\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['**__slot__**', '@[__value__]'])\n\t * const escaped = parser.escape('Hello **world** and @[user]')\n\t * // Returns: 'Hello \\*\\*world\\*\\* and \\@[user]'\n\t * ```\n\t */\n\tescape(text: string): string {\n\t\treturn this.registry.segments\n\t\t\t.filter((segment): segment is string => typeof segment === 'string')\n\t\t\t.toSorted((a, b) => b.length - a.length)\n\t\t\t.reduce((result, segment) => result.replaceAll(segment, segment.replace(/(.)/g, '\\\\$1')), text)\n\t}\n\n\t/**\n\t * Unescapes markup patterns in the given text\n\t *\n\t * This method removes escape characters from segments that were previously\n\t * escaped using escape(), allowing the patterns to be parsed normally.\n\t *\n\t * @param text - Text to unescape patterns in\n\t * @returns Text with unescaped patterns\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new Parser(['**__slot__**', '@[__value__]'])\n\t * const unescaped = parser.unescape('Hello \\*\\*world\\*\\* and \\@[user]')\n\t * // Returns: 'Hello **world** and @[user]'\n\t * ```\n\t */\n\tunescape(text: string): string {\n\t\treturn text.replaceAll(/\\\\(.)/g, '$1')\n\t}\n}","import {Parser} from '../Parser'\nimport type {MarkToken, Markup} from '../types'\nimport {processTokensWithCallback} from './processTokens'\n\n/**\n * Transform annotated text to another text by recursively processing all tokens\n *\n * @param value - Annotated text to process\n * @param callback - Function to transform each MarkToken\n * @param markups - Array of markup patterns to parse\n * @returns Transformed text\n *\n * @example\n * ```typescript\n * const text = '@[Hello](world) and #[nested @[content]]'\n * const result = denote(text, mark => mark.value, ['@[__value__](__meta__)', '#[__slot__]'])\n * // Returns: 'Hello and nested content'\n * ```\n */\nexport function denote(value: string, callback: (mark: MarkToken) => string, markups: Markup[]): string {\n\tif (!markups.length) return value\n\n\tconst tokens = new Parser(markups).parse(value)\n\n\treturn processTokensWithCallback(tokens, callback)\n}","import type {MarkToken, Token} from '../parser/types'\n\nexport interface TokenContext {\n\tdepth: number\n\tparent?: MarkToken\n}\n\nexport function findToken(tokens: Token[], target: Token, depth = 0, parent?: MarkToken): TokenContext | undefined {\n\tfor (const token of tokens) {\n\t\tif (token === target) return {depth, parent}\n\t\tif (token.type === 'mark') {\n\t\t\tconst result = findToken(token.children, target, depth + 1, token)\n\t\t\tif (result) return result\n\t\t}\n\t}\n}","import type {Result, TokenAddress, TokenPath, TokenShapeSnapshot} from '../../shared/editorContracts'\nimport type {Token} from './parser/types'\n\nexport type TokenIndex = {\n\treadonly generation: number\n\tpathFor(token: Token): TokenPath | undefined\n\taddressFor(path: TokenPath): TokenAddress | undefined\n\tresolve(path: TokenPath): Token | undefined\n\tresolveAddress(address: TokenAddress, expected?: TokenShapeSnapshot): Result<Token, 'stale'>\n\tkey(path: TokenPath): string\n\tequals(a: TokenPath, b: TokenPath): boolean\n}\n\nexport function pathEquals(a: TokenPath, b: TokenPath): boolean {\n\treturn a.length === b.length && a.every((part, index) => part === b[index])\n}\n\nexport function pathKey(path: TokenPath): string {\n\treturn path.join('.')\n}\n\nexport function resolvePath(tokens: readonly Token[], path: TokenPath): Token | undefined {\n\tif (path.length === 0) return undefined\n\tlet current: readonly Token[] = tokens\n\tlet token: Token | undefined\n\tfor (const index of path) {\n\t\tif (!Number.isInteger(index) || index < 0 || index >= current.length) return undefined\n\t\ttoken = current[index]\n\t\tcurrent = token.type === 'mark' ? token.children : []\n\t}\n\treturn token\n}\n\nexport function snapshotTokenShape(token: Token): TokenShapeSnapshot {\n\tif (token.type === 'text') return {kind: 'text'}\n\treturn {kind: 'mark', descriptor: token.descriptor, descriptorIndex: token.descriptor.index}\n}\n\nfunction shapeMatches(token: Token, expected: TokenShapeSnapshot): boolean {\n\tif (expected.kind === 'text') return token.type === 'text'\n\treturn (\n\t\ttoken.type === 'mark' &&\n\t\ttoken.descriptor === expected.descriptor &&\n\t\ttoken.descriptor.index === expected.descriptorIndex\n\t)\n}\n\nexport function createTokenIndex(tokens: readonly Token[], generation: number): TokenIndex {\n\tconst paths = new WeakMap<Token, TokenPath>()\n\n\tconst visit = (items: readonly Token[], parent: TokenPath) => {\n\t\titems.forEach((token, index) => {\n\t\t\tconst path = [...parent, index]\n\t\t\tpaths.set(token, path)\n\t\t\tif (token.type === 'mark') visit(token.children, path)\n\t\t})\n\t}\n\n\tvisit(tokens, [])\n\n\treturn {\n\t\tgeneration,\n\t\tpathFor: token => paths.get(token),\n\t\taddressFor: path => (resolvePath(tokens, path) ? {path: [...path], parseGeneration: generation} : undefined),\n\t\tresolve: path => resolvePath(tokens, path),\n\t\tresolveAddress(address, expected) {\n\t\t\tif (address.parseGeneration !== generation) return {ok: false, reason: 'stale'}\n\t\t\tconst token = resolvePath(tokens, address.path)\n\t\t\tif (!token) return {ok: false, reason: 'stale'}\n\t\t\tif (expected && !shapeMatches(token, expected)) return {ok: false, reason: 'stale'}\n\t\t\treturn {ok: true, value: token}\n\t\t},\n\t\tkey: pathKey,\n\t\tequals: pathEquals,\n\t}\n}","import {signal, computed, event, effectScope, watch, batch} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport type {MarkFeature} from '../mark/MarkFeature'\nimport type {PropsModel} from '../props/PropsModel'\nimport type {SlotsFeature} from '../slots/SlotsFeature'\nimport type {ValueModel} from '../value/ValueModel'\nimport {Parser} from './parser/Parser'\nimport type {Token} from './parser/types'\nimport {createTokenIndex, type TokenIndex} from './tokenIndex'\n\nexport class ParseController {\n\treadonly tokens = signal<Token[]>([])\n\treadonly #generation = signal(0)\n\treadonly index: Computed<TokenIndex> = computed(() => createTokenIndex(this.tokens(), this.#generation()))\n\n\treadonly parser: Computed<Parser | undefined> = computed(() => {\n\t\tif (!this.mark.enabled()) return\n\n\t\tconst markups = this.props.options().map(opt => opt.markup)\n\t\tif (!markups.some(Boolean)) return\n\n\t\treturn new Parser(markups, this.slots.isBlock() ? {skipEmptyText: true} : undefined)\n\t})\n\n\treadonly reparse = event()\n\n\t#scope?: () => void\n\n\tconstructor(\n\t\tprivate readonly lifecycle: Lifecycle,\n\t\tprivate readonly value: ValueModel,\n\t\tprivate readonly mark: MarkFeature,\n\t\tprivate readonly props: PropsModel,\n\t\tprivate readonly slots: SlotsFeature\n\t) {\n\t\tlifecycle.onMounted(() => {\n\t\t\t// Parse current value immediately so tokens are ready before other\n\t\t\t// mounted subscribers (like OverlayController) read them.\n\t\t\tthis.acceptTokens(this.#parseValue(value.current()))\n\t\t\tthis.#subscribeValue()\n\t\t})\n\n\t\tconst toggle = (enabled: boolean) => {\n\t\t\tif (enabled && !this.#scope) {\n\t\t\t\tthis.#scope = effectScope(() => {\n\t\t\t\t\tthis.#subscribeReactiveParse()\n\t\t\t\t\tthis.#subscribeReparse()\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (!enabled && this.#scope) {\n\t\t\t\tthis.#scope()\n\t\t\t\tthis.#scope = undefined\n\t\t\t}\n\t\t}\n\n\t\twatch(this.mark.enabled, toggle)\n\t\ttoggle(this.mark.enabled())\n\t}\n\n\tacceptTokens(tokens: Token[]): void {\n\t\tbatch(\n\t\t\t() => {\n\t\t\t\tthis.tokens(tokens)\n\t\t\t\tthis.#generation(this.#generation() + 1)\n\t\t\t},\n\t\t\t{mutable: true}\n\t\t)\n\t}\n\n\t#parseValue(value: string): Token[] {\n\t\tconst parser = this.parser()\n\t\tif (!parser) {\n\t\t\treturn [{type: 'text' as const, content: value, position: {start: 0, end: value.length}}]\n\t\t}\n\t\treturn parser.parse(value)\n\t}\n\n\t#subscribeValue(): void {\n\t\t// Pass value.current directly — it is already a Computed<string>.\n\t\twatch(this.value.current, v => {\n\t\t\tthis.acceptTokens(this.#parseValue(v))\n\t\t})\n\t}\n\n\t#subscribeReactiveParse(): void {\n\t\twatch(\n\t\t\tcomputed(() => this.parser()),\n\t\t\t() => {\n\t\t\t\tthis.acceptTokens(this.#parseValue(this.value.current()))\n\t\t\t}\n\t\t)\n\t}\n\n\t#subscribeReparse(): void {\n\t\twatch(this.reparse, () => {\n\t\t\tthis.acceptTokens(this.#parseValue(this.value.current()))\n\t\t})\n\t}\n}","/** Type guard: checks if a value is an HTMLElement. */\nexport function isHtmlElement(el: unknown): el is HTMLElement {\n\treturn typeof HTMLElement !== 'undefined' && el instanceof HTMLElement\n}\n\n/** Type guard: checks if a value is a Text node. */\nexport function isTextNode(node: unknown): node is Text {\n\treturn node instanceof Text\n}\n\n/** Get the i-th child of an element as HTMLElement, or undefined if out of bounds or wrong type. */\nexport function childAt(parent: Element | null | undefined, index: number): HTMLElement | undefined {\n\tconst child = parent?.children[index]\n\treturn child instanceof HTMLElement ? child : undefined\n}\n\n/** Get all children of an element as HTMLElement[], filtering out non-HTML elements. */\nexport function htmlChildren(parent: Element | null | undefined): HTMLElement[] {\n\tif (!parent) return []\n\treturn Array.from(parent.children).filter((child): child is HTMLElement => child instanceof HTMLElement)\n}\n\n/** Get the first element child as HTMLElement, or null. */\nexport function firstHtmlChild(parent: Element | null | undefined): HTMLElement | null {\n\tconst child = parent?.firstElementChild\n\treturn child instanceof HTMLElement ? child : null\n}\n\n/** Get the last element child as HTMLElement, or null. */\nexport function lastHtmlChild(parent: Element | null | undefined): HTMLElement | null {\n\tconst child = parent?.lastElementChild\n\treturn child instanceof HTMLElement ? child : null\n}\n\n/** Safely narrow an event's target to HTMLElement. */\nexport function htmlTarget(event: {target: EventTarget | null}): HTMLElement | null {\n\tconst {target} = event\n\treturn target instanceof HTMLElement ? target : null\n}\n\n/** Safely narrow an event's target to Node. */\nexport function nodeTarget(event: {target: EventTarget | null}): Node | null {\n\tconst {target} = event\n\treturn target instanceof Node ? target : null\n}\n\n/** Get the next node from a TreeWalker as Text, or null. */\nexport function nextText(walker: TreeWalker): Text | null {\n\tconst node = walker.nextNode()\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- nodeType === 3 guarantees Text; instanceof Text breaks in test envs\n\treturn node?.nodeType === 3 ? (node as Text) : null\n}","import {nodeTarget} from '../../shared/checkers'\nimport type {Range} from '../../shared/editorContracts'\nimport {computed, effect, listen, signal, watch} from '../../shared/signals'\nimport {shallow} from '../../shared/utils/shallow'\nimport type {DomController} from '../dom/DomController'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport type {ValueModel} from '../value/ValueModel'\n\nexport class CaretModel {\n\treadonly selection = signal<Range>(undefined, {equals: shallow})\n\treadonly position = computed({\n\t\tget: () => this.selection()?.start,\n\t\tset: value => this.selection(value !== undefined ? {start: value, end: value} : undefined),\n\t})\n\n\t/**\n\t * Whether the user is actively selecting text (mouse drag, keyboard\n\t * Shift+Arrow, etc.). Drives {@link DomController.reconcile} to freeze\n\t * structural text surfaces (contenteditable=false) while selecting.\n\t */\n\treadonly isUserSelecting = signal<boolean>(false)\n\n\treadonly isAllSelected = computed(() => {\n\t\tconst s = this.selection()\n\t\tconst v = this.value.current()\n\t\treturn s?.start === 0 && s.end === v.length && v.length > 0\n\t})\n\n\tconstructor(\n\t\tprivate readonly lifecycle: Lifecycle,\n\t\tprivate readonly dom: DomController,\n\t\tprivate readonly value: ValueModel\n\t) {\n\t\tlifecycle.onMounted(() => {\n\t\t\tthis.#enableFocusTracking()\n\t\t\tthis.#enableSelectionTracking()\n\t\t\twatch(dom.indexed, () => {\n\t\t\t\tdom.reconcile({isUserSelecting: this.isUserSelecting()})\n\t\t\t\tthis.#applyRangeToDOM()\n\t\t\t})\n\t\t\teffect(() => {\n\t\t\t\tconst isUserSelecting = this.isUserSelecting()\n\t\t\t\tdom.readOnly()\n\t\t\t\tdom.reconcile({isUserSelecting})\n\t\t\t})\n\t\t})\n\t}\n\n\tselectAll(): void {\n\t\tthis.selection({start: 0, end: this.value.current().length})\n\t\tthis.#applyRangeToDOM()\n\t}\n\n\t#enableFocusTracking(): void {\n\t\tconst container = this.dom.container()\n\t\tif (!container) return\n\n\t\tlisten(container, 'focusin', e => {\n\t\t\tconst target = e.target instanceof HTMLElement ? e.target : undefined\n\t\t\tif (!target) {\n\t\t\t\tthis.selection(undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst result = this.dom.locateNode(target)\n\t\t\tif (!result.ok) {\n\t\t\t\tif (result.reason === 'control') return\n\t\t\t\tthis.selection(undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst rawSel = this.dom.readRawSelection()\n\t\t\tif (rawSel.ok) this.selection(rawSel.value.range)\n\t\t})\n\n\t\tlisten(container, 'focusout', () => {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tif (!container.contains(document.activeElement)) {\n\t\t\t\t\tthis.selection(undefined)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t#enableSelectionTracking(): void {\n\t\t// Track whether a mouse button is currently pressed and which node it\n\t\t// started on. The pressed-node identity lets us tell \"drag stayed on\n\t\t// the original element\" (no selection yet) from \"drag is sweeping\n\t\t// across nodes\" (real selection in progress).\n\t\tlet pressedAt: Node | null = null\n\n\t\tlisten(document, 'mousedown', e => {\n\t\t\tpressedAt = nodeTarget(e)\n\t\t})\n\n\t\tlisten(document, 'mousemove', e => {\n\t\t\tif (pressedAt === null) return\n\t\t\tconst container = this.dom.container()\n\t\t\tif (!container) return\n\n\t\t\tconst startedOutsideEditor = !container.contains(pressedAt)\n\t\t\tconst sweepingAcrossNodes = pressedAt !== e.target\n\t\t\tconst selectionIntersectsEditor = window.getSelection()?.containsNode(container, true) ?? false\n\n\t\t\tif ((startedOutsideEditor || sweepingAcrossNodes) && selectionIntersectsEditor) {\n\t\t\t\tthis.isUserSelecting(true)\n\t\t\t}\n\t\t})\n\n\t\tlisten(document, 'mouseup', () => {\n\t\t\tpressedAt = null\n\t\t\tif (!this.isUserSelecting()) return\n\t\t\tconst sel = window.getSelection()\n\t\t\tif (!sel || sel.isCollapsed) this.isUserSelecting(false)\n\t\t})\n\n\t\tlisten(document, 'selectionchange', () => {\n\t\t\tconst sel = window.getSelection()\n\t\t\tif (this.isUserSelecting() && (!sel || sel.isCollapsed)) {\n\t\t\t\tthis.isUserSelecting(false)\n\t\t\t}\n\t\t\tif (!sel?.focusNode) return\n\t\t\tconst result = this.dom.locateNode(sel.focusNode)\n\t\t\tif (!result.ok) {\n\t\t\t\tif (result.reason === 'control') return\n\t\t\t\tthis.selection(undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst rawSel = this.dom.readRawSelection()\n\t\t\tif (rawSel.ok) this.selection(rawSel.value.range)\n\t\t\telse this.selection(undefined)\n\t\t})\n\t}\n\n\t#applyRangeToDOM(): void {\n\t\tif (this.isUserSelecting()) return\n\t\tconst sel = this.selection()\n\t\tif (sel === undefined) return\n\n\t\tif (sel.start === sel.end) {\n\t\t\tconst result = this.dom.placeAt(sel.start)\n\t\t\tif (!result.ok) {\n\t\t\t\tthis.selection(undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst applied = result.value.applied\n\t\t\tif (applied !== sel.start) this.selection({start: applied, end: applied})\n\t\t\treturn\n\t\t}\n\n\t\tconst result = this.dom.placeRange(sel)\n\t\tif (!result.ok) {\n\t\t\tthis.selection(undefined)\n\t\t\treturn\n\t\t}\n\t\tthis.selection(result.value.applied)\n\t}\n}","import {escape} from '../../shared/escape'\nimport type {OverlayMatch} from '../../shared/types'\nimport type {DomController} from '../dom/DomController'\n\n/** Regex to match word characters from the start of a string */\nconst wordRegex = new RegExp(/^\\w*/)\n\n/**\n * Function type for extracting trigger from option\n * @template T - Type of option\n * @param option - The option object\n * @param index - Index of option in array\n * @returns Trigger string or undefined\n */\ntype TriggerExtractor<T> = (option: T, index: number) => string | undefined\n\nexport class TriggerFinder {\n\tspan: string\n\tnode: Node\n\tdividedText: {left: string; right: string}\n\n\tconstructor(private readonly dom?: DomController) {\n\t\tconst sel = window.getSelection()\n\t\tconst node = sel?.anchorNode\n\t\tif (!sel || !node || !document.contains(node)) throw new Error('Anchor node of selection is not exists!')\n\t\tthis.node = node\n\t\tthis.span = node.textContent ?? ''\n\t\tthis.dividedText = this.getDividedTextBy(sel.anchorOffset)\n\t}\n\n\t/**\n\t * Find overlay match in text using provided options and trigger extractor.\n\t * @template T - Type of option objects\n\t * @param options - Array of options to search through\n\t * @param getTrigger - Function that extracts trigger from each option\n\t * @returns OverlayMatch with correct option type or undefined\n\t *\n\t * @example\n\t * // React usage\n\t * TriggerFinder.find(options, (opt) => opt.slotProps?.overlay?.trigger ?? '@')\n\t *\n\t * @example\n\t * // Other framework usage\n\t * TriggerFinder.find(vueOptions, (opt) => opt.overlay?.trigger ?? '@')\n\t */\n\tstatic find<T>(\n\t\toptions: T[] | undefined,\n\t\tgetTrigger: TriggerExtractor<T>,\n\t\tdom?: DomController\n\t): OverlayMatch<T> | undefined {\n\t\tif (!options) return\n\t\tif (!window.getSelection()?.isCollapsed) return\n\t\ttry {\n\t\t\treturn new TriggerFinder(dom).find(options, getTrigger)\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t}\n\n\tgetDividedTextBy(position: number) {\n\t\treturn {left: this.span.slice(0, position), right: this.span.slice(position)}\n\t}\n\n\t/**\n\t * Find overlay match in provided options.\n\t * @template T - Type of option objects\n\t * @param options - Array of options\n\t * @param getTrigger - Function to extract trigger from each option\n\t */\n\tfind<T>(options: T[], getTrigger: TriggerExtractor<T>): OverlayMatch<T> | undefined {\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst option = options[i]\n\t\t\tconst trigger = getTrigger(option, i)\n\t\t\tif (!trigger) continue\n\n\t\t\tconst match = this.matchInTextVia(trigger)\n\t\t\tif (match) {\n\t\t\t\tconst range = this.#rawRangeForMatch(match.annotation, match.index)\n\t\t\t\tif (!range) return undefined\n\t\t\t\treturn {\n\t\t\t\t\tvalue: match.word,\n\t\t\t\t\tsource: match.annotation,\n\t\t\t\t\trange,\n\t\t\t\t\tspan: this.span,\n\t\t\t\t\tnode: this.node,\n\t\t\t\t\toption,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#rawRangeForMatch(source: string, index: number) {\n\t\tif (!this.dom) return {start: index, end: index + source.length}\n\t\tconst boundary = this.dom.rawPositionFromBoundary(this.node, index + source.length, 'after')\n\t\tif (!boundary.ok) return undefined\n\t\treturn {\n\t\t\tstart: boundary.value - source.length,\n\t\t\tend: boundary.value,\n\t\t}\n\t}\n\n\tmatchInTextVia(trigger: string = '@') {\n\t\tconst rightMatch = this.matchRightPart()\n\t\tconst leftMatch = this.matchLeftPart(trigger)\n\t\tif (leftMatch)\n\t\t\treturn {\n\t\t\t\tword: leftMatch.word + rightMatch.word,\n\t\t\t\tannotation: leftMatch.annotation + rightMatch.word,\n\t\t\t\tindex: leftMatch.index,\n\t\t\t}\n\t}\n\n\tmatchRightPart() {\n\t\tconst {right} = this.dividedText\n\t\treturn {word: right.match(wordRegex)?.[0]}\n\t}\n\n\tmatchLeftPart(trigger: string) {\n\t\tconst regex = this.makeTriggerRegex(trigger)\n\t\tconst {left} = this.dividedText\n\t\tconst match = left.match(regex)\n\n\t\tif (!match) return\n\n\t\tconst [annotation, word] = match\n\t\treturn {word, annotation, index: match.index ?? 0}\n\t}\n\n\t//TODO new overlayMatch option if (isSpaceBeforeRequired) append space check for not first words '\\\\s'\n\tmakeTriggerRegex(trigger: string): RegExp {\n\t\tconst patten = escape(trigger) + '(\\\\w*)$'\n\t\treturn new RegExp(patten)\n\t}\n}","import {nextText} from '../../shared/checkers'\n\n/** Firefox-only CaretPosition (absent from TypeScript DOM lib) */\ninterface CaretPosition {\n\treadonly offsetNode: Node\n\treadonly offset: number\n}\n\n/** Non-standard document caret APIs absent from TypeScript DOM lib */\ninterface DocumentWithCaretFromPoint {\n\tcaretRangeFromPoint?(x: number, y: number): Range | null\n\tcaretPositionFromPoint?(x: number, y: number): CaretPosition | null\n}\n\nexport function getCaretIndex(element: HTMLElement): number {\n\tlet position = 0\n\tconst selection = window.getSelection()\n\tif (!selection?.rangeCount) return position\n\tconst range = selection.getRangeAt(0)\n\tconst preCaretRange = range.cloneRange()\n\tpreCaretRange.selectNodeContents(element)\n\tpreCaretRange.setEnd(range.endContainer, range.endOffset)\n\tposition = preCaretRange.toString().length\n\treturn position\n}\n\nexport function getRect(): DOMRect | null {\n\ttry {\n\t\tconst range = window.getSelection()?.getRangeAt(0)\n\t\treturn range?.getBoundingClientRect() ?? null\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function isOnFirstLine(element: HTMLElement): boolean {\n\tconst caretRect = getRect()\n\tif (!caretRect || caretRect.height === 0) return true\n\tconst elRect = element.getBoundingClientRect()\n\treturn caretRect.top < elRect.top + caretRect.height + 2\n}\n\nexport function isOnLastLine(element: HTMLElement): boolean {\n\tconst caretRect = getRect()\n\tif (!caretRect || caretRect.height === 0) return true\n\tconst elRect = element.getBoundingClientRect()\n\treturn caretRect.bottom > elRect.bottom - caretRect.height - 2\n}\n\nexport function setAtElement(element: HTMLElement, offset: number): void {\n\ttry {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\t\tconst walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT)\n\t\tlet node = nextText(walker)\n\t\tif (!node) return\n\t\tlet remaining = isFinite(offset) ? Math.max(0, offset) : Infinity\n\t\tfor (;;) {\n\t\t\tconst next = nextText(walker)\n\t\t\tif (!next || remaining <= node.length) {\n\t\t\t\tconst charOffset = isFinite(remaining) ? Math.min(remaining, node.length) : node.length\n\t\t\t\tconst range = document.createRange()\n\t\t\t\trange.setStart(node, charOffset)\n\t\t\t\trange.collapse(true)\n\t\t\t\tselection.removeAllRanges()\n\t\t\t\tselection.addRange(range)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tremaining -= node.length\n\t\t\tnode = next\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n}\n\nexport function setAtX(element: HTMLElement, x: number, y?: number): void {\n\tconst elRect = element.getBoundingClientRect()\n\tconst targetY = y ?? elRect.top + elRect.height / 2\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- non-standard DOM APIs not in TS lib\n\tconst caretDoc = document as unknown as DocumentWithCaretFromPoint\n\tconst caretPos = caretDoc.caretRangeFromPoint?.(x, targetY) ?? caretDoc.caretPositionFromPoint?.(x, targetY)\n\tif (!caretPos) return\n\tconst sel = window.getSelection()\n\tif (!sel) return\n\tlet domRange: Range\n\tif (caretPos instanceof Range) {\n\t\tdomRange = caretPos\n\t} else if ('offsetNode' in caretPos) {\n\t\tdomRange = document.createRange()\n\t\tdomRange.setStart(caretPos.offsetNode, caretPos.offset)\n\t\tdomRange.collapse(true)\n\t} else {\n\t\treturn\n\t}\n\tif (!element.contains(domRange.startContainer)) {\n\t\tsetAtElement(element, Infinity)\n\t\treturn\n\t}\n\tsel.removeAllRanges()\n\tsel.addRange(domRange)\n}","/** Custom MIME type for markput markup syntax. */\nexport const MARKPUT_MIME = 'application/x-markput'\n\nconst pendingMarkupByContainer = new WeakMap<HTMLElement, string>()\n\n/**\n * Capture markup data from a paste event, scoped to a specific container.\n * Call this from the `paste` event handler — custom MIME types are readable\n * on ClipboardEvent.clipboardData but not reliably on InputEvent.dataTransfer.\n *\n * Scoping to the container prevents multiple editor instances from consuming\n * each other's clipboard data.\n */\nexport function captureMarkupPaste(event: ClipboardEvent, container: HTMLElement): void {\n\tconst raw = event.clipboardData?.getData(MARKPUT_MIME)\n\tif (raw) {\n\t\tpendingMarkupByContainer.set(container, raw)\n\t} else {\n\t\tpendingMarkupByContainer.delete(container)\n\t}\n}\n\n/**\n * Consume the pending markup data (if any) for the given container.\n * Returns undefined if no markup was captured or the data was already consumed.\n */\nexport function consumeMarkupPaste(container: HTMLElement): string | undefined {\n\tconst markup = pendingMarkupByContainer.get(container)\n\tpendingMarkupByContainer.delete(container)\n\treturn markup\n}\n\n/**\n * Clear the pending markup buffer for the given container. Useful for test cleanup.\n */\nexport function clearMarkupPaste(container: HTMLElement): void {\n\tpendingMarkupByContainer.delete(container)\n}","import type {Range} from '../../shared/editorContracts'\nimport {listen} from '../../shared/signals/index.js'\nimport type {DomController} from '../dom/DomController'\nimport type {EditController} from '../edit'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport {toString} from '../parsing'\nimport type {Token} from '../parsing'\nimport type {ParseController} from '../parsing/ParseController'\nimport {MARKPUT_MIME} from './pasteMarkup'\n\nfunction htmlFromRange(range: globalThis.Range): string {\n\tconst fragment = range.cloneContents()\n\tconst div = document.createElement('div')\n\tdiv.appendChild(fragment)\n\treturn div.innerHTML\n}\n\nfunction serializeRawRange(tokens: readonly Token[], range: Range): string {\n\treturn toString(trimTokensForRawRange(tokens, range))\n}\n\nfunction trimTokensForRawRange(tokens: readonly Token[], range: Range): Token[] {\n\treturn tokens\n\t\t.filter(token => token.position.end > range.start && token.position.start < range.end)\n\t\t.map(token => {\n\t\t\tif (token.type === 'text') {\n\t\t\t\tconst start = Math.max(0, range.start - token.position.start)\n\t\t\t\tconst end = Math.min(token.content.length, range.end - token.position.start)\n\t\t\t\treturn Object.assign({}, token, {content: token.content.slice(start, end)})\n\t\t\t}\n\n\t\t\tif (token.children.length === 0) return token\n\t\t\treturn Object.assign({}, token, {children: trimTokensForRawRange(token.children, range)})\n\t\t})\n}\n\nexport class ClipboardController {\n\tconstructor(\n\t\tprivate readonly lifecycle: Lifecycle,\n\t\tprivate readonly edit: EditController,\n\t\tprivate readonly dom: DomController,\n\t\tprivate readonly parsing: ParseController\n\t) {\n\t\tlifecycle.onMounted(() => {\n\t\t\t// The container must be registered before mounted() fires (adapter\n\t\t\t// calls dom.container() in its ref/onMounted, then lifecycle.mounted).\n\t\t\tconst container = dom.container()\n\t\t\tif (!container) return\n\n\t\t\tlisten(container, 'copy', e => {\n\t\t\t\tthis.#handleCopy(e)\n\t\t\t})\n\t\t\tlisten(container, 'cut', e => {\n\t\t\t\tif (!this.#handleCopy(e)) return\n\t\t\t\tconst raw = dom.readRawSelection()\n\t\t\t\tif (!raw.ok || raw.value.range.start === raw.value.range.end) return\n\t\t\t\tedit.replace(raw.value.range, '')\n\t\t\t})\n\t\t})\n\t}\n\n\t#handleCopy(e: ClipboardEvent): boolean {\n\t\tconst container = this.dom.container()\n\t\tif (!container) return false\n\n\t\tconst raw = this.dom.readRawSelection()\n\t\tif (!raw.ok || raw.value.range.start === raw.value.range.end) return false\n\n\t\t// text/plain: visual selected text\n\t\tconst sel = window.getSelection()\n\t\tconst range = sel?.rangeCount ? sel.getRangeAt(0) : undefined\n\t\tif (!range) return false\n\t\tconst plainText = range.toString()\n\n\t\t// text/html: rendered DOM HTML from the actual selection\n\t\tconst html = htmlFromRange(range)\n\n\t\t// application/x-markput: raw-selected text tokens are trimmed; overlapping plain marks keep markup syntax.\n\t\tconst markup = serializeRawRange(this.parsing.tokens(), raw.value.range)\n\n\t\te.preventDefault()\n\t\te.clipboardData?.setData('text/plain', plainText)\n\t\te.clipboardData?.setData('text/html', html)\n\t\te.clipboardData?.setData(MARKPUT_MIME, markup)\n\t\treturn true\n\t}\n}","import {firstHtmlChild} from '../../shared/checkers'\nimport type {\n\tBoundaryPositionResult,\n\tDomDiagnostic,\n\tDomIndex,\n\tDomRef,\n\tNodeLocationResult,\n\tRange,\n\tRawSelection,\n\tRawSelectionResult,\n\tResult,\n\tTokenAddress,\n\tTokenPath,\n} from '../../shared/editorContracts'\nimport {batch, computed, event, listen, signal, watch} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport type {Token} from '../parsing'\nimport type {ParseController} from '../parsing/ParseController'\nimport {pathEquals, pathKey} from '../parsing/tokenIndex'\nimport type {TokenIndex} from '../parsing/tokenIndex'\nimport type {PropsModel} from '../props/PropsModel'\nimport type {ValueModel} from '../value/ValueModel'\n\ntype RegisteredRole =\n\t| {readonly role: 'control'}\n\t| {\n\t\t\treadonly role: 'childSequence' | 'row' | 'token' | 'text'\n\t\t\treadonly path: TokenPath\n\t\t\treadonly address: TokenAddress\n\t }\n\ntype PathElements = {\n\tpath: TokenPath\n\taddress: TokenAddress\n\trowElement?: HTMLElement\n\ttokenElement: HTMLElement\n\ttextElement?: HTMLElement\n}\n\ntype ControlRegistration = {\n\treadonly ownerPath?: TokenPath\n\treadonly element: HTMLElement\n}\n\ntype ChildSequenceRegistration = {\n\treadonly ownerPath: TokenPath\n\treadonly element: HTMLElement\n}\n\nfunction nextTextNode(walker: TreeWalker): Text | null {\n\tconst node = walker.nextNode()\n\treturn node instanceof Text ? node : null\n}\n\nfunction splitsSurrogatePair(text: string, offset: number): boolean {\n\tif (offset <= 0 || offset >= text.length) return false\n\tconst prev = text.charCodeAt(offset - 1)\n\tconst next = text.charCodeAt(offset)\n\treturn prev >= 0xd800 && prev <= 0xdbff && next >= 0xdc00 && next <= 0xdfff\n}\n\nfunction textOffsetWithin(surface: HTMLElement, node: Node, offset: number): number | undefined {\n\tif (node.nodeType === Node.TEXT_NODE) {\n\t\tconst text = node.textContent ?? ''\n\t\tif (splitsSurrogatePair(text, offset)) return undefined\n\t\treturn node instanceof Text ? textOffsetFromTreeWalker(surface, node, offset) : undefined\n\t}\n\n\tif (node === surface) return elementBoundaryOffset(surface, offset)\n\treturn undefined\n}\n\nfunction textOffsetFromTreeWalker(surface: HTMLElement, target: Text, targetOffset: number): number | undefined {\n\tlet total = 0\n\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\tlet current = nextTextNode(walker)\n\twhile (current) {\n\t\tif (current === target) return total + targetOffset\n\t\ttotal += current.length\n\t\tcurrent = nextTextNode(walker)\n\t}\n\treturn undefined\n}\n\nfunction textLength(surface: HTMLElement): number {\n\tlet total = 0\n\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\tlet current = nextTextNode(walker)\n\twhile (current) {\n\t\ttotal += current.length\n\t\tcurrent = nextTextNode(walker)\n\t}\n\treturn total\n}\n\nfunction elementBoundaryOffset(surface: HTMLElement, offset: number): number | undefined {\n\tif (offset <= 0) return 0\n\tif (offset >= surface.childNodes.length) return textLength(surface)\n\n\tlet total = 0\n\tfor (let i = 0; i < offset; i++) {\n\t\tconst child = surface.childNodes.item(i)\n\t\tif (child.nodeType === Node.TEXT_NODE && child instanceof Text) {\n\t\t\ttotal += child.length\n\t\t\tcontinue\n\t\t}\n\t\tif (child instanceof HTMLElement) total += textLength(child)\n\t}\n\treturn total\n}\n\nfunction hasEditableAncestorBefore(node: Node, boundary: HTMLElement): boolean {\n\tlet current = node instanceof HTMLElement ? node : node.parentElement\n\twhile (current && current !== boundary) {\n\t\tif (\n\t\t\tcurrent.isContentEditable ||\n\t\t\tcurrent.contentEditable === 'true' ||\n\t\t\tcurrent.contentEditable === 'plaintext-only'\n\t\t) {\n\t\t\treturn true\n\t\t}\n\t\tcurrent = current.parentElement\n\t}\n\treturn false\n}\n\nexport class DomController {\n\treadonly #domIndex = signal<DomIndex>(undefined, {readonly: true})\n\treadonly index: Computed<DomIndex | undefined> = computed(() => this.#domIndex())\n\treadonly container = signal<HTMLElement | null>(null)\n\treadonly diagnostics = event<DomDiagnostic>()\n\treadonly indexed = event<void>()\n\treadonly readOnly: Computed<boolean> = computed(() => this.props.readOnly())\n\n\treadonly #pendingControls = new Map<string, ControlRegistration>()\n\treadonly #pendingChildSequences = new Map<string, ChildSequenceRegistration>()\n\t#nextControlId = 0\n\t#nextChildSequenceId = 0\n\t#elementRoles = new WeakMap<HTMLElement, RegisteredRole>()\n\t#pathElements = new Map<string, PathElements>()\n\t#generation = 0\n\t#rendering = false\n\t#isComposing = false\n\t#queuedRender = false\n\n\tconstructor(\n\t\tprivate readonly lifecycle: Lifecycle,\n\t\tprivate readonly props: PropsModel,\n\t\tprivate readonly parsing: ParseController,\n\t\tprivate readonly value: ValueModel\n\t) {\n\t\tlifecycle.onMounted(() => {\n\t\t\tconst container = this.container()\n\t\t\tif (container) {\n\t\t\t\tlisten(container, 'click', () => {\n\t\t\t\t\tconst tokens = this.parsing.tokens()\n\t\t\t\t\tif (tokens.length === 1 && tokens[0].type === 'text' && tokens[0].content === '') {\n\t\t\t\t\t\tconst c = this.container()\n\t\t\t\t\t\tconst element = c ? firstHtmlChild(c) : null\n\t\t\t\t\t\telement?.focus()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\twatch(lifecycle.rendered, () => {\n\t\t\t\tthis.#handleRendered()\n\t\t\t})\n\t\t\twatch(\n\t\t\t\tcomputed(() => props.readOnly()),\n\t\t\t\t() => this.reconcile()\n\t\t\t)\n\t\t})\n\t}\n\n\tcompositionStarted(): void {\n\t\tthis.#isComposing = true\n\t}\n\n\tcompositionEnded(): void {\n\t\tif (!this.#isComposing) return\n\t\tthis.#isComposing = false\n\t}\n\n\tcontrolFor(ownerPath?: TokenPath): DomRef {\n\t\tconst key = `control:${ownerPath ? pathKey(ownerPath) : 'global'}:${++this.#nextControlId}`\n\n\t\tconst callback: DomRef = element => {\n\t\t\tif (element) {\n\t\t\t\tthis.#pendingControls.set(key, {ownerPath: ownerPath ? [...ownerPath] : undefined, element})\n\t\t\t} else {\n\t\t\t\tthis.#pendingControls.delete(key)\n\t\t\t}\n\t\t}\n\t\treturn callback\n\t}\n\n\tchildrenFor(ownerPath: TokenPath): DomRef {\n\t\tconst key = `children:${pathKey(ownerPath)}:${++this.#nextChildSequenceId}`\n\n\t\tconst callback: DomRef = element => {\n\t\t\tif (element) {\n\t\t\t\tthis.#pendingChildSequences.set(key, {ownerPath: [...ownerPath], element})\n\t\t\t} else {\n\t\t\t\tthis.#pendingChildSequences.delete(key)\n\t\t\t}\n\t\t}\n\t\treturn callback\n\t}\n\n\treconcile(opts?: {isUserSelecting?: boolean}): void {\n\t\tthis.#reconcileStructuralTextSurfaces(opts?.isUserSelecting)\n\t}\n\n\tlocateNode(node: Node): NodeLocationResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst container = this.container()\n\t\tif (!container || !container.contains(node)) return {ok: false, reason: 'outsideEditor'}\n\n\t\tlet current: Node | null = node\n\t\twhile (current) {\n\t\t\tif (current instanceof HTMLElement) {\n\t\t\t\tconst role = this.#elementRoles.get(current)\n\t\t\t\tif (role?.role === 'control') return {ok: false, reason: 'control'}\n\t\t\t\tif (role) {\n\t\t\t\t\tconst elements = this.#pathElements.get(pathKey(role.path))\n\t\t\t\t\tif (!elements?.tokenElement) return {ok: false, reason: 'notIndexed'}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: true,\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\taddress: role.address,\n\t\t\t\t\t\t\ttokenElement: elements.tokenElement,\n\t\t\t\t\t\t\ttextElement: elements.textElement,\n\t\t\t\t\t\t\trowElement: elements.rowElement,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (current === container) break\n\t\t\tcurrent = current.parentNode\n\t\t}\n\n\t\treturn {ok: false, reason: 'outsideEditor'}\n\t}\n\n\tplaceAt(\n\t\trawPosition: number,\n\t\taffinity: 'before' | 'after' = 'after'\n\t): Result<{applied: number}, 'notIndexed' | 'invalidBoundary'> {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst maxPos = this.value.current().length\n\t\tconst clamped = Math.min(rawPosition, maxPos)\n\t\tconst target = this.#findTextTargetForRawPosition(clamped, affinity)\n\t\tif (!target) {\n\t\t\tconst boundary = this.#focusMarkBoundaryForRawPosition(clamped)\n\t\t\tif (!boundary.ok) return boundary\n\t\t\treturn {ok: true, value: {applied: clamped}}\n\t\t}\n\t\ttarget.element.focus()\n\t\tthis.#placeCaretInTextSurface(target.element, clamped - target.start)\n\t\treturn {ok: true, value: {applied: clamped}}\n\t}\n\n\tplaceRange(range: Range): Result<{applied: Range}, 'notIndexed' | 'invalidBoundary'> {\n\t\tconst maxPos = this.value.current().length\n\t\tconst clamped: Range = {\n\t\t\tstart: Math.min(range.start, maxPos),\n\t\t\tend: Math.min(range.end, maxPos),\n\t\t}\n\t\tconst result = this.#placeSelection({range: clamped, direction: undefined})\n\t\tif (!result.ok) return result\n\t\treturn {ok: true, value: {applied: clamped}}\n\t}\n\n\tfocusAddress(address: TokenAddress, boundary: 'start' | 'end' = 'start'): Result<void, 'notIndexed' | 'stale'> {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst resolved = this.parsing.index().resolveAddress(address)\n\t\tif (!resolved.ok) return {ok: false, reason: 'stale'}\n\n\t\tconst elements = this.#pathElements.get(pathKey(address.path))\n\t\tconst target = elements?.textElement ?? elements?.tokenElement ?? elements?.rowElement\n\t\tif (!target) return {ok: false, reason: 'notIndexed'}\n\n\t\ttarget.focus()\n\t\tconst role =\n\t\t\ttarget === elements?.textElement ? 'text' : target === elements?.rowElement ? 'row' : 'markDescendant'\n\t\tif (role === 'markDescendant') {\n\t\t\tthis.#placeCollapsedBoundary(target, boundary === 'end' ? target.childNodes.length : 0)\n\t\t}\n\t\treturn {ok: true, value: undefined}\n\t}\n\n\trawPositionFromBoundary(\n\t\tnode: Node,\n\t\toffset: number,\n\t\taffinity: 'before' | 'after' = 'after'\n\t): BoundaryPositionResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tif (this.#isComposing) return {ok: false, reason: 'composing'}\n\n\t\tconst container = this.container()\n\t\tif (container && node === container) {\n\t\t\treturn this.#rawPositionFromContainerBoundary(offset, affinity)\n\t\t}\n\n\t\tconst location = this.locateNode(node)\n\t\tif (!location.ok) return location.reason === 'control' ? {ok: false, reason: 'control'} : location\n\n\t\tconst token = this.parsing.index().resolveAddress(location.value.address)\n\t\tif (!token.ok) return {ok: false, reason: 'notIndexed'}\n\n\t\tif (node instanceof HTMLElement) {\n\t\t\tconst role = this.#elementRoles.get(node)\n\t\t\tif (role?.role === 'childSequence') {\n\t\t\t\tconst childCount = node.childNodes.length\n\t\t\t\tif (offset <= 0) return {ok: true, value: token.value.position.start}\n\t\t\t\tif (offset >= childCount) return {ok: true, value: token.value.position.end}\n\t\t\t\treturn this.#rawPositionFromTokenChildBoundary(node, offset, token.value, affinity)\n\t\t\t}\n\t\t}\n\n\t\tconst textElement = location.value.textElement\n\t\tif (textElement?.contains(node)) {\n\t\t\tconst local = textOffsetWithin(textElement, node, offset)\n\t\t\tif (local === undefined) return {ok: false, reason: 'invalidBoundary'}\n\t\t\treturn {ok: true, value: token.value.position.start + local}\n\t\t}\n\n\t\tif (node === location.value.tokenElement) {\n\t\t\tconst childCount = location.value.tokenElement.childNodes.length\n\t\t\tif (offset <= 0) return {ok: true, value: token.value.position.start}\n\t\t\tif (offset >= childCount) return {ok: true, value: token.value.position.end}\n\t\t\treturn this.#rawPositionFromTokenChildBoundary(location.value.tokenElement, offset, token.value, affinity)\n\t\t}\n\n\t\tif (token.value.type === 'mark' && location.value.tokenElement.contains(node)) {\n\t\t\tif (hasEditableAncestorBefore(node, location.value.tokenElement)) {\n\t\t\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tvalue: affinity === 'after' ? token.value.position.start : token.value.position.end,\n\t\t\t}\n\t\t}\n\n\t\tif (location.value.rowElement && node === location.value.rowElement) {\n\t\t\treturn {ok: true, value: offset <= 0 ? token.value.position.start : token.value.position.end}\n\t\t}\n\n\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t}\n\n\treadRawSelection(): RawSelectionResult {\n\t\tif (!this.index()) return {ok: false, reason: 'notIndexed'}\n\t\tconst selection = window.getSelection()\n\t\tif (!selection || selection.rangeCount === 0) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst range = selection.getRangeAt(0)\n\t\tconst start = this.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\t\tconst end = this.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\n\t\tif (!start.ok) {\n\t\t\tconst reason = start.reason === 'composing' ? 'invalidBoundary' : start.reason\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\treason: reason === 'control' || reason === 'outsideEditor' ? 'mixedBoundary' : reason,\n\t\t\t}\n\t\t}\n\t\tif (!end.ok) {\n\t\t\tconst reason = end.reason === 'composing' ? 'invalidBoundary' : end.reason\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\treason: reason === 'control' || reason === 'outsideEditor' ? 'mixedBoundary' : reason,\n\t\t\t}\n\t\t}\n\n\t\tconst rangeValue =\n\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value}\n\t\tconst direction =\n\t\t\trangeValue.start === rangeValue.end\n\t\t\t\t? undefined\n\t\t\t\t: selection.anchorNode === range.endContainer && selection.anchorOffset === range.endOffset\n\t\t\t\t\t? 'backward'\n\t\t\t\t\t: 'forward'\n\n\t\treturn {ok: true, value: direction ? {range: rangeValue, direction} : {range: rangeValue}}\n\t}\n\n\t#handleRendered(): void {\n\t\tif (this.#rendering) {\n\t\t\tthis.#queuedRender = true\n\t\t\tthis.diagnostics({kind: 'renderReentry', reason: 'rendered event queued during DOM indexing'})\n\t\t\treturn\n\t\t}\n\n\t\tthis.#rendering = true\n\t\ttry {\n\t\t\tthis.#commitRendered()\n\t\t} finally {\n\t\t\tthis.#rendering = false\n\t\t\tconst queued = this.#queuedRender\n\t\t\tthis.#queuedRender = false\n\t\t\tif (queued) this.#handleRendered()\n\t\t}\n\t}\n\n\t#commitRendered(): void {\n\t\tconst container = this.container()\n\t\tif (!container) {\n\t\t\tthis.diagnostics({kind: 'missingContainer', reason: 'container is not registered'})\n\t\t\treturn\n\t\t}\n\n\t\tconst tokenIndex = this.parsing.index()\n\t\tconst pathElements = new Map<string, PathElements>()\n\t\tconst elementRoles = new WeakMap<HTMLElement, RegisteredRole>()\n\t\tconst controlElements = new Set<HTMLElement>()\n\n\t\tfor (const {element} of this.#pendingControls.values()) {\n\t\t\tcontrolElements.add(element)\n\t\t\telementRoles.set(element, {role: 'control'})\n\t\t}\n\n\t\tconst tokens = this.parsing.tokens()\n\t\tif (this.props.layout() === 'block') {\n\t\t\tthis.#indexBlockTokens(container, tokens, tokenIndex, controlElements, pathElements, elementRoles)\n\t\t} else {\n\t\t\tthis.#indexTokenSequence(\n\t\t\t\tcontainer,\n\t\t\t\ttokens,\n\t\t\t\t[],\n\t\t\t\tundefined,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t}\n\n\t\tthis.#pathElements = pathElements\n\t\tthis.#elementRoles = elementRoles\n\t\tthis.#reconcileStructuralTextSurfaces()\n\n\t\tbatch(() => this.#domIndex({generation: ++this.#generation}), {mutable: true})\n\t\tthis.indexed()\n\t}\n\n\t#elementChildren(element: HTMLElement): HTMLElement[] {\n\t\treturn Array.from(element.children).filter(child => child instanceof HTMLElement)\n\t}\n\n\t#isControlRoot(element: HTMLElement, controlElements: Set<HTMLElement>): boolean {\n\t\tif (controlElements.has(element)) return true\n\t\tfor (const control of controlElements) {\n\t\t\tif (element.contains(control)) return true\n\t\t}\n\t\treturn false\n\t}\n\n\t#childSequenceHostsFor(ownerPath: TokenPath): HTMLElement[] {\n\t\tconst hosts: HTMLElement[] = []\n\t\tfor (const registration of this.#pendingChildSequences.values()) {\n\t\t\tif (pathEquals(registration.ownerPath, ownerPath)) hosts.push(registration.element)\n\t\t}\n\t\treturn hosts\n\t}\n\n\t#indexNestedTokenSequence(\n\t\ttoken: Token,\n\t\tpath: TokenPath,\n\t\taddress: TokenAddress,\n\t\townerElement: HTMLElement,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: TokenIndex,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tif (token.type !== 'mark' || token.children.length === 0) return\n\n\t\tconst hosts = this.#childSequenceHostsFor(path)\n\t\tif (hosts.length === 0) {\n\t\t\tthis.#indexTokenSequence(\n\t\t\t\townerElement,\n\t\t\t\ttoken.children,\n\t\t\t\tpath,\n\t\t\t\trowElement,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst ownerKey = pathKey(path)\n\t\tif (hosts.length !== 1) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath,\n\t\t\t\treason: `expected exactly 1 child sequence host for owner path ${ownerKey} but found ${hosts.length}`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tconst host = hosts[0]\n\t\tif (!ownerElement.contains(host)) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath,\n\t\t\t\treason: `child sequence host for owner path ${ownerKey} is not contained by owner token element`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\telementRoles.set(host, {role: 'childSequence', path, address})\n\t\tthis.#indexTokenSequence(\n\t\t\thost,\n\t\t\ttoken.children,\n\t\t\tpath,\n\t\t\trowElement,\n\t\t\ttokenIndex,\n\t\t\tcontrolElements,\n\t\t\tpathElements,\n\t\t\telementRoles\n\t\t)\n\t}\n\n\t#indexBlockTokens(\n\t\tcontainer: HTMLElement,\n\t\ttokens: readonly Token[],\n\t\ttokenIndex: TokenIndex,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst rows = this.#elementChildren(container)\n\t\tif (rows.length !== tokens.length) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\treason: `expected ${tokens.length} block rows but found ${rows.length}`,\n\t\t\t})\n\t\t}\n\n\t\ttokens.forEach((token, i) => {\n\t\t\tconst row = rows.at(i)\n\t\t\tif (!row) return\n\t\t\tconst candidates = this.#elementChildren(row).filter(child => !this.#isControlRoot(child, controlElements))\n\t\t\tif (candidates.length !== 1) {\n\t\t\t\tthis.diagnostics({\n\t\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\t\tpath: [i],\n\t\t\t\t\treason: `expected 1 block token element but found ${candidates.length}`,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#indexTokenElement(\n\t\t\t\ttoken,\n\t\t\t\t[i],\n\t\t\t\tcandidates[0],\n\t\t\t\trow,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t})\n\t}\n\n\t#indexTokenSequence(\n\t\tparent: HTMLElement,\n\t\ttokens: readonly Token[],\n\t\tbasePath: TokenPath,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: TokenIndex,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst elements = this.#elementChildren(parent).filter(child => !this.#isControlRoot(child, controlElements))\n\t\tif (elements.length !== tokens.length) {\n\t\t\tthis.diagnostics({\n\t\t\t\tkind: 'ambiguousStructure',\n\t\t\t\tpath: basePath.length ? basePath : undefined,\n\t\t\t\treason: `expected ${tokens.length} child token elements but found ${elements.length}`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\ttokens.forEach((token, i) => {\n\t\t\tconst element = elements.at(i)\n\t\t\tif (!element) return\n\t\t\tthis.#indexTokenElement(\n\t\t\t\ttoken,\n\t\t\t\t[...basePath, i],\n\t\t\t\telement,\n\t\t\t\trowElement,\n\t\t\t\ttokenIndex,\n\t\t\t\tcontrolElements,\n\t\t\t\tpathElements,\n\t\t\t\telementRoles\n\t\t\t)\n\t\t})\n\t}\n\n\t#indexTokenElement(\n\t\ttoken: Token,\n\t\tpath: TokenPath,\n\t\telement: HTMLElement,\n\t\trowElement: HTMLElement | undefined,\n\t\ttokenIndex: TokenIndex,\n\t\tcontrolElements: Set<HTMLElement>,\n\t\tpathElements: Map<string, PathElements>,\n\t\telementRoles: WeakMap<HTMLElement, RegisteredRole>\n\t): void {\n\t\tconst address = tokenIndex.addressFor(path)\n\t\tif (!address) {\n\t\t\tthis.diagnostics({kind: 'stalePath', path, reason: 'structural path no longer resolves'})\n\t\t\treturn\n\t\t}\n\n\t\tconst record: PathElements = {\n\t\t\tpath: [...path],\n\t\t\taddress,\n\t\t\ttokenElement: element,\n\t\t\ttextElement: token.type === 'text' ? element : undefined,\n\t\t\trowElement,\n\t\t}\n\t\tpathElements.set(tokenIndex.key(path), record)\n\t\telementRoles.set(element, {role: token.type === 'text' ? 'text' : 'token', path, address})\n\t\tif (rowElement && path.length === 1) elementRoles.set(rowElement, {role: 'row', path, address})\n\n\t\tthis.#indexNestedTokenSequence(\n\t\t\ttoken,\n\t\t\tpath,\n\t\t\taddress,\n\t\t\telement,\n\t\t\trowElement,\n\t\t\ttokenIndex,\n\t\t\tcontrolElements,\n\t\t\tpathElements,\n\t\t\telementRoles\n\t\t)\n\t}\n\n\t#reconcileStructuralTextSurfaces(isUserSelecting?: boolean): void {\n\t\tconst tokenIndex = this.parsing.index()\n\t\tconst editable = this.props.readOnly() || isUserSelecting ? 'false' : 'true'\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok) {\n\t\t\t\tthis.diagnostics({\n\t\t\t\t\tkind: 'stalePath',\n\t\t\t\t\tpath: record.path,\n\t\t\t\t\treason: 'structural path became stale during reconciliation',\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (record.textElement) {\n\t\t\t\tif (resolved.value.type !== 'text') {\n\t\t\t\t\tthis.diagnostics({\n\t\t\t\t\t\tkind: 'missingRole',\n\t\t\t\t\t\tpath: record.path,\n\t\t\t\t\t\treason: 'text role registered for non-text token',\n\t\t\t\t\t})\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (record.textElement.textContent !== resolved.value.content) {\n\t\t\t\t\trecord.textElement.textContent = resolved.value.content\n\t\t\t\t}\n\t\t\t\trecord.textElement.contentEditable = editable\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (resolved.value.type === 'mark') {\n\t\t\t\tif (this.props.readOnly()) {\n\t\t\t\t\trecord.tokenElement.removeAttribute('tabindex')\n\t\t\t\t} else {\n\t\t\t\t\trecord.tokenElement.tabIndex = 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#rawPositionFromContainerBoundary(offset: number, affinity: 'before' | 'after'): BoundaryPositionResult {\n\t\tconst tokens = this.parsing.tokens()\n\t\tif (tokens.length === 0) return {ok: true, value: 0}\n\t\tif (offset <= 0) return {ok: true, value: tokens[0].position.start}\n\t\tif (offset >= tokens.length) return {ok: true, value: tokens[tokens.length - 1].position.end}\n\n\t\tconst before = tokens[offset - 1]\n\t\tconst after = tokens[offset]\n\t\treturn {ok: true, value: affinity === 'before' ? before.position.end : after.position.start}\n\t}\n\n\t#rawPositionFromTokenChildBoundary(\n\t\ttokenElement: HTMLElement,\n\t\toffset: number,\n\t\ttoken: Token,\n\t\taffinity: 'before' | 'after'\n\t): BoundaryPositionResult {\n\t\tif (token.type === 'text') {\n\t\t\tconst textElement = this.#pathElements.get(pathKey(this.parsing.index().pathFor(token) ?? []))?.textElement\n\t\t\tif (!textElement || textLength(textElement) === 0) return {ok: true, value: token.position.start}\n\t\t}\n\n\t\tconst before = this.#locateRegisteredDescendant(tokenElement.childNodes.item(offset - 1))\n\t\tconst after = this.#locateRegisteredDescendant(tokenElement.childNodes.item(offset))\n\t\tif (before?.ok && after?.ok) {\n\t\t\tconst beforeToken = this.parsing.index().resolveAddress(before.value.address)\n\t\t\tconst afterToken = this.parsing.index().resolveAddress(after.value.address)\n\t\t\tif (beforeToken.ok && afterToken.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\tvalue: affinity === 'before' ? beforeToken.value.position.end : afterToken.value.position.start,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {ok: true, value: affinity === 'before' ? token.position.start : token.position.end}\n\t}\n\n\t#locateRegisteredDescendant(node: Node | null): NodeLocationResult | undefined {\n\t\tif (!node) return undefined\n\t\treturn this.locateNode(node)\n\t}\n\n\t#findTextTargetForRawPosition(\n\t\trawPosition: number,\n\t\taffinity: 'before' | 'after'\n\t): {element: HTMLElement; start: number; end: number} | undefined {\n\t\tconst candidates: Array<{element: HTMLElement; start: number; end: number}> = []\n\t\tconst tokenIndex = this.parsing.index()\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tif (!record.textElement) continue\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok || resolved.value.type !== 'text') continue\n\t\t\tcandidates.push({\n\t\t\t\telement: record.textElement,\n\t\t\t\tstart: resolved.value.position.start,\n\t\t\t\tend: resolved.value.position.end,\n\t\t\t})\n\t\t}\n\n\t\tcandidates.sort((a, b) => a.start - b.start)\n\t\tconst containing = candidates.find(candidate => rawPosition >= candidate.start && rawPosition <= candidate.end)\n\t\tif (containing) return containing\n\t\tif (affinity === 'before') return [...candidates].toReversed().find(candidate => candidate.end <= rawPosition)\n\t\treturn candidates.find(candidate => candidate.start >= rawPosition)\n\t}\n\n\t#focusMarkBoundaryForRawPosition(rawPosition: number): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\tconst tokenIndex = this.parsing.index()\n\n\t\tfor (const record of this.#pathElements.values()) {\n\t\t\tconst resolved = tokenIndex.resolveAddress(record.address)\n\t\t\tif (!resolved.ok || resolved.value.type !== 'mark') continue\n\t\t\tif (rawPosition !== resolved.value.position.start && rawPosition !== resolved.value.position.end) continue\n\n\t\t\tconst boundary = rawPosition === resolved.value.position.end ? 'end' : 'start'\n\t\t\trecord.tokenElement.focus()\n\t\t\tthis.#placeCollapsedBoundary(\n\t\t\t\trecord.tokenElement,\n\t\t\t\tboundary === 'end' ? record.tokenElement.childNodes.length : 0\n\t\t\t)\n\t\t\treturn {ok: true, value: undefined}\n\t\t}\n\n\t\treturn {ok: false, reason: 'invalidBoundary'}\n\t}\n\n\t#placeCaretInTextSurface(surface: HTMLElement, offset: number): void {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\n\t\tconst boundary = this.#boundaryInTextSurface(surface, offset)\n\t\tif (!boundary) return\n\t\tconst range = document.createRange()\n\t\trange.setStart(boundary.node, boundary.offset)\n\t\trange.collapse(true)\n\t\tselection.removeAllRanges()\n\t\tselection.addRange(range)\n\t}\n\n\t#placeCollapsedBoundary(element: HTMLElement, offset: number): void {\n\t\tconst selection = window.getSelection()\n\t\tif (!selection) return\n\n\t\tconst range = document.createRange()\n\t\trange.setStart(element, Math.min(Math.max(offset, 0), element.childNodes.length))\n\t\trange.collapse(true)\n\t\tselection.removeAllRanges()\n\t\tselection.addRange(range)\n\t}\n\n\t#placeSelection(selection: RawSelection): Result<void, 'notIndexed' | 'invalidBoundary'> {\n\t\tconst start = this.#findTextTargetForRawPosition(selection.range.start, 'after')\n\t\tconst end = this.#findTextTargetForRawPosition(selection.range.end, 'before')\n\t\tconst browserSelection = window.getSelection()\n\t\tif (!start || !end || !browserSelection) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst startBoundary = this.#boundaryInTextSurface(start.element, selection.range.start - start.start)\n\t\tconst endBoundary = this.#boundaryInTextSurface(end.element, selection.range.end - end.start)\n\t\tif (!startBoundary || !endBoundary) return {ok: false, reason: 'invalidBoundary'}\n\n\t\tconst range = document.createRange()\n\t\trange.setStart(startBoundary.node, startBoundary.offset)\n\t\trange.setEnd(endBoundary.node, endBoundary.offset)\n\t\tbrowserSelection.removeAllRanges()\n\t\tbrowserSelection.addRange(range)\n\t\treturn {ok: true, value: undefined}\n\t}\n\n\t#boundaryInTextSurface(surface: HTMLElement, offset: number): {node: Text; offset: number} | undefined {\n\t\tconst walker = document.createTreeWalker(surface, NodeFilter.SHOW_TEXT)\n\t\tlet remaining = Math.max(0, offset)\n\t\tlet node = nextTextNode(walker)\n\t\twhile (node) {\n\t\t\tif (remaining <= node.length) return {node, offset: remaining}\n\t\t\tremaining -= node.length\n\t\t\tnode = nextTextNode(walker)\n\t\t}\n\n\t\tconst text = surface.firstChild instanceof Text ? surface.firstChild : document.createTextNode('')\n\t\tif (!text.parentNode) surface.append(text)\n\t\treturn {node: text, offset: text.length}\n\t}\n}","import type {CoreOption} from '../../shared/types'\nimport {annotate} from '../parsing'\n\nexport function createRowContent(options: CoreOption[]): string {\n\tconst firstOption = options[0]\n\tif (!firstOption.markup) return '\\n'\n\treturn annotate(firstOption.markup, {value: '', slot: '', meta: ''})\n}","import type {MarkToken, Token} from '../parsing'\n\nfunction gapText(value: string, a: Token, b: Token): string {\n\treturn value.substring(a.position.end, b.position.start)\n}\n\nfunction isSlotLeadingMark(token: Token): token is MarkToken {\n\treturn token.type === 'mark' && token.descriptor.hasSlot && token.descriptor.segments.length === 1\n}\n\n/**\n * Returns whether two adjacent rows can be merged (Backspace/Delete).\n * Text rows merge when there's a gap between them.\n * Slot-leading mark rows of the same descriptor merge by removing the first mark's suffix.\n */\nexport function canMergeRows(a: Token, b: Token): boolean {\n\tif (a.type === 'text' && b.type === 'text' && b.position.start > a.position.end) return true\n\tif (isSlotLeadingMark(a) && isSlotLeadingMark(b) && a.descriptor === b.descriptor) return true\n\treturn false\n}\n\nexport function addDragRow(value: string, rows: Token[], afterIndex: number, newRowContent: string): string {\n\tif (rows.length === 0) return value + newRowContent\n\tif (value === '' || (rows.length === 1 && rows[0].type === 'text' && rows[0].content === ''))\n\t\treturn newRowContent + newRowContent\n\tif (afterIndex >= rows.length - 1) return value + newRowContent\n\n\tconst insertPos = rows[afterIndex + 1].position.start\n\treturn value.slice(0, insertPos) + newRowContent + value.slice(insertPos)\n}\n\nexport function deleteDragRow(value: string, rows: Token[], index: number): string {\n\tif (rows.length <= 1) return ''\n\n\tif (index >= rows.length - 1) {\n\t\treturn value.slice(0, rows[index - 1].position.end)\n\t}\n\n\treturn value.slice(0, rows[index].position.start) + value.slice(rows[index + 1].position.start)\n}\n\nexport function duplicateDragRow(value: string, rows: Token[], index: number): string {\n\tconst row = rows[index]\n\tconst rowText = value.substring(row.position.start, row.position.end)\n\n\tif (index >= rows.length - 1) return value + rowText\n\n\tconst next = rows[index + 1]\n\tconst gap = gapText(value, row, next)\n\treturn value.slice(0, next.position.start) + rowText + gap + value.slice(next.position.start)\n}\n\n/**\n * Returns the raw-value position of the join point between row[index-1] and row[index]\n * for use as the caret position after a merge.\n */\nexport function getMergeDragRowJoinPos(rows: Token[], index: number): number {\n\tif (index <= 0 || index >= rows.length) return 0\n\tconst prev = rows[index - 1]\n\tif (isSlotLeadingMark(prev) && prev.slot) return prev.slot.end\n\treturn prev.position.end\n}\n\n/**\n * Merges row[index] into row[index - 1] by removing the boundary between them.\n * For text rows: removes the gap between them.\n * For slot-leading marks: removes the first mark's literal suffix, merging slot content.\n */\nexport function mergeDragRows(value: string, rows: Token[], index: number): string {\n\tif (index <= 0 || index >= rows.length) return value\n\tconst prev = rows[index - 1]\n\tconst curr = rows[index]\n\tif (isSlotLeadingMark(prev) && isSlotLeadingMark(curr)) {\n\t\tconst slotEnd = prev.slot ? prev.slot.end : prev.position.end\n\t\treturn value.slice(0, slotEnd) + value.slice(curr.position.start)\n\t}\n\treturn value.slice(0, prev.position.end) + value.slice(curr.position.start)\n}\n\n/**\n * Reorders rows by moving the row at `sourceIndex` to `targetIndex`.\n * Gaps between adjacent rows are extracted from the original value and preserved.\n */\nexport function reorderDragRows(value: string, rows: Token[], sourceIndex: number, targetIndex: number): string {\n\tif (sourceIndex === targetIndex || sourceIndex === targetIndex - 1) return value\n\tif (rows.length < 2) return value\n\tif (sourceIndex < 0 || sourceIndex >= rows.length) return value\n\tif (targetIndex < 0 || targetIndex > rows.length) return value\n\n\tconst texts = rows.map(row => value.substring(row.position.start, row.position.end))\n\tconst gaps = rows.slice(0, -1).map((row, i) => gapText(value, row, rows[i + 1]))\n\n\tconst [movedText] = texts.splice(sourceIndex, 1)\n\t// Remove the gap associated with the source position\n\tconst gapIndex = sourceIndex < gaps.length ? sourceIndex : sourceIndex - 1\n\tgaps.splice(gapIndex, 1)\n\n\tconst insertAt = targetIndex > sourceIndex ? targetIndex - 1 : targetIndex\n\ttexts.splice(insertAt, 0, movedText)\n\t// Insert a gap for the new position (use '' — marks are self-delimiting)\n\tif (insertAt < texts.length - 1) {\n\t\tgaps.splice(insertAt, 0, '')\n\t}\n\n\tconst parts: string[] = []\n\tfor (let i = 0; i < texts.length; i++) {\n\t\tparts.push(texts[i])\n\t\tif (i < gaps.length) {\n\t\t\tparts.push(gaps[i])\n\t\t}\n\t}\n\n\treturn parts.join('')\n}","import type {Token} from '../parsing'\n\nexport const EMPTY_TEXT_TOKEN: Token = {type: 'text', content: '', position: {start: 0, end: 0}}","import type {Range} from '../../shared/editorContracts'\nimport {computed, event, watch} from '../../shared/signals'\nimport type {DragAction} from '../../shared/types'\nimport type {CaretModel} from '../caret/CaretModel'\nimport {createRowContent} from '../editing'\nimport type {Token} from '../parsing'\nimport type {ParseController} from '../parsing/ParseController'\nimport type {PropsModel} from '../props/PropsModel'\nimport type {ValueModel} from '../value/ValueModel'\nimport {addDragRow, deleteDragRow, duplicateDragRow, reorderDragRows} from './operations'\nimport {EMPTY_TEXT_TOKEN} from './tokens'\n\nexport class DragController {\n\treadonly action = event<DragAction>()\n\n\t#unsub?: () => void\n\n\tconstructor(\n\t\tprivate readonly props: PropsModel,\n\t\tprivate readonly value: ValueModel,\n\t\tprivate readonly parsing: ParseController,\n\t\tprivate readonly caret: CaretModel\n\t) {\n\t\tconst isDragEnabled = computed(() => this.props.layout() === 'block' && !!this.props.draggable())\n\n\t\tconst toggle = (enabled: boolean) => {\n\t\t\tif (enabled && !this.#unsub) {\n\t\t\t\tthis.#unsub = watch(this.action, action => {\n\t\t\t\t\tswitch (action.type) {\n\t\t\t\t\t\tcase 'reorder':\n\t\t\t\t\t\t\tthis.#reorder(action)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'add':\n\t\t\t\t\t\t\tthis.#add(action)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tthis.#delete(action)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'duplicate':\n\t\t\t\t\t\t\tthis.#duplicate(action)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (!enabled && this.#unsub) {\n\t\t\t\tthis.#unsub()\n\t\t\t\tthis.#unsub = undefined\n\t\t\t}\n\t\t}\n\n\t\twatch(isDragEnabled, toggle)\n\t\ttoggle(isDragEnabled())\n\t}\n\n\t#reorder(action: Extract<DragAction, {type: 'reorder'}>) {\n\t\tconst value = this.value.current()\n\t\tconst rows = this.parsing.tokens()\n\t\tconst newValue = reorderDragRows(value, rows, action.source, action.target)\n\t\tif (newValue !== value) {\n\t\t\tconst range = this.#rangeAfterDrag(action, rows, newValue)\n\t\t\tif (range) this.caret.selection(range)\n\t\t\tthis.value.current(newValue)\n\t\t}\n\t}\n\n\t#add(action: Extract<DragAction, {type: 'add'}>) {\n\t\tconst value = this.value.current()\n\t\tconst rawRows = this.parsing.tokens()\n\t\tconst rows = rawRows.length > 0 ? rawRows : [EMPTY_TEXT_TOKEN]\n\t\tconst newRowContent = createRowContent(this.props.options())\n\t\tconst newValue = addDragRow(value, rows, action.afterIndex, newRowContent)\n\t\tconst range = this.#rangeAfterDrag(action, rows, newValue)\n\t\tif (range) this.caret.selection(range)\n\t\tthis.value.current(newValue)\n\t}\n\n\t#delete(action: Extract<DragAction, {type: 'delete'}>) {\n\t\tconst value = this.value.current()\n\t\tconst rows = this.parsing.tokens()\n\t\tconst newValue = deleteDragRow(value, rows, action.index)\n\t\tconst range = this.#rangeAfterDrag(action, rows, newValue)\n\t\tif (range) this.caret.selection(range)\n\t\tthis.value.current(newValue)\n\t}\n\n\t#duplicate(action: Extract<DragAction, {type: 'duplicate'}>) {\n\t\tconst value = this.value.current()\n\t\tconst rows = this.parsing.tokens()\n\t\tconst newValue = duplicateDragRow(value, rows, action.index)\n\t\tconst range = this.#rangeAfterDrag(action, rows, newValue)\n\t\tif (range) this.caret.selection(range)\n\t\tthis.value.current(newValue)\n\t}\n\n\t#rangeAfterDrag(action: DragAction, previousRows: readonly Token[], nextValue: string): Range | undefined {\n\t\tlet rawPosition: number | undefined\n\t\tif (action.type === 'add') {\n\t\t\tconst after = previousRows.at(action.afterIndex)\n\t\t\trawPosition = after ? after.position.end : nextValue.length\n\t\t} else if (action.type === 'duplicate') {\n\t\t\tconst row = previousRows.at(action.index)\n\t\t\trawPosition = row ? row.position.end : undefined\n\t\t} else if (action.type === 'delete') {\n\t\t\tconst next =\n\t\t\t\tpreviousRows.at(action.index + 1) ?? (action.index > 0 ? previousRows.at(action.index - 1) : undefined)\n\t\t\trawPosition = next ? Math.min(next.position.start, nextValue.length) : 0\n\t\t} else {\n\t\t\tconst moved = previousRows.at(action.source)\n\t\t\trawPosition = moved ? Math.min(moved.position.start, nextValue.length) : undefined\n\t\t}\n\t\treturn rawPosition !== undefined ? {start: rawPosition, end: rawPosition} : undefined\n\t}\n}","export function getDragDropPosition(clientY: number, rect: DOMRect): 'before' | 'after' {\n\treturn clientY < rect.top + rect.height / 2 ? 'before' : 'after'\n}\n\nexport function parseDragSourceIndex(dataTransfer: DataTransfer): number | null {\n\tconst index = parseInt(dataTransfer.getData('text/plain'), 10)\n\treturn isNaN(index) ? null : index\n}\n\nexport function getDragTargetIndex(blockIndex: number, position: 'before' | 'after'): number {\n\treturn position === 'before' ? blockIndex : blockIndex + 1\n}","import type {DraggableConfig} from '../../shared/types'\n\nexport function getAlwaysShowHandle(draggable: boolean | DraggableConfig): boolean {\n\treturn typeof draggable === 'object' && !!draggable.alwaysShowHandle\n}","import type {Range} from '../../shared/editorContracts'\nimport {batch} from '../../shared/signals'\nimport type {CaretModel} from '../caret/CaretModel'\nimport type {ValueModel} from '../value'\n\n/**\n * Single write path for text edits — delegates gating to {@link ValueModel.replace}\n * and only moves the caret when the edit is accepted. Wrapped in {@link batch}\n * so subscribers observe a consistent value/selection pair on one tick.\n */\nexport class EditController {\n\tconstructor(\n\t\tprivate readonly value: ValueModel,\n\t\tprivate readonly caret: CaretModel\n\t) {}\n\n\treplace(range: Range, replacement: string): void {\n\t\tbatch(() => {\n\t\t\tif (!this.value.replace(range, replacement)) return\n\t\t\tthis.caret.position(range.start + replacement.length)\n\t\t})\n\t}\n}","import {KEYBOARD} from '../../shared/constants'\nimport {listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\n\ntype KbCtx = Pick<Store, 'dom' | 'caret' | 'slots' | 'parsing'>\n\nexport function enableArrowNav(store: KbCtx): void {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tlisten(container, 'keydown', e => {\n\t\tif (store.slots.isBlock()) return\n\n\t\tif (e.key === KEYBOARD.LEFT) {\n\t\t\tshiftFocus(store, e, 'prev')\n\t\t} else if (e.key === KEYBOARD.RIGHT) {\n\t\t\tshiftFocus(store, e, 'next')\n\t\t}\n\n\t\tif ((e.ctrlKey || e.metaKey) && e.code === 'KeyA') {\n\t\t\tif (store.slots.isBlock()) return\n\t\t\te.preventDefault()\n\t\t\tstore.caret.selectAll()\n\t\t}\n\t})\n}\n\nfunction shiftFocus(store: KbCtx, event: KeyboardEvent, direction: 'prev' | 'next'): boolean {\n\t// Resolve the \"current\" token from the focused DOM element, not from\n\t// caret.selection. At a position exactly between two tokens the position alone\n\t// is ambiguous; the active element tells us which token the user is\n\t// actually standing on.\n\tconst active = document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n\tconst located = active ? store.dom.locateNode(active) : undefined\n\tif (!located?.ok) return false\n\n\tconst isFocusedOnMarkElement = active === located.value.tokenElement && !located.value.textElement\n\tconst address = located.value.address\n\n\tconst token = store.parsing.index().resolveAddress(address)\n\tif (!token.ok) return false\n\n\tif (!isFocusedOnMarkElement) {\n\t\tconst selection = store.dom.readRawSelection()\n\t\tif (!selection.ok || selection.value.range.start !== selection.value.range.end) return false\n\n\t\tconst atStart = selection.value.range.start <= token.value.position.start\n\t\tconst atEnd = selection.value.range.end >= token.value.position.end\n\t\tif (direction === 'prev' && !atStart) return false\n\t\tif (direction === 'next' && !atEnd) return false\n\t}\n\n\tconst path = address.path\n\tconst siblingIndex = direction === 'prev' ? path[path.length - 1] - 1 : path[path.length - 1] + 1\n\tconst siblingPath = [...path.slice(0, -1), siblingIndex]\n\tconst siblingAddress = store.parsing.index().addressFor(siblingPath)\n\tif (!siblingAddress) return false\n\n\tevent.preventDefault()\n\tconst result = store.dom.focusAddress(siblingAddress, direction === 'prev' ? 'end' : 'start')\n\tif (!result.ok) return false\n\tconst sibling = store.parsing.index().resolve(siblingPath)\n\tif (sibling?.type === 'mark') return true\n\n\tif (direction === 'prev') {\n\t\tstore.dom.placeAt(sibling?.position.end ?? 0, 'before')\n\t\treturn true\n\t}\n\tstore.dom.placeAt(sibling?.position.start ?? 0, 'after')\n\treturn true\n}","import {htmlChildren, isHtmlElement} from '../../shared/checkers'\nimport {KEYBOARD} from '../../shared/constants'\nimport type {BoundaryPositionResult, Range, RawSelectionResult} from '../../shared/editorContracts'\nimport {listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\n\ntype KbCtx = Pick<Store, 'dom' | 'value' | 'caret' | 'edit' | 'slots' | 'parsing' | 'props'>\nimport * as caretDom from '../caret/caretDom'\nimport {consumeMarkupPaste} from '../clipboard'\nimport {addDragRow, getMergeDragRowJoinPos, mergeDragRows, canMergeRows} from '../drag/operations'\nimport {createRowContent} from '../editing'\nimport type {Token} from '../parsing'\n\ntype InputTargetRange = {\n\treadonly startContainer: Node\n\treadonly startOffset: number\n\treadonly endContainer: Node\n\treadonly endOffset: number\n}\n\ntype RawSelectionFailureReason = Extract<RawSelectionResult, {ok: false}>['reason']\n\nfunction isTextLikeRow(token: Token): boolean {\n\tif (token.type === 'text') return true\n\treturn token.descriptor.hasSlot && token.descriptor.segments.length === 1\n}\n\nexport function enableBlockEdit(store: KbCtx): void {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tlisten(container, 'keydown', e => {\n\t\tif (!store.slots.isBlock()) return\n\n\t\tif (e.key === KEYBOARD.LEFT || e.key === KEYBOARD.RIGHT) {\n\t\t\thandleBlockArrowLeftRight(store, e, e.key === KEYBOARD.LEFT ? 'left' : 'right')\n\t\t} else if (e.key === KEYBOARD.UP || e.key === KEYBOARD.DOWN) {\n\t\t\thandleArrowUpDown(store, e)\n\t\t}\n\n\t\thandleDelete(store, e)\n\t\thandleEnter(store, e)\n\t})\n\n\tlisten(\n\t\tcontainer,\n\t\t'beforeinput',\n\t\te => {\n\t\t\tif (!store.slots.isBlock()) return\n\t\t\tif (e.defaultPrevented) return\n\t\t\thandleBlockBeforeInput(store, e)\n\t\t},\n\t\ttrue\n\t)\n}\n\nfunction handleDelete(store: KbCtx, event: KeyboardEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(\n\t\tdiv => div === document.activeElement || div.contains(document.activeElement)\n\t)\n\tif (blockIndex === -1) return\n\n\tconst rows = store.parsing.tokens()\n\tif (blockIndex >= rows.length) return\n\n\tconst token = rows[blockIndex]\n\tconst value = store.value.current()\n\n\tif (event.key === KEYBOARD.BACKSPACE) {\n\t\tconst blockDiv = blockDivs[blockIndex]\n\t\tconst caretAtStart = caretDom.getCaretIndex(blockDiv) === 0\n\n\t\tconst blockText = 'content' in token ? token.content : ''\n\t\tif (blockText === '') {\n\t\t\tevent.preventDefault()\n\t\t\tconst newValue =\n\t\t\t\trows.length <= 1\n\t\t\t\t\t? ''\n\t\t\t\t\t: (() => {\n\t\t\t\t\t\t\tif (blockIndex >= rows.length - 1) return value.slice(0, rows[blockIndex - 1].position.end)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tvalue.slice(0, rows[blockIndex].position.start) +\n\t\t\t\t\t\t\t\tvalue.slice(rows[blockIndex + 1].position.start)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})()\n\t\t\tconst previous = rows.at(Math.max(0, blockIndex - 1))\n\t\t\tconst pos = previous ? previous.position.end : 0\n\t\t\tstore.caret.position(pos)\n\t\t\tstore.value.current(newValue)\n\t\t\treturn\n\t\t}\n\n\t\tif (caretAtStart && blockIndex > 0) {\n\t\t\tconst prevToken = rows[blockIndex - 1]\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tif (canMergeRows(prevToken, currToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex)\n\t\t\t\tstore.caret.position(joinPos)\n\t\t\t\tstore.value.current(newValue)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tfocusRow(store, prevToken, blockDivs[blockIndex - 1], 'end')\n\t\t\treturn\n\t\t}\n\t}\n\n\tif (event.key === KEYBOARD.DELETE) {\n\t\tconst blockDiv = blockDivs[blockIndex]\n\t\tconst caretIndex = caretDom.getCaretIndex(blockDiv)\n\t\tconst caretAtEnd = caretIndex === blockDiv.textContent.length\n\t\tconst caretAtStart = caretIndex === 0\n\n\t\tif (caretAtStart && blockIndex > 0) {\n\t\t\tconst prevToken = rows[blockIndex - 1]\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tif (canMergeRows(prevToken, currToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex)\n\t\t\t\tstore.caret.position(joinPos)\n\t\t\t\tstore.value.current(newValue)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tfocusRow(store, prevToken, blockDivs[blockIndex - 1], 'end')\n\t\t\treturn\n\t\t}\n\n\t\tif (caretAtEnd && blockIndex < rows.length - 1) {\n\t\t\tconst currToken = rows[blockIndex]\n\t\t\tconst nextToken = rows[blockIndex + 1]\n\t\t\tif (canMergeRows(currToken, nextToken)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst joinPos = getMergeDragRowJoinPos(rows, blockIndex + 1)\n\t\t\t\tconst newValue = mergeDragRows(value, rows, blockIndex + 1)\n\t\t\t\tstore.caret.position(joinPos)\n\t\t\t\tstore.value.current(newValue)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tfocusRow(store, nextToken, blockDivs[blockIndex + 1], 'start')\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction handleEnter(store: KbCtx, event: KeyboardEvent) {\n\tif (event.key !== KEYBOARD.ENTER) return\n\tif (event.shiftKey) return\n\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tevent.preventDefault()\n\n\tconst blockDivs = htmlChildren(container)\n\tlet blockIndex = -1\n\tfor (let i = 0; i < blockDivs.length; i++) {\n\t\tif (blockDivs[i] === activeElement || blockDivs[i].contains(activeElement)) {\n\t\t\tblockIndex = i\n\t\t\tbreak\n\t\t}\n\t}\n\tif (blockIndex === -1) return\n\n\tconst rows = store.parsing.tokens()\n\tconst token = rows[blockIndex]\n\tconst value = store.value.current()\n\n\tconst newRowContent = createRowContent(store.props.options())\n\n\tif (!isTextLikeRow(token)) {\n\t\tconst newValue = addDragRow(value, rows, blockIndex, newRowContent)\n\t\tconst pos = token.position.end + newRowContent.length\n\t\tstore.caret.position(pos)\n\t\tstore.value.current(newValue)\n\t\treturn\n\t}\n\n\tconst raw = store.dom.readRawSelection()\n\tconst absolutePos = raw.ok ? raw.value.range.start : token.position.end\n\tstore.edit.replace({start: absolutePos, end: absolutePos}, newRowContent)\n}\n\nfunction focusRow(store: KbCtx, token: Token, row: HTMLElement, caret: 'start' | 'end'): void {\n\tif (token.type === 'mark') {\n\t\tconst path = store.parsing.index().pathFor(token)\n\t\tconst address = path ? store.parsing.index().addressFor(path) : undefined\n\t\tif (address && store.dom.focusAddress(address).ok) return\n\t}\n\n\trow.focus()\n\tif (caret === 'start') {\n\t\tcaretDom.setAtElement(row, 0)\n\t\treturn\n\t}\n\tcaretDom.setAtElement(row, Infinity)\n}\n\nfunction handleBlockArrowLeftRight(store: KbCtx, event: KeyboardEvent, direction: 'left' | 'right'): boolean {\n\tconst container = store.dom.container()\n\tif (!container) return false\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return false\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return false\n\n\tconst blockDiv = blockDivs[blockIndex]\n\n\tif (direction === 'left') {\n\t\tif (caretDom.getCaretIndex(blockDiv) !== 0) return false\n\t\tif (blockIndex === 0) return true\n\t\tevent.preventDefault()\n\t\tconst prevBlock = blockDivs[blockIndex - 1]\n\t\tprevBlock.focus()\n\t\tcaretDom.setAtElement(prevBlock, Infinity)\n\t\treturn true\n\t}\n\n\tconst caretIndex = caretDom.getCaretIndex(blockDiv)\n\tconst textLen = blockDiv.textContent.length\n\tif (caretIndex !== textLen) return false\n\tif (blockIndex >= blockDivs.length - 1) return true\n\tevent.preventDefault()\n\tconst nextBlock = blockDivs[blockIndex + 1]\n\tnextBlock.focus()\n\tcaretDom.setAtElement(nextBlock, 0)\n\treturn true\n}\n\nfunction handleArrowUpDown(store: KbCtx, event: KeyboardEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return\n\n\tconst blockDiv = blockDivs[blockIndex]\n\n\tif (event.key === KEYBOARD.UP) {\n\t\tif (!caretDom.isOnFirstLine(blockDiv)) return\n\t\tif (blockIndex === 0) return\n\n\t\tevent.preventDefault()\n\t\tconst caretRect = caretDom.getRect()\n\t\tconst caretX = caretRect?.left ?? blockDiv.getBoundingClientRect().left\n\t\tconst prevBlockDiv = blockDivs[blockIndex - 1]\n\t\tprevBlockDiv.focus()\n\t\tconst prevRect = prevBlockDiv.getBoundingClientRect()\n\t\tcaretDom.setAtX(prevBlockDiv, caretX, prevRect.bottom - 4)\n\t} else if (event.key === KEYBOARD.DOWN) {\n\t\tif (!caretDom.isOnLastLine(blockDiv)) return\n\t\tif (blockIndex >= blockDivs.length - 1) return\n\n\t\tevent.preventDefault()\n\t\tconst caretRect = caretDom.getRect()\n\t\tconst caretX = caretRect?.left ?? blockDiv.getBoundingClientRect().left\n\t\tconst nextBlockDiv = blockDivs[blockIndex + 1]\n\t\tnextBlockDiv.focus()\n\t\tconst nextRect = nextBlockDiv.getBoundingClientRect()\n\t\tcaretDom.setAtX(nextBlockDiv, caretX, nextRect.top + 4)\n\t}\n}\n\nfunction handleBlockBeforeInput(store: KbCtx, event: InputEvent) {\n\tconst container = store.dom.container()\n\tif (!container) return\n\n\tconst activeElement = document.activeElement\n\tif (!isHtmlElement(activeElement) || !container.contains(activeElement)) return\n\n\tconst blockDivs = htmlChildren(container)\n\tconst blockIndex = blockDivs.findIndex(div => div === activeElement || div.contains(activeElement))\n\tif (blockIndex === -1) return\n\n\tswitch (event.inputType) {\n\t\tcase 'insertText': {\n\t\t\tconst data = event.data ?? ''\n\t\t\treplaceBlockRange(store, event, data)\n\t\t\tbreak\n\t\t}\n\t\tcase 'insertFromPaste':\n\t\tcase 'insertReplacementText': {\n\t\t\tconst c = store.dom.container()\n\t\t\tconst markup = c ? consumeMarkupPaste(c) : undefined\n\t\t\tconst pasteData = markup ?? event.dataTransfer?.getData('text/plain') ?? ''\n\t\t\treplaceBlockRange(store, event, pasteData)\n\t\t\tbreak\n\t\t}\n\t\tcase 'deleteContentBackward':\n\t\tcase 'deleteContentForward':\n\t\tcase 'deleteWordBackward':\n\t\tcase 'deleteWordForward':\n\t\tcase 'deleteSoftLineBackward':\n\t\tcase 'deleteSoftLineForward': {\n\t\t\treplaceBlockRange(store, event, '')\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction replaceBlockRange(store: KbCtx, event: InputEvent, replacement: string): void {\n\tconst raw = rawRangeFromInputEvent(store, event)\n\tif (!raw.ok) return\n\tconst range = rangeForBlockInput(store, event, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.edit.replace(range, replacement)\n}\n\nfunction rawRangeFromInputEvent(store: KbCtx, event: InputEvent): RawSelectionResult {\n\tconst ranges = event.getTargetRanges()\n\tif (ranges.length === 0) return store.dom.readRawSelection()\n\treturn rawRangeFromTargetRange(store, ranges[0])\n}\n\nfunction rawRangeFromTargetRange(store: KbCtx, range: InputTargetRange): RawSelectionResult {\n\tconst start = store.dom.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\tconst end = store.dom.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\tif (!start.ok) return {ok: false, reason: rawSelectionReason(start)}\n\tif (!end.ok) return {ok: false, reason: rawSelectionReason(end)}\n\treturn {\n\t\tok: true,\n\t\tvalue: {\n\t\t\trange:\n\t\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value},\n\t\t},\n\t}\n}\n\nfunction rawSelectionReason(result: BoundaryPositionResult): RawSelectionFailureReason {\n\tif (result.ok) return 'invalidBoundary'\n\tif (result.reason === 'composing') return 'invalidBoundary'\n\treturn result.reason\n}\n\nfunction rangeForBlockInput(store: KbCtx, event: InputEvent, range: Range): Range | undefined {\n\tif (!event.inputType.startsWith('delete')) return range\n\tif (range.start !== range.end) return range\n\n\tif (event.inputType.endsWith('Backward') && range.start > 0) {\n\t\treturn {start: range.start - 1, end: range.start}\n\t}\n\tif (event.inputType.endsWith('Forward') && range.end < store.value.current().length) {\n\t\treturn {start: range.start, end: range.end + 1}\n\t}\n\treturn undefined\n}","import {KEYBOARD} from '../../shared/constants'\nimport type {BoundaryPositionResult, Range, RawSelectionResult} from '../../shared/editorContracts'\nimport {listen} from '../../shared/signals/index.js'\nimport type {Store} from '../../store/Store'\n\ntype KbCtx = Pick<Store, 'dom' | 'value' | 'caret' | 'edit' | 'slots' | 'parsing'>\nimport {captureMarkupPaste, consumeMarkupPaste} from '../clipboard'\nimport type {Token} from '../parsing'\n\ntype InputTargetRange = {\n\treadonly startContainer: Node\n\treadonly startOffset: number\n\treadonly endContainer: Node\n\treadonly endOffset: number\n}\n\ntype SpanInputTarget = {\n\tcontent: string\n\tcaret: number\n}\n\ntype RawSelectionFailureReason = Extract<RawSelectionResult, {ok: false}>['reason']\n\nexport function enableInput(store: KbCtx): void {\n\tconst container = store.dom.container()\n\tif (!container) return\n\tlet compositionRange: Range | undefined\n\n\tlisten(container, 'paste', e => {\n\t\tconst c = store.dom.container()\n\t\tif (c) captureMarkupPaste(e, c)\n\t\thandlePaste(store, e)\n\t})\n\n\tlisten(container, 'compositionstart', () => {\n\t\tconst selection = store.dom.readRawSelection()\n\t\tcompositionRange = selection.ok ? selection.value.range : undefined\n\t\tstore.dom.compositionStarted()\n\t})\n\n\tlisten(container, 'compositionend', e => {\n\t\tconst range = compositionRange\n\t\tcompositionRange = undefined\n\t\tstore.dom.compositionEnded()\n\t\tif (store.slots.isBlock()) return\n\t\tif (!range) return\n\t\tconst data = e.data\n\t\tstore.edit.replace(range, data)\n\t})\n\n\tlisten(\n\t\tcontainer,\n\t\t'beforeinput',\n\t\te => {\n\t\t\thandleBeforeInput(store, e)\n\t\t},\n\t\ttrue\n\t)\n\n\tlisten(container, 'keydown', e => {\n\t\thandleDeleteKey(store, e)\n\t})\n}\n\nfunction handleDeleteKey(store: KbCtx, event: KeyboardEvent): void {\n\tif (store.slots.isBlock()) return\n\tif (event.key !== KEYBOARD.BACKSPACE && event.key !== KEYBOARD.DELETE) return\n\n\tif (store.caret.isAllSelected()) {\n\t\tevent.preventDefault()\n\t\treplaceAllContentWith(store, '')\n\t\treturn\n\t}\n\n\tconst raw = store.dom.readRawSelection()\n\tif (!raw.ok) return\n\n\tconst inputType = event.key === KEYBOARD.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward'\n\tconst range = rangeForDelete(store, inputType, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.edit.replace(range, '')\n}\n\nexport function handleBeforeInput(store: KbCtx, event: InputEvent): void {\n\tif (store.caret.isAllSelected()) {\n\t\tif (event.inputType === 'insertFromPaste') {\n\t\t\tevent.preventDefault()\n\t\t\treturn\n\t\t}\n\t\tevent.preventDefault()\n\t\tconst newContent = event.inputType.startsWith('delete') ? '' : (event.data ?? '')\n\t\treplaceAllContentWith(store, newContent)\n\t\treturn\n\t}\n\n\tif (store.slots.isBlock()) return\n\n\tconst raw = rawRangeFromInputEvent(store, event)\n\tif (!raw.ok) return\n\n\tconst replacement = replacementForInput(store, event)\n\tif (replacement === undefined) return\n\n\tconst range = rangeForInput(store, event, raw.value.range)\n\tif (!range) return\n\n\tevent.preventDefault()\n\tstore.edit.replace(range, replacement)\n}\n\nexport function applySpanInput(focus: SpanInputTarget, event: InputEvent): boolean {\n\tconst offset = focus.caret\n\tconst content = focus.content\n\tlet newContent: string\n\tlet newCaret: number\n\n\tswitch (event.inputType) {\n\t\tcase 'insertText': {\n\t\t\tevent.preventDefault()\n\t\t\tconst data = event.data ?? ''\n\t\t\tnewContent = content.slice(0, offset) + data + content.slice(offset)\n\t\t\tnewCaret = offset + data.length\n\t\t\tbreak\n\t\t}\n\t\tcase 'deleteContentBackward':\n\t\tcase 'deleteContentForward':\n\t\tcase 'deleteWordBackward':\n\t\tcase 'deleteWordForward':\n\t\tcase 'deleteSoftLineBackward':\n\t\tcase 'deleteSoftLineForward': {\n\t\t\tconst ranges = event.getTargetRanges()\n\t\t\tlet startOffset: number\n\t\t\tlet endOffset: number\n\t\t\tif (ranges.length > 0 && ranges[0].startOffset !== ranges[0].endOffset) {\n\t\t\t\tstartOffset = ranges[0].startOffset\n\t\t\t\tendOffset = ranges[0].endOffset\n\t\t\t} else {\n\t\t\t\tif (event.inputType === 'deleteContentBackward' && offset > 0) {\n\t\t\t\t\tstartOffset = offset - 1\n\t\t\t\t\tendOffset = offset\n\t\t\t\t} else if (event.inputType === 'deleteContentForward' && offset < content.length) {\n\t\t\t\t\tstartOffset = offset\n\t\t\t\t\tendOffset = offset + 1\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tnewContent = content.slice(0, startOffset) + content.slice(endOffset)\n\t\t\tnewCaret = startOffset\n\t\t\tbreak\n\t\t}\n\t\tcase 'insertFromPaste':\n\t\tcase 'insertReplacementText': {\n\t\t\tconst text = event.dataTransfer?.getData('text/plain') ?? ''\n\t\t\tconst ranges = event.getTargetRanges()\n\t\t\tconst start = ranges[0]?.startOffset ?? offset\n\t\t\tconst end = ranges[0]?.endOffset ?? offset\n\t\t\tevent.preventDefault()\n\t\t\tnewContent = content.slice(0, start) + text + content.slice(end)\n\t\t\tnewCaret = start + text.length\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\treturn false\n\t}\n\n\tfocus.content = newContent\n\tfocus.caret = newCaret\n\treturn true\n}\n\nfunction rawRangeFromInputEvent(store: KbCtx, event: InputEvent): RawSelectionResult {\n\tconst ranges = getTargetRanges(event)\n\tif (ranges.length === 0) return store.dom.readRawSelection()\n\treturn rawRangeFromTargetRange(store, ranges[0])\n}\n\nfunction rawRangeFromTargetRange(store: KbCtx, range: InputTargetRange): RawSelectionResult {\n\tconst start = store.dom.rawPositionFromBoundary(range.startContainer, range.startOffset, 'after')\n\tconst end = store.dom.rawPositionFromBoundary(range.endContainer, range.endOffset, 'before')\n\tif (!start.ok) return {ok: false, reason: rawSelectionReason(start)}\n\tif (!end.ok) return {ok: false, reason: rawSelectionReason(end)}\n\treturn {\n\t\tok: true,\n\t\tvalue: {\n\t\t\trange:\n\t\t\t\tstart.value <= end.value ? {start: start.value, end: end.value} : {start: end.value, end: start.value},\n\t\t},\n\t}\n}\n\nfunction rawSelectionReason(result: BoundaryPositionResult): RawSelectionFailureReason {\n\tif (result.ok) return 'invalidBoundary'\n\tif (result.reason === 'composing') return 'invalidBoundary'\n\treturn result.reason\n}\n\nfunction getTargetRanges(event: InputEvent): readonly InputTargetRange[] {\n\treturn event.getTargetRanges()\n}\n\nfunction replacementForInput(store: KbCtx, event: InputEvent): string | undefined {\n\tif (event.inputType.startsWith('delete')) return ''\n\tif (event.inputType === 'insertFromPaste' || event.inputType === 'insertReplacementText') {\n\t\tconst container = store.dom.container()\n\t\tconst markup = container ? consumeMarkupPaste(container) : undefined\n\t\treturn markup ?? event.dataTransfer?.getData('text/plain') ?? event.data ?? ''\n\t}\n\tif (event.inputType === 'insertText') return event.data ?? ''\n\treturn undefined\n}\n\nfunction rangeForInput(store: KbCtx, event: InputEvent, range: Range): Range | undefined {\n\tif (!event.inputType.startsWith('delete')) return range\n\treturn rangeForDelete(store, event.inputType, range)\n}\n\nfunction rangeForDelete(store: KbCtx, inputType: string, range: Range): Range | undefined {\n\tif (range.start !== range.end) return range\n\n\tconst adjacentMark = adjacentMarkRange(store.parsing.tokens(), range.start, inputType.endsWith('Backward'))\n\tif (adjacentMark) return adjacentMark\n\n\tif (inputType.endsWith('Backward') && range.start > 0) {\n\t\treturn {start: range.start - 1, end: range.start}\n\t}\n\tif (inputType.endsWith('Forward') && range.end < store.value.current().length) {\n\t\treturn {start: range.start, end: range.end + 1}\n\t}\n\treturn undefined\n}\n\nfunction adjacentMarkRange(tokens: readonly Token[], position: number, backward: boolean): Range | undefined {\n\tfor (const token of tokens) {\n\t\tconst nested = token.type === 'mark' ? adjacentMarkRange(token.children, position, backward) : undefined\n\t\tif (nested) return nested\n\t\tif (token.type === 'mark' && (backward ? token.position.end === position : token.position.start === position)) {\n\t\t\treturn token.position\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function handlePaste(store: KbCtx, event: ClipboardEvent): void {\n\tif (!store.caret.isAllSelected()) return\n\n\tevent.preventDefault()\n\tconst c = store.dom.container()\n\tconst markup = c ? consumeMarkupPaste(c) : undefined\n\tconst newContent = markup ?? event.clipboardData?.getData('text/plain') ?? ''\n\treplaceAllContentWith(store, newContent)\n}\n\nexport function replaceAllContentWith(store: KbCtx, newContent: string): void {\n\tstore.caret.position(newContent.length)\n\tstore.value.current(newContent)\n}","import type {CaretModel} from '../caret/CaretModel'\nimport type {DomController} from '../dom/DomController'\nimport type {EditController} from '../edit'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport type {ParseController} from '../parsing/ParseController'\nimport type {PropsModel} from '../props/PropsModel'\nimport type {SlotsFeature} from '../slots/SlotsFeature'\nimport type {ValueModel} from '../value/ValueModel'\nimport {enableArrowNav} from './arrowNav'\nimport {enableBlockEdit} from './blockEdit'\nimport {enableInput} from './input'\n\nexport class KeyboardController {\n\tconstructor(\n\t\tlifecycle: Lifecycle,\n\t\tdom: DomController,\n\t\tvalue: ValueModel,\n\t\tcaret: CaretModel,\n\t\tedit: EditController,\n\t\tslots: SlotsFeature,\n\t\tparsing: ParseController,\n\t\tprops: PropsModel\n\t) {\n\t\tconst ctx = {dom, value, caret, edit, slots, parsing, props}\n\t\tlifecycle.onMounted(() => {\n\t\t\tenableInput(ctx)\n\t\t\tenableBlockEdit(ctx)\n\t\t\tenableArrowNav(ctx)\n\t\t})\n\t}\n}","import {effectScope, event, watch} from '../../shared/signals'\n\nexport class Lifecycle {\n\treadonly mounted = event()\n\treadonly unmounted = event()\n\treadonly rendered = event()\n\n\t/**\n\t * Run `setup` when the editor is mounted. Any reactive subscription\n\t * created inside `setup` (`watch`, `listen`, `effect`, nested\n\t * `effectScope`) is automatically disposed on `unmounted` and re-created\n\t * on the next `mounted`.\n\t */\n\tonMounted(setup: () => void): void {\n\t\tlet scope: (() => void) | undefined\n\t\twatch(this.mounted, () => {\n\t\t\tif (scope) return\n\t\t\tscope = effectScope(setup)\n\t\t})\n\t\twatch(this.unmounted, () => {\n\t\t\tscope?.()\n\t\t\tscope = undefined\n\t\t})\n\t}\n}","import type {MarkPatch, MarkSnapshot, TokenAddress, TokenShapeSnapshot} from '../../shared/editorContracts'\nimport type {Store} from '../../store'\nimport type {MarkToken} from '../parsing'\nimport {annotate} from '../parsing/parser/utils/annotate'\nimport {snapshotTokenShape} from '../parsing/tokenIndex'\n\nexport class MarkController {\n\treadonly #shape: TokenShapeSnapshot\n\n\tconstructor(\n\t\tprivate readonly store: Store,\n\t\tprivate readonly address: TokenAddress,\n\t\tprivate readonly snapshot: MarkSnapshot,\n\t\tshape: TokenShapeSnapshot\n\t) {\n\t\tthis.#shape = shape\n\t}\n\n\tstatic fromToken(store: Store, token: MarkToken): MarkController {\n\t\tconst index = store.parsing.index()\n\t\tconst path = index.pathFor(token)\n\t\tif (!path) throw new Error('Cannot create MarkController for unindexed token')\n\t\tconst address = index.addressFor(path)\n\t\tif (!address) throw new Error('Cannot create MarkController for unresolved token path')\n\n\t\treturn new MarkController(\n\t\t\tstore,\n\t\t\taddress,\n\t\t\t{\n\t\t\t\tvalue: token.value,\n\t\t\t\tmeta: token.meta,\n\t\t\t\tslot: token.slot?.content,\n\t\t\t\treadOnly: store.props.readOnly(),\n\t\t\t},\n\t\t\tsnapshotTokenShape(token)\n\t\t)\n\t}\n\n\tget value(): string {\n\t\treturn this.snapshot.value\n\t}\n\n\tget meta(): string | undefined {\n\t\treturn this.snapshot.meta\n\t}\n\n\tget slot(): string | undefined {\n\t\treturn this.snapshot.slot\n\t}\n\n\tget readOnly(): boolean {\n\t\treturn this.snapshot.readOnly\n\t}\n\n\tremove() {\n\t\tconst resolved = this.#resolve()\n\t\tif (!resolved) return\n\t\tthis.store.value.replace(resolved.position, '')\n\t}\n\n\tupdate(patch: MarkPatch) {\n\t\tconst resolved = this.#resolve()\n\t\tif (!resolved) return\n\n\t\tconst token = resolved\n\t\tconst value = patch.value ?? token.value\n\t\tconst meta =\n\t\t\tpatch.meta?.kind === 'clear' ? undefined : patch.meta?.kind === 'set' ? patch.meta.value : token.meta\n\t\tconst slot =\n\t\t\tpatch.slot?.kind === 'clear'\n\t\t\t\t? undefined\n\t\t\t\t: patch.slot?.kind === 'set'\n\t\t\t\t\t? patch.slot.value\n\t\t\t\t\t: token.slot?.content\n\t\tconst serialized = this.#serialize(token, {value, meta, slot})\n\n\t\tthis.store.value.replace(token.position, serialized)\n\t}\n\n\t#serialize(token: MarkToken, fields: {value: string; meta?: string; slot?: string}): string {\n\t\treturn annotate(token.descriptor.markup, {\n\t\t\tvalue: fields.value,\n\t\t\tmeta: token.descriptor.gapTypes.includes('meta') ? (fields.meta ?? '') : undefined,\n\t\t\tslot: token.descriptor.hasSlot ? (fields.slot ?? '') : undefined,\n\t\t})\n\t}\n\n\t#resolve(): MarkToken | undefined {\n\t\tif (this.store.props.readOnly()) return undefined\n\t\tconst resolved = this.store.parsing.index().resolveAddress(this.address, this.#shape)\n\t\tif (!resolved.ok || resolved.value.type !== 'mark') return undefined\n\t\treturn resolved.value\n\t}\n}","/**\n * Converts object with camelCase data attribute keys to kebab-case data-* attributes\n *\n * Takes keys like 'dataUserId' and converts to 'data-user-id'\n *\n * @param obj - Object potentially containing camelCase data attribute keys\n * @returns New object with converted data attributes\n *\n * @example\n * convertDataAttrs({ dataUserId: '123', dataUserName: 'John', className: 'test' })\n * // Returns: { 'data-user-id': '123', 'data-user-name': 'John', className: 'test' }\n *\n * convertDataAttrs({ dataTestId * @example\n: 'test', dataFoo: 'bar' })\n * // Returns: { 'data-test-id': 'test', 'data-foo': 'bar' }\n */\nexport function convertDataAttrs(obj: Record<string, unknown> | undefined): Record<string, unknown> {\n\tif (!obj) return {}\n\n\treturn Object.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => {\n\t\t\tif (key.startsWith('data') && key.length > 4 && key[4] === key[4].toUpperCase()) {\n\t\t\t\tconst kebab = key\n\t\t\t\t\t.slice(4)\n\t\t\t\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t\t\t\t.toLowerCase()\n\t\t\t\treturn [`data-${kebab}`, value]\n\t\t\t}\n\t\t\treturn [key, value]\n\t\t})\n\t)\n}","export function resolveOptionSlot<T extends object>(optionConfig: T | ((base: T) => T) | undefined, baseProps: T): T {\n\tif (optionConfig !== undefined) {\n\t\treturn typeof optionConfig === 'function' ? optionConfig(baseProps) : optionConfig\n\t}\n\treturn baseProps\n}","import type {CoreOption, CoreSlotProps, CoreSlots, Slot} from '../../shared/types'\nimport {convertDataAttrs} from '../../shared/utils/dataAttributes'\nimport type {Token} from '../parsing'\nimport {resolveOptionSlot} from './resolveOptionSlot'\n\nexport type SlotName = 'container' | 'block' | 'span'\n\nconst defaultSlots: Record<SlotName, string> = {\n\tcontainer: 'div',\n\tblock: 'div',\n\tspan: 'span',\n}\n\nexport function resolveSlot(slotName: SlotName, slots: unknown): Slot {\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- `slots` is `CoreSlots | undefined` at runtime; typed as unknown for Vue Ref<T> cross-framework compat\n\treturn ((slots as CoreSlots | undefined)?.[slotName] ?? defaultSlots[slotName]) as Slot\n}\n\nexport function resolveSlotProps(slotName: SlotName, slotProps: unknown): Record<string, unknown> | undefined {\n\t// oxlint-disable-next-line no-unsafe-type-assertion -- `slotProps` is `CoreSlotProps | undefined` at runtime; typed as unknown for Vue Ref<T> cross-framework compat\n\tconst props = (slotProps as CoreSlotProps | undefined)?.[slotName]\n\treturn props ? convertDataAttrs(props) : undefined\n}\n\ntype SlotProp = Record<string, unknown> | ((base: Record<string, unknown>) => Record<string, unknown>)\n\n/**\n * Internal view of a framework-specific Option for slot resolution.\n * Framework Option types (React, Vue) extend CoreOption with these properties.\n */\nexport interface SlotOption extends Omit<CoreOption, 'overlay'> {\n\tMark?: Slot\n\tmark?: SlotProp\n\tOverlay?: Slot\n\toverlay?: SlotProp\n}\n\nexport function resolveOverlaySlot(\n\tglobalComponent: Slot | undefined,\n\toption?: SlotOption,\n\tdefaultComponent?: Slot\n): readonly [Slot, Record<string, unknown>] {\n\tconst Component = option?.Overlay ?? globalComponent ?? defaultComponent\n\tif (!Component)\n\t\tthrow new Error(\n\t\t\t'No overlay component found. Provide either option.Overlay, global Overlay, or a defaultComponent.'\n\t\t)\n\tconst props = resolveOptionSlot<Record<string, unknown>>(option?.overlay, {})\n\treturn [Component, props]\n}\n\nexport function resolveMarkSlot(\n\ttoken: Token,\n\ttokenOptions: SlotOption[] | undefined,\n\tGlobalMark: Slot | undefined,\n\tGlobalSpan: Slot | undefined\n): readonly [Slot, Record<string, unknown>] {\n\tif (token.type === 'text') {\n\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- `'span'` literal is widened to Slot which (unaugmented) is `unknown`\n\t\tconst fallback = (GlobalSpan ?? 'span') as Slot\n\t\treturn [fallback, GlobalSpan ? {value: token.content} : {}]\n\t}\n\tconst option = tokenOptions?.[token.descriptor.index]\n\tconst baseProps = {value: token.value, meta: token.meta}\n\tconst props = resolveOptionSlot(option?.mark, baseProps)\n\tconst Component = option?.Mark ?? GlobalMark\n\tif (!Component) throw new Error('No mark component found. Provide either option.Mark or global Mark.')\n\treturn [Component, props]\n}","import {computed} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {CSSProperties, CoreSlotProps, Slot} from '../../shared/types'\nimport {cx} from '../../shared/utils/cx'\nimport {merge} from '../../shared/utils/merge'\nimport {shallow} from '../../shared/utils/shallow'\nimport type {PropsModel} from '../props/PropsModel'\nimport {resolveSlot, resolveSlotProps} from './resolveSlot'\n\nimport styles from '../../../styles.module.css'\n\nconst DRAG_HANDLE_WIDTH = 24\n\nfunction buildContainerProps(\n\tisDraggableBlock: boolean,\n\treadOnly: boolean,\n\tclassName: string | undefined,\n\tstyle: CSSProperties | undefined,\n\tslotProps: CoreSlotProps | undefined\n): {className: string | undefined; style?: CSSProperties; [key: string]: unknown} {\n\tconst containerSlotProps = slotProps?.container\n\tconst baseStyle = merge(style, containerSlotProps?.style)\n\tconst mergedStyle = isDraggableBlock && !readOnly ? {paddingLeft: DRAG_HANDLE_WIDTH, ...baseStyle} : baseStyle\n\n\tconst {className: _, style: __, ...otherSlotProps} = resolveSlotProps('container', slotProps) ?? {}\n\n\treturn {\n\t\tclassName: cx(styles.Container, className, containerSlotProps?.className),\n\t\tstyle: mergedStyle,\n\t\t...otherSlotProps,\n\t}\n}\n\nexport class SlotsFeature {\n\treadonly isBlock: Computed<boolean> = computed(() => this.props.layout() === 'block')\n\treadonly isDraggable: Computed<boolean> = computed(() => !!this.props.draggable())\n\treadonly containerComponent: Computed<Slot> = computed(() => resolveSlot('container', this.props.slots()))\n\treadonly containerProps: Computed<{className: string | undefined; style?: CSSProperties; [key: string]: unknown}> =\n\t\tcomputed(\n\t\t\t() =>\n\t\t\t\tbuildContainerProps(\n\t\t\t\t\tthis.isDraggable() && this.isBlock(),\n\t\t\t\t\tthis.props.readOnly(),\n\t\t\t\t\tthis.props.className(),\n\t\t\t\t\tthis.props.style(),\n\t\t\t\t\tthis.props.slotProps()\n\t\t\t\t),\n\t\t\t{equals: shallow}\n\t\t)\n\treadonly blockComponent: Computed<Slot> = computed(() => resolveSlot('block', this.props.slots()))\n\treadonly blockProps: Computed<Record<string, unknown> | undefined> = computed(() =>\n\t\tresolveSlotProps('block', this.props.slotProps())\n\t)\n\treadonly spanComponent: Computed<Slot> = computed(() => resolveSlot('span', this.props.slots()))\n\treadonly spanProps: Computed<Record<string, unknown> | undefined> = computed(() =>\n\t\tresolveSlotProps('span', this.props.slotProps())\n\t)\n\n\tconstructor(private readonly props: PropsModel) {}\n}","import {computed} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {Token} from '../parsing'\nimport type {PropsModel} from '../props/PropsModel'\nimport {resolveMarkSlot} from '../slots'\nimport type {MarkSlot} from '../slots'\n\nexport class MarkFeature {\n\treadonly enabled: Computed<boolean> = computed(() => {\n\t\tconst Mark = this.props.Mark()\n\t\tif (Mark) return true\n\t\treturn this.props.options().some(opt => 'Mark' in opt && opt.Mark != null)\n\t})\n\n\treadonly slot: MarkSlot = computed(() => {\n\t\tconst options = this.props.options()\n\t\tconst Mark = this.props.Mark()\n\t\tconst Span = this.props.Span()\n\t\treturn (token: Token) => resolveMarkSlot(token, options, Mark, Span)\n\t})\n\n\tconstructor(private readonly props: PropsModel) {}\n}","export function filterSuggestions(data: string[], search: string): string[] {\n\tconst query = search.toLowerCase()\n\treturn data.filter(s => s.toLowerCase().includes(query))\n}","import type {OverlayMatch} from '../../shared/types'\nimport type {MarkToken} from '../parsing'\n\nexport function createMarkFromOverlay(match: OverlayMatch, value: string, meta?: string): MarkToken {\n\tconst markup = match.option.markup\n\tif (!markup) throw new Error('createMarkFromOverlay: option.markup is required')\n\treturn {\n\t\ttype: 'mark',\n\t\tvalue,\n\t\tmeta,\n\t\tcontent: '',\n\t\tposition: {\n\t\t\tstart: match.range.start,\n\t\t\tend: match.range.end,\n\t\t},\n\t\tdescriptor: {\n\t\t\tmarkup,\n\t\t\tindex: 0,\n\t\t\tsegments: [],\n\t\t\tgapTypes: [],\n\t\t\thasSlot: false,\n\t\t\thasTwoValues: false,\n\t\t\tsegmentGlobalIndices: [],\n\t\t},\n\t\tchildren: [],\n\t\tslot: undefined,\n\t}\n}","import {KEYBOARD} from '../../shared/constants'\nimport {escape} from '../../shared/escape'\nimport {signal, computed, event, effectScope, effect, watch, listen} from '../../shared/signals/index.js'\nimport type {Computed} from '../../shared/signals/index.js'\nimport type {CoreOption, OverlayMatch, OverlayTrigger, Slot} from '../../shared/types'\nimport {TriggerFinder} from '../caret'\nimport * as caretDom from '../caret/caretDom'\nimport type {CaretModel} from '../caret/CaretModel'\nimport type {DomController} from '../dom/DomController'\nimport type {EditController} from '../edit'\nimport type {Lifecycle} from '../lifecycle/Lifecycle'\nimport type {Token} from '../parsing'\nimport {annotate} from '../parsing'\nimport type {ParseController} from '../parsing/ParseController'\nimport type {PropsModel} from '../props/PropsModel'\nimport {resolveOverlaySlot} from '../slots'\nimport type {OverlaySlot} from '../slots'\nimport type {ValueModel} from '../value/ValueModel'\n\nexport class OverlayController {\n\treadonly match = signal<OverlayMatch>(undefined)\n\treadonly element = signal<HTMLElement | null>(null)\n\n\treadonly slot: OverlaySlot = computed(() => {\n\t\tconst Overlay = this.props.Overlay()\n\t\treturn (option?: CoreOption, defaultComponent?: Slot) => resolveOverlaySlot(Overlay, option, defaultComponent)\n\t})\n\n\treadonly select = event<{mark: Token; match: OverlayMatch}>()\n\treadonly close = event()\n\n\treadonly position: Computed<{left: number; top: number}> = computed(() => {\n\t\tif (!this.match()) return {left: 0, top: 0}\n\t\tconst rect = caretDom.getRect()\n\t\tif (!rect) return {left: 0, top: 0}\n\t\treturn {left: rect.left, top: rect.top + rect.height + 1}\n\t})\n\n\t#scope?: () => void\n\n\tconstructor(\n\t\tprivate readonly lifecycle: Lifecycle,\n\t\tprivate readonly props: PropsModel,\n\t\tprivate readonly value: ValueModel,\n\t\tprivate readonly dom: DomController,\n\t\tprivate readonly caret: CaretModel,\n\t\tprivate readonly edit: EditController,\n\t\tprivate readonly parsing: ParseController\n\t) {\n\t\tconst hasOverlayTrigger = computed(() => this.props.options().some(opt => opt.overlay?.trigger != null))\n\n\t\tconst toggle = (enabled: boolean) => {\n\t\t\tif (enabled && !this.#scope) {\n\t\t\t\tthis.#scope = effectScope(() => {\n\t\t\t\t\twatch(this.close, () => {\n\t\t\t\t\t\tthis.match(undefined)\n\t\t\t\t\t})\n\n\t\t\t\t\twatch(this.value.current, () => {\n\t\t\t\t\t\tconst showOverlayOn = this.props.showOverlayOn()\n\t\t\t\t\t\tconst type: OverlayTrigger = 'change'\n\n\t\t\t\t\t\tif (showOverlayOn === type || (Array.isArray(showOverlayOn) && showOverlayOn.includes(type))) {\n\t\t\t\t\t\t\tthis.#probeTrigger()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\teffect(() => {\n\t\t\t\t\t\tconst match = this.match()\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tlisten(window, 'keydown', e => {\n\t\t\t\t\t\t\t\tif (e.key === KEYBOARD.ESC) {\n\t\t\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tlisten(\n\t\t\t\t\t\t\t\tdocument,\n\t\t\t\t\t\t\t\t'click',\n\t\t\t\t\t\t\t\te => {\n\t\t\t\t\t\t\t\t\tconst target = e.target instanceof HTMLElement ? e.target : null\n\t\t\t\t\t\t\t\t\tif (this.element()?.contains(target)) return\n\t\t\t\t\t\t\t\t\tif (this.dom.container()?.contains(target)) return\n\t\t\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tconst selectionChangeHandler = () => {\n\t\t\t\t\t\tconst container = this.dom.container()\n\t\t\t\t\t\tif (!container?.contains(document.activeElement)) return\n\n\t\t\t\t\t\tconst showOverlayOn = this.props.showOverlayOn()\n\t\t\t\t\t\tconst type: OverlayTrigger = 'selectionChange'\n\n\t\t\t\t\t\tif (showOverlayOn === type || (Array.isArray(showOverlayOn) && showOverlayOn.includes(type))) {\n\t\t\t\t\t\t\tthis.#probeTrigger()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlisten(document, 'selectionchange', selectionChangeHandler)\n\n\t\t\t\t\twatch(this.select, overlayEvent => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tmark,\n\t\t\t\t\t\t\tmatch: {option, range},\n\t\t\t\t\t\t} = overlayEvent\n\n\t\t\t\t\t\tconst markup = option.markup\n\t\t\t\t\t\tif (!markup) return\n\n\t\t\t\t\t\tconst annotation =\n\t\t\t\t\t\t\tmark.type === 'mark'\n\t\t\t\t\t\t\t\t? annotate(markup, {\n\t\t\t\t\t\t\t\t\t\tvalue: mark.value,\n\t\t\t\t\t\t\t\t\t\tmeta: mark.meta,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: annotate(markup, {\n\t\t\t\t\t\t\t\t\t\tvalue: mark.content,\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthis.edit.replace(range, annotation)\n\t\t\t\t\t\tthis.match(undefined)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (!enabled && this.#scope) {\n\t\t\t\tthis.#scope()\n\t\t\t\tthis.#scope = undefined\n\t\t\t}\n\t\t}\n\n\t\tthis.lifecycle.onMounted(() => {\n\t\t\twatch(hasOverlayTrigger, toggle)\n\t\t\ttoggle(hasOverlayTrigger())\n\t\t})\n\t}\n\n\t#probeTrigger() {\n\t\tconst match =\n\t\t\tTriggerFinder.find(this.props.options(), option => option.overlay?.trigger, this.dom) ??\n\t\t\tthis.#probeTriggerFromCaretRange()\n\t\tthis.match(match)\n\t}\n\n\t#probeTriggerFromCaretRange(): OverlayMatch | undefined {\n\t\tconst sel = this.caret.selection()\n\t\tif (!sel || sel.start !== sel.end) return\n\n\t\tconst cursor = sel.start\n\t\tconst value = this.value.current()\n\t\tconst left = value.slice(0, cursor)\n\t\tconst right = value.slice(cursor)\n\t\tconst rightWord = right.match(/^\\w*/)?.[0] ?? ''\n\n\t\tfor (const option of this.props.options()) {\n\t\t\tconst trigger = option.overlay?.trigger\n\t\t\tif (!trigger) continue\n\n\t\t\tconst match = left.match(new RegExp(`${escape(trigger)}(\\\\w*)$`))\n\t\t\tif (!match) continue\n\n\t\t\tconst [sourceLeft, wordLeft] = match\n\t\t\tconst source = sourceLeft + rightWord\n\t\t\tconst start = cursor - sourceLeft.length\n\t\t\treturn {\n\t\t\t\tvalue: wordLeft + rightWord,\n\t\t\t\tsource,\n\t\t\t\trange: {start, end: start + source.length},\n\t\t\t\tspan: value,\n\t\t\t\tnode: window.getSelection()?.anchorNode ?? this.dom.container() ?? document.body,\n\t\t\t\toption,\n\t\t\t}\n\t\t}\n\t}\n}","import {KEYBOARD} from '../../shared/constants'\n\nexport type NavigationAction = 'up' | 'down' | 'select' | 'none'\n\nexport interface NavigationResult {\n\taction: NavigationAction\n\tindex: number\n}\n\nexport function navigateSuggestions(key: string, activeIndex: number, length: number): NavigationResult {\n\tif (length === 0) return {action: 'none', index: activeIndex}\n\n\tconst hasActive = !isNaN(activeIndex)\n\n\tswitch (key) {\n\t\tcase KEYBOARD.UP:\n\t\t\treturn {action: 'up', index: hasActive ? (length + ((activeIndex - 1) % length)) % length : 0}\n\t\tcase KEYBOARD.DOWN:\n\t\t\treturn {action: 'down', index: hasActive ? (activeIndex + 1) % length : 0}\n\t\tcase KEYBOARD.ENTER:\n\t\t\treturn hasActive ? {action: 'select', index: activeIndex} : {action: 'none', index: activeIndex}\n\t\tdefault:\n\t\t\treturn {action: 'none', index: activeIndex}\n\t}\n}","import {DEFAULT_OPTIONS} from '../../shared/constants'\nimport {signal, batch} from '../../shared/signals'\nimport type {SignalValues} from '../../shared/signals'\nimport type {\n\tCoreOption,\n\tOverlayTrigger,\n\tCSSProperties,\n\tCoreSlots,\n\tCoreSlotProps,\n\tDraggableConfig,\n\tSlot,\n} from '../../shared/types'\nimport {shallow} from '../../shared/utils/shallow'\n\nexport class PropsModel {\n\treadonly value = signal<string>(undefined, {readonly: true})\n\treadonly defaultValue = signal<string>(undefined, {readonly: true})\n\n\treadonly onChange = signal<(value: string) => void>(undefined, {readonly: true})\n\n\treadonly options = signal<CoreOption[]>(DEFAULT_OPTIONS, {readonly: true})\n\treadonly readOnly = signal<boolean>(false, {readonly: true})\n\n\treadonly layout = signal<'inline' | 'block'>('inline', {readonly: true})\n\treadonly draggable = signal<boolean | DraggableConfig>(false, {readonly: true})\n\n\treadonly showOverlayOn = signal<OverlayTrigger>('change', {readonly: true})\n\n\treadonly Span = signal<Slot>(undefined, {readonly: true})\n\treadonly Mark = signal<Slot>(undefined, {readonly: true})\n\treadonly Overlay = signal<Slot>(undefined, {readonly: true})\n\n\treadonly className = signal<string>(undefined, {readonly: true})\n\treadonly style = signal<CSSProperties>(undefined, {equals: shallow, readonly: true})\n\n\treadonly slots = signal<CoreSlots>(undefined, {readonly: true})\n\treadonly slotProps = signal<CoreSlotProps>(undefined, {readonly: true})\n\n\tset(values: Partial<SignalValues<typeof this>>): void {\n\t\tbatch(\n\t\t\t() => {\n\t\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- heterogeneous signal map: per-key types verified by SignalValues<T> at the call site\n\t\t\t\tfor (const key of Object.keys(values) as (keyof typeof this)[]) {\n\t\t\t\t\tif (!(key in this))\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- heterogeneous signal map: per-key types verified by SignalValues<T> at the call site\n\t\t\t\t\t;(this[key] as (v: unknown) => void)(values[key] as never)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{mutable: true}\n\t\t)\n\t}\n}","import type {Range} from '../../shared/editorContracts'\nimport {computed, model} from '../../shared/signals/index.js'\nimport {replaceInString} from '../../shared/utils'\nimport type {PropsModel} from '../props/PropsModel'\n\nexport class ValueModel {\n\treadonly isControlledMode = computed(() => this.props.value() !== undefined)\n\n\treadonly current = model<string>({\n\t\tdefault: () => this.props.defaultValue() ?? '',\n\t\tget: value => (this.isControlledMode() ? (this.props.value() ?? '') : value),\n\t\tset: (next, previous) => {\n\t\t\tif (next === undefined) return previous\n\t\t\tif (this.props.readOnly()) return previous\n\t\t\tthis.props.onChange()?.(next)\n\t\t\treturn this.isControlledMode() ? previous : next\n\t\t},\n\t})\n\n\tconstructor(private readonly props: PropsModel) {}\n\n\t/**\n\t * Attempts to replace `range` with `replacement`. Returns `true` when the\n\t * edit was accepted (range valid and not read-only), `false` otherwise.\n\t * Callers use the return value to gate downstream side effects such as\n\t * caret placement.\n\t */\n\treplace(range: Range, replacement: string): boolean {\n\t\tif (this.props.readOnly()) return false\n\t\tconst next = replaceInString(this.current(), range, replacement)\n\t\tif (next === undefined) return false\n\t\tthis.current(next)\n\t\treturn true\n\t}\n}","/**\n * Returns true when `target` is outside `element` (i.e. not contained by it).\n * Useful for closing a menu when the user clicks outside of it.\n */\nexport function isClickOutside(target: EventTarget | null, element: Element | null): boolean {\n\treturn !!element && !element.contains(target instanceof Node ? target : null)\n}\n\n/**\n * Returns true when the keyboard event is the Escape key.\n */\nexport function isEscapeKey(e: KeyboardEvent): boolean {\n\treturn e.key === 'Escape'\n}","import {signal} from '../shared/signals'\nimport type {DragAction, DragActions} from '../shared/types'\nimport {getDragDropPosition, getDragTargetIndex, parseDragSourceIndex} from '../shared/utils/dragUtils'\nimport {isClickOutside, isEscapeKey} from '../shared/utils/menuUtils'\n\nexport type DropPosition = 'before' | 'after' | null\n\nexport class BlockStore {\n\treadonly refs = {\n\t\tcontainer: null as HTMLElement | null,\n\t}\n\n\treadonly state = {\n\t\tisHovered: signal(false),\n\t\tisDragging: signal(false),\n\t\tdropPosition: signal<DropPosition>(null),\n\t\tmenuOpen: signal(false),\n\t\tmenuPosition: signal({top: 0, left: 0}),\n\t}\n\n\t#blockIndex = 0\n\t#dragAction: DragActions['action'] | null = null\n\t#cleanupContainer?: () => void\n\t#cleanupGrip?: () => void\n\t#cleanupMenu?: () => void\n\n\tattachContainer(el: HTMLElement | null, blockIndex: number, actions: DragActions) {\n\t\tthis.#blockIndex = blockIndex\n\t\tthis.#dragAction = actions.action\n\t\tif (el === this.refs.container) return\n\t\tthis.#cleanupContainer?.()\n\t\tthis.refs.container = el\n\t\tif (!el) return\n\n\t\tconst onMouseEnter = () => this.state.isHovered(true)\n\t\tconst onMouseLeave = () => this.state.isHovered(false)\n\t\tconst onDragOver = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.preventDefault()\n\t\t\te.dataTransfer.dropEffect = 'move'\n\t\t\tthis.state.dropPosition(getDragDropPosition(e.clientY, el.getBoundingClientRect()))\n\t\t}\n\t\tconst onDragLeave = (e: DragEvent) => {\n\t\t\tconst ct = e.currentTarget\n\t\t\tif (ct instanceof Node && ct.contains(e.relatedTarget instanceof Node ? e.relatedTarget : null)) return\n\t\t\tthis.state.dropPosition(null)\n\t\t}\n\t\tconst onDrop = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.preventDefault()\n\t\t\tconst sourceIndex = parseDragSourceIndex(e.dataTransfer)\n\t\t\tif (sourceIndex === null) return\n\t\t\tconst targetIndex = getDragTargetIndex(this.#blockIndex, this.state.dropPosition() ?? 'after')\n\t\t\tthis.state.dropPosition(null)\n\t\t\tthis.#emit({type: 'reorder', source: sourceIndex, target: targetIndex})\n\t\t}\n\n\t\tel.addEventListener('mouseenter', onMouseEnter)\n\t\tel.addEventListener('mouseleave', onMouseLeave)\n\t\tel.addEventListener('dragover', onDragOver)\n\t\tel.addEventListener('dragleave', onDragLeave)\n\t\tel.addEventListener('drop', onDrop)\n\t\tthis.#cleanupContainer = () => {\n\t\t\tel.removeEventListener('mouseenter', onMouseEnter)\n\t\t\tel.removeEventListener('mouseleave', onMouseLeave)\n\t\t\tel.removeEventListener('dragover', onDragOver)\n\t\t\tel.removeEventListener('dragleave', onDragLeave)\n\t\t\tel.removeEventListener('drop', onDrop)\n\t\t}\n\t}\n\n\tattachGrip(el: HTMLButtonElement | null, blockIndex: number, actions: DragActions) {\n\t\tthis.#blockIndex = blockIndex\n\t\tthis.#dragAction = actions.action\n\t\tthis.#cleanupGrip?.()\n\t\tif (!el) return\n\n\t\tconst onDragStart = (e: DragEvent) => {\n\t\t\tif (!e.dataTransfer) return\n\t\t\te.dataTransfer.effectAllowed = 'move'\n\t\t\te.dataTransfer.setData('text/plain', String(this.#blockIndex))\n\t\t\tthis.state.isDragging(true)\n\t\t\tif (this.refs.container) e.dataTransfer.setDragImage(this.refs.container, 0, 0)\n\t\t}\n\t\tconst onDragEnd = () => {\n\t\t\tthis.state.isDragging(false)\n\t\t\tthis.state.dropPosition(null)\n\t\t}\n\t\tconst onClick = (e: MouseEvent) => {\n\t\t\te.preventDefault()\n\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\tthis.state.menuPosition({top: rect.bottom + 4, left: rect.left})\n\t\t\tthis.state.menuOpen(true)\n\t\t}\n\n\t\tel.addEventListener('dragstart', onDragStart)\n\t\tel.addEventListener('dragend', onDragEnd)\n\t\tel.addEventListener('click', onClick)\n\t\tthis.#cleanupGrip = () => {\n\t\t\tel.removeEventListener('dragstart', onDragStart)\n\t\t\tel.removeEventListener('dragend', onDragEnd)\n\t\t\tel.removeEventListener('click', onClick)\n\t\t}\n\t}\n\n\tattachMenu(el: HTMLElement | null) {\n\t\tthis.#cleanupMenu?.()\n\t\tif (!el) return\n\n\t\tconst onMouseDown = (e: MouseEvent) => {\n\t\t\tif (isClickOutside(e.target, el)) this.closeMenu()\n\t\t}\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (isEscapeKey(e)) this.closeMenu()\n\t\t}\n\t\tdocument.addEventListener('mousedown', onMouseDown)\n\t\tdocument.addEventListener('keydown', onKeyDown)\n\t\tthis.#cleanupMenu = () => {\n\t\t\tdocument.removeEventListener('mousedown', onMouseDown)\n\t\t\tdocument.removeEventListener('keydown', onKeyDown)\n\t\t}\n\t}\n\n\tcloseMenu = () => this.state.menuOpen(false)\n\taddBlock = () => {\n\t\tthis.#emit({type: 'add', afterIndex: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\tdeleteBlock = () => {\n\t\tthis.#emit({type: 'delete', index: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\tduplicateBlock = () => {\n\t\tthis.#emit({type: 'duplicate', index: this.#blockIndex})\n\t\tthis.closeMenu()\n\t}\n\n\t#emit(action: DragAction) {\n\t\tthis.#dragAction?.(action)\n\t}\n}","import {BlockStore} from './BlockStore'\n\nexport class BlockRegistry {\n\treadonly #map = new WeakMap<object, BlockStore>()\n\n\tget(token: object): BlockStore {\n\t\tlet store = this.#map.get(token)\n\t\tif (!store) {\n\t\t\tstore = new BlockStore()\n\t\t\tthis.#map.set(token, store)\n\t\t}\n\t\treturn store\n\t}\n}","import {CaretModel} from '../features/caret'\nimport {ClipboardController} from '../features/clipboard'\nimport {DomController} from '../features/dom'\nimport {DragController} from '../features/drag'\nimport {EditController} from '../features/edit'\nimport {KeyboardController} from '../features/keyboard'\nimport {Lifecycle} from '../features/lifecycle'\nimport {MarkFeature} from '../features/mark'\nimport {OverlayController} from '../features/overlay'\nimport {ParseController} from '../features/parsing/ParseController'\nimport {PropsModel} from '../features/props/PropsModel'\nimport {SlotsFeature} from '../features/slots'\nimport {ValueModel} from '../features/value'\nimport {KeyGenerator, MarkputHandler} from '../shared/classes'\nimport {BlockRegistry} from './BlockRegistry'\n\nexport type {DragAction} from '../shared/types'\n\nexport class Store {\n\treadonly key = new KeyGenerator()\n\t// 0 from 10\n\treadonly blocks = new BlockRegistry()\n\n\treadonly lifecycle = new Lifecycle()\n\treadonly props = new PropsModel()\n\treadonly value = new ValueModel(this.props)\n\n\treadonly mark = new MarkFeature(this.props)\n\treadonly slots = new SlotsFeature(this.props)\n\n\treadonly parsing = new ParseController(this.lifecycle, this.value, this.mark, this.props, this.slots)\n\n\treadonly dom = new DomController(this.lifecycle, this.props, this.parsing, this.value)\n\n\treadonly caret = new CaretModel(this.lifecycle, this.dom, this.value)\n\treadonly edit = new EditController(this.value, this.caret)\n\n\treadonly overlay = new OverlayController(\n\t\tthis.lifecycle,\n\t\tthis.props,\n\t\tthis.value,\n\t\tthis.dom,\n\t\tthis.caret,\n\t\tthis.edit,\n\t\tthis.parsing\n\t)\n\treadonly keyboard = new KeyboardController(\n\t\tthis.lifecycle,\n\t\tthis.dom,\n\t\tthis.value,\n\t\tthis.caret,\n\t\tthis.edit,\n\t\tthis.slots,\n\t\tthis.parsing,\n\t\tthis.props\n\t)\n\treadonly drag = new DragController(this.props, this.value, this.parsing, this.caret)\n\treadonly clipboard = new ClipboardController(this.lifecycle, this.edit, this.dom, this.parsing)\n\n\treadonly handler = new MarkputHandler(this.dom, this.overlay, this.parsing)\n}","import type {Store} from '@markput/core'\nimport {createContext} from 'react'\n\nexport const StoreContext = createContext<Store | undefined>(undefined)\nStoreContext.displayName = 'StoreContext'","import {computed, watch, isReactive} from '@markput/core'\nimport type {Signal, Computed, SignalValues, Store} from '@markput/core'\nimport {useSyncExternalStore, useContext, useRef} from 'react'\n\nimport {StoreContext} from '../providers/StoreContext'\n\ntype Selectable<T> = Signal<T> | Computed<T>\ntype ObjectSelector = Record<string, Selectable<unknown> | unknown>\n\ntype StableRef = {\n\tderived: Computed<unknown>\n\tsubscribe: (cb: () => void) => () => void\n\tgetSnapshot: () => unknown\n}\n\nexport function useMarkput<T>(selector: (store: Store) => Selectable<T>): T\nexport function useMarkput<R extends ObjectSelector>(selector: (store: Store) => R): SignalValues<R>\nexport function useMarkput(selector: (store: Store) => Selectable<unknown> | ObjectSelector): unknown {\n\tconst store = useContext(StoreContext)\n\tif (store === undefined) throw new Error('Store not found. Make sure to wrap component in StoreContext.')\n\n\t// Holds stable computed + subscribe + snapshot — created once, never recreated.\n\tconst stableRef = useRef<StableRef | null>(null)\n\n\tif (stableRef.current === null) {\n\t\tconst target = selector(store)\n\n\t\tconst derived = computed((): unknown => {\n\t\t\tif (typeof target === 'function') {\n\t\t\t\treturn target()\n\t\t\t}\n\t\t\tconst out: Record<string, unknown> = {}\n\t\t\tfor (const k in target) {\n\t\t\t\tconst val = target[k]\n\t\t\t\tout[k] = isReactive(val) ? (val as () => unknown)() : val\n\t\t\t}\n\t\t\treturn out\n\t\t})\n\n\t\tstableRef.current = {\n\t\t\tderived,\n\t\t\tsubscribe: cb => watch(derived, cb),\n\t\t\tgetSnapshot: () => derived(),\n\t\t}\n\t}\n\n\tconst {subscribe, getSnapshot} = stableRef.current\n\treturn useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}","import type {ReactNode} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const List = ({children}: {children: ReactNode}) => <ul className={styles.PopupList}>{children}</ul>","import {cx} from '@markput/core'\nimport type {MouseEvent, ReactNode} from 'react'\nimport {useEffect, useRef} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const ListItem = ({\n\tonClick,\n\tonMouseDown,\n\tactive,\n\tchildren,\n}: {\n\tonClick?: (e: MouseEvent<HTMLLIElement>) => void\n\tonMouseDown?: (e: MouseEvent<HTMLLIElement>) => void\n\tactive?: boolean\n\tchildren: ReactNode\n}) => {\n\tconst ref = useRef<HTMLLIElement>(null)\n\n\tuseEffect(() => {\n\t\tif (active) ref.current?.scrollIntoView(false)\n\t}, [active])\n\n\treturn (\n\t\t<li\n\t\t\tref={ref}\n\t\t\tclassName={cx(styles.PopupItem, active && styles.PopupItemActive)}\n\t\t\tonClick={onClick}\n\t\t\tonMouseDown={onMouseDown}\n\t\t>\n\t\t\t{children}\n\t\t</li>\n\t)\n}","import type {CSSProperties, ReactNode, Ref} from 'react'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const Popup = ({ref, style, children}: {ref?: Ref<HTMLElement>; style?: CSSProperties; children: ReactNode}) => {\n\t// oxlint-disable-next-line no-unsafe-type-assertion\n\tconst divRef = ref as Ref<HTMLDivElement> | undefined\n\treturn (\n\t\t<div ref={divRef} className={styles.Popup} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}","import {cx} from '@markput/core'\nimport type {Token} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {List} from './Popup/List'\nimport {ListItem} from './Popup/ListItem'\nimport {Popup} from './Popup/Popup'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const BlockMenu = memo(({token}: {token: Token}) => {\n\tconst {blockStore, menuOpen, menuPosition, dom, index} = useMarkput(s => {\n\t\tconst blockStore = s.blocks.get(token)\n\n\t\treturn {\n\t\t\tblockStore,\n\t\t\tmenuOpen: blockStore.state.menuOpen,\n\t\t\tmenuPosition: blockStore.state.menuPosition,\n\t\t\tdom: s.dom,\n\t\t\tindex: s.parsing.index,\n\t\t}\n\t})\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (!menuOpen) return null\n\n\treturn (\n\t\t<Popup\n\t\t\tref={(el: HTMLDivElement | null) => {\n\t\t\t\tblockStore.attachMenu(el)\n\t\t\t\tcontrolRef?.(el)\n\t\t\t}}\n\t\t\tstyle={{top: menuPosition.top, left: menuPosition.left}}\n\t\t>\n\t\t\t<List>\n\t\t\t\t<ListItem onClick={() => blockStore.addBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconAdd)} />\n\t\t\t\t\t<span>Add below</span>\n\t\t\t\t</ListItem>\n\t\t\t\t<ListItem onClick={() => blockStore.duplicateBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconDuplicate)} />\n\t\t\t\t\t<span>Duplicate</span>\n\t\t\t\t</ListItem>\n\t\t\t\t<ListItem onClick={() => blockStore.deleteBlock()}>\n\t\t\t\t\t<span className={cx(styles.Icon, styles.IconTrash)} />\n\t\t\t\t\t<span>Delete</span>\n\t\t\t\t</ListItem>\n\t\t\t</List>\n\t\t</Popup>\n\t)\n})\n\nBlockMenu.displayName = 'BlockMenu'","import {cx, getAlwaysShowHandle} from '@markput/core'\nimport type {Token as TokenType} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nimport styles from '@markput/core/styles.module.css'\n\nconst iconGrip = `${styles.Icon} ${styles.IconGrip}`\n\nexport const DragHandle = memo(({token, blockIndex}: {token: TokenType; blockIndex: number}) => {\n\tconst {blockStore, action, readOnly, draggable, isDragging, isHovered, dom, index} = useMarkput(s => {\n\t\tconst blockStore = s.blocks.get(token)\n\n\t\treturn {\n\t\t\tblockStore,\n\t\t\taction: s.drag.action,\n\t\t\treadOnly: s.props.readOnly,\n\t\t\tdraggable: s.props.draggable,\n\t\t\tisDragging: blockStore.state.isDragging,\n\t\t\tisHovered: blockStore.state.isHovered,\n\t\t\tdom: s.dom,\n\t\t\tindex: s.parsing.index,\n\t\t}\n\t})\n\tconst alwaysShowHandle = useMemo(() => getAlwaysShowHandle(draggable), [draggable])\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (readOnly) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={controlRef}\n\t\t\tclassName={cx(\n\t\t\t\tstyles.SidePanel,\n\t\t\t\talwaysShowHandle ? styles.SidePanelAlways : isHovered && !isDragging && styles.SidePanelVisible\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={(el: HTMLButtonElement | null) => {\n\t\t\t\t\tblockStore.attachGrip(el, blockIndex, {action})\n\t\t\t\t}}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdraggable\n\t\t\t\tclassName={cx(styles.GripButton, isDragging && styles.GripButtonDragging)}\n\t\t\t\taria-label=\"Drag to reorder or click for options\"\n\t\t\t>\n\t\t\t\t<span className={iconGrip} />\n\t\t\t</button>\n\t\t</div>\n\t)\n})\n\nDragHandle.displayName = 'DragHandle'","import type {Token as TokenType} from '@markput/core'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nimport styles from '@markput/core/styles.module.css'\n\nexport const DropIndicator = memo(({token, position}: {token: TokenType; position: 'before' | 'after'}) => {\n\tconst dropPosition = useMarkput(s => s.blocks.get(token).state.dropPosition)\n\tconst {dom, index} = useMarkput(s => ({dom: s.dom, index: s.parsing.index}))\n\tconst path = index.pathFor(token)\n\tconst controlRef = useMemo(() => (path ? dom.controlFor(path) : undefined), [dom, path])\n\n\tif (dropPosition !== position) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={controlRef}\n\t\t\tclassName={styles.DropIndicator}\n\t\t\tstyle={position === 'before' ? {top: -1} : {bottom: -1}}\n\t\t/>\n\t)\n})\n\nDropIndicator.displayName = 'DropIndicator'","import type {Store, Token, TokenAddress} from '@markput/core'\nimport {createContext, useContext} from 'react'\n\nexport type TokenContextValue = {\n\treadonly store: Store\n\treadonly token: Token\n\treadonly address?: TokenAddress\n}\n\nexport const TokenContext = createContext<TokenContextValue | undefined>(undefined)\nTokenContext.displayName = 'TokenProvider'\n\nexport function useToken(): Token {\n\tconst value = useContext(TokenContext)\n\tif (value === undefined) {\n\t\tthrow new Error('Token not found. Make sure to wrap component in TokenContext.Provider.')\n\t}\n\treturn value.token\n}\n\nexport function useTokenContext(): TokenContextValue {\n\tconst value = useContext(TokenContext)\n\tif (value === undefined) {\n\t\tthrow new Error('Token not found. Make sure to wrap component in TokenContext.Provider.')\n\t}\n\treturn value\n}","import type {TokenPath} from '@markput/core'\nimport type {CSSProperties, ReactNode} from 'react'\nimport {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\n\nconst sequenceHostStyle: CSSProperties = {display: 'contents'}\n\nexport const TokenChildren = memo(({ownerPath, children}: {ownerPath: TokenPath; children: ReactNode}) => {\n\tconst {dom} = useMarkput(s => ({dom: s.dom}))\n\tconst ref = useMemo(() => dom.childrenFor(ownerPath), [dom, ownerPath])\n\n\treturn (\n\t\t<span ref={ref} style={sequenceHostStyle}>\n\t\t\t{children}\n\t\t</span>\n\t)\n})\n\nTokenChildren.displayName = 'TokenChildren'","import type {Token as TokenType} from '@markput/core'\nimport {memo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {TokenContext} from '../lib/providers/TokenContext'\nimport {TokenChildren} from './TokenChildren'\n\nexport const Token = memo(({token}: {token: TokenType}) => {\n\tconst {resolveMarkSlot, key, index, store} = useMarkput(s => ({\n\t\tresolveMarkSlot: s.mark.slot,\n\t\tkey: s.key,\n\t\tindex: s.parsing.index,\n\t\tstore: s,\n\t}))\n\tconst path = index.pathFor(token)\n\tconst address = path ? index.addressFor(path) : undefined\n\tif (!path || !address) return null\n\n\tconst [Component, props] = resolveMarkSlot(token)\n\tconst children =\n\t\ttoken.type === 'mark' && token.children.length > 0 ? (\n\t\t\t<TokenChildren ownerPath={path}>\n\t\t\t\t{token.children.map(child => (\n\t\t\t\t\t<Token key={key.get(child)} token={child} />\n\t\t\t\t))}\n\t\t\t</TokenChildren>\n\t\t) : undefined\n\n\treturn (\n\t\t<TokenContext value={{store, token, address}}>\n\t\t\t{children ? <Component {...props}>{children}</Component> : <Component {...props} />}\n\t\t</TokenContext>\n\t)\n})\n\nToken.displayName = 'Token'","import type {Token as TokenType} from '@markput/core'\nimport {cx} from '@markput/core'\nimport type {CSSProperties} from 'react'\nimport {memo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {BlockMenu} from './BlockMenu'\nimport {DragHandle} from './DragHandle'\nimport {DropIndicator} from './DropIndicator'\nimport {Token} from './Token'\n\nimport styles from '@markput/core/styles.module.css'\n\ninterface BlockProps {\n\ttoken: TokenType\n}\n\nexport const Block = memo(({token}: BlockProps) => {\n\tconst {blockStore, action, Component, slotProps, isDragging, tokens} = useMarkput(s => ({\n\t\tblockStore: s.blocks.get(token),\n\t\taction: s.drag.action,\n\t\tComponent: s.slots.blockComponent,\n\t\tslotProps: s.slots.blockProps,\n\t\tisDragging: s.blocks.get(token).state.isDragging,\n\t\ttokens: s.parsing.tokens,\n\t}))\n\tconst blockIndex = tokens.indexOf(token)\n\n\tconst setBlockRef = (el: HTMLElement | null) => {\n\t\tblockStore.attachContainer(el, blockIndex, {action})\n\t}\n\n\treturn (\n\t\t<Component\n\t\t\tref={setBlockRef}\n\t\t\tdata-testid=\"block\"\n\t\t\t{...slotProps}\n\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- slotProps.className is raw and needs casting to string\n\t\t\tclassName={cx(styles.Block, slotProps?.className as string | undefined)}\n\t\t\t// oxlint-disable-next-line no-unsafe-type-assertion -- slotProps.style is raw and needs casting to CSSProperties\n\t\t\tstyle={{opacity: isDragging ? 0.4 : 1, ...(slotProps?.style as CSSProperties | undefined)}}\n\t\t>\n\t\t\t<DropIndicator token={token} position=\"before\" />\n\n\t\t\t<DragHandle token={token} blockIndex={blockIndex} />\n\n\t\t\t<Token token={token} />\n\n\t\t\t<DropIndicator token={token} position=\"after\" />\n\n\t\t\t<BlockMenu token={token} />\n\t\t</Component>\n\t)\n})\n\nBlock.displayName = 'Block'","import {memo, useLayoutEffect} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {Block} from './Block'\nimport {Token} from './Token'\n\nexport const Container = memo(() => {\n\tconst {dom, lifecycle, isBlock, tokens, key, Component, props} = useMarkput(s => ({\n\t\tdom: s.dom,\n\t\tlifecycle: s.lifecycle,\n\t\tisBlock: s.slots.isBlock,\n\t\ttokens: s.parsing.tokens,\n\t\tkey: s.key,\n\t\tComponent: s.slots.containerComponent,\n\t\tprops: s.slots.containerProps,\n\t}))\n\n\tuseLayoutEffect(() => {\n\t\tlifecycle.rendered()\n\t})\n\n\treturn (\n\t\t<Component ref={dom.container} {...props}>\n\t\t\t{isBlock\n\t\t\t\t? tokens.map(t => <Block key={key.get(t)} token={t} />)\n\t\t\t\t: tokens.map(t => <Token key={key.get(t)} token={t} />)}\n\t\t</Component>\n\t)\n})\n\nContainer.displayName = 'Container'","import type {OverlayMatch} from '@markput/core'\nimport {createMarkFromOverlay} from '@markput/core'\nimport type {RefObject} from 'react'\nimport {useCallback, useMemo} from 'react'\n\nimport type {Option} from '../../types'\nimport {useMarkput} from './useMarkput'\n\nexport interface OverlayHandler {\n\tstyle: {\n\t\tleft: number\n\t\ttop: number\n\t}\n\tclose: () => void\n\tselect: (value: {value: string; meta?: string}) => void\n\tmatch: OverlayMatch<Option> | undefined\n\tref: RefObject<HTMLElement | null>\n}\n\nexport function useOverlay(): OverlayHandler {\n\tconst {match, overlay} = useMarkput(s => ({match: s.overlay.match, overlay: s.overlay}))\n\n\tconst style = useMarkput(s => s.overlay.position())\n\n\tconst close = useCallback(() => overlay.close(), [overlay])\n\tconst select = useCallback(\n\t\t(value: {value: string; meta?: string}) => {\n\t\t\tif (!match) return\n\t\t\tconst mark = createMarkFromOverlay(match, value.value, value.meta)\n\t\t\toverlay.select({mark, match})\n\t\t\toverlay.close()\n\t\t},\n\t\t[match, overlay]\n\t)\n\n\tconst ref = useMemo(\n\t\t(): RefObject<HTMLElement | null> => ({\n\t\t\tget current() {\n\t\t\t\treturn overlay.element()\n\t\t\t},\n\t\t\tset current(v: HTMLElement | null) {\n\t\t\t\toverlay.element(v)\n\t\t\t},\n\t\t}),\n\t\t[overlay]\n\t)\n\n\treturn {match, style, select, close, ref}\n}","import {filterSuggestions, navigateSuggestions} from '@markput/core'\nimport {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {useMarkput} from '../../lib/hooks/useMarkput'\nimport {useOverlay} from '../../lib/hooks/useOverlay'\nimport {List} from '../Popup/List'\nimport {ListItem} from '../Popup/ListItem'\nimport {Popup} from '../Popup/Popup'\n\nexport const Suggestions = () => {\n\tconst container = useMarkput(s => s.dom.container)\n\tconst {match, select, style, ref} = useOverlay()\n\tconst [active, setActive] = useState(NaN)\n\tconst data = match?.option.overlay?.data ?? []\n\tconst filtered = useMemo(() => (match ? filterSuggestions(data, match.value) : []), [match, data])\n\tconst length = filtered.length\n\n\tconst activeRef = useRef(active)\n\tactiveRef.current = active\n\tconst filteredRef = useRef(filtered)\n\tfilteredRef.current = filtered\n\n\tuseEffect(() => {\n\t\tif (!container) return\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tconst result = navigateSuggestions(event.key, activeRef.current, length)\n\t\t\tswitch (result.action) {\n\t\t\t\tcase 'up':\n\t\t\t\tcase 'down':\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tsetActive(result.index)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'select': {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tconst suggestion = filteredRef.current[result.index]\n\t\t\t\t\tselect({value: suggestion, meta: result.index.toString()})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'none':\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tcontainer.addEventListener('keydown', handler)\n\t\treturn () => container.removeEventListener('keydown', handler)\n\t}, [container, length, select])\n\n\tif (!filtered.length) return null\n\n\treturn (\n\t\t<Popup ref={ref} style={style}>\n\t\t\t<List>\n\t\t\t\t{filtered.map((suggestion, index) => (\n\t\t\t\t\t<ListItem\n\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\tactive={index === active}\n\t\t\t\t\t\tonClick={() => select({value: suggestion, meta: index.toString()})}\n\t\t\t\t\t>\n\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t</ListItem>\n\t\t\t\t))}\n\t\t\t</List>\n\t\t</Popup>\n\t)\n}","import {memo, useMemo} from 'react'\n\nimport {useMarkput} from '../lib/hooks/useMarkput'\nimport {Suggestions} from './Suggestions'\n\nexport const OverlayRenderer = memo(() => {\n\tconst {\n\t\tmatch,\n\t\tkey: keyGen,\n\t\tresolveOverlay,\n\t} = useMarkput(s => ({\n\t\tmatch: s.overlay.match,\n\t\tkey: s.key,\n\t\tresolveOverlay: s.overlay.slot,\n\t}))\n\tconst key = useMemo(() => (match ? keyGen.get(match.option) : undefined), [match])\n\n\tconst [Overlay, props] = resolveOverlay(match?.option, Suggestions)\n\n\tif (!key) return\n\n\treturn <Overlay key={key} {...props} />\n})\n\nOverlayRenderer.displayName = 'OverlayRenderer'","import type {CoreOption, DraggableConfig, MarkputHandler, OverlayTrigger} from '@markput/core'\nimport {Store} from '@markput/core'\nimport type {ComponentType, CSSProperties, Ref} from 'react'\nimport {useImperativeHandle, useLayoutEffect, useState} from 'react'\n\nimport {StoreContext} from '../lib/providers/StoreContext'\nimport type {MarkProps, Option, OverlayProps, SlotProps, Slots} from '../types'\nimport {Container} from './Container'\nimport {OverlayRenderer} from './OverlayRenderer'\n\n/**\n * Props for MarkedInput component.\n *\n * @template TMarkProps - Type of props for the global Mark component\n * @template TOverlayProps - Type of props for the global Overlay component\n *\n * @example\n * ```tsx\n * <MarkedInput<ChipProps>\n * Mark={Chip}\n * options={[{\n * markup: '@[__value__]',\n * mark: { label: 'Click me' }\n * }]}\n * />\n * ```\n */\nexport interface MarkedInputProps<TMarkProps = MarkProps, TOverlayProps extends CoreOption['overlay'] = OverlayProps> {\n\t/** Ref to handler */\n\tref?: Ref<MarkputHandler>\n\t/** Global component used for rendering text tokens (default: built-in Span) */\n\tSpan?: ComponentType<MarkProps>\n\t/** Global component used for rendering markups (fallback for option.Mark) */\n\tMark?: ComponentType<TMarkProps>\n\t/** Global component used for rendering overlays (fallback for option.Overlay) */\n\tOverlay?: ComponentType<TOverlayProps>\n\t/**\n\t * Configuration options for markups and overlays.\n\t * Each option can specify its own component via option.Mark or option.Overlay.\n\t * Falls back to global Mark/Overlay components when not specified.\n\t */\n\toptions?: Option<TMarkProps, TOverlayProps>[]\n\t/** Additional classes */\n\tclassName?: string\n\t/** Additional style */\n\tstyle?: CSSProperties\n\t/**\n\t * Override internal components using slots\n\t * @example slots={{ container: 'div', span: 'span' }}\n\t */\n\tslots?: Slots\n\t/**\n\t * Props to pass to slot components\n\t * @example slotProps={{ container: { onKeyDown: handler }, span: { className: 'custom' } }}\n\t */\n\tslotProps?: SlotProps\n\t/**\n\t * Events that trigger overlay display\n\t * @default 'change'\n\t */\n\tshowOverlayOn?: OverlayTrigger\n\t/** Annotated text with markups */\n\tvalue?: string\n\t/** Initial value for uncontrolled mode */\n\tdefaultValue?: string\n\t/** Change event handler */\n\tonChange?: (value: string) => void\n\t/** Read-only mode */\n\treadOnly?: boolean\n\t/** Layout mode: 'inline' renders tokens in a single flow, 'block' stacks each token as its own row.\n\t * @default 'inline'\n\t */\n\tlayout?: 'inline' | 'block'\n\t/** Enable drag interaction on block rows. Only effective when layout='block'.\n\t * @default false\n\t */\n\tdraggable?: boolean | DraggableConfig\n}\n\nexport function MarkedInput<TMarkProps = MarkProps, TOverlayProps extends CoreOption['overlay'] = OverlayProps>(\n\tprops: MarkedInputProps<TMarkProps, TOverlayProps>\n) {\n\tconst [store] = useState(() => {\n\t\tconst nextStore = new Store()\n\t\tnextStore.props.set(props)\n\t\treturn nextStore\n\t})\n\n\tuseLayoutEffect(() => {\n\t\tstore.props.set(props)\n\t})\n\n\tuseLayoutEffect(() => {\n\t\tstore.lifecycle.mounted()\n\t\treturn () => store.lifecycle.unmounted()\n\t}, [])\n\n\tuseImperativeHandle(props.ref, () => store.handler, [store])\n\n\treturn (\n\t\t<StoreContext value={store}>\n\t\t\t<Container />\n\t\t\t<OverlayRenderer />\n\t\t</StoreContext>\n\t)\n}","import type {MarkController} from '@markput/core'\nimport {MarkController as CoreMarkController} from '@markput/core'\nimport {useMemo} from 'react'\n\nimport {useTokenContext} from '../providers/TokenContext'\nimport {useMarkput} from './useMarkput'\n\nexport const useMark = (): MarkController => {\n\tconst {store, token} = useTokenContext()\n\tconst readOnly = useMarkput(s => s.props.readOnly)\n\tif (token.type !== 'mark') throw new Error('useMark must be called within a mark token context')\n\n\treturn useMemo(() => CoreMarkController.fromToken(store, token), [store, token, readOnly])\n}","import type {MarkInfo} from '@markput/core'\nimport {findToken} from '@markput/core'\n\nimport {useTokenContext} from '../providers/TokenContext'\n\nexport const useMarkInfo = (): MarkInfo => {\n\tconst {store, token} = useTokenContext()\n\tif (token.type !== 'mark') throw new Error('useMarkInfo must be called within a mark token context')\n\n\tconst index = store.parsing.index()\n\tconst path = index.pathFor(token)\n\tif (!path) throw new Error('Mark token is not indexed')\n\tconst address = index.addressFor(path)\n\tif (!address) throw new Error('Mark token path is stale')\n\n\tconst info = findToken(store.parsing.tokens(), token)\n\treturn {\n\t\taddress,\n\t\tdepth: info?.depth ?? 0,\n\t\thasNestedMarks: token.children.some(child => child.type === 'mark'),\n\t\tkey: index.key(path),\n\t}\n}"],"mappings":"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"}