{"mappings":"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","names":["Combobox","input","list","tabInsertsSuggestions","defaultFirstOption","scrollIntoViewOptions","event","keyboardBindings","trackComposition","commitWithElement","_a","visible","indexDiff","focusEl","els","focusIndex","indexOfItem","newIndex","target","el","fireSelectEvent","combobox","commit","fireCommitEvent","detail","boundary","query","text","key","cursor","multiWord","lookBackIndex","lastMatchPosition","keyIndex","pre","CustomHTMLElement","InputStyleCloneUpdateEvent","CloneRegistry","InputStyleCloneElement","_InputStyleCloneElement","#styleObserver","#updateStyles","#resizeObserver","#requestUpdateLayout","#inputRef","#container","input","clone","#updateText","#usingInput","#onDocumentScrollOrResize","#onInput","#input","fn","#xOffset","#yOffset","#updateLayout","inputStyle","inputRect","cloneRect","#isLayoutUpdating","prop","propertiesToCopy","event","e","InputRange","_InputRange","#inputElement","#startOffset","#endOffset","element","startOffset","endOffset","selectionStart","selectionEnd","offset","#clampOffset","toStart","#createCloneRange","#styleClone","#cloneElement","range","textNode","states","TextExpander","expander","match","menu","_a","_b","Combobox","position","caretRect","targetPosition","currentPosition","delta","currentStyle","target","item","beginning","remaining","detail","suffix","value","found","providers","provide","result","x","TextExpanderElement","keysAttr","keys","multiWordAttr","globalMultiWord","state"],"sources":["../esm/npm/@github/text-expander-element@2.8.0/node_modules/@github/combobox-nav/dist/index.js","../esm/npm/@github/text-expander-element@2.8.0/node_modules/@github/text-expander-element/dist/index.js"],"sourcesContent":["export default class Combobox {\n    constructor(input, list, { tabInsertsSuggestions, defaultFirstOption, scrollIntoViewOptions } = {}) {\n        this.input = input;\n        this.list = list;\n        this.tabInsertsSuggestions = tabInsertsSuggestions !== null \u0026\u0026 tabInsertsSuggestions !== void 0 ? tabInsertsSuggestions : true;\n        this.defaultFirstOption = defaultFirstOption !== null \u0026\u0026 defaultFirstOption !== void 0 ? defaultFirstOption : false;\n        this.scrollIntoViewOptions = scrollIntoViewOptions !== null \u0026\u0026 scrollIntoViewOptions !== void 0 ? scrollIntoViewOptions : { block: 'nearest', inline: 'nearest' };\n        this.isComposing = false;\n        if (!list.id) {\n            list.id = `combobox-${Math.random().toString().slice(2, 6)}`;\n        }\n        this.ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\n        this.keyboardEventHandler = event =\u003e keyboardBindings(event, this);\n        this.compositionEventHandler = event =\u003e trackComposition(event, this);\n        this.inputHandler = this.clearSelection.bind(this);\n        input.setAttribute('role', 'combobox');\n        input.setAttribute('aria-controls', list.id);\n        input.setAttribute('aria-expanded', 'false');\n        input.setAttribute('aria-autocomplete', 'list');\n        input.setAttribute('aria-haspopup', 'listbox');\n    }\n    destroy() {\n        this.clearSelection();\n        this.stop();\n        this.input.removeAttribute('role');\n        this.input.removeAttribute('aria-controls');\n        this.input.removeAttribute('aria-expanded');\n        this.input.removeAttribute('aria-autocomplete');\n        this.input.removeAttribute('aria-haspopup');\n    }\n    start() {\n        this.input.setAttribute('aria-expanded', 'true');\n        this.input.addEventListener('compositionstart', this.compositionEventHandler);\n        this.input.addEventListener('compositionend', this.compositionEventHandler);\n        this.input.addEventListener('input', this.inputHandler);\n        this.input.addEventListener('keydown', this.keyboardEventHandler);\n        this.list.addEventListener('click', commitWithElement);\n        this.indicateDefaultOption();\n    }\n    stop() {\n        this.clearSelection();\n        this.input.setAttribute('aria-expanded', 'false');\n        this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n        this.input.removeEventListener('compositionend', this.compositionEventHandler);\n        this.input.removeEventListener('input', this.inputHandler);\n        this.input.removeEventListener('keydown', this.keyboardEventHandler);\n        this.list.removeEventListener('click', commitWithElement);\n    }\n    indicateDefaultOption() {\n        var _a;\n        if (this.defaultFirstOption) {\n            (_a = Array.from(this.list.querySelectorAll('[role=\"option\"]:not([aria-disabled=\"true\"])'))\n                .filter(visible)[0]) === null || _a === void 0 ? void 0 : _a.setAttribute('data-combobox-option-default', 'true');\n        }\n    }\n    navigate(indexDiff = 1) {\n        const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n        const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n        const focusIndex = els.indexOf(focusEl);\n        if ((focusIndex === els.length - 1 \u0026\u0026 indexDiff === 1) || (focusIndex === 0 \u0026\u0026 indexDiff === -1)) {\n            this.clearSelection();\n            this.input.focus();\n            return;\n        }\n        let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n        if (focusEl \u0026\u0026 focusIndex \u003e= 0) {\n            const newIndex = focusIndex + indexDiff;\n            if (newIndex \u003e= 0 \u0026\u0026 newIndex \u003c els.length)\n                indexOfItem = newIndex;\n        }\n        const target = els[indexOfItem];\n        if (!target)\n            return;\n        for (const el of els) {\n            el.removeAttribute('data-combobox-option-default');\n            if (target === el) {\n                this.input.setAttribute('aria-activedescendant', target.id);\n                target.setAttribute('aria-selected', 'true');\n                fireSelectEvent(target);\n                target.scrollIntoView(this.scrollIntoViewOptions);\n            }\n            else {\n                el.removeAttribute('aria-selected');\n            }\n        }\n    }\n    clearSelection() {\n        this.input.removeAttribute('aria-activedescendant');\n        for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n            el.removeAttribute('aria-selected');\n        }\n        this.indicateDefaultOption();\n    }\n}\nfunction keyboardBindings(event, combobox) {\n    if (event.shiftKey || event.metaKey || event.altKey)\n        return;\n    if (!combobox.ctrlBindings \u0026\u0026 event.ctrlKey)\n        return;\n    if (combobox.isComposing)\n        return;\n    switch (event.key) {\n        case 'Enter':\n            if (commit(combobox.input, combobox.list)) {\n                event.preventDefault();\n            }\n            break;\n        case 'Tab':\n            if (combobox.tabInsertsSuggestions \u0026\u0026 commit(combobox.input, combobox.list)) {\n                event.preventDefault();\n            }\n            break;\n        case 'Escape':\n            combobox.clearSelection();\n            break;\n        case 'ArrowDown':\n            combobox.navigate(1);\n            event.preventDefault();\n            break;\n        case 'ArrowUp':\n            combobox.navigate(-1);\n            event.preventDefault();\n            break;\n        case 'n':\n            if (combobox.ctrlBindings \u0026\u0026 event.ctrlKey) {\n                combobox.navigate(1);\n                event.preventDefault();\n            }\n            break;\n        case 'p':\n            if (combobox.ctrlBindings \u0026\u0026 event.ctrlKey) {\n                combobox.navigate(-1);\n                event.preventDefault();\n            }\n            break;\n        default:\n            if (event.ctrlKey)\n                break;\n            combobox.clearSelection();\n    }\n}\nfunction commitWithElement(event) {\n    if (!(event.target instanceof Element))\n        return;\n    const target = event.target.closest('[role=\"option\"]');\n    if (!target)\n        return;\n    if (target.getAttribute('aria-disabled') === 'true')\n        return;\n    fireCommitEvent(target, { event });\n}\nfunction commit(input, list) {\n    const target = list.querySelector('[aria-selected=\"true\"], [data-combobox-option-default=\"true\"]');\n    if (!target)\n        return false;\n    if (target.getAttribute('aria-disabled') === 'true')\n        return true;\n    target.click();\n    return true;\n}\nfunction fireCommitEvent(target, detail) {\n    target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true, detail }));\n}\nfunction fireSelectEvent(target) {\n    target.dispatchEvent(new Event('combobox-select', { bubbles: true }));\n}\nfunction visible(el) {\n    return (!el.hidden \u0026\u0026\n        !(el instanceof HTMLInputElement \u0026\u0026 el.type === 'hidden') \u0026\u0026\n        (el.offsetWidth \u003e 0 || el.offsetHeight \u003e 0));\n}\nfunction trackComposition(event, combobox) {\n    combobox.isComposing = event.type === 'compositionstart';\n    const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n    if (!list)\n        return;\n    combobox.clearSelection();\n}\n","import Combobox from '@github/combobox-nav';\n\nconst boundary = /\\s|\\(|\\[/;\nfunction query(text, key, cursor, { multiWord, lookBackIndex, lastMatchPosition } = {\n    multiWord: false,\n    lookBackIndex: 0,\n    lastMatchPosition: null\n}) {\n    let keyIndex = text.lastIndexOf(key, cursor - 1);\n    if (keyIndex === -1)\n        return;\n    if (keyIndex \u003c lookBackIndex)\n        return;\n    if (multiWord) {\n        if (lastMatchPosition != null) {\n            if (lastMatchPosition === keyIndex)\n                return;\n            keyIndex = lastMatchPosition - key.length;\n        }\n        const charAfterKey = text[keyIndex + 1];\n        if (charAfterKey === ' ' \u0026\u0026 cursor \u003e= keyIndex + key.length + 1)\n            return;\n        const newLineIndex = text.lastIndexOf('\\n', cursor - 1);\n        if (newLineIndex \u003e keyIndex)\n            return;\n        const dotIndex = text.lastIndexOf('.', cursor - 1);\n        if (dotIndex \u003e keyIndex)\n            return;\n    }\n    else {\n        const spaceIndex = text.lastIndexOf(' ', cursor - 1);\n        if (spaceIndex \u003e keyIndex)\n            return;\n    }\n    const pre = text[keyIndex - 1];\n    if (pre \u0026\u0026 !boundary.test(pre))\n        return;\n    const queryString = text.substring(keyIndex + key.length, cursor);\n    return {\n        text: queryString,\n        position: keyIndex + key.length\n    };\n}\n\n/**\n * A custom element is implemented as a class which extends HTMLElement (in the\n * case of autonomous elements) or the interface you want to customize (in the\n * case of customized built-in elements).\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\nclass CustomHTMLElement extends HTMLElement {\n}\n\nclass InputStyleCloneUpdateEvent extends Event {\n    constructor() {\n        super(\"update\");\n    }\n}\nconst CloneRegistry = new WeakMap();\n/**\n * Create an element that exactly matches an input pixel-for-pixel and automatically stays in sync with it. This\n * is a non-interactive overlay on to the input and can be used to affect the visual appearance of the input\n * without modifying its behavior. The clone element is hidden by default.\n *\n * This lower level API powers the `InputRange` but provides more advanced functionality including event updates.\n *\n * Emits `update` events whenever anything is recalculated: when the layout changes, when the user scrolls, when the\n * input is updated, etc. This event may be emitted more than once per change.\n *\n * @note There may be cases in which the clone cannot observe changes to the input and fails to automatically update.\n * For example, if the `value` property on the input is written to directly, no `input` event is emitted by the input\n * and the clone does not automatically update. In these cases, `forceUpdate` can be used to manually trigger an update.\n */\n// PRIOR ART: This approach was adapted from the following MIT-licensed sources:\n//  - primer/react (Copyright (c) 2018 GitHub, Inc.): https://github.com/primer/react/blob/a0db832302702b869aa22b0c4049ad9305ef631f/src/drafts/utils/character-coordinates.ts\n//  - component/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/component/textarea-caret-position/blob/b5db7a7e47dd149c2a66276183c69234e4dabe30/index.js\n//  - koddsson/textarea-caret-position (Copyright (c) 2015 Jonathan Ong me@jongleberry.com): https://github.com/koddsson/textarea-caret-position/blob/eba40ec8488eed4d77815f109af22e1d9c0751d3/index.js\nclass InputStyleCloneElement extends CustomHTMLElement {\n    #styleObserver = new MutationObserver(() =\u003e this.#updateStyles());\n    #resizeObserver = new ResizeObserver(() =\u003e this.#requestUpdateLayout());\n    // This class is unique in that it will prevent itself from getting garbage collected because of the subscribed\n    // observers (if never detached). Because of this, we want to avoid preventing the existence of this class from also\n    // preventing the garbage collection of the associated input. This also allows us to automatically detach if the\n    // input gets collected.\n    #inputRef;\n    #container;\n    /**\n     * Get the clone for an input, reusing an existing one if available. This avoids creating unecessary clones, which\n     * have a performance cost due to their high-frequency event-based updates. Because these elements are shared, they\n     * should be mutated with caution.\n     *\n     * Upon initial creation the clone element will automatically be inserted into the DOM and begin observing the\n     * linked input. Only one clone per input can ever exist at a time.\n     * @param input The target input to clone.\n     */\n    static for(input) {\n        let clone = CloneRegistry.get(input);\n        if (!clone) {\n            clone = new InputStyleCloneElement();\n            clone.connect(input);\n            CloneRegistry.set(input, clone);\n        }\n        return clone;\n    }\n    /**\n     * Connect this instance to a target input element and insert this instance into the DOM in the correct location.\n     *\n     * NOTE: calling the static `for` method is nearly always preferable as it will reuse an existing clone if available.\n     * However, if reusing clones is problematic (ie, if the clone needs to be mutated), a clone can be constructed\n     * directly with `new InputStyleCloneElement()` and then bound to an input and inserted into the DOM with\n     * `clone.connect(target)`.\n     */\n    connect(input) {\n        this.#inputRef = new WeakRef(input);\n        // We want position:absolute so it doesn't take space in the layout, but that doesn't work with display:table-cell\n        // used in the HTMLInputElement approach. So we need a wrapper.\n        this.#container = document.createElement(\"div\");\n        this.#container.style.position = \"absolute\";\n        this.#container.style.pointerEvents = \"none\";\n        input.after(this.#container);\n        this.#container.appendChild(this);\n    }\n    /**\n     * Force a recalculation. Will emit an `update` event. This is typically not needed unless the input has changed in\n     * an unobservable way, eg by directly writing to the `value` property.\n     */\n    forceUpdate() {\n        this.#updateStyles();\n        this.#updateText();\n    }\n    /** @private */\n    connectedCallback() {\n        this.#usingInput((input) =\u003e {\n            this.style.pointerEvents = \"none\";\n            this.style.userSelect = \"none\";\n            this.style.overflow = \"hidden\";\n            this.style.display = \"block\";\n            // Important not to use display:none which would not render the content at all\n            this.style.visibility = \"hidden\";\n            if (input instanceof HTMLTextAreaElement) {\n                this.style.whiteSpace = \"pre-wrap\";\n                this.style.wordWrap = \"break-word\";\n            }\n            else {\n                this.style.whiteSpace = \"nowrap\";\n                // text in single-line inputs is vertically centered\n                this.style.display = \"table-cell\";\n                this.style.verticalAlign = \"middle\";\n            }\n            this.setAttribute(\"aria-hidden\", \"true\");\n            this.#updateStyles();\n            this.#updateText();\n            this.#styleObserver.observe(input, {\n                attributeFilter: [\n                    \"style\",\n                    \"dir\", // users can right-click in some browsers to change the text direction dynamically\n                ],\n            });\n            this.#resizeObserver.observe(input);\n            document.addEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n            window.addEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n            // capture so this happens first, so other things can respond to `input` events after this data updates\n            input.addEventListener(\"input\", this.#onInput, { capture: true });\n        });\n    }\n    /** @private */\n    disconnectedCallback() {\n        this.#container?.remove();\n        this.#styleObserver.disconnect();\n        this.#resizeObserver.disconnect();\n        document.removeEventListener(\"scroll\", this.#onDocumentScrollOrResize, { capture: true });\n        window.removeEventListener(\"resize\", this.#onDocumentScrollOrResize, { capture: true });\n        // Can't use `usingInput` here since that could infinitely recurse\n        const input = this.#input;\n        if (input) {\n            input.removeEventListener(\"input\", this.#onInput, { capture: true });\n            CloneRegistry.delete(input);\n        }\n    }\n    // --- private ---\n    get #input() {\n        return this.#inputRef?.deref();\n    }\n    /** Perform `fn` using the `input` if it is still available. If not, clean up the clone instead. */\n    #usingInput(fn) {\n        const input = this.#input;\n        if (!input)\n            return this.remove();\n        return fn(input);\n    }\n    /** Current relative x-adjustment in pixels, executed via CSS transform. */\n    #xOffset = 0;\n    /** Current relative y-adjustment in pixels, executed via CSS transform. */\n    #yOffset = 0;\n    /**\n     * Update only geometric properties without recalculating styles. Typically call `#requestUpdateLayout` instead to\n     * only update once per animation frame.\n     */\n    #updateLayout() {\n        // This runs often, so keep it as fast as possible! Avoid all unecessary updates.\n        this.#usingInput((input) =\u003e {\n            const inputStyle = window.getComputedStyle(input);\n            this.style.height = inputStyle.height;\n            this.style.width = inputStyle.width;\n            // Immediately re-adjust for browser inconsistencies in scrollbar handling, if necessary\n            if (input.clientHeight !== this.clientHeight)\n                this.style.height = `calc(${inputStyle.height} + ${input.clientHeight - this.clientHeight}px)`;\n            if (input.clientWidth !== this.clientWidth)\n                this.style.width = `calc(${inputStyle.width} + ${input.clientWidth - this.clientWidth}px)`;\n            // Position on top of the input\n            const inputRect = input.getBoundingClientRect();\n            const cloneRect = this.getBoundingClientRect();\n            this.#xOffset = this.#xOffset + inputRect.left - cloneRect.left;\n            this.#yOffset = this.#yOffset + inputRect.top - cloneRect.top;\n            this.style.transform = `translate(${this.#xOffset}px, ${this.#yOffset}px)`;\n            this.scrollTop = input.scrollTop;\n            this.scrollLeft = input.scrollLeft;\n            this.dispatchEvent(new InputStyleCloneUpdateEvent());\n        });\n    }\n    #isLayoutUpdating = false;\n    /** Request a layout update. Will only happen once per animation frame, to avoid unecessary updates. */\n    #requestUpdateLayout() {\n        if (this.#isLayoutUpdating)\n            return;\n        this.#isLayoutUpdating = true;\n        requestAnimationFrame(() =\u003e {\n            this.#updateLayout();\n            this.#isLayoutUpdating = false;\n        });\n    }\n    /** Update the styles of the clone based on the styles of the input, then request a layout update. */\n    #updateStyles() {\n        this.#usingInput((input) =\u003e {\n            const inputStyle = window.getComputedStyle(input);\n            for (const prop of propertiesToCopy)\n                this.style[prop] = inputStyle[prop];\n            this.#requestUpdateLayout();\n        });\n    }\n    /**\n     * Update the text content of the clone based on the text content of the input. Triggers a layout update in case the\n     * text update caused scrolling.\n     */\n    #updateText() {\n        this.#usingInput((input) =\u003e {\n            this.textContent = input.value;\n            // This is often unecessary on a pure text update, but text updates could potentially cause layout updates like\n            // scrolling or resizing. And we run the update on _every frame_ when scrolling, so this isn't that expensive.\n            // We don't requestUpdateLayout here because this one should happen synchronously, so that clients can react\n            // within their own `input` event handlers.\n            this.#updateLayout();\n        });\n    }\n    #onInput = () =\u003e this.#updateText();\n    #onDocumentScrollOrResize = (event) =\u003e {\n        this.#usingInput((input) =\u003e {\n            if (event.target === document ||\n                event.target === window ||\n                (event.target instanceof Node \u0026\u0026 event.target.contains(input)))\n                this.#requestUpdateLayout();\n        });\n    };\n}\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -\u003e padding),\n// so we have to list every single property explicitly.\nconst propertiesToCopy = [\n    // RTL / vertical writing modes support:\n    \"direction\",\n    \"writingMode\",\n    \"unicodeBidi\",\n    \"textOrientation\",\n    \"boxSizing\",\n    \"borderTopWidth\",\n    \"borderRightWidth\",\n    \"borderBottomWidth\",\n    \"borderLeftWidth\",\n    \"borderStyle\",\n    \"paddingTop\",\n    \"paddingRight\",\n    \"paddingBottom\",\n    \"paddingLeft\",\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n    \"fontStyle\",\n    \"fontVariant\",\n    \"fontWeight\",\n    \"fontStretch\",\n    \"fontSize\",\n    \"fontSizeAdjust\",\n    \"lineHeight\",\n    \"fontFamily\",\n    \"textAlign\",\n    \"textTransform\",\n    \"textIndent\",\n    \"textDecoration\",\n    \"letterSpacing\",\n    \"wordSpacing\",\n    \"tabSize\",\n    \"MozTabSize\",\n];\n// Inspired by https://github.com/github/catalyst/blob/dc284dcf4f82329a9cac5c867462a8fa529b6c40/src/register.ts\ntry {\n    customElements.define(\"input-style-clone\", InputStyleCloneElement);\n}\ncatch (e) {\n    // Throws DOMException with NotSupportedError if already defined\n    if (!(e instanceof DOMException \u0026\u0026 e.name === \"NotSupportedError\"))\n        throw e;\n}\n\nclass InputRange {\n    #inputElement;\n    #startOffset;\n    #endOffset;\n    /**\n     * Construct a new `InputRange`.\n     * @param element The target input element that contains the content for the range.\n     * @param startOffset The inclusive 0-based start index for the range. Will be adjusted to fit in the input contents.\n     * @param endOffset The exclusive 0-based end index for the range. Will be adjusted to fit in the input contents.\n     */\n    constructor(element, startOffset = 0, endOffset = startOffset) {\n        this.#inputElement = element;\n        this.#startOffset = startOffset;\n        this.#endOffset = endOffset;\n    }\n    /**\n     * Create a new range from the current user selection. If the input is not focused, the range will just be the start\n     * of the input (offsets `0` to `0`).\n     *\n     * This can be used to get the caret coordinates: if the resulting range is `collapsed`, the location of the\n     * `getBoundingClientRect` will be the location of the caret caret (note, however, that the width will be `0` in\n     * this case).\n     */\n    static fromSelection(input) {\n        const { selectionStart, selectionEnd } = input;\n        return new InputRange(input, selectionStart ?? undefined, selectionEnd ?? undefined);\n    }\n    /** Returns true if the start is equal to the end of this range. */\n    get collapsed() {\n        return this.startOffset === this.endOffset;\n    }\n    /** Always returns the containing input element. */\n    get commonAncestorContainer() {\n        return this.#inputElement;\n    }\n    /** Always returns the containing input element. */\n    get endContainer() {\n        return this.#inputElement;\n    }\n    /** Always returns the containing input element. */\n    get startContainer() {\n        return this.#inputElement;\n    }\n    get startOffset() {\n        return this.#startOffset;\n    }\n    get endOffset() {\n        return this.#endOffset;\n    }\n    /** Update the inclusive start offset. Will be adjusted to fit within the content size. */\n    setStartOffset(offset) {\n        this.#startOffset = this.#clampOffset(offset);\n    }\n    /** Update the exclusive end offset. Will be adjusted to fit within the content size. */\n    setEndOffset(offset) {\n        this.#endOffset = this.#clampOffset(offset);\n    }\n    /**\n     * Collapse this range to one side.\n     * @param toStart If `true`, will collapse to the start side. Otherwise, will collapse to the end.\n     */\n    collapse(toStart = false) {\n        if (toStart)\n            this.setEndOffset(this.startOffset);\n        else\n            this.setStartOffset(this.endOffset);\n    }\n    /** Returns a `DocumentFragment` containing a new `Text` node containing the content in the range. */\n    cloneContents() {\n        return this.#createCloneRange().cloneContents();\n    }\n    /** Create a copy of this range. */\n    cloneRange() {\n        return new InputRange(this.#inputElement, this.startOffset, this.endOffset);\n    }\n    /**\n     * Obtain one rect that contains the entire contents of the range. If the range spans multiple lines, this box will\n     * contain all pieces of the range but may also contain some space outside the range.\n     * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n     */\n    getBoundingClientRect() {\n        return this.#createCloneRange().getBoundingClientRect();\n    }\n    /**\n     * Obtain the rects that contain contents of this range. If the range spans multiple lines, there will be multiple\n     * bounding boxes. These boxes can be used, for example, to draw a highlight over the range.\n     * @see https://iansan5653.github.io/dom-input-range/demos/playground/\n     */\n    getClientRects() {\n        return this.#createCloneRange().getClientRects();\n    }\n    /** Get the contents of the range as a string. */\n    toString() {\n        return this.#createCloneRange().toString();\n    }\n    /**\n     * Get the underlying `InputStyleClone` instance powering these calculations. This can be used to listen for\n     * updates to trigger layout recalculation.\n     */\n    getStyleClone() {\n        return this.#styleClone;\n    }\n    // --- private ---\n    get #styleClone() {\n        return InputStyleCloneElement.for(this.#inputElement);\n    }\n    get #cloneElement() {\n        return this.#styleClone;\n    }\n    #clampOffset(offset) {\n        return Math.max(0, Math.min(offset, this.#inputElement.value.length));\n    }\n    #createCloneRange() {\n        // It's tempting to create a single Range and reuse it across the lifetime of the class. However, this wouldn't be\n        // accurate because the contents of the input can change and the contents of the range would become stale. So we\n        // must create a new range every time we need it.\n        const range = document.createRange();\n        const textNode = this.#cloneElement.childNodes[0];\n        if (textNode) {\n            range.setStart(textNode, this.startOffset);\n            range.setEnd(textNode, this.endOffset);\n        }\n        return range;\n    }\n}\n\nconst states = new WeakMap();\nclass TextExpander {\n    constructor(expander, input) {\n        this.expander = expander;\n        this.input = input;\n        this.combobox = null;\n        this.menu = null;\n        this.match = null;\n        this.justPasted = false;\n        this.lookBackIndex = 0;\n        this.oninput = this.onInput.bind(this);\n        this.onpaste = this.onPaste.bind(this);\n        this.onkeydown = this.onKeydown.bind(this);\n        this.oncommit = this.onCommit.bind(this);\n        this.onmousedown = this.onMousedown.bind(this);\n        this.onblur = this.onBlur.bind(this);\n        this.interactingWithList = false;\n        input.addEventListener('paste', this.onpaste);\n        input.addEventListener('input', this.oninput);\n        input.addEventListener('keydown', this.onkeydown);\n        input.addEventListener('blur', this.onblur);\n    }\n    destroy() {\n        this.input.removeEventListener('paste', this.onpaste);\n        this.input.removeEventListener('input', this.oninput);\n        this.input.removeEventListener('keydown', this.onkeydown);\n        this.input.removeEventListener('blur', this.onblur);\n    }\n    dismissMenu() {\n        if (this.deactivate()) {\n            this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n        }\n    }\n    activate(match, menu) {\n        var _a, _b;\n        if (this.input !== document.activeElement \u0026\u0026 this.input !== ((_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement)) {\n            return;\n        }\n        this.deactivate();\n        this.menu = menu;\n        if (!menu.id)\n            menu.id = `text-expander-${Math.floor(Math.random() * 100000).toString()}`;\n        this.expander.append(menu);\n        this.combobox = new Combobox(this.input, menu);\n        this.expander.dispatchEvent(new Event('text-expander-activate'));\n        this.positionMenu(menu, match.position);\n        this.combobox.start();\n        menu.addEventListener('combobox-commit', this.oncommit);\n        menu.addEventListener('mousedown', this.onmousedown);\n        this.combobox.navigate(1);\n    }\n    positionMenu(menu, position) {\n        const caretRect = new InputRange(this.input, position).getBoundingClientRect();\n        const targetPosition = { left: caretRect.left, top: caretRect.top + caretRect.height };\n        const currentPosition = menu.getBoundingClientRect();\n        const delta = {\n            left: targetPosition.left - currentPosition.left,\n            top: targetPosition.top - currentPosition.top\n        };\n        if (delta.left !== 0 || delta.top !== 0) {\n            const currentStyle = getComputedStyle(menu);\n            menu.style.left = currentStyle.left ? `calc(${currentStyle.left} + ${delta.left}px)` : `${delta.left}px`;\n            menu.style.top = currentStyle.top ? `calc(${currentStyle.top} + ${delta.top}px)` : `${delta.top}px`;\n        }\n    }\n    deactivate() {\n        const menu = this.menu;\n        if (!menu || !this.combobox)\n            return false;\n        this.expander.dispatchEvent(new Event('text-expander-deactivate'));\n        this.menu = null;\n        menu.removeEventListener('combobox-commit', this.oncommit);\n        menu.removeEventListener('mousedown', this.onmousedown);\n        this.combobox.destroy();\n        this.combobox = null;\n        menu.remove();\n        return true;\n    }\n    onCommit({ target }) {\n        var _a;\n        const item = target;\n        if (!(item instanceof HTMLElement))\n            return;\n        if (!this.combobox)\n            return;\n        const match = this.match;\n        if (!match)\n            return;\n        const beginning = this.input.value.substring(0, match.position - match.key.length);\n        const remaining = this.input.value.substring(match.position + match.text.length);\n        const detail = { item, key: match.key, value: null, continue: false };\n        const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-value', { cancelable: true, detail }));\n        if (canceled)\n            return;\n        if (!detail.value)\n            return;\n        let suffix = (_a = this.expander.getAttribute('suffix')) !== null \u0026\u0026 _a !== void 0 ? _a : ' ';\n        if (detail.continue) {\n            suffix = '';\n        }\n        const value = `${detail.value}${suffix}`;\n        this.input.value = beginning + value + remaining;\n        const cursor = beginning.length + value.length;\n        this.deactivate();\n        this.input.focus({\n            preventScroll: true\n        });\n        this.input.selectionStart = cursor;\n        this.input.selectionEnd = cursor;\n        if (!detail.continue) {\n            this.lookBackIndex = cursor;\n            this.match = null;\n        }\n        this.expander.dispatchEvent(new CustomEvent('text-expander-committed', { cancelable: false, detail: { input: this.input } }));\n    }\n    onBlur() {\n        if (this.interactingWithList) {\n            this.interactingWithList = false;\n            return;\n        }\n        this.deactivate();\n    }\n    onPaste() {\n        this.justPasted = true;\n    }\n    async onInput() {\n        if (this.justPasted) {\n            this.justPasted = false;\n            return;\n        }\n        const match = this.findMatch();\n        if (match) {\n            this.match = match;\n            const menu = await this.notifyProviders(match);\n            if (!this.match)\n                return;\n            if (menu) {\n                this.activate(match, menu);\n            }\n            else {\n                this.deactivate();\n            }\n        }\n        else {\n            this.match = null;\n            this.deactivate();\n        }\n    }\n    findMatch() {\n        const cursor = this.input.selectionEnd || 0;\n        const text = this.input.value;\n        if (cursor \u003c= this.lookBackIndex) {\n            this.lookBackIndex = cursor - 1;\n        }\n        for (const { key, multiWord } of this.expander.keys) {\n            const found = query(text, key, cursor, {\n                multiWord,\n                lookBackIndex: this.lookBackIndex,\n                lastMatchPosition: this.match ? this.match.position : null\n            });\n            if (found) {\n                return { text: found.text, key, position: found.position };\n            }\n        }\n    }\n    async notifyProviders(match) {\n        const providers = [];\n        const provide = (result) =\u003e providers.push(result);\n        const canceled = !this.expander.dispatchEvent(new CustomEvent('text-expander-change', { cancelable: true, detail: { provide, text: match.text, key: match.key } }));\n        if (canceled)\n            return;\n        const all = await Promise.all(providers);\n        const fragments = all.filter(x =\u003e x.matched).map(x =\u003e x.fragment);\n        return fragments[0];\n    }\n    onMousedown() {\n        this.interactingWithList = true;\n    }\n    onKeydown(event) {\n        if (event.key === 'Escape') {\n            this.match = null;\n            if (this.deactivate()) {\n                this.lookBackIndex = this.input.selectionEnd || this.lookBackIndex;\n                event.stopImmediatePropagation();\n                event.preventDefault();\n            }\n        }\n    }\n}\nclass TextExpanderElement extends HTMLElement {\n    get keys() {\n        const keysAttr = this.getAttribute('keys');\n        const keys = keysAttr ? keysAttr.split(' ') : [];\n        const multiWordAttr = this.getAttribute('multiword');\n        const multiWord = multiWordAttr ? multiWordAttr.split(' ') : [];\n        const globalMultiWord = multiWord.length === 0 \u0026\u0026 this.hasAttribute('multiword');\n        return keys.map(key =\u003e ({ key, multiWord: globalMultiWord || multiWord.includes(key) }));\n    }\n    set keys(value) {\n        this.setAttribute('keys', value);\n    }\n    connectedCallback() {\n        const input = this.querySelector('input[type=\"text\"], textarea');\n        if (!(input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement))\n            return;\n        const state = new TextExpander(this, input);\n        states.set(this, state);\n    }\n    disconnectedCallback() {\n        const state = states.get(this);\n        if (!state)\n            return;\n        state.destroy();\n        states.delete(this);\n    }\n    dismiss() {\n        const state = states.get(this);\n        if (!state)\n            return;\n        state.dismissMenu();\n    }\n}\n\nif (!window.customElements.get('text-expander')) {\n    window.TextExpanderElement = TextExpanderElement;\n    window.customElements.define('text-expander', TextExpanderElement);\n}\n\nexport { TextExpanderElement as default };\n"],"version":3}
