| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 "use strict"; 2 var wp; 3 (wp ||= {}).dom = (() => { 4 var __create = Object.create; 5 var __defProp = Object.defineProperty; 6 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 7 var __getOwnPropNames = Object.getOwnPropertyNames; 8 var __getProtoOf = Object.getPrototypeOf; 9 var __hasOwnProp = Object.prototype.hasOwnProperty; 10 var __commonJS = (cb, mod) => function __require() { 11 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 12 }; 13 var __export = (target, all) => { 14 for (var name in all) 15 __defProp(target, name, { get: all[name], enumerable: true }); 16 }; 17 var __copyProps = (to, from, except, desc) => { 18 if (from && typeof from === "object" || typeof from === "function") { 19 for (let key of __getOwnPropNames(from)) 20 if (!__hasOwnProp.call(to, key) && key !== except) 21 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 22 } 23 return to; 24 }; 25 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 26 // If the importer is in node compatibility mode or this is not an ESM 27 // file that has been converted to a CommonJS file using a Babel- 28 // compatible transform (i.e. "__esModule" has not been set), then set 29 // "default" to the CommonJS "module.exports" for node compatibility. 30 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 31 mod 32 )); 33 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 34 35 // package-external:@wordpress/deprecated 36 var require_deprecated = __commonJS({ 37 "package-external:@wordpress/deprecated"(exports, module) { 38 module.exports = window.wp.deprecated; 39 } 40 }); 41 42 // packages/dom/build-module/index.mjs 43 var index_exports = {}; 44 __export(index_exports, { 45 __unstableStripHTML: () => stripHTML, 46 computeCaretRect: () => computeCaretRect, 47 documentHasSelection: () => documentHasSelection, 48 documentHasTextSelection: () => documentHasTextSelection, 49 documentHasUncollapsedSelection: () => documentHasUncollapsedSelection, 50 focus: () => focus, 51 getFilesFromDataTransfer: () => getFilesFromDataTransfer, 52 getOffsetParent: () => getOffsetParent, 53 getPhrasingContentSchema: () => getPhrasingContentSchema, 54 getRectangleFromRange: () => getRectangleFromRange, 55 getScrollContainer: () => getScrollContainer, 56 insertAfter: () => insertAfter, 57 isEmpty: () => isEmpty, 58 isEntirelySelected: () => isEntirelySelected, 59 isFormElement: () => isFormElement, 60 isHorizontalEdge: () => isHorizontalEdge, 61 isNumberInput: () => isNumberInput, 62 isPhrasingContent: () => isPhrasingContent, 63 isRTL: () => isRTL, 64 isSelectionForward: () => isSelectionForward, 65 isTextContent: () => isTextContent, 66 isTextField: () => isTextField, 67 isVerticalEdge: () => isVerticalEdge, 68 placeCaretAtHorizontalEdge: () => placeCaretAtHorizontalEdge, 69 placeCaretAtVerticalEdge: () => placeCaretAtVerticalEdge, 70 remove: () => remove, 71 removeInvalidHTML: () => removeInvalidHTML, 72 replace: () => replace, 73 replaceTag: () => replaceTag, 74 safeHTML: () => safeHTML, 75 unwrap: () => unwrap, 76 wrap: () => wrap 77 }); 78 79 // packages/dom/build-module/focusable.mjs 80 var focusable_exports = {}; 81 __export(focusable_exports, { 82 find: () => find 83 }); 84 function buildSelector(sequential) { 85 return [ 86 sequential ? '[tabindex]:not([tabindex^="-"])' : "[tabindex]", 87 "a[href]", 88 "button:not([disabled])", 89 'input:not([type="hidden"]):not([disabled])', 90 "select:not([disabled])", 91 "textarea:not([disabled])", 92 'iframe:not([tabindex^="-"])', 93 "object", 94 "embed", 95 "summary", 96 "area[href]", 97 "[contenteditable]:not([contenteditable=false])" 98 ].join(","); 99 } 100 function isVisible(element) { 101 return element.offsetWidth > 0 || element.offsetHeight > 0 || element.getClientRects().length > 0; 102 } 103 function isValidFocusableArea(element) { 104 const map = element.closest("map[name]"); 105 if (!map) { 106 return false; 107 } 108 const img = element.ownerDocument.querySelector( 109 'img[usemap="#' + map.name + '"]' 110 ); 111 return !!img && isVisible(img); 112 } 113 function find(context, { sequential = false } = {}) { 114 const elements = context.querySelectorAll(buildSelector(sequential)); 115 return Array.from(elements).filter((element) => { 116 if (!isVisible(element)) { 117 return false; 118 } 119 if (element.closest("[inert]")) { 120 return false; 121 } 122 const { nodeName } = element; 123 if ("AREA" === nodeName) { 124 return isValidFocusableArea( 125 /** @type {HTMLAreaElement} */ 126 element 127 ); 128 } 129 return true; 130 }); 131 } 132 133 // packages/dom/build-module/tabbable.mjs 134 var tabbable_exports = {}; 135 __export(tabbable_exports, { 136 find: () => find2, 137 findNext: () => findNext, 138 findPrevious: () => findPrevious, 139 isTabbableIndex: () => isTabbableIndex 140 }); 141 function getTabIndex(element) { 142 const tabIndex = element.getAttribute("tabindex"); 143 return tabIndex === null ? 0 : parseInt(tabIndex, 10); 144 } 145 function isTabbableIndex(element) { 146 return getTabIndex(element) !== -1; 147 } 148 function createStatefulCollapseRadioGroup() { 149 const CHOSEN_RADIO_BY_NAME = {}; 150 return function collapseRadioGroup(result, element) { 151 const { nodeName, type, checked, name } = element; 152 if (nodeName !== "INPUT" || type !== "radio" || !name) { 153 return result.concat(element); 154 } 155 const hasChosen = CHOSEN_RADIO_BY_NAME.hasOwnProperty(name); 156 const isChosen = checked || !hasChosen; 157 if (!isChosen) { 158 return result; 159 } 160 if (hasChosen) { 161 const hadChosenElement = CHOSEN_RADIO_BY_NAME[name]; 162 result = result.filter((e) => e !== hadChosenElement); 163 } 164 CHOSEN_RADIO_BY_NAME[name] = element; 165 return result.concat(element); 166 }; 167 } 168 function mapElementToObjectTabbable(element, index) { 169 return { element, index }; 170 } 171 function mapObjectTabbableToElement(object) { 172 return object.element; 173 } 174 function compareObjectTabbables(a, b) { 175 const aTabIndex = getTabIndex(a.element); 176 const bTabIndex = getTabIndex(b.element); 177 if (aTabIndex === bTabIndex) { 178 return a.index - b.index; 179 } 180 return aTabIndex - bTabIndex; 181 } 182 function filterTabbable(focusables) { 183 return focusables.filter(isTabbableIndex).map(mapElementToObjectTabbable).sort(compareObjectTabbables).map(mapObjectTabbableToElement).reduce(createStatefulCollapseRadioGroup(), []); 184 } 185 function find2(context) { 186 return filterTabbable(find(context)); 187 } 188 function findPrevious(element) { 189 return filterTabbable(find(element.ownerDocument.body)).reverse().find( 190 (focusable) => ( 191 // eslint-disable-next-line no-bitwise 192 element.compareDocumentPosition(focusable) & element.DOCUMENT_POSITION_PRECEDING 193 ) 194 ); 195 } 196 function findNext(element) { 197 return filterTabbable(find(element.ownerDocument.body)).find( 198 (focusable) => ( 199 // eslint-disable-next-line no-bitwise 200 element.compareDocumentPosition(focusable) & element.DOCUMENT_POSITION_FOLLOWING 201 ) 202 ); 203 } 204 205 // packages/dom/build-module/utils/assert-is-defined.mjs 206 function assertIsDefined(val, name) { 207 if (val === void 0 || val === null) { 208 throw new Error( 209 `Expected '$name}' to be defined, but received $val}` 210 ); 211 } 212 } 213 214 // packages/dom/build-module/dom/get-rectangle-from-range.mjs 215 function getRectangleFromRange(range) { 216 if (!range.collapsed) { 217 const rects2 = Array.from(range.getClientRects()); 218 if (rects2.length === 1) { 219 return rects2[0]; 220 } 221 const filteredRects = rects2.filter(({ width }) => width > 1); 222 if (filteredRects.length === 0) { 223 return range.getBoundingClientRect(); 224 } 225 if (filteredRects.length === 1) { 226 return filteredRects[0]; 227 } 228 let { 229 top: furthestTop, 230 bottom: furthestBottom, 231 left: furthestLeft, 232 right: furthestRight 233 } = filteredRects[0]; 234 for (const { top, bottom, left, right } of filteredRects) { 235 if (top < furthestTop) { 236 furthestTop = top; 237 } 238 if (bottom > furthestBottom) { 239 furthestBottom = bottom; 240 } 241 if (left < furthestLeft) { 242 furthestLeft = left; 243 } 244 if (right > furthestRight) { 245 furthestRight = right; 246 } 247 } 248 return new window.DOMRect( 249 furthestLeft, 250 furthestTop, 251 furthestRight - furthestLeft, 252 furthestBottom - furthestTop 253 ); 254 } 255 const { startContainer } = range; 256 const { ownerDocument } = startContainer; 257 if (startContainer.nodeName === "BR") { 258 const { parentNode } = startContainer; 259 assertIsDefined(parentNode, "parentNode"); 260 const index = ( 261 /** @type {Node[]} */ 262 Array.from(parentNode.childNodes).indexOf(startContainer) 263 ); 264 assertIsDefined(ownerDocument, "ownerDocument"); 265 range = ownerDocument.createRange(); 266 range.setStart(parentNode, index); 267 range.setEnd(parentNode, index); 268 } 269 const rects = range.getClientRects(); 270 if (rects.length > 1) { 271 return null; 272 } 273 let rect = rects[0]; 274 if (!rect || rect.height === 0) { 275 assertIsDefined(ownerDocument, "ownerDocument"); 276 const padNode = ownerDocument.createTextNode("\u200B"); 277 range = range.cloneRange(); 278 range.insertNode(padNode); 279 rect = range.getClientRects()[0]; 280 assertIsDefined(padNode.parentNode, "padNode.parentNode"); 281 padNode.parentNode.removeChild(padNode); 282 } 283 return rect; 284 } 285 286 // packages/dom/build-module/dom/compute-caret-rect.mjs 287 function computeCaretRect(win) { 288 const selection = win.getSelection(); 289 assertIsDefined(selection, "selection"); 290 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 291 if (!range) { 292 return null; 293 } 294 return getRectangleFromRange(range); 295 } 296 297 // packages/dom/build-module/dom/document-has-text-selection.mjs 298 function documentHasTextSelection(doc) { 299 assertIsDefined(doc.defaultView, "doc.defaultView"); 300 const selection = doc.defaultView.getSelection(); 301 assertIsDefined(selection, "selection"); 302 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 303 return !!range && !range.collapsed; 304 } 305 306 // packages/dom/build-module/dom/is-html-input-element.mjs 307 function isHTMLInputElement(node) { 308 return node?.nodeName === "INPUT"; 309 } 310 311 // packages/dom/build-module/dom/is-text-field.mjs 312 function isTextField(node) { 313 const nonTextInputs = [ 314 "button", 315 "checkbox", 316 "hidden", 317 "file", 318 "radio", 319 "image", 320 "range", 321 "reset", 322 "submit", 323 "number", 324 "email", 325 "time" 326 ]; 327 return isHTMLInputElement(node) && node.type && !nonTextInputs.includes(node.type) || node.nodeName === "TEXTAREA" || /** @type {HTMLElement} */ 328 node.contentEditable === "true"; 329 } 330 331 // packages/dom/build-module/dom/input-field-has-uncollapsed-selection.mjs 332 function inputFieldHasUncollapsedSelection(element) { 333 if (!isHTMLInputElement(element) && !isTextField(element)) { 334 return false; 335 } 336 try { 337 const { selectionStart, selectionEnd } = ( 338 /** @type {HTMLInputElement | HTMLTextAreaElement} */ 339 element 340 ); 341 return ( 342 // `null` means the input type doesn't implement selection, thus we 343 // cannot determine whether the selection is collapsed, so we 344 // default to true. 345 selectionStart === null || // when not null, compare the two points 346 selectionStart !== selectionEnd 347 ); 348 } catch (error) { 349 return true; 350 } 351 } 352 353 // packages/dom/build-module/dom/document-has-uncollapsed-selection.mjs 354 function documentHasUncollapsedSelection(doc) { 355 return documentHasTextSelection(doc) || !!doc.activeElement && inputFieldHasUncollapsedSelection(doc.activeElement); 356 } 357 358 // packages/dom/build-module/dom/document-has-selection.mjs 359 function documentHasSelection(doc) { 360 return !!doc.activeElement && (isHTMLInputElement(doc.activeElement) || isTextField(doc.activeElement) || documentHasTextSelection(doc)); 361 } 362 363 // packages/dom/build-module/dom/get-computed-style.mjs 364 function getComputedStyle(element) { 365 assertIsDefined( 366 element.ownerDocument.defaultView, 367 "element.ownerDocument.defaultView" 368 ); 369 return element.ownerDocument.defaultView.getComputedStyle(element); 370 } 371 372 // packages/dom/build-module/dom/get-scroll-container.mjs 373 function getScrollContainer(node, direction = "vertical") { 374 if (!node) { 375 return void 0; 376 } 377 if (direction === "vertical" || direction === "all") { 378 if (node.scrollHeight > node.clientHeight) { 379 const { overflowY } = getComputedStyle(node); 380 if (/(auto|scroll)/.test(overflowY)) { 381 return node; 382 } 383 } 384 } 385 if (direction === "horizontal" || direction === "all") { 386 if (node.scrollWidth > node.clientWidth) { 387 const { overflowX } = getComputedStyle(node); 388 if (/(auto|scroll)/.test(overflowX)) { 389 return node; 390 } 391 } 392 } 393 if (node.ownerDocument === node.parentNode) { 394 return node; 395 } 396 return getScrollContainer( 397 /** @type {Element} */ 398 node.parentNode, 399 direction 400 ); 401 } 402 403 // packages/dom/build-module/dom/get-offset-parent.mjs 404 function getOffsetParent(node) { 405 let closestElement; 406 while (closestElement = /** @type {Node} */ 407 node.parentNode) { 408 if (closestElement.nodeType === closestElement.ELEMENT_NODE) { 409 break; 410 } 411 } 412 if (!closestElement) { 413 return null; 414 } 415 if (getComputedStyle( 416 /** @type {Element} */ 417 closestElement 418 ).position !== "static") { 419 return closestElement; 420 } 421 return ( 422 /** @type {Node & { offsetParent: Node }} */ 423 closestElement.offsetParent 424 ); 425 } 426 427 // packages/dom/build-module/dom/is-input-or-text-area.mjs 428 function isInputOrTextArea(element) { 429 return element.tagName === "INPUT" || element.tagName === "TEXTAREA"; 430 } 431 432 // packages/dom/build-module/dom/is-entirely-selected.mjs 433 var ZWNBSP = "\uFEFF"; 434 function isEntirelySelected(element) { 435 if (isInputOrTextArea(element)) { 436 return element.selectionStart === 0 && element.value.length === element.selectionEnd; 437 } 438 if (!element.isContentEditable) { 439 return true; 440 } 441 const text = element.textContent || ""; 442 if (text === "" || text === ZWNBSP) { 443 return true; 444 } 445 const { ownerDocument } = element; 446 const { defaultView } = ownerDocument; 447 assertIsDefined(defaultView, "defaultView"); 448 const selection = defaultView.getSelection(); 449 assertIsDefined(selection, "selection"); 450 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 451 if (!range) { 452 return true; 453 } 454 const { startContainer, endContainer, startOffset, endOffset } = range; 455 if (startContainer === element && endContainer === element && startOffset === 0 && endOffset === element.childNodes.length) { 456 return true; 457 } 458 const lastChild = element.lastChild; 459 assertIsDefined(lastChild, "lastChild"); 460 const endContainerContentLength = endContainer.nodeType === endContainer.TEXT_NODE ? ( 461 /** @type {Text} */ 462 endContainer.data.length 463 ) : endContainer.childNodes.length; 464 return isDeepChild(startContainer, element, "firstChild") && isDeepChild(endContainer, element, "lastChild") && startOffset === 0 && endOffset === endContainerContentLength; 465 } 466 function isDeepChild(query, container, propName) { 467 let candidate = container; 468 do { 469 if (query === candidate) { 470 return true; 471 } 472 candidate = candidate[propName]; 473 while (candidate && candidate.nodeType === candidate.TEXT_NODE && candidate.nodeValue === "") { 474 candidate = candidate[propName === "lastChild" ? "previousSibling" : "nextSibling"]; 475 } 476 } while (candidate); 477 return false; 478 } 479 480 // packages/dom/build-module/dom/is-form-element.mjs 481 function isFormElement(element) { 482 if (!element) { 483 return false; 484 } 485 const { tagName } = element; 486 const checkForInputTextarea = isInputOrTextArea(element); 487 return checkForInputTextarea || tagName === "BUTTON" || tagName === "SELECT"; 488 } 489 490 // packages/dom/build-module/dom/is-rtl.mjs 491 function isRTL(element) { 492 return getComputedStyle(element).direction === "rtl"; 493 } 494 495 // packages/dom/build-module/dom/get-range-height.mjs 496 function getRangeHeight(range) { 497 const rects = Array.from(range.getClientRects()); 498 if (!rects.length) { 499 return; 500 } 501 const highestTop = Math.min(...rects.map(({ top }) => top)); 502 const lowestBottom = Math.max(...rects.map(({ bottom }) => bottom)); 503 return lowestBottom - highestTop; 504 } 505 506 // packages/dom/build-module/dom/is-selection-forward.mjs 507 function isSelectionForward(selection) { 508 const { anchorNode, focusNode, anchorOffset, focusOffset } = selection; 509 assertIsDefined(anchorNode, "anchorNode"); 510 assertIsDefined(focusNode, "focusNode"); 511 const position = anchorNode.compareDocumentPosition(focusNode); 512 if (position & anchorNode.DOCUMENT_POSITION_PRECEDING) { 513 return false; 514 } 515 if (position & anchorNode.DOCUMENT_POSITION_FOLLOWING) { 516 return true; 517 } 518 if (position === 0) { 519 return anchorOffset <= focusOffset; 520 } 521 return true; 522 } 523 524 // packages/dom/build-module/dom/caret-range-from-point.mjs 525 function caretRangeFromPoint(doc, x, y) { 526 if (doc.caretRangeFromPoint) { 527 return doc.caretRangeFromPoint(x, y); 528 } 529 if (!doc.caretPositionFromPoint) { 530 return null; 531 } 532 const point = doc.caretPositionFromPoint(x, y); 533 if (!point) { 534 return null; 535 } 536 const range = doc.createRange(); 537 range.setStart(point.offsetNode, point.offset); 538 range.collapse(true); 539 return range; 540 } 541 542 // packages/dom/build-module/dom/hidden-caret-range-from-point.mjs 543 function hiddenCaretRangeFromPoint(doc, x, y, container) { 544 const originalZIndex = container.style.zIndex; 545 const originalPosition = container.style.position; 546 const originalBorderRadius = container.style.borderRadius; 547 const { position = "static" } = getComputedStyle(container); 548 if (position === "static") { 549 container.style.position = "relative"; 550 } 551 container.style.zIndex = "10000"; 552 container.style.borderRadius = "0"; 553 const range = caretRangeFromPoint(doc, x, y); 554 container.style.zIndex = originalZIndex; 555 container.style.position = originalPosition; 556 container.style.borderRadius = originalBorderRadius; 557 return range; 558 } 559 560 // packages/dom/build-module/dom/scroll-if-no-range.mjs 561 function scrollIfNoRange(container, alignToTop, callback) { 562 let range = callback(); 563 if (!range || !range.startContainer || !container.contains(range.startContainer)) { 564 container.scrollIntoView(alignToTop); 565 range = callback(); 566 if (!range || !range.startContainer || !container.contains(range.startContainer)) { 567 return null; 568 } 569 } 570 return range; 571 } 572 573 // packages/dom/build-module/dom/is-edge.mjs 574 function isEdge(container, isReverse, onlyVertical = false) { 575 if (isInputOrTextArea(container) && typeof container.selectionStart === "number") { 576 if (container.selectionStart !== container.selectionEnd) { 577 return false; 578 } 579 if (isReverse) { 580 return container.selectionStart === 0; 581 } 582 return container.value.length === container.selectionStart; 583 } 584 if (!container.isContentEditable) { 585 return true; 586 } 587 const { ownerDocument } = container; 588 const { defaultView } = ownerDocument; 589 assertIsDefined(defaultView, "defaultView"); 590 const selection = defaultView.getSelection(); 591 if (!selection || !selection.rangeCount) { 592 return false; 593 } 594 const range = selection.getRangeAt(0); 595 const collapsedRange = range.cloneRange(); 596 const isForward = isSelectionForward(selection); 597 const isCollapsed = selection.isCollapsed; 598 if (!isCollapsed) { 599 collapsedRange.collapse(!isForward); 600 } 601 const collapsedRangeRect = getRectangleFromRange(collapsedRange); 602 const rangeRect = getRectangleFromRange(range); 603 if (!collapsedRangeRect || !rangeRect) { 604 return false; 605 } 606 const rangeHeight = getRangeHeight(range); 607 if (!isCollapsed && rangeHeight && rangeHeight > collapsedRangeRect.height && isForward === isReverse) { 608 return false; 609 } 610 const isReverseDir = isRTL(container) ? !isReverse : isReverse; 611 const containerRect = container.getBoundingClientRect(); 612 const x = isReverseDir ? containerRect.left + 1 : containerRect.right - 1; 613 const y = isReverse ? containerRect.top + 1 : containerRect.bottom - 1; 614 const testRange = scrollIfNoRange( 615 container, 616 isReverse, 617 () => hiddenCaretRangeFromPoint(ownerDocument, x, y, container) 618 ); 619 if (!testRange) { 620 return false; 621 } 622 const testRect = getRectangleFromRange(testRange); 623 if (!testRect) { 624 return false; 625 } 626 const verticalSide = isReverse ? "top" : "bottom"; 627 const horizontalSide = isReverseDir ? "left" : "right"; 628 const verticalDiff = testRect[verticalSide] - rangeRect[verticalSide]; 629 const horizontalDiff = testRect[horizontalSide] - collapsedRangeRect[horizontalSide]; 630 const hasVerticalDiff = Math.abs(verticalDiff) <= 1; 631 const hasHorizontalDiff = Math.abs(horizontalDiff) <= 1; 632 return onlyVertical ? hasVerticalDiff : hasVerticalDiff && hasHorizontalDiff; 633 } 634 635 // packages/dom/build-module/dom/is-horizontal-edge.mjs 636 function isHorizontalEdge(container, isReverse) { 637 return isEdge(container, isReverse); 638 } 639 640 // packages/dom/build-module/dom/is-number-input.mjs 641 var import_deprecated = __toESM(require_deprecated(), 1); 642 function isNumberInput(node) { 643 (0, import_deprecated.default)("wp.dom.isNumberInput", { 644 since: "6.1", 645 version: "6.5" 646 }); 647 return isHTMLInputElement(node) && node.type === "number" && !isNaN(node.valueAsNumber); 648 } 649 650 // packages/dom/build-module/dom/is-vertical-edge.mjs 651 function isVerticalEdge(container, isReverse) { 652 return isEdge(container, isReverse, true); 653 } 654 655 // packages/dom/build-module/dom/place-caret-at-edge.mjs 656 function getRange(container, isReverse, x) { 657 const { ownerDocument } = container; 658 const isReverseDir = isRTL(container) ? !isReverse : isReverse; 659 const containerRect = container.getBoundingClientRect(); 660 if (x === void 0) { 661 x = isReverse ? containerRect.right - 1 : containerRect.left + 1; 662 } else if (x <= containerRect.left) { 663 x = containerRect.left + 1; 664 } else if (x >= containerRect.right) { 665 x = containerRect.right - 1; 666 } 667 const y = isReverseDir ? containerRect.bottom - 1 : containerRect.top + 1; 668 return hiddenCaretRangeFromPoint(ownerDocument, x, y, container); 669 } 670 function placeCaretAtEdge(container, isReverse, x) { 671 if (!container) { 672 return; 673 } 674 container.focus(); 675 if (isInputOrTextArea(container)) { 676 if (typeof container.selectionStart !== "number") { 677 return; 678 } 679 if (isReverse) { 680 container.selectionStart = container.value.length; 681 container.selectionEnd = container.value.length; 682 } else { 683 container.selectionStart = 0; 684 container.selectionEnd = 0; 685 } 686 return; 687 } 688 if (!container.isContentEditable) { 689 return; 690 } 691 const range = scrollIfNoRange( 692 container, 693 isReverse, 694 () => getRange(container, isReverse, x) 695 ); 696 if (!range) { 697 return; 698 } 699 const { ownerDocument } = container; 700 const { defaultView } = ownerDocument; 701 assertIsDefined(defaultView, "defaultView"); 702 const selection = defaultView.getSelection(); 703 assertIsDefined(selection, "selection"); 704 selection.removeAllRanges(); 705 selection.addRange(range); 706 } 707 708 // packages/dom/build-module/dom/place-caret-at-horizontal-edge.mjs 709 function placeCaretAtHorizontalEdge(container, isReverse) { 710 return placeCaretAtEdge(container, isReverse, void 0); 711 } 712 713 // packages/dom/build-module/dom/place-caret-at-vertical-edge.mjs 714 function placeCaretAtVerticalEdge(container, isReverse, rect) { 715 return placeCaretAtEdge(container, isReverse, rect?.left); 716 } 717 718 // packages/dom/build-module/dom/insert-after.mjs 719 function insertAfter(newNode, referenceNode) { 720 assertIsDefined(referenceNode.parentNode, "referenceNode.parentNode"); 721 referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); 722 } 723 724 // packages/dom/build-module/dom/remove.mjs 725 function remove(node) { 726 assertIsDefined(node.parentNode, "node.parentNode"); 727 node.parentNode.removeChild(node); 728 } 729 730 // packages/dom/build-module/dom/replace.mjs 731 function replace(processedNode, newNode) { 732 assertIsDefined(processedNode.parentNode, "processedNode.parentNode"); 733 insertAfter(newNode, processedNode.parentNode); 734 remove(processedNode); 735 } 736 737 // packages/dom/build-module/dom/unwrap.mjs 738 function unwrap(node) { 739 const parent = node.parentNode; 740 assertIsDefined(parent, "node.parentNode"); 741 while (node.firstChild) { 742 parent.insertBefore(node.firstChild, node); 743 } 744 parent.removeChild(node); 745 } 746 747 // packages/dom/build-module/dom/replace-tag.mjs 748 function replaceTag(node, tagName) { 749 const newNode = node.ownerDocument.createElement(tagName); 750 while (node.firstChild) { 751 newNode.appendChild(node.firstChild); 752 } 753 assertIsDefined(node.parentNode, "node.parentNode"); 754 node.parentNode.replaceChild(newNode, node); 755 return newNode; 756 } 757 758 // packages/dom/build-module/dom/wrap.mjs 759 function wrap(newNode, referenceNode) { 760 assertIsDefined(referenceNode.parentNode, "referenceNode.parentNode"); 761 referenceNode.parentNode.insertBefore(newNode, referenceNode); 762 newNode.appendChild(referenceNode); 763 } 764 765 // packages/dom/build-module/dom/safe-html.mjs 766 function safeHTML(html) { 767 const { body } = document.implementation.createHTMLDocument(""); 768 body.innerHTML = html; 769 const elements = body.getElementsByTagName("*"); 770 let elementIndex = elements.length; 771 while (elementIndex--) { 772 const element = elements[elementIndex]; 773 if (element.tagName === "SCRIPT") { 774 remove(element); 775 } else { 776 let attributeIndex = element.attributes.length; 777 while (attributeIndex--) { 778 const { name: key } = element.attributes[attributeIndex]; 779 if (key.startsWith("on")) { 780 element.removeAttribute(key); 781 } 782 } 783 } 784 } 785 return body.innerHTML; 786 } 787 788 // packages/dom/build-module/dom/strip-html.mjs 789 function stripHTML(html) { 790 html = safeHTML(html); 791 const doc = document.implementation.createHTMLDocument(""); 792 doc.body.innerHTML = html; 793 return doc.body.textContent || ""; 794 } 795 796 // packages/dom/build-module/dom/is-empty.mjs 797 function isEmpty(element) { 798 switch (element.nodeType) { 799 case element.TEXT_NODE: 800 return /^[ \f\n\r\t\v\u00a0]*$/.test(element.nodeValue || ""); 801 case element.ELEMENT_NODE: 802 if (element.hasAttributes()) { 803 return false; 804 } else if (!element.hasChildNodes()) { 805 return true; 806 } 807 return ( 808 /** @type {Element[]} */ 809 Array.from(element.childNodes).every(isEmpty) 810 ); 811 default: 812 return true; 813 } 814 } 815 816 // packages/dom/build-module/phrasing-content.mjs 817 var textContentSchema = { 818 strong: {}, 819 em: {}, 820 s: {}, 821 del: {}, 822 ins: {}, 823 a: { attributes: ["href", "target", "rel", "id"] }, 824 code: {}, 825 abbr: { attributes: ["title"] }, 826 sub: {}, 827 sup: {}, 828 br: {}, 829 small: {}, 830 // To do: fix blockquote. 831 // cite: {}, 832 q: { attributes: ["cite"] }, 833 dfn: { attributes: ["title"] }, 834 data: { attributes: ["value"] }, 835 time: { attributes: ["datetime"] }, 836 var: {}, 837 samp: {}, 838 kbd: {}, 839 i: {}, 840 b: {}, 841 u: {}, 842 mark: {}, 843 ruby: {}, 844 rt: {}, 845 rp: {}, 846 bdi: { attributes: ["dir"] }, 847 bdo: { attributes: ["dir"] }, 848 wbr: {}, 849 "#text": {} 850 }; 851 var excludedElements = ["#text", "br"]; 852 Object.keys(textContentSchema).filter((element) => !excludedElements.includes(element)).forEach((tag) => { 853 const { [tag]: removedTag, ...restSchema } = textContentSchema; 854 textContentSchema[tag].children = restSchema; 855 }); 856 var embeddedContentSchema = { 857 audio: { 858 attributes: [ 859 "src", 860 "preload", 861 "autoplay", 862 "mediagroup", 863 "loop", 864 "muted" 865 ] 866 }, 867 canvas: { attributes: ["width", "height"] }, 868 embed: { attributes: ["src", "type", "width", "height"] }, 869 img: { 870 attributes: [ 871 "alt", 872 "src", 873 "srcset", 874 "usemap", 875 "ismap", 876 "width", 877 "height" 878 ] 879 }, 880 object: { 881 attributes: [ 882 "data", 883 "type", 884 "name", 885 "usemap", 886 "form", 887 "width", 888 "height" 889 ] 890 }, 891 video: { 892 attributes: [ 893 "src", 894 "poster", 895 "preload", 896 "playsinline", 897 "autoplay", 898 "mediagroup", 899 "loop", 900 "muted", 901 "controls", 902 "width", 903 "height" 904 ] 905 }, 906 math: { 907 attributes: ["display", "xmlns"], 908 children: "*" 909 } 910 }; 911 var phrasingContentSchema = { 912 ...textContentSchema, 913 ...embeddedContentSchema 914 }; 915 function getPhrasingContentSchema(context) { 916 if (context !== "paste") { 917 return phrasingContentSchema; 918 } 919 const { 920 u, 921 // Used to mark misspelling. Shouldn't be pasted. 922 abbr, 923 // Invisible. 924 data, 925 // Invisible. 926 time, 927 // Invisible. 928 wbr, 929 // Invisible. 930 bdi, 931 // Invisible. 932 bdo, 933 // Invisible. 934 ...remainingContentSchema 935 } = { 936 ...phrasingContentSchema, 937 // We shouldn't paste potentially sensitive information which is not 938 // visible to the user when pasted, so strip the attributes. 939 ins: { children: phrasingContentSchema.ins.children }, 940 del: { children: phrasingContentSchema.del.children } 941 }; 942 return remainingContentSchema; 943 } 944 function isPhrasingContent(node) { 945 const tag = node.nodeName.toLowerCase(); 946 return getPhrasingContentSchema().hasOwnProperty(tag) || tag === "span"; 947 } 948 function isTextContent(node) { 949 const tag = node.nodeName.toLowerCase(); 950 return textContentSchema.hasOwnProperty(tag) || tag === "span"; 951 } 952 953 // packages/dom/build-module/dom/is-element.mjs 954 function isElement(node) { 955 return !!node && node.nodeType === node.ELEMENT_NODE; 956 } 957 958 // packages/dom/build-module/dom/clean-node-list.mjs 959 var noop = () => { 960 }; 961 function cleanNodeList(nodeList, doc, schema, inline) { 962 Array.from(nodeList).forEach( 963 (node) => { 964 const tag = node.nodeName.toLowerCase(); 965 if (schema.hasOwnProperty(tag) && (!schema[tag].isMatch || schema[tag].isMatch?.(node))) { 966 if (isElement(node)) { 967 const { 968 attributes = [], 969 classes = [], 970 children, 971 require: require2 = [], 972 allowEmpty 973 } = schema[tag]; 974 if (children && !allowEmpty && isEmpty(node)) { 975 remove(node); 976 return; 977 } 978 if (node.hasAttributes()) { 979 Array.from(node.attributes).forEach(({ name }) => { 980 if (name !== "class" && !attributes.includes(name)) { 981 node.removeAttribute(name); 982 } 983 }); 984 if (node.classList && node.classList.length) { 985 const mattchers = classes.map((item) => { 986 if (item === "*") { 987 return () => true; 988 } else if (typeof item === "string") { 989 return (className) => className === item; 990 } else if (item instanceof RegExp) { 991 return (className) => item.test(className); 992 } 993 return noop; 994 }); 995 Array.from(node.classList).forEach((name) => { 996 if (!mattchers.some( 997 (isMatch) => isMatch(name) 998 )) { 999 node.classList.remove(name); 1000 } 1001 }); 1002 if (!node.classList.length) { 1003 node.removeAttribute("class"); 1004 } 1005 } 1006 } 1007 if (node.hasChildNodes()) { 1008 if (children === "*") { 1009 return; 1010 } 1011 if (children) { 1012 if (require2.length && !node.querySelector(require2.join(","))) { 1013 cleanNodeList( 1014 node.childNodes, 1015 doc, 1016 schema, 1017 inline 1018 ); 1019 unwrap(node); 1020 } else if (node.parentNode && node.parentNode.nodeName === "BODY" && isPhrasingContent(node)) { 1021 cleanNodeList( 1022 node.childNodes, 1023 doc, 1024 schema, 1025 inline 1026 ); 1027 if (Array.from(node.childNodes).some( 1028 (child) => !isPhrasingContent(child) 1029 )) { 1030 unwrap(node); 1031 } 1032 } else { 1033 cleanNodeList( 1034 node.childNodes, 1035 doc, 1036 children, 1037 inline 1038 ); 1039 } 1040 } else { 1041 while (node.firstChild) { 1042 remove(node.firstChild); 1043 } 1044 } 1045 } 1046 } 1047 } else { 1048 cleanNodeList(node.childNodes, doc, schema, inline); 1049 if (inline && !isPhrasingContent(node) && node.nextElementSibling) { 1050 insertAfter(doc.createElement("br"), node); 1051 } 1052 unwrap(node); 1053 } 1054 } 1055 ); 1056 } 1057 1058 // packages/dom/build-module/dom/remove-invalid-html.mjs 1059 function removeInvalidHTML(HTML, schema, inline) { 1060 const doc = document.implementation.createHTMLDocument(""); 1061 doc.body.innerHTML = HTML; 1062 cleanNodeList(doc.body.childNodes, doc, schema, inline); 1063 return doc.body.innerHTML; 1064 } 1065 1066 // packages/dom/build-module/data-transfer.mjs 1067 function getFilesFromDataTransfer(dataTransfer) { 1068 const files = Array.from(dataTransfer.files); 1069 Array.from(dataTransfer.items).forEach((item) => { 1070 const file = item.getAsFile(); 1071 if (file && !files.find( 1072 ({ name, type, size }) => name === file.name && type === file.type && size === file.size 1073 )) { 1074 files.push(file); 1075 } 1076 }); 1077 return files; 1078 } 1079 1080 // packages/dom/build-module/index.mjs 1081 var focus = { focusable: focusable_exports, tabbable: tabbable_exports }; 1082 return __toCommonJS(index_exports); 1083 })();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sun Jun 14 08:20:09 2026 | Cross-referenced by PHPXref |