@diplodoc/transform 4.77.1 → 4.77.3
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/dist/css/_yfm-only.css.map +1 -1
- package/dist/css/_yfm-only.min.css.map +1 -1
- package/dist/css/base.css.map +1 -1
- package/dist/css/base.min.css.map +1 -1
- package/dist/css/print.css.map +1 -1
- package/dist/css/yfm.css.map +1 -1
- package/dist/css/yfm.min.css.map +1 -1
- package/dist/js/yfm.js +27 -23
- package/dist/js/yfm.js.map +3 -3
- package/dist/js/yfm.min.js +3 -3
- package/dist/js/yfm.min.js.map +3 -3
- package/lib/plugins/code.js +4 -3
- package/lib/plugins/code.js.map +1 -1
- package/package.json +4 -4
- package/src/transform/plugins/code.ts +4 -2
package/dist/js/yfm.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../node_modules/get-root-node-polyfill/index.js", "../../node_modules/@diplodoc/cut-extension/src/runtime/const.ts", "../../node_modules/@diplodoc/cut-extension/src/plugin/const.ts", "../../node_modules/@diplodoc/cut-extension/src/runtime/controller.ts", "../../node_modules/@diplodoc/cut-extension/src/runtime/index.ts", "../../node_modules/@diplodoc/tabs-extension/src/common.ts", "../../node_modules/@diplodoc/tabs-extension/src/runtime/utils.ts", "../../node_modules/@diplodoc/tabs-extension/src/runtime/TabsController.ts", "../../node_modules/@diplodoc/tabs-extension/src/runtime/index.ts", "../../src/js/polyfill.js", "../../src/js/utils.ts", "../../src/js/code.ts", "../../src/js/tooltip/constant.ts", "../../src/js/tooltip/utils.ts", "../../src/js/tooltip/tooltip.ts", "../../src/js/constant.ts", "../../src/js/anchor.ts", "../../src/js/inline-code/index.ts", "../../src/js/term/utils.ts", "../../src/js/term/index.ts", "../../src/js/wide-mode/constants.ts", "../../src/js/wide-mode/icons/expand.ts", "../../src/js/wide-mode/icons/close.ts", "../../src/js/wide-mode/modal.ts", "../../src/js/wide-mode/apply.ts", "../../src/js/wide-mode/index.ts", "../../src/js/patch.ts"],
|
|
4
|
-
"sourcesContent": ["'use strict';\n\n// Node getRootNode(optional GetRootNodeOptions options);\n\n/**\n * Returns the context object\u2019s shadow-including root if options\u2019s composed is true.\n * Returns the context object\u2019s root otherwise.\n *\n * The root of an object is itself, if its parent is null, or else it is the root of its parent.\n *\n * The shadow-including root of an object is its root\u2019s host\u2019s shadow-including root,\n * if the object\u2019s root is a shadow root, and its root otherwise.\n *\n * https://dom.spec.whatwg.org/#dom-node-getrootnode\n *\n * @memberof Node.prototype\n * @param {!Object} [opt = {}] - Options.\n * @param {!boolean} [opt.composed] - See above description.\n * @returns {!Node} The root node.\n */\nfunction getRootNode(opt) {\n var composed = typeof opt === 'object' && Boolean(opt.composed);\n\n return composed ? getShadowIncludingRoot(this) : getRoot(this);\n}\n\nfunction getShadowIncludingRoot(node) {\n var root = getRoot(node);\n\n if (isShadowRoot(root)) {\n return getShadowIncludingRoot(root.host);\n }\n\n return root;\n}\n\nfunction getRoot(node) {\n if (node.parentNode != null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\nfunction isShadowRoot(node) {\n return node.nodeName === '#document-fragment' && node.constructor.name === 'ShadowRoot';\n}\n\nif (typeof module === 'object' && module.exports) {\n module.exports = getRootNode;\n}\n", "export const GLOBAL_KEY = 'yfm_cut';\n\nexport const Selector = {\n CUT: '.yfm .yfm-cut',\n TITLE: '.yfm .yfm-cut-title',\n CONTENT: '.yfm .yfm-cut-content',\n};\n", "export const ENV_FLAG_NAME = 'has-yfm-cut';\n\nexport const TokenType = {\n Cut: 'yfm_cut',\n CutOpen: 'yfm_cut_open',\n CutClose: 'yfm_cut_close',\n Title: 'yfm_cut_title',\n TitleOpen: 'yfm_cut_title_open',\n TitleClose: 'yfm_cut_title_close',\n Content: 'yfm_cut_content',\n ContentOpen: 'yfm_cut_content_open',\n ContentClose: 'yfm_cut_content_close',\n} as const;\n\nexport const ClassNames = {\n Cut: 'yfm-cut',\n Title: 'yfm-cut-title',\n Content: 'yfm-cut-content',\n Highlight: 'yfm-cut-highlight',\n} as const;\n", "import {ClassNames} from '../plugin/const';\n\nexport class YfmCutController {\n private disposers: Function[] = [];\n\n constructor() {\n this.disposers.push(this.init());\n }\n\n init() {\n let mouseEvent = false;\n const keepMouse = () => {\n mouseEvent = true;\n };\n const amendMouse = () => {\n mouseEvent = false;\n };\n const onFocus = (event: Event) => {\n if (isSummary(event.target) && !mouseEvent) {\n this.focusActiveCut(event.target);\n }\n };\n\n document.addEventListener('mousedown', keepMouse);\n document.addEventListener('mouseup', amendMouse);\n document.addEventListener('focus', onFocus, true);\n\n return () => {\n document.removeEventListener('mousedown', keepMouse);\n document.removeEventListener('mouseup', amendMouse);\n document.removeEventListener('focus', onFocus, true);\n };\n }\n\n dispose() {\n for (const disposer of this.disposers) {\n disposer();\n }\n }\n\n private focusActiveCut(summary: HTMLElement) {\n const cutNode = summary.parentNode;\n if (!isDetails(cutNode)) {\n return;\n }\n\n let node: HTMLElement | null = cutNode;\n while (node) {\n if (isDetails(node)) {\n node.open = true;\n }\n node = node.parentElement;\n }\n\n setTimeout(() => {\n cutNode.classList.add(ClassNames.Highlight);\n }, 70);\n\n setTimeout(() => {\n cutNode.classList.remove(ClassNames.Highlight);\n }, 1000);\n }\n}\n\nfunction isDetails(element: unknown): element is HTMLDetailsElement {\n return (\n (element as HTMLElement)?.tagName?.toLowerCase() === 'details' &&\n (element as HTMLElement)?.classList.contains(ClassNames.Cut)\n );\n}\n\nfunction isSummary(element: unknown): element is HTMLElement {\n return (\n (element as HTMLElement)?.tagName?.toLowerCase() === 'summary' &&\n (element as HTMLElement)?.classList.contains(ClassNames.Title)\n );\n}\n", "import {GLOBAL_KEY} from './const';\nimport {YfmCutController} from './controller';\nimport './styles/cut.scss';\n\nif (typeof window !== 'undefined' && !window[GLOBAL_KEY]) {\n window[GLOBAL_KEY] = new YfmCutController();\n}\n\ndeclare global {\n interface Window {\n [GLOBAL_KEY]: YfmCutController;\n }\n}\n", "/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "/**\n * Event target considering shadow DOM (composedPath()[0] or fallback to target).\n * @param event - DOM event\n * @returns Target element\n */\nexport const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\n/**\n * True if the event target is a custom element (or missing), so we skip tab handling.\n * @param event - DOM event\n * @returns Whether to ignore\n */\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\n/**\n * Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.\n * @param element - Starting element\n * @returns Scrollable parent or undefined\n */\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\n/** Position and scroll values used to restore scroll after tab switch. */\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\n/**\n * Offset of element relative to scrollable parent and parent's scroll position.\n * @param element - Child element\n * @param scrollableParent - Scroll container\n * @returns Offset and scroll values\n */\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import type {SelectedTabEvent, Tab} from '../common';\nimport type {ElementOffset} from './utils';\n\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n TabsVariants,\n} from '../common';\n\nimport {\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\n/**\n * Escape value for use in a CSS attribute selector (e.g. group id).\n * @param value - Raw attribute value.\n * @returns Escaped string safe for use inside [attr=\"...\"].\n */\nfunction escapeCssAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Find tab elements by group and key without putting key in a selector (keys may contain %, spaces, etc.).\n * @param doc - Document to query.\n * @param group - Group id.\n * @param key - Tab key (data-tabs-key value).\n * @returns Matching tab elements.\n */\nfunction findTabsByGroupAndKey(doc: Document, group: string, key: string): Element[] {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]`,\n );\n const result: Element[] = [];\n containers.forEach((container) => {\n container.querySelectorAll(Selector.TAB).forEach((tab) => {\n if (tab.getAttribute(TAB_DATA_KEY) === key) {\n result.push(tab);\n }\n });\n });\n return result;\n}\n\n/** Options for selectTabById (e.g. scroll the selected tab into view). */\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\n/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\n/** Controller options: whether to persist selection to localStorage and/or URL query. */\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\n/**\n * DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage\n * and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].\n */\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n }\n\n /**\n * Update controller options (e.g. enable persistence after init).\n * @param options - Partial options to merge\n * @returns void\n */\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n /**\n * Subscribe to tab switch events.\n * @param handler - Callback on tab switch\n * @returns Unsubscribe function\n */\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n /**\n * Select tab by data-diplodoc-id and optionally scroll it into view.\n * @param id - data-diplodoc-id value\n * @param options - e.g. scrollToElement\n * @returns void\n */\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n /**\n * Programmatically select a tab by { group, key, variant }.\n * @param tab - Tab descriptor\n * @returns void\n */\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n /**\n * Apply saved state: select each tab in tabsHistory (e.g. after navigation).\n * @param tabsHistory - Group -> { key, variant } map\n * @returns void\n */\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n /**\n * Read persisted tab state from localStorage (key: tabsHistory).\n * @returns Parsed TabsHistory\n */\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n /**\n * Parse tab state from URL search params (tabs=group_key or group_key_variant).\n * @returns Parsed TabsHistory\n */\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n\n tabConfigs.forEach((config) => {\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n let variant = TabsVariants.Regular;\n if (splitConfig.length === 3) {\n variant = splitConfig[2] as TabsVariants;\n }\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n const keyWithSpaces = key;\n tabsHistory[group] = {key: keyWithSpaces, variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).map(([group, {key, variant}]) => {\n if (variant === TabsVariants.Regular) {\n return `${group}_${key}`;\n }\n return `${group}_${key}_${variant}`;\n });\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n /**\n * Filter tabsHistory to only groups present on the current page.\n * @param tabsHistory - Full history\n * @returns Filtered TabsHistory\n */\n getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n /**\n * Call after route/page change so persistence uses only groups on the current page.\n * @returns void\n */\n onPageChanged(): void {\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n /**\n * List of tab group ids found in the document.\n * @returns Array of group ids\n */\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n /**\n * Clear saved tab state from localStorage and URL.\n * @returns void\n */\n clearTabsPreferred(): void {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n let tabs = findTabsByGroupAndKey(this._document, group, key);\n if (isForced) {\n tabs = tabs.filter(\n (el) => (el as HTMLElement).getAttribute(TAB_FORCED_OPEN) === 'true',\n );\n }\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "/**\n * Tabs runtime entry: creates a single TabsController for the document and attaches it to window\n * under GLOBAL_SYMBOL so that React and other consumers can access it. Imports SCSS for tab styles.\n */\nimport {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n", "import getRootNode from 'get-root-node-polyfill';\n\nif (typeof document !== 'undefined') {\n // matches polyfill for old edge\n (function (e) {\n const matches =\n e.matches ||\n e.matchesSelector ||\n e.webkitMatchesSelector ||\n e.mozMatchesSelector ||\n e.msMatchesSelector ||\n e.oMatchesSelector;\n\n if (matches) {\n e.matches = e.matchesSelector = matches;\n } else {\n e.matches = e.matchesSelector = function matches(selector) {\n const rootNode = e.getRootNode ? e.getRootNode() : getRootNode.call(e);\n const matches = rootNode.querySelectorAll(selector);\n const th = this;\n return Array.prototype.some.call(matches, (e) => {\n return e === th;\n });\n };\n }\n // eslint-disable-next-line no-undef\n })(Element.prototype);\n}\n", "export const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\nexport const copyToClipboard = async (text: string) => {\n if (!text) {\n return;\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText) {\n return navigator.clipboard.writeText(text);\n }\n\n const textarea = document.createElement('textarea');\n textarea.setAttribute('style', 'position: absolute; left: 1000%');\n textarea.textContent = text;\n document.body.append(textarea);\n\n textarea.select();\n document.execCommand('copy');\n\n document.body.removeChild(textarea);\n};\n", "import {copyToClipboard, getEventTarget, isCustom} from './utils';\n\nconst COPY_BUTTON_SELECTOR = '.yfm-clipboard-button';\nconst WRAP_BUTTON_SELECTOR = '.yfm-wrapping-button';\nconst FLOATING_CONTAINER_SELECTOR = '.yfm-code-floating-container';\nconst SELECTED_WRAP_BUTTON = 'g-button_selected';\n\nfunction notifySuccess(svgButton: HTMLElement | null) {\n if (!svgButton) {\n return;\n }\n\n const id = svgButton.getAttribute('data-animation');\n\n // @ts-expect-error\n const icon = svgButton.getRootNode().getElementById(`visibileAnimation-${id}`);\n\n if (!icon) {\n return;\n }\n\n icon.beginElement();\n}\n\nfunction buttonCopyFn(target: HTMLElement) {\n const button = target.closest<HTMLElement>(COPY_BUTTON_SELECTOR);\n const container = button?.closest<HTMLElement>(FLOATING_CONTAINER_SELECTOR);\n const code = container?.querySelector<HTMLElement>('pre code');\n\n if (!button || !container || !code) {\n return;\n }\n\n // Strip line-number decorations (class-based, no semantic alternative).\n const clone = code.cloneNode(true) as HTMLElement;\n\n clone.querySelectorAll('.yfm-line-number').forEach((el) => el.remove());\n let textContent = clone.textContent ?? '';\n\n // Strip prompt prefix from each line using the raw value stored in data-prompt.\n // This avoids any dependency on how (or whether) the prompt is wrapped in the DOM.\n // Leading whitespace before the prompt is preserved so indented commands keep\n // their indentation level in the copied text.\n const promptValue = code.dataset.prompt;\n if (promptValue) {\n const prefix = promptValue + ' ';\n textContent = textContent\n .split('\\n')\n .map((line) => {\n const trimmed = line.trimStart();\n const leadingWs = line.slice(0, line.length - trimmed.length);\n if (trimmed.startsWith(prefix)) {\n return leadingWs + trimmed.slice(prefix.length);\n }\n if (trimmed === promptValue) {\n return leadingWs;\n }\n return line;\n })\n .join('\\n');\n }\n\n copyToClipboard(textContent.trim()).then(() => {\n notifySuccess(container.querySelector('.yfm-clipboard-icon'));\n\n setTimeout(() => target.blur(), 1500);\n });\n}\n\nfunction buttonWrapFn(target: HTMLElement) {\n const button = target.closest<HTMLElement>(WRAP_BUTTON_SELECTOR);\n const container = button?.closest<HTMLElement>(FLOATING_CONTAINER_SELECTOR);\n const code = container?.querySelector<HTMLElement>('pre code');\n if (!button || !container || !code) {\n return;\n }\n const hasWrap = code.classList.toggle('wrap');\n\n button.classList.toggle(SELECTED_WRAP_BUTTON, hasWrap);\n button.setAttribute('aria-pressed', String(hasWrap));\n\n setTimeout(() => target.blur(), 500);\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('click', (event) => {\n if (isCustom(event)) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (target.closest(COPY_BUTTON_SELECTOR)) {\n buttonCopyFn(target);\n } else if (target.closest(WRAP_BUTTON_SELECTOR)) {\n buttonWrapFn(target);\n }\n });\n}\n", "import type {OffsetValues, Side, SideObject} from './types';\n\nexport const PAGE_CONTAINER_SELECTOR = '.dc-doc-page__content';\n\nexport const TOOLTIP_BASE_CLASS = 'yfm yfm-tooltip';\n\nexport const TOOLTIP_OPEN_CLASS = 'open';\n\nexport const TOOLTIP_DATA_ATTR = 'data-tooltip-id';\n\nexport const TOOLTIP_LIVE_REGION_CLASS = 'yfm-tooltip-live-region';\n\nexport const DEFAULT_OFFSET_VALUES: OffsetValues = {mainAxis: 5};\n\nexport const OPPOSITE_SIDES: Record<Side, Side> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nexport const DEFAULT_SIDE_OBJECT: SideObject = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n};\n", "import type {\n Alignment,\n Coords,\n ElementRect,\n OffsetValues,\n Placement,\n Side,\n SideObject,\n} from './types';\n\nimport {DEFAULT_SIDE_OBJECT, OPPOSITE_SIDES} from './constant';\n\nfunction isVerticalSide(side: Side): boolean {\n return side === 'top' || side === 'bottom';\n}\n\nfunction createSideObject(value: Partial<SideObject> | number = 0): SideObject {\n if (typeof value === 'number') {\n return {top: value, bottom: value, left: value, right: value};\n }\n\n return {...DEFAULT_SIDE_OBJECT, ...value};\n}\n\nfunction parsePlacement(placement: Placement): {side: Side; alignment?: Alignment} {\n const [side, alignment] = placement.split('-') as [Side, Alignment | undefined];\n\n return {side, alignment};\n}\n\nfunction getOppositeSide(side: Side): Side {\n return OPPOSITE_SIDES[side];\n}\n\nfunction flipPlacement(placement: Placement): Placement {\n const {side, alignment} = parsePlacement(placement);\n const opposite = getOppositeSide(side);\n\n return (alignment ? `${opposite}-${alignment}` : opposite) as Placement;\n}\n\nfunction getOverflow(tooltip: ElementRect, coords: Coords, viewport: ElementRect): SideObject {\n const rect = updateRect(tooltip, {top: coords.y, left: coords.x});\n\n return detectOverflow(viewport, rect, 5);\n}\n\nfunction shouldFlip(overflow: SideObject, flippedOverflow: SideObject, side: Side): boolean {\n const opposite = getOppositeSide(side);\n\n return overflow[side] > 0 && flippedOverflow[opposite] < overflow[side];\n}\n\nexport function computePosition(\n reference: ElementRect,\n tooltip: ElementRect,\n viewport: ElementRect,\n placement: Placement,\n offset: OffsetValues,\n isRtl: boolean,\n flip = true,\n): {coords: Coords; placement: Placement} {\n const coords = computeCoordsFromPlacement(reference, tooltip, offset, placement, isRtl);\n\n if (!flip) {\n return {coords, placement};\n }\n\n const overflow = getOverflow(tooltip, coords, viewport);\n const {side} = parsePlacement(placement);\n\n if (overflow[side] <= 0) {\n return {coords, placement};\n }\n\n const flipped = flipPlacement(placement);\n const flippedCoords = computeCoordsFromPlacement(reference, tooltip, offset, flipped, isRtl);\n const flippedOverflow = getOverflow(tooltip, flippedCoords, viewport);\n\n if (shouldFlip(overflow, flippedOverflow, side)) {\n return {coords: flippedCoords, placement: flipped};\n }\n\n return {coords, placement};\n}\n\nexport function generateId() {\n const random = Math.random().toString(36).substring(2, 6);\n const now = Date.now().toString(36);\n\n return `${random}${now}`;\n}\n\nexport function createRect(\n params: Pick<ElementRect, 'top' | 'left' | 'width' | 'height'>,\n): ElementRect {\n return {\n ...params,\n right: params.left + params.width,\n bottom: params.top + params.height,\n };\n}\n\nexport function updateRect(rect: ElementRect, params: Partial<ElementRect>): ElementRect {\n return createRect({\n top: params.top ?? rect.top,\n left: params.left ?? rect.left,\n width: params.width ?? rect.width,\n height: params.height ?? rect.height,\n });\n}\n\nexport function getViewportRect(): ElementRect {\n const {documentElement, body} = document;\n\n const scrollTop = window.scrollY || documentElement.scrollTop || body.scrollTop;\n const scrollLeft = window.scrollX || documentElement.scrollLeft || body.scrollLeft;\n\n const clientTop = documentElement.clientTop || body.clientTop || 0;\n const clientLeft = documentElement.clientLeft || body.clientLeft || 0;\n\n return createRect({\n top: Math.round(scrollTop - clientTop),\n left: Math.round(scrollLeft - clientLeft),\n width: document.body.clientWidth,\n height: document.body.clientHeight,\n });\n}\n\nexport function getElementRect(element: HTMLElement): ElementRect {\n const viewport = getViewportRect();\n const box = element.getBoundingClientRect();\n\n return createRect({\n top: Math.round(box.top + viewport.top),\n left: Math.round(box.left + viewport.left),\n width: box.width,\n height: box.height,\n });\n}\n\nexport function computeAxisOffset(offset: OffsetValues, side: Side, isRtl?: boolean): Coords {\n const {mainAxis = 0, crossAxis = 0} = offset;\n\n const isVertical = isVerticalSide(side);\n const mainDirection = side === 'top' || side === 'left' ? -1 : 1;\n const crossDirection = isRtl && isVertical ? -1 : 1;\n\n const mainOffset = mainAxis * mainDirection;\n const crossOffset = crossAxis * crossDirection;\n\n if (isVertical) {\n return {x: crossOffset, y: mainOffset};\n }\n\n return {x: mainOffset, y: crossOffset};\n}\n\nexport function computeCoordsFromPlacement(\n reference: ElementRect,\n tooltip: ElementRect,\n offset: OffsetValues,\n placement: Placement,\n isRtl: boolean,\n) {\n const {side, alignment} = parsePlacement(placement);\n const isVertical = isVerticalSide(side);\n const alignmentAxis = isVertical ? 'x' : 'y';\n const alignLength = alignmentAxis === 'y' ? 'height' : 'width';\n\n const centerX = reference.left + reference.width / 2 - tooltip.width / 2;\n const centerY = reference.top + reference.height / 2 - tooltip.height / 2;\n const alignmentOffset = reference[alignLength] / 2 - tooltip[alignLength] / 2;\n\n const coords: Coords = {x: reference.left, y: reference.top};\n\n switch (side) {\n case 'top': {\n coords.x = centerX;\n coords.y = reference.top - tooltip.height;\n break;\n }\n\n case 'bottom': {\n coords.x = centerX;\n coords.y = reference.top + reference.height;\n break;\n }\n\n case 'right': {\n coords.x = reference.left + reference.width;\n coords.y = centerY;\n break;\n }\n\n case 'left': {\n coords.x = reference.left - tooltip.width;\n coords.y = centerY;\n break;\n }\n }\n\n switch (alignment) {\n case 'start': {\n coords[alignmentAxis] -= alignmentOffset * (isRtl && isVertical ? -1 : 1);\n break;\n }\n\n case 'end': {\n coords[alignmentAxis] += alignmentOffset * (isRtl && isVertical ? -1 : 1);\n break;\n }\n }\n\n const axisOffset = computeAxisOffset(offset, side, isRtl);\n\n coords.x += axisOffset.x;\n coords.y += axisOffset.y;\n\n return coords;\n}\n\nexport function convertToRelativeToOffsetParentRect(rect: ElementRect, offsetParent: HTMLElement) {\n const offsetRect = getElementRect(offsetParent);\n\n return createRect({\n top: rect.top - offsetRect.top + offsetParent.offsetTop,\n left: rect.left - offsetRect.left + offsetParent.offsetLeft,\n width: rect.width,\n height: rect.height,\n });\n}\n\nexport function detectOverflow(\n boundary: ElementRect,\n element: ElementRect,\n padding: Partial<SideObject> | number = 0,\n): SideObject {\n const {top, bottom, left, right} = createSideObject(padding);\n\n return {\n top: boundary.top - element.top + top,\n bottom: element.bottom - boundary.bottom + bottom,\n left: boundary.left - element.left + left,\n right: element.right - boundary.right + right,\n };\n}\n", "import type {\n Coords,\n TooltipContext,\n TooltipContextElements,\n TooltipElementOptions,\n TooltipOptions,\n} from './types';\n\nimport {\n DEFAULT_OFFSET_VALUES,\n PAGE_CONTAINER_SELECTOR,\n TOOLTIP_BASE_CLASS,\n TOOLTIP_DATA_ATTR,\n TOOLTIP_LIVE_REGION_CLASS,\n TOOLTIP_OPEN_CLASS,\n} from './constant';\nimport {\n computePosition,\n convertToRelativeToOffsetParentRect,\n createRect,\n generateId,\n getElementRect,\n getViewportRect,\n updateRect,\n} from './utils';\n\ninterface TooltipState {\n currentId: string | null;\n timer: ReturnType<typeof setTimeout> | null;\n unsubscribe: (() => void) | null;\n}\n\nexport function createTooltipFactory(options: TooltipOptions = {}) {\n const {closeDelay = 1_000, additionalClassName} = options;\n let initialized = false;\n let liveRegion: HTMLElement | null = null;\n\n const state: TooltipState = {\n currentId: null,\n timer: null,\n unsubscribe: null,\n };\n\n const getActiveTooltip = () => {\n if (!state.currentId) {\n return null;\n }\n\n return document.getElementById(state.currentId);\n };\n\n const getActiveReference = () => {\n if (!state.currentId) {\n return null;\n }\n\n return getReferenceByTooltipId(state.currentId);\n };\n\n const hide = () => {\n const tooltip = getActiveTooltip();\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.unsubscribe) {\n state.unsubscribe();\n state.unsubscribe = null;\n }\n\n if (tooltip) {\n tooltip.classList.remove(TOOLTIP_OPEN_CLASS);\n detachTooltip(tooltip);\n\n state.currentId = null;\n }\n\n if (liveRegion) {\n liveRegion.textContent = '';\n }\n };\n\n const show = (reference: HTMLElement, text: string) => {\n hide();\n\n const tooltip = createTooltipElement({className: additionalClassName});\n const update = updateTooltipPosition.bind(null, options, reference, tooltip);\n\n state.currentId = tooltip.id;\n\n attachTooltip(tooltip, reference, text);\n\n if (liveRegion) {\n liveRegion.textContent = text;\n }\n\n state.unsubscribe = subscribeToScroll(reference, update);\n\n tooltip.classList.add(TOOLTIP_OPEN_CLASS);\n\n update();\n\n if (closeDelay > 0) {\n state.timer = setTimeout(hide, closeDelay);\n }\n };\n\n const handleUpdate = () => {\n const activeTooltip = getActiveTooltip();\n const activeReference = getActiveReference();\n\n if (activeTooltip && !activeReference) {\n hide();\n return;\n }\n\n if (activeTooltip && activeReference) {\n updateTooltipPosition(options, activeReference, activeTooltip);\n }\n };\n\n const init = () => {\n if (!initialized) {\n initialized = true;\n\n liveRegion = document.createElement('div');\n liveRegion.className = TOOLTIP_LIVE_REGION_CLASS;\n liveRegion.setAttribute('aria-live', 'assertive');\n document.body.appendChild(liveRegion);\n window.addEventListener('scroll', handleUpdate);\n window.addEventListener('resize', handleUpdate);\n }\n };\n\n const cleanup = () => {\n if (initialized) {\n initialized = false;\n\n window.removeEventListener('scroll', handleUpdate);\n window.removeEventListener('resize', handleUpdate);\n }\n };\n\n return {\n get visible() {\n return Boolean(state.currentId);\n },\n getActiveReference,\n show,\n hide,\n init,\n cleanup,\n };\n}\n\nfunction createTooltipElement(options: TooltipElementOptions) {\n const {className} = options;\n\n const id = generateId();\n const tooltip = document.createElement('div');\n\n tooltip.id = id;\n tooltip.className = className ? `${TOOLTIP_BASE_CLASS} ${className}` : TOOLTIP_BASE_CLASS;\n\n return tooltip;\n}\n\nfunction attachTooltip(tooltip: HTMLElement, reference: HTMLElement, text: string) {\n const container = document.querySelector(PAGE_CONTAINER_SELECTOR) || document.body;\n\n reference.setAttribute(TOOLTIP_DATA_ATTR, tooltip.id);\n container.appendChild(tooltip);\n tooltip.textContent = text;\n}\n\nfunction detachTooltip(tooltip: HTMLElement) {\n if (tooltip.id) {\n const reference = getReferenceByTooltipId(tooltip.id);\n\n reference?.removeAttribute(TOOLTIP_DATA_ATTR);\n }\n\n tooltip.remove();\n}\n\nfunction getReferenceByTooltipId(id: string) {\n return document.querySelector<HTMLElement>(`[${TOOLTIP_DATA_ATTR}=\"${id}\"]`);\n}\n\nfunction subscribeToScroll(reference: HTMLElement, update: () => void) {\n const scrollableElement = getParentScrollableElement(reference);\n\n scrollableElement.addEventListener('scroll', update);\n\n return () => {\n scrollableElement.removeEventListener('scroll', update);\n };\n}\n\nfunction getParentScrollableElement(target: HTMLElement) {\n const closestScrollableParent = target.closest('table') || target.closest('code');\n\n return closestScrollableParent || target.parentElement || document.body;\n}\n\nfunction createTooltipContext(\n referenceElement: HTMLElement,\n tooltipElement: HTMLElement,\n): TooltipContext | null {\n const tooltipParent = tooltipElement.parentElement;\n\n if (!tooltipParent) {\n return null;\n }\n\n const elements: TooltipContextElements = {\n reference: referenceElement,\n tooltip: tooltipElement,\n offsetParent: tooltipParent,\n };\n\n const viewport = getViewportRect();\n const reference = getElementRect(referenceElement);\n const {width, height} = tooltipElement.getBoundingClientRect();\n\n return {\n isRtl: document.dir === 'rtl',\n viewport,\n reference,\n tooltip: createRect({top: 0, left: 0, width, height}),\n elements,\n };\n}\n\nfunction updateTooltipPosition(\n options: TooltipOptions,\n referenceElement: HTMLElement,\n tooltipElement: HTMLElement,\n) {\n const context = createTooltipContext(referenceElement, tooltipElement);\n\n if (!context) {\n return;\n }\n\n const coords = getTooltipCoords(context, options);\n\n tooltipElement.style.top = `${coords.y}px`;\n tooltipElement.style.left = `${coords.x}px`;\n}\n\nfunction getTooltipCoords(context: TooltipContext, options: TooltipOptions): Coords {\n const {placement = 'bottom-start', offset = DEFAULT_OFFSET_VALUES, flip = true} = options;\n const {reference, tooltip, viewport, isRtl} = context;\n\n const {coords} = computePosition(reference, tooltip, viewport, placement, offset, isRtl, flip);\n\n const rect = updateRect(tooltip, {top: coords.y, left: coords.x});\n const relativeRect = convertToRelativeToOffsetParentRect(rect, context.elements.offsetParent);\n\n return {\n x: relativeRect.left,\n y: relativeRect.top,\n };\n}\n", "import type {Lang} from '../transform/typings';\n\nexport const COPIED_LANG_TOKEN: Record<Lang, string> = {\n ru: '\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E',\n en: 'Copied',\n ar: '\u062A\u0645 \u0627\u0644\u0646\u0633\u062E',\n cs: 'Zkop\u00EDrov\u00E1no',\n fr: 'Copi\u00E9',\n es: 'Copiado',\n he: '\u05D4\u05D5\u05E2\u05EA\u05E7',\n bg: '\u041A\u043E\u043F\u0438\u0440\u0430\u043D\u043E',\n et: 'Kopeeritud',\n el: '\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5',\n pt: 'Copiado',\n zh: '\u5DF2\u590D\u5236',\n 'zh-tw': '\u5DF2\u8907\u88FD',\n kk: '\u041A\u04E9\u0448\u0456\u0440\u0456\u043B\u0434\u0456',\n tr: 'Kopyaland\u0131',\n uz: 'Nusxalandi',\n};\n", "import type {Lang} from '../transform/typings';\n\nimport {createTooltipFactory} from './tooltip';\nimport {copyToClipboard, getEventTarget, isCustom} from './utils';\nimport {COPIED_LANG_TOKEN} from './constant';\n\nconst ALLOWED_PROTOCOL_RE = /^(?:https?|file):$/;\nconst ANCHOR_BUTTON_SELECTOR = '.yfm-clipboard-anchor';\n\nconst tooltip = createTooltipFactory();\n\nfunction getLink(target: HTMLElement) {\n const href = target.nodeName === 'A' ? (target as HTMLAnchorElement).href : target.dataset.href;\n const link = new URL(href || '', window.location.href);\n\n if (ALLOWED_PROTOCOL_RE.test(link.protocol)) {\n return link.href;\n }\n\n return window.location.href;\n}\n\nif (typeof document !== 'undefined') {\n tooltip.init();\n\n document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !target.matches(ANCHOR_BUTTON_SELECTOR)) {\n return;\n }\n\n const link = getLink(target);\n\n copyToClipboard(link).then(() => {\n const lang = document.documentElement.lang || 'en';\n const tooltipText = COPIED_LANG_TOKEN[lang as Lang] ?? COPIED_LANG_TOKEN.en;\n\n tooltip.show(target, tooltipText);\n });\n });\n}\n", "import type {Lang} from '../../transform/typings';\n\nimport {createTooltipFactory} from '../tooltip';\nimport {copyToClipboard, getEventTarget, isCustom} from '../utils';\nimport {COPIED_LANG_TOKEN} from '../constant';\n\nconst CLASS_INLINE_CODE = 'yfm-clipboard-inline-code';\nconst INLINE_CODE = `.${CLASS_INLINE_CODE}`;\n\nconst tooltip = createTooltipFactory({\n // NOTE: Add additional className for backward capability\n additionalClassName: 'inline_code_tooltip',\n});\n\nexport function inlineCopyFn(target: HTMLElement) {\n const innerText = target.innerText;\n\n if (!innerText) {\n return;\n }\n\n copyToClipboard(innerText).then(() => {\n const lang = document.documentElement.lang || 'en';\n const tooltipText = COPIED_LANG_TOKEN[lang as Lang] ?? COPIED_LANG_TOKEN.en;\n\n tooltip.show(target, tooltipText);\n });\n}\n\nif (typeof document !== 'undefined') {\n tooltip.init();\n\n document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n const inline = target.matches(INLINE_CODE);\n\n if (isCustom(event) || !inline) {\n return;\n }\n\n inlineCopyFn(target);\n });\n\n document.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' && document.activeElement) {\n const activeElement = document.activeElement as HTMLElement;\n\n if (!activeElement.classList.contains(CLASS_INLINE_CODE)) {\n return;\n }\n\n inlineCopyFn(activeElement);\n }\n\n if (event.key === 'Escape' && tooltip.visible) {\n const reference = tooltip.getActiveReference();\n\n tooltip.hide();\n // Set focus back to open button after closing popup\n reference?.focus();\n }\n });\n}\n", "export const Selector = {\n TITLE: '.yfm .yfm-term_title',\n CONTENT: '.yfm .yfm-term_dfn',\n};\nexport const openClass = 'open';\nexport const openDefinitionClass = Selector.CONTENT.replace(/\\./g, '') + ' ' + openClass;\nlet isListenerNeeded = true;\n\nexport function setDefinitionId(definitionElement: HTMLElement, termElement: HTMLElement): void {\n const termId = termElement.getAttribute('id') || Math.random().toString(36).substr(2, 8);\n definitionElement?.setAttribute('term-id', termId);\n}\n\nexport function setDefinitonAriaAttributes(\n definitionElement: HTMLElement,\n termElement: HTMLElement,\n): void {\n const ariaLive = termElement.getAttribute('aria-live') || 'polite';\n definitionElement?.setAttribute('aria-live', ariaLive);\n definitionElement?.setAttribute('aria-modal', 'true');\n}\n\nexport function setDefinitionPosition(\n definitionElement: HTMLElement,\n termElement: HTMLElement,\n): void {\n const {\n x: termX,\n y: termY,\n right: termRight,\n left: termLeft,\n width: termWidth,\n height: termHeight,\n } = termElement.getBoundingClientRect();\n\n const termParent = termParentElement(termElement);\n\n if (!termParent) {\n return;\n }\n\n const {right: termParentRight, left: termParentLeft} = termParent.getBoundingClientRect();\n\n if ((termParentRight < termLeft || termParentLeft > termRight) && !isListenerNeeded) {\n closeDefinition(definitionElement);\n return;\n }\n\n if (isListenerNeeded && termParent) {\n termParent.addEventListener('scroll', termOnResize);\n isListenerNeeded = false;\n }\n\n const relativeX = Number(definitionElement.getAttribute('relativeX'));\n const relativeY = Number(definitionElement.getAttribute('relativeY'));\n\n if (relativeX === termX && relativeY === termY) {\n return;\n }\n\n definitionElement.setAttribute('relativeX', String(termX));\n definitionElement.setAttribute('relativeY', String(termY));\n\n const offsetTop = termHeight + 5;\n const definitionParent = definitionElement.parentElement;\n\n if (!definitionParent) {\n return;\n }\n\n const {width: definitionWidth} = definitionElement.getBoundingClientRect();\n const {left: definitionParentLeft} = definitionParent.getBoundingClientRect();\n\n // If definition not fit document change base alignment\n const definitionLeftCoordinate = Number(getCoords(termElement).left);\n const definitionRightCoordinate = definitionWidth + definitionLeftCoordinate;\n\n const definitionOutOfScreenOnLeft = definitionLeftCoordinate - definitionWidth < 0;\n const definitionOutOfScreenOnRight = definitionRightCoordinate > document.body.clientWidth;\n\n const isAlignSwapped = definitionOutOfScreenOnRight || document.dir === 'rtl';\n const fitDefinitionDocument =\n isAlignSwapped && !definitionOutOfScreenOnLeft ? definitionWidth - termWidth : 0;\n const customHeaderTop = getCoords(definitionParent).top - definitionParent.offsetTop;\n const offsetRight = 5;\n const shiftLeft = definitionOutOfScreenOnRight\n ? definitionRightCoordinate - document.body.clientWidth + offsetRight\n : 0;\n const offsetLeft =\n getCoords(termElement).left -\n definitionParentLeft +\n definitionParent.offsetLeft -\n fitDefinitionDocument;\n\n const isShiftLeftNeeded = offsetLeft + definitionWidth >= document.body.clientWidth;\n\n definitionElement.style.top =\n Number(getCoords(termElement).top + offsetTop - customHeaderTop) + 'px';\n definitionElement.style.left = Number(offsetLeft - (isShiftLeftNeeded ? shiftLeft : 0)) + 'px';\n}\n\nfunction termOnResize() {\n const openedDefinition = document.getElementsByClassName(openDefinitionClass)[0] as HTMLElement;\n\n if (!openedDefinition) {\n return;\n }\n const termId = openedDefinition.getAttribute('term-id') || '';\n const termElement = document.getElementById(termId);\n\n if (!termElement) {\n return;\n }\n\n setDefinitionPosition(openedDefinition, termElement);\n}\n\nfunction termParentElement(term: HTMLElement | null) {\n if (!term) {\n return null;\n }\n\n const closestScrollableParent = term.closest('table') || term.closest('code');\n\n return closestScrollableParent || term.parentElement;\n}\n\nexport function openDefinition(target: HTMLElement) {\n const openedDefinition = document.getElementsByClassName(openDefinitionClass)[0] as HTMLElement;\n\n const termId = target.getAttribute('id');\n const termKey = target.getAttribute('term-key');\n const definitionId = `${termKey}_element`;\n\n // Check if term is in modal window\n const isInModal = target.closest('.wide-container');\n\n let definitionElement: HTMLElement | null;\n\n if (isInModal) {\n // Find definition in modal window\n const modalContent = target.closest('.wide-content');\n if (!modalContent) {\n return;\n }\n definitionElement = modalContent.querySelector(`[id=\"${definitionId}\"]`) as HTMLElement;\n } else {\n // Find definition in normal document\n definitionElement = document.getElementById(definitionId);\n }\n\n const isSameTerm = openedDefinition && termId === openedDefinition.getAttribute('term-id');\n if (isSameTerm) {\n closeDefinition(openedDefinition);\n return;\n }\n\n const isTargetDefinitionContent = target.closest(\n [Selector.CONTENT.replace(' ', ''), openClass].join('.'),\n );\n\n if (openedDefinition && !isTargetDefinitionContent) {\n closeDefinition(openedDefinition);\n }\n\n if (!target.matches(Selector.TITLE) || !definitionElement) {\n return;\n }\n\n setDefinitionId(definitionElement, target);\n setDefinitonAriaAttributes(definitionElement, target);\n setDefinitionPosition(definitionElement, target);\n\n definitionElement.classList.toggle(openClass);\n\n trapFocus(definitionElement);\n}\n\nexport function closeDefinition(definition: HTMLElement) {\n definition.classList.remove(openClass);\n\n // Restore the off-screen position declared in CSS so the (still laid-out)\n // definition box does not extend the page's scrollable area. Inline\n // top/left were set by setDefinitionPosition() while the definition was\n // open; without this reset they would keep the box in the document flow.\n definition.style.top = '';\n definition.style.left = '';\n definition.removeAttribute('relativeX');\n definition.removeAttribute('relativeY');\n\n const term = getTermByDefinition(definition);\n const termParent = termParentElement(term);\n\n if (!termParent) {\n return;\n }\n\n termParent.removeEventListener('scroll', termOnResize);\n isListenerNeeded = true;\n}\n\nexport function getCoords(elem: HTMLElement) {\n const box = elem.getBoundingClientRect();\n\n const body = document.body;\n const docEl = document.documentElement;\n\n const scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\n const scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\n\n const clientTop = docEl.clientTop || body.clientTop || 0;\n const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n\n const top = box.top + scrollTop - clientTop;\n const left = box.left + scrollLeft - clientLeft;\n\n return {top: Math.round(top), left: Math.round(left)};\n}\n\nexport function trapFocus(element: HTMLElement) {\n const focusableElements = element.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (firstFocusableElement) {\n firstFocusableElement.focus();\n }\n\n element.addEventListener('keydown', function (e) {\n const isTabPressed = e.key === 'Tab' || e.keyCode === 9;\n if (!isTabPressed) {\n return;\n }\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n lastFocusableElement.focus();\n e.preventDefault();\n }\n } else if (document.activeElement === lastFocusableElement) {\n firstFocusableElement.focus();\n e.preventDefault();\n }\n });\n}\n\nexport function getTermByDefinition(definition: HTMLElement) {\n const termId = definition.getAttribute('term-id');\n\n if (!termId) {\n return null;\n }\n\n // Check if definition is in modal window\n const isInModal = definition.closest('.wide-container');\n\n if (isInModal) {\n // Find term in modal window\n const modalContent = definition.closest('.wide-content');\n if (!modalContent) {\n return null;\n }\n return modalContent.querySelector(`[id=\"${termId}\"]`) as HTMLElement;\n }\n\n // Find term in normal document\n return document.getElementById(termId);\n}\n", "import {getEventTarget, isCustom} from '../utils';\n\nimport {\n closeDefinition,\n getTermByDefinition,\n openClass,\n openDefinition,\n openDefinitionClass,\n setDefinitionPosition,\n} from './utils';\n\nif (typeof document !== 'undefined') {\n document.addEventListener('click', (event) => {\n if (getEventTarget(event) || !isCustom(event)) {\n openDefinition(getEventTarget(event) as HTMLElement);\n }\n });\n\n document.addEventListener('keydown', (event) => {\n const openedDefinition = document.getElementsByClassName(\n openDefinitionClass,\n )[0] as HTMLElement;\n\n if (event.key === 'Enter' && document.activeElement) {\n openDefinition(document.activeElement as HTMLElement);\n }\n\n if (event.key === 'Escape' && openedDefinition) {\n closeDefinition(openedDefinition);\n getTermByDefinition(openedDefinition)?.focus(); // Set focus back to open button after closing popup\n }\n });\n\n window.addEventListener('resize', () => {\n const openedDefinition = document.getElementsByClassName(\n openDefinitionClass,\n )[0] as HTMLElement;\n\n if (!openedDefinition) {\n return;\n }\n\n const termId = openedDefinition.getAttribute('term-id') || '';\n const termElement = document.getElementById(termId);\n\n if (!termElement) {\n openedDefinition.classList.toggle(openClass);\n return;\n }\n\n setDefinitionPosition(openedDefinition, termElement);\n });\n}\n", "export const WIDE_ELEMENTS_SELECTOR = '[wide-content]';\n", "export default `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 16 16\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M7.754 2.004a.75.75 0 0 0 0 1.5h4.75v4.742a.75.75 0 0 0 1.5 0V2.754a.75.75 0 0 0-.75-.75zm.492 11.992a.75.75 0 0 0 0-1.5h-4.75V7.754a.75.75 0 0 0-1.5 0v5.492a.75.75 0 0 0 .75.75z\" clip-rule=\"evenodd\"/></svg>`;\n", "export default `<svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"close-action\"><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M9.46967 9.46967C9.76256 9.17678 10.2374 9.17678 10.5303 9.46967L14 12.9393L17.4697 9.46967C17.7626 9.17678 18.2374 9.17678 18.5303 9.46967C18.8232 9.76256 18.8232 10.2374 18.5303 10.5303L15.0607 14L18.5303 17.4697C18.8232 17.7626 18.8232 18.2374 18.5303 18.5303C18.2374 18.8232 17.7626 18.8232 17.4697 18.5303L14 15.0607L10.5303 18.5303C10.2374 18.8232 9.76256 18.8232 9.46967 18.5303C9.17678 18.2374 9.17678 17.7626 9.46967 17.4697L12.9393 14L9.46967 10.5303C9.17678 10.2374 9.17678 9.76256 9.46967 9.46967Z\" fill=\"var(--g-color-text-primary)\" fillOpacity=\"0.85\"/></svg>`;\n", "import closeIcon from './icons/close';\n\nconst remove = () => {\n if (!window.wideTemplate) {\n return;\n }\n\n window.wideTemplate.style.display = 'none';\n window.wideTemplate.content(undefined);\n};\n\nconst tbodyOf = (node: HTMLElement) => {\n if (node.tagName !== 'TABLE') {\n return undefined;\n }\n\n const elements = Array.from(node.children);\n\n const thead = elements.find((child) => child.tagName === 'THEAD');\n\n if (thead) {\n return undefined;\n }\n\n const tbody = elements.find((child) => child.tagName === 'TBODY');\n\n return tbody;\n};\n\ntype ModalContainer = NonNullable<typeof window.wideTemplate>;\n\n/* @todo refactor to markup with innerHTML @v8tenko */\n\nconst container = () => {\n if (window.wideTemplate) {\n return window.wideTemplate;\n }\n\n const template = document.createElement('div') as ModalContainer;\n template.classList.add('dc-doc-page', 'wide-container');\n\n const overlay = document.createElement('div');\n overlay.classList.add('wide-content-overlay');\n overlay.addEventListener('click', remove);\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('yfm', 'wide-content-wrapper');\n\n const toolbar = document.createElement('div');\n toolbar.classList.add('wide-toolbar');\n\n const close = document.createElement('div');\n close.classList.add('wide-actions');\n close.addEventListener('click', remove);\n close.innerHTML = closeIcon;\n\n const title = document.createElement('p');\n title.classList.add('wide-entity-name');\n\n template.label = (content?: string) => {\n title.innerHTML = content || '';\n };\n\n const content = document.createElement('div');\n content.classList.add('wide-content');\n\n template.content = (target?: Element) => {\n if (typeof target === 'undefined') {\n content.innerHTML = '';\n\n return;\n }\n\n const cloned = target.cloneNode(true) as HTMLElement;\n\n const tbody = tbodyOf(cloned);\n\n /* used to stretch single tbody to 100% */\n tbody?.classList?.add('wide-thead-content');\n\n // Find all term titles in the cloned table\n const termTitles = cloned.querySelectorAll('.yfm-term_title');\n\n // Collect all term definitions that are referenced in the table\n const termDefinitions: HTMLElement[] = [];\n\n termTitles.forEach((termTitle) => {\n const termKey = termTitle.getAttribute('term-key');\n if (termKey) {\n // Find the original definition in the document\n const originalDefinition = document.getElementById(termKey + '_element');\n if (originalDefinition) {\n // Clone the definition\n const clonedDefinition = originalDefinition.cloneNode(true) as HTMLElement;\n termDefinitions.push(clonedDefinition);\n }\n }\n });\n\n // Add all cloned definitions to the content\n content.replaceChildren(cloned, ...termDefinitions);\n };\n\n toolbar.append(title, close);\n wrapper.append(toolbar, content);\n template.append(overlay, wrapper);\n\n template.style.display = 'none';\n document.body.appendChild(template);\n\n window.wideTemplate = template;\n\n return template;\n};\n\nconst render = (content: HTMLElement) => {\n const template = container();\n\n template.label(content.title);\n template.content(content);\n\n template.style.display = 'flex';\n};\n\nexport const modal = {\n render,\n remove,\n};\n", "import {WIDE_ELEMENTS_SELECTOR} from './constants';\nimport expand from './icons/expand';\nimport {modal} from './modal';\n\nconst wrap = (target: HTMLElement) => {\n if (target.parentElement?.classList.contains('wide-element-wrapper')) {\n return;\n }\n\n target.classList.add('wide-inner-element');\n\n const handler = document.createElement('div');\n\n handler.innerHTML = expand;\n handler.classList.add('wide-content-viewer');\n handler.addEventListener('click', () => modal.render(target));\n\n const container = document.createElement('div');\n\n container.classList.add('wide-element-wrapper');\n\n target.before(container);\n\n container.appendChild(target);\n container.appendChild(handler);\n};\n\nexport const applyWideMode = () => {\n const allWideElements = Array.from(\n document.querySelectorAll(WIDE_ELEMENTS_SELECTOR),\n ) as HTMLElement[];\n\n allWideElements.forEach(wrap);\n};\n", "import {applyWideMode} from './apply';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n window.addEventListener('load', applyWideMode);\n}\n", "import {applyWideMode} from './wide-mode/apply';\n\nconst patch = () => {\n applyWideMode();\n};\n\nif (typeof window !== 'undefined') {\n window.patchAfterRender = patch;\n}\n"],
|
|
5
|
-
"mappings": "krBAAAA,GAAAC,GAAA,CAAA,+CAAAC,EAAAC,EAAA,CAAA,aAoBA,SAASC,EAAYC,EAAK,CACxB,IAAIC,EAAW,OAAOD,GAAQ,UAAY,EAAQA,EAAI,SAEtD,OAAOC,EAAWC,EAAuB,IAAI,EAAIC,EAAQ,IAAI,CAC/D,CAEA,SAASD,EAAuBE,EAAM,CACpC,IAAIC,EAAOF,EAAQC,CAAI,EAEvB,OAAIE,EAAaD,CAAI,EACZH,EAAuBG,EAAK,IAAI,EAGlCA,CACT,CAEA,SAASF,EAAQC,EAAM,CACrB,OAAIA,EAAK,YAAc,KACdD,EAAQC,EAAK,UAAU,EAGzBA,CACT,CAEA,SAASE,EAAaF,EAAM,CAC1B,OAAOA,EAAK,WAAa,sBAAwBA,EAAK,YAAY,OAAS,YAC7E,CAEI,OAAON,GAAW,UAAYA,EAAO,UACvCA,EAAO,QAAUC,EACnB,CAAA,CAAA,QClDO,IAAMQ,EAAa,UCcbC,EAAa,CACtB,IAAK,UACL,MAAO,gBACP,QAAS,kBACT,UAAW,mBACf,ECjBaC,EAAN,KAAuB,CAG1B,aAAc,CAFNC,GAAA,KAAA,YAAwB,CAAC,CAAA,EAG7B,KAAK,UAAU,KAAK,KAAK,KAAK,CAAC,CACnC,CAEA,MAAO,CACH,IAAIC,EAAa,GACXC,EAAY,IAAM,CACpBD,EAAa,EACjB,EACME,EAAa,IAAM,CACrBF,EAAa,EACjB,EACMG,EAAWC,GAAiB,CAC1BC,EAAUD,EAAM,MAAM,GAAK,CAACJ,GAC5B,KAAK,eAAeI,EAAM,MAAM,CAExC,EAEA,OAAA,SAAS,iBAAiB,YAAaH,CAAS,EAChD,SAAS,iBAAiB,UAAWC,CAAU,EAC/C,SAAS,iBAAiB,QAASC,EAAS,EAAI,EAEzC,IAAM,CACT,SAAS,oBAAoB,YAAaF,CAAS,EACnD,SAAS,oBAAoB,UAAWC,CAAU,EAClD,SAAS,oBAAoB,QAASC,EAAS,EAAI,CACvD,CACJ,CAEA,SAAU,CACN,QAAWG,KAAY,KAAK,UACxBA,EAAS,CAEjB,CAEQ,eAAeC,EAAsB,CACzC,IAAMC,EAAUD,EAAQ,WACxB,GAAI,CAACE,EAAUD,CAAO,EAClB,OAGJ,IAAIf,EAA2Be,EAC/B,KAAOf,GACCgB,EAAUhB,CAAI,IACdA,EAAK,KAAO,IAEhBA,EAAOA,EAAK,cAGhB,WAAW,IAAM,CACbe,EAAQ,UAAU,IAAIX,EAAW,SAAS,CAC9C,EAAG,EAAE,EAEL,WAAW,IAAM,CACbW,EAAQ,UAAU,OAAOX,EAAW,SAAS,CACjD,EAAG,GAAI,CACX,CACJ,EAEA,SAASY,EAAUC,EAAiD,OAChE,QACKA,EAAAA,GAAAA,KAAAA,OAAAA,EAAyB,UAAzBA,KAAAA,OAAAA,EAAkC,YAAA,KAAkB,YACpDA,GAAAA,KAAAA,OAAAA,EAAyB,UAAU,SAASb,EAAW,GAAA,EAEhE,CAEA,SAASQ,EAAUK,EAA0C,OACzD,QACKA,EAAAA,GAAAA,KAAAA,OAAAA,EAAyB,UAAzBA,KAAAA,OAAAA,EAAkC,YAAA,KAAkB,YACpDA,GAAAA,KAAAA,OAAAA,EAAyB,UAAU,SAASb,EAAW,KAAA,EAEhE,CCxEI,OAAO,OAAW,KAAe,CAAC,OAAOD,CAAU,IACnD,OAAOA,CAAU,EAAI,IAAIE,EAAAA,GAAAA,QCKtB,IAAMa,EAAiB,WACjBC,EAAgB,UAChBC,EAAsB,gBACtBC,EAAsB,eACtBC,EAAmB,SAKnBC,EAAiB,sBACjBC,EAAe,oBACfC,EAAmB,wBACnBC,EAAc,mBACdC,EAA4B,oBAE5BC,EAAkB,uBAKlBC,EAAuB,2BAOvBC,EAAuB,oBAMxBC,GAAAA,IACRA,EAAA,QAAU,UACVA,EAAA,MAAQ,QACRA,EAAA,SAAW,WACXA,EAAA,UAAY,YAJJA,IAAAA,GAAA,CAAA,CAAA,EAwBCC,EAA+B,OAAO,IAAI,cAAc,EC9DxDC,EAAkBtB,GAAiB,CAC5C,IAAMuB,EAAOvB,EAAM,aAAa,EAChC,OAAO,MAAM,QAAQuB,CAAI,GAAKA,EAAK,OAAS,EAAIA,EAAK,CAAC,EAAIvB,EAAM,MACpE,EAOawB,EAAYxB,GAAiB,CACtC,IAAMyB,EAASH,EAAetB,CAAK,EACnC,MAAO,CAACyB,GAAU,CAAEA,EAAuB,OAC/C,EAOaC,EAA8BpB,GACnC,KAAK,IAAIA,EAAQ,aAAeA,EAAQ,YAAY,EAAI,EACjDA,EAGJA,EAAQ,cAAgBoB,EAA2BpB,EAAQ,aAAa,EAAI,OAiB1EqB,EAA8B,CACvCrB,EACAsB,IACgB,CAChB,IAAMC,EAAgBvB,EAAQ,sBAAsB,EAC9CwB,EAAyBF,EAAiB,sBAAsB,EACtE,MAAO,CACH,IAAKC,EAAc,IAAMC,EAAuB,IAChD,KAAMD,EAAc,KAAOC,EAAuB,KAClD,UAAWF,EAAiB,UAC5B,WAAYA,EAAiB,UACjC,CACJ,EChCMG,EAAW,CACb,KAAM,IAAIxB,CAAc,GACxB,SAAU,IAAIG,CAAmB,GACjC,IAAK,IAAIF,CAAa,GACtB,UAAW,IAAIC,CAAmB,GAClC,cAAe,IAAIU,CAAoB,EAC3C,EAOA,SAASa,EAAmBC,EAAuB,CAC/C,OAAOA,EAAM,QAAQ,MAAO,MAAM,EAAE,QAAQ,KAAM,KAAK,CAC3D,CASA,SAASC,EAAsBC,EAAeC,EAAeC,EAAwB,CACjF,IAAMC,EAAaH,EAAI,iBACnB,GAAGJ,EAAS,IAAI,IAAInB,CAAc,KAAKoB,EAAmBI,CAAK,CAAC,IACpE,EACMG,EAAoB,CAAC,EAC3B,OAAAD,EAAW,QAASE,GAAc,CAC9BA,EAAU,iBAAiBT,EAAS,GAAG,EAAE,QAASU,GAAQ,CAClDA,EAAI,aAAa5B,CAAY,IAAMwB,GACnCE,EAAO,KAAKE,CAAG,CAEvB,CAAC,CACL,CAAC,EACMF,CACX,CAwBO,IAAMG,GAAN,KAAqB,CAQxB,YAAYC,EAAoBC,EAA0C,CAAC,EAAG,CAN9E,KAAQ,qBAAqC,IAAI,IAEjD,KAAQ,sBAAkC,CAAC,EAC3C,KAAQ,iBAAmB,GAIvB,KAAK,UAAYD,EACjB,KAAK,SAAW,OAAO,OACnB,CACI,uBAAwB,GACxB,yBAA0B,MAC9B,EACAC,CACJ,EAEA,KAAK,UAAU,iBAAiB,QAAU5C,GAAU,CAChD,IAAMyB,EAASH,EAAetB,CAAK,EAMnC,GAJIA,EAAM,QACN,KAAK,gBAAgBA,EAAM,MAAqB,EAGhDwB,EAASxB,CAAK,EACd,OAGJ,GAAI,KAAK,wBAAwByB,CAAM,EAAG,CACtCA,EAAO,UAAU,OAAOd,CAAgB,EAExC,MACJ,CAEA,GAAI,CAAC,KAAK,kBAAkBc,CAAM,EAC9B,OAGJ,IAAMgB,EAAM,KAAK,0BAA0BhB,CAAM,EAE7CgB,GACA,KAAK,WAAWA,EAAKhB,CAAM,CAEnC,CAAC,EAED,KAAK,UAAU,iBAAiB,UAAYzB,GAAU,CAClD,IAAI6C,EAAuC,KAC3C,OAAQ7C,EAAM,IAAK,CACf,IAAK,YAAa,CACd6C,EAAY,OACZ,KACJ,CACA,IAAK,aAAc,CACfA,EAAY,QACZ,KACJ,CACA,IAAK,UAAW,CACZA,EAAY,OACZ,KACJ,CACA,IAAK,YAAa,CACdA,EAAY,QACZ,KACJ,CACJ,CACA,GAAI,CAACA,EACD,OAGJ,IAAMpB,EAASH,EAAetB,CAAK,EAEnC,GAAIwB,EAASxB,CAAK,GAAK,CAAC,KAAK,kBAAkByB,CAAM,EACjD,OAGJ,GAAM,CAAC,KAAAqB,EAAM,MAAAC,CAAK,EAAI,KAAK,QAAQtB,CAAM,EACnCuB,EAAa,KAAK,0BAA0BvB,CAAM,EAClDwB,EAAkBH,EAAK,UACzB,CAAC,CAAC,IAAAT,CAAG,KAAMW,GAAA,KAAA,OAAAA,EAAY,MAAOX,IAAQW,EAAW,GACrD,EACA,GAAI,CAACA,GAAcF,EAAK,QAAU,GAAKG,IAAoB,GACvD,OAGJ,IAAMC,GACDD,GAAmBJ,IAAc,OAAS,GAAK,GAAKC,EAAK,QAAUA,EAAK,OAE7E,KAAK,UAAUA,EAAKI,CAAQ,CAAC,EAC7BH,EAAMG,CAAQ,EAAE,MAAM,CAC1B,CAAC,CACL,CAOA,UAAUN,EAAyC,CAC/C,KAAK,SAAW,OAAO,OAAO,KAAK,SAAUA,CAAO,CACxD,CAOA,YAAYO,EAAkB,CAC1B,OAAA,KAAK,qBAAqB,IAAIA,CAAO,EAE9B,IAAM,CACT,KAAK,qBAAqB,OAAOA,CAAO,CAC5C,CACJ,CAQA,cAAcC,EAAYR,EAAiC,CACvD,IAAMnB,EAAS,KAAK,UAAU,cAC1B,GAAGM,EAAS,GAAG,IAAIhB,CAAW,KAAKqC,CAAE,IACzC,EAEA,GAAI,CAAC3B,GAAU,CAAC,KAAK,kBAAkBA,CAAM,EACzC,OAGJ,IAAMgB,EAAM,KAAK,0BAA0BhB,CAAM,EAE7CgB,GACA,KAAK,WAAWA,EAAKhB,CAAM,EAG3BmB,GAAA,MAAAA,EAAS,iBACTnB,EAAO,eAAe,CAE9B,CAOA,UAAUgB,EAAU,CAChB,KAAK,WAAWA,CAAG,CACvB,CAOA,YAAYY,EAA0B,CAClC,KAAK,iBAAmB,GACxB,GAAI,CACA,OAAW,CAACjB,EAAOkB,CAAM,IAAK,OAAO,QAAQD,CAAW,EACpD,GAAIjB,EAAO,CACP,IAAMK,EAAM,CAAC,MAAAL,EAAO,GAAGkB,CAAM,EAC7B,KAAK,UAAUb,CAAG,CACtB,CAER,QAAA,CACI,KAAK,iBAAmB,EAC5B,CACJ,CAMA,yBAAuC,CACnC,OAAO,KAAK,MAAM,aAAa,QAAQ,aAAa,GAAK,IAAI,CACjE,CAMA,wBAAsC,CAClC,IAAMY,EAAc,CAAC,EACfE,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC5D,OAAIA,EAAU,IAAI,MAAM,IACEA,EAAU,IAAI,MAAM,GAAK,IACd,MAAM,GAAG,EAE/B,QAASC,GAAW,CAC3B,IAAMC,EAAcD,EAAO,MAAM,GAAG,EAC9B,CAACpB,EAAOC,CAAG,EAAIoB,EACjBC,EAAAA,UAKJ,GAJID,EAAY,SAAW,IACvBC,EAAUD,EAAY,CAAC,GAGvBrB,GAASC,GAAO,OAAO,OAAOjB,CAAY,EAAE,SAASsC,CAAO,EAAG,CAC/D,IAAMC,EAAgBtB,EACtBgB,EAAYjB,CAAK,EAAI,CAAC,IAAKuB,EAAe,QAASD,CAAO,CAC9D,CACJ,CAAC,EAGEL,CACX,CAEA,2BAA2BA,EAA0B,CAC5C,KAAK,SAAS,yBAKf,KAAK,kBAIT,aAAa,QAAQ,cAAe,KAAK,UAAUA,CAAW,CAAC,EACnE,CAEA,yBAAyBA,EAA0B,CAE/C,GAAI,KAAK,iBACL,OAGJ,IAAME,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACtDK,EAAY,OAAO,QAAQP,CAAW,EAAE,IAAI,CAAC,CAACjB,EAAO,CAAC,IAAAC,EAAK,QAAAqB,CAAO,CAAC,IACjEA,IAAY,UACL,GAAGtB,CAAK,IAAIC,CAAG,GAEnB,GAAGD,CAAK,IAAIC,CAAG,IAAIqB,CAAO,EACpC,EAGGE,EAAU,OAAS,EACnBL,EAAU,IAAI,OAAQK,EAAU,KAAK,GAAG,CAAC,EAEzCL,EAAU,OAAO,MAAM,EAI3B,IAAMM,EAAe,QAAQ,OAAS,CAAC,EAGjCC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxCA,EAAI,OAASP,EAAU,SAAS,EAEhC,OAAO,QAAQ,aAAa,CAAC,GAAGM,CAAY,EAAG,SAAS,MAAOC,EAAI,IAAI,CAC3E,CAOA,yBAAyBT,EAAuC,CAC5D,OAAO,OAAO,YACV,OAAO,QAAQA,CAAW,EAAE,OAAO,CAAC,CAACjB,CAAK,IACtC,KAAK,sBAAsB,SAASA,CAAK,CAC7C,CACJ,CACJ,CAMA,eAAsB,CAClB,KAAK,sBAAwB,KAAK,wBAAwB,CAC9D,CAMA,yBAAoC,CAChC,IAAMU,EAAO,KAAK,UAAU,uBAAuBvC,CAAc,EAC3DwD,EAAS,IAAI,IAEnB,OAAA,MAAM,KAAKjB,CAAI,EAAE,QAASL,GAAQ,CAC9B,IAAML,EAAQK,EAAI,aAAa7B,CAAc,EACzCwB,GACA2B,EAAO,IAAI3B,CAAK,CAExB,CAAC,EAEM,MAAM,KAAK2B,CAAM,CAC5B,CAMA,oBAA2B,CACvB,aAAa,WAAW,aAAa,EACrC,KAAK,yBAAyB,CAAC,CAAC,CACpC,CAEQ,WAAWtB,EAAUuB,EAAyB,CAClD,GAAM,CAAC,MAAA5B,EAAO,IAAAC,EAAK,QAAAqB,CAAO,EAAIjB,EAE9B,GAAI,CAACL,EACD,OAGJ,KAAK,iBAAiB,CAAC,MAAAA,EAAO,IAAAC,EAAK,QAAAqB,CAAO,CAAC,EAE3C,IAAM9B,EAAmBoC,GAAatC,EAA2BsC,CAAS,EACpEC,EACFrC,GAAoBD,EAA4BqC,EAAWpC,CAAgB,EAE3D,KAAK,WAAW,CAAC,MAAAQ,EAAO,IAAAC,EAAK,QAAAqB,CAAO,EAAGM,EAAWN,CAAO,EAE3D,IACd,KAAK,mBAAmB,CAAC,MAAAtB,EAAO,IAAAC,EAAK,QAAAqB,CAAO,EAAGM,GAAA,KAAA,OAAAA,EAAW,QAAQ,UAAU,EAExEC,GACA,KAAK,YAAYD,EAAWpC,EAAkBqC,CAAoB,EAG9E,CAEQ,WAAWxB,EAAoBhB,EAAiCiC,EAAuB,CAC3F,OAAQA,EAAS,CACb,IAAA,QACI,OAAO,KAAK,gBAAgBjB,EAAKhB,CAAM,EAE3C,IAAA,YACI,OAAO,KAAK,oBAAoBgB,EAAKhB,CAAM,EAE/C,IAAA,UACI,OAAO,KAAK,kBAAkBgB,CAAG,EAErC,IAAA,WACI,OAAO,KAAK,mBAAmBA,CAAG,EAEtC,QACI,MAAO,EAEf,CACJ,CAEQ,iBAAiBA,EAAoB,CACzC,IAAIY,EAAc,CAAC,EAYnB,OAVI,KAAK,SAAS,yBACdA,EAAc,KAAK,MAAM,aAAa,QAAQ,aAAa,GAAK,IAAI,GAGxEA,EAAYZ,EAAI,KAAK,EAAI,CAAC,IAAKA,EAAI,IAAK,QAASA,EAAI,OAAO,EAExD,KAAK,SAAS,wBACd,KAAK,2BAA2BY,CAAW,EAGvC,KAAK,SAAS,yBAA0B,CAC5C,IAAK,MAAO,CACR,KAAK,yBAAyBA,CAAW,EACzC,KACJ,CACA,IAAK,OAAQ,CACT,KAAK,yBAAyB,KAAK,yBAAyBA,CAAW,CAAC,EACxE,KACJ,CACJ,CACJ,CAEQ,gBAAgBZ,EAAoBhB,EAAiC,CACzE,GAAM,CAAC,MAAAW,EAAO,IAAAC,CAAG,EAAII,EAEf,CAAC,SAAAyB,EAAU,KAAA5E,CAAI,EAAI,KAAK,gBAAgBmC,CAAM,EAEhDqB,EAAOZ,EAAsB,KAAK,UAAWE,EAAOC,CAAG,EACvD6B,IACApB,EAAOA,EAAK,OACPqB,GAAQA,EAAmB,aAAalD,CAAe,IAAM,MAClE,GAGAiD,IACA5E,GAAA,MAAAA,EAAM,gBAAgB2B,CAAAA,GAG1B,IAAImD,EAAU,EAEd,OAAAtB,EAAK,QAASL,GAAQ,CAGlB,IAAM4B,EADO5B,EAAI,WACK,SAEtB,QAAS6B,EAAI,EAAGA,EAAID,EAAS,OAAQC,GAAK,EAAG,CACzC,GAAM,CAACC,EAAOC,CAAO,EAAI,CAACH,EAAS,KAAKC,CAAC,EAAGD,EAAS,KAAKC,EAAI,CAAC,CAAC,EAE1DG,EAAQF,EAAM,SAAS,KAAK,CAAC,EAEnC,GAAIA,IAAU9B,EAAK,CACCgC,EAAM,SAGlBF,EAAM,UAAU,OAAO,QAAQ,EAC/BC,GAAA,MAAAA,EAAS,UAAU,OAAO,QAAA,EAE1BC,EAAM,gBAAgB,SAAS,IAE/BF,EAAM,UAAU,IAAI,QAAQ,EAC5BC,GAAA,MAAAA,EAAS,UAAU,IAAI,QAAA,EAEvBC,EAAM,aAAa,UAAW,MAAM,GAGxC,QACJ,CAEIA,EAAM,aAAa,SAAS,IAC5BF,EAAM,UAAU,OAAO,QAAQ,EAC/BC,GAAA,MAAAA,EAAS,UAAU,OAAO,QAAA,EAE1BC,EAAM,gBAAgB,SAAS,GAGnCL,GACJ,CACJ,CAAC,EAEMA,CACX,CAEQ,kBAAkB3B,EAAoB,CAC1C,GAAM,CAAC,MAAAL,EAAO,IAAAC,CAAG,EAAII,EAEfK,EAAOZ,EAAsB,KAAK,UAAWE,EAAOC,CAAG,EAEzD+B,EAAU,EAEd,OAAAtB,EAAK,QAASxC,GAAY,CACtB,IAAMoE,EAAWpE,EACjB,GAAI,CAAC,KAAK,kBAAkBoE,CAAQ,GAAKA,EAAS,QAAQ,mBAAqB,OAC3E,OAGJN,IAEA,IAAM3B,EAAMnC,EACNqE,EAAUlC,EAAI,WACdmC,EAAgBD,GAAA,KAAA,OAAAA,EAAS,WACzBE,EAAU,MAAM,MAAKF,GAAA,KAAA,OAAAA,EAAS,iBAAiB5C,EAAS,GAAA,IAAQ,CAAC,CAAC,EAClE+C,EAAY,MAAM,MAAKF,GAAA,KAAA,OAAAA,EAAe,WAAY,CAAC,CAAC,EAAE,OAAQvF,GAChEA,EAAK,UAAU,SAASoB,CAAmB,CAC/C,EACMsE,EAAcF,EAAQ,QAAQpC,CAAG,EAEvCoC,EAAQ,QAAQ,CAACpC,EAAK6B,KAAM,CACxB,IAAMU,GAAQF,EAAUR,EAAC,EACnBW,EAAcX,KAAMS,EACpBL,GAAWjC,EAEjBiC,GAAS,QAAQ,iBAAmBO,EAAc,OAAS,QAE3DxC,EAAI,UAAU,OAAO9B,EAAkBsE,CAAW,EAClDxC,EAAI,aAAa,gBAAiBwC,EAAY,SAAS,CAAC,EACxDxC,EAAI,aAAa,WAAYwC,EAAc,IAAM,IAAI,EACrDD,GAAM,UAAU,OAAOrE,EAAkBsE,CAAW,CACxD,CAAC,CACL,CAAC,EAEMb,CACX,CAEQ,mBAAmB3B,EAAoB,CAC3C,GAAM,CAAC,MAAAL,EAAO,IAAAC,CAAG,EAAII,EAEfK,EAAOZ,EAAsB,KAAK,UAAWE,EAAOC,CAAG,EAEzD6C,EAAU,EAEd,OAAApC,EAAK,QAASL,GAAQ,CAClB,IAAM0C,EAAW1C,EAAI,QAAQ,IAAI3B,CAAgB,YAA4B,EAE7E,GAAI,EAACqE,GAAA,MAAAA,EAAU,UACX,OAGJ,IAAMC,EAASD,EAAS,SAAS,KAAK,CAAC,EACjCE,EAAOF,EAAS,SAAS,KAAK,CAAC,EAErCC,GAAA,MAAAA,EAAQ,UAAU,OAAOzE,CAAAA,EAGzB,IAAM2E,EAAe,MAAM,MAAKD,GAAA,KAAA,OAAAA,EAAM,WAAY,CAAC,CAAC,EAAE,QAAQ5C,CAAG,EAAI,EAErE,QAAS6B,EAAI,EAAGA,EAAIa,EAAS,SAAS,OAAQb,IAAK,CAC/C,IAAMiB,EAAOJ,EAAS,SAAS,KAAKb,CAAC,EAC/BkB,EAAWH,GAAA,KAAA,OAAAA,EAAM,SAAS,KAAKf,EAAI,CAAA,EAIzC,GAFAY,IAEII,IAAiBhB,EAAG,CACpBiB,GAAA,MAAAA,EAAM,UAAU,IAAI5E,CAAAA,EACpB6E,EAAS,UAAU,IAAI7E,CAAgB,EAEvCyE,EAAO,UAAY3C,EAAI,UACvB2C,EAAO,UAAU,IAAI,QAAQ,EAE7B,QACJ,CAEAI,EAAS,UAAU,OAAO7E,CAAgB,EAC1C4E,EAAK,UAAU,OAAO5E,CAAgB,CAC1C,CACJ,CAAC,EAEMuE,CACX,CAEQ,oBAAoBzC,EAAoBhB,EAAiC,CAC7E,GAAM,CAAC,MAAAW,EAAO,IAAAC,CAAG,EAAII,EAEfK,EAAOZ,EAAsB,KAAK,UAAWE,EAAOC,CAAG,EAEzD6C,EAAU,EAEd,OAAApC,EAAK,QAASL,GAAQ,CAClB,IAAMgD,EAAYhD,EAAI,QAAQ,IAAI3B,CAAgB,aAA6B,EAE/E,GAAK2E,GAAA,MAAAA,EAAW,SAIhB,QAASnB,EAAI,EAAGA,EAAImB,EAAU,SAAS,OAAQnB,GAAK,EAAG,CACnD,IAAMC,EAAQkB,EAAU,SAAS,KAAKnB,CAAC,EACjCtB,EAAayC,EAAU,SAAS,KAAKnB,EAAI,CAAC,EAIhD,GAFAY,IAEIzC,IAAQ8B,EAAO,CACfA,GAAA,MAAAA,EAAO,UAAU,OAAO5D,CAAAA,EACxBqC,GAAA,MAAAA,EAAY,UAAU,OAAOrC,CAAAA,EAE7B,QACJ,CAEA4D,GAAA,MAAAA,EAAO,UAAU,OAAO5D,CAAAA,EACxBqC,GAAA,MAAAA,EAAY,UAAU,OAAOrC,CAAAA,CACjC,CACJ,CAAC,EAEGc,GAAU,CAAC,KAAK,aAAaA,CAAM,GACnC,WAAW,IAAM,CACbA,EAAO,eAAe,CAAC,MAAO,SAAS,CAAC,CAC5C,CAAC,EAGEyD,CACX,CAEQ,aAAa5E,EAAsB,CACvC,IAAMoF,EAAOpF,EAAQ,sBAAsB,EACrCqF,EAAa,KAAK,IAAI,SAAS,gBAAgB,aAAc,OAAO,WAAW,EAErF,MAAO,EAAED,EAAK,OAAS,GAAKA,EAAK,IAAMC,GAAc,EACzD,CAEQ,gBAAgBlE,EAAqB,CACvB,KAAK,UAAU,iBAAiB,kCAAkC,EAE1E,QAAS4D,GAAS,CACnBA,EAAK,SAAS5D,CAAM,GACrB4D,EAAK,UAAU,OAAO1E,CAAgB,CAE9C,CAAC,CACL,CAEQ,YACJc,EACAG,EACAqC,EACF,CACE,IAAM2B,EAAejE,EAA4BF,EAAQG,CAAgB,EACnEiE,EAAWD,EAAa,IAAM3B,EAAqB,IACnD6B,EAAYF,EAAa,KAAO3B,EAAqB,KACrD8B,EAAiBH,EAAa,UAAY3B,EAAqB,UAC/D+B,EAAkBJ,EAAa,WAAa3B,EAAqB,WACvErC,EAAiB,SACbA,EAAiB,WAAakE,EAAYE,EAC1CpE,EAAiB,UAAYiE,EAAWE,CAC5C,CACJ,CAEQ,gBAAgBtE,EAAsB,CAC1C,GAAI,CAACA,EACD,MAAO,CAAC,EAGZ,GAAIA,EAAO,QAAQ,eACf,MAAO,CAAC,KAAMA,EAAQ,SAAU,EAAI,EAGxC,IAAMnC,EAAOmC,EAAO,QAAQ,oBAAsBA,EAASA,EAAO,cAE5DyC,EAAW,OAAO5E,GAAA,KAAA,OAAAA,EAAM,QAAQ,iBAAmB,YAEzD,MAAO,CAAC,KAAAA,EAAM,SAAA4E,CAAQ,CAC1B,CAEQ,mBAAmBzB,EAAoBwD,EAAqB,CAChE,GAAM,CAAC,MAAA7D,EAAO,IAAAC,EAAK,QAAS6D,CAAK,EAAIzD,EAE/B0D,EAAgB/D,EAAM,WAAWpB,CAAyB,EAC1D,CAAC,IAAAqB,EAAK,QAAS6D,CAAK,EACpBzD,EAEN,KAAK,qBAAqB,QAASU,GAAY,CAC3CA,EAAQ,CAAC,IAAKgD,EAAU,aAAcF,CAAU,CAAC,CACrD,CAAC,CACL,CAEQ,YAAY3F,EAAsB,CACtC,IAAM8F,EAAW9F,EAAQ,QAAQ,IAAIQ,CAAgB,GAAG,EAExD,GAAKsF,EAIL,OAAOA,EAAS,QAAQ,eAC5B,CAEQ,kBAAkB9F,EAAsB,CAC5C,MAAO,CAAA,CAAQ,KAAK,YAAYA,CAAO,CAC3C,CAEQ,wBAAwBmB,EAAqB,CACjD,OAAOA,EAAO,UAAU,SAASP,CAAoB,CACzD,CAEQ,0BAA0BO,EAAiC,CAltBvE,IAAA4E,EAAAC,EAAAC,EAmtBQ,IAAMC,EAAO,KAAK,YAAY/E,CAAM,EAEpC,GAAI+E,IAAS,QAAoB,CAE7B,IAAM/D,EAAMhB,EAAO,QAAQ,oBAAsBA,EAASA,EAAO,cAE3DY,EAAMI,EAAI,QAAQ,YAClBL,GAASiE,EAAA5D,EAAI,QAAQV,EAAS,IAAI,IAAzB,KAAA,OAAAsE,EAA4C,QAAQ,cACnE,OAAOhE,GAAOD,EAAQ,CAAC,MAAAA,EAAO,IAAAC,EAAK,QAAA,OAA2B,EAAI,IACtE,CAEA,GAAImE,IAAS,YAAyBA,IAAS,YAAwB,CACnE,IAAMnE,EAAMZ,EAAO,QAAQ,YACrBW,GAASkE,EAAA7E,EAAO,QAAQM,EAAS,IAAI,IAA5B,KAAA,OAAAuE,EAA+C,QAAQ,cACtE,OAAOjE,GAAOD,EAAQ,CAAC,MAAAA,EAAO,IAAAC,EAAK,QAASmE,CAAI,EAAI,IACxD,CAEA,IAAMnE,EAAMZ,EAAO,QAAQ,YACrBW,GAASmE,EAAA9E,EAAO,QAAQM,EAAS,IAAI,IAA5B,KAAA,OAAAwE,EAA+C,QAAQ,cACtE,OAAOlE,GAAOD,EAAQ,CAAC,MAAAA,EAAO,IAAAC,EAAK,QAAA,SAA6B,EAAI,IACxE,CAEQ,QAAQZ,EAAoE,CAzuBxF,IAAA4E,EAAAC,EA0uBQ,IAAMlE,GAASiE,EAAA5E,EAAO,QAAQM,EAAS,IAAI,IAA5B,KAAA,OAAAsE,EAA+C,QAAQ,cAChEtD,GACFuD,EAAA7E,EAAO,QAAQM,EAAS,QAAQ,IAAhC,KAAA,OAAAuE,EACD,iBAA8BvE,EAAS,GAAA,EAEpCe,EAAc,CAAC,EACrB,OAAAC,EAAM,QAAS0D,GAAU,CACrB,IAAMpE,EAAMoE,GAAA,KAAA,OAAAA,EAAO,QAAQ,YACtBpE,GAKLS,EAAK,KAAK,CACN,MAAAV,EACA,IAAAC,EACA,QAAA,SACJ,CAAC,CACL,CAAC,EAEM,CAAC,KAAAS,EAAM,MAAAC,CAAK,CACvB,CACJ,ECvvBI,OAAO,QAAW,aAAe,OAAO,UAAa,aAAe,CAAC,OAAO1B,CAAa,IACzF,OAAOA,CAAa,EAAI,IAAIqB,GAAe,QAAQ,EAAA,GAAA,ECVvD,IAAAgE,GAAwBC,GAAA/H,GAAA,CAAA,EAEpB,OAAO,UAAa,cAEnB,SAAUgI,EAAG,CACV,IAAMC,EACFD,EAAE,SACFA,EAAE,iBACFA,EAAE,uBACFA,EAAE,oBACFA,EAAE,mBACFA,EAAE,iBAEFC,EACAD,EAAE,QAAUA,EAAE,gBAAkBC,EAEhCD,EAAE,QAAUA,EAAE,gBAAkB,SAAiBE,EAAU,CAEvD,IAAMD,GADWD,EAAE,YAAcA,EAAE,YAAY,EAAIF,GAAA1H,QAAY,KAAK4H,CAAC,GAC5C,iBAAiBE,CAAQ,EAC5CC,EAAK,KACX,OAAO,MAAM,UAAU,KAAK,KAAKF,EAAUD,GAChCA,IAAMG,CAChB,CACL,CAGR,GAAG,QAAQ,SAAS,EC1BjB,IAAMzF,EAAkBtB,GAAiB,CAC5C,IAAMuB,EAAOvB,EAAM,aAAa,EAChC,OAAO,MAAM,QAAQuB,CAAI,GAAKA,EAAK,OAAS,EAAIA,EAAK,CAAC,EAAIvB,EAAM,MACpE,EAEawB,EAAYxB,GAAiB,CACtC,IAAMyB,EAASH,EAAetB,CAAK,EACnC,MAAO,CAACyB,GAAU,CAAEA,EAAuB,OAC/C,EAEauF,EAAkB,MAAOC,GAAiB,CACnD,GAAI,CAACA,EACD,OAGJ,GAAI,UAAU,WAAa,OAAO,UAAU,UAAU,UAClD,OAAO,UAAU,UAAU,UAAUA,CAAI,EAG7C,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,aAAa,QAAS,iCAAiC,EAChEA,EAAS,YAAcD,EACvB,SAAS,KAAK,OAAOC,CAAQ,EAE7BA,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAE3B,SAAS,KAAK,YAAYA,CAAQ,CACtC,EC1BMC,GAAuB,wBACvBC,GAAuB,uBACvBC,GAA8B,+BAC9BC,GAAuB,oBAE7B,SAASC,GAAcC,EAA+B,CAClD,GAAI,CAACA,EACD,OAGJ,IAAMpE,EAAKoE,EAAU,aAAa,gBAAgB,EAG5CC,EAAOD,EAAU,YAAY,EAAE,eAAe,qBAAqBpE,CAAE,EAAE,EAExEqE,GAILA,EAAK,aAAa,CACtB,CAEA,SAASC,GAAajG,EAAqB,CAxB3C,IAAA4E,EAyBI,IAAMsB,EAASlG,EAAO,QAAqB0F,EAAoB,EACzD3E,EAAYmF,GAAA,KAAA,OAAAA,EAAQ,QAAqBN,EAAA,EACzCO,EAAOpF,GAAA,KAAA,OAAAA,EAAW,cAA2B,UAAA,EAEnD,GAAI,CAACmF,GAAU,CAACnF,GAAa,CAACoF,EAC1B,OAIJ,IAAMC,EAAQD,EAAK,UAAU,EAAI,EAEjCC,EAAM,iBAAiB,kBAAkB,EAAE,QAAS1D,GAAOA,EAAG,OAAO,CAAC,EACtE,IAAI2D,GAAczB,EAAAwB,EAAM,cAAN,KAAAxB,EAAqB,GAMjC0B,EAAcH,EAAK,QAAQ,OACjC,GAAIG,EAAa,CACb,IAAMC,EAASD,EAAc,IAC7BD,EAAcA,EACT,MAAM;CAAI,EACV,IAAKG,GAAS,CACX,IAAMC,EAAUD,EAAK,UAAU,EACzBE,EAAYF,EAAK,MAAM,EAAGA,EAAK,OAASC,EAAQ,MAAM,EAC5D,OAAIA,EAAQ,WAAWF,CAAM,EAClBG,EAAYD,EAAQ,MAAMF,EAAO,MAAM,EAE9CE,IAAYH,EACLI,EAEJF,CACX,CAAC,EACA,KAAK;CAAI,CAClB,CAEAjB,EAAgBc,EAAY,KAAK,CAAC,EAAE,KAAK,IAAM,CAC3CP,GAAc/E,EAAU,cAAc,qBAAqB,CAAC,EAE5D,WAAW,IAAMf,EAAO,KAAK,EAAG,IAAI,CACxC,CAAC,CACL,CAEA,SAAS2G,GAAa3G,EAAqB,CACvC,IAAMkG,EAASlG,EAAO,QAAqB2F,EAAoB,EACzD5E,EAAYmF,GAAA,KAAA,OAAAA,EAAQ,QAAqBN,EAAA,EACzCO,EAAOpF,GAAA,KAAA,OAAAA,EAAW,cAA2B,UAAA,EACnD,GAAI,CAACmF,GAAU,CAACnF,GAAa,CAACoF,EAC1B,OAEJ,IAAMS,EAAUT,EAAK,UAAU,OAAO,MAAM,EAE5CD,EAAO,UAAU,OAAOL,GAAsBe,CAAO,EACrDV,EAAO,aAAa,eAAgB,OAAOU,CAAO,CAAC,EAEnD,WAAW,IAAM5G,EAAO,KAAK,EAAG,GAAG,CACvC,CAEI,OAAO,UAAa,aACpB,SAAS,iBAAiB,QAAUzB,GAAU,CAC1C,GAAIwB,EAASxB,CAAK,EACd,OAGJ,IAAMyB,EAASH,EAAetB,CAAK,EAE/ByB,EAAO,QAAQ0F,EAAoB,EACnCO,GAAajG,CAAM,EACZA,EAAO,QAAQ2F,EAAoB,GAC1CgB,GAAa3G,CAAM,CAE3B,CAAC,EC/FE,IAAM6G,GAA0B,wBAE1BC,GAAqB,kBAErBC,GAAqB,OAErBC,EAAoB,kBAEpBC,GAA4B,0BAE5BC,GAAsC,CAAC,SAAU,CAAC,EAElDC,GAAqC,CAC9C,IAAK,SACL,OAAQ,MACR,KAAM,QACN,MAAO,MACX,EAEaC,GAAkC,CAC3C,IAAK,EACL,OAAQ,EACR,KAAM,EACN,MAAO,CACX,ECdA,SAASC,GAAeC,EAAqB,CACzC,OAAOA,IAAS,OAASA,IAAS,QACtC,CAEA,SAASC,GAAiB/G,EAAsC,EAAe,CAC3E,OAAI,OAAOA,GAAU,SACV,CAAC,IAAKA,EAAO,OAAQA,EAAO,KAAMA,EAAO,MAAOA,CAAK,EAGzD,CAAC,GAAG4G,GAAqB,GAAG5G,CAAK,CAC5C,CAEA,SAASgH,EAAeC,EAA2D,CAC/E,GAAM,CAACH,EAAMI,CAAS,EAAID,EAAU,MAAM,GAAG,EAE7C,MAAO,CAAC,KAAAH,EAAM,UAAAI,CAAS,CAC3B,CAEA,SAASC,GAAgBL,EAAkB,CACvC,OAAOH,GAAeG,CAAI,CAC9B,CAEA,SAASM,GAAcH,EAAiC,CACpD,GAAM,CAAC,KAAAH,EAAM,UAAAI,CAAS,EAAIF,EAAeC,CAAS,EAC5CI,EAAWF,GAAgBL,CAAI,EAErC,OAAQI,EAAY,GAAGG,CAAQ,IAAIH,CAAS,GAAKG,CACrD,CAEA,SAASC,GAAYC,EAAsBC,EAAgBC,EAAmC,CAC1F,IAAMhE,EAAOiE,GAAWH,EAAS,CAAC,IAAKC,EAAO,EAAG,KAAMA,EAAO,CAAC,CAAC,EAEhE,OAAOG,GAAeF,EAAUhE,EAAM,CAAC,CAC3C,CAEA,SAASmE,GAAWC,EAAsBC,EAA6BhB,EAAqB,CACxF,IAAMO,EAAWF,GAAgBL,CAAI,EAErC,OAAOe,EAASf,CAAI,EAAI,GAAKgB,EAAgBT,CAAQ,EAAIQ,EAASf,CAAI,CAC1E,CAEO,SAASiB,GACZC,EACAT,EACAE,EACAR,EACAgB,EACAC,EACAC,EAAO,GAC+B,CACtC,IAAMX,EAASY,GAA2BJ,EAAWT,EAASU,EAAQhB,EAAWiB,CAAK,EAEtF,GAAI,CAACC,EACD,MAAO,CAAC,OAAAX,EAAQ,UAAAP,CAAS,EAG7B,IAAMY,EAAWP,GAAYC,EAASC,EAAQC,CAAQ,EAChD,CAAC,KAAAX,CAAI,EAAIE,EAAeC,CAAS,EAEvC,GAAIY,EAASf,CAAI,GAAK,EAClB,MAAO,CAAC,OAAAU,EAAQ,UAAAP,CAAS,EAG7B,IAAMoB,EAAUjB,GAAcH,CAAS,EACjCqB,EAAgBF,GAA2BJ,EAAWT,EAASU,EAAQI,EAASH,CAAK,EACrFJ,EAAkBR,GAAYC,EAASe,EAAeb,CAAQ,EAEpE,OAAIG,GAAWC,EAAUC,EAAiBhB,CAAI,EACnC,CAAC,OAAQwB,EAAe,UAAWD,CAAO,EAG9C,CAAC,OAAAb,EAAQ,UAAAP,CAAS,CAC7B,CAEO,SAASsB,IAAa,CACzB,IAAMC,EAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,CAAC,EAClDC,EAAM,KAAK,IAAI,EAAE,SAAS,EAAE,EAElC,MAAO,GAAGD,CAAM,GAAGC,CAAG,EAC1B,CAEO,SAASC,EACZC,EACW,CACX,MAAO,CACH,GAAGA,EACH,MAAOA,EAAO,KAAOA,EAAO,MAC5B,OAAQA,EAAO,IAAMA,EAAO,MAChC,CACJ,CAEO,SAASjB,GAAWjE,EAAmBkF,EAA2C,CAvGzF,IAAAvE,EAAAC,EAAAC,EAAAsE,EAwGI,OAAOF,EAAW,CACd,KAAKtE,EAAAuE,EAAO,MAAP,KAAAvE,EAAcX,EAAK,IACxB,MAAMY,EAAAsE,EAAO,OAAP,KAAAtE,EAAeZ,EAAK,KAC1B,OAAOa,EAAAqE,EAAO,QAAP,KAAArE,EAAgBb,EAAK,MAC5B,QAAQmF,EAAAD,EAAO,SAAP,KAAAC,EAAiBnF,EAAK,MAClC,CAAC,CACL,CAEO,SAASoF,IAA+B,CAC3C,GAAM,CAAC,gBAAAC,EAAiB,KAAAC,CAAI,EAAI,SAE1BC,EAAY,OAAO,SAAWF,EAAgB,WAAaC,EAAK,UAChEE,EAAa,OAAO,SAAWH,EAAgB,YAAcC,EAAK,WAElEG,EAAYJ,EAAgB,WAAaC,EAAK,WAAa,EAC3DI,EAAaL,EAAgB,YAAcC,EAAK,YAAc,EAEpE,OAAOL,EAAW,CACd,IAAK,KAAK,MAAMM,EAAYE,CAAS,EACrC,KAAM,KAAK,MAAMD,EAAaE,CAAU,EACxC,MAAO,SAAS,KAAK,YACrB,OAAQ,SAAS,KAAK,YAC1B,CAAC,CACL,CAEO,SAASC,GAAe/K,EAAmC,CAC9D,IAAMoJ,EAAWoB,GAAgB,EAC3BQ,EAAMhL,EAAQ,sBAAsB,EAE1C,OAAOqK,EAAW,CACd,IAAK,KAAK,MAAMW,EAAI,IAAM5B,EAAS,GAAG,EACtC,KAAM,KAAK,MAAM4B,EAAI,KAAO5B,EAAS,IAAI,EACzC,MAAO4B,EAAI,MACX,OAAQA,EAAI,MAChB,CAAC,CACL,CAEO,SAASC,GAAkBrB,EAAsBnB,EAAYoB,EAAyB,CACzF,GAAM,CAAC,SAAAqB,EAAW,EAAG,UAAAC,EAAY,CAAC,EAAIvB,EAEhCwB,EAAa5C,GAAeC,CAAI,EAChC4C,EAAgB5C,IAAS,OAASA,IAAS,OAAS,GAAK,EACzD6C,EAAiBzB,GAASuB,EAAa,GAAK,EAE5CG,EAAaL,EAAWG,EACxBG,EAAcL,EAAYG,EAEhC,OAAIF,EACO,CAAC,EAAGI,EAAa,EAAGD,CAAU,EAGlC,CAAC,EAAGA,EAAY,EAAGC,CAAW,CACzC,CAEO,SAASzB,GACZJ,EACAT,EACAU,EACAhB,EACAiB,EACF,CACE,GAAM,CAAC,KAAApB,EAAM,UAAAI,CAAS,EAAIF,EAAeC,CAAS,EAC5CwC,EAAa5C,GAAeC,CAAI,EAChCgD,EAAgBL,EAAa,IAAM,IACnCM,EAAcD,IAAkB,IAAM,SAAW,QAEjDE,EAAUhC,EAAU,KAAOA,EAAU,MAAQ,EAAIT,EAAQ,MAAQ,EACjE0C,EAAUjC,EAAU,IAAMA,EAAU,OAAS,EAAIT,EAAQ,OAAS,EAClE2C,EAAkBlC,EAAU+B,CAAW,EAAI,EAAIxC,EAAQwC,CAAW,EAAI,EAEtEvC,EAAiB,CAAC,EAAGQ,EAAU,KAAM,EAAGA,EAAU,GAAG,EAE3D,OAAQlB,EAAM,CACV,IAAK,MAAO,CACRU,EAAO,EAAIwC,EACXxC,EAAO,EAAIQ,EAAU,IAAMT,EAAQ,OACnC,KACJ,CAEA,IAAK,SAAU,CACXC,EAAO,EAAIwC,EACXxC,EAAO,EAAIQ,EAAU,IAAMA,EAAU,OACrC,KACJ,CAEA,IAAK,QAAS,CACVR,EAAO,EAAIQ,EAAU,KAAOA,EAAU,MACtCR,EAAO,EAAIyC,EACX,KACJ,CAEA,IAAK,OAAQ,CACTzC,EAAO,EAAIQ,EAAU,KAAOT,EAAQ,MACpCC,EAAO,EAAIyC,EACX,KACJ,CACJ,CAEA,OAAQ/C,EAAW,CACf,IAAK,QAAS,CACVM,EAAOsC,CAAa,GAAKI,GAAmBhC,GAASuB,EAAa,GAAK,GACvE,KACJ,CAEA,IAAK,MAAO,CACRjC,EAAOsC,CAAa,GAAKI,GAAmBhC,GAASuB,EAAa,GAAK,GACvE,KACJ,CACJ,CAEA,IAAMU,EAAab,GAAkBrB,EAAQnB,EAAMoB,CAAK,EAExD,OAAAV,EAAO,GAAK2C,EAAW,EACvB3C,EAAO,GAAK2C,EAAW,EAEhB3C,CACX,CAEO,SAAS4C,GAAoC3G,EAAmB4G,EAA2B,CAC9F,IAAMC,EAAalB,GAAeiB,CAAY,EAE9C,OAAO3B,EAAW,CACd,IAAKjF,EAAK,IAAM6G,EAAW,IAAMD,EAAa,UAC9C,KAAM5G,EAAK,KAAO6G,EAAW,KAAOD,EAAa,WACjD,MAAO5G,EAAK,MACZ,OAAQA,EAAK,MACjB,CAAC,CACL,CAEO,SAASkE,GACZ4C,EACAlM,EACAmM,EAAwC,EAC9B,CACV,GAAM,CAAC,IAAAC,EAAK,OAAAC,EAAQ,KAAAC,EAAM,MAAAC,CAAK,EAAI7D,GAAiByD,CAAO,EAE3D,MAAO,CACH,IAAKD,EAAS,IAAMlM,EAAQ,IAAMoM,EAClC,OAAQpM,EAAQ,OAASkM,EAAS,OAASG,EAC3C,KAAMH,EAAS,KAAOlM,EAAQ,KAAOsM,EACrC,MAAOtM,EAAQ,MAAQkM,EAAS,MAAQK,CAC5C,CACJ,CCtNO,SAASC,GAAqBlK,EAA0B,CAAC,EAAG,CAC/D,GAAM,CAAC,WAAAmK,EAAa,IAAO,oBAAAC,CAAmB,EAAIpK,EAC9CqK,EAAc,GACdC,EAAiC,KAE/BC,EAAsB,CACxB,UAAW,KACX,MAAO,KACP,YAAa,IACjB,EAEMC,EAAmB,IAChBD,EAAM,UAIJ,SAAS,eAAeA,EAAM,SAAS,EAHnC,KAMTE,EAAqB,IAClBF,EAAM,UAIJG,GAAwBH,EAAM,SAAS,EAHnC,KAMTI,EAAO,IAAM,CACf,IAAM/D,EAAU4D,EAAiB,EAE7BD,EAAM,QACN,aAAaA,EAAM,KAAK,EACxBA,EAAM,MAAQ,MAGdA,EAAM,cACNA,EAAM,YAAY,EAClBA,EAAM,YAAc,MAGpB3D,IACAA,EAAQ,UAAU,OAAOhB,EAAkB,EAC3CgF,GAAchE,CAAO,EAErB2D,EAAM,UAAY,MAGlBD,IACAA,EAAW,YAAc,GAEjC,EAEMO,EAAO,CAACxD,EAAwBhD,IAAiB,CACnDsG,EAAK,EAEL,IAAM/D,EAAUkE,GAAqB,CAAC,UAAWV,CAAmB,CAAC,EAC/DW,EAASC,GAAsB,KAAK,KAAMhL,EAASqH,EAAWT,CAAO,EAE3E2D,EAAM,UAAY3D,EAAQ,GAE1BqE,GAAcrE,EAASS,EAAWhD,CAAI,EAElCiG,IACAA,EAAW,YAAcjG,GAG7BkG,EAAM,YAAcW,GAAkB7D,EAAW0D,CAAM,EAEvDnE,EAAQ,UAAU,IAAIhB,EAAkB,EAExCmF,EAAO,EAEHZ,EAAa,IACbI,EAAM,MAAQ,WAAWI,EAAMR,CAAU,EAEjD,EAEMgB,EAAe,IAAM,CACvB,IAAMC,EAAgBZ,EAAiB,EACjCa,EAAkBZ,EAAmB,EAE3C,GAAIW,GAAiB,CAACC,EAAiB,CACnCV,EAAK,EACL,MACJ,CAEIS,GAAiBC,GACjBL,GAAsBhL,EAASqL,EAAiBD,CAAa,CAErE,EAwBA,MAAO,CACH,IAAI,SAAU,CACV,MAAO,EAAQb,EAAM,SACzB,EACA,mBAAAE,EACA,KAAAI,EACA,KAAAF,EACA,KA7BS,IAAM,CACVN,IACDA,EAAc,GAEdC,EAAa,SAAS,cAAc,KAAK,EACzCA,EAAW,UAAYxE,GACvBwE,EAAW,aAAa,YAAa,WAAW,EAChD,SAAS,KAAK,YAAYA,CAAU,EACpC,OAAO,iBAAiB,SAAUa,CAAY,EAC9C,OAAO,iBAAiB,SAAUA,CAAY,EAEtD,EAmBI,QAjBY,IAAM,CACdd,IACAA,EAAc,GAEd,OAAO,oBAAoB,SAAUc,CAAY,EACjD,OAAO,oBAAoB,SAAUA,CAAY,EAEzD,CAWA,CACJ,CAEA,SAASL,GAAqB9K,EAAgC,CAC1D,GAAM,CAAC,UAAAsL,CAAS,EAAItL,EAEdQ,EAAKoH,GAAW,EAChBhB,EAAU,SAAS,cAAc,KAAK,EAE5CA,OAAAA,EAAQ,GAAKpG,EACboG,EAAQ,UAAY0E,EAAY,GAAG3F,EAAkB,IAAI2F,CAAS,GAAK3F,GAEhEiB,CACX,CAEA,SAASqE,GAAcrE,EAAsBS,EAAwBhD,EAAc,CAC/E,IAAMzE,EAAY,SAAS,cAAc8F,EAAuB,GAAK,SAAS,KAE9E2B,EAAU,aAAaxB,EAAmBe,EAAQ,EAAE,EACpDhH,EAAU,YAAYgH,CAAO,EAC7BA,EAAQ,YAAcvC,CAC1B,CAEA,SAASuG,GAAchE,EAAsB,CACzC,GAAIA,EAAQ,GAAI,CACZ,IAAMS,EAAYqD,GAAwB9D,EAAQ,EAAE,EAEpDS,GAAA,MAAAA,EAAW,gBAAgBxB,CAAA,CAC/B,CAEAe,EAAQ,OAAO,CACnB,CAEA,SAAS8D,GAAwBlK,EAAY,CACzC,OAAO,SAAS,cAA2B,IAAIqF,CAAiB,KAAKrF,CAAE,IAAI,CAC/E,CAEA,SAAS0K,GAAkB7D,EAAwB0D,EAAoB,CACnE,IAAMQ,EAAoBC,GAA2BnE,CAAS,EAE9D,OAAAkE,EAAkB,iBAAiB,SAAUR,CAAM,EAE5C,IAAM,CACTQ,EAAkB,oBAAoB,SAAUR,CAAM,CAC1D,CACJ,CAEA,SAASS,GAA2B3M,EAAqB,CAGrD,OAFgCA,EAAO,QAAQ,OAAO,GAAKA,EAAO,QAAQ,MAAM,GAE9CA,EAAO,eAAiB,SAAS,IACvE,CAEA,SAAS4M,GACLC,EACAC,EACqB,CACrB,IAAMC,EAAgBD,EAAe,cAErC,GAAI,CAACC,EACD,OAAO,KAGX,IAAMnK,EAAmC,CACrC,UAAWiK,EACX,QAASC,EACT,aAAcC,CAClB,EAEM9E,EAAWoB,GAAgB,EAC3Bb,EAAYoB,GAAeiD,CAAgB,EAC3C,CAAC,MAAAG,EAAO,OAAAC,CAAM,EAAIH,EAAe,sBAAsB,EAE7D,MAAO,CACH,MAAO,SAAS,MAAQ,MACxB,SAAA7E,EACA,UAAAO,EACA,QAASU,EAAW,CAAC,IAAK,EAAG,KAAM,EAAG,MAAA8D,EAAO,OAAAC,CAAM,CAAC,EACpD,SAAArK,CACJ,CACJ,CAEA,SAASuJ,GACLhL,EACA0L,EACAC,EACF,CACE,IAAMI,EAAUN,GAAqBC,EAAkBC,CAAc,EAErE,GAAI,CAACI,EACD,OAGJ,IAAMlF,EAASmF,GAAiBD,EAAS/L,CAAO,EAEhD2L,EAAe,MAAM,IAAM,GAAG9E,EAAO,CAAC,KACtC8E,EAAe,MAAM,KAAO,GAAG9E,EAAO,CAAC,IAC3C,CAEA,SAASmF,GAAiBD,EAAyB/L,EAAiC,CAChF,GAAM,CAAC,UAAAsG,EAAY,eAAgB,OAAAgB,EAASvB,GAAuB,KAAAyB,EAAO,EAAI,EAAIxH,EAC5E,CAAC,UAAAqH,EAAW,QAAAT,EAAS,SAAAE,EAAU,MAAAS,CAAK,EAAIwE,EAExC,CAAC,OAAAlF,CAAM,EAAIO,GAAgBC,EAAWT,EAASE,EAAUR,EAAWgB,EAAQC,EAAOC,CAAI,EAEvF1E,EAAOiE,GAAWH,EAAS,CAAC,IAAKC,EAAO,EAAG,KAAMA,EAAO,CAAC,CAAC,EAC1DoF,EAAexC,GAAoC3G,EAAMiJ,EAAQ,SAAS,YAAY,EAE5F,MAAO,CACH,EAAGE,EAAa,KAChB,EAAGA,EAAa,GACpB,CACJ,CCxQO,IAAMC,EAA0C,CACnD,GAAI,qEACJ,GAAI,SACJ,GAAI,8CACJ,GAAI,oBACJ,GAAI,WACJ,GAAI,UACJ,GAAI,iCACJ,GAAI,mDACJ,GAAI,aACJ,GAAI,qEACJ,GAAI,UACJ,GAAI,qBACJ,QAAS,qBACT,GAAI,yDACJ,GAAI,kBACJ,GAAI,YACR,ECbMC,GAAsB,qBACtBC,GAAyB,wBAEzBxF,GAAUsD,GAAqB,EAErC,SAASmC,GAAQxN,EAAqB,CAClC,IAAMyN,EAAOzN,EAAO,WAAa,IAAOA,EAA6B,KAAOA,EAAO,QAAQ,KACrF0N,EAAO,IAAI,IAAID,GAAQ,GAAI,OAAO,SAAS,IAAI,EAErD,OAAIH,GAAoB,KAAKI,EAAK,QAAQ,EAC/BA,EAAK,KAGT,OAAO,SAAS,IAC3B,CAEI,OAAO,UAAa,cACpB3F,GAAQ,KAAK,EAEb,SAAS,iBAAiB,QAAUxJ,GAAU,CAC1C,IAAMyB,EAASH,EAAetB,CAAK,EAEnC,GAAIwB,EAASxB,CAAK,GAAK,CAACyB,EAAO,QAAQuN,EAAsB,EACzD,OAGJ,IAAMG,EAAOF,GAAQxN,CAAM,EAE3BuF,EAAgBmI,CAAI,EAAE,KAAK,IAAM,CAlCzC,IAAA9I,EAmCY,IAAM+I,EAAO,SAAS,gBAAgB,MAAQ,KACxCC,GAAchJ,EAAAyI,EAAkBM,CAAY,IAA9B,KAAA/I,EAAmCyI,EAAkB,GAEzEtF,GAAQ,KAAK/H,EAAQ4N,CAAW,CACpC,CAAC,CACL,CAAC,GClCL,IAAMC,GAAoB,4BACpBC,GAAc,IAAID,EAAiB,GAEnC9F,EAAUsD,GAAqB,CAEjC,oBAAqB,qBACzB,CAAC,EAEM,SAAS0C,GAAa/N,EAAqB,CAC9C,IAAMgO,EAAYhO,EAAO,UAEpBgO,GAILzI,EAAgByI,CAAS,EAAE,KAAK,IAAM,CArB1C,IAAApJ,EAsBQ,IAAM+I,EAAO,SAAS,gBAAgB,MAAQ,KACxCC,GAAchJ,EAAAyI,EAAkBM,CAAY,IAA9B,KAAA/I,EAAmCyI,EAAkB,GAEzEtF,EAAQ,KAAK/H,EAAQ4N,CAAW,CACpC,CAAC,CACL,CAEI,OAAO,UAAa,cACpB7F,EAAQ,KAAK,EAEb,SAAS,iBAAiB,QAAUxJ,GAAU,CAC1C,IAAMyB,EAASH,EAAetB,CAAK,EAC7B0P,EAASjO,EAAO,QAAQ8N,EAAW,EAErC/N,EAASxB,CAAK,GAAK,CAAC0P,GAIxBF,GAAa/N,CAAM,CACvB,CAAC,EAED,SAAS,iBAAiB,UAAYzB,GAAU,CAC5C,GAAIA,EAAM,MAAQ,SAAW,SAAS,cAAe,CACjD,IAAM2P,EAAgB,SAAS,cAE/B,GAAI,CAACA,EAAc,UAAU,SAASL,EAAiB,EACnD,OAGJE,GAAaG,CAAa,CAC9B,CAEA,GAAI3P,EAAM,MAAQ,UAAYwJ,EAAQ,QAAS,CAC3C,IAAMS,EAAYT,EAAQ,mBAAmB,EAE7CA,EAAQ,KAAK,EAEbS,GAAA,MAAAA,EAAW,MAAA,CACf,CACJ,CAAC,GC7DE,IAAMlI,EAAW,CACpB,MAAO,uBACP,QAAS,oBACb,EACa6N,EAAY,OACZC,EAAsB9N,EAAS,QAAQ,QAAQ,MAAO,EAAE,EAAI,IAAM6N,EAC3EE,EAAmB,GAEhB,SAASC,GAAgBC,EAAgCC,EAAgC,CAC5F,IAAMC,EAASD,EAAY,aAAa,IAAI,GAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,EACvFD,GAAA,MAAAA,EAAmB,aAAa,UAAWE,CAAA,CAC/C,CAEO,SAASC,GACZH,EACAC,EACI,CACJ,IAAMG,EAAWH,EAAY,aAAa,WAAW,GAAK,SAC1DD,GAAA,MAAAA,EAAmB,aAAa,YAAaI,CAAA,EAC7CJ,GAAA,MAAAA,EAAmB,aAAa,aAAc,MAAA,CAClD,CAEO,SAASK,EACZL,EACAC,EACI,CACJ,GAAM,CACF,EAAGK,EACH,EAAGC,EACH,MAAOC,EACP,KAAMC,EACN,MAAOC,EACP,OAAQC,CACZ,EAAIV,EAAY,sBAAsB,EAEhCW,EAAaC,GAAkBZ,CAAW,EAEhD,GAAI,CAACW,EACD,OAGJ,GAAM,CAAC,MAAOE,EAAiB,KAAMC,CAAc,EAAIH,EAAW,sBAAsB,EAExF,IAAKE,EAAkBL,GAAYM,EAAiBP,IAAc,CAACV,EAAkB,CACjFkB,EAAgBhB,CAAiB,EACjC,MACJ,CAEIF,GAAoBc,IACpBA,EAAW,iBAAiB,SAAUK,EAAY,EAClDnB,EAAmB,IAGvB,IAAMoB,EAAY,OAAOlB,EAAkB,aAAa,WAAW,CAAC,EAC9DmB,EAAY,OAAOnB,EAAkB,aAAa,WAAW,CAAC,EAEpE,GAAIkB,IAAcZ,GAASa,IAAcZ,EACrC,OAGJP,EAAkB,aAAa,YAAa,OAAOM,CAAK,CAAC,EACzDN,EAAkB,aAAa,YAAa,OAAOO,CAAK,CAAC,EAEzD,IAAMa,EAAYT,EAAa,EACzBU,EAAmBrB,EAAkB,cAE3C,GAAI,CAACqB,EACD,OAGJ,GAAM,CAAC,MAAOC,CAAe,EAAItB,EAAkB,sBAAsB,EACnE,CAAC,KAAMuB,CAAoB,EAAIF,EAAiB,sBAAsB,EAGtEG,EAA2B,OAAOC,EAAUxB,CAAW,EAAE,IAAI,EAC7DyB,EAA4BJ,EAAkBE,EAE9CG,EAA8BH,EAA2BF,EAAkB,EAC3EM,EAA+BF,EAA4B,SAAS,KAAK,YAGzEG,IADiBD,GAAgC,SAAS,MAAQ,QAElD,CAACD,EAA8BL,EAAkBZ,EAAY,EAC7EoB,EAAkBL,EAAUJ,CAAgB,EAAE,IAAMA,EAAiB,UAErEU,EAAYH,EACZF,EAA4B,SAAS,KAAK,YAF5B,EAGd,EACAM,EACFP,EAAUxB,CAAW,EAAE,KACvBsB,EACAF,EAAiB,WACjBQ,GAEEI,EAAoBD,EAAaV,GAAmB,SAAS,KAAK,YAExEtB,EAAkB,MAAM,IACpB,OAAOyB,EAAUxB,CAAW,EAAE,IAAMmB,EAAYU,CAAe,EAAI,KACvE9B,EAAkB,MAAM,KAAO,OAAOgC,GAAcC,EAAoBF,EAAY,EAAE,EAAI,IAC9F,CAEA,SAASd,IAAe,CACpB,IAAMiB,EAAmB,SAAS,uBAAuBrC,CAAmB,EAAE,CAAC,EAE/E,GAAI,CAACqC,EACD,OAEJ,IAAMhC,EAASgC,EAAiB,aAAa,SAAS,GAAK,GACrDjC,EAAc,SAAS,eAAeC,CAAM,EAE7CD,GAILI,EAAsB6B,EAAkBjC,CAAW,CACvD,CAEA,SAASY,GAAkBsB,EAA0B,CACjD,OAAKA,EAI2BA,EAAK,QAAQ,OAAO,GAAKA,EAAK,QAAQ,MAAM,GAE1CA,EAAK,cAL5B,IAMf,CAEO,SAASC,GAAe3Q,EAAqB,CAChD,IAAMyQ,EAAmB,SAAS,uBAAuBrC,CAAmB,EAAE,CAAC,EAEzEK,EAASzO,EAAO,aAAa,IAAI,EAEjC4Q,EAAe,GADL5Q,EAAO,aAAa,UAAU,CACf,WAGzB6Q,EAAY7Q,EAAO,QAAQ,iBAAiB,EAE9CuO,EAEJ,GAAIsC,EAAW,CAEX,IAAMC,EAAe9Q,EAAO,QAAQ,eAAe,EACnD,GAAI,CAAC8Q,EACD,OAEJvC,EAAoBuC,EAAa,cAAc,QAAQF,CAAY,IAAI,CAC3E,MAEIrC,EAAoB,SAAS,eAAeqC,CAAY,EAI5D,GADmBH,GAAoBhC,IAAWgC,EAAiB,aAAa,SAAS,EACzE,CACZlB,EAAgBkB,CAAgB,EAChC,MACJ,CAEA,IAAMM,EAA4B/Q,EAAO,QACrC,CAACM,EAAS,QAAQ,QAAQ,IAAK,EAAE,EAAG6N,CAAS,EAAE,KAAK,GAAG,CAC3D,EAEIsC,GAAoB,CAACM,GACrBxB,EAAgBkB,CAAgB,EAGhC,GAACzQ,EAAO,QAAQM,EAAS,KAAK,GAAK,CAACiO,KAIxCD,GAAgBC,EAAmBvO,CAAM,EACzC0O,GAA2BH,EAAmBvO,CAAM,EACpD4O,EAAsBL,EAAmBvO,CAAM,EAE/CuO,EAAkB,UAAU,OAAOJ,CAAS,EAE5C6C,GAAUzC,CAAiB,EAC/B,CAEO,SAASgB,EAAgB0B,EAAyB,CACrDA,EAAW,UAAU,OAAO9C,CAAS,EAMrC8C,EAAW,MAAM,IAAM,GACvBA,EAAW,MAAM,KAAO,GACxBA,EAAW,gBAAgB,WAAW,EACtCA,EAAW,gBAAgB,WAAW,EAEtC,IAAMP,EAAOQ,GAAoBD,CAAU,EACrC9B,EAAaC,GAAkBsB,CAAI,EAEpCvB,IAILA,EAAW,oBAAoB,SAAUK,EAAY,EACrDnB,EAAmB,GACvB,CAEO,SAAS2B,EAAUmB,EAAmB,CACzC,IAAMtH,EAAMsH,EAAK,sBAAsB,EAEjC5H,EAAO,SAAS,KAChB6H,EAAQ,SAAS,gBAEjB5H,EAAY,OAAO,aAAe4H,EAAM,WAAa7H,EAAK,UAC1DE,EAAa,OAAO,aAAe2H,EAAM,YAAc7H,EAAK,WAE5DG,EAAY0H,EAAM,WAAa7H,EAAK,WAAa,EACjDI,EAAayH,EAAM,YAAc7H,EAAK,YAAc,EAEpD0B,EAAMpB,EAAI,IAAML,EAAYE,EAC5ByB,EAAOtB,EAAI,KAAOJ,EAAaE,EAErC,MAAO,CAAC,IAAK,KAAK,MAAMsB,CAAG,EAAG,KAAM,KAAK,MAAME,CAAI,CAAC,CACxD,CAEO,SAAS6F,GAAUnS,EAAsB,CAC5C,IAAMwS,EAAoBxS,EAAQ,iBAC9B,0EACJ,EACMyS,EAAwBD,EAAkB,CAAC,EAC3CE,EAAuBF,EAAkBA,EAAkB,OAAS,CAAC,EAEvEC,GACAA,EAAsB,MAAM,EAGhCzS,EAAQ,iBAAiB,UAAW,SAAUsG,EAAG,EACxBA,EAAE,MAAQ,OAASA,EAAE,UAAY,KAKlDA,EAAE,SACE,SAAS,gBAAkBmM,IAC3BC,EAAqB,MAAM,EAC3BpM,EAAE,eAAe,GAEd,SAAS,gBAAkBoM,IAClCD,EAAsB,MAAM,EAC5BnM,EAAE,eAAe,GAEzB,CAAC,CACL,CAEO,SAAS+L,GAAoBD,EAAyB,CACzD,IAAMxC,EAASwC,EAAW,aAAa,SAAS,EAEhD,GAAI,CAACxC,EACD,OAAO,KAMX,GAFkBwC,EAAW,QAAQ,iBAAiB,EAEvC,CAEX,IAAMH,EAAeG,EAAW,QAAQ,eAAe,EACvD,OAAKH,EAGEA,EAAa,cAAc,QAAQrC,CAAM,IAAI,EAFzC,IAGf,CAGA,OAAO,SAAS,eAAeA,CAAM,CACzC,CClQI,OAAO,UAAa,cACpB,SAAS,iBAAiB,QAAUlQ,GAAU,EACtCsB,EAAetB,CAAK,GAAK,CAACwB,EAASxB,CAAK,IACxCoS,GAAe9Q,EAAetB,CAAK,CAAgB,CAE3D,CAAC,EAED,SAAS,iBAAiB,UAAYA,GAAU,CAlBpD,IAAAqG,EAmBQ,IAAM6L,EAAmB,SAAS,uBAC9BrC,CACJ,EAAE,CAAC,EAEC7P,EAAM,MAAQ,SAAW,SAAS,eAClCoS,GAAe,SAAS,aAA4B,EAGpDpS,EAAM,MAAQ,UAAYkS,IAC1BlB,EAAgBkB,CAAgB,GAChC7L,EAAAsM,GAAoBT,CAAgB,IAApC,MAAA7L,EAAuC,MAAA,EAE/C,CAAC,EAED,OAAO,iBAAiB,SAAU,IAAM,CACpC,IAAM6L,EAAmB,SAAS,uBAC9BrC,CACJ,EAAE,CAAC,EAEH,GAAI,CAACqC,EACD,OAGJ,IAAMhC,EAASgC,EAAiB,aAAa,SAAS,GAAK,GACrDjC,EAAc,SAAS,eAAeC,CAAM,EAElD,GAAI,CAACD,EAAa,CACdiC,EAAiB,UAAU,OAAOtC,CAAS,EAC3C,MACJ,CAEAS,EAAsB6B,EAAkBjC,CAAW,CACvD,CAAC,GCnDE,IAAMgD,GAAyB,iBCA/BC,GAAQ,kWCARC,GAAQ,kuBCETC,EAAS,IAAM,CACZ,OAAO,eAIZ,OAAO,aAAa,MAAM,QAAU,OACpC,OAAO,aAAa,QAAQ,MAAS,EACzC,EAEMC,GAAWhU,GAAsB,CACnC,GAAIA,EAAK,UAAY,QACjB,OAGJ,IAAMgF,EAAW,MAAM,KAAKhF,EAAK,QAAQ,EAIzC,OAFcgF,EAAS,KAAMiP,GAAUA,EAAM,UAAY,OAAO,EAG5D,OAGUjP,EAAS,KAAMiP,GAAUA,EAAM,UAAY,OAAO,CAGpE,EAMM9Q,GAAY,IAAM,CACpB,GAAI,OAAO,aACP,OAAO,OAAO,aAGlB,IAAM+Q,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAU,IAAI,cAAe,gBAAgB,EAEtD,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAU,IAAI,sBAAsB,EAC5CA,EAAQ,iBAAiB,QAASJ,CAAM,EAExC,IAAMK,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAU,IAAI,MAAO,sBAAsB,EAEnD,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAU,IAAI,cAAc,EAEpC,IAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAU,IAAI,cAAc,EAClCA,EAAM,iBAAiB,QAASP,CAAM,EACtCO,EAAM,UAAYR,GAElB,IAAM5O,EAAQ,SAAS,cAAc,GAAG,EACxCA,EAAM,UAAU,IAAI,kBAAkB,EAEtCgP,EAAS,MAAS/O,GAAqB,CACnCD,EAAM,UAAYC,GAAW,EACjC,EAEA,IAAMA,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAU,IAAI,cAAc,EAEpC+O,EAAS,QAAW9R,GAAqB,CAlE7C,IAAA4E,EAmEQ,GAAI,OAAO5E,GAAW,YAAa,CAC/B+C,EAAQ,UAAY,GAEpB,MACJ,CAEA,IAAMoP,EAASnS,EAAO,UAAU,EAAI,EAE9BoS,EAAQR,GAAQO,CAAM,GAG5BvN,EAAAwN,GAAA,KAAA,OAAAA,EAAO,YAAP,MAAAxN,EAAkB,IAAI,oBAAA,EAGtB,IAAMyN,EAAaF,EAAO,iBAAiB,iBAAiB,EAGtDG,EAAiC,CAAC,EAExCD,EAAW,QAASE,GAAc,CAC9B,IAAMC,EAAUD,EAAU,aAAa,UAAU,EACjD,GAAIC,EAAS,CAET,IAAMC,EAAqB,SAAS,eAAeD,EAAU,UAAU,EACvE,GAAIC,EAAoB,CAEpB,IAAMC,EAAmBD,EAAmB,UAAU,EAAI,EAC1DH,EAAgB,KAAKI,CAAgB,CACzC,CACJ,CACJ,CAAC,EAGD3P,EAAQ,gBAAgBoP,EAAQ,GAAGG,CAAe,CACtD,EAEAL,EAAQ,OAAOnP,EAAOoP,CAAK,EAC3BF,EAAQ,OAAOC,EAASlP,CAAO,EAC/B+O,EAAS,OAAOC,EAASC,CAAO,EAEhCF,EAAS,MAAM,QAAU,OACzB,SAAS,KAAK,YAAYA,CAAQ,EAElC,OAAO,aAAeA,EAEfA,CACX,EAEMa,GAAU5P,GAAyB,CACrC,IAAM+O,EAAW/Q,GAAU,EAE3B+Q,EAAS,MAAM/O,EAAQ,KAAK,EAC5B+O,EAAS,QAAQ/O,CAAO,EAExB+O,EAAS,MAAM,QAAU,MAC7B,EAEac,GAAQ,CACjB,OAAAD,GACA,OAAAhB,CACJ,EC3HMkB,GAAQ7S,GAAwB,CAJtC,IAAA4E,EAKI,IAAIA,EAAA5E,EAAO,gBAAP,MAAA4E,EAAsB,UAAU,SAAS,sBAAA,EACzC,OAGJ5E,EAAO,UAAU,IAAI,oBAAoB,EAEzC,IAAM0B,EAAU,SAAS,cAAc,KAAK,EAE5CA,EAAQ,UAAY+P,GACpB/P,EAAQ,UAAU,IAAI,qBAAqB,EAC3CA,EAAQ,iBAAiB,QAAS,IAAMkR,GAAM,OAAO5S,CAAM,CAAC,EAE5D,IAAMe,EAAY,SAAS,cAAc,KAAK,EAE9CA,EAAU,UAAU,IAAI,sBAAsB,EAE9Cf,EAAO,OAAOe,CAAS,EAEvBA,EAAU,YAAYf,CAAM,EAC5Be,EAAU,YAAYW,CAAO,CACjC,EAEaoR,GAAgB,IAAM,CACP,MAAM,KAC1B,SAAS,iBAAiBtB,EAAsB,CACpD,EAEgB,QAAQqB,EAAI,CAChC,EC/BI,OAAO,QAAW,aAAe,OAAO,UAAa,aACrD,OAAO,iBAAiB,OAAQC,EAAa,ECDjD,IAAMC,GAAQ,IAAM,CAChBD,GAAc,CAClB,EAEI,OAAO,QAAW,cAClB,OAAO,iBAAmBC",
|
|
6
|
-
"names": ["require_get_root_node_polyfill", "__commonJS", "exports", "module", "getRootNode", "opt", "composed", "getShadowIncludingRoot", "getRoot", "node", "root", "isShadowRoot", "GLOBAL_KEY", "ClassNames", "YfmCutController", "__publicField", "mouseEvent", "keepMouse", "amendMouse", "onFocus", "event", "
|
|
4
|
+
"sourcesContent": ["'use strict';\n\n// Node getRootNode(optional GetRootNodeOptions options);\n\n/**\n * Returns the context object\u2019s shadow-including root if options\u2019s composed is true.\n * Returns the context object\u2019s root otherwise.\n *\n * The root of an object is itself, if its parent is null, or else it is the root of its parent.\n *\n * The shadow-including root of an object is its root\u2019s host\u2019s shadow-including root,\n * if the object\u2019s root is a shadow root, and its root otherwise.\n *\n * https://dom.spec.whatwg.org/#dom-node-getrootnode\n *\n * @memberof Node.prototype\n * @param {!Object} [opt = {}] - Options.\n * @param {!boolean} [opt.composed] - See above description.\n * @returns {!Node} The root node.\n */\nfunction getRootNode(opt) {\n var composed = typeof opt === 'object' && Boolean(opt.composed);\n\n return composed ? getShadowIncludingRoot(this) : getRoot(this);\n}\n\nfunction getShadowIncludingRoot(node) {\n var root = getRoot(node);\n\n if (isShadowRoot(root)) {\n return getShadowIncludingRoot(root.host);\n }\n\n return root;\n}\n\nfunction getRoot(node) {\n if (node.parentNode != null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\nfunction isShadowRoot(node) {\n return node.nodeName === '#document-fragment' && node.constructor.name === 'ShadowRoot';\n}\n\nif (typeof module === 'object' && module.exports) {\n module.exports = getRootNode;\n}\n", "export const GLOBAL_KEY = 'yfm_cut';\n\nexport const Selector = {\n CUT: '.yfm .yfm-cut',\n TITLE: '.yfm .yfm-cut-title',\n CONTENT: '.yfm .yfm-cut-content',\n};\n", "export const ENV_FLAG_NAME = 'has-yfm-cut';\n\nexport const TokenType = {\n Cut: 'yfm_cut',\n CutOpen: 'yfm_cut_open',\n CutClose: 'yfm_cut_close',\n Title: 'yfm_cut_title',\n TitleOpen: 'yfm_cut_title_open',\n TitleClose: 'yfm_cut_title_close',\n Content: 'yfm_cut_content',\n ContentOpen: 'yfm_cut_content_open',\n ContentClose: 'yfm_cut_content_close',\n} as const;\n\nexport const ClassNames = {\n Cut: 'yfm-cut',\n Title: 'yfm-cut-title',\n Content: 'yfm-cut-content',\n Highlight: 'yfm-cut-highlight',\n} as const;\n", "import {ClassNames} from '../plugin/const';\n\nexport class YfmCutController {\n private disposers: Function[] = [];\n\n constructor() {\n this.disposers.push(this.init());\n }\n\n init() {\n let mouseEvent = false;\n // Summary whose browser-restored focus we ignore once after a blur.\n let summaryAtBlur: EventTarget | null = null;\n const keepMouse = () => {\n mouseEvent = true;\n // A click is a deliberate action: drop any pending suppression.\n summaryAtBlur = null;\n };\n const amendMouse = () => {\n mouseEvent = false;\n };\n const onWindowBlur = () => {\n // On window re-focus the browser restores focus to whatever was\n // active here, so read it straight off `document.activeElement`.\n const active = document.activeElement;\n summaryAtBlur = isSummary(active) ? active : null;\n };\n const onFocus = (event: Event) => {\n // Suppress one restored focus; any other focus disarms it first.\n const restored = event.target === summaryAtBlur;\n summaryAtBlur = null;\n if (restored) {\n return;\n }\n\n if (isSummary(event.target) && !mouseEvent) {\n this.focusActiveCut(event.target);\n }\n };\n\n window.addEventListener('blur', onWindowBlur);\n document.addEventListener('mousedown', keepMouse);\n document.addEventListener('mouseup', amendMouse);\n document.addEventListener('focus', onFocus, true);\n\n return () => {\n window.removeEventListener('blur', onWindowBlur);\n document.removeEventListener('mousedown', keepMouse);\n document.removeEventListener('mouseup', amendMouse);\n document.removeEventListener('focus', onFocus, true);\n };\n }\n\n dispose() {\n for (const disposer of this.disposers) {\n disposer();\n }\n }\n\n private focusActiveCut(summary: HTMLElement) {\n const cutNode = summary.parentNode;\n if (!isDetails(cutNode)) {\n return;\n }\n\n let node: HTMLElement | null = cutNode;\n while (node) {\n if (isDetails(node)) {\n node.open = true;\n }\n node = node.parentElement;\n }\n\n setTimeout(() => {\n cutNode.classList.add(ClassNames.Highlight);\n }, 70);\n\n setTimeout(() => {\n cutNode.classList.remove(ClassNames.Highlight);\n }, 1000);\n }\n}\n\nfunction isDetails(element: unknown): element is HTMLDetailsElement {\n return (\n (element as HTMLElement)?.tagName?.toLowerCase() === 'details' &&\n (element as HTMLElement)?.classList.contains(ClassNames.Cut)\n );\n}\n\nfunction isSummary(element: unknown): element is HTMLElement {\n return (\n (element as HTMLElement)?.tagName?.toLowerCase() === 'summary' &&\n (element as HTMLElement)?.classList.contains(ClassNames.Title)\n );\n}\n", "import {GLOBAL_KEY} from './const';\nimport {YfmCutController} from './controller';\nimport './styles/cut.scss';\n\nif (typeof window !== 'undefined' && !window[GLOBAL_KEY]) {\n window[GLOBAL_KEY] = new YfmCutController();\n}\n\ndeclare global {\n interface Window {\n [GLOBAL_KEY]: YfmCutController;\n }\n}\n", "/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "/**\n * Event target considering shadow DOM (composedPath()[0] or fallback to target).\n * @param event - DOM event\n * @returns Target element\n */\nexport const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\n/**\n * True if the event target is a custom element (or missing), so we skip tab handling.\n * @param event - DOM event\n * @returns Whether to ignore\n */\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\n/**\n * Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.\n * @param element - Starting element\n * @returns Scrollable parent or undefined\n */\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\n/** Position and scroll values used to restore scroll after tab switch. */\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\n/**\n * Offset of element relative to scrollable parent and parent's scroll position.\n * @param element - Child element\n * @param scrollableParent - Scroll container\n * @returns Offset and scroll values\n */\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import type {SelectedTabEvent, Tab} from '../common';\nimport type {ElementOffset} from './utils';\n\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n TabsVariants,\n} from '../common';\n\nimport {\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\n/**\n * Escape value for use in a CSS attribute selector (e.g. group id).\n * @param value - Raw attribute value.\n * @returns Escaped string safe for use inside [attr=\"...\"].\n */\nfunction escapeCssAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Find tab elements by group and key without putting key in a selector (keys may contain %, spaces, etc.).\n * @param doc - Document to query.\n * @param group - Group id.\n * @param key - Tab key (data-tabs-key value).\n * @returns Matching tab elements.\n */\nfunction findTabsByGroupAndKey(doc: Document, group: string, key: string): Element[] {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]`,\n );\n const result: Element[] = [];\n containers.forEach((container) => {\n container.querySelectorAll(Selector.TAB).forEach((tab) => {\n if (tab.getAttribute(TAB_DATA_KEY) === key) {\n result.push(tab);\n }\n });\n });\n return result;\n}\n\n/** Options for selectTabById (e.g. scroll the selected tab into view). */\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\n/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\n/** Controller options: whether to persist selection to localStorage and/or URL query. */\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\n/**\n * DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage\n * and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].\n */\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n }\n\n /**\n * Update controller options (e.g. enable persistence after init).\n * @param options - Partial options to merge\n * @returns void\n */\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n /**\n * Subscribe to tab switch events.\n * @param handler - Callback on tab switch\n * @returns Unsubscribe function\n */\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n /**\n * Select tab by data-diplodoc-id and optionally scroll it into view.\n * @param id - data-diplodoc-id value\n * @param options - e.g. scrollToElement\n * @returns void\n */\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n /**\n * Programmatically select a tab by { group, key, variant }.\n * @param tab - Tab descriptor\n * @returns void\n */\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n /**\n * Apply saved state: select each tab in tabsHistory (e.g. after navigation).\n * @param tabsHistory - Group -> { key, variant } map\n * @returns void\n */\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n /**\n * Read persisted tab state from localStorage (key: tabsHistory).\n * @returns Parsed TabsHistory\n */\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n /**\n * Parse tab state from URL search params (tabs=group_key or group_key_variant).\n * @returns Parsed TabsHistory\n */\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n\n tabConfigs.forEach((config) => {\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n let variant = TabsVariants.Regular;\n if (splitConfig.length === 3) {\n variant = splitConfig[2] as TabsVariants;\n }\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n const keyWithSpaces = key;\n tabsHistory[group] = {key: keyWithSpaces, variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).map(([group, {key, variant}]) => {\n if (variant === TabsVariants.Regular) {\n return `${group}_${key}`;\n }\n return `${group}_${key}_${variant}`;\n });\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n /**\n * Filter tabsHistory to only groups present on the current page.\n * @param tabsHistory - Full history\n * @returns Filtered TabsHistory\n */\n getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n /**\n * Call after route/page change so persistence uses only groups on the current page.\n * @returns void\n */\n onPageChanged(): void {\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n /**\n * List of tab group ids found in the document.\n * @returns Array of group ids\n */\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n /**\n * Clear saved tab state from localStorage and URL.\n * @returns void\n */\n clearTabsPreferred(): void {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n let tabs = findTabsByGroupAndKey(this._document, group, key);\n if (isForced) {\n tabs = tabs.filter(\n (el) => (el as HTMLElement).getAttribute(TAB_FORCED_OPEN) === 'true',\n );\n }\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "/**\n * Tabs runtime entry: creates a single TabsController for the document and attaches it to window\n * under GLOBAL_SYMBOL so that React and other consumers can access it. Imports SCSS for tab styles.\n */\nimport {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n", "import getRootNode from 'get-root-node-polyfill';\n\nif (typeof document !== 'undefined') {\n // matches polyfill for old edge\n (function (e) {\n const matches =\n e.matches ||\n e.matchesSelector ||\n e.webkitMatchesSelector ||\n e.mozMatchesSelector ||\n e.msMatchesSelector ||\n e.oMatchesSelector;\n\n if (matches) {\n e.matches = e.matchesSelector = matches;\n } else {\n e.matches = e.matchesSelector = function matches(selector) {\n const rootNode = e.getRootNode ? e.getRootNode() : getRootNode.call(e);\n const matches = rootNode.querySelectorAll(selector);\n const th = this;\n return Array.prototype.some.call(matches, (e) => {\n return e === th;\n });\n };\n }\n // eslint-disable-next-line no-undef\n })(Element.prototype);\n}\n", "export const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\nexport const copyToClipboard = async (text: string) => {\n if (!text) {\n return;\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText) {\n return navigator.clipboard.writeText(text);\n }\n\n const textarea = document.createElement('textarea');\n textarea.setAttribute('style', 'position: absolute; left: 1000%');\n textarea.textContent = text;\n document.body.append(textarea);\n\n textarea.select();\n document.execCommand('copy');\n\n document.body.removeChild(textarea);\n};\n", "import {copyToClipboard, getEventTarget, isCustom} from './utils';\n\nconst COPY_BUTTON_SELECTOR = '.yfm-clipboard-button';\nconst WRAP_BUTTON_SELECTOR = '.yfm-wrapping-button';\nconst FLOATING_CONTAINER_SELECTOR = '.yfm-code-floating-container';\nconst SELECTED_WRAP_BUTTON = 'g-button_selected';\n\nfunction notifySuccess(svgButton: HTMLElement | null) {\n if (!svgButton) {\n return;\n }\n\n const id = svgButton.getAttribute('data-animation');\n\n // @ts-expect-error\n const icon = svgButton.getRootNode().getElementById(`visibileAnimation-${id}`);\n\n if (!icon) {\n return;\n }\n\n icon.beginElement();\n}\n\nfunction buttonCopyFn(target: HTMLElement) {\n const button = target.closest<HTMLElement>(COPY_BUTTON_SELECTOR);\n const container = button?.closest<HTMLElement>(FLOATING_CONTAINER_SELECTOR);\n const code = container?.querySelector<HTMLElement>('pre code');\n\n if (!button || !container || !code) {\n return;\n }\n\n // Strip line-number decorations (class-based, no semantic alternative).\n const clone = code.cloneNode(true) as HTMLElement;\n\n clone.querySelectorAll('.yfm-line-number').forEach((el) => el.remove());\n let textContent = clone.textContent ?? '';\n\n // Strip prompt prefix from each line using the raw value stored in data-prompt.\n // This avoids any dependency on how (or whether) the prompt is wrapped in the DOM.\n // Leading whitespace before the prompt is preserved so indented commands keep\n // their indentation level in the copied text.\n const promptValue = code.dataset.prompt;\n if (promptValue) {\n const prefix = promptValue + ' ';\n textContent = textContent\n .split('\\n')\n .map((line) => {\n const trimmed = line.trimStart();\n const leadingWs = line.slice(0, line.length - trimmed.length);\n if (trimmed.startsWith(prefix)) {\n return leadingWs + trimmed.slice(prefix.length);\n }\n if (trimmed === promptValue) {\n return leadingWs;\n }\n return line;\n })\n .join('\\n');\n }\n\n copyToClipboard(textContent.trim()).then(() => {\n notifySuccess(container.querySelector('.yfm-clipboard-icon'));\n\n setTimeout(() => target.blur(), 1500);\n });\n}\n\nfunction buttonWrapFn(target: HTMLElement) {\n const button = target.closest<HTMLElement>(WRAP_BUTTON_SELECTOR);\n const container = button?.closest<HTMLElement>(FLOATING_CONTAINER_SELECTOR);\n const code = container?.querySelector<HTMLElement>('pre code');\n if (!button || !container || !code) {\n return;\n }\n const hasWrap = code.classList.toggle('wrap');\n\n button.classList.toggle(SELECTED_WRAP_BUTTON, hasWrap);\n button.setAttribute('aria-pressed', String(hasWrap));\n\n setTimeout(() => target.blur(), 500);\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('click', (event) => {\n if (isCustom(event)) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (target.closest(COPY_BUTTON_SELECTOR)) {\n buttonCopyFn(target);\n } else if (target.closest(WRAP_BUTTON_SELECTOR)) {\n buttonWrapFn(target);\n }\n });\n}\n", "import type {OffsetValues, Side, SideObject} from './types';\n\nexport const PAGE_CONTAINER_SELECTOR = '.dc-doc-page__content';\n\nexport const TOOLTIP_BASE_CLASS = 'yfm yfm-tooltip';\n\nexport const TOOLTIP_OPEN_CLASS = 'open';\n\nexport const TOOLTIP_DATA_ATTR = 'data-tooltip-id';\n\nexport const TOOLTIP_LIVE_REGION_CLASS = 'yfm-tooltip-live-region';\n\nexport const DEFAULT_OFFSET_VALUES: OffsetValues = {mainAxis: 5};\n\nexport const OPPOSITE_SIDES: Record<Side, Side> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nexport const DEFAULT_SIDE_OBJECT: SideObject = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n};\n", "import type {\n Alignment,\n Coords,\n ElementRect,\n OffsetValues,\n Placement,\n Side,\n SideObject,\n} from './types';\n\nimport {DEFAULT_SIDE_OBJECT, OPPOSITE_SIDES} from './constant';\n\nfunction isVerticalSide(side: Side): boolean {\n return side === 'top' || side === 'bottom';\n}\n\nfunction createSideObject(value: Partial<SideObject> | number = 0): SideObject {\n if (typeof value === 'number') {\n return {top: value, bottom: value, left: value, right: value};\n }\n\n return {...DEFAULT_SIDE_OBJECT, ...value};\n}\n\nfunction parsePlacement(placement: Placement): {side: Side; alignment?: Alignment} {\n const [side, alignment] = placement.split('-') as [Side, Alignment | undefined];\n\n return {side, alignment};\n}\n\nfunction getOppositeSide(side: Side): Side {\n return OPPOSITE_SIDES[side];\n}\n\nfunction flipPlacement(placement: Placement): Placement {\n const {side, alignment} = parsePlacement(placement);\n const opposite = getOppositeSide(side);\n\n return (alignment ? `${opposite}-${alignment}` : opposite) as Placement;\n}\n\nfunction getOverflow(tooltip: ElementRect, coords: Coords, viewport: ElementRect): SideObject {\n const rect = updateRect(tooltip, {top: coords.y, left: coords.x});\n\n return detectOverflow(viewport, rect, 5);\n}\n\nfunction shouldFlip(overflow: SideObject, flippedOverflow: SideObject, side: Side): boolean {\n const opposite = getOppositeSide(side);\n\n return overflow[side] > 0 && flippedOverflow[opposite] < overflow[side];\n}\n\nexport function computePosition(\n reference: ElementRect,\n tooltip: ElementRect,\n viewport: ElementRect,\n placement: Placement,\n offset: OffsetValues,\n isRtl: boolean,\n flip = true,\n): {coords: Coords; placement: Placement} {\n const coords = computeCoordsFromPlacement(reference, tooltip, offset, placement, isRtl);\n\n if (!flip) {\n return {coords, placement};\n }\n\n const overflow = getOverflow(tooltip, coords, viewport);\n const {side} = parsePlacement(placement);\n\n if (overflow[side] <= 0) {\n return {coords, placement};\n }\n\n const flipped = flipPlacement(placement);\n const flippedCoords = computeCoordsFromPlacement(reference, tooltip, offset, flipped, isRtl);\n const flippedOverflow = getOverflow(tooltip, flippedCoords, viewport);\n\n if (shouldFlip(overflow, flippedOverflow, side)) {\n return {coords: flippedCoords, placement: flipped};\n }\n\n return {coords, placement};\n}\n\nexport function generateId() {\n const random = Math.random().toString(36).substring(2, 6);\n const now = Date.now().toString(36);\n\n return `${random}${now}`;\n}\n\nexport function createRect(\n params: Pick<ElementRect, 'top' | 'left' | 'width' | 'height'>,\n): ElementRect {\n return {\n ...params,\n right: params.left + params.width,\n bottom: params.top + params.height,\n };\n}\n\nexport function updateRect(rect: ElementRect, params: Partial<ElementRect>): ElementRect {\n return createRect({\n top: params.top ?? rect.top,\n left: params.left ?? rect.left,\n width: params.width ?? rect.width,\n height: params.height ?? rect.height,\n });\n}\n\nexport function getViewportRect(): ElementRect {\n const {documentElement, body} = document;\n\n const scrollTop = window.scrollY || documentElement.scrollTop || body.scrollTop;\n const scrollLeft = window.scrollX || documentElement.scrollLeft || body.scrollLeft;\n\n const clientTop = documentElement.clientTop || body.clientTop || 0;\n const clientLeft = documentElement.clientLeft || body.clientLeft || 0;\n\n return createRect({\n top: Math.round(scrollTop - clientTop),\n left: Math.round(scrollLeft - clientLeft),\n width: document.body.clientWidth,\n height: document.body.clientHeight,\n });\n}\n\nexport function getElementRect(element: HTMLElement): ElementRect {\n const viewport = getViewportRect();\n const box = element.getBoundingClientRect();\n\n return createRect({\n top: Math.round(box.top + viewport.top),\n left: Math.round(box.left + viewport.left),\n width: box.width,\n height: box.height,\n });\n}\n\nexport function computeAxisOffset(offset: OffsetValues, side: Side, isRtl?: boolean): Coords {\n const {mainAxis = 0, crossAxis = 0} = offset;\n\n const isVertical = isVerticalSide(side);\n const mainDirection = side === 'top' || side === 'left' ? -1 : 1;\n const crossDirection = isRtl && isVertical ? -1 : 1;\n\n const mainOffset = mainAxis * mainDirection;\n const crossOffset = crossAxis * crossDirection;\n\n if (isVertical) {\n return {x: crossOffset, y: mainOffset};\n }\n\n return {x: mainOffset, y: crossOffset};\n}\n\nexport function computeCoordsFromPlacement(\n reference: ElementRect,\n tooltip: ElementRect,\n offset: OffsetValues,\n placement: Placement,\n isRtl: boolean,\n) {\n const {side, alignment} = parsePlacement(placement);\n const isVertical = isVerticalSide(side);\n const alignmentAxis = isVertical ? 'x' : 'y';\n const alignLength = alignmentAxis === 'y' ? 'height' : 'width';\n\n const centerX = reference.left + reference.width / 2 - tooltip.width / 2;\n const centerY = reference.top + reference.height / 2 - tooltip.height / 2;\n const alignmentOffset = reference[alignLength] / 2 - tooltip[alignLength] / 2;\n\n const coords: Coords = {x: reference.left, y: reference.top};\n\n switch (side) {\n case 'top': {\n coords.x = centerX;\n coords.y = reference.top - tooltip.height;\n break;\n }\n\n case 'bottom': {\n coords.x = centerX;\n coords.y = reference.top + reference.height;\n break;\n }\n\n case 'right': {\n coords.x = reference.left + reference.width;\n coords.y = centerY;\n break;\n }\n\n case 'left': {\n coords.x = reference.left - tooltip.width;\n coords.y = centerY;\n break;\n }\n }\n\n switch (alignment) {\n case 'start': {\n coords[alignmentAxis] -= alignmentOffset * (isRtl && isVertical ? -1 : 1);\n break;\n }\n\n case 'end': {\n coords[alignmentAxis] += alignmentOffset * (isRtl && isVertical ? -1 : 1);\n break;\n }\n }\n\n const axisOffset = computeAxisOffset(offset, side, isRtl);\n\n coords.x += axisOffset.x;\n coords.y += axisOffset.y;\n\n return coords;\n}\n\nexport function convertToRelativeToOffsetParentRect(rect: ElementRect, offsetParent: HTMLElement) {\n const offsetRect = getElementRect(offsetParent);\n\n return createRect({\n top: rect.top - offsetRect.top + offsetParent.offsetTop,\n left: rect.left - offsetRect.left + offsetParent.offsetLeft,\n width: rect.width,\n height: rect.height,\n });\n}\n\nexport function detectOverflow(\n boundary: ElementRect,\n element: ElementRect,\n padding: Partial<SideObject> | number = 0,\n): SideObject {\n const {top, bottom, left, right} = createSideObject(padding);\n\n return {\n top: boundary.top - element.top + top,\n bottom: element.bottom - boundary.bottom + bottom,\n left: boundary.left - element.left + left,\n right: element.right - boundary.right + right,\n };\n}\n", "import type {\n Coords,\n TooltipContext,\n TooltipContextElements,\n TooltipElementOptions,\n TooltipOptions,\n} from './types';\n\nimport {\n DEFAULT_OFFSET_VALUES,\n PAGE_CONTAINER_SELECTOR,\n TOOLTIP_BASE_CLASS,\n TOOLTIP_DATA_ATTR,\n TOOLTIP_LIVE_REGION_CLASS,\n TOOLTIP_OPEN_CLASS,\n} from './constant';\nimport {\n computePosition,\n convertToRelativeToOffsetParentRect,\n createRect,\n generateId,\n getElementRect,\n getViewportRect,\n updateRect,\n} from './utils';\n\ninterface TooltipState {\n currentId: string | null;\n timer: ReturnType<typeof setTimeout> | null;\n unsubscribe: (() => void) | null;\n}\n\nexport function createTooltipFactory(options: TooltipOptions = {}) {\n const {closeDelay = 1_000, additionalClassName} = options;\n let initialized = false;\n let liveRegion: HTMLElement | null = null;\n\n const state: TooltipState = {\n currentId: null,\n timer: null,\n unsubscribe: null,\n };\n\n const getActiveTooltip = () => {\n if (!state.currentId) {\n return null;\n }\n\n return document.getElementById(state.currentId);\n };\n\n const getActiveReference = () => {\n if (!state.currentId) {\n return null;\n }\n\n return getReferenceByTooltipId(state.currentId);\n };\n\n const hide = () => {\n const tooltip = getActiveTooltip();\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.unsubscribe) {\n state.unsubscribe();\n state.unsubscribe = null;\n }\n\n if (tooltip) {\n tooltip.classList.remove(TOOLTIP_OPEN_CLASS);\n detachTooltip(tooltip);\n\n state.currentId = null;\n }\n\n if (liveRegion) {\n liveRegion.textContent = '';\n }\n };\n\n const show = (reference: HTMLElement, text: string) => {\n hide();\n\n const tooltip = createTooltipElement({className: additionalClassName});\n const update = updateTooltipPosition.bind(null, options, reference, tooltip);\n\n state.currentId = tooltip.id;\n\n attachTooltip(tooltip, reference, text);\n\n if (liveRegion) {\n liveRegion.textContent = text;\n }\n\n state.unsubscribe = subscribeToScroll(reference, update);\n\n tooltip.classList.add(TOOLTIP_OPEN_CLASS);\n\n update();\n\n if (closeDelay > 0) {\n state.timer = setTimeout(hide, closeDelay);\n }\n };\n\n const handleUpdate = () => {\n const activeTooltip = getActiveTooltip();\n const activeReference = getActiveReference();\n\n if (activeTooltip && !activeReference) {\n hide();\n return;\n }\n\n if (activeTooltip && activeReference) {\n updateTooltipPosition(options, activeReference, activeTooltip);\n }\n };\n\n const init = () => {\n if (!initialized) {\n initialized = true;\n\n liveRegion = document.createElement('div');\n liveRegion.className = TOOLTIP_LIVE_REGION_CLASS;\n liveRegion.setAttribute('aria-live', 'assertive');\n document.body.appendChild(liveRegion);\n window.addEventListener('scroll', handleUpdate);\n window.addEventListener('resize', handleUpdate);\n }\n };\n\n const cleanup = () => {\n if (initialized) {\n initialized = false;\n\n window.removeEventListener('scroll', handleUpdate);\n window.removeEventListener('resize', handleUpdate);\n }\n };\n\n return {\n get visible() {\n return Boolean(state.currentId);\n },\n getActiveReference,\n show,\n hide,\n init,\n cleanup,\n };\n}\n\nfunction createTooltipElement(options: TooltipElementOptions) {\n const {className} = options;\n\n const id = generateId();\n const tooltip = document.createElement('div');\n\n tooltip.id = id;\n tooltip.className = className ? `${TOOLTIP_BASE_CLASS} ${className}` : TOOLTIP_BASE_CLASS;\n\n return tooltip;\n}\n\nfunction attachTooltip(tooltip: HTMLElement, reference: HTMLElement, text: string) {\n const container = document.querySelector(PAGE_CONTAINER_SELECTOR) || document.body;\n\n reference.setAttribute(TOOLTIP_DATA_ATTR, tooltip.id);\n container.appendChild(tooltip);\n tooltip.textContent = text;\n}\n\nfunction detachTooltip(tooltip: HTMLElement) {\n if (tooltip.id) {\n const reference = getReferenceByTooltipId(tooltip.id);\n\n reference?.removeAttribute(TOOLTIP_DATA_ATTR);\n }\n\n tooltip.remove();\n}\n\nfunction getReferenceByTooltipId(id: string) {\n return document.querySelector<HTMLElement>(`[${TOOLTIP_DATA_ATTR}=\"${id}\"]`);\n}\n\nfunction subscribeToScroll(reference: HTMLElement, update: () => void) {\n const scrollableElement = getParentScrollableElement(reference);\n\n scrollableElement.addEventListener('scroll', update);\n\n return () => {\n scrollableElement.removeEventListener('scroll', update);\n };\n}\n\nfunction getParentScrollableElement(target: HTMLElement) {\n const closestScrollableParent = target.closest('table') || target.closest('code');\n\n return closestScrollableParent || target.parentElement || document.body;\n}\n\nfunction createTooltipContext(\n referenceElement: HTMLElement,\n tooltipElement: HTMLElement,\n): TooltipContext | null {\n const tooltipParent = tooltipElement.parentElement;\n\n if (!tooltipParent) {\n return null;\n }\n\n const elements: TooltipContextElements = {\n reference: referenceElement,\n tooltip: tooltipElement,\n offsetParent: tooltipParent,\n };\n\n const viewport = getViewportRect();\n const reference = getElementRect(referenceElement);\n const {width, height} = tooltipElement.getBoundingClientRect();\n\n return {\n isRtl: document.dir === 'rtl',\n viewport,\n reference,\n tooltip: createRect({top: 0, left: 0, width, height}),\n elements,\n };\n}\n\nfunction updateTooltipPosition(\n options: TooltipOptions,\n referenceElement: HTMLElement,\n tooltipElement: HTMLElement,\n) {\n const context = createTooltipContext(referenceElement, tooltipElement);\n\n if (!context) {\n return;\n }\n\n const coords = getTooltipCoords(context, options);\n\n tooltipElement.style.top = `${coords.y}px`;\n tooltipElement.style.left = `${coords.x}px`;\n}\n\nfunction getTooltipCoords(context: TooltipContext, options: TooltipOptions): Coords {\n const {placement = 'bottom-start', offset = DEFAULT_OFFSET_VALUES, flip = true} = options;\n const {reference, tooltip, viewport, isRtl} = context;\n\n const {coords} = computePosition(reference, tooltip, viewport, placement, offset, isRtl, flip);\n\n const rect = updateRect(tooltip, {top: coords.y, left: coords.x});\n const relativeRect = convertToRelativeToOffsetParentRect(rect, context.elements.offsetParent);\n\n return {\n x: relativeRect.left,\n y: relativeRect.top,\n };\n}\n", "import type {Lang} from '../transform/typings';\n\nexport const COPIED_LANG_TOKEN: Record<Lang, string> = {\n ru: '\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E',\n en: 'Copied',\n ar: '\u062A\u0645 \u0627\u0644\u0646\u0633\u062E',\n cs: 'Zkop\u00EDrov\u00E1no',\n fr: 'Copi\u00E9',\n es: 'Copiado',\n he: '\u05D4\u05D5\u05E2\u05EA\u05E7',\n bg: '\u041A\u043E\u043F\u0438\u0440\u0430\u043D\u043E',\n et: 'Kopeeritud',\n el: '\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5',\n pt: 'Copiado',\n zh: '\u5DF2\u590D\u5236',\n 'zh-tw': '\u5DF2\u8907\u88FD',\n kk: '\u041A\u04E9\u0448\u0456\u0440\u0456\u043B\u0434\u0456',\n tr: 'Kopyaland\u0131',\n uz: 'Nusxalandi',\n};\n", "import type {Lang} from '../transform/typings';\n\nimport {createTooltipFactory} from './tooltip';\nimport {copyToClipboard, getEventTarget, isCustom} from './utils';\nimport {COPIED_LANG_TOKEN} from './constant';\n\nconst ALLOWED_PROTOCOL_RE = /^(?:https?|file):$/;\nconst ANCHOR_BUTTON_SELECTOR = '.yfm-clipboard-anchor';\n\nconst tooltip = createTooltipFactory();\n\nfunction getLink(target: HTMLElement) {\n const href = target.nodeName === 'A' ? (target as HTMLAnchorElement).href : target.dataset.href;\n const link = new URL(href || '', window.location.href);\n\n if (ALLOWED_PROTOCOL_RE.test(link.protocol)) {\n return link.href;\n }\n\n return window.location.href;\n}\n\nif (typeof document !== 'undefined') {\n tooltip.init();\n\n document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !target.matches(ANCHOR_BUTTON_SELECTOR)) {\n return;\n }\n\n const link = getLink(target);\n\n copyToClipboard(link).then(() => {\n const lang = document.documentElement.lang || 'en';\n const tooltipText = COPIED_LANG_TOKEN[lang as Lang] ?? COPIED_LANG_TOKEN.en;\n\n tooltip.show(target, tooltipText);\n });\n });\n}\n", "import type {Lang} from '../../transform/typings';\n\nimport {createTooltipFactory} from '../tooltip';\nimport {copyToClipboard, getEventTarget, isCustom} from '../utils';\nimport {COPIED_LANG_TOKEN} from '../constant';\n\nconst CLASS_INLINE_CODE = 'yfm-clipboard-inline-code';\nconst INLINE_CODE = `.${CLASS_INLINE_CODE}`;\n\nconst tooltip = createTooltipFactory({\n // NOTE: Add additional className for backward capability\n additionalClassName: 'inline_code_tooltip',\n});\n\nexport function inlineCopyFn(target: HTMLElement) {\n const innerText = target.innerText;\n\n if (!innerText) {\n return;\n }\n\n copyToClipboard(innerText).then(() => {\n const lang = document.documentElement.lang || 'en';\n const tooltipText = COPIED_LANG_TOKEN[lang as Lang] ?? COPIED_LANG_TOKEN.en;\n\n tooltip.show(target, tooltipText);\n });\n}\n\nif (typeof document !== 'undefined') {\n tooltip.init();\n\n document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n const inline = target.matches(INLINE_CODE);\n\n if (isCustom(event) || !inline) {\n return;\n }\n\n inlineCopyFn(target);\n });\n\n document.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' && document.activeElement) {\n const activeElement = document.activeElement as HTMLElement;\n\n if (!activeElement.classList.contains(CLASS_INLINE_CODE)) {\n return;\n }\n\n inlineCopyFn(activeElement);\n }\n\n if (event.key === 'Escape' && tooltip.visible) {\n const reference = tooltip.getActiveReference();\n\n tooltip.hide();\n // Set focus back to open button after closing popup\n reference?.focus();\n }\n });\n}\n", "export const Selector = {\n TITLE: '.yfm .yfm-term_title',\n CONTENT: '.yfm .yfm-term_dfn',\n};\nexport const openClass = 'open';\nexport const openDefinitionClass = Selector.CONTENT.replace(/\\./g, '') + ' ' + openClass;\nlet isListenerNeeded = true;\n\nexport function setDefinitionId(definitionElement: HTMLElement, termElement: HTMLElement): void {\n const termId = termElement.getAttribute('id') || Math.random().toString(36).substr(2, 8);\n definitionElement?.setAttribute('term-id', termId);\n}\n\nexport function setDefinitonAriaAttributes(\n definitionElement: HTMLElement,\n termElement: HTMLElement,\n): void {\n const ariaLive = termElement.getAttribute('aria-live') || 'polite';\n definitionElement?.setAttribute('aria-live', ariaLive);\n definitionElement?.setAttribute('aria-modal', 'true');\n}\n\nexport function setDefinitionPosition(\n definitionElement: HTMLElement,\n termElement: HTMLElement,\n): void {\n const {\n x: termX,\n y: termY,\n right: termRight,\n left: termLeft,\n width: termWidth,\n height: termHeight,\n } = termElement.getBoundingClientRect();\n\n const termParent = termParentElement(termElement);\n\n if (!termParent) {\n return;\n }\n\n const {right: termParentRight, left: termParentLeft} = termParent.getBoundingClientRect();\n\n if ((termParentRight < termLeft || termParentLeft > termRight) && !isListenerNeeded) {\n closeDefinition(definitionElement);\n return;\n }\n\n if (isListenerNeeded && termParent) {\n termParent.addEventListener('scroll', termOnResize);\n isListenerNeeded = false;\n }\n\n const relativeX = Number(definitionElement.getAttribute('relativeX'));\n const relativeY = Number(definitionElement.getAttribute('relativeY'));\n\n if (relativeX === termX && relativeY === termY) {\n return;\n }\n\n definitionElement.setAttribute('relativeX', String(termX));\n definitionElement.setAttribute('relativeY', String(termY));\n\n const offsetTop = termHeight + 5;\n const definitionParent = definitionElement.parentElement;\n\n if (!definitionParent) {\n return;\n }\n\n const {width: definitionWidth} = definitionElement.getBoundingClientRect();\n const {left: definitionParentLeft} = definitionParent.getBoundingClientRect();\n\n // If definition not fit document change base alignment\n const definitionLeftCoordinate = Number(getCoords(termElement).left);\n const definitionRightCoordinate = definitionWidth + definitionLeftCoordinate;\n\n const definitionOutOfScreenOnLeft = definitionLeftCoordinate - definitionWidth < 0;\n const definitionOutOfScreenOnRight = definitionRightCoordinate > document.body.clientWidth;\n\n const isAlignSwapped = definitionOutOfScreenOnRight || document.dir === 'rtl';\n const fitDefinitionDocument =\n isAlignSwapped && !definitionOutOfScreenOnLeft ? definitionWidth - termWidth : 0;\n const customHeaderTop = getCoords(definitionParent).top - definitionParent.offsetTop;\n const offsetRight = 5;\n const shiftLeft = definitionOutOfScreenOnRight\n ? definitionRightCoordinate - document.body.clientWidth + offsetRight\n : 0;\n const offsetLeft =\n getCoords(termElement).left -\n definitionParentLeft +\n definitionParent.offsetLeft -\n fitDefinitionDocument;\n\n const isShiftLeftNeeded = offsetLeft + definitionWidth >= document.body.clientWidth;\n\n definitionElement.style.top =\n Number(getCoords(termElement).top + offsetTop - customHeaderTop) + 'px';\n definitionElement.style.left = Number(offsetLeft - (isShiftLeftNeeded ? shiftLeft : 0)) + 'px';\n}\n\nfunction termOnResize() {\n const openedDefinition = document.getElementsByClassName(openDefinitionClass)[0] as HTMLElement;\n\n if (!openedDefinition) {\n return;\n }\n const termId = openedDefinition.getAttribute('term-id') || '';\n const termElement = document.getElementById(termId);\n\n if (!termElement) {\n return;\n }\n\n setDefinitionPosition(openedDefinition, termElement);\n}\n\nfunction termParentElement(term: HTMLElement | null) {\n if (!term) {\n return null;\n }\n\n const closestScrollableParent = term.closest('table') || term.closest('code');\n\n return closestScrollableParent || term.parentElement;\n}\n\nexport function openDefinition(target: HTMLElement) {\n const openedDefinition = document.getElementsByClassName(openDefinitionClass)[0] as HTMLElement;\n\n const termId = target.getAttribute('id');\n const termKey = target.getAttribute('term-key');\n const definitionId = `${termKey}_element`;\n\n // Check if term is in modal window\n const isInModal = target.closest('.wide-container');\n\n let definitionElement: HTMLElement | null;\n\n if (isInModal) {\n // Find definition in modal window\n const modalContent = target.closest('.wide-content');\n if (!modalContent) {\n return;\n }\n definitionElement = modalContent.querySelector(`[id=\"${definitionId}\"]`) as HTMLElement;\n } else {\n // Find definition in normal document\n definitionElement = document.getElementById(definitionId);\n }\n\n const isSameTerm = openedDefinition && termId === openedDefinition.getAttribute('term-id');\n if (isSameTerm) {\n closeDefinition(openedDefinition);\n return;\n }\n\n const isTargetDefinitionContent = target.closest(\n [Selector.CONTENT.replace(' ', ''), openClass].join('.'),\n );\n\n if (openedDefinition && !isTargetDefinitionContent) {\n closeDefinition(openedDefinition);\n }\n\n if (!target.matches(Selector.TITLE) || !definitionElement) {\n return;\n }\n\n setDefinitionId(definitionElement, target);\n setDefinitonAriaAttributes(definitionElement, target);\n setDefinitionPosition(definitionElement, target);\n\n definitionElement.classList.toggle(openClass);\n\n trapFocus(definitionElement);\n}\n\nexport function closeDefinition(definition: HTMLElement) {\n definition.classList.remove(openClass);\n\n // Restore the off-screen position declared in CSS so the (still laid-out)\n // definition box does not extend the page's scrollable area. Inline\n // top/left were set by setDefinitionPosition() while the definition was\n // open; without this reset they would keep the box in the document flow.\n definition.style.top = '';\n definition.style.left = '';\n definition.removeAttribute('relativeX');\n definition.removeAttribute('relativeY');\n\n const term = getTermByDefinition(definition);\n const termParent = termParentElement(term);\n\n if (!termParent) {\n return;\n }\n\n termParent.removeEventListener('scroll', termOnResize);\n isListenerNeeded = true;\n}\n\nexport function getCoords(elem: HTMLElement) {\n const box = elem.getBoundingClientRect();\n\n const body = document.body;\n const docEl = document.documentElement;\n\n const scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\n const scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\n\n const clientTop = docEl.clientTop || body.clientTop || 0;\n const clientLeft = docEl.clientLeft || body.clientLeft || 0;\n\n const top = box.top + scrollTop - clientTop;\n const left = box.left + scrollLeft - clientLeft;\n\n return {top: Math.round(top), left: Math.round(left)};\n}\n\nexport function trapFocus(element: HTMLElement) {\n const focusableElements = element.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n const firstFocusableElement = focusableElements[0] as HTMLElement;\n const lastFocusableElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (firstFocusableElement) {\n firstFocusableElement.focus();\n }\n\n element.addEventListener('keydown', function (e) {\n const isTabPressed = e.key === 'Tab' || e.keyCode === 9;\n if (!isTabPressed) {\n return;\n }\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n lastFocusableElement.focus();\n e.preventDefault();\n }\n } else if (document.activeElement === lastFocusableElement) {\n firstFocusableElement.focus();\n e.preventDefault();\n }\n });\n}\n\nexport function getTermByDefinition(definition: HTMLElement) {\n const termId = definition.getAttribute('term-id');\n\n if (!termId) {\n return null;\n }\n\n // Check if definition is in modal window\n const isInModal = definition.closest('.wide-container');\n\n if (isInModal) {\n // Find term in modal window\n const modalContent = definition.closest('.wide-content');\n if (!modalContent) {\n return null;\n }\n return modalContent.querySelector(`[id=\"${termId}\"]`) as HTMLElement;\n }\n\n // Find term in normal document\n return document.getElementById(termId);\n}\n", "import {getEventTarget, isCustom} from '../utils';\n\nimport {\n closeDefinition,\n getTermByDefinition,\n openClass,\n openDefinition,\n openDefinitionClass,\n setDefinitionPosition,\n} from './utils';\n\nif (typeof document !== 'undefined') {\n document.addEventListener('click', (event) => {\n if (getEventTarget(event) || !isCustom(event)) {\n openDefinition(getEventTarget(event) as HTMLElement);\n }\n });\n\n document.addEventListener('keydown', (event) => {\n const openedDefinition = document.getElementsByClassName(\n openDefinitionClass,\n )[0] as HTMLElement;\n\n if (event.key === 'Enter' && document.activeElement) {\n openDefinition(document.activeElement as HTMLElement);\n }\n\n if (event.key === 'Escape' && openedDefinition) {\n closeDefinition(openedDefinition);\n getTermByDefinition(openedDefinition)?.focus(); // Set focus back to open button after closing popup\n }\n });\n\n window.addEventListener('resize', () => {\n const openedDefinition = document.getElementsByClassName(\n openDefinitionClass,\n )[0] as HTMLElement;\n\n if (!openedDefinition) {\n return;\n }\n\n const termId = openedDefinition.getAttribute('term-id') || '';\n const termElement = document.getElementById(termId);\n\n if (!termElement) {\n openedDefinition.classList.toggle(openClass);\n return;\n }\n\n setDefinitionPosition(openedDefinition, termElement);\n });\n}\n", "export const WIDE_ELEMENTS_SELECTOR = '[wide-content]';\n", "export default `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 16 16\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M7.754 2.004a.75.75 0 0 0 0 1.5h4.75v4.742a.75.75 0 0 0 1.5 0V2.754a.75.75 0 0 0-.75-.75zm.492 11.992a.75.75 0 0 0 0-1.5h-4.75V7.754a.75.75 0 0 0-1.5 0v5.492a.75.75 0 0 0 .75.75z\" clip-rule=\"evenodd\"/></svg>`;\n", "export default `<svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"close-action\"><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M9.46967 9.46967C9.76256 9.17678 10.2374 9.17678 10.5303 9.46967L14 12.9393L17.4697 9.46967C17.7626 9.17678 18.2374 9.17678 18.5303 9.46967C18.8232 9.76256 18.8232 10.2374 18.5303 10.5303L15.0607 14L18.5303 17.4697C18.8232 17.7626 18.8232 18.2374 18.5303 18.5303C18.2374 18.8232 17.7626 18.8232 17.4697 18.5303L14 15.0607L10.5303 18.5303C10.2374 18.8232 9.76256 18.8232 9.46967 18.5303C9.17678 18.2374 9.17678 17.7626 9.46967 17.4697L12.9393 14L9.46967 10.5303C9.17678 10.2374 9.17678 9.76256 9.46967 9.46967Z\" fill=\"var(--g-color-text-primary)\" fillOpacity=\"0.85\"/></svg>`;\n", "import closeIcon from './icons/close';\n\nconst remove = () => {\n if (!window.wideTemplate) {\n return;\n }\n\n window.wideTemplate.style.display = 'none';\n window.wideTemplate.content(undefined);\n};\n\nconst tbodyOf = (node: HTMLElement) => {\n if (node.tagName !== 'TABLE') {\n return undefined;\n }\n\n const elements = Array.from(node.children);\n\n const thead = elements.find((child) => child.tagName === 'THEAD');\n\n if (thead) {\n return undefined;\n }\n\n const tbody = elements.find((child) => child.tagName === 'TBODY');\n\n return tbody;\n};\n\ntype ModalContainer = NonNullable<typeof window.wideTemplate>;\n\n/* @todo refactor to markup with innerHTML @v8tenko */\n\nconst container = () => {\n if (window.wideTemplate) {\n return window.wideTemplate;\n }\n\n const template = document.createElement('div') as ModalContainer;\n template.classList.add('dc-doc-page', 'wide-container');\n\n const overlay = document.createElement('div');\n overlay.classList.add('wide-content-overlay');\n overlay.addEventListener('click', remove);\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('yfm', 'wide-content-wrapper');\n\n const toolbar = document.createElement('div');\n toolbar.classList.add('wide-toolbar');\n\n const close = document.createElement('div');\n close.classList.add('wide-actions');\n close.addEventListener('click', remove);\n close.innerHTML = closeIcon;\n\n const title = document.createElement('p');\n title.classList.add('wide-entity-name');\n\n template.label = (content?: string) => {\n title.innerHTML = content || '';\n };\n\n const content = document.createElement('div');\n content.classList.add('wide-content');\n\n template.content = (target?: Element) => {\n if (typeof target === 'undefined') {\n content.innerHTML = '';\n\n return;\n }\n\n const cloned = target.cloneNode(true) as HTMLElement;\n\n const tbody = tbodyOf(cloned);\n\n /* used to stretch single tbody to 100% */\n tbody?.classList?.add('wide-thead-content');\n\n // Find all term titles in the cloned table\n const termTitles = cloned.querySelectorAll('.yfm-term_title');\n\n // Collect all term definitions that are referenced in the table\n const termDefinitions: HTMLElement[] = [];\n\n termTitles.forEach((termTitle) => {\n const termKey = termTitle.getAttribute('term-key');\n if (termKey) {\n // Find the original definition in the document\n const originalDefinition = document.getElementById(termKey + '_element');\n if (originalDefinition) {\n // Clone the definition\n const clonedDefinition = originalDefinition.cloneNode(true) as HTMLElement;\n termDefinitions.push(clonedDefinition);\n }\n }\n });\n\n // Add all cloned definitions to the content\n content.replaceChildren(cloned, ...termDefinitions);\n };\n\n toolbar.append(title, close);\n wrapper.append(toolbar, content);\n template.append(overlay, wrapper);\n\n template.style.display = 'none';\n document.body.appendChild(template);\n\n window.wideTemplate = template;\n\n return template;\n};\n\nconst render = (content: HTMLElement) => {\n const template = container();\n\n template.label(content.title);\n template.content(content);\n\n template.style.display = 'flex';\n};\n\nexport const modal = {\n render,\n remove,\n};\n", "import {WIDE_ELEMENTS_SELECTOR} from './constants';\nimport expand from './icons/expand';\nimport {modal} from './modal';\n\nconst wrap = (target: HTMLElement) => {\n if (target.parentElement?.classList.contains('wide-element-wrapper')) {\n return;\n }\n\n target.classList.add('wide-inner-element');\n\n const handler = document.createElement('div');\n\n handler.innerHTML = expand;\n handler.classList.add('wide-content-viewer');\n handler.addEventListener('click', () => modal.render(target));\n\n const container = document.createElement('div');\n\n container.classList.add('wide-element-wrapper');\n\n target.before(container);\n\n container.appendChild(target);\n container.appendChild(handler);\n};\n\nexport const applyWideMode = () => {\n const allWideElements = Array.from(\n document.querySelectorAll(WIDE_ELEMENTS_SELECTOR),\n ) as HTMLElement[];\n\n allWideElements.forEach(wrap);\n};\n", "import {applyWideMode} from './apply';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n window.addEventListener('load', applyWideMode);\n}\n", "import {applyWideMode} from './wide-mode/apply';\n\nconst patch = () => {\n applyWideMode();\n};\n\nif (typeof window !== 'undefined') {\n window.patchAfterRender = patch;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_get_root_node_polyfill", "__commonJS", "exports", "module", "getRootNode", "opt", "composed", "getShadowIncludingRoot", "getRoot", "node", "root", "isShadowRoot", "GLOBAL_KEY", "ClassNames", "YfmCutController", "__publicField", "mouseEvent", "summaryAtBlur", "keepMouse", "amendMouse", "onWindowBlur", "active", "isSummary", "onFocus", "event", "restored", "disposer", "summary", "cutNode", "isDetails", "element", "TABS_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_LIST_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_VARIANT", "TAB_DATA_ID", "DEFAULT_TABS_GROUP_PREFIX", "TAB_FORCED_OPEN", "TABS_DROPDOWN_SELECT", "TABS_RADIO_CLASSNAME", "TabsVariants", "GLOBAL_SYMBOL", "getEventTarget", "path", "isCustom", "target", "getClosestScrollableParent", "getOffsetByScrollableParent", "scrollableParent", "elementBounds", "scrollableParentBounds", "Selector", "escapeCssAttrValue", "value", "findTabsByGroupAndKey", "doc", "group", "key", "containers", "result", "container", "tab", "TabsController", "document", "options", "direction", "tabs", "nodes", "currentTab", "currentTabIndex", "newIndex", "handler", "id", "tabsHistory", "fields", "urlParams", "config", "splitConfig", "variant", "keyWithSpaces", "tabsArray", "currentState", "url", "groups", "targetTab", "previousTargetOffset", "isForced", "el", "updated", "elements", "i", "title", "content", "input", "htmlElem", "tabList", "tabsContainer", "allTabs", "allPanels", "targetIndex", "panel", "isTargetTab", "changed", "dropdown", "select", "menu", "changedIndex", "item", "menuItem", "accordion", "rect", "viewHeight", "targetOffset", "topDelta", "leftDelta", "scrollTopDelta", "scrollLeftDelta", "diplodocId", "align", "eventTab", "tabsRoot", "_a", "_b", "_c", "type", "tabEl", "import_get_root_node_polyfill", "__toESM", "e", "matches", "selector", "th", "copyToClipboard", "text", "textarea", "COPY_BUTTON_SELECTOR", "WRAP_BUTTON_SELECTOR", "FLOATING_CONTAINER_SELECTOR", "SELECTED_WRAP_BUTTON", "notifySuccess", "svgButton", "icon", "buttonCopyFn", "button", "code", "clone", "textContent", "promptValue", "prefix", "line", "trimmed", "leadingWs", "buttonWrapFn", "hasWrap", "PAGE_CONTAINER_SELECTOR", "TOOLTIP_BASE_CLASS", "TOOLTIP_OPEN_CLASS", "TOOLTIP_DATA_ATTR", "TOOLTIP_LIVE_REGION_CLASS", "DEFAULT_OFFSET_VALUES", "OPPOSITE_SIDES", "DEFAULT_SIDE_OBJECT", "isVerticalSide", "side", "createSideObject", "parsePlacement", "placement", "alignment", "getOppositeSide", "flipPlacement", "opposite", "getOverflow", "tooltip", "coords", "viewport", "updateRect", "detectOverflow", "shouldFlip", "overflow", "flippedOverflow", "computePosition", "reference", "offset", "isRtl", "flip", "computeCoordsFromPlacement", "flipped", "flippedCoords", "generateId", "random", "now", "createRect", "params", "_d", "getViewportRect", "documentElement", "body", "scrollTop", "scrollLeft", "clientTop", "clientLeft", "getElementRect", "box", "computeAxisOffset", "mainAxis", "crossAxis", "isVertical", "mainDirection", "crossDirection", "mainOffset", "crossOffset", "alignmentAxis", "alignLength", "centerX", "centerY", "alignmentOffset", "axisOffset", "convertToRelativeToOffsetParentRect", "offsetParent", "offsetRect", "boundary", "padding", "top", "bottom", "left", "right", "createTooltipFactory", "closeDelay", "additionalClassName", "initialized", "liveRegion", "state", "getActiveTooltip", "getActiveReference", "getReferenceByTooltipId", "hide", "detachTooltip", "show", "createTooltipElement", "update", "updateTooltipPosition", "attachTooltip", "subscribeToScroll", "handleUpdate", "activeTooltip", "activeReference", "className", "scrollableElement", "getParentScrollableElement", "createTooltipContext", "referenceElement", "tooltipElement", "tooltipParent", "width", "height", "context", "getTooltipCoords", "relativeRect", "COPIED_LANG_TOKEN", "ALLOWED_PROTOCOL_RE", "ANCHOR_BUTTON_SELECTOR", "getLink", "href", "link", "lang", "tooltipText", "CLASS_INLINE_CODE", "INLINE_CODE", "inlineCopyFn", "innerText", "inline", "activeElement", "openClass", "openDefinitionClass", "isListenerNeeded", "setDefinitionId", "definitionElement", "termElement", "termId", "setDefinitonAriaAttributes", "ariaLive", "setDefinitionPosition", "termX", "termY", "termRight", "termLeft", "termWidth", "termHeight", "termParent", "termParentElement", "termParentRight", "termParentLeft", "closeDefinition", "termOnResize", "relativeX", "relativeY", "offsetTop", "definitionParent", "definitionWidth", "definitionParentLeft", "definitionLeftCoordinate", "getCoords", "definitionRightCoordinate", "definitionOutOfScreenOnLeft", "definitionOutOfScreenOnRight", "fitDefinitionDocument", "customHeaderTop", "shiftLeft", "offsetLeft", "isShiftLeftNeeded", "openedDefinition", "term", "openDefinition", "definitionId", "isInModal", "modalContent", "isTargetDefinitionContent", "trapFocus", "definition", "getTermByDefinition", "elem", "docEl", "focusableElements", "firstFocusableElement", "lastFocusableElement", "WIDE_ELEMENTS_SELECTOR", "expand_default", "close_default", "remove", "tbodyOf", "child", "template", "overlay", "wrapper", "toolbar", "close", "cloned", "tbody", "termTitles", "termDefinitions", "termTitle", "termKey", "originalDefinition", "clonedDefinition", "render", "modal", "wrap", "applyWideMode", "patch"]
|
|
7
7
|
}
|