@diplodoc/transform 4.77.0 → 4.77.2
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 +2 -0
- package/dist/css/_yfm-only.css.map +3 -3
- package/dist/css/_yfm-only.min.css +1 -1
- package/dist/css/_yfm-only.min.css.map +3 -3
- 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 +2 -0
- package/dist/css/yfm.css.map +3 -3
- package/dist/css/yfm.min.css +1 -1
- package/dist/css/yfm.min.css.map +3 -3
- package/dist/js/_yfm-only.js +4 -0
- package/dist/js/_yfm-only.js.map +2 -2
- package/dist/js/_yfm-only.min.js +1 -1
- package/dist/js/_yfm-only.min.js.map +2 -2
- package/dist/js/base.js.map +1 -1
- package/dist/js/base.min.js.map +1 -1
- package/dist/js/yfm.js +4 -0
- package/dist/js/yfm.js.map +2 -2
- package/dist/js/yfm.min.js +1 -1
- package/dist/js/yfm.min.js.map +2 -2
- package/dist/scss/_term.scss +8 -0
- package/lib/plugins/code.js +4 -3
- package/lib/plugins/code.js.map +1 -1
- package/lib/plugins/links/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/js/anchor.ts +1 -1
- package/src/js/constant.ts +1 -1
- package/src/js/inline-code/index.ts +1 -1
- package/src/js/term/utils.ts +10 -0
- package/src/scss/_term.scss +8 -0
- package/src/transform/plugins/code.ts +4 -2
- package/src/transform/plugins/links/index.ts +1 -1
package/dist/js/_yfm-only.js
CHANGED
|
@@ -134,6 +134,10 @@
|
|
|
134
134
|
}
|
|
135
135
|
function closeDefinition(definition) {
|
|
136
136
|
definition.classList.remove(openClass);
|
|
137
|
+
definition.style.top = "";
|
|
138
|
+
definition.style.left = "";
|
|
139
|
+
definition.removeAttribute("relativeX");
|
|
140
|
+
definition.removeAttribute("relativeY");
|
|
137
141
|
const term = getTermByDefinition(definition);
|
|
138
142
|
const termParent = termParentElement(term);
|
|
139
143
|
if (!termParent) {
|
package/dist/js/_yfm-only.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/js/utils.ts", "../../src/js/term/utils.ts", "../../src/js/term/index.ts"],
|
|
4
|
-
"sourcesContent": ["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", "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 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"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["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", "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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/js/_yfm-only.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{(()=>{var y=t=>{let e=t.composedPath();return Array.isArray(e)&&e.length>0?e[0]:t.target},I=t=>{let e=y(t);return!e||!e.matches},
|
|
1
|
+
"use strict";(()=>{(()=>{var y=t=>{let e=t.composedPath();return Array.isArray(e)&&e.length>0?e[0]:t.target},I=t=>{let e=y(t);return!e||!e.matches},v={TITLE:".yfm .yfm-term_title",CONTENT:".yfm .yfm-term_dfn"},u="open",f=v.CONTENT.replace(/\./g,"")+" "+u,a=!0;function S(t,e){let n=e.getAttribute("id")||Math.random().toString(36).substr(2,8);t==null||t.setAttribute("term-id",n)}function B(t,e){let n=e.getAttribute("aria-live")||"polite";t==null||t.setAttribute("aria-live",n),t==null||t.setAttribute("aria-modal","true")}function h(t,e){let{x:n,y:o,right:i,left:c,width:r,height:p}=e.getBoundingClientRect(),s=T(e);if(!s)return;let{right:l,left:O}=s.getBoundingClientRect();if((l<c||O>i)&&!a){m(t);return}a&&s&&(s.addEventListener("scroll",L),a=!1);let R=Number(t.getAttribute("relativeX")),k=Number(t.getAttribute("relativeY"));if(R===n&&k===o)return;t.setAttribute("relativeX",String(n)),t.setAttribute("relativeY",String(o));let x=p+5,d=t.parentElement;if(!d)return;let{width:b}=t.getBoundingClientRect(),{left:M}=d.getBoundingClientRect(),E=Number(g(e).left),N=b+E,X=E-b<0,w=N>document.body.clientWidth,Y=(w||document.dir==="rtl")&&!X?b-r:0,W=g(d).top-d.offsetTop,_=w?N-document.body.clientWidth+5:0,D=g(e).left-M+d.offsetLeft-Y,q=D+b>=document.body.clientWidth;t.style.top=Number(g(e).top+x-W)+"px",t.style.left=Number(D-(q?_:0))+"px"}function L(){let t=document.getElementsByClassName(f)[0];if(!t)return;let e=t.getAttribute("term-id")||"",n=document.getElementById(e);n&&h(t,n)}function T(t){return t?t.closest("table")||t.closest("code")||t.parentElement:null}function A(t){let e=document.getElementsByClassName(f)[0],n=t.getAttribute("id"),i=`${t.getAttribute("term-key")}_element`,c=t.closest(".wide-container"),r;if(c){let l=t.closest(".wide-content");if(!l)return;r=l.querySelector(`[id="${i}"]`)}else r=document.getElementById(i);if(e&&n===e.getAttribute("term-id")){m(e);return}let s=t.closest([v.CONTENT.replace(" ",""),u].join("."));e&&!s&&m(e),!(!t.matches(v.TITLE)||!r)&&(S(r,t),B(r,t),h(r,t),r.classList.toggle(u),P(r))}function m(t){t.classList.remove(u),t.style.top="",t.style.left="",t.removeAttribute("relativeX"),t.removeAttribute("relativeY");let e=C(t),n=T(e);n&&(n.removeEventListener("scroll",L),a=!0)}function g(t){let e=t.getBoundingClientRect(),n=document.body,o=document.documentElement,i=window.pageYOffset||o.scrollTop||n.scrollTop,c=window.pageXOffset||o.scrollLeft||n.scrollLeft,r=o.clientTop||n.clientTop||0,p=o.clientLeft||n.clientLeft||0,s=e.top+i-r,l=e.left+c-p;return{top:Math.round(s),left:Math.round(l)}}function P(t){let e=t.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),n=e[0],o=e[e.length-1];n&&n.focus(),t.addEventListener("keydown",function(i){(i.key==="Tab"||i.keyCode===9)&&(i.shiftKey?document.activeElement===n&&(o.focus(),i.preventDefault()):document.activeElement===o&&(n.focus(),i.preventDefault()))})}function C(t){let e=t.getAttribute("term-id");if(!e)return null;if(t.closest(".wide-container")){let o=t.closest(".wide-content");return o?o.querySelector(`[id="${e}"]`):null}return document.getElementById(e)}typeof document!="undefined"&&(document.addEventListener("click",t=>{(y(t)||!I(t))&&A(y(t))}),document.addEventListener("keydown",t=>{var e;let n=document.getElementsByClassName(f)[0];t.key==="Enter"&&document.activeElement&&A(document.activeElement),t.key==="Escape"&&n&&(m(n),(e=C(n))==null||e.focus())}),window.addEventListener("resize",()=>{let t=document.getElementsByClassName(f)[0];if(!t)return;let e=t.getAttribute("term-id")||"",n=document.getElementById(e);if(!n){t.classList.toggle(u);return}h(t,n)}))})();})();
|
|
2
2
|
//# sourceMappingURL=_yfm-only.min.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/js/utils.ts", "../../src/js/term/utils.ts", "../../src/js/term/index.ts"],
|
|
4
|
-
"sourcesContent": ["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", "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 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"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["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", "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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["getEventTarget", "event", "path", "isCustom", "target", "Selector", "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", "box", "body", "docEl", "scrollTop", "scrollLeft", "clientTop", "clientLeft", "top", "left", "element", "focusableElements", "firstFocusableElement", "lastFocusableElement", "e", "_a"]
|
|
7
7
|
}
|
package/dist/js/base.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../node_modules/get-root-node-polyfill/index.js", "../../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"],
|
|
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", "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 'src/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 'src/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 'src/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"],
|
|
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", "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"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["getRootNode", "matches", "getRootNode", "e", "tooltip", "tooltip", "tooltip"]
|
|
7
7
|
}
|
package/dist/js/base.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", "../../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"],
|
|
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", "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 'src/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 'src/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 'src/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"],
|
|
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", "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"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["require_get_root_node_polyfill", "__commonJS", "exports", "module", "getRootNode", "opt", "composed", "getShadowIncludingRoot", "getRoot", "node", "root", "isShadowRoot", "import_get_root_node_polyfill", "__toESM", "e", "matches", "selector", "th", "getEventTarget", "event", "path", "isCustom", "target", "copyToClipboard", "text", "textarea", "COPY_BUTTON_SELECTOR", "WRAP_BUTTON_SELECTOR", "FLOATING_CONTAINER_SELECTOR", "SELECTED_WRAP_BUTTON", "notifySuccess", "svgButton", "id", "icon", "buttonCopyFn", "_a", "button", "container", "code", "clone", "el", "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", "value", "parsePlacement", "placement", "alignment", "getOppositeSide", "flipPlacement", "opposite", "getOverflow", "tooltip", "coords", "viewport", "rect", "updateRect", "detectOverflow", "shouldFlip", "overflow", "flippedOverflow", "computePosition", "reference", "offset", "isRtl", "flip", "computeCoordsFromPlacement", "flipped", "flippedCoords", "generateId", "random", "now", "createRect", "params", "_b", "_c", "_d", "getViewportRect", "documentElement", "body", "scrollTop", "scrollLeft", "clientTop", "clientLeft", "getElementRect", "element", "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", "options", "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", "elements", "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"]
|
|
7
7
|
}
|
package/dist/js/yfm.js
CHANGED
|
@@ -1103,6 +1103,10 @@
|
|
|
1103
1103
|
}
|
|
1104
1104
|
function closeDefinition(definition) {
|
|
1105
1105
|
definition.classList.remove(openClass);
|
|
1106
|
+
definition.style.top = "";
|
|
1107
|
+
definition.style.left = "";
|
|
1108
|
+
definition.removeAttribute("relativeX");
|
|
1109
|
+
definition.removeAttribute("relativeY");
|
|
1106
1110
|
const term = getTermByDefinition(definition);
|
|
1107
1111
|
const termParent = termParentElement(term);
|
|
1108
1112
|
if (!termParent) {
|