mirror of
				https://github.com/twbs/bootstrap.git
				synced 2025-10-30 00:05:32 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|   * Bootstrap selector-engine.js v5.1.3 (https://getbootstrap.com/)
 | |
|   * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
 | |
|   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | |
|   */
 | |
| (function (global, factory) {
 | |
|   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
 | |
|   typeof define === 'function' && define.amd ? define(factory) :
 | |
|   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory());
 | |
| })(this, (function () { 'use strict';
 | |
| 
 | |
|   /**
 | |
|    * --------------------------------------------------------------------------
 | |
|    * Bootstrap (v5.1.3): util/index.js
 | |
|    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | |
|    * --------------------------------------------------------------------------
 | |
|    */
 | |
| 
 | |
|   const isElement = obj => {
 | |
|     if (!obj || typeof obj !== 'object') {
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     if (typeof obj.jquery !== 'undefined') {
 | |
|       obj = obj[0];
 | |
|     }
 | |
| 
 | |
|     return typeof obj.nodeType !== 'undefined';
 | |
|   };
 | |
| 
 | |
|   const isVisible = element => {
 | |
|     if (!isElement(element) || element.getClientRects().length === 0) {
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
 | |
|   };
 | |
| 
 | |
|   const isDisabled = element => {
 | |
|     if (!element || element.nodeType !== Node.ELEMENT_NODE) {
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     if (element.classList.contains('disabled')) {
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     if (typeof element.disabled !== 'undefined') {
 | |
|       return element.disabled;
 | |
|     }
 | |
| 
 | |
|     return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * --------------------------------------------------------------------------
 | |
|    * Bootstrap (v5.1.3): dom/selector-engine.js
 | |
|    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | |
|    * --------------------------------------------------------------------------
 | |
|    */
 | |
|   const NODE_TEXT = 3;
 | |
|   const SelectorEngine = {
 | |
|     find(selector, element = document.documentElement) {
 | |
|       return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
 | |
|     },
 | |
| 
 | |
|     findOne(selector, element = document.documentElement) {
 | |
|       return Element.prototype.querySelector.call(element, selector);
 | |
|     },
 | |
| 
 | |
|     children(element, selector) {
 | |
|       return [].concat(...element.children).filter(child => child.matches(selector));
 | |
|     },
 | |
| 
 | |
|     parents(element, selector) {
 | |
|       const parents = [];
 | |
|       let ancestor = element.parentNode;
 | |
| 
 | |
|       while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
 | |
|         if (ancestor.matches(selector)) {
 | |
|           parents.push(ancestor);
 | |
|         }
 | |
| 
 | |
|         ancestor = ancestor.parentNode;
 | |
|       }
 | |
| 
 | |
|       return parents;
 | |
|     },
 | |
| 
 | |
|     prev(element, selector) {
 | |
|       let previous = element.previousElementSibling;
 | |
| 
 | |
|       while (previous) {
 | |
|         if (previous.matches(selector)) {
 | |
|           return [previous];
 | |
|         }
 | |
| 
 | |
|         previous = previous.previousElementSibling;
 | |
|       }
 | |
| 
 | |
|       return [];
 | |
|     },
 | |
| 
 | |
|     next(element, selector) {
 | |
|       let next = element.nextElementSibling;
 | |
| 
 | |
|       while (next) {
 | |
|         if (next.matches(selector)) {
 | |
|           return [next];
 | |
|         }
 | |
| 
 | |
|         next = next.nextElementSibling;
 | |
|       }
 | |
| 
 | |
|       return [];
 | |
|     },
 | |
| 
 | |
|     focusableChildren(element) {
 | |
|       const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
 | |
|       return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
 | |
|     }
 | |
| 
 | |
|   };
 | |
| 
 | |
|   return SelectorEngine;
 | |
| 
 | |
| }));
 | |
| //# sourceMappingURL=selector-engine.js.map
 |