commit ff0fee3690ff60c992eb20579a626761bec8ff36
parent 0cd065d3547b290da7af53d3b07e84b9446399fe
Author: Daniel García <dani-garcia@users.noreply.github.com>
Date: Sat, 19 Jun 2021 21:38:58 +0200
Merge branch 'BlackDex-admin-changes' into main
Diffstat:
16 files changed, 20139 insertions(+), 17631 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
@@ -2,6 +2,19 @@ name: Build
on:
push:
+ paths-ignore:
+ - "*.md"
+ - "*.txt"
+ - ".dockerignore"
+ - ".env.template"
+ - ".gitattributes"
+ - ".gitignore"
+ - "azure-pipelines.yml"
+ - "docker/**"
+ - "hooks/**"
+ - "tools/**"
+ - ".github/FUNDING.yml"
+ - ".github/ISSUE_TEMPLATE/**"
pull_request:
# Ignore when there are only changes done too one of these paths
paths-ignore:
@@ -39,13 +52,13 @@ jobs:
features: [sqlite,mysql,postgresql] # Remember to update the `cargo test` to match the amount of features
channel: nightly
os: ubuntu-18.04
- ext:
+ ext: ""
# - target-triple: x86_64-unknown-linux-gnu
# host-triple: x86_64-unknown-linux-gnu
# features: "sqlite,mysql,postgresql"
# channel: stable
# os: ubuntu-18.04
- # ext:
+ # ext: ""
name: Building ${{ matrix.channel }}-${{ matrix.target-triple }}
runs-on: ${{ matrix.os }}
diff --git a/.github/workflows/hadolint.yml b/.github/workflows/hadolint.yml
@@ -2,6 +2,9 @@ name: Hadolint
on:
push:
+ # Ignore when there are only changes done too one of these paths
+ paths:
+ - "docker/**"
pull_request:
# Ignore when there are only changes done too one of these paths
paths:
@@ -22,14 +25,14 @@ jobs:
- name: Download hadolint
shell: bash
run: |
- sudo curl -L https://github.com/hadolint/hadolint/releases/download/v$HADOLINT_VERSION/hadolint-$(uname -s)-$(uname -m) -o /usr/local/bin/hadolint && \
+ sudo curl -L https://github.com/hadolint/hadolint/releases/download/v${HADOLINT_VERSION}/hadolint-$(uname -s)-$(uname -m) -o /usr/local/bin/hadolint && \
sudo chmod +x /usr/local/bin/hadolint
env:
- HADOLINT_VERSION: 2.3.0
+ HADOLINT_VERSION: 2.5.0
# End Download hadolint
# Test Dockerfiles
- name: Run hadolint
shell: bash
- run: git ls-files --exclude='docker/*/Dockerfile*' --ignored | xargs hadolint
+ run: git ls-files --exclude='docker/*/Dockerfile*' --ignored --cached | xargs hadolint
# End Test Dockerfiles
diff --git a/src/api/admin.rs b/src/api/admin.rs
@@ -196,9 +196,7 @@ fn _validate_token(token: &str) -> bool {
struct AdminTemplateData {
page_content: String,
version: Option<&'static str>,
- users: Option<Vec<Value>>,
- organizations: Option<Vec<Value>>,
- diagnostics: Option<Value>,
+ page_data: Option<Value>,
config: Value,
can_backup: bool,
logged_in: bool,
@@ -214,51 +212,19 @@ impl AdminTemplateData {
can_backup: *CAN_BACKUP,
logged_in: true,
urlpath: CONFIG.domain_path(),
- users: None,
- organizations: None,
- diagnostics: None,
+ page_data: None,
}
}
- fn users(users: Vec<Value>) -> Self {
+ fn with_data(page_content: &str, page_data: Value) -> Self {
Self {
- page_content: String::from("admin/users"),
+ page_content: String::from(page_content),
version: VERSION,
- users: Some(users),
+ page_data: Some(page_data),
config: CONFIG.prepare_json(),
can_backup: *CAN_BACKUP,
logged_in: true,
urlpath: CONFIG.domain_path(),
- organizations: None,
- diagnostics: None,
- }
- }
-
- fn organizations(organizations: Vec<Value>) -> Self {
- Self {
- page_content: String::from("admin/organizations"),
- version: VERSION,
- organizations: Some(organizations),
- config: CONFIG.prepare_json(),
- can_backup: *CAN_BACKUP,
- logged_in: true,
- urlpath: CONFIG.domain_path(),
- users: None,
- diagnostics: None,
- }
- }
-
- fn diagnostics(diagnostics: Value) -> Self {
- Self {
- page_content: String::from("admin/diagnostics"),
- version: VERSION,
- organizations: None,
- config: CONFIG.prepare_json(),
- can_backup: *CAN_BACKUP,
- logged_in: true,
- urlpath: CONFIG.domain_path(),
- users: None,
- diagnostics: Some(diagnostics),
}
}
@@ -360,7 +326,7 @@ fn users_overview(_token: AdminToken, conn: DbConn) -> ApiResult<Html<String>> {
})
.collect();
- let text = AdminTemplateData::users(users_json).render()?;
+ let text = AdminTemplateData::with_data("admin/users", json!(users_json)).render()?;
Ok(Html(text))
}
@@ -466,7 +432,7 @@ fn organizations_overview(_token: AdminToken, conn: DbConn) -> ApiResult<Html<St
})
.collect();
- let text = AdminTemplateData::organizations(organizations_json).render()?;
+ let text = AdminTemplateData::with_data("admin/organizations", json!(organizations_json)).render()?;
Ok(Html(text))
}
@@ -592,11 +558,12 @@ fn diagnostics(_token: AdminToken, ip_header: IpHeader, conn: DbConn) -> ApiResu
"db_type": *DB_TYPE,
"db_version": get_sql_server_version(&conn),
"admin_url": format!("{}/diagnostics", admin_url(Referer(None))),
+ "overrides": &CONFIG.get_overrides().join(", "),
"server_time_local": Local::now().format("%Y-%m-%d %H:%M:%S %Z").to_string(),
"server_time": Utc::now().format("%Y-%m-%d %H:%M:%S UTC").to_string(), // Run the date/time check as the last item to minimize the difference
});
- let text = AdminTemplateData::diagnostics(diagnostics_json).render()?;
+ let text = AdminTemplateData::with_data("admin/diagnostics", diagnostics_json).render()?;
Ok(Html(text))
}
diff --git a/src/api/web.rs b/src/api/web.rs
@@ -91,8 +91,8 @@ fn static_files(filename: String) -> Result<Content<&'static [u8]>, Error> {
"identicon.js" => Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/identicon.js"))),
"datatables.js" => Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/datatables.js"))),
"datatables.css" => Ok(Content(ContentType::CSS, include_bytes!("../static/scripts/datatables.css"))),
- "jquery-3.5.1.slim.js" => {
- Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/jquery-3.5.1.slim.js")))
+ "jquery-3.6.0.slim.js" => {
+ Ok(Content(ContentType::JavaScript, include_bytes!("../static/scripts/jquery-3.6.0.slim.js")))
}
_ => err!(format!("Static file not found: {}", filename)),
}
diff --git a/src/config.rs b/src/config.rs
@@ -57,6 +57,8 @@ macro_rules! make_config {
_env: ConfigBuilder,
_usr: ConfigBuilder,
+
+ _overrides: Vec<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
@@ -113,8 +115,7 @@ macro_rules! make_config {
/// Merges the values of both builders into a new builder.
/// If both have the same element, `other` wins.
- fn merge(&self, other: &Self, show_overrides: bool) -> Self {
- let mut overrides = Vec::new();
+ fn merge(&self, other: &Self, show_overrides: bool, overrides: &mut Vec<String>) -> Self {
let mut builder = self.clone();
$($(
if let v @Some(_) = &other.$name {
@@ -176,9 +177,9 @@ macro_rules! make_config {
)+)+
pub fn prepare_json(&self) -> serde_json::Value {
- let (def, cfg) = {
+ let (def, cfg, overriden) = {
let inner = &self.inner.read().unwrap();
- (inner._env.build(), inner.config.clone())
+ (inner._env.build(), inner.config.clone(), inner._overrides.clone())
};
fn _get_form_type(rust_type: &str) -> &'static str {
@@ -210,6 +211,7 @@ macro_rules! make_config {
"default": def.$name,
"type": _get_form_type(stringify!($ty)),
"doc": _get_doc(concat!($($doc),+)),
+ "overridden": overriden.contains(&stringify!($name).to_uppercase()),
}, )+
]}, )+ ])
}
@@ -224,6 +226,15 @@ macro_rules! make_config {
stringify!($name): make_config!{ @supportstr $name, cfg.$name, $ty, $none_action },
)+)+ })
}
+
+ pub fn get_overrides(&self) -> Vec<String> {
+ let overrides = {
+ let inner = &self.inner.read().unwrap();
+ inner._overrides.clone()
+ };
+
+ overrides
+ }
}
};
@@ -505,7 +516,7 @@ make_config! {
/// Server name sent during HELO |> By default this value should be is on the machine's hostname, but might need to be changed in case it trips some anti-spam filters
helo_name: String, true, option;
/// Enable SMTP debugging (Know the risks!) |> DANGEROUS: Enabling this will output very detailed SMTP messages. This could contain sensitive information like passwords and usernames! Only enable this during troubleshooting!
- smtp_debug: bool, true, def, false;
+ smtp_debug: bool, false, def, false;
/// Accept Invalid Certs (Know the risks!) |> DANGEROUS: Allow invalid certificates. This option introduces significant vulnerabilities to man-in-the-middle attacks!
smtp_accept_invalid_certs: bool, true, def, false;
/// Accept Invalid Hostnames (Know the risks!) |> DANGEROUS: Allow invalid hostnames. This option introduces significant vulnerabilities to man-in-the-middle attacks!
@@ -639,7 +650,8 @@ impl Config {
let _usr = ConfigBuilder::from_file(&CONFIG_FILE).unwrap_or_default();
// Create merged config, config file overwrites env
- let builder = _env.merge(&_usr, true);
+ let mut _overrides = Vec::new();
+ let builder = _env.merge(&_usr, true, &mut _overrides);
// Fill any missing with defaults
let config = builder.build();
@@ -651,6 +663,7 @@ impl Config {
config,
_env,
_usr,
+ _overrides,
}),
})
}
@@ -666,9 +679,10 @@ impl Config {
let config_str = serde_json::to_string_pretty(&builder)?;
// Prepare the combined config
+ let mut overrides = Vec::new();
let config = {
let env = &self.inner.read().unwrap()._env;
- env.merge(&builder, false).build()
+ env.merge(&builder, false, &mut overrides).build()
};
validate_config(&config)?;
@@ -677,6 +691,7 @@ impl Config {
let mut writer = self.inner.write().unwrap();
writer.config = config;
writer._usr = builder;
+ writer._overrides = overrides;
}
//Save to file
@@ -690,7 +705,8 @@ impl Config {
pub fn update_config_partial(&self, other: ConfigBuilder) -> Result<(), Error> {
let builder = {
let usr = &self.inner.read().unwrap()._usr;
- usr.merge(&other, false)
+ let mut _overrides = Vec::new();
+ usr.merge(&other, false, &mut _overrides)
};
self.update_config(builder)
}
@@ -751,6 +767,7 @@ impl Config {
let mut writer = self.inner.write().unwrap();
writer.config = config;
writer._usr = usr;
+ writer._overrides = Vec::new();
}
Ok(())
diff --git a/src/static/scripts/bootstrap-native.js b/src/static/scripts/bootstrap-native.js
@@ -1,1671 +1,3554 @@
/*!
- * Native JavaScript for Bootstrap v3.0.15 (https://thednp.github.io/bootstrap.native/)
+ * Native JavaScript for Bootstrap v4.0.2 (https://thednp.github.io/bootstrap.native/)
* Copyright 2015-2021 © dnp_theme
* Licensed under MIT (https://github.com/thednp/bootstrap.native/blob/master/LICENSE)
*/
- (function (global, factory) {
+(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, global.BSN = factory());
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BSN = factory());
}(this, (function () { 'use strict';
- var transitionEndEvent = 'webkitTransition' in document.head.style ? 'webkitTransitionEnd' : 'transitionend';
+ const transitionEndEvent = 'webkitTransition' in document.head.style ? 'webkitTransitionEnd' : 'transitionend';
- var supportTransition = 'webkitTransition' in document.head.style || 'transition' in document.head.style;
+ const supportTransition = 'webkitTransition' in document.head.style || 'transition' in document.head.style;
- var transitionDuration = 'webkitTransition' in document.head.style ? 'webkitTransitionDuration' : 'transitionDuration';
+ const transitionDuration = 'webkitTransition' in document.head.style ? 'webkitTransitionDuration' : 'transitionDuration';
- var transitionProperty = 'webkitTransition' in document.head.style ? 'webkitTransitionProperty' : 'transitionProperty';
+ const transitionProperty = 'webkitTransition' in document.head.style ? 'webkitTransitionProperty' : 'transitionProperty';
function getElementTransitionDuration(element) {
- var computedStyle = getComputedStyle(element),
- property = computedStyle[transitionProperty],
- duration = supportTransition && property && property !== 'none'
- ? parseFloat(computedStyle[transitionDuration]) : 0;
- return !isNaN(duration) ? duration * 1000 : 0;
+ const computedStyle = getComputedStyle(element);
+ const propertyValue = computedStyle[transitionProperty];
+ const durationValue = computedStyle[transitionDuration];
+ const durationScale = durationValue.includes('ms') ? 1 : 1000;
+ const duration = supportTransition && propertyValue && propertyValue !== 'none'
+ ? parseFloat(durationValue) * durationScale : 0;
+
+ return !Number.isNaN(duration) ? duration : 0;
}
- function emulateTransitionEnd(element,handler){
- var called = 0, duration = getElementTransitionDuration(element);
- duration ? element.addEventListener( transitionEndEvent, function transitionEndWrapper(e){
- !called && handler(e), called = 1;
- element.removeEventListener( transitionEndEvent, transitionEndWrapper);
- })
- : setTimeout(function() { !called && handler(), called = 1; }, 17);
+ function emulateTransitionEnd(element, handler) {
+ let called = 0;
+ const endEvent = new Event(transitionEndEvent);
+ const duration = getElementTransitionDuration(element);
+
+ if (duration) {
+ element.addEventListener(transitionEndEvent, function transitionEndWrapper(e) {
+ if (e.target === element) {
+ handler.apply(element, [e]);
+ element.removeEventListener(transitionEndEvent, transitionEndWrapper);
+ called = 1;
+ }
+ });
+ setTimeout(() => {
+ if (!called) element.dispatchEvent(endEvent);
+ }, duration + 17);
+ } else {
+ handler.apply(element, [endEvent]);
+ }
}
function queryElement(selector, parent) {
- var lookUp = parent && parent instanceof Element ? parent : document;
+ const lookUp = parent && parent instanceof Element ? parent : document;
return selector instanceof Element ? selector : lookUp.querySelector(selector);
}
- function bootstrapCustomEvent(eventName, componentName, eventProperties) {
- var OriginalCustomEvent = new CustomEvent( eventName + '.bs.' + componentName, {cancelable: true});
- if (typeof eventProperties !== 'undefined') {
- Object.keys(eventProperties).forEach(function (key) {
+ function hasClass(element, classNAME) {
+ return element.classList.contains(classNAME);
+ }
+
+ function removeClass(element, classNAME) {
+ element.classList.remove(classNAME);
+ }
+
+ const addEventListener = 'addEventListener';
+
+ const removeEventListener = 'removeEventListener';
+
+ const fadeClass = 'fade';
+
+ const showClass = 'show';
+
+ const dataBsDismiss = 'data-bs-dismiss';
+
+ function bootstrapCustomEvent(namespacedEventType, eventProperties) {
+ const OriginalCustomEvent = new CustomEvent(namespacedEventType, { cancelable: true });
+
+ if (eventProperties instanceof Object) {
+ Object.keys(eventProperties).forEach((key) => {
Object.defineProperty(OriginalCustomEvent, key, {
- value: eventProperties[key]
+ value: eventProperties[key],
});
});
}
return OriginalCustomEvent;
}
- function dispatchCustomEvent(customEvent){
- this && this.dispatchEvent(customEvent);
- }
-
- function Alert(element) {
- var self = this,
- alert,
- closeCustomEvent = bootstrapCustomEvent('close','alert'),
- closedCustomEvent = bootstrapCustomEvent('closed','alert');
- function triggerHandler() {
- alert.classList.contains('fade') ? emulateTransitionEnd(alert,transitionEndHandler) : transitionEndHandler();
+ function normalizeValue(value) {
+ if (value === 'true') {
+ return true;
}
- function toggleEvents(action){
- action = action ? 'addEventListener' : 'removeEventListener';
- element[action]('click',clickHandler,false);
+
+ if (value === 'false') {
+ return false;
}
- function clickHandler(e) {
- alert = e && e.target.closest(".alert");
- element = queryElement('[data-dismiss="alert"]',alert);
- element && alert && (element === e.target || element.contains(e.target)) && self.close();
+
+ if (!Number.isNaN(+value)) {
+ return +value;
}
- function transitionEndHandler() {
- toggleEvents();
- alert.parentNode.removeChild(alert);
- dispatchCustomEvent.call(alert,closedCustomEvent);
+
+ if (value === '' || value === 'null') {
+ return null;
}
- self.close = function () {
- if ( alert && element && alert.classList.contains('show') ) {
- dispatchCustomEvent.call(alert,closeCustomEvent);
- if ( closeCustomEvent.defaultPrevented ) { return; }
- self.dispose();
- alert.classList.remove('show');
- triggerHandler();
- }
- };
- self.dispose = function () {
- toggleEvents();
- delete element.Alert;
- };
- element = queryElement(element);
- alert = element.closest('.alert');
- element.Alert && element.Alert.dispose();
- if ( !element.Alert ) {
- toggleEvents(1);
- }
- self.element = element;
- element.Alert = self;
- }
-
- function Button(element) {
- var self = this, labels,
- changeCustomEvent = bootstrapCustomEvent('change', 'button');
- function toggle(e) {
- var input,
- label = e.target.tagName === 'LABEL' ? e.target
- : e.target.closest('LABEL') ? e.target.closest('LABEL') : null;
- input = label && label.getElementsByTagName('INPUT')[0];
- if ( !input ) { return; }
- dispatchCustomEvent.call(input, changeCustomEvent);
- dispatchCustomEvent.call(element, changeCustomEvent);
- if ( input.type === 'checkbox' ) {
- if ( changeCustomEvent.defaultPrevented ) { return; }
- if ( !input.checked ) {
- label.classList.add('active');
- input.getAttribute('checked');
- input.setAttribute('checked','checked');
- input.checked = true;
+
+ // string / function / Element / Object
+ return value;
+ }
+
+ function normalizeOptions(element, defaultOps, inputOps, ns) {
+ const normalOps = {};
+ const dataOps = {};
+ const data = { ...element.dataset };
+
+ Object.keys(data)
+ .forEach((k) => {
+ const key = k.includes(ns)
+ ? k.replace(ns, '').replace(/[A-Z]/, (match) => match.toLowerCase())
+ : k;
+
+ dataOps[key] = normalizeValue(data[k]);
+ });
+
+ Object.keys(inputOps)
+ .forEach((k) => {
+ inputOps[k] = normalizeValue(inputOps[k]);
+ });
+
+ Object.keys(defaultOps)
+ .forEach((k) => {
+ if (k in inputOps) {
+ normalOps[k] = inputOps[k];
+ } else if (k in dataOps) {
+ normalOps[k] = dataOps[k];
} else {
- label.classList.remove('active');
- input.getAttribute('checked');
- input.removeAttribute('checked');
- input.checked = false;
- }
- if (!element.toggled) {
- element.toggled = true;
+ normalOps[k] = defaultOps[k];
}
+ });
+
+ return normalOps;
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Base Component
+ ----------------------------------------------------- */
+
+ class BaseComponent {
+ constructor(name, target, defaults, config) {
+ const self = this;
+ const element = queryElement(target);
+
+ if (element[name]) element[name].dispose();
+ self.element = element;
+
+ if (defaults && Object.keys(defaults).length) {
+ self.options = normalizeOptions(element, defaults, (config || {}), 'bs');
}
- if ( input.type === 'radio' && !element.toggled ) {
- if ( changeCustomEvent.defaultPrevented ) { return; }
- if ( !input.checked || (e.screenX === 0 && e.screenY == 0) ) {
- label.classList.add('active');
- label.classList.add('focus');
- input.setAttribute('checked','checked');
- input.checked = true;
- element.toggled = true;
- Array.from(labels).map(function (otherLabel){
- var otherInput = otherLabel.getElementsByTagName('INPUT')[0];
- if ( otherLabel !== label && otherLabel.classList.contains('active') ) {
- dispatchCustomEvent.call(otherInput, changeCustomEvent);
- otherLabel.classList.remove('active');
- otherInput.removeAttribute('checked');
- otherInput.checked = false;
- }
- });
+ element[name] = self;
+ }
+
+ dispose(name) {
+ const self = this;
+ self.element[name] = null;
+ Object.keys(self).forEach((prop) => { self[prop] = null; });
+ }
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Alert
+ -------------------------------------------- */
+
+ // ALERT PRIVATE GC
+ // ================
+ const alertString = 'alert';
+ const alertComponent = 'Alert';
+ const alertSelector = `.${alertString}`;
+ const alertDismissSelector = `[${dataBsDismiss}="${alertString}"]`;
+
+ // ALERT CUSTOM EVENTS
+ // ===================
+ const closeAlertEvent = bootstrapCustomEvent(`close.bs.${alertString}`);
+ const closedAlertEvent = bootstrapCustomEvent(`closed.bs.${alertString}`);
+
+ // ALERT EVENT HANDLERS
+ // ====================
+ function alertTransitionEnd(self) {
+ const { element, relatedTarget } = self;
+ toggleAlertHandler(self);
+
+ if (relatedTarget) closedAlertEvent.relatedTarget = relatedTarget;
+ element.dispatchEvent(closedAlertEvent);
+
+ self.dispose();
+ element.parentNode.removeChild(element);
+ }
+
+ // ALERT PRIVATE METHOD
+ // ====================
+ function toggleAlertHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ if (self.dismiss) self.dismiss[action]('click', self.close);
+ }
+
+ // ALERT DEFINITION
+ // ================
+ class Alert extends BaseComponent {
+ constructor(target) {
+ super(alertComponent, target);
+ // bind
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+
+ // the dismiss button
+ self.dismiss = queryElement(alertDismissSelector, element);
+ self.relatedTarget = null;
+
+ // add event listener
+ toggleAlertHandler(self, 1);
+ }
+
+ // ALERT PUBLIC METHODS
+ // ====================
+ close(e) {
+ const target = e ? e.target : null;
+ const self = e
+ ? e.target.closest(alertSelector)[alertComponent]
+ : this;
+ const { element } = self;
+
+ if (self && element && hasClass(element, showClass)) {
+ if (target) {
+ closeAlertEvent.relatedTarget = target;
+ self.relatedTarget = target;
}
+ element.dispatchEvent(closeAlertEvent);
+ if (closeAlertEvent.defaultPrevented) return;
+
+ removeClass(element, showClass);
+
+ if (hasClass(element, fadeClass)) {
+ emulateTransitionEnd(element, () => alertTransitionEnd(self));
+ } else alertTransitionEnd(self);
}
- setTimeout( function () { element.toggled = false; }, 50 );
}
- function keyHandler(e) {
- var key = e.which || e.keyCode;
- key === 32 && e.target === document.activeElement && toggle(e);
+
+ dispose() {
+ toggleAlertHandler(this);
+ super.dispose(alertComponent);
}
- function preventScroll(e) {
- var key = e.which || e.keyCode;
- key === 32 && e.preventDefault();
+ }
+
+ Alert.init = {
+ component: alertComponent,
+ selector: alertSelector,
+ constructor: Alert,
+ };
+
+ function addClass(element, classNAME) {
+ element.classList.add(classNAME);
+ }
+
+ const activeClass = 'active';
+
+ const dataBsToggle = 'data-bs-toggle';
+
+ /* Native JavaScript for Bootstrap 5 | Button
+ ---------------------------------------------*/
+
+ // BUTTON PRIVATE GC
+ // =================
+ const buttonString = 'button';
+ const buttonComponent = 'Button';
+ const buttonSelector = `[${dataBsToggle}="${buttonString}"]`;
+ const ariaPressed = 'aria-pressed';
+
+ // BUTTON PRIVATE METHOD
+ // =====================
+ function toggleButtonHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ self.element[action]('click', self.toggle);
+ }
+
+ // BUTTON DEFINITION
+ // =================
+ class Button extends BaseComponent {
+ constructor(target) {
+ super(buttonComponent, target);
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+
+ // set initial state
+ self.isActive = hasClass(element, activeClass);
+ element.setAttribute(ariaPressed, !!self.isActive);
+
+ // add event listener
+ toggleButtonHandler(self, 1);
}
- function focusToggle(e) {
- if (e.target.tagName === 'INPUT' ) {
- var action = e.type === 'focusin' ? 'add' : 'remove';
- e.target.closest('.btn').classList[action]('focus');
- }
+
+ // BUTTON PUBLIC METHODS
+ // =====================
+ toggle(e) {
+ if (e) e.preventDefault();
+ const self = e ? this[buttonComponent] : this;
+ const { element } = self;
+
+ if (hasClass(element, 'disabled')) return;
+
+ self.isActive = hasClass(element, activeClass);
+ const { isActive } = self;
+
+ const action = isActive ? removeClass : addClass;
+ const ariaValue = isActive ? 'false' : 'true';
+
+ action(element, activeClass);
+ element.setAttribute(ariaPressed, ariaValue);
}
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- element[action]('click',toggle,false );
- element[action]('keyup',keyHandler,false), element[action]('keydown',preventScroll,false);
- element[action]('focusin',focusToggle,false), element[action]('focusout',focusToggle,false);
+
+ dispose() {
+ toggleButtonHandler(this);
+ super.dispose(buttonComponent);
}
- self.dispose = function () {
- toggleEvents();
- delete element.Button;
- };
- element = queryElement(element);
- element.Button && element.Button.dispose();
- labels = element.getElementsByClassName('btn');
- if (!labels.length) { return; }
- if ( !element.Button ) {
- toggleEvents(1);
- }
- element.toggled = false;
- element.Button = self;
- Array.from(labels).map(function (btn){
- !btn.classList.contains('active')
- && queryElement('input:checked',btn)
- && btn.classList.add('active');
- btn.classList.contains('active')
- && !queryElement('input:checked',btn)
- && btn.classList.remove('active');
- });
}
- var mouseHoverEvents = ('onmouseleave' in document) ? [ 'mouseenter', 'mouseleave'] : [ 'mouseover', 'mouseout' ];
+ Button.init = {
+ component: buttonComponent,
+ selector: buttonSelector,
+ constructor: Button,
+ };
- var supportPassive = (function () {
- var result = false;
+ const supportPassive = (() => {
+ let result = false;
try {
- var opts = Object.defineProperty({}, 'passive', {
- get: function() {
+ const opts = Object.defineProperty({}, 'passive', {
+ get() {
result = true;
- }
+ return result;
+ },
});
- document.addEventListener('DOMContentLoaded', function wrap(){
- document.removeEventListener('DOMContentLoaded', wrap, opts);
+ document[addEventListener]('DOMContentLoaded', function wrap() {
+ document[removeEventListener]('DOMContentLoaded', wrap, opts);
}, opts);
- } catch (e) {}
+ } catch (e) {
+ throw Error('Passive events are not supported');
+ }
+
return result;
})();
+ // general event options
+
var passiveHandler = supportPassive ? { passive: true } : false;
+ function reflow(element) {
+ return element.offsetHeight;
+ }
+
function isElementInScrollRange(element) {
- var bcr = element.getBoundingClientRect(),
- viewportHeight = window.innerHeight || document.documentElement.clientHeight;
- return bcr.top <= viewportHeight && bcr.bottom >= 0;
- }
-
- function Carousel (element,options) {
- options = options || {};
- var self = this,
- vars, ops,
- slideCustomEvent, slidCustomEvent,
- slides, leftArrow, rightArrow, indicator, indicators;
- function pauseHandler() {
- if ( ops.interval !==false && !element.classList.contains('paused') ) {
- element.classList.add('paused');
- !vars.isSliding && ( clearInterval(vars.timer), vars.timer = null );
+ const bcr = element.getBoundingClientRect();
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
+ return bcr.top <= viewportHeight && bcr.bottom >= 0; // bottom && top
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Carousel
+ ----------------------------------------------- */
+
+ // CAROUSEL PRIVATE GC
+ // ===================
+ const carouselString = 'carousel';
+ const carouselComponent = 'Carousel';
+ const carouselSelector = `[data-bs-ride="${carouselString}"]`;
+ const carouselControl = `${carouselString}-control`;
+ const carouselItem = `${carouselString}-item`;
+ const dataBsSlideTo = 'data-bs-slide-to';
+ const pausedClass = 'paused';
+ const defaultCarouselOptions = {
+ pause: 'hover', // 'boolean|string'
+ keyboard: false, // 'boolean'
+ touch: true, // 'boolean'
+ interval: 5000, // 'boolean|number'
+ };
+ let startX = 0;
+ let currentX = 0;
+ let endX = 0;
+
+ // CAROUSEL CUSTOM EVENTS
+ // ======================
+ const carouselSlideEvent = bootstrapCustomEvent(`slide.bs.${carouselString}`);
+ const carouselSlidEvent = bootstrapCustomEvent(`slid.bs.${carouselString}`);
+
+ // CAROUSEL EVENT HANDLERS
+ // =======================
+ function carouselTransitionEndHandler(self) {
+ const {
+ index, direction, element, slides, options, isAnimating,
+ } = self;
+
+ // discontinue disposed instances
+ if (isAnimating && element[carouselComponent]) {
+ const activeItem = getActiveIndex(self);
+ const orientation = direction === 'left' ? 'next' : 'prev';
+ const directionClass = direction === 'left' ? 'start' : 'end';
+ self.isAnimating = false;
+
+ addClass(slides[index], activeClass);
+ removeClass(slides[activeItem], activeClass);
+
+ removeClass(slides[index], `${carouselItem}-${orientation}`);
+ removeClass(slides[index], `${carouselItem}-${directionClass}`);
+ removeClass(slides[activeItem], `${carouselItem}-${directionClass}`);
+
+ element.dispatchEvent(carouselSlidEvent);
+
+ // check for element, might have been disposed
+ if (!document.hidden && options.interval
+ && !hasClass(element, pausedClass)) {
+ self.cycle();
}
}
- function resumeHandler() {
- if ( ops.interval !== false && element.classList.contains('paused') ) {
- element.classList.remove('paused');
- !vars.isSliding && ( clearInterval(vars.timer), vars.timer = null );
- !vars.isSliding && self.cycle();
+ }
+
+ function carouselPauseHandler(e) {
+ const eventTarget = e.target;
+ const self = eventTarget.closest(carouselSelector)[carouselComponent];
+ const { element, isAnimating } = self;
+
+ if (!hasClass(element, pausedClass)) {
+ addClass(element, pausedClass);
+ if (!isAnimating) {
+ clearInterval(self.timer);
+ self.timer = null;
}
}
- function indicatorHandler(e) {
- e.preventDefault();
- if (vars.isSliding) { return; }
- var eventTarget = e.target;
- if ( eventTarget && !eventTarget.classList.contains('active') && eventTarget.getAttribute('data-slide-to') ) {
- vars.index = parseInt( eventTarget.getAttribute('data-slide-to'));
- } else { return false; }
- self.slideTo( vars.index );
- }
- function controlsHandler(e) {
- e.preventDefault();
- if (vars.isSliding) { return; }
- var eventTarget = e.currentTarget || e.srcElement;
- if ( eventTarget === rightArrow ) {
- vars.index++;
- } else if ( eventTarget === leftArrow ) {
- vars.index--;
- }
- self.slideTo( vars.index );
- }
- function keyHandler(ref) {
- var which = ref.which;
- if (vars.isSliding) { return; }
- switch (which) {
- case 39:
- vars.index++;
- break;
- case 37:
- vars.index--;
- break;
- default: return;
- }
- self.slideTo( vars.index );
- }
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- if ( ops.pause && ops.interval ) {
- element[action]( mouseHoverEvents[0], pauseHandler, false );
- element[action]( mouseHoverEvents[1], resumeHandler, false );
- element[action]( 'touchstart', pauseHandler, passiveHandler );
- element[action]( 'touchend', resumeHandler, passiveHandler );
- }
- ops.touch && slides.length > 1 && element[action]( 'touchstart', touchDownHandler, passiveHandler );
- rightArrow && rightArrow[action]( 'click', controlsHandler,false );
- leftArrow && leftArrow[action]( 'click', controlsHandler,false );
- indicator && indicator[action]( 'click', indicatorHandler,false );
- ops.keyboard && window[action]( 'keydown', keyHandler,false );
- }
- function toggleTouchEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- element[action]( 'touchmove', touchMoveHandler, passiveHandler );
- element[action]( 'touchend', touchEndHandler, passiveHandler );
- }
- function touchDownHandler(e) {
- if ( vars.isTouch ) { return; }
- vars.touchPosition.startX = e.changedTouches[0].pageX;
- if ( element.contains(e.target) ) {
- vars.isTouch = true;
- toggleTouchEvents(1);
+ }
+
+ function carouselResumeHandler(e) {
+ const eventTarget = e.target;
+ const self = eventTarget.closest(carouselSelector)[carouselComponent];
+ const { isPaused, isAnimating, element } = self;
+
+ if (!isPaused && hasClass(element, pausedClass)) {
+ removeClass(element, pausedClass);
+
+ if (!isAnimating) {
+ clearInterval(self.timer);
+ self.timer = null;
+ self.cycle();
}
}
- function touchMoveHandler(e) {
- if ( !vars.isTouch ) { e.preventDefault(); return; }
- vars.touchPosition.currentX = e.changedTouches[0].pageX;
- if ( e.type === 'touchmove' && e.changedTouches.length > 1 ) {
- e.preventDefault();
- return false;
- }
+ }
+
+ function carouselIndicatorHandler(e) {
+ e.preventDefault();
+ const { target } = e;
+ const self = target.closest(carouselSelector)[carouselComponent];
+
+ if (self.isAnimating) return;
+
+ const newIndex = target.getAttribute(dataBsSlideTo);
+
+ if (target && !hasClass(target, activeClass) // event target is not active
+ && newIndex) { // AND has the specific attribute
+ self.to(+newIndex); // do the slide
}
- function touchEndHandler (e) {
- if ( !vars.isTouch || vars.isSliding ) { return }
- vars.touchPosition.endX = vars.touchPosition.currentX || e.changedTouches[0].pageX;
- if ( vars.isTouch ) {
- if ( (!element.contains(e.target) || !element.contains(e.relatedTarget) )
- && Math.abs(vars.touchPosition.startX - vars.touchPosition.endX) < 75 ) {
- return false;
- } else {
- if ( vars.touchPosition.currentX < vars.touchPosition.startX ) {
- vars.index++;
- } else if ( vars.touchPosition.currentX > vars.touchPosition.startX ) {
- vars.index--;
- }
- vars.isTouch = false;
- self.slideTo(vars.index);
- }
- toggleTouchEvents();
- }
+ }
+
+ function carouselControlsHandler(e) {
+ e.preventDefault();
+ const that = this;
+ const self = that.closest(carouselSelector)[carouselComponent];
+ const { controls } = self;
+
+ if (controls[1] && that === controls[1]) {
+ self.next();
+ } else if (controls[1] && that === controls[0]) {
+ self.prev();
}
- function setActivePage(pageIndex) {
- Array.from(indicators).map(function (x){x.classList.remove('active');});
- indicators[pageIndex] && indicators[pageIndex].classList.add('active');
- }
- function transitionEndHandler(e){
- if (vars.touchPosition){
- var next = vars.index,
- timeout = e && e.target !== slides[next] ? e.elapsedTime*1000+100 : 20,
- activeItem = self.getActiveIndex(),
- orientation = vars.direction === 'left' ? 'next' : 'prev';
- vars.isSliding && setTimeout(function () {
- if (vars.touchPosition){
- vars.isSliding = false;
- slides[next].classList.add('active');
- slides[activeItem].classList.remove('active');
- slides[next].classList.remove(("carousel-item-" + orientation));
- slides[next].classList.remove(("carousel-item-" + (vars.direction)));
- slides[activeItem].classList.remove(("carousel-item-" + (vars.direction)));
- dispatchCustomEvent.call(element, slidCustomEvent);
- if ( !document.hidden && ops.interval && !element.classList.contains('paused') ) {
- self.cycle();
- }
- }
- }, timeout);
- }
+ }
+
+ function carouselKeyHandler({ which }) {
+ const [element] = Array.from(document.querySelectorAll(carouselSelector))
+ .filter((x) => isElementInScrollRange(x));
+
+ if (!element) return;
+ const self = element[carouselComponent];
+
+ switch (which) {
+ case 39:
+ self.next();
+ break;
+ case 37:
+ self.prev();
+ break;
}
- self.cycle = function () {
- if (vars.timer) {
- clearInterval(vars.timer);
- vars.timer = null;
- }
- vars.timer = setInterval(function () {
- var idx = vars.index || self.getActiveIndex();
- isElementInScrollRange(element) && (idx++, self.slideTo( idx ) );
- }, ops.interval);
- };
- self.slideTo = function (next) {
- if (vars.isSliding) { return; }
- var activeItem = self.getActiveIndex(), orientation, eventProperties;
- if ( activeItem === next ) {
- return;
- } else if ( (activeItem < next ) || (activeItem === 0 && next === slides.length -1 ) ) {
- vars.direction = 'left';
- } else if ( (activeItem > next) || (activeItem === slides.length - 1 && next === 0 ) ) {
- vars.direction = 'right';
- }
- if ( next < 0 ) { next = slides.length - 1; }
- else if ( next >= slides.length ){ next = 0; }
- orientation = vars.direction === 'left' ? 'next' : 'prev';
- eventProperties = { relatedTarget: slides[next], direction: vars.direction, from: activeItem, to: next };
- slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', eventProperties);
- slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', eventProperties);
- dispatchCustomEvent.call(element, slideCustomEvent);
- if (slideCustomEvent.defaultPrevented) { return; }
- vars.index = next;
- vars.isSliding = true;
- clearInterval(vars.timer);
- vars.timer = null;
- setActivePage( next );
- if ( getElementTransitionDuration(slides[next]) && element.classList.contains('slide') ) {
- slides[next].classList.add(("carousel-item-" + orientation));
- slides[next].offsetWidth;
- slides[next].classList.add(("carousel-item-" + (vars.direction)));
- slides[activeItem].classList.add(("carousel-item-" + (vars.direction)));
- emulateTransitionEnd(slides[next], transitionEndHandler);
- } else {
- slides[next].classList.add('active');
- slides[next].offsetWidth;
- slides[activeItem].classList.remove('active');
- setTimeout(function () {
- vars.isSliding = false;
- if ( ops.interval && element && !element.classList.contains('paused') ) {
- self.cycle();
- }
- dispatchCustomEvent.call(element, slidCustomEvent);
- }, 100 );
- }
- };
- self.getActiveIndex = function () { return Array.from(slides).indexOf(element.getElementsByClassName('carousel-item active')[0]) || 0; };
- self.dispose = function () {
- var itemClasses = ['left','right','prev','next'];
- Array.from(slides).map(function (slide,idx) {
- slide.classList.contains('active') && setActivePage( idx );
- itemClasses.map(function (cls) { return slide.classList.remove(("carousel-item-" + cls)); });
- });
- clearInterval(vars.timer);
- toggleEvents();
- vars = {};
- ops = {};
- delete element.Carousel;
- };
- element = queryElement( element );
- element.Carousel && element.Carousel.dispose();
- slides = element.getElementsByClassName('carousel-item');
- leftArrow = element.getElementsByClassName('carousel-control-prev')[0];
- rightArrow = element.getElementsByClassName('carousel-control-next')[0];
- indicator = element.getElementsByClassName('carousel-indicators')[0];
- indicators = indicator && indicator.getElementsByTagName( "LI" ) || [];
- if (slides.length < 2) { return }
- var
- intervalAttribute = element.getAttribute('data-interval'),
- intervalData = intervalAttribute === 'false' ? 0 : parseInt(intervalAttribute),
- touchData = element.getAttribute('data-touch') === 'false' ? 0 : 1,
- pauseData = element.getAttribute('data-pause') === 'hover' || false,
- keyboardData = element.getAttribute('data-keyboard') === 'true' || false,
- intervalOption = options.interval,
- touchOption = options.touch;
- ops = {};
- ops.keyboard = options.keyboard === true || keyboardData;
- ops.pause = (options.pause === 'hover' || pauseData) ? 'hover' : false;
- ops.touch = touchOption || touchData;
- ops.interval = typeof intervalOption === 'number' ? intervalOption
- : intervalOption === false || intervalData === 0 || intervalData === false ? 0
- : isNaN(intervalData) ? 5000
- : intervalData;
- if (self.getActiveIndex()<0) {
- slides.length && slides[0].classList.add('active');
- indicators.length && setActivePage(0);
- }
- vars = {};
- vars.direction = 'left';
- vars.index = 0;
- vars.timer = null;
- vars.isSliding = false;
- vars.isTouch = false;
- vars.touchPosition = {
- startX : 0,
- currentX : 0,
- endX : 0
- };
- toggleEvents(1);
- if ( ops.interval ){ self.cycle(); }
- element.Carousel = self;
- }
-
- function Collapse(element,options) {
- options = options || {};
- var self = this;
- var accordion = null,
- collapse = null,
- activeCollapse,
- activeElement,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent;
- function openAction(collapseElement, toggle) {
- dispatchCustomEvent.call(collapseElement, showCustomEvent);
- if ( showCustomEvent.defaultPrevented ) { return; }
- collapseElement.isAnimating = true;
- collapseElement.classList.add('collapsing');
- collapseElement.classList.remove('collapse');
- collapseElement.style.height = (collapseElement.scrollHeight) + "px";
- emulateTransitionEnd(collapseElement, function () {
- collapseElement.isAnimating = false;
- collapseElement.setAttribute('aria-expanded','true');
- toggle.setAttribute('aria-expanded','true');
- collapseElement.classList.remove('collapsing');
- collapseElement.classList.add('collapse');
- collapseElement.classList.add('show');
- collapseElement.style.height = '';
- dispatchCustomEvent.call(collapseElement, shownCustomEvent);
- });
+ }
+
+ // CAROUSEL TOUCH HANDLERS
+ // =======================
+ function carouselTouchDownHandler(e) {
+ const element = this;
+ const self = element[carouselComponent];
+
+ if (!self || self.isTouch) { return; }
+
+ startX = e.changedTouches[0].pageX;
+
+ if (element.contains(e.target)) {
+ self.isTouch = true;
+ toggleCarouselTouchHandlers(self, 1);
}
- function closeAction(collapseElement, toggle) {
- dispatchCustomEvent.call(collapseElement, hideCustomEvent);
- if ( hideCustomEvent.defaultPrevented ) { return; }
- collapseElement.isAnimating = true;
- collapseElement.style.height = (collapseElement.scrollHeight) + "px";
- collapseElement.classList.remove('collapse');
- collapseElement.classList.remove('show');
- collapseElement.classList.add('collapsing');
- collapseElement.offsetWidth;
- collapseElement.style.height = '0px';
- emulateTransitionEnd(collapseElement, function () {
- collapseElement.isAnimating = false;
- collapseElement.setAttribute('aria-expanded','false');
- toggle.setAttribute('aria-expanded','false');
- collapseElement.classList.remove('collapsing');
- collapseElement.classList.add('collapse');
- collapseElement.style.height = '';
- dispatchCustomEvent.call(collapseElement, hiddenCustomEvent);
- });
+ }
+
+ function carouselTouchMoveHandler(e) {
+ const { changedTouches, type } = e;
+ const self = this[carouselComponent];
+
+ if (!self || !self.isTouch) { return; }
+
+ currentX = changedTouches[0].pageX;
+
+ // cancel touch if more than one changedTouches detected
+ if (type === 'touchmove' && changedTouches.length > 1) {
+ e.preventDefault();
}
- self.toggle = function (e) {
- if (e && e.target.tagName === 'A' || element.tagName === 'A') {e.preventDefault();}
- if (element.contains(e.target) || e.target === element) {
- if (!collapse.classList.contains('show')) { self.show(); }
- else { self.hide(); }
- }
- };
- self.hide = function () {
- if ( collapse.isAnimating ) { return; }
- closeAction(collapse,element);
- element.classList.add('collapsed');
- };
- self.show = function () {
- if ( accordion ) {
- activeCollapse = accordion.getElementsByClassName("collapse show")[0];
- activeElement = activeCollapse && (queryElement(("[data-target=\"#" + (activeCollapse.id) + "\"]"),accordion)
- || queryElement(("[href=\"#" + (activeCollapse.id) + "\"]"),accordion) );
- }
- if ( !collapse.isAnimating ) {
- if ( activeElement && activeCollapse !== collapse ) {
- closeAction(activeCollapse,activeElement);
- activeElement.classList.add('collapsed');
- }
- openAction(collapse,element);
- element.classList.remove('collapsed');
- }
- };
- self.dispose = function () {
- element.removeEventListener('click',self.toggle,false);
- delete element.Collapse;
- };
- element = queryElement(element);
- element.Collapse && element.Collapse.dispose();
- var accordionData = element.getAttribute('data-parent');
- showCustomEvent = bootstrapCustomEvent('show', 'collapse');
- shownCustomEvent = bootstrapCustomEvent('shown', 'collapse');
- hideCustomEvent = bootstrapCustomEvent('hide', 'collapse');
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'collapse');
- collapse = queryElement(options.target || element.getAttribute('data-target') || element.getAttribute('href'));
- collapse.isAnimating = false;
- accordion = element.closest(options.parent || accordionData);
- if ( !element.Collapse ) {
- element.addEventListener('click',self.toggle,false);
- }
- element.Collapse = self;
- }
-
- function setFocus (element){
- element.focus ? element.focus() : element.setActive();
- }
-
- function Dropdown(element,option) {
- var self = this,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent,
- relatedTarget = null,
- parent, menu, menuItems = [],
- persist;
- function preventEmptyAnchor(anchor) {
- (anchor.href && anchor.href.slice(-1) === '#' || anchor.parentNode && anchor.parentNode.href
- && anchor.parentNode.href.slice(-1) === '#') && this.preventDefault();
- }
- function toggleDismiss() {
- var action = element.open ? 'addEventListener' : 'removeEventListener';
- document[action]('click',dismissHandler,false);
- document[action]('keydown',preventScroll,false);
- document[action]('keyup',keyHandler,false);
- document[action]('focus',dismissHandler,false);
- }
- function dismissHandler(e) {
- var eventTarget = e.target,
- hasData = eventTarget && (eventTarget.getAttribute('data-toggle')
- || eventTarget.parentNode && eventTarget.parentNode.getAttribute
- && eventTarget.parentNode.getAttribute('data-toggle'));
- if ( e.type === 'focus' && (eventTarget === element || eventTarget === menu || menu.contains(eventTarget) ) ) {
+ }
+
+ function carouselTouchEndHandler(e) {
+ const element = this;
+ const self = element[carouselComponent];
+
+ if (!self || !self.isTouch) { return; }
+
+ endX = currentX || e.changedTouches[0].pageX;
+
+ if (self.isTouch) {
+ // the event target is outside the carousel OR carousel doens't include the related target
+ if ((!element.contains(e.target) || !element.contains(e.relatedTarget))
+ && Math.abs(startX - endX) < 75) { // AND swipe distance is less than 75px
+ // when the above conditions are satisfied, no need to continue
return;
+ } // OR determine next index to slide to
+ if (currentX < startX) {
+ self.index += 1;
+ } else if (currentX > startX) {
+ self.index -= 1;
}
- if ( (eventTarget === menu || menu.contains(eventTarget)) && (persist || hasData) ) { return; }
- else {
- relatedTarget = eventTarget === element || element.contains(eventTarget) ? element : null;
- self.hide();
- }
- preventEmptyAnchor.call(e,eventTarget);
- }
- function clickHandler(e) {
- relatedTarget = element;
- self.show();
- preventEmptyAnchor.call(e,e.target);
- }
- function preventScroll(e) {
- var key = e.which || e.keyCode;
- if( key === 38 || key === 40 ) { e.preventDefault(); }
- }
- function keyHandler(e) {
- var key = e.which || e.keyCode,
- activeItem = document.activeElement,
- isSameElement = activeItem === element,
- isInsideMenu = menu.contains(activeItem),
- isMenuItem = activeItem.parentNode === menu || activeItem.parentNode.parentNode === menu,
- idx = menuItems.indexOf(activeItem);
- if ( isMenuItem ) {
- idx = isSameElement ? 0
- : key === 38 ? (idx>1?idx-1:0)
- : key === 40 ? (idx<menuItems.length-1?idx+1:idx) : idx;
- menuItems[idx] && setFocus(menuItems[idx]);
- }
- if ( (menuItems.length && isMenuItem
- || !menuItems.length && (isInsideMenu || isSameElement)
- || !isInsideMenu )
- && element.open && key === 27
- ) {
- self.toggle();
- relatedTarget = null;
- }
+
+ self.isTouch = false;
+ self.to(self.index); // do the slide
+
+ toggleCarouselTouchHandlers(self); // remove touch events handlers
}
- self.show = function () {
- showCustomEvent = bootstrapCustomEvent('show', 'dropdown', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(parent, showCustomEvent);
- if ( showCustomEvent.defaultPrevented ) { return; }
- menu.classList.add('show');
- parent.classList.add('show');
- element.setAttribute('aria-expanded',true);
- element.open = true;
- element.removeEventListener('click',clickHandler,false);
- setTimeout(function () {
- setFocus( menu.getElementsByTagName('INPUT')[0] || element );
- toggleDismiss();
- shownCustomEvent = bootstrapCustomEvent('shown', 'dropdown', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(parent, shownCustomEvent);
- },1);
- };
- self.hide = function () {
- hideCustomEvent = bootstrapCustomEvent('hide', 'dropdown', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(parent, hideCustomEvent);
- if ( hideCustomEvent.defaultPrevented ) { return; }
- menu.classList.remove('show');
- parent.classList.remove('show');
- element.setAttribute('aria-expanded',false);
- element.open = false;
- toggleDismiss();
- setFocus(element);
- setTimeout(function () {
- element.Dropdown && element.addEventListener('click',clickHandler,false);
- },1);
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'dropdown', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(parent, hiddenCustomEvent);
- };
- self.toggle = function () {
- if (parent.classList.contains('show') && element.open) { self.hide(); }
- else { self.show(); }
- };
- self.dispose = function () {
- if (parent.classList.contains('show') && element.open) { self.hide(); }
- element.removeEventListener('click',clickHandler,false);
- delete element.Dropdown;
- };
- element = queryElement(element);
- element.Dropdown && element.Dropdown.dispose();
- parent = element.parentNode;
- menu = queryElement('.dropdown-menu', parent);
- Array.from(menu.children).map(function (child){
- child.children.length && (child.children[0].tagName === 'A' && menuItems.push(child.children[0]));
- child.tagName === 'A' && menuItems.push(child);
- });
- if ( !element.Dropdown ) {
- !('tabindex' in menu) && menu.setAttribute('tabindex', '0');
- element.addEventListener('click',clickHandler,false);
- }
- persist = option === true || element.getAttribute('data-persist') === 'true' || false;
- element.open = false;
- element.Dropdown = self;
- }
-
- function Modal(element,options) {
- options = options || {};
- var self = this, modal,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent,
- relatedTarget = null,
- scrollBarWidth,
- overlay,
- overlayDelay,
- fixedItems,
- ops = {};
- function setScrollbar() {
- var openModal = document.body.classList.contains('modal-open'),
- bodyPad = parseInt(getComputedStyle(document.body).paddingRight),
- bodyOverflow = document.documentElement.clientHeight !== document.documentElement.scrollHeight
- || document.body.clientHeight !== document.body.scrollHeight,
- modalOverflow = modal.clientHeight !== modal.scrollHeight;
- scrollBarWidth = measureScrollbar();
- modal.style.paddingRight = !modalOverflow && scrollBarWidth ? (scrollBarWidth + "px") : '';
- document.body.style.paddingRight = modalOverflow || bodyOverflow ? ((bodyPad + (openModal ? 0:scrollBarWidth)) + "px") : '';
- fixedItems.length && fixedItems.map(function (fixed){
- var itemPad = getComputedStyle(fixed).paddingRight;
- fixed.style.paddingRight = modalOverflow || bodyOverflow ? ((parseInt(itemPad) + (openModal?0:scrollBarWidth)) + "px") : ((parseInt(itemPad)) + "px");
- });
+ }
+
+ // CAROUSEL PRIVATE METHODS
+ // ========================
+ function activateCarouselIndicator(self, pageIndex) { // indicators
+ const { indicators } = self;
+ Array.from(indicators).forEach((x) => removeClass(x, activeClass));
+ if (self.indicators[pageIndex]) addClass(indicators[pageIndex], activeClass);
+ }
+
+ function toggleCarouselTouchHandlers(self, add) {
+ const { element } = self;
+ const action = add ? addEventListener : removeEventListener;
+ element[action]('touchmove', carouselTouchMoveHandler, passiveHandler);
+ element[action]('touchend', carouselTouchEndHandler, passiveHandler);
+ }
+
+ function toggleCarouselHandlers(self, add) {
+ const {
+ element, options, slides, controls, indicator,
+ } = self;
+ const {
+ touch, pause, interval, keyboard,
+ } = options;
+ const action = add ? addEventListener : removeEventListener;
+
+ if (pause && interval) {
+ element[action]('mouseenter', carouselPauseHandler);
+ element[action]('mouseleave', carouselResumeHandler);
+ element[action]('touchstart', carouselPauseHandler, passiveHandler);
+ element[action]('touchend', carouselResumeHandler, passiveHandler);
}
- function resetScrollbar() {
- document.body.style.paddingRight = '';
- modal.style.paddingRight = '';
- fixedItems.length && fixedItems.map(function (fixed){
- fixed.style.paddingRight = '';
- });
+
+ if (touch && slides.length > 1) {
+ element[action]('touchstart', carouselTouchDownHandler, passiveHandler);
}
- function measureScrollbar() {
- var scrollDiv = document.createElement('div'), widthValue;
- scrollDiv.className = 'modal-scrollbar-measure';
- document.body.appendChild(scrollDiv);
- widthValue = scrollDiv.offsetWidth - scrollDiv.clientWidth;
- document.body.removeChild(scrollDiv);
- return widthValue;
- }
- function createOverlay() {
- var newOverlay = document.createElement('div');
- overlay = queryElement('.modal-backdrop');
- if ( overlay === null ) {
- newOverlay.setAttribute('class', 'modal-backdrop' + (ops.animation ? ' fade' : ''));
- overlay = newOverlay;
- document.body.appendChild(overlay);
+
+ controls.forEach((arrow) => {
+ if (arrow) arrow[action]('click', carouselControlsHandler);
+ });
+
+ if (indicator) indicator[action]('click', carouselIndicatorHandler);
+ if (keyboard) window[action]('keydown', carouselKeyHandler);
+ }
+
+ function getActiveIndex(self) {
+ const { slides, element } = self;
+ return Array.from(slides)
+ .indexOf(element.getElementsByClassName(`${carouselItem} ${activeClass}`)[0]) || 0;
+ }
+
+ // CAROUSEL DEFINITION
+ // ===================
+ class Carousel extends BaseComponent {
+ constructor(target, config) {
+ super(carouselComponent, target, defaultCarouselOptions, config);
+ // bind
+ const self = this;
+
+ // additional properties
+ self.timer = null;
+ self.direction = 'left';
+ self.isPaused = false;
+ self.isAnimating = false;
+ self.index = 0;
+ self.timer = null;
+ self.isTouch = false;
+
+ // initialization element
+ const { element } = self;
+ // carousel elements
+ // a LIVE collection is prefferable
+ self.slides = element.getElementsByClassName(carouselItem);
+ const { slides } = self;
+
+ // invalidate when not enough items
+ // no need to go further
+ if (slides.length < 2) { return; }
+
+ self.controls = [
+ queryElement(`.${carouselControl}-prev`, element),
+ queryElement(`.${carouselControl}-next`, element),
+ ];
+
+ // a LIVE collection is prefferable
+ self.indicator = queryElement('.carousel-indicators', element);
+ self.indicators = (self.indicator && self.indicator.querySelectorAll(`[${dataBsSlideTo}]`)) || [];
+
+ // set JavaScript and DATA API options
+ const { options } = self;
+
+ // don't use TRUE as interval, it's actually 0, use the default 5000ms better
+ self.options.interval = options.interval === true
+ ? defaultCarouselOptions.interval
+ : options.interval;
+
+ // set first slide active if none
+ if (getActiveIndex(self) < 0) {
+ if (slides.length) addClass(slides[0], activeClass);
+ if (self.indicators.length) activateCarouselIndicator(self, 0);
}
- return overlay;
+
+ // attach event handlers
+ toggleCarouselHandlers(self, 1);
+
+ // start to cycle if interval is set
+ if (options.interval) self.cycle();
}
- function removeOverlay () {
- overlay = queryElement('.modal-backdrop');
- if ( overlay && !document.getElementsByClassName('modal show')[0] ) {
- document.body.removeChild(overlay); overlay = null;
- }
- overlay === null && (document.body.classList.remove('modal-open'), resetScrollbar());
- }
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- window[action]( 'resize', self.update, passiveHandler);
- modal[action]( 'click',dismissHandler,false);
- document[action]( 'keydown',keyHandler,false);
- }
- function beforeShow() {
- modal.style.display = 'block';
- setScrollbar();
- !document.getElementsByClassName('modal show')[0] && document.body.classList.add('modal-open');
- modal.classList.add('show');
- modal.setAttribute('aria-hidden', false);
- modal.classList.contains('fade') ? emulateTransitionEnd(modal, triggerShow) : triggerShow();
- }
- function triggerShow() {
- setFocus(modal);
- modal.isAnimating = false;
- toggleEvents(1);
- shownCustomEvent = bootstrapCustomEvent('shown', 'modal', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(modal, shownCustomEvent);
- }
- function triggerHide(force) {
- modal.style.display = '';
- element && (setFocus(element));
- overlay = queryElement('.modal-backdrop');
- if (force !== 1 && overlay && overlay.classList.contains('show') && !document.getElementsByClassName('modal show')[0]) {
- overlay.classList.remove('show');
- emulateTransitionEnd(overlay,removeOverlay);
- } else {
- removeOverlay();
- }
- toggleEvents();
- modal.isAnimating = false;
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'modal');
- dispatchCustomEvent.call(modal, hiddenCustomEvent);
- }
- function clickHandler(e) {
- if ( modal.isAnimating ) { return; }
- var clickTarget = e.target,
- modalID = "#" + (modal.getAttribute('id')),
- targetAttrValue = clickTarget.getAttribute('data-target') || clickTarget.getAttribute('href'),
- elemAttrValue = element.getAttribute('data-target') || element.getAttribute('href');
- if ( !modal.classList.contains('show')
- && (clickTarget === element && targetAttrValue === modalID
- || element.contains(clickTarget) && elemAttrValue === modalID) ) {
- modal.modalTrigger = element;
- relatedTarget = element;
- self.show();
- e.preventDefault();
+
+ // CAROUSEL PUBLIC METHODS
+ // =======================
+ cycle() {
+ const self = this;
+ const { isPaused, element, options } = self;
+ if (self.timer) {
+ clearInterval(self.timer);
+ self.timer = null;
}
- }
- function keyHandler(ref) {
- var which = ref.which;
- if (!modal.isAnimating && ops.keyboard && which == 27 && modal.classList.contains('show') ) {
- self.hide();
+
+ if (isPaused) {
+ removeClass(element, pausedClass);
+ self.isPaused = !isPaused;
}
+
+ self.timer = setInterval(() => {
+ if (isElementInScrollRange(element)) {
+ self.index += 1;
+ self.to(self.index);
+ }
+ }, options.interval);
}
- function dismissHandler(e) {
- if ( modal.isAnimating ) { return; }
- var clickTarget = e.target,
- hasData = clickTarget.getAttribute('data-dismiss') === 'modal',
- parentWithData = clickTarget.closest('[data-dismiss="modal"]');
- if ( modal.classList.contains('show') && ( parentWithData || hasData
- || clickTarget === modal && ops.backdrop !== 'static' ) ) {
- self.hide(); relatedTarget = null;
- e.preventDefault();
+
+ pause() {
+ const self = this;
+ const { element, options, isPaused } = self;
+ if (options.interval && !isPaused) {
+ clearInterval(self.timer);
+ self.timer = null;
+ addClass(element, pausedClass);
+ self.isPaused = !isPaused;
}
}
- self.toggle = function () {
- if ( modal.classList.contains('show') ) {self.hide();} else {self.show();}
- };
- self.show = function () {
- if (modal.classList.contains('show') && !!modal.isAnimating ) {return}
- showCustomEvent = bootstrapCustomEvent('show', 'modal', { relatedTarget: relatedTarget });
- dispatchCustomEvent.call(modal, showCustomEvent);
- if ( showCustomEvent.defaultPrevented ) { return; }
- modal.isAnimating = true;
- var currentOpen = document.getElementsByClassName('modal show')[0];
- if (currentOpen && currentOpen !== modal) {
- currentOpen.modalTrigger && currentOpen.modalTrigger.Modal.hide();
- currentOpen.Modal && currentOpen.Modal.hide();
- }
- if ( ops.backdrop ) {
- overlay = createOverlay();
- }
- if ( overlay && !currentOpen && !overlay.classList.contains('show') ) {
- overlay.offsetWidth;
- overlayDelay = getElementTransitionDuration(overlay);
- overlay.classList.add('show');
- }
- !currentOpen ? setTimeout( beforeShow, overlay && overlayDelay ? overlayDelay:0 ) : beforeShow();
- };
- self.hide = function (force) {
- if ( !modal.classList.contains('show') ) {return}
- hideCustomEvent = bootstrapCustomEvent( 'hide', 'modal');
- dispatchCustomEvent.call(modal, hideCustomEvent);
- if ( hideCustomEvent.defaultPrevented ) { return; }
- modal.isAnimating = true;
- modal.classList.remove('show');
- modal.setAttribute('aria-hidden', true);
- modal.classList.contains('fade') && force !== 1 ? emulateTransitionEnd(modal, triggerHide) : triggerHide();
- };
- self.setContent = function (content) {
- queryElement('.modal-content',modal).innerHTML = content;
- };
- self.update = function () {
- if (modal.classList.contains('show')) {
- setScrollbar();
- }
- };
- self.dispose = function () {
- self.hide(1);
- if (element) {element.removeEventListener('click',clickHandler,false); delete element.Modal; }
- else {delete modal.Modal;}
- };
- element = queryElement(element);
- var checkModal = queryElement( element.getAttribute('data-target') || element.getAttribute('href') );
- modal = element.classList.contains('modal') ? element : checkModal;
- fixedItems = Array.from(document.getElementsByClassName('fixed-top'))
- .concat(Array.from(document.getElementsByClassName('fixed-bottom')));
- if ( element.classList.contains('modal') ) { element = null; }
- element && element.Modal && element.Modal.dispose();
- modal && modal.Modal && modal.Modal.dispose();
- ops.keyboard = options.keyboard === false || modal.getAttribute('data-keyboard') === 'false' ? false : true;
- ops.backdrop = options.backdrop === 'static' || modal.getAttribute('data-backdrop') === 'static' ? 'static' : true;
- ops.backdrop = options.backdrop === false || modal.getAttribute('data-backdrop') === 'false' ? false : ops.backdrop;
- ops.animation = modal.classList.contains('fade') ? true : false;
- ops.content = options.content;
- modal.isAnimating = false;
- if ( element && !element.Modal ) {
- element.addEventListener('click',clickHandler,false);
- }
- if ( ops.content ) {
- self.setContent( ops.content.trim() );
- }
- if (element) {
- modal.modalTrigger = element;
- element.Modal = self;
- } else {
- modal.Modal = self;
- }
- }
-
- var mouseClickEvents = { down: 'mousedown', up: 'mouseup' };
-
- function getScroll() {
- return {
- y : window.pageYOffset || document.documentElement.scrollTop,
- x : window.pageXOffset || document.documentElement.scrollLeft
- }
- }
-
- function styleTip(link,element,position,parent) {
- var tipPositions = /\b(top|bottom|left|right)+/,
- elementDimensions = { w : element.offsetWidth, h: element.offsetHeight },
- windowWidth = (document.documentElement.clientWidth || document.body.clientWidth),
- windowHeight = (document.documentElement.clientHeight || document.body.clientHeight),
- rect = link.getBoundingClientRect(),
- scroll = parent === document.body ? getScroll() : { x: parent.offsetLeft + parent.scrollLeft, y: parent.offsetTop + parent.scrollTop },
- linkDimensions = { w: rect.right - rect.left, h: rect.bottom - rect.top },
- isPopover = element.classList.contains('popover'),
- arrow = element.getElementsByClassName('arrow')[0],
- halfTopExceed = rect.top + linkDimensions.h/2 - elementDimensions.h/2 < 0,
- halfLeftExceed = rect.left + linkDimensions.w/2 - elementDimensions.w/2 < 0,
- halfRightExceed = rect.left + elementDimensions.w/2 + linkDimensions.w/2 >= windowWidth,
- halfBottomExceed = rect.top + elementDimensions.h/2 + linkDimensions.h/2 >= windowHeight,
- topExceed = rect.top - elementDimensions.h < 0,
- leftExceed = rect.left - elementDimensions.w < 0,
- bottomExceed = rect.top + elementDimensions.h + linkDimensions.h >= windowHeight,
- rightExceed = rect.left + elementDimensions.w + linkDimensions.w >= windowWidth;
- position = (position === 'left' || position === 'right') && leftExceed && rightExceed ? 'top' : position;
- position = position === 'top' && topExceed ? 'bottom' : position;
- position = position === 'bottom' && bottomExceed ? 'top' : position;
- position = position === 'left' && leftExceed ? 'right' : position;
- position = position === 'right' && rightExceed ? 'left' : position;
- var topPosition,
- leftPosition,
- arrowTop,
- arrowLeft,
- arrowWidth,
- arrowHeight;
- element.className.indexOf(position) === -1 && (element.className = element.className.replace(tipPositions,position));
- arrowWidth = arrow.offsetWidth; arrowHeight = arrow.offsetHeight;
- if ( position === 'left' || position === 'right' ) {
- if ( position === 'left' ) {
- leftPosition = rect.left + scroll.x - elementDimensions.w - ( isPopover ? arrowWidth : 0 );
- } else {
- leftPosition = rect.left + scroll.x + linkDimensions.w;
- }
- if (halfTopExceed) {
- topPosition = rect.top + scroll.y;
- arrowTop = linkDimensions.h/2 - arrowWidth;
- } else if (halfBottomExceed) {
- topPosition = rect.top + scroll.y - elementDimensions.h + linkDimensions.h;
- arrowTop = elementDimensions.h - linkDimensions.h/2 - arrowWidth;
- } else {
- topPosition = rect.top + scroll.y - elementDimensions.h/2 + linkDimensions.h/2;
- arrowTop = elementDimensions.h/2 - (isPopover ? arrowHeight*0.9 : arrowHeight/2);
- }
- } else if ( position === 'top' || position === 'bottom' ) {
- if ( position === 'top') {
- topPosition = rect.top + scroll.y - elementDimensions.h - ( isPopover ? arrowHeight : 0 );
- } else {
- topPosition = rect.top + scroll.y + linkDimensions.h;
- }
- if (halfLeftExceed) {
- leftPosition = 0;
- arrowLeft = rect.left + linkDimensions.w/2 - arrowWidth;
- } else if (halfRightExceed) {
- leftPosition = windowWidth - elementDimensions.w*1.01;
- arrowLeft = elementDimensions.w - ( windowWidth - rect.left ) + linkDimensions.w/2 - arrowWidth/2;
- } else {
- leftPosition = rect.left + scroll.x - elementDimensions.w/2 + linkDimensions.w/2;
- arrowLeft = elementDimensions.w/2 - ( isPopover ? arrowWidth : arrowWidth/2 );
- }
+
+ next() {
+ const self = this;
+ if (!self.isAnimating) { self.index += 1; self.to(self.index); }
}
- element.style.top = topPosition + 'px';
- element.style.left = leftPosition + 'px';
- arrowTop && (arrow.style.top = arrowTop + 'px');
- arrowLeft && (arrow.style.left = arrowLeft + 'px');
- }
-
- function Popover(element,options) {
- options = options || {};
- var self = this;
- var popover = null,
- timer = 0,
- isIphone = /(iPhone|iPod|iPad)/.test(navigator.userAgent),
- titleString,
- contentString,
- ops = {};
- var triggerData,
- animationData,
- placementData,
- dismissibleData,
- delayData,
- containerData,
- closeBtn,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent,
- containerElement,
- containerDataElement,
- modal,
- navbarFixedTop,
- navbarFixedBottom,
- placementClass;
- function dismissibleHandler(e) {
- if (popover !== null && e.target === queryElement('.close',popover)) {
- self.hide();
- }
+
+ prev() {
+ const self = this;
+ if (!self.isAnimating) { self.index -= 1; self.to(self.index); }
}
- function getContents() {
- return {
- 0 : options.title || element.getAttribute('data-title') || null,
- 1 : options.content || element.getAttribute('data-content') || null
+
+ to(idx) {
+ const self = this;
+ const {
+ element, isAnimating, slides, options,
+ } = self;
+ const activeItem = getActiveIndex(self);
+ let next = idx;
+
+ // when controled via methods, make sure to check again
+ // first return if we're on the same item #227
+ if (isAnimating || activeItem === next) return;
+
+ // determine transition direction
+ if ((activeItem < next) || (activeItem === 0 && next === slides.length - 1)) {
+ self.direction = 'left'; // next
+ } else if ((activeItem > next) || (activeItem === slides.length - 1 && next === 0)) {
+ self.direction = 'right'; // prev
}
- }
- function removePopover() {
- ops.container.removeChild(popover);
- timer = null; popover = null;
- }
- function createPopover() {
- titleString = getContents()[0] || null;
- contentString = getContents()[1];
- contentString = !!contentString ? contentString.trim() : null;
- popover = document.createElement('div');
- var popoverArrow = document.createElement('div');
- popoverArrow.classList.add('arrow');
- popover.appendChild(popoverArrow);
- if ( contentString !== null && ops.template === null ) {
- popover.setAttribute('role','tooltip');
- if (titleString !== null) {
- var popoverTitle = document.createElement('h3');
- popoverTitle.classList.add('popover-header');
- popoverTitle.innerHTML = ops.dismissible ? titleString + closeBtn : titleString;
- popover.appendChild(popoverTitle);
+ const { direction } = self;
+
+ // find the right next index
+ if (next < 0) { next = slides.length - 1; } else if (next >= slides.length) { next = 0; }
+
+ // orientation, class name, eventProperties
+ const orientation = direction === 'left' ? 'next' : 'prev';
+ const directionClass = direction === 'left' ? 'start' : 'end';
+ const eventProperties = {
+ relatedTarget: slides[next], direction, from: activeItem, to: next,
+ };
+
+ // update event properties
+ Object.keys(eventProperties).forEach((k) => {
+ carouselSlideEvent[k] = eventProperties[k];
+ carouselSlidEvent[k] = eventProperties[k];
+ });
+
+ // discontinue when prevented
+ element.dispatchEvent(carouselSlideEvent);
+ if (carouselSlideEvent.defaultPrevented) return;
+
+ // update index
+ self.index = next;
+
+ clearInterval(self.timer);
+ self.timer = null;
+
+ self.isAnimating = true;
+ activateCarouselIndicator(self, next);
+
+ if (getElementTransitionDuration(slides[next]) && hasClass(element, 'slide')) {
+ addClass(slides[next], `${carouselItem}-${orientation}`);
+ reflow(slides[next]);
+ addClass(slides[next], `${carouselItem}-${directionClass}`);
+ addClass(slides[activeItem], `${carouselItem}-${directionClass}`);
+
+ emulateTransitionEnd(slides[next], () => carouselTransitionEndHandler(self));
+ } else {
+ addClass(slides[next], activeClass);
+ removeClass(slides[activeItem], activeClass);
+
+ setTimeout(() => {
+ self.isAnimating = false;
+
+ // check for element, might have been disposed
+ if (element && options.interval && !hasClass(element, pausedClass)) {
+ self.cycle();
+ }
+
+ element.dispatchEvent(carouselSlidEvent);
+ }, 100);
+ }
+ }
+
+ dispose() {
+ const self = this;
+ const { slides } = self;
+ const itemClasses = ['start', 'end', 'prev', 'next'];
+
+ Array.from(slides).forEach((slide, idx) => {
+ if (hasClass(slide, activeClass)) activateCarouselIndicator(self, idx);
+ itemClasses.forEach((c) => removeClass(slide, `${carouselItem}-${c}`));
+ });
+
+ toggleCarouselHandlers(self);
+ clearInterval(self.timer);
+ super.dispose(carouselComponent);
+ }
+ }
+
+ Carousel.init = {
+ component: carouselComponent,
+ selector: carouselSelector,
+ constructor: Carousel,
+ };
+
+ const ariaExpanded = 'aria-expanded';
+
+ // collapse / tab
+ const collapsingClass = 'collapsing';
+
+ const dataBsTarget = 'data-bs-target';
+
+ const dataBsParent = 'data-bs-parent';
+
+ const dataBsContainer = 'data-bs-container';
+
+ function getTargetElement(element) {
+ return queryElement(element.getAttribute(dataBsTarget) || element.getAttribute('href'))
+ || element.closest(element.getAttribute(dataBsParent))
+ || queryElement(element.getAttribute(dataBsContainer));
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Collapse
+ ----------------------------------------------- */
+
+ // COLLAPSE GC
+ // ===========
+ const collapseString = 'collapse';
+ const collapseComponent = 'Collapse';
+ const collapseSelector = `.${collapseString}`;
+ const collapseToggleSelector = `[${dataBsToggle}="${collapseString}"]`;
+
+ // COLLAPSE CUSTOM EVENTS
+ // ======================
+ const showCollapseEvent = bootstrapCustomEvent(`show.bs.${collapseString}`);
+ const shownCollapseEvent = bootstrapCustomEvent(`shown.bs.${collapseString}`);
+ const hideCollapseEvent = bootstrapCustomEvent(`hide.bs.${collapseString}`);
+ const hiddenCollapseEvent = bootstrapCustomEvent(`hidden.bs.${collapseString}`);
+
+ // COLLAPSE PRIVATE METHODS
+ // ========================
+ function expandCollapse(self) {
+ const {
+ element, parent, triggers,
+ } = self;
+
+ element.dispatchEvent(showCollapseEvent);
+ if (showCollapseEvent.defaultPrevented) return;
+
+ self.isAnimating = true;
+ if (parent) parent.isAnimating = true;
+
+ addClass(element, collapsingClass);
+ removeClass(element, collapseString);
+
+ element.style.height = `${element.scrollHeight}px`;
+
+ emulateTransitionEnd(element, () => {
+ self.isAnimating = false;
+ if (parent) parent.isAnimating = false;
+
+ triggers.forEach((btn) => btn.setAttribute(ariaExpanded, 'true'));
+
+ removeClass(element, collapsingClass);
+ addClass(element, collapseString);
+ addClass(element, showClass);
+
+ element.style.height = '';
+
+ element.dispatchEvent(shownCollapseEvent);
+ });
+ }
+
+ function collapseContent(self) {
+ const {
+ element, parent, triggers,
+ } = self;
+
+ element.dispatchEvent(hideCollapseEvent);
+
+ if (hideCollapseEvent.defaultPrevented) return;
+
+ self.isAnimating = true;
+ if (parent) parent.isAnimating = true;
+
+ element.style.height = `${element.scrollHeight}px`;
+
+ removeClass(element, collapseString);
+ removeClass(element, showClass);
+ addClass(element, collapsingClass);
+
+ reflow(element);
+ element.style.height = '0px';
+
+ emulateTransitionEnd(element, () => {
+ self.isAnimating = false;
+ if (parent) parent.isAnimating = false;
+
+ triggers.forEach((btn) => btn.setAttribute(ariaExpanded, 'false'));
+
+ removeClass(element, collapsingClass);
+ addClass(element, collapseString);
+
+ element.style.height = '';
+
+ element.dispatchEvent(hiddenCollapseEvent);
+ });
+ }
+
+ function toggleCollapseHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ const { triggers } = self;
+
+ if (triggers.length) {
+ triggers.forEach((btn) => btn[action]('click', collapseClickHandler));
+ }
+ }
+
+ // COLLAPSE EVENT HANDLER
+ // ======================
+ function collapseClickHandler(e) {
+ const { target } = e;
+ const trigger = target.closest(collapseToggleSelector);
+ const element = getTargetElement(trigger);
+ const self = element && element[collapseComponent];
+ if (self) self.toggle(target);
+
+ // event target is anchor link #398
+ if (trigger && trigger.tagName === 'A') e.preventDefault();
+ }
+
+ // COLLAPSE DEFINITION
+ // ===================
+ class Collapse extends BaseComponent {
+ constructor(target, config) {
+ super(collapseComponent, target, { parent: null }, config);
+ // bind
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+
+ // set triggering elements
+ self.triggers = Array.from(document.querySelectorAll(collapseToggleSelector))
+ .filter((btn) => getTargetElement(btn) === element);
+
+ // set parent accordion
+ self.parent = queryElement(self.options.parent);
+ const { parent } = self;
+
+ // set initial state
+ self.isAnimating = false;
+ if (parent) parent.isAnimating = false;
+
+ // add event listeners
+ toggleCollapseHandler(self, 1);
+ }
+
+ // COLLAPSE PUBLIC METHODS
+ // =======================
+ toggle(related) {
+ const self = this;
+ if (!hasClass(self.element, showClass)) self.show(related);
+ else self.hide(related);
+ }
+
+ hide() {
+ const self = this;
+ const { triggers, isAnimating } = self;
+ if (isAnimating) return;
+
+ collapseContent(self);
+ if (triggers.length) {
+ triggers.forEach((btn) => addClass(btn, `${collapseString}d`));
+ }
+ }
+
+ show() {
+ const self = this;
+ const {
+ element, parent, triggers, isAnimating,
+ } = self;
+ let activeCollapse;
+ let activeCollapseInstance;
+
+ if (parent) {
+ activeCollapse = Array.from(parent.querySelectorAll(`.${collapseString}.${showClass}`))
+ .find((i) => i[collapseComponent]);
+ activeCollapseInstance = activeCollapse && activeCollapse[collapseComponent];
+ }
+
+ if ((!parent || (parent && !parent.isAnimating)) && !isAnimating) {
+ if (activeCollapseInstance && activeCollapse !== element) {
+ collapseContent(activeCollapseInstance);
+ activeCollapseInstance.triggers.forEach((btn) => {
+ addClass(btn, `${collapseString}d`);
+ });
+ }
+
+ expandCollapse(self);
+ if (triggers.length) {
+ triggers.forEach((btn) => removeClass(btn, `${collapseString}d`));
+ }
+ }
+ }
+
+ dispose() {
+ const self = this;
+ const { parent } = self;
+ toggleCollapseHandler(self);
+
+ if (parent) delete parent.isAnimating;
+ super.dispose(collapseComponent);
+ }
+ }
+
+ Collapse.init = {
+ component: collapseComponent,
+ selector: collapseSelector,
+ constructor: Collapse,
+ };
+
+ const dropdownMenuClasses = ['dropdown', 'dropup', 'dropstart', 'dropend'];
+
+ const dropdownMenuClass = 'dropdown-menu';
+
+ function isEmptyAnchor(elem) {
+ const parentAnchor = elem.closest('A');
+ // anchor href starts with #
+ return elem && ((elem.href && elem.href.slice(-1) === '#')
+ // OR a child of an anchor with href starts with #
+ || (parentAnchor && parentAnchor.href && parentAnchor.href.slice(-1) === '#'));
+ }
+
+ function setFocus(element) {
+ element.focus();
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Dropdown
+ ----------------------------------------------- */
+
+ // DROPDOWN PRIVATE GC
+ // ===================
+ const [dropdownString] = dropdownMenuClasses;
+ const dropdownComponent = 'Dropdown';
+ const dropdownSelector = `[${dataBsToggle}="${dropdownString}"]`;
+
+ // DROPDOWN PRIVATE GC
+ // ===================
+ const dropupString = dropdownMenuClasses[1];
+ const dropstartString = dropdownMenuClasses[2];
+ const dropendString = dropdownMenuClasses[3];
+ const dropdownMenuEndClass = `${dropdownMenuClass}-end`;
+ const hideMenuClass = ['d-block', 'invisible'];
+ const verticalClass = [dropdownString, dropupString];
+ const horizontalClass = [dropstartString, dropendString];
+ const defaultDropdownOptions = {
+ offset: 5, // [number] 5(px)
+ display: 'dynamic', // [dynamic|static]
+ };
+
+ // DROPDOWN CUSTOM EVENTS
+ // ========================
+ const showDropdownEvent = bootstrapCustomEvent(`show.bs.${dropdownString}`);
+ const shownDropdownEvent = bootstrapCustomEvent(`shown.bs.${dropdownString}`);
+ const hideDropdownEvent = bootstrapCustomEvent(`hide.bs.${dropdownString}`);
+ const hiddenDropdownEvent = bootstrapCustomEvent(`hidden.bs.${dropdownString}`);
+
+ // DROPDOWN PRIVATE METHODS
+ // ========================
+ function styleDropdown(self, show) {
+ const {
+ element, menu, originalClass, menuEnd, options,
+ } = self;
+ const parent = element.parentElement;
+
+ // reset menu offset and position
+ const resetProps = ['margin', 'top', 'bottom', 'left', 'right'];
+ resetProps.forEach((p) => { menu.style[p] = ''; });
+ removeClass(parent, 'position-static');
+
+ if (!show) {
+ parent.className = originalClass.join(' ');
+ const menuAction = menuEnd && !hasClass(menu, dropdownMenuEndClass) ? addClass : removeClass;
+ menuAction(menu, dropdownMenuEndClass);
+ return;
+ }
+
+ const { offset } = options;
+ let positionClass = dropdownMenuClasses.find((c) => originalClass.includes(c));
+
+ let dropdownMargin = {
+ dropdown: [offset, 0, 0],
+ dropup: [0, 0, offset],
+ dropstart: [-1, offset, 0],
+ dropend: [-1, 0, 0, offset],
+ };
+
+ const dropdownPosition = {
+ dropdown: { top: '100%' },
+ dropup: { top: 'auto', bottom: '100%' },
+ dropstart: { left: 'auto', right: '100%' },
+ dropend: { left: '100%', right: 'auto' },
+ menuEnd: { right: 0, left: 'auto' },
+ };
+
+ // force showing the menu to calculate its size
+ hideMenuClass.forEach((c) => addClass(menu, c));
+
+ const dropdownRegex = new RegExp(`\\b(${dropdownString}|${dropupString}|${dropstartString}|${dropendString})+`);
+ const elementDimensions = { w: element.offsetWidth, h: element.offsetHeight };
+ const menuDimensions = { w: menu.offsetWidth, h: menu.offsetHeight };
+ const HTML = document.documentElement;
+ const BD = document.body;
+ const windowWidth = (HTML.clientWidth || BD.clientWidth);
+ const windowHeight = (HTML.clientHeight || BD.clientHeight);
+ const targetBCR = element.getBoundingClientRect();
+ // dropdownMenuEnd && [ dropdown | dropup ]
+ const leftExceed = targetBCR.left + elementDimensions.w - menuDimensions.w < 0;
+ // dropstart
+ const leftFullExceed = targetBCR.left - menuDimensions.w < 0;
+ // !dropdownMenuEnd && [ dropdown | dropup ]
+ const rightExceed = targetBCR.left + menuDimensions.w >= windowWidth;
+ // dropend
+ const rightFullExceed = targetBCR.left + menuDimensions.w + elementDimensions.w >= windowWidth;
+ // dropstart | dropend
+ const bottomExceed = targetBCR.top + menuDimensions.h >= windowHeight;
+ // dropdown
+ const bottomFullExceed = targetBCR.top + menuDimensions.h + elementDimensions.h >= windowHeight;
+ // dropup
+ const topExceed = targetBCR.top - menuDimensions.h < 0;
+
+ const btnGroup = parent.parentNode.closest('.btn-group,.btn-group-vertical');
+
+ // recompute position
+ if (horizontalClass.includes(positionClass) && leftFullExceed && rightFullExceed) {
+ positionClass = dropdownString;
+ }
+ if (horizontalClass.includes(positionClass) && bottomExceed) {
+ positionClass = dropupString;
+ }
+ if (positionClass === dropstartString && leftFullExceed && !bottomExceed) {
+ positionClass = dropendString;
+ }
+ if (positionClass === dropendString && rightFullExceed && !bottomExceed) {
+ positionClass = dropstartString;
+ }
+ if (positionClass === dropupString && topExceed && !bottomFullExceed) {
+ positionClass = dropdownString;
+ }
+ if (positionClass === dropdownString && bottomFullExceed && !topExceed) {
+ positionClass = dropupString;
+ }
+
+ // set spacing
+ dropdownMargin = dropdownMargin[positionClass];
+ menu.style.margin = `${dropdownMargin.map((x) => (x ? `${x}px` : x)).join(' ')}`;
+ Object.keys(dropdownPosition[positionClass]).forEach((position) => {
+ menu.style[position] = dropdownPosition[positionClass][position];
+ });
+
+ // update dropdown position class
+ if (!hasClass(parent, positionClass)) {
+ parent.className = parent.className.replace(dropdownRegex, positionClass);
+ }
+
+ // update dropdown / dropup to handle parent btn-group element
+ // as well as the dropdown-menu-end utility class
+ if (verticalClass.includes(positionClass)) {
+ const menuEndAction = rightExceed ? addClass : removeClass;
+
+ if (!btnGroup) menuEndAction(menu, dropdownMenuEndClass);
+ else if (leftExceed) addClass(parent, 'position-static');
+
+ if (hasClass(menu, dropdownMenuEndClass)) {
+ Object.keys(dropdownPosition.menuEnd).forEach((p) => {
+ menu.style[p] = dropdownPosition.menuEnd[p];
+ });
+ }
+ }
+
+ // remove util classes from the menu, we have its size
+ hideMenuClass.forEach((c) => removeClass(menu, c));
+ }
+
+ function toggleDropdownDismiss(self) {
+ const action = self.open ? addEventListener : removeEventListener;
+
+ document[action]('click', dropdownDismissHandler);
+ document[action]('focus', dropdownDismissHandler);
+ document[action]('keydown', dropdownPreventScroll);
+ document[action]('keyup', dropdownKeyHandler);
+ if (self.options.display === 'dynamic') {
+ window[action]('scroll', dropdownLayoutHandler, passiveHandler);
+ window[action]('resize', dropdownLayoutHandler, passiveHandler);
+ }
+ }
+
+ function toggleDropdownHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ self.element[action]('click', dropdownClickHandler);
+ }
+
+ function getCurrentOpenDropdown() {
+ const currentParent = dropdownMenuClasses
+ .map((c) => document.getElementsByClassName(`${c} ${showClass}`))
+ .find((x) => x.length);
+
+ if (currentParent && currentParent.length) {
+ return Array.from(currentParent[0].children).find((x) => x.hasAttribute(dataBsToggle));
+ }
+ return null;
+ }
+
+ // DROPDOWN EVENT HANDLERS
+ // =======================
+ function dropdownDismissHandler(e) {
+ const { target, type } = e;
+ if (!target.closest) return; // some weird FF bug #409
+
+ const element = getCurrentOpenDropdown();
+ const parent = element && element.parentNode;
+ const self = element && element[dropdownComponent];
+ const menu = self && self.menu;
+
+ const hasData = target.closest(dropdownSelector) !== null;
+ const isForm = parent && parent.contains(target)
+ && (target.tagName === 'form' || target.closest('form') !== null);
+
+ if (type === 'click' && isEmptyAnchor(target)) {
+ e.preventDefault();
+ }
+ if (type === 'focus'
+ && (target === element || target === menu || menu.contains(target))) {
+ return;
+ }
+
+ if (isForm || hasData) ; else if (self) {
+ self.hide(element);
+ }
+ }
+
+ function dropdownClickHandler(e) {
+ const element = this;
+ const self = element[dropdownComponent];
+ self.toggle(element);
+
+ if (isEmptyAnchor(e.target)) e.preventDefault();
+ }
+
+ function dropdownPreventScroll(e) {
+ if (e.which === 38 || e.which === 40) e.preventDefault();
+ }
+
+ function dropdownKeyHandler({ which }) {
+ const element = getCurrentOpenDropdown();
+ const self = element[dropdownComponent];
+ const { menu, menuItems, open } = self;
+ const activeItem = document.activeElement;
+ const isSameElement = activeItem === element;
+ const isInsideMenu = menu.contains(activeItem);
+ const isMenuItem = activeItem.parentNode === menu || activeItem.parentNode.parentNode === menu;
+
+ let idx = menuItems.indexOf(activeItem);
+
+ if (isMenuItem) { // navigate up | down
+ if (isSameElement) {
+ idx = 0;
+ } else if (which === 38) {
+ idx = idx > 1 ? idx - 1 : 0;
+ } else if (which === 40) {
+ idx = idx < menuItems.length - 1 ? idx + 1 : idx;
+ }
+
+ if (menuItems[idx]) setFocus(menuItems[idx]);
+ }
+
+ if (((menuItems.length && isMenuItem) // menu has items
+ || (!menuItems.length && (isInsideMenu || isSameElement)) // menu might be a form
+ || !isInsideMenu) // or the focused element is not in the menu at all
+ && open && which === 27 // menu must be open
+ ) {
+ self.toggle();
+ }
+ }
+
+ function dropdownLayoutHandler() {
+ const element = getCurrentOpenDropdown();
+ const self = element && element[dropdownComponent];
+
+ if (self && self.open) styleDropdown(self, 1);
+ }
+
+ // DROPDOWN DEFINITION
+ // ===================
+ class Dropdown extends BaseComponent {
+ constructor(target, config) {
+ super(dropdownComponent, target, defaultDropdownOptions, config);
+ // bind
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+
+ // set targets
+ const parent = element.parentElement;
+ self.menu = queryElement(`.${dropdownMenuClass}`, parent);
+ const { menu } = self;
+
+ self.originalClass = Array.from(parent.classList);
+
+ // set original position
+ self.menuEnd = hasClass(menu, dropdownMenuEndClass);
+
+ self.menuItems = [];
+
+ Array.from(menu.children).forEach((child) => {
+ if (child.children.length && (child.children[0].tagName === 'A')) self.menuItems.push(child.children[0]);
+ if (child.tagName === 'A') self.menuItems.push(child);
+ });
+
+ // set initial state to closed
+ self.open = false;
+
+ // add event listener
+ toggleDropdownHandler(self, 1);
+ }
+
+ // DROPDOWN PUBLIC METHODS
+ // =======================
+ toggle(related) {
+ const self = this;
+ const { open } = self;
+
+ if (open) self.hide(related);
+ else self.show(related);
+ }
+
+ show(related) {
+ const self = this;
+ const currentParent = queryElement(dropdownMenuClasses.map((c) => `.${c}.${showClass}`).join(','));
+ const currentElement = currentParent && queryElement(dropdownSelector, currentParent);
+
+ if (currentElement) currentElement[dropdownComponent].hide();
+
+ const { element, menu, open } = self;
+ const parent = element.parentNode;
+
+ // update relatedTarget and dispatch
+ showDropdownEvent.relatedTarget = related || null;
+ parent.dispatchEvent(showDropdownEvent);
+ if (showDropdownEvent.defaultPrevented) return;
+
+ // change menu position
+ styleDropdown(self, 1);
+
+ addClass(menu, showClass);
+ addClass(parent, showClass);
+
+ element.setAttribute(ariaExpanded, true);
+ self.open = !open;
+
+ setTimeout(() => {
+ setFocus(menu.getElementsByTagName('INPUT')[0] || element); // focus the first input item | element
+ toggleDropdownDismiss(self);
+
+ shownDropdownEvent.relatedTarget = related || null;
+ parent.dispatchEvent(shownDropdownEvent);
+ }, 1);
+ }
+
+ hide(related) {
+ const self = this;
+ const { element, menu, open } = self;
+ const parent = element.parentNode;
+ hideDropdownEvent.relatedTarget = related || null;
+ parent.dispatchEvent(hideDropdownEvent);
+ if (hideDropdownEvent.defaultPrevented) return;
+
+ removeClass(menu, showClass);
+ removeClass(parent, showClass);
+
+ // revert to original position
+ styleDropdown(self);
+
+ element.setAttribute(ariaExpanded, false);
+ self.open = !open;
+
+ setFocus(element);
+
+ // only re-attach handler if the instance is not disposed
+ setTimeout(() => toggleDropdownDismiss(self), 1);
+
+ // update relatedTarget and dispatch
+ hiddenDropdownEvent.relatedTarget = related || null;
+ parent.dispatchEvent(hiddenDropdownEvent);
+ }
+
+ dispose() {
+ const self = this;
+ const { element } = self;
+
+ if (hasClass(element.parentNode, showClass) && self.open) self.hide();
+
+ toggleDropdownHandler(self);
+
+ super.dispose(dropdownComponent);
+ }
+ }
+
+ Dropdown.init = {
+ component: dropdownComponent,
+ selector: dropdownSelector,
+ constructor: Dropdown,
+ };
+
+ const ariaHidden = 'aria-hidden';
+
+ const ariaModal = 'aria-modal';
+
+ const fixedTopClass = 'fixed-top';
+
+ const fixedBottomClass = 'fixed-bottom';
+
+ const stickyTopClass = 'sticky-top';
+
+ const fixedItems = Array.from(document.getElementsByClassName(fixedTopClass))
+ .concat(Array.from(document.getElementsByClassName(fixedBottomClass)))
+ .concat(Array.from(document.getElementsByClassName(stickyTopClass)))
+ .concat(Array.from(document.getElementsByClassName('is-fixed')));
+
+ function resetScrollbar() {
+ const bd = document.body;
+ bd.style.paddingRight = '';
+ bd.style.overflow = '';
+
+ if (fixedItems.length) {
+ fixedItems.forEach((fixed) => {
+ fixed.style.paddingRight = '';
+ fixed.style.marginRight = '';
+ });
+ }
+ }
+
+ function measureScrollbar() {
+ const windowWidth = document.documentElement.clientWidth;
+ return Math.abs(window.innerWidth - windowWidth);
+ }
+
+ function setScrollbar(scrollbarWidth, overflow) {
+ const bd = document.body;
+ const bdStyle = getComputedStyle(bd);
+ const bodyPad = parseInt(bdStyle.paddingRight, 10);
+ const isOpen = bdStyle.overflow === 'hidden';
+ const sbWidth = isOpen && bodyPad ? 0 : scrollbarWidth;
+
+ if (overflow) {
+ bd.style.overflow = 'hidden';
+ bd.style.paddingRight = `${bodyPad + sbWidth}px`;
+
+ if (fixedItems.length) {
+ fixedItems.forEach((fixed) => {
+ const isSticky = hasClass(fixed, stickyTopClass);
+ const itemPadValue = getComputedStyle(fixed).paddingRight;
+ fixed.style.paddingRight = `${parseInt(itemPadValue, 10) + sbWidth}px`;
+ if (isSticky) {
+ const itemMValue = getComputedStyle(fixed).marginRight;
+ fixed.style.marginRight = `${parseInt(itemMValue, 10) - sbWidth}px`;
+ }
+ });
+ }
+ }
+ }
+
+ const modalOpenClass = 'modal-open';
+ const modalBackdropClass = 'modal-backdrop';
+ const modalActiveSelector = `.modal.${showClass}`;
+ const offcanvasActiveSelector = `.offcanvas.${showClass}`;
+
+ const overlay = document.createElement('div');
+ overlay.setAttribute('class', `${modalBackdropClass}`);
+
+ function getCurrentOpen() {
+ return queryElement(`${modalActiveSelector},${offcanvasActiveSelector}`);
+ }
+
+ function appendOverlay(hasFade) {
+ document.body.appendChild(overlay);
+ if (hasFade) addClass(overlay, fadeClass);
+ }
+
+ function showOverlay() {
+ addClass(overlay, showClass);
+ reflow(overlay);
+ }
+
+ function hideOverlay() {
+ removeClass(overlay, showClass);
+ }
+
+ function removeOverlay() {
+ const bd = document.body;
+ const currentOpen = getCurrentOpen();
+
+ if (!currentOpen) {
+ removeClass(overlay, fadeClass);
+ removeClass(bd, modalOpenClass);
+ bd.removeChild(overlay);
+ resetScrollbar();
+ }
+ }
+
+ function isVisible(element) {
+ return getComputedStyle(element).visibility !== 'hidden'
+ && element.offsetParent !== null;
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Modal
+ -------------------------------------------- */
+
+ // MODAL PRIVATE GC
+ // ================
+ const modalString = 'modal';
+ const modalComponent = 'Modal';
+ const modalSelector = `.${modalString}`;
+ // const modalActiveSelector = `.${modalString}.${showClass}`;
+ const modalToggleSelector = `[${dataBsToggle}="${modalString}"]`;
+ const modalDismissSelector = `[${dataBsDismiss}="${modalString}"]`;
+ const modalStaticClass = `${modalString}-static`;
+ const modalDefaultOptions = {
+ backdrop: true, // boolean|string
+ keyboard: true, // boolean
+ };
+
+ // MODAL CUSTOM EVENTS
+ // ===================
+ const showModalEvent = bootstrapCustomEvent(`show.bs.${modalString}`);
+ const shownModalEvent = bootstrapCustomEvent(`shown.bs.${modalString}`);
+ const hideModalEvent = bootstrapCustomEvent(`hide.bs.${modalString}`);
+ const hiddenModalEvent = bootstrapCustomEvent(`hidden.bs.${modalString}`);
+
+ // MODAL PRIVATE METHODS
+ // =====================
+ function setModalScrollbar(self) {
+ const { element, scrollbarWidth } = self;
+ const bd = document.body;
+ const html = document.documentElement;
+ const bodyOverflow = html.clientHeight !== html.scrollHeight
+ || bd.clientHeight !== bd.scrollHeight;
+ const modalOverflow = element.clientHeight !== element.scrollHeight;
+
+ if (!modalOverflow && scrollbarWidth) {
+ element.style.paddingRight = `${scrollbarWidth}px`;
+ }
+ setScrollbar(scrollbarWidth, (modalOverflow || bodyOverflow));
+ }
+
+ function toggleModalDismiss(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ window[action]('resize', self.update, passiveHandler);
+ self.element[action]('click', modalDismissHandler);
+ document[action]('keydown', modalKeyHandler);
+ }
+
+ function toggleModalHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ const { triggers } = self;
+
+ if (triggers.length) {
+ triggers.forEach((btn) => btn[action]('click', modalClickHandler));
+ }
+ }
+
+ function afterModalHide(self) {
+ const { triggers } = self;
+ removeOverlay();
+ self.element.style.paddingRight = '';
+ self.isAnimating = false;
+
+ if (triggers.length) {
+ const visibleTrigger = triggers.find((x) => isVisible(x));
+ if (visibleTrigger) setFocus(visibleTrigger);
+ }
+ }
+
+ function afterModalShow(self) {
+ const { element, relatedTarget } = self;
+ setFocus(element);
+ self.isAnimating = false;
+
+ toggleModalDismiss(self, 1);
+
+ shownModalEvent.relatedTarget = relatedTarget;
+ element.dispatchEvent(shownModalEvent);
+ }
+
+ function beforeModalShow(self) {
+ const { element, hasFade } = self;
+ element.style.display = 'block';
+
+ setModalScrollbar(self);
+ if (!queryElement(modalActiveSelector)) {
+ document.body.style.overflow = 'hidden';
+ addClass(document.body, modalOpenClass);
+ }
+
+ addClass(element, showClass);
+ element.removeAttribute(ariaHidden);
+ element.setAttribute(ariaModal, true);
+
+ if (hasFade) emulateTransitionEnd(element, () => afterModalShow(self));
+ else afterModalShow(self);
+ }
+
+ function beforeModalHide(self, force) {
+ const {
+ element, relatedTarget, hasFade,
+ } = self;
+ const currentOpen = getCurrentOpen();
+
+ element.style.display = '';
+
+ // force can also be the transitionEvent object, we wanna make sure it's not
+ // call is not forced and overlay is visible
+ if (!force && hasFade && hasClass(overlay, showClass)
+ && !currentOpen) { // AND no modal is visible
+ hideOverlay();
+ emulateTransitionEnd(overlay, () => afterModalHide(self));
+ } else {
+ afterModalHide(self);
+ }
+
+ toggleModalDismiss(self);
+
+ hiddenModalEvent.relatedTarget = relatedTarget;
+ element.dispatchEvent(hiddenModalEvent);
+ }
+
+ // MODAL EVENT HANDLERS
+ // ====================
+ function modalClickHandler(e) {
+ const { target } = e;
+ const trigger = target.closest(modalToggleSelector);
+ const element = getTargetElement(trigger);
+ const self = element && element[modalComponent];
+
+ if (trigger.tagName === 'A') e.preventDefault();
+
+ if (self.isAnimating) return;
+
+ self.relatedTarget = trigger;
+
+ self.toggle();
+ }
+
+ function modalKeyHandler({ which }) {
+ const element = queryElement(modalActiveSelector);
+ const self = element[modalComponent];
+ const { options, isAnimating } = self;
+ if (!isAnimating // modal has no animations running
+ && options.keyboard && which === 27 // the keyboard option is enabled and the key is 27
+ && hasClass(element, showClass)) { // the modal is not visible
+ self.relatedTarget = null;
+ self.hide();
+ }
+ }
+
+ function modalDismissHandler(e) {
+ const element = this;
+ const self = element[modalComponent];
+
+ if (self.isAnimating) return;
+
+ const { isStatic, modalDialog } = self;
+ const { target } = e;
+ const selectedText = document.getSelection().toString().length;
+ const targetInsideDialog = modalDialog.contains(target);
+ const dismiss = target.closest(modalDismissSelector);
+
+ if (isStatic && !targetInsideDialog) {
+ addClass(element, modalStaticClass);
+ self.isAnimating = true;
+ emulateTransitionEnd(modalDialog, () => staticTransitionEnd(self));
+ } else if (dismiss || (!selectedText && !isStatic && !targetInsideDialog)) {
+ self.relatedTarget = dismiss || null;
+ self.hide();
+ e.preventDefault();
+ }
+ }
+
+ function staticTransitionEnd(self) {
+ const duration = getElementTransitionDuration(self.modalDialog) + 17;
+ removeClass(self.element, modalStaticClass);
+ // user must wait for zoom out transition
+ setTimeout(() => { self.isAnimating = false; }, duration);
+ }
+
+ // MODAL DEFINITION
+ // ================
+ class Modal extends BaseComponent {
+ constructor(target, config) {
+ super(modalComponent, target, modalDefaultOptions, config);
+
+ // bind
+ const self = this;
+
+ // the modal
+ const { element } = self;
+
+ // the modal-dialog
+ self.modalDialog = queryElement(`.${modalString}-dialog`, element);
+
+ // modal can have multiple triggering elements
+ self.triggers = Array.from(document.querySelectorAll(modalToggleSelector))
+ .filter((btn) => getTargetElement(btn) === element);
+
+ // additional internals
+ self.isStatic = self.options.backdrop === 'static';
+ self.hasFade = hasClass(element, fadeClass);
+ self.isAnimating = false;
+ self.scrollbarWidth = measureScrollbar();
+ self.relatedTarget = null;
+
+ // attach event listeners
+ toggleModalHandler(self, 1);
+
+ // bind
+ self.update = self.update.bind(self);
+ }
+
+ // MODAL PUBLIC METHODS
+ // ====================
+ toggle() {
+ const self = this;
+ if (hasClass(self.element, showClass)) self.hide();
+ else self.show();
+ }
+
+ show() {
+ const self = this;
+ const {
+ element, isAnimating, hasFade, relatedTarget,
+ } = self;
+ let overlayDelay = 0;
+
+ if (hasClass(element, showClass) && !isAnimating) return;
+
+ showModalEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(showModalEvent);
+ if (showModalEvent.defaultPrevented) return;
+
+ self.isAnimating = true;
+
+ // we elegantly hide any opened modal/offcanvas
+ const currentOpen = getCurrentOpen();
+ if (currentOpen && currentOpen !== element) {
+ const that = currentOpen[modalComponent]
+ ? currentOpen[modalComponent]
+ : currentOpen.Offcanvas;
+ that.hide();
+ }
+
+ if (!queryElement(`.${modalBackdropClass}`)) {
+ appendOverlay(hasFade);
+ }
+ overlayDelay = getElementTransitionDuration(overlay);
+
+ if (!hasClass(overlay, showClass)) {
+ showOverlay();
+ }
+
+ if (!currentOpen) {
+ setTimeout(() => beforeModalShow(self), overlayDelay);
+ } else beforeModalShow(self);
+ }
+
+ hide(force) {
+ const self = this;
+ const {
+ element, isAnimating, hasFade, relatedTarget,
+ } = self;
+ if (!hasClass(element, showClass) && !isAnimating) return;
+
+ hideModalEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(hideModalEvent);
+ if (hideModalEvent.defaultPrevented) return;
+
+ self.isAnimating = true;
+ removeClass(element, showClass);
+ element.setAttribute(ariaHidden, true);
+ element.removeAttribute(ariaModal);
+
+ if (hasFade && force !== 1) {
+ emulateTransitionEnd(element, () => beforeModalHide(self));
+ } else {
+ beforeModalHide(self, force);
+ }
+ }
+
+ update() {
+ const self = this;
+
+ if (hasClass(self.element, showClass)) setModalScrollbar(self);
+ }
+
+ dispose() {
+ const self = this;
+ self.hide(1); // forced call
+
+ toggleModalHandler(self);
+
+ super.dispose(modalComponent);
+ }
+ }
+
+ Modal.init = {
+ component: modalComponent,
+ selector: modalSelector,
+ constructor: Modal,
+ };
+
+ /* Native JavaScript for Bootstrap 5 | OffCanvas
+ ------------------------------------------------ */
+
+ // OFFCANVAS PRIVATE GC
+ // ====================
+ const offcanvasString = 'offcanvas';
+ const offcanvasComponent = 'Offcanvas';
+ const OffcanvasSelector = `.${offcanvasString}`;
+ const offcanvasToggleSelector = `[${dataBsToggle}="${offcanvasString}"]`;
+ const offcanvasDismissSelector = `[${dataBsDismiss}="${offcanvasString}"]`;
+ const offcanvasTogglingClass = `${offcanvasString}-toggling`;
+ const offcanvasDefaultOptions = {
+ backdrop: true, // boolean
+ keyboard: true, // boolean
+ scroll: false, // boolean
+ };
+
+ // OFFCANVAS CUSTOM EVENTS
+ // =======================
+ const showOffcanvasEvent = bootstrapCustomEvent(`show.bs.${offcanvasString}`);
+ const shownOffcanvasEvent = bootstrapCustomEvent(`shown.bs.${offcanvasString}`);
+ const hideOffcanvasEvent = bootstrapCustomEvent(`hide.bs.${offcanvasString}`);
+ const hiddenOffcanvasEvent = bootstrapCustomEvent(`hidden.bs.${offcanvasString}`);
+
+ // OFFCANVAS PRIVATE METHODS
+ // =========================
+ function setOffCanvasScrollbar(self) {
+ const bd = document.body;
+ const html = document.documentElement;
+ const bodyOverflow = html.clientHeight !== html.scrollHeight
+ || bd.clientHeight !== bd.scrollHeight;
+ setScrollbar(self.scrollbarWidth, bodyOverflow);
+ }
+
+ function toggleOffcanvasEvents(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ self.triggers.forEach((btn) => btn[action]('click', offcanvasTriggerHandler));
+ }
+
+ function toggleOffCanvasDismiss(add) {
+ const action = add ? addEventListener : removeEventListener;
+ document[action]('keydown', offcanvasKeyDismissHandler);
+ document[action]('click', offcanvasDismissHandler);
+ }
+
+ function beforeOffcanvasShow(self) {
+ const { element, options } = self;
+
+ if (!options.scroll) {
+ addClass(document.body, modalOpenClass);
+ document.body.style.overflow = 'hidden';
+ setOffCanvasScrollbar(self);
+ }
+
+ addClass(element, offcanvasTogglingClass);
+ addClass(element, showClass);
+ element.style.visibility = 'visible';
+
+ emulateTransitionEnd(element, () => showOffcanvasComplete(self));
+ }
+
+ function beforeOffcanvasHide(self) {
+ const { element, options } = self;
+ const currentOpen = getCurrentOpen();
+
+ element.blur();
+
+ if (!currentOpen && options.backdrop && hasClass(overlay, showClass)) {
+ hideOverlay();
+ emulateTransitionEnd(overlay, () => hideOffcanvasComplete(self));
+ } else hideOffcanvasComplete(self);
+ }
+
+ // OFFCANVAS EVENT HANDLERS
+ // ========================
+ function offcanvasTriggerHandler(e) {
+ const trigger = this.closest(offcanvasToggleSelector);
+ const element = getTargetElement(trigger);
+ const self = element && element[offcanvasComponent];
+
+ if (trigger.tagName === 'A') e.preventDefault();
+ if (self) {
+ self.relatedTarget = trigger;
+ self.toggle();
+ }
+ }
+
+ function offcanvasDismissHandler(e) {
+ const element = queryElement(offcanvasActiveSelector);
+ if (!element) return;
+
+ const offCanvasDismiss = queryElement(offcanvasDismissSelector, element);
+ const self = element[offcanvasComponent];
+ if (!self) return;
+
+ const { options, open, triggers } = self;
+ const { target } = e;
+ const trigger = target.closest(offcanvasToggleSelector);
+
+ if (trigger && trigger.tagName === 'A') e.preventDefault();
+
+ if (open && ((!element.contains(target) && options.backdrop
+ && (!trigger || (trigger && !triggers.includes(trigger))))
+ || offCanvasDismiss.contains(target))) {
+ self.relatedTarget = target === offCanvasDismiss ? offCanvasDismiss : null;
+ self.hide();
+ }
+ }
+
+ function offcanvasKeyDismissHandler({ which }) {
+ const element = queryElement(offcanvasActiveSelector);
+ if (!element) return;
+
+ const self = element[offcanvasComponent];
+
+ if (self && self.options.keyboard && which === 27) {
+ self.relatedTarget = null;
+ self.hide();
+ }
+ }
+
+ function showOffcanvasComplete(self) {
+ const { element, triggers, relatedTarget } = self;
+ removeClass(element, offcanvasTogglingClass);
+
+ element.removeAttribute(ariaHidden);
+ element.setAttribute(ariaModal, true);
+ element.setAttribute('role', 'dialog');
+ self.isAnimating = false;
+
+ if (triggers.length) {
+ triggers.forEach((btn) => btn.setAttribute(ariaExpanded, true));
+ }
+
+ shownOffcanvasEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(shownOffcanvasEvent);
+
+ toggleOffCanvasDismiss(1);
+ setFocus(element);
+ }
+
+ function hideOffcanvasComplete(self) {
+ const {
+ element, options, relatedTarget, triggers,
+ } = self;
+ const currentOpen = getCurrentOpen();
+
+ element.setAttribute(ariaHidden, true);
+ element.removeAttribute(ariaModal);
+ element.removeAttribute('role');
+ element.style.visibility = '';
+ self.open = false;
+ self.isAnimating = false;
+
+ if (triggers.length) {
+ triggers.forEach((btn) => btn.setAttribute(ariaExpanded, false));
+ const visibleTrigger = triggers.find((x) => isVisible(x));
+ if (visibleTrigger) setFocus(visibleTrigger);
+ }
+
+ // handle new offcanvas showing up
+ if (!currentOpen) {
+ if (options.backdrop) removeOverlay();
+ if (!options.scroll) {
+ resetScrollbar();
+ removeClass(document.body, modalOpenClass);
+ }
+ }
+
+ hiddenOffcanvasEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(hiddenOffcanvasEvent);
+ removeClass(element, offcanvasTogglingClass);
+
+ toggleOffCanvasDismiss();
+ }
+
+ // OFFCANVAS DEFINITION
+ // ====================
+ class Offcanvas extends BaseComponent {
+ constructor(target, config) {
+ super(offcanvasComponent, target, offcanvasDefaultOptions, config);
+ const self = this;
+
+ // instance element
+ const { element } = self;
+
+ // all the triggering buttons
+ self.triggers = Array.from(document.querySelectorAll(offcanvasToggleSelector))
+ .filter((btn) => getTargetElement(btn) === element);
+
+ // additional instance property
+ self.open = false;
+ self.isAnimating = false;
+ self.scrollbarWidth = measureScrollbar();
+
+ // attach event listeners
+ toggleOffcanvasEvents(self, 1);
+ }
+
+ // OFFCANVAS PUBLIC METHODS
+ // ========================
+ toggle() {
+ const self = this;
+ return self.open ? self.hide() : self.show();
+ }
+
+ show() {
+ const self = this[offcanvasComponent] ? this[offcanvasComponent] : this;
+ const {
+ element, options, isAnimating, relatedTarget,
+ } = self;
+ let overlayDelay = 0;
+
+ if (self.open || isAnimating) return;
+
+ showOffcanvasEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(showOffcanvasEvent);
+
+ if (showOffcanvasEvent.defaultPrevented) return;
+
+ // we elegantly hide any opened modal/offcanvas
+ const currentOpen = getCurrentOpen();
+ if (currentOpen && currentOpen !== element) {
+ const that = currentOpen[offcanvasComponent]
+ ? currentOpen[offcanvasComponent]
+ : currentOpen.Modal;
+ that.hide();
+ }
+
+ self.open = true;
+ self.isAnimating = true;
+
+ if (options.backdrop) {
+ if (!queryElement(`.${modalBackdropClass}`)) {
+ appendOverlay(1);
+ }
+
+ overlayDelay = getElementTransitionDuration(overlay);
+
+ if (!hasClass(overlay, showClass)) showOverlay();
+
+ setTimeout(() => beforeOffcanvasShow(self), overlayDelay);
+ } else beforeOffcanvasShow(self);
+ }
+
+ hide(force) {
+ const self = this;
+ const { element, isAnimating, relatedTarget } = self;
+
+ if (!self.open || isAnimating) return;
+
+ hideOffcanvasEvent.relatedTarget = relatedTarget || null;
+ element.dispatchEvent(hideOffcanvasEvent);
+ if (hideOffcanvasEvent.defaultPrevented) return;
+
+ self.isAnimating = true;
+ addClass(element, offcanvasTogglingClass);
+ removeClass(element, showClass);
+
+ if (!force) {
+ emulateTransitionEnd(element, () => beforeOffcanvasHide(self));
+ } else beforeOffcanvasHide(self);
+ }
+
+ dispose() {
+ const self = this;
+ self.hide(1);
+ toggleOffcanvasEvents(self);
+ super.dispose(offcanvasComponent);
+ }
+ }
+
+ Offcanvas.init = {
+ component: offcanvasComponent,
+ selector: OffcanvasSelector,
+ constructor: Offcanvas,
+ };
+
+ const ariaDescribedBy = 'aria-describedby';
+
+ var tipClassPositions = {
+ top: 'top', bottom: 'bottom', left: 'start', right: 'end',
+ };
+
+ function isVisibleTip(tip, container) {
+ return container.contains(tip);
+ }
+
+ function isMedia(element) {
+ return [SVGElement, HTMLImageElement, HTMLVideoElement]
+ .some((mediaType) => element instanceof mediaType);
+ }
+
+ function closestRelative(element) {
+ let retval = null;
+ let el = element;
+ while (el !== document.body) {
+ el = el.parentElement;
+ if (getComputedStyle(el).position === 'relative') {
+ retval = el;
+ break;
+ }
+ }
+ return retval;
+ }
+
+ // both popovers and tooltips (this, event)
+ function styleTip(self, e) {
+ const tipClasses = /\b(top|bottom|start|end)+/;
+ const tip = self.tooltip || self.popover;
+ // reset tip style
+ tip.style.top = '';
+ tip.style.left = '';
+ tip.style.right = '';
+ // continue with metrics
+ const isPopover = !!self.popover;
+ let tipDimensions = { w: tip.offsetWidth, h: tip.offsetHeight };
+ const windowWidth = (document.documentElement.clientWidth || document.body.clientWidth);
+ const windowHeight = (document.documentElement.clientHeight || document.body.clientHeight);
+ const { element, options, arrow } = self;
+ let { container, placement } = options;
+ let parentIsBody = container === document.body;
+ const targetPosition = getComputedStyle(element).position;
+ const parentPosition = getComputedStyle(container).position;
+ const staticParent = !parentIsBody && parentPosition === 'static';
+ let relativeParent = !parentIsBody && parentPosition === 'relative';
+ const relContainer = staticParent && closestRelative(container);
+ // static containers should refer to another relative container or the body
+ container = relContainer || container;
+ relativeParent = staticParent && relContainer ? 1 : relativeParent;
+ parentIsBody = container === document.body;
+ const parentRect = container.getBoundingClientRect();
+ const leftBoundry = relativeParent ? parentRect.left : 0;
+ const rightBoundry = relativeParent ? parentRect.right : windowWidth;
+ // this case should not be possible
+ // absoluteParent = !parentIsBody && parentPosition === 'absolute',
+ // this case requires a container with placement: relative
+ const absoluteTarget = targetPosition === 'absolute';
+ const targetRect = element.getBoundingClientRect();
+ const scroll = parentIsBody
+ ? { x: window.pageXOffset, y: window.pageYOffset }
+ : { x: container.scrollLeft, y: container.scrollTop };
+ const elemDimensions = { w: element.offsetWidth, h: element.offsetHeight };
+ const top = relativeParent ? element.offsetTop : targetRect.top;
+ const left = relativeParent ? element.offsetLeft : targetRect.left;
+ // reset arrow style
+ arrow.style.top = '';
+ arrow.style.left = '';
+ arrow.style.right = '';
+ let topPosition;
+ let leftPosition;
+ let rightPosition;
+ let arrowTop;
+ let arrowLeft;
+ let arrowRight;
+
+ // check placement
+ let topExceed = targetRect.top - tipDimensions.h < 0;
+ let bottomExceed = targetRect.top + tipDimensions.h + elemDimensions.h >= windowHeight;
+ let leftExceed = targetRect.left - tipDimensions.w < leftBoundry;
+ let rightExceed = targetRect.left + tipDimensions.w + elemDimensions.w >= rightBoundry;
+
+ topExceed = ['left', 'right'].includes(placement)
+ ? targetRect.top + elemDimensions.h / 2 - tipDimensions.h / 2 < 0
+ : topExceed;
+ bottomExceed = ['left', 'right'].includes(placement)
+ ? targetRect.top + tipDimensions.h / 2 + elemDimensions.h / 2 >= windowHeight
+ : bottomExceed;
+ leftExceed = ['top', 'bottom'].includes(placement)
+ ? targetRect.left + elemDimensions.w / 2 - tipDimensions.w / 2 < leftBoundry
+ : leftExceed;
+ rightExceed = ['top', 'bottom'].includes(placement)
+ ? targetRect.left + tipDimensions.w / 2 + elemDimensions.w / 2 >= rightBoundry
+ : rightExceed;
+
+ // recompute placement
+ // first, when both left and right limits are exceeded, we fall back to top|bottom
+ placement = (['left', 'right'].includes(placement)) && leftExceed && rightExceed ? 'top' : placement;
+ placement = placement === 'top' && topExceed ? 'bottom' : placement;
+ placement = placement === 'bottom' && bottomExceed ? 'top' : placement;
+ placement = placement === 'left' && leftExceed ? 'right' : placement;
+ placement = placement === 'right' && rightExceed ? 'left' : placement;
+
+ // update tooltip/popover class
+ if (!tip.className.includes(placement)) {
+ tip.className = tip.className.replace(tipClasses, tipClassPositions[placement]);
+ }
+ // if position has changed, update tip dimensions
+ tipDimensions = { w: tip.offsetWidth, h: tip.offsetHeight };
+
+ // we check the computed width & height and update here
+ const arrowWidth = arrow.offsetWidth || 0;
+ const arrowHeight = arrow.offsetHeight || 0;
+ const arrowAdjust = arrowWidth / 2;
+
+ // compute tooltip / popover coordinates
+ if (['left', 'right'].includes(placement)) { // secondary|side positions
+ if (placement === 'left') { // LEFT
+ leftPosition = left + scroll.x - tipDimensions.w - (isPopover ? arrowWidth : 0);
+ } else { // RIGHT
+ leftPosition = left + scroll.x + elemDimensions.w + (isPopover ? arrowWidth : 0);
+ }
+
+ // adjust top and arrow
+ if (topExceed) {
+ topPosition = top + scroll.y;
+ arrowTop = elemDimensions.h / 2 - arrowWidth;
+ } else if (bottomExceed) {
+ topPosition = top + scroll.y - tipDimensions.h + elemDimensions.h;
+ arrowTop = tipDimensions.h - elemDimensions.h / 2 - arrowWidth;
+ } else {
+ topPosition = top + scroll.y - tipDimensions.h / 2 + elemDimensions.h / 2;
+ arrowTop = tipDimensions.h / 2 - arrowHeight / 2;
+ }
+ } else if (['top', 'bottom'].includes(placement)) {
+ if (e && isMedia(element)) {
+ const eX = !relativeParent ? e.pageX : e.layerX + (absoluteTarget ? element.offsetLeft : 0);
+ const eY = !relativeParent ? e.pageY : e.layerY + (absoluteTarget ? element.offsetTop : 0);
+
+ if (placement === 'top') {
+ topPosition = eY - tipDimensions.h - (isPopover ? arrowWidth : arrowHeight);
+ } else {
+ topPosition = eY + arrowHeight;
+ }
+
+ // adjust left | right and also the arrow
+ if (e.clientX - tipDimensions.w / 2 < leftBoundry) { // when exceeds left
+ leftPosition = 0;
+ arrowLeft = eX - arrowAdjust;
+ } else if (e.clientX + tipDimensions.w * 0.51 >= rightBoundry) { // when exceeds right
+ leftPosition = 'auto';
+ rightPosition = 0;
+ arrowLeft = tipDimensions.w - (rightBoundry - eX) - arrowAdjust;
+ } else { // normal top/bottom
+ leftPosition = eX - tipDimensions.w / 2;
+ arrowLeft = tipDimensions.w / 2 - arrowAdjust;
+ }
+ } else {
+ if (placement === 'top') {
+ topPosition = top + scroll.y - tipDimensions.h - (isPopover ? arrowHeight : 0);
+ } else { // BOTTOM
+ topPosition = top + scroll.y + elemDimensions.h + (isPopover ? arrowHeight : 0);
+ }
+
+ // adjust left | right and also the arrow
+ if (leftExceed) {
+ leftPosition = 0;
+ arrowLeft = left + elemDimensions.w / 2 - arrowAdjust;
+ } else if (rightExceed) {
+ leftPosition = 'auto';
+ rightPosition = 0;
+ arrowRight = elemDimensions.w / 2 + (parentRect.right - targetRect.right) - arrowAdjust;
+ } else {
+ leftPosition = left + scroll.x - tipDimensions.w / 2 + elemDimensions.w / 2;
+ arrowLeft = tipDimensions.w / 2 - arrowAdjust;
+ }
+ }
+ }
+
+ // apply style to tooltip/popover and its arrow
+ tip.style.top = `${topPosition}px`;
+ tip.style.left = leftPosition === 'auto' ? leftPosition : `${leftPosition}px`;
+ tip.style.right = rightPosition !== undefined ? `${rightPosition}px` : '';
+ // update arrow placement or clear side
+ if (arrowTop !== undefined) {
+ arrow.style.top = `${arrowTop}px`;
+ }
+
+ if (arrowLeft !== undefined) {
+ arrow.style.left = `${arrowLeft}px`;
+ } else if (arrowRight !== undefined) {
+ arrow.style.right = `${arrowRight}px`;
+ }
+ }
+
+ let bsnUID = 1;
+
+ // popover, tooltip, scrollspy need a unique id
+ function getUID(element, key) {
+ bsnUID += 1;
+ return element[key] || bsnUID;
+ }
+
+ function getTipContainer(element) {
+ // maybe the element is inside a modal
+ const modal = element.closest('.modal');
+
+ // OR maybe the element is inside a fixed navbar
+ const navbarFixed = element.closest(`.${fixedTopClass},.${fixedBottomClass}`);
+
+ // set default container option appropriate for the context
+ return modal || navbarFixed || document.body;
+ }
+
+ /* Native JavaScript for Bootstrap 5 | Popover
+ ---------------------------------------------- */
+
+ // POPOVER PRIVATE GC
+ // ==================
+ const popoverString = 'popover';
+ const popoverComponent = 'Popover';
+ const popoverSelector = `[${dataBsToggle}="${popoverString}"],[data-tip="${popoverString}"]`;
+ const popoverDefaultOptions = {
+ template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>', // string
+ title: null, // string
+ content: null, // string
+ sanitizeFn: null, // function
+ customClass: null, // string
+ dismissible: false, // boolean
+ animation: true, // boolean
+ trigger: 'hover', // string
+ placement: 'top', // string
+ delay: 200, // number
+ };
+
+ // POPOVER PRIVATE GC
+ // ==================
+ const appleBrands = /(iPhone|iPod|iPad)/;
+ const isIphone = navigator.userAgentData
+ ? navigator.userAgentData.brands.some((x) => appleBrands.test(x.brand))
+ : appleBrands.test(navigator.userAgent);
+ // popoverArrowClass = `${popoverString}-arrow`,
+ const popoverHeaderClass = `${popoverString}-header`;
+ const popoverBodyClass = `${popoverString}-body`;
+ // close btn for dissmissible popover
+ let popoverCloseButton = '<button type="button" class="btn-close"></button>';
+
+ // POPOVER CUSTOM EVENTS
+ // =====================
+ const showPopoverEvent = bootstrapCustomEvent(`show.bs.${popoverString}`);
+ const shownPopoverEvent = bootstrapCustomEvent(`shown.bs.${popoverString}`);
+ const hidePopoverEvent = bootstrapCustomEvent(`hide.bs.${popoverString}`);
+ const hiddenPopoverEvent = bootstrapCustomEvent(`hidden.bs.${popoverString}`);
+
+ // POPOVER EVENT HANDLERS
+ // ======================
+ function popoverForceFocus() {
+ setFocus(this);
+ }
+
+ function popoverTouchHandler({ target }) {
+ const self = this;
+ const { popover, element } = self;
+
+ if ((popover && popover.contains(target)) // popover includes touch target
+ || target === element // OR touch target is element
+ || element.contains(target)) ; else {
+ self.hide();
+ }
+ }
+
+ // POPOVER PRIVATE METHODS
+ // =======================
+ function createPopover(self) {
+ const { id, options } = self;
+ const {
+ animation, customClass, sanitizeFn, placement, dismissible,
+ } = options;
+ let { title, content, template } = options;
+
+ // set initial popover class
+ const placementClass = `bs-${popoverString}-${tipClassPositions[placement]}`;
+
+ // fixing #233
+ title = title ? title.trim() : null;
+ content = content ? content.trim() : null;
+
+ // sanitize title && content
+ if (sanitizeFn) {
+ title = title ? sanitizeFn(title) : null;
+ content = content ? sanitizeFn(content) : null;
+ template = template ? sanitizeFn(template) : null;
+ popoverCloseButton = sanitizeFn(popoverCloseButton);
+ }
+
+ self.popover = document.createElement('div');
+ const { popover } = self;
+
+ // set id and aria-describedby
+ popover.setAttribute('id', id);
+ popover.setAttribute('role', 'tooltip');
+
+ // load template
+ const popoverTemplate = document.createElement('div');
+ popoverTemplate.innerHTML = template.trim();
+ popover.className = popoverTemplate.firstChild.className;
+ popover.innerHTML = popoverTemplate.firstChild.innerHTML;
+
+ const popoverHeader = queryElement(`.${popoverHeaderClass}`, popover);
+ const popoverBody = queryElement(`.${popoverBodyClass}`, popover);
+
+ // set arrow
+ self.arrow = queryElement(`.${popoverString}-arrow`, popover);
+
+ // set dismissible button
+ if (dismissible) {
+ title = title ? title + popoverCloseButton : title;
+ content = title === null ? +popoverCloseButton : content;
+ }
+
+ // fill the template with content from data attributes
+ if (title && popoverHeader) popoverHeader.innerHTML = title.trim();
+ if (content && popoverBody) popoverBody.innerHTML = content.trim();
+
+ // set popover animation and placement
+ if (!hasClass(popover, popoverString)) addClass(popover, popoverString);
+ if (animation && !hasClass(popover, fadeClass)) addClass(popover, fadeClass);
+ if (customClass && !hasClass(popover, customClass)) {
+ addClass(popover, customClass);
+ }
+ if (!hasClass(popover, placementClass)) addClass(popover, placementClass);
+ }
+
+ function removePopover(self) {
+ const { element, popover, options } = self;
+ element.removeAttribute(ariaDescribedBy);
+ options.container.removeChild(popover);
+ self.timer = null;
+ }
+
+ function togglePopoverHandlers(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ const { element, options } = self;
+ const { trigger, dismissible } = options;
+ self.enabled = !!add;
+
+ if (trigger === 'hover') {
+ element[action]('mousedown', self.show);
+ element[action]('mouseenter', self.show);
+ if (isMedia(element)) element[action]('mousemove', self.update, passiveHandler);
+ if (!dismissible) element[action]('mouseleave', self.hide);
+ } else if (trigger === 'click') {
+ element[action](trigger, self.toggle);
+ } else if (trigger === 'focus') {
+ if (isIphone) element[action]('click', popoverForceFocus);
+ element[action]('focusin', self.show);
+ }
+ }
+
+ function dismissHandlerToggle(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ const { options, element, popover } = self;
+ const { trigger, dismissible } = options;
+
+ if (dismissible) {
+ const [btnClose] = popover.getElementsByClassName('btn-close');
+ if (btnClose) btnClose[action]('click', self.hide);
+ } else {
+ if (trigger === 'focus') element[action]('focusout', self.hide);
+ if (trigger === 'hover') document[action]('touchstart', popoverTouchHandler, passiveHandler);
+ }
+
+ if (!isMedia(element)) {
+ window[action]('scroll', self.update, passiveHandler);
+ window[action]('resize', self.update, passiveHandler);
+ }
+ }
+
+ function popoverShowTrigger(self) {
+ dismissHandlerToggle(self, 1);
+ self.element.dispatchEvent(shownPopoverEvent);
+ }
+
+ function popoverHideTrigger(self) {
+ dismissHandlerToggle(self);
+ removePopover(self);
+ self.element.dispatchEvent(hiddenPopoverEvent);
+ }
+
+ // POPOVER DEFINITION
+ // ==================
+ class Popover extends BaseComponent {
+ constructor(target, config) {
+ popoverDefaultOptions.container = getTipContainer(queryElement(target));
+ super(popoverComponent, target, popoverDefaultOptions, config);
+
+ // bind
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+ // additional instance properties
+ self.timer = null;
+ self.popover = null;
+ self.arrow = null;
+ self.enabled = false;
+ // set unique ID for aria-describedby
+ self.id = `${popoverString}-${getUID(element)}`;
+
+ // set instance options
+ const { options } = self;
+
+ // media elements only work with body as a container
+ self.options.container = isMedia(element)
+ ? popoverDefaultOptions.container
+ : queryElement(options.container);
+
+ // reset default container
+ popoverDefaultOptions.container = null;
+
+ // invalidate when no content is set
+ if (!options.content) return;
+
+ // crate popover
+ createPopover(self);
+
+ // bind
+ self.update = self.update.bind(self);
+
+ // attach event listeners
+ togglePopoverHandlers(self, 1);
+ }
+
+ update(e) {
+ styleTip(this, e);
+ }
+
+ // POPOVER PUBLIC METHODS
+ // ======================
+ toggle(e) {
+ const self = e ? this[popoverComponent] : this;
+ const { popover, options } = self;
+ if (!isVisibleTip(popover, options.container)) self.show();
+ else self.hide();
+ }
+
+ show(e) {
+ const self = e ? this[popoverComponent] : this;
+ const {
+ element, popover, options, id,
+ } = self;
+ const { container } = options;
+
+ clearTimeout(self.timer);
+
+ self.timer = setTimeout(() => {
+ if (!isVisibleTip(popover, container)) {
+ element.dispatchEvent(showPopoverEvent);
+ if (showPopoverEvent.defaultPrevented) return;
+
+ // append to the container
+ container.appendChild(popover);
+ element.setAttribute(ariaDescribedBy, id);
+
+ self.update(e);
+ if (!hasClass(popover, showClass)) addClass(popover, showClass);
+
+ if (options.animation) emulateTransitionEnd(popover, () => popoverShowTrigger(self));
+ else popoverShowTrigger(self);
+ }
+ }, 17);
+ }
+
+ hide(e) {
+ let self;
+ if (e && this[popoverComponent]) {
+ self = this[popoverComponent];
+ } else if (e) { // dismissible popover
+ const dPopover = this.closest(`.${popoverString}`);
+ const dEl = dPopover && queryElement(`[${ariaDescribedBy}="${dPopover.id}"]`);
+ self = dEl[popoverComponent];
+ } else {
+ self = this;
+ }
+ const { element, popover, options } = self;
+
+ clearTimeout(self.timer);
+
+ self.timer = setTimeout(() => {
+ if (isVisibleTip(popover, options.container)) {
+ element.dispatchEvent(hidePopoverEvent);
+ if (hidePopoverEvent.defaultPrevented) return;
+
+ removeClass(popover, showClass);
+
+ if (options.animation) emulateTransitionEnd(popover, () => popoverHideTrigger(self));
+ else popoverHideTrigger(self);
+ }
+ }, options.delay + 17);
+ }
+
+ enable() {
+ const self = this;
+ const { enabled } = self;
+ if (!enabled) {
+ togglePopoverHandlers(self, 1);
+ self.enabled = !enabled;
+ }
+ }
+
+ disable() {
+ const self = this;
+ const { enabled, popover, options } = self;
+ if (enabled) {
+ if (isVisibleTip(popover, options.container) && options.animation) {
+ self.hide();
+
+ setTimeout(
+ () => togglePopoverHandlers(self),
+ getElementTransitionDuration(popover) + options.delay + 17,
+ );
+ } else {
+ togglePopoverHandlers(self);
+ }
+ self.enabled = !enabled;
+ }
+ }
+
+ toggleEnabled() {
+ const self = this;
+ if (!self.enabled) self.enable();
+ else self.disable();
+ }
+
+ dispose() {
+ const self = this;
+ const { popover, options } = self;
+ const { container, animation } = options;
+ if (animation && isVisibleTip(popover, container)) {
+ options.delay = 0; // reset delay
+ self.hide();
+ emulateTransitionEnd(popover, () => togglePopoverHandlers(self));
+ } else {
+ togglePopoverHandlers(self);
+ }
+ super.dispose(popoverComponent);
+ }
+ }
+
+ Popover.init = {
+ component: popoverComponent,
+ selector: popoverSelector,
+ constructor: Popover,
+ };
+
+ /* Native JavaScript for Bootstrap 5 | ScrollSpy
+ ------------------------------------------------ */
+
+ // SCROLLSPY PRIVATE GC
+ // ====================
+ const scrollspyString = 'scrollspy';
+ const scrollspyComponent = 'ScrollSpy';
+ const scrollspySelector = '[data-bs-spy="scroll"]';
+ const scrollSpyDefaultOptions = {
+ offset: 10,
+ target: null,
+ };
+
+ // SCROLLSPY CUSTOM EVENT
+ // ======================
+ const activateScrollSpy = bootstrapCustomEvent(`activate.bs.${scrollspyString}`);
+
+ // SCROLLSPY PRIVATE METHODS
+ // =========================
+ function updateSpyTargets(self) {
+ const {
+ target, scrollTarget, isWindow, options, itemsLength, scrollHeight,
+ } = self;
+ const { offset } = options;
+ const links = target.getElementsByTagName('A');
+
+ self.scrollTop = isWindow
+ ? scrollTarget.pageYOffset
+ : scrollTarget.scrollTop;
+
+ // only update items/offsets once or with each mutation
+ if (itemsLength !== links.length || getScrollHeight(scrollTarget) !== scrollHeight) {
+ let href;
+ let targetItem;
+ let rect;
+
+ // reset arrays & update
+ self.items = [];
+ self.offsets = [];
+ self.scrollHeight = getScrollHeight(scrollTarget);
+ self.maxScroll = self.scrollHeight - getOffsetHeight(self);
+
+ Array.from(links).forEach((link) => {
+ href = link.getAttribute('href');
+ targetItem = href && href.charAt(0) === '#' && href.slice(-1) !== '#' && queryElement(href);
+
+ if (targetItem) {
+ self.items.push(link);
+ rect = targetItem.getBoundingClientRect();
+ self.offsets.push((isWindow ? rect.top + self.scrollTop : targetItem.offsetTop) - offset);
+ }
+ });
+ self.itemsLength = self.items.length;
+ }
+ }
+
+ function getScrollHeight(scrollTarget) {
+ return scrollTarget.scrollHeight || Math.max(
+ document.body.scrollHeight,
+ document.documentElement.scrollHeight,
+ );
+ }
+
+ function getOffsetHeight({ element, isWindow }) {
+ if (!isWindow) return element.getBoundingClientRect().height;
+ return window.innerHeight;
+ }
+
+ function clear(target) {
+ Array.from(target.getElementsByTagName('A')).forEach((item) => {
+ if (hasClass(item, activeClass)) removeClass(item, activeClass);
+ });
+ }
+
+ function activate(self, item) {
+ const { target, element } = self;
+ clear(target);
+ self.activeItem = item;
+ addClass(item, activeClass);
+
+ // activate all parents
+ const parents = [];
+ let parentItem = item;
+ while (parentItem !== document.body) {
+ parentItem = parentItem.parentNode;
+ if (hasClass(parentItem, 'nav') || hasClass(parentItem, 'dropdown-menu')) parents.push(parentItem);
+ }
+
+ parents.forEach((menuItem) => {
+ const parentLink = menuItem.previousElementSibling;
+
+ if (parentLink && !hasClass(parentLink, activeClass)) {
+ addClass(parentLink, activeClass);
+ }
+ });
+
+ // update relatedTarget and dispatch
+ activateScrollSpy.relatedTarget = item;
+ element.dispatchEvent(activateScrollSpy);
+ }
+
+ function toggleSpyHandlers(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ self.scrollTarget[action]('scroll', self.refresh, passiveHandler);
+ }
+
+ // SCROLLSPY DEFINITION
+ // ====================
+ class ScrollSpy extends BaseComponent {
+ constructor(target, config) {
+ super(scrollspyComponent, target, scrollSpyDefaultOptions, config);
+ // bind
+ const self = this;
+
+ // initialization element & options
+ const { element, options } = self;
+
+ // additional properties
+ self.target = queryElement(options.target);
+
+ // invalidate
+ if (!self.target) return;
+
+ // set initial state
+ self.scrollTarget = element.clientHeight < element.scrollHeight ? element : window;
+ self.isWindow = self.scrollTarget === window;
+ self.scrollTop = 0;
+ self.maxScroll = 0;
+ self.scrollHeight = 0;
+ self.activeItem = null;
+ self.items = [];
+ self.offsets = [];
+
+ // bind events
+ self.refresh = self.refresh.bind(self);
+
+ // add event handlers
+ toggleSpyHandlers(self, 1);
+
+ self.refresh();
+ }
+
+ // SCROLLSPY PUBLIC METHODS
+ // ========================
+ refresh() {
+ const self = this;
+ const { target } = self;
+
+ // check if target is visible and invalidate
+ if (target.offsetHeight === 0) return;
+
+ updateSpyTargets(self);
+
+ const {
+ scrollTop, maxScroll, itemsLength, items, activeItem,
+ } = self;
+
+ if (scrollTop >= maxScroll) {
+ const newActiveItem = items[itemsLength - 1];
+
+ if (activeItem !== newActiveItem) {
+ activate(self, newActiveItem);
}
- var popoverBodyMarkup = document.createElement('div');
- popoverBodyMarkup.classList.add('popover-body');
- popoverBodyMarkup.innerHTML = ops.dismissible && titleString === null ? contentString + closeBtn : contentString;
- popover.appendChild(popoverBodyMarkup);
- } else {
- var popoverTemplate = document.createElement('div');
- popoverTemplate.innerHTML = ops.template.trim();
- popover.className = popoverTemplate.firstChild.className;
- popover.innerHTML = popoverTemplate.firstChild.innerHTML;
- var popoverHeader = queryElement('.popover-header',popover),
- popoverBody = queryElement('.popover-body',popover);
- titleString && popoverHeader && (popoverHeader.innerHTML = titleString.trim());
- contentString && popoverBody && (popoverBody.innerHTML = contentString.trim());
+ return;
}
- ops.container.appendChild(popover);
- popover.style.display = 'block';
- !popover.classList.contains( 'popover') && popover.classList.add('popover');
- !popover.classList.contains( ops.animation) && popover.classList.add(ops.animation);
- !popover.classList.contains( placementClass) && popover.classList.add(placementClass);
- }
- function showPopover() {
- !popover.classList.contains('show') && ( popover.classList.add('show') );
- }
- function updatePopover() {
- styleTip(element, popover, ops.placement, ops.container);
- }
- function forceFocus () {
- if (popover === null) { element.focus(); }
- }
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- if (ops.trigger === 'hover') {
- element[action]( mouseClickEvents.down, self.show );
- element[action]( mouseHoverEvents[0], self.show );
- if (!ops.dismissible) { element[action]( mouseHoverEvents[1], self.hide ); }
- } else if ('click' == ops.trigger) {
- element[action]( ops.trigger, self.toggle );
- } else if ('focus' == ops.trigger) {
- isIphone && element[action]( 'click', forceFocus, false );
- element[action]( ops.trigger, self.toggle );
+
+ const { offsets } = self;
+
+ if (activeItem && scrollTop < offsets[0] && offsets[0] > 0) {
+ self.activeItem = null;
+ clear(target);
+ return;
}
+
+ items.forEach((item, i) => {
+ if (activeItem !== item && scrollTop >= offsets[i]
+ && (typeof offsets[i + 1] === 'undefined' || scrollTop < offsets[i + 1])) {
+ activate(self, item);
+ }
+ });
}
- function touchHandler(e){
- if ( popover && popover.contains(e.target) || e.target === element || element.contains(e.target)) ; else {
- self.hide();
- }
+
+ dispose() {
+ toggleSpyHandlers(this);
+ super.dispose(scrollspyComponent);
}
- function dismissHandlerToggle(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- if (ops.dismissible) {
- document[action]('click', dismissibleHandler, false );
+ }
+
+ ScrollSpy.init = {
+ component: scrollspyComponent,
+ selector: scrollspySelector,
+ constructor: ScrollSpy,
+ };
+
+ const ariaSelected = 'aria-selected';
+
+ /* Native JavaScript for Bootstrap 5 | Tab
+ ------------------------------------------ */
+
+ // TAB PRIVATE GC
+ // ================
+ const tabString = 'tab';
+ const tabComponent = 'Tab';
+ const tabSelector = `[${dataBsToggle}="${tabString}"]`;
+
+ // TAB CUSTOM EVENTS
+ // =================
+ const showTabEvent = bootstrapCustomEvent(`show.bs.${tabString}`);
+ const shownTabEvent = bootstrapCustomEvent(`shown.bs.${tabString}`);
+ const hideTabEvent = bootstrapCustomEvent(`hide.bs.${tabString}`);
+ const hiddenTabEvent = bootstrapCustomEvent(`hidden.bs.${tabString}`);
+
+ let nextTab;
+ let nextTabContent;
+ let nextTabHeight;
+ let activeTab;
+ let activeTabContent;
+ let tabContainerHeight;
+ let tabEqualContents;
+
+ // TAB PRIVATE METHODS
+ // ===================
+ function triggerTabEnd(self) {
+ const { tabContent, nav } = self;
+ tabContent.style.height = '';
+ removeClass(tabContent, collapsingClass);
+ nav.isAnimating = false;
+ }
+
+ function triggerTabShow(self) {
+ const { tabContent, nav } = self;
+
+ if (tabContent) { // height animation
+ if (tabEqualContents) {
+ triggerTabEnd(self);
} else {
- 'focus' == ops.trigger && element[action]( 'blur', self.hide );
- 'hover' == ops.trigger && document[action]( 'touchstart', touchHandler, passiveHandler );
+ setTimeout(() => { // enables height animation
+ tabContent.style.height = `${nextTabHeight}px`; // height animation
+ reflow(tabContent);
+ emulateTransitionEnd(tabContent, () => triggerTabEnd(self));
+ }, 50);
}
- window[action]('resize', self.hide, passiveHandler );
+ } else {
+ nav.isAnimating = false;
}
- function showTrigger() {
- dismissHandlerToggle(1);
- dispatchCustomEvent.call(element, shownCustomEvent);
+ shownTabEvent.relatedTarget = activeTab;
+ nextTab.dispatchEvent(shownTabEvent);
+ }
+
+ function triggerTabHide(self) {
+ const { tabContent } = self;
+ if (tabContent) {
+ activeTabContent.style.float = 'left';
+ nextTabContent.style.float = 'left';
+ tabContainerHeight = activeTabContent.scrollHeight;
}
- function hideTrigger() {
- dismissHandlerToggle();
- removePopover();
- dispatchCustomEvent.call(element, hiddenCustomEvent);
+
+ // update relatedTarget and dispatch event
+ showTabEvent.relatedTarget = activeTab;
+ hiddenTabEvent.relatedTarget = nextTab;
+ nextTab.dispatchEvent(showTabEvent);
+ if (showTabEvent.defaultPrevented) return;
+
+ addClass(nextTabContent, activeClass);
+ removeClass(activeTabContent, activeClass);
+
+ if (tabContent) {
+ nextTabHeight = nextTabContent.scrollHeight;
+ tabEqualContents = nextTabHeight === tabContainerHeight;
+ addClass(tabContent, collapsingClass);
+ tabContent.style.height = `${tabContainerHeight}px`; // height animation
+ reflow(tabContent);
+ activeTabContent.style.float = '';
+ nextTabContent.style.float = '';
}
- self.toggle = function () {
- if (popover === null) { self.show(); }
- else { self.hide(); }
- };
- self.show = function () {
- clearTimeout(timer);
- timer = setTimeout( function () {
- if (popover === null) {
- dispatchCustomEvent.call(element, showCustomEvent);
- if ( showCustomEvent.defaultPrevented ) { return; }
- createPopover();
- updatePopover();
- showPopover();
- !!ops.animation ? emulateTransitionEnd(popover, showTrigger) : showTrigger();
- }
- }, 20 );
- };
- self.hide = function () {
- clearTimeout(timer);
- timer = setTimeout( function () {
- if (popover && popover !== null && popover.classList.contains('show')) {
- dispatchCustomEvent.call(element, hideCustomEvent);
- if ( hideCustomEvent.defaultPrevented ) { return; }
- popover.classList.remove('show');
- !!ops.animation ? emulateTransitionEnd(popover, hideTrigger) : hideTrigger();
- }
- }, ops.delay );
- };
- self.dispose = function () {
- self.hide();
- toggleEvents();
- delete element.Popover;
- };
- element = queryElement(element);
- element.Popover && element.Popover.dispose();
- triggerData = element.getAttribute('data-trigger');
- animationData = element.getAttribute('data-animation');
- placementData = element.getAttribute('data-placement');
- dismissibleData = element.getAttribute('data-dismissible');
- delayData = element.getAttribute('data-delay');
- containerData = element.getAttribute('data-container');
- closeBtn = '<button type="button" class="close">×</button>';
- showCustomEvent = bootstrapCustomEvent('show', 'popover');
- shownCustomEvent = bootstrapCustomEvent('shown', 'popover');
- hideCustomEvent = bootstrapCustomEvent('hide', 'popover');
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'popover');
- containerElement = queryElement(options.container);
- containerDataElement = queryElement(containerData);
- modal = element.closest('.modal');
- navbarFixedTop = element.closest('.fixed-top');
- navbarFixedBottom = element.closest('.fixed-bottom');
- ops.template = options.template ? options.template : null;
- ops.trigger = options.trigger ? options.trigger : triggerData || 'hover';
- ops.animation = options.animation && options.animation !== 'fade' ? options.animation : animationData || 'fade';
- ops.placement = options.placement ? options.placement : placementData || 'top';
- ops.delay = parseInt(options.delay || delayData) || 200;
- ops.dismissible = options.dismissible || dismissibleData === 'true' ? true : false;
- ops.container = containerElement ? containerElement
- : containerDataElement ? containerDataElement
- : navbarFixedTop ? navbarFixedTop
- : navbarFixedBottom ? navbarFixedBottom
- : modal ? modal : document.body;
- placementClass = "bs-popover-" + (ops.placement);
- var popoverContents = getContents();
- titleString = popoverContents[0];
- contentString = popoverContents[1];
- if ( !contentString && !ops.template ) { return; }
- if ( !element.Popover ) {
- toggleEvents(1);
- }
- element.Popover = self;
- }
-
- function ScrollSpy(element,options) {
- options = options || {};
- var self = this,
- vars,
- targetData,
- offsetData,
- spyTarget,
- scrollTarget,
- ops = {};
- function updateTargets(){
- var links = spyTarget.getElementsByTagName('A');
- if (vars.length !== links.length) {
- vars.items = [];
- vars.targets = [];
- Array.from(links).map(function (link){
- var href = link.getAttribute('href'),
- targetItem = href && href.charAt(0) === '#' && href.slice(-1) !== '#' && queryElement(href);
- if ( targetItem ) {
- vars.items.push(link);
- vars.targets.push(targetItem);
- }
+
+ if (hasClass(nextTabContent, fadeClass)) {
+ setTimeout(() => {
+ addClass(nextTabContent, showClass);
+ emulateTransitionEnd(nextTabContent, () => {
+ triggerTabShow(self);
});
- vars.length = links.length;
- }
+ }, 20);
+ } else { triggerTabShow(self); }
+
+ activeTab.dispatchEvent(hiddenTabEvent);
+ }
+
+ function getActiveTab({ nav }) {
+ const activeTabs = nav.getElementsByClassName(activeClass);
+
+ if (activeTabs.length === 1
+ && !dropdownMenuClasses.some((c) => hasClass(activeTabs[0].parentNode, c))) {
+ [activeTab] = activeTabs;
+ } else if (activeTabs.length > 1) {
+ activeTab = activeTabs[activeTabs.length - 1];
+ }
+ return activeTab;
+ }
+
+ function getActiveTabContent(self) {
+ return queryElement(getActiveTab(self).getAttribute('href'));
+ }
+
+ function toggleTabHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ self.element[action]('click', tabClickHandler);
+ }
+
+ // TAB EVENT HANDLER
+ // =================
+ function tabClickHandler(e) {
+ const self = this[tabComponent];
+ e.preventDefault();
+ if (!self.nav.isAnimating) self.show();
+ }
+
+ // TAB DEFINITION
+ // ==============
+ class Tab extends BaseComponent {
+ constructor(target) {
+ super(tabComponent, target);
+ // bind
+ const self = this;
+
+ // initialization element
+ const { element } = self;
+
+ // event targets
+ self.nav = element.closest('.nav');
+ const { nav } = self;
+ self.dropdown = nav && queryElement(`.${dropdownMenuClasses[0]}-toggle`, nav);
+ activeTabContent = getActiveTabContent(self);
+ self.tabContent = supportTransition && activeTabContent.closest('.tab-content');
+ tabContainerHeight = activeTabContent.scrollHeight;
+
+ // set default animation state
+ nav.isAnimating = false;
+
+ // add event listener
+ toggleTabHandler(self, 1);
}
- function updateItem(index) {
- var item = vars.items[index],
- targetItem = vars.targets[index],
- dropmenu = item.classList.contains('dropdown-item') && item.closest('.dropdown-menu'),
- dropLink = dropmenu && dropmenu.previousElementSibling,
- nextSibling = item.nextElementSibling,
- activeSibling = nextSibling && nextSibling.getElementsByClassName('active').length,
- targetRect = vars.isWindow && targetItem.getBoundingClientRect(),
- isActive = item.classList.contains('active') || false,
- topEdge = (vars.isWindow ? targetRect.top + vars.scrollOffset : targetItem.offsetTop) - ops.offset,
- bottomEdge = vars.isWindow ? targetRect.bottom + vars.scrollOffset - ops.offset
- : vars.targets[index+1] ? vars.targets[index+1].offsetTop - ops.offset
- : element.scrollHeight,
- inside = activeSibling || vars.scrollOffset >= topEdge && bottomEdge > vars.scrollOffset;
- if ( !isActive && inside ) {
- item.classList.add('active');
- if (dropLink && !dropLink.classList.contains('active') ) {
- dropLink.classList.add('active');
+
+ // TAB PUBLIC METHODS
+ // ==================
+ show() { // the tab we clicked is now the nextTab tab
+ const self = this;
+ const { element, nav, dropdown } = self;
+ nextTab = element;
+ if (!hasClass(nextTab, activeClass)) {
+ // this is the actual object, the nextTab tab content to activate
+ nextTabContent = queryElement(nextTab.getAttribute('href'));
+ activeTab = getActiveTab({ nav });
+ activeTabContent = getActiveTabContent({ nav });
+
+ // update relatedTarget and dispatch
+ hideTabEvent.relatedTarget = nextTab;
+ activeTab.dispatchEvent(hideTabEvent);
+ if (hideTabEvent.defaultPrevented) return;
+
+ nav.isAnimating = true;
+ removeClass(activeTab, activeClass);
+ activeTab.setAttribute(ariaSelected, 'false');
+ addClass(nextTab, activeClass);
+ nextTab.setAttribute(ariaSelected, 'true');
+
+ if (dropdown) {
+ if (!hasClass(element.parentNode, dropdownMenuClass)) {
+ if (hasClass(dropdown, activeClass)) removeClass(dropdown, activeClass);
+ } else if (!hasClass(dropdown, activeClass)) addClass(dropdown, activeClass);
}
- dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', { relatedTarget: vars.items[index] }));
- } else if ( isActive && !inside ) {
- item.classList.remove('active');
- if (dropLink && dropLink.classList.contains('active') && !item.parentNode.getElementsByClassName('active').length ) {
- dropLink.classList.remove('active');
+
+ if (hasClass(activeTabContent, fadeClass)) {
+ removeClass(activeTabContent, showClass);
+ emulateTransitionEnd(activeTabContent, () => triggerTabHide(self));
+ } else {
+ triggerTabHide(self);
}
- } else if ( isActive && inside || !inside && !isActive ) {
- return;
}
}
- function updateItems() {
- updateTargets();
- vars.scrollOffset = vars.isWindow ? getScroll().y : element.scrollTop;
- vars.items.map(function (l,idx){ return updateItem(idx); });
+
+ dispose() {
+ toggleTabHandler(this);
+ super.dispose(tabComponent);
}
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- scrollTarget[action]('scroll', self.refresh, passiveHandler );
- window[action]( 'resize', self.refresh, passiveHandler );
+ }
+
+ Tab.init = {
+ component: tabComponent,
+ selector: tabSelector,
+ constructor: Tab,
+ };
+
+ /* Native JavaScript for Bootstrap 5 | Toast
+ -------------------------------------------- */
+
+ // TOAST PRIVATE GC
+ // ================
+ const toastString = 'toast';
+ const toastComponent = 'Toast';
+ const toastSelector = `.${toastString}`;
+ const toastDismissSelector = `[${dataBsDismiss}="${toastString}"]`;
+ const showingClass = 'showing';
+ const hideClass = 'hide';
+ const toastDefaultOptions = {
+ animation: true,
+ autohide: true,
+ delay: 500,
+ };
+
+ // TOAST CUSTOM EVENTS
+ // ===================
+ const showToastEvent = bootstrapCustomEvent(`show.bs.${toastString}`);
+ const hideToastEvent = bootstrapCustomEvent(`hide.bs.${toastString}`);
+ const shownToastEvent = bootstrapCustomEvent(`shown.bs.${toastString}`);
+ const hiddenToastEvent = bootstrapCustomEvent(`hidden.bs.${toastString}`);
+
+ // TOAST PRIVATE METHODS
+ // =====================
+ function showToastComplete(self) {
+ const { element, options } = self;
+ if (!options.animation) {
+ removeClass(element, showingClass);
+ addClass(element, showClass);
}
- self.refresh = function () {
- updateItems();
- };
- self.dispose = function () {
- toggleEvents();
- delete element.ScrollSpy;
- };
- element = queryElement(element);
- element.ScrollSpy && element.ScrollSpy.dispose();
- targetData = element.getAttribute('data-target');
- offsetData = element.getAttribute('data-offset');
- spyTarget = queryElement(options.target || targetData);
- scrollTarget = element.offsetHeight < element.scrollHeight ? element : window;
- if (!spyTarget) { return }
- ops.target = spyTarget;
- ops.offset = parseInt(options.offset || offsetData) || 10;
- vars = {};
- vars.length = 0;
- vars.items = [];
- vars.targets = [];
- vars.isWindow = scrollTarget === window;
- if ( !element.ScrollSpy ) {
- toggleEvents(1);
- }
- self.refresh();
- element.ScrollSpy = self;
- }
-
- function Tab(element,options) {
- options = options || {};
- var self = this,
- heightData,
- tabs, dropdown,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent,
- next,
- tabsContentContainer = false,
- activeTab,
- activeContent,
- nextContent,
- containerHeight,
- equalContents,
- nextHeight,
- animateHeight;
- function triggerEnd() {
- tabsContentContainer.style.height = '';
- tabsContentContainer.classList.remove('collapsing');
- tabs.isAnimating = false;
- }
- function triggerShow() {
- if (tabsContentContainer) {
- if ( equalContents ) {
- triggerEnd();
- } else {
- setTimeout(function () {
- tabsContentContainer.style.height = nextHeight + "px";
- tabsContentContainer.offsetWidth;
- emulateTransitionEnd(tabsContentContainer, triggerEnd);
- },50);
- }
- } else {
- tabs.isAnimating = false;
- }
- shownCustomEvent = bootstrapCustomEvent('shown', 'tab', { relatedTarget: activeTab });
- dispatchCustomEvent.call(next, shownCustomEvent);
- }
- function triggerHide() {
- if (tabsContentContainer) {
- activeContent.style.float = 'left';
- nextContent.style.float = 'left';
- containerHeight = activeContent.scrollHeight;
- }
- showCustomEvent = bootstrapCustomEvent('show', 'tab', { relatedTarget: activeTab });
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', { relatedTarget: next });
- dispatchCustomEvent.call(next, showCustomEvent);
- if ( showCustomEvent.defaultPrevented ) { return; }
- nextContent.classList.add('active');
- activeContent.classList.remove('active');
- if (tabsContentContainer) {
- nextHeight = nextContent.scrollHeight;
- equalContents = nextHeight === containerHeight;
- tabsContentContainer.classList.add('collapsing');
- tabsContentContainer.style.height = containerHeight + "px";
- tabsContentContainer.offsetHeight;
- activeContent.style.float = '';
- nextContent.style.float = '';
+
+ element.dispatchEvent(shownToastEvent);
+ if (options.autohide) self.hide();
+ }
+
+ function hideToastComplete(self) {
+ const { element } = self;
+ addClass(element, hideClass);
+ element.dispatchEvent(hiddenToastEvent);
+ }
+
+ function closeToast(self) {
+ const { element, options } = self;
+ removeClass(element, showClass);
+
+ if (options.animation) {
+ reflow(element);
+ emulateTransitionEnd(element, () => hideToastComplete(self));
+ } else {
+ hideToastComplete(self);
+ }
+ }
+
+ function openToast(self) {
+ const { element, options } = self;
+ removeClass(element, hideClass);
+
+ if (options.animation) {
+ reflow(element);
+ addClass(element, showingClass);
+ addClass(element, showClass);
+
+ emulateTransitionEnd(element, () => showToastComplete(self));
+ } else {
+ showToastComplete(self);
+ }
+ }
+
+ function toggleToastHandler(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ if (self.dismiss) {
+ self.dismiss[action]('click', self.hide);
+ }
+ }
+
+ // TOAST EVENT HANDLERS
+ // ====================
+ function completeDisposeToast(self) {
+ clearTimeout(self.timer);
+ toggleToastHandler(self);
+ }
+
+ // TOAST DEFINITION
+ // ================
+ class Toast extends BaseComponent {
+ constructor(target, config) {
+ super(toastComponent, target, toastDefaultOptions, config);
+ // bind
+ const self = this;
+
+ // dismiss button
+ self.dismiss = queryElement(toastDismissSelector, self.element);
+
+ // bind
+ self.show = self.show.bind(self);
+ self.hide = self.hide.bind(self);
+
+ // add event listener
+ toggleToastHandler(self, 1);
+ }
+
+ // TOAST PUBLIC METHODS
+ // ====================
+ show() {
+ const self = this;
+ const { element } = self;
+ if (element && hasClass(element, hideClass)) {
+ element.dispatchEvent(showToastEvent);
+ if (showToastEvent.defaultPrevented) return;
+
+ addClass(element, fadeClass);
+ clearTimeout(self.timer);
+ self.timer = setTimeout(() => openToast(self), 10);
}
- if ( nextContent.classList.contains('fade') ) {
- setTimeout(function () {
- nextContent.classList.add('show');
- emulateTransitionEnd(nextContent,triggerShow);
- },20);
- } else { triggerShow(); }
- dispatchCustomEvent.call(activeTab, hiddenCustomEvent);
- }
- function getActiveTab() {
- var activeTabs = tabs.getElementsByClassName('active'), activeTab;
- if ( activeTabs.length === 1 && !activeTabs[0].parentNode.classList.contains('dropdown') ) {
- activeTab = activeTabs[0];
- } else if ( activeTabs.length > 1 ) {
- activeTab = activeTabs[activeTabs.length-1];
+ }
+
+ hide(noTimer) {
+ const self = this;
+ const { element, options } = self;
+
+ if (element && hasClass(element, showClass)) {
+ element.dispatchEvent(hideToastEvent);
+ if (hideToastEvent.defaultPrevented) return;
+
+ clearTimeout(self.timer);
+ self.timer = setTimeout(() => closeToast(self), // Bugfix by BlackDex to get autohide with a delay working.
+ noTimer ? 10 : options.delay,
+ );
}
- return activeTab;
}
- function getActiveContent() { return queryElement(getActiveTab().getAttribute('href')) }
- function clickHandler(e) {
- e.preventDefault();
- next = e.currentTarget;
- !tabs.isAnimating && self.show();
- }
- self.show = function () {
- next = next || element;
- if (!next.classList.contains('active')) {
- nextContent = queryElement(next.getAttribute('href'));
- activeTab = getActiveTab();
- activeContent = getActiveContent();
- hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', { relatedTarget: next });
- dispatchCustomEvent.call(activeTab, hideCustomEvent);
- if (hideCustomEvent.defaultPrevented) { return; }
- tabs.isAnimating = true;
- activeTab.classList.remove('active');
- activeTab.setAttribute('aria-selected','false');
- next.classList.add('active');
- next.setAttribute('aria-selected','true');
- if ( dropdown ) {
- if ( !element.parentNode.classList.contains('dropdown-menu') ) {
- if (dropdown.classList.contains('active')) { dropdown.classList.remove('active'); }
- } else {
- if (!dropdown.classList.contains('active')) { dropdown.classList.add('active'); }
- }
+
+ dispose() {
+ const self = this;
+ const { element, options } = self;
+ self.hide();
+
+ if (options.animation) emulateTransitionEnd(element, () => completeDisposeToast(self));
+ else completeDisposeToast(self);
+
+ super.dispose(toastComponent);
+ }
+ }
+
+ Toast.init = {
+ component: toastComponent,
+ selector: toastSelector,
+ constructor: Toast,
+ };
+
+ const dataOriginalTitle = 'data-original-title';
+
+ /* Native JavaScript for Bootstrap 5 | Tooltip
+ ---------------------------------------------- */
+
+ // TOOLTIP PRIVATE GC
+ // ==================
+ const tooltipString = 'tooltip';
+ const tooltipComponent = 'Tooltip';
+ const tooltipSelector = `[${dataBsToggle}="${tooltipString}"],[data-tip="${tooltipString}"]`;
+
+ const titleAttr = 'title';
+ const tooltipInnerClass = `${tooltipString}-inner`;
+ const tooltipDefaultOptions = {
+ title: null,
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+ placement: 'top',
+ animation: true,
+ customClass: null,
+ delay: 200,
+ sanitizeFn: null,
+ };
+
+ // TOOLTIP CUSTOM EVENTS
+ // =====================
+ const showTooltipEvent = bootstrapCustomEvent(`show.bs.${tooltipString}`);
+ const shownTooltipEvent = bootstrapCustomEvent(`shown.bs.${tooltipString}`);
+ const hideTooltipEvent = bootstrapCustomEvent(`hide.bs.${tooltipString}`);
+ const hiddenTooltipEvent = bootstrapCustomEvent(`hidden.bs.${tooltipString}`);
+
+ // TOOLTIP PRIVATE METHODS
+ // =======================
+ function createTooltip(self) {
+ const { options, id } = self;
+ const placementClass = `bs-${tooltipString}-${tipClassPositions[options.placement]}`;
+ let titleString = options.title.trim();
+
+ // sanitize stuff
+ if (options.sanitizeFn) {
+ titleString = options.sanitizeFn(titleString);
+ options.template = options.sanitizeFn(options.template);
+ }
+
+ if (!titleString) return;
+
+ // create tooltip
+ self.tooltip = document.createElement('div');
+ const { tooltip } = self;
+
+ // set aria
+ tooltip.setAttribute('id', id);
+
+ // set markup
+ const tooltipMarkup = document.createElement('div');
+ tooltipMarkup.innerHTML = options.template.trim();
+
+ tooltip.className = tooltipMarkup.firstChild.className;
+ tooltip.innerHTML = tooltipMarkup.firstChild.innerHTML;
+
+ queryElement(`.${tooltipInnerClass}`, tooltip).innerHTML = titleString;
+
+ // set arrow
+ self.arrow = queryElement(`.${tooltipString}-arrow`, tooltip);
+
+ // set class and role attribute
+ tooltip.setAttribute('role', tooltipString);
+ // set classes
+ if (!hasClass(tooltip, tooltipString)) addClass(tooltip, tooltipString);
+ if (options.animation && !hasClass(tooltip, fadeClass)) addClass(tooltip, fadeClass);
+ if (options.customClass && !hasClass(tooltip, options.customClass)) {
+ addClass(tooltip, options.customClass);
+ }
+ if (!hasClass(tooltip, placementClass)) addClass(tooltip, placementClass);
+ }
+
+ function removeTooltip(self) {
+ const { element, options, tooltip } = self;
+ element.removeAttribute(ariaDescribedBy);
+ options.container.removeChild(tooltip);
+ self.timer = null;
+ }
+
+ function disposeTooltipComplete(self) {
+ const { element } = self;
+ toggleTooltipHandlers(self);
+ if (element.hasAttribute(dataOriginalTitle)) toggleTooltipTitle(self);
+ }
+ function toggleTooltipAction(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+
+ document[action]('touchstart', tooltipTouchHandler, passiveHandler);
+
+ if (!isMedia(self.element)) {
+ window[action]('scroll', self.update, passiveHandler);
+ window[action]('resize', self.update, passiveHandler);
+ }
+ }
+ function tooltipShownAction(self) {
+ toggleTooltipAction(self, 1);
+ self.element.dispatchEvent(shownTooltipEvent);
+ }
+ function tooltipHiddenAction(self) {
+ toggleTooltipAction(self);
+ removeTooltip(self);
+ self.element.dispatchEvent(hiddenTooltipEvent);
+ }
+ function toggleTooltipHandlers(self, add) {
+ const action = add ? addEventListener : removeEventListener;
+ const { element } = self;
+
+ if (isMedia(element)) element[action]('mousemove', self.update, passiveHandler);
+ element[action]('mousedown', self.show);
+ element[action]('mouseenter', self.show);
+ element[action]('mouseleave', self.hide);
+ }
+
+ function toggleTooltipTitle(self, content) {
+ // [0 - add, 1 - remove] | [0 - remove, 1 - add]
+ const titleAtt = [dataOriginalTitle, titleAttr];
+ const { element } = self;
+
+ element.setAttribute(titleAtt[content ? 0 : 1],
+ (content || element.getAttribute(titleAtt[0])));
+ element.removeAttribute(titleAtt[content ? 1 : 0]);
+ }
+
+ // TOOLTIP EVENT HANDLERS
+ // ======================
+ function tooltipTouchHandler({ target }) {
+ const { tooltip, element } = this;
+ if (tooltip.contains(target) || target === element || element.contains(target)) ; else {
+ this.hide();
+ }
+ }
+
+ // TOOLTIP DEFINITION
+ // ==================
+ class Tooltip extends BaseComponent {
+ constructor(target, config) {
+ // initialization element
+ const element = queryElement(target);
+ tooltipDefaultOptions.title = element.getAttribute(titleAttr);
+ tooltipDefaultOptions.container = getTipContainer(element);
+ super(tooltipComponent, element, tooltipDefaultOptions, config);
+
+ // bind
+ const self = this;
+
+ // additional properties
+ self.tooltip = null;
+ self.arrow = null;
+ self.timer = null;
+ self.enabled = false;
+
+ // instance options
+ const { options } = self;
+
+ // media elements only work with body as a container
+ self.options.container = isMedia(element)
+ ? tooltipDefaultOptions.container
+ : queryElement(options.container);
+
+ // reset default options
+ tooltipDefaultOptions.container = null;
+ tooltipDefaultOptions[titleAttr] = null;
+
+ // invalidate
+ if (!options.title) return;
+
+ // all functions bind
+ tooltipTouchHandler.bind(self);
+ self.update = self.update.bind(self);
+
+ // set title attributes and add event listeners
+ if (element.hasAttribute(titleAttr)) toggleTooltipTitle(self, options.title);
+
+ // create tooltip here
+ self.id = `${tooltipString}-${getUID(element)}`;
+ createTooltip(self);
+
+ // attach events
+ toggleTooltipHandlers(self, 1);
+ }
+
+ // TOOLTIP PUBLIC METHODS
+ // ======================
+ show(e) {
+ const self = e ? this[tooltipComponent] : this;
+ const {
+ options, tooltip, element, id,
+ } = self;
+ clearTimeout(self.timer);
+ self.timer = setTimeout(() => {
+ if (!isVisibleTip(tooltip, options.container)) {
+ element.dispatchEvent(showTooltipEvent);
+ if (showTooltipEvent.defaultPrevented) return;
+
+ // append to container
+ options.container.appendChild(tooltip);
+ element.setAttribute(ariaDescribedBy, id);
+
+ self.update(e);
+ if (!hasClass(tooltip, showClass)) addClass(tooltip, showClass);
+ if (options.animation) emulateTransitionEnd(tooltip, () => tooltipShownAction(self));
+ else tooltipShownAction(self);
}
- if (activeContent.classList.contains('fade')) {
- activeContent.classList.remove('show');
- emulateTransitionEnd(activeContent, triggerHide);
- } else { triggerHide(); }
- }
- };
- self.dispose = function () {
- element.removeEventListener('click',clickHandler,false);
- delete element.Tab;
- };
- element = queryElement(element);
- element.Tab && element.Tab.dispose();
- heightData = element.getAttribute('data-height');
- tabs = element.closest('.nav');
- dropdown = tabs && queryElement('.dropdown-toggle',tabs);
- animateHeight = !supportTransition || (options.height === false || heightData === 'false') ? false : true;
- tabs.isAnimating = false;
- if ( !element.Tab ) {
- element.addEventListener('click',clickHandler,false);
- }
- if (animateHeight) { tabsContentContainer = getActiveContent().parentNode; }
- element.Tab = self;
- }
-
- function Toast(element,options) {
- options = options || {};
- var self = this,
- toast, timer = 0,
- animationData,
- autohideData,
- delayData,
- showCustomEvent,
- hideCustomEvent,
- shownCustomEvent,
- hiddenCustomEvent,
- ops = {};
- function showComplete() {
- toast.classList.remove( 'showing' );
- toast.classList.add( 'show' );
- dispatchCustomEvent.call(toast,shownCustomEvent);
- if (ops.autohide) { self.hide(); }
- }
- function hideComplete() {
- toast.classList.add( 'hide' );
- dispatchCustomEvent.call(toast,hiddenCustomEvent);
- }
- function close () {
- toast.classList.remove('show' );
- ops.animation ? emulateTransitionEnd(toast, hideComplete) : hideComplete();
- }
- function disposeComplete() {
- clearTimeout(timer);
- element.removeEventListener('click',self.hide,false);
- delete element.Toast;
- }
- self.show = function () {
- if (toast && !toast.classList.contains('show')) {
- dispatchCustomEvent.call(toast,showCustomEvent);
- if (showCustomEvent.defaultPrevented) { return; }
- ops.animation && toast.classList.add( 'fade' );
- toast.classList.remove('hide' );
- toast.offsetWidth;
- toast.classList.add('showing' );
- ops.animation ? emulateTransitionEnd(toast, showComplete) : showComplete();
- }
- };
- self.hide = function (noTimer) {
- if (toast && toast.classList.contains('show')) {
- dispatchCustomEvent.call(toast,hideCustomEvent);
- if(hideCustomEvent.defaultPrevented) { return; }
- noTimer ? close() : (timer = setTimeout( close, ops.delay));
+ }, 20);
+ }
+
+ hide(e) {
+ const self = e ? this[tooltipComponent] : this;
+ const { options, tooltip, element } = self;
+
+ clearTimeout(self.timer);
+ self.timer = setTimeout(() => {
+ if (isVisibleTip(tooltip, options.container)) {
+ element.dispatchEvent(hideTooltipEvent);
+ if (hideTooltipEvent.defaultPrevented) return;
+
+ removeClass(tooltip, showClass);
+ if (options.animation) emulateTransitionEnd(tooltip, () => tooltipHiddenAction(self));
+ else tooltipHiddenAction(self);
+ }
+ }, options.delay);
+ }
+
+ update(e) {
+ styleTip(this, e);
+ }
+
+ toggle() {
+ const self = this;
+ const { tooltip, options } = self;
+ if (!isVisibleTip(tooltip, options.container)) self.show();
+ else self.hide();
+ }
+
+ enable() {
+ const self = this;
+ const { enabled } = self;
+ if (!enabled) {
+ toggleTooltipHandlers(self, 1);
+ self.enabled = !enabled;
}
- };
- self.dispose = function () {
- ops.animation ? emulateTransitionEnd(toast, disposeComplete) : disposeComplete();
- };
- element = queryElement(element);
- element.Toast && element.Toast.dispose();
- toast = element.closest('.toast');
- animationData = element.getAttribute('data-animation');
- autohideData = element.getAttribute('data-autohide');
- delayData = element.getAttribute('data-delay');
- showCustomEvent = bootstrapCustomEvent('show', 'toast');
- hideCustomEvent = bootstrapCustomEvent('hide', 'toast');
- shownCustomEvent = bootstrapCustomEvent('shown', 'toast');
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'toast');
- ops.animation = options.animation === false || animationData === 'false' ? 0 : 1;
- ops.autohide = options.autohide === false || autohideData === 'false' ? 0 : 1;
- ops.delay = parseInt(options.delay || delayData) || 500;
- if ( !element.Toast ) {
- element.addEventListener('click',self.hide,false);
- }
- element.Toast = self;
- }
-
- function Tooltip(element,options) {
- options = options || {};
- var self = this,
- tooltip = null, timer = 0, titleString,
- animationData,
- placementData,
- delayData,
- containerData,
- showCustomEvent,
- shownCustomEvent,
- hideCustomEvent,
- hiddenCustomEvent,
- containerElement,
- containerDataElement,
- modal,
- navbarFixedTop,
- navbarFixedBottom,
- placementClass,
- ops = {};
- function getTitle() {
- return element.getAttribute('title')
- || element.getAttribute('data-title')
- || element.getAttribute('data-original-title')
- }
- function removeToolTip() {
- ops.container.removeChild(tooltip);
- tooltip = null; timer = null;
- }
- function createToolTip() {
- titleString = getTitle();
- if ( titleString ) {
- tooltip = document.createElement('div');
- if (ops.template) {
- var tooltipMarkup = document.createElement('div');
- tooltipMarkup.innerHTML = ops.template.trim();
- tooltip.className = tooltipMarkup.firstChild.className;
- tooltip.innerHTML = tooltipMarkup.firstChild.innerHTML;
- queryElement('.tooltip-inner',tooltip).innerHTML = titleString.trim();
+ }
+
+ disable() {
+ const self = this;
+ const { tooltip, options, enabled } = self;
+ if (enabled) {
+ if (!isVisibleTip(tooltip, options.container) && options.animation) {
+ self.hide();
+
+ setTimeout(
+ () => toggleTooltipHandlers(self),
+ getElementTransitionDuration(tooltip) + options.delay + 17,
+ );
} else {
- var tooltipArrow = document.createElement('div');
- tooltipArrow.classList.add('arrow');
- tooltip.appendChild(tooltipArrow);
- var tooltipInner = document.createElement('div');
- tooltipInner.classList.add('tooltip-inner');
- tooltip.appendChild(tooltipInner);
- tooltipInner.innerHTML = titleString;
+ toggleTooltipHandlers(self);
}
- tooltip.style.left = '0';
- tooltip.style.top = '0';
- tooltip.setAttribute('role','tooltip');
- !tooltip.classList.contains('tooltip') && tooltip.classList.add('tooltip');
- !tooltip.classList.contains(ops.animation) && tooltip.classList.add(ops.animation);
- !tooltip.classList.contains(placementClass) && tooltip.classList.add(placementClass);
- ops.container.appendChild(tooltip);
+ self.enabled = !enabled;
}
}
- function updateTooltip() {
- styleTip(element, tooltip, ops.placement, ops.container);
- }
- function showTooltip() {
- !tooltip.classList.contains('show') && ( tooltip.classList.add('show') );
+
+ toggleEnabled() {
+ const self = this;
+ if (!self.enabled) self.enable();
+ else self.disable();
}
- function touchHandler(e){
- if ( tooltip && tooltip.contains(e.target) || e.target === element || element.contains(e.target)) ; else {
+
+ dispose() {
+ const self = this;
+ const { tooltip, options } = self;
+
+ if (options.animation && isVisibleTip(tooltip, options.container)) {
+ options.delay = 0; // reset delay
self.hide();
+ emulateTransitionEnd(tooltip, () => disposeTooltipComplete(self));
+ } else {
+ disposeTooltipComplete(self);
}
+ super.dispose(tooltipComponent);
}
- function toggleAction(action){
- action = action ? 'addEventListener' : 'removeEventListener';
- document[action]( 'touchstart', touchHandler, passiveHandler );
- window[action]( 'resize', self.hide, passiveHandler );
- }
- function showAction() {
- toggleAction(1);
- dispatchCustomEvent.call(element, shownCustomEvent);
- }
- function hideAction() {
- toggleAction();
- removeToolTip();
- dispatchCustomEvent.call(element, hiddenCustomEvent);
- }
- function toggleEvents(action) {
- action = action ? 'addEventListener' : 'removeEventListener';
- element[action](mouseClickEvents.down, self.show,false);
- element[action](mouseHoverEvents[0], self.show,false);
- element[action](mouseHoverEvents[1], self.hide,false);
- }
- self.show = function () {
- clearTimeout(timer);
- timer = setTimeout( function () {
- if (tooltip === null) {
- dispatchCustomEvent.call(element, showCustomEvent);
- if (showCustomEvent.defaultPrevented) { return; }
- if(createToolTip() !== false) {
- updateTooltip();
- showTooltip();
- !!ops.animation ? emulateTransitionEnd(tooltip, showAction) : showAction();
- }
- }
- }, 20 );
- };
- self.hide = function () {
- clearTimeout(timer);
- timer = setTimeout( function () {
- if (tooltip && tooltip.classList.contains('show')) {
- dispatchCustomEvent.call(element, hideCustomEvent);
- if (hideCustomEvent.defaultPrevented) { return; }
- tooltip.classList.remove('show');
- !!ops.animation ? emulateTransitionEnd(tooltip, hideAction) : hideAction();
- }
- }, ops.delay);
- };
- self.toggle = function () {
- if (!tooltip) { self.show(); }
- else { self.hide(); }
- };
- self.dispose = function () {
- toggleEvents();
- self.hide();
- element.setAttribute('title', element.getAttribute('data-original-title'));
- element.removeAttribute('data-original-title');
- delete element.Tooltip;
- };
- element = queryElement(element);
- element.Tooltip && element.Tooltip.dispose();
- animationData = element.getAttribute('data-animation');
- placementData = element.getAttribute('data-placement');
- delayData = element.getAttribute('data-delay');
- containerData = element.getAttribute('data-container');
- showCustomEvent = bootstrapCustomEvent('show', 'tooltip');
- shownCustomEvent = bootstrapCustomEvent('shown', 'tooltip');
- hideCustomEvent = bootstrapCustomEvent('hide', 'tooltip');
- hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tooltip');
- containerElement = queryElement(options.container);
- containerDataElement = queryElement(containerData);
- modal = element.closest('.modal');
- navbarFixedTop = element.closest('.fixed-top');
- navbarFixedBottom = element.closest('.fixed-bottom');
- ops.animation = options.animation && options.animation !== 'fade' ? options.animation : animationData || 'fade';
- ops.placement = options.placement ? options.placement : placementData || 'top';
- ops.template = options.template ? options.template : null;
- ops.delay = parseInt(options.delay || delayData) || 200;
- ops.container = containerElement ? containerElement
- : containerDataElement ? containerDataElement
- : navbarFixedTop ? navbarFixedTop
- : navbarFixedBottom ? navbarFixedBottom
- : modal ? modal : document.body;
- placementClass = "bs-tooltip-" + (ops.placement);
- titleString = getTitle();
- if ( !titleString ) { return; }
- if (!element.Tooltip) {
- element.setAttribute('data-original-title',titleString);
- element.removeAttribute('title');
- toggleEvents(1);
- }
- element.Tooltip = self;
- }
-
- var componentsInit = {};
-
- function initializeDataAPI( Constructor, collection ){
- Array.from(collection).map(function (x){ return new Constructor(x); });
- }
- function initCallback(lookUp){
- lookUp = lookUp || document;
- for (var component in componentsInit) {
- initializeDataAPI( componentsInit[component][0], lookUp.querySelectorAll (componentsInit[component][1]) );
- }
- }
-
- componentsInit.Alert = [ Alert, '[data-dismiss="alert"]'];
- componentsInit.Button = [ Button, '[data-toggle="buttons"]' ];
- componentsInit.Carousel = [ Carousel, '[data-ride="carousel"]' ];
- componentsInit.Collapse = [ Collapse, '[data-toggle="collapse"]' ];
- componentsInit.Dropdown = [ Dropdown, '[data-toggle="dropdown"]'];
- componentsInit.Modal = [ Modal, '[data-toggle="modal"]' ];
- componentsInit.Popover = [ Popover, '[data-toggle="popover"],[data-tip="popover"]' ];
- componentsInit.ScrollSpy = [ ScrollSpy, '[data-spy="scroll"]' ];
- componentsInit.Tab = [ Tab, '[data-toggle="tab"]' ];
- componentsInit.Toast = [ Toast, '[data-dismiss="toast"]' ];
- componentsInit.Tooltip = [ Tooltip, '[data-toggle="tooltip"],[data-tip="tooltip"]' ];
- document.body ? initCallback() : document.addEventListener( 'DOMContentLoaded', function initWrapper(){
- initCallback();
- document.removeEventListener('DOMContentLoaded',initWrapper,false);
- }, false );
-
- function removeElementDataAPI( ConstructorName, collection ){
- Array.from(collection).map(function (x){ return x[ConstructorName].dispose(); });
- }
- function removeDataAPI(lookUp) {
- lookUp = lookUp || document;
- for (var component in componentsInit) {
- removeElementDataAPI( component, lookUp.querySelectorAll (componentsInit[component][1]) );
- }
- }
-
- var version = "3.0.15";
+ }
+
+ Tooltip.init = {
+ component: tooltipComponent,
+ selector: tooltipSelector,
+ constructor: Tooltip,
+ };
+
+ var version = "4.0.2";
+
+ // import { alertInit } from '../components/alert-native.js';
+ // import { buttonInit } from '../components/button-native.js';
+ // import { carouselInit } from '../components/carousel-native.js';
+ // import { collapseInit } from '../components/collapse-native.js';
+ // import { dropdownInit } from '../components/dropdown-native.js';
+ // import { modalInit } from '../components/modal-native.js';
+ // import { offcanvasInit } from '../components/offcanvas-native.js';
+ // import { popoverInit } from '../components/popover-native.js';
+ // import { scrollSpyInit } from '../components/scrollspy-native.js';
+ // import { tabInit } from '../components/tab-native.js';
+ // import { toastInit } from '../components/toast-native.js';
+ // import { tooltipInit } from '../components/tooltip-native.js';
+
+ const componentsInit = {
+ Alert: Alert.init,
+ Button: Button.init,
+ Carousel: Carousel.init,
+ Collapse: Collapse.init,
+ Dropdown: Dropdown.init,
+ Modal: Modal.init,
+ Offcanvas: Offcanvas.init,
+ Popover: Popover.init,
+ ScrollSpy: ScrollSpy.init,
+ Tab: Tab.init,
+ Toast: Toast.init,
+ Tooltip: Tooltip.init,
+ };
+
+ function initializeDataAPI(Konstructor, collection) {
+ Array.from(collection).forEach((x) => new Konstructor(x));
+ }
+
+ function initCallback(context) {
+ const lookUp = context instanceof Element ? context : document;
+
+ Object.keys(componentsInit).forEach((comp) => {
+ const { constructor, selector } = componentsInit[comp];
+ initializeDataAPI(constructor, lookUp.querySelectorAll(selector));
+ });
+ }
+
+ // bulk initialize all components
+ if (document.body) initCallback();
+ else {
+ document.addEventListener('DOMContentLoaded', () => initCallback(), { once: true });
+ }
var index = {
- Alert: Alert,
- Button: Button,
- Carousel: Carousel,
- Collapse: Collapse,
- Dropdown: Dropdown,
- Modal: Modal,
- Popover: Popover,
- ScrollSpy: ScrollSpy,
- Tab: Tab,
- Toast: Toast,
- Tooltip: Tooltip,
- initCallback: initCallback,
- removeDataAPI: removeDataAPI,
- componentsInit: componentsInit,
- Version: version
+ Alert,
+ Button,
+ Carousel,
+ Collapse,
+ Dropdown,
+ Modal,
+ Offcanvas,
+ Popover,
+ ScrollSpy,
+ Tab,
+ Toast,
+ Tooltip,
+
+ initCallback,
+ Version: version,
};
return index;
diff --git a/src/static/scripts/bootstrap.css b/src/static/scripts/bootstrap.css
@@ -1,38 +1,35 @@
+@charset "UTF-8";
/*!
- * Bootstrap v4.5.3 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap v5.0.1 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root {
- --blue: #007bff;
- --indigo: #6610f2;
- --purple: #6f42c1;
- --pink: #e83e8c;
- --red: #dc3545;
- --orange: #fd7e14;
- --yellow: #ffc107;
- --green: #28a745;
- --teal: #20c997;
- --cyan: #17a2b8;
- --white: #fff;
- --gray: #6c757d;
- --gray-dark: #343a40;
- --primary: #007bff;
- --secondary: #6c757d;
- --success: #28a745;
- --info: #17a2b8;
- --warning: #ffc107;
- --danger: #dc3545;
- --light: #f8f9fa;
- --dark: #343a40;
- --breakpoint-xs: 0;
- --breakpoint-sm: 576px;
- --breakpoint-md: 768px;
- --breakpoint-lg: 992px;
- --breakpoint-xl: 1200px;
- --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
}
*,
@@ -41,41 +38,85 @@
box-sizing: border-box;
}
-html {
- font-family: sans-serif;
- line-height: 1.15;
- -webkit-text-size-adjust: 100%;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
- display: block;
+@media (prefers-reduced-motion: no-preference) {
+ :root {
+ scroll-behavior: smooth;
+ }
}
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--bs-font-sans-serif);
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
- text-align: left;
background-color: #fff;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
-[tabindex="-1"]:focus:not(:focus-visible) {
- outline: 0 !important;
+hr {
+ margin: 1rem 0;
+ color: inherit;
+ background-color: currentColor;
+ border: 0;
+ opacity: 0.25;
}
-hr {
- box-sizing: content-box;
- height: 0;
- overflow: visible;
+hr:not([size]) {
+ height: 1px;
}
-h1, h2, h3, h4, h5, h6 {
+h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {
margin-top: 0;
margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+}
+
+h1, .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+@media (min-width: 1200px) {
+ h1, .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+h2, .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+@media (min-width: 1200px) {
+ h2, .h2 {
+ font-size: 2rem;
+ }
+}
+
+h3, .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+@media (min-width: 1200px) {
+ h3, .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+h4, .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+@media (min-width: 1200px) {
+ h4, .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+h5, .h5 {
+ font-size: 1.25rem;
+}
+
+h6, .h6 {
+ font-size: 1rem;
}
p {
@@ -84,12 +125,10 @@ p {
}
abbr[title],
-abbr[data-original-title] {
- text-decoration: underline;
+abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
- border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
@@ -101,6 +140,11 @@ address {
}
ol,
+ul {
+ padding-left: 2rem;
+}
+
+ol,
ul,
dl {
margin-top: 0;
@@ -119,7 +163,7 @@ dt {
}
dd {
- margin-bottom: .5rem;
+ margin-bottom: 0.5rem;
margin-left: 0;
}
@@ -132,43 +176,40 @@ strong {
font-weight: bolder;
}
-small {
- font-size: 80%;
+small, .small {
+ font-size: 0.875em;
+}
+
+mark, .mark {
+ padding: 0.2em;
+ background-color: #fcf8e3;
}
sub,
sup {
position: relative;
- font-size: 75%;
+ font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
- bottom: -.25em;
+ bottom: -0.25em;
}
sup {
- top: -.5em;
+ top: -0.5em;
}
a {
- color: #007bff;
- text-decoration: none;
- background-color: transparent;
-}
-
-a:hover {
- color: #0056b3;
+ color: #0d6efd;
text-decoration: underline;
}
-
-a:not([href]):not([class]) {
- color: inherit;
- text-decoration: none;
+a:hover {
+ color: #0a58ca;
}
-a:not([href]):not([class]):hover {
+a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
@@ -177,41 +218,66 @@ pre,
code,
kbd,
samp {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-family: var(--bs-font-monospace);
font-size: 1em;
+ direction: ltr /* rtl:ignore */;
+ unicode-bidi: bidi-override;
}
pre {
+ display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
- -ms-overflow-style: scrollbar;
+ font-size: 0.875em;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
}
-figure {
- margin: 0 0 1rem;
+code {
+ font-size: 0.875em;
+ color: #d63384;
+ word-wrap: break-word;
+}
+a > code {
+ color: inherit;
}
-img {
- vertical-align: middle;
- border-style: none;
+kbd {
+ padding: 0.2rem 0.4rem;
+ font-size: 0.875em;
+ color: #fff;
+ background-color: #212529;
+ border-radius: 0.2rem;
+}
+kbd kbd {
+ padding: 0;
+ font-size: 1em;
+ font-weight: 700;
}
+figure {
+ margin: 0 0 1rem;
+}
+
+img,
svg {
- overflow: hidden;
vertical-align: middle;
}
table {
+ caption-side: bottom;
border-collapse: collapse;
}
caption {
- padding-top: 0.75rem;
- padding-bottom: 0.75rem;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
color: #6c757d;
text-align: left;
- caption-side: bottom;
}
th {
@@ -219,18 +285,27 @@ th {
text-align: -webkit-match-parent;
}
+thead,
+tbody,
+tfoot,
+tr,
+td,
+th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
label {
display: inline-block;
- margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
-button:focus {
- outline: 1px dotted;
- outline: 5px auto -webkit-focus-ring-color;
+button:focus:not(:focus-visible) {
+ outline: 0;
}
input,
@@ -245,53 +320,44 @@ textarea {
}
button,
-input {
- overflow: visible;
-}
-
-button,
select {
text-transform: none;
}
-[role="button"] {
+[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
+select:disabled {
+ opacity: 1;
+}
+
+[list]::-webkit-calendar-picker-indicator {
+ display: none;
+}
button,
-[type="button"],
-[type="reset"],
-[type="submit"] {
+[type=button],
+[type=reset],
+[type=submit] {
-webkit-appearance: button;
}
-
button:not(:disabled),
-[type="button"]:not(:disabled),
-[type="reset"]:not(:disabled),
-[type="submit"]:not(:disabled) {
+[type=button]:not(:disabled),
+[type=reset]:not(:disabled),
+[type=submit]:not(:disabled) {
cursor: pointer;
}
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
+::-moz-focus-inner {
padding: 0;
border-style: none;
}
-input[type="radio"],
-input[type="checkbox"] {
- box-sizing: border-box;
- padding: 0;
-}
-
textarea {
- overflow: auto;
resize: vertical;
}
@@ -303,35 +369,61 @@ fieldset {
}
legend {
- display: block;
+ float: left;
width: 100%;
- max-width: 100%;
padding: 0;
- margin-bottom: .5rem;
- font-size: 1.5rem;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
- color: inherit;
- white-space: normal;
+}
+@media (min-width: 1200px) {
+ legend {
+ font-size: 1.5rem;
+ }
+}
+legend + * {
+ clear: left;
}
-progress {
- vertical-align: baseline;
+::-webkit-datetime-edit-fields-wrapper,
+::-webkit-datetime-edit-text,
+::-webkit-datetime-edit-minute,
+::-webkit-datetime-edit-hour-field,
+::-webkit-datetime-edit-day-field,
+::-webkit-datetime-edit-month-field,
+::-webkit-datetime-edit-year-field {
+ padding: 0;
}
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
+::-webkit-inner-spin-button {
height: auto;
}
-[type="search"] {
+[type=search] {
outline-offset: -2px;
- -webkit-appearance: none;
+ -webkit-appearance: textfield;
}
-[type="search"]::-webkit-search-decoration {
+/* rtl:raw:
+[type="tel"],
+[type="url"],
+[type="email"],
+[type="number"] {
+ direction: ltr;
+}
+*/
+::-webkit-search-decoration {
-webkit-appearance: none;
}
+::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+::file-selector-button {
+ font: inherit;
+}
+
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
@@ -341,96 +433,92 @@ output {
display: inline-block;
}
+iframe {
+ border: 0;
+}
+
summary {
display: list-item;
cursor: pointer;
}
-template {
- display: none;
+progress {
+ vertical-align: baseline;
}
[hidden] {
display: none !important;
}
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
- margin-bottom: 0.5rem;
- font-weight: 500;
- line-height: 1.2;
-}
-
-h1, .h1 {
- font-size: 2.5rem;
-}
-
-h2, .h2 {
- font-size: 2rem;
-}
-
-h3, .h3 {
- font-size: 1.75rem;
-}
-
-h4, .h4 {
- font-size: 1.5rem;
-}
-
-h5, .h5 {
- font-size: 1.25rem;
-}
-
-h6, .h6 {
- font-size: 1rem;
-}
-
.lead {
font-size: 1.25rem;
font-weight: 300;
}
.display-1 {
- font-size: 6rem;
+ font-size: calc(1.625rem + 4.5vw);
font-weight: 300;
line-height: 1.2;
}
+@media (min-width: 1200px) {
+ .display-1 {
+ font-size: 5rem;
+ }
+}
.display-2 {
- font-size: 5.5rem;
+ font-size: calc(1.575rem + 3.9vw);
font-weight: 300;
line-height: 1.2;
}
+@media (min-width: 1200px) {
+ .display-2 {
+ font-size: 4.5rem;
+ }
+}
.display-3 {
- font-size: 4.5rem;
+ font-size: calc(1.525rem + 3.3vw);
font-weight: 300;
line-height: 1.2;
}
+@media (min-width: 1200px) {
+ .display-3 {
+ font-size: 4rem;
+ }
+}
.display-4 {
- font-size: 3.5rem;
+ font-size: calc(1.475rem + 2.7vw);
font-weight: 300;
line-height: 1.2;
}
-
-hr {
- margin-top: 1rem;
- margin-bottom: 1rem;
- border: 0;
- border-top: 1px solid rgba(0, 0, 0, 0.1);
+@media (min-width: 1200px) {
+ .display-4 {
+ font-size: 3.5rem;
+ }
}
-small,
-.small {
- font-size: 80%;
- font-weight: 400;
+.display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-5 {
+ font-size: 3rem;
+ }
}
-mark,
-.mark {
- padding: 0.2em;
- background-color: #fcf8e3;
+.display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-6 {
+ font-size: 2.5rem;
+ }
}
.list-unstyled {
@@ -446,13 +534,12 @@ mark,
.list-inline-item {
display: inline-block;
}
-
.list-inline-item:not(:last-child) {
margin-right: 0.5rem;
}
.initialism {
- font-size: 90%;
+ font-size: 0.875em;
text-transform: uppercase;
}
@@ -460,15 +547,18 @@ mark,
margin-bottom: 1rem;
font-size: 1.25rem;
}
+.blockquote > :last-child {
+ margin-bottom: 0;
+}
.blockquote-footer {
- display: block;
- font-size: 80%;
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
color: #6c757d;
}
-
.blockquote-footer::before {
- content: "\2014\00A0";
+ content: "— ";
}
.img-fluid {
@@ -495,1623 +585,1663 @@ mark,
}
.figure-caption {
- font-size: 90%;
+ font-size: 0.875em;
color: #6c757d;
}
-code {
- font-size: 87.5%;
- color: #e83e8c;
- word-wrap: break-word;
-}
-
-a > code {
- color: inherit;
-}
-
-kbd {
- padding: 0.2rem 0.4rem;
- font-size: 87.5%;
- color: #fff;
- background-color: #212529;
- border-radius: 0.2rem;
-}
-
-kbd kbd {
- padding: 0;
- font-size: 100%;
- font-weight: 700;
-}
-
-pre {
- display: block;
- font-size: 87.5%;
- color: #212529;
-}
-
-pre code {
- font-size: inherit;
- color: inherit;
- word-break: normal;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
.container,
.container-fluid,
-.container-sm,
-.container-md,
+.container-xxl,
+.container-xl,
.container-lg,
-.container-xl {
+.container-md,
+.container-sm {
width: 100%;
- padding-right: 15px;
- padding-left: 15px;
+ padding-right: var(--bs-gutter-x, 0.75rem);
+ padding-left: var(--bs-gutter-x, 0.75rem);
margin-right: auto;
margin-left: auto;
}
@media (min-width: 576px) {
- .container, .container-sm {
+ .container-sm, .container {
max-width: 540px;
}
}
-
@media (min-width: 768px) {
- .container, .container-sm, .container-md {
+ .container-md, .container-sm, .container {
max-width: 720px;
}
}
-
@media (min-width: 992px) {
- .container, .container-sm, .container-md, .container-lg {
+ .container-lg, .container-md, .container-sm, .container {
max-width: 960px;
}
}
-
@media (min-width: 1200px) {
- .container, .container-sm, .container-md, .container-lg, .container-xl {
+ .container-xl, .container-lg, .container-md, .container-sm, .container {
max-width: 1140px;
}
}
-
+@media (min-width: 1400px) {
+ .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
+ max-width: 1320px;
+ }
+}
.row {
- display: -ms-flexbox;
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
display: flex;
- -ms-flex-wrap: wrap;
flex-wrap: wrap;
- margin-right: -15px;
- margin-left: -15px;
+ margin-top: calc(var(--bs-gutter-y) * -1);
+ margin-right: calc(var(--bs-gutter-x) / -2);
+ margin-left: calc(var(--bs-gutter-x) / -2);
}
-
-.no-gutters {
- margin-right: 0;
- margin-left: 0;
-}
-
-.no-gutters > .col,
-.no-gutters > [class*="col-"] {
- padding-right: 0;
- padding-left: 0;
-}
-
-.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
-.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
-.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
-.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
-.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
-.col-xl-auto {
- position: relative;
+.row > * {
+ flex-shrink: 0;
width: 100%;
- padding-right: 15px;
- padding-left: 15px;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) / 2);
+ padding-left: calc(var(--bs-gutter-x) / 2);
+ margin-top: var(--bs-gutter-y);
}
.col {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
+ flex: 1 0 0%;
+}
+
+.row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
}
.row-cols-1 > * {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
+ flex: 0 0 auto;
+ width: 100%;
}
.row-cols-2 > * {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
.row-cols-3 > * {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
.row-cols-4 > * {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
.row-cols-5 > * {
- -ms-flex: 0 0 20%;
- flex: 0 0 20%;
- max-width: 20%;
+ flex: 0 0 auto;
+ width: 20%;
}
.row-cols-6 > * {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
.col-auto {
- -ms-flex: 0 0 auto;
flex: 0 0 auto;
width: auto;
- max-width: 100%;
}
.col-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
+ flex: 0 0 auto;
+ width: 8.3333333333%;
}
.col-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
.col-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
.col-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
.col-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
+ flex: 0 0 auto;
+ width: 41.6666666667%;
}
.col-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
.col-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
+ flex: 0 0 auto;
+ width: 58.3333333333%;
}
.col-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
+ flex: 0 0 auto;
+ width: 66.6666666667%;
}
.col-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
+ flex: 0 0 auto;
+ width: 75%;
}
.col-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
+ flex: 0 0 auto;
+ width: 83.3333333333%;
}
.col-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
+ flex: 0 0 auto;
+ width: 91.6666666667%;
}
.col-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
-}
-
-.order-first {
- -ms-flex-order: -1;
- order: -1;
-}
-
-.order-last {
- -ms-flex-order: 13;
- order: 13;
-}
-
-.order-0 {
- -ms-flex-order: 0;
- order: 0;
+ flex: 0 0 auto;
+ width: 100%;
}
-.order-1 {
- -ms-flex-order: 1;
- order: 1;
+.offset-1 {
+ margin-left: 8.3333333333%;
}
-.order-2 {
- -ms-flex-order: 2;
- order: 2;
+.offset-2 {
+ margin-left: 16.6666666667%;
}
-.order-3 {
- -ms-flex-order: 3;
- order: 3;
+.offset-3 {
+ margin-left: 25%;
}
-.order-4 {
- -ms-flex-order: 4;
- order: 4;
+.offset-4 {
+ margin-left: 33.3333333333%;
}
-.order-5 {
- -ms-flex-order: 5;
- order: 5;
+.offset-5 {
+ margin-left: 41.6666666667%;
}
-.order-6 {
- -ms-flex-order: 6;
- order: 6;
+.offset-6 {
+ margin-left: 50%;
}
-.order-7 {
- -ms-flex-order: 7;
- order: 7;
+.offset-7 {
+ margin-left: 58.3333333333%;
}
-.order-8 {
- -ms-flex-order: 8;
- order: 8;
+.offset-8 {
+ margin-left: 66.6666666667%;
}
-.order-9 {
- -ms-flex-order: 9;
- order: 9;
+.offset-9 {
+ margin-left: 75%;
}
-.order-10 {
- -ms-flex-order: 10;
- order: 10;
+.offset-10 {
+ margin-left: 83.3333333333%;
}
-.order-11 {
- -ms-flex-order: 11;
- order: 11;
+.offset-11 {
+ margin-left: 91.6666666667%;
}
-.order-12 {
- -ms-flex-order: 12;
- order: 12;
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
}
-.offset-1 {
- margin-left: 8.333333%;
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
}
-.offset-2 {
- margin-left: 16.666667%;
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
}
-.offset-3 {
- margin-left: 25%;
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
}
-.offset-4 {
- margin-left: 33.333333%;
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
}
-.offset-5 {
- margin-left: 41.666667%;
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
}
-.offset-6 {
- margin-left: 50%;
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
}
-.offset-7 {
- margin-left: 58.333333%;
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
}
-.offset-8 {
- margin-left: 66.666667%;
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
}
-.offset-9 {
- margin-left: 75%;
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
}
-.offset-10 {
- margin-left: 83.333333%;
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
}
-.offset-11 {
- margin-left: 91.666667%;
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
}
@media (min-width: 576px) {
.col-sm {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
+ flex: 1 0 0%;
+ }
+
+ .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
}
+
.row-cols-sm-1 > * {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.row-cols-sm-2 > * {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.row-cols-sm-3 > * {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.row-cols-sm-4 > * {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.row-cols-sm-5 > * {
- -ms-flex: 0 0 20%;
- flex: 0 0 20%;
- max-width: 20%;
+ flex: 0 0 auto;
+ width: 20%;
}
+
.row-cols-sm-6 > * {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-sm-auto {
- -ms-flex: 0 0 auto;
flex: 0 0 auto;
width: auto;
- max-width: 100%;
}
+
.col-sm-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
+ flex: 0 0 auto;
+ width: 8.3333333333%;
}
+
.col-sm-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-sm-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.col-sm-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.col-sm-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
+ flex: 0 0 auto;
+ width: 41.6666666667%;
}
+
.col-sm-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.col-sm-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
+ flex: 0 0 auto;
+ width: 58.3333333333%;
}
+
.col-sm-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
+ flex: 0 0 auto;
+ width: 66.6666666667%;
}
+
.col-sm-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
+ flex: 0 0 auto;
+ width: 75%;
}
+
.col-sm-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
+ flex: 0 0 auto;
+ width: 83.3333333333%;
}
+
.col-sm-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
+ flex: 0 0 auto;
+ width: 91.6666666667%;
}
+
.col-sm-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-sm-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-sm-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-sm-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-sm-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-sm-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-sm-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-sm-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-sm-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-sm-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-sm-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-sm-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-sm-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-sm-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-sm-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-sm-12 {
- -ms-flex-order: 12;
- order: 12;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.offset-sm-0 {
margin-left: 0;
}
+
.offset-sm-1 {
- margin-left: 8.333333%;
+ margin-left: 8.3333333333%;
}
+
.offset-sm-2 {
- margin-left: 16.666667%;
+ margin-left: 16.6666666667%;
}
+
.offset-sm-3 {
margin-left: 25%;
}
+
.offset-sm-4 {
- margin-left: 33.333333%;
+ margin-left: 33.3333333333%;
}
+
.offset-sm-5 {
- margin-left: 41.666667%;
+ margin-left: 41.6666666667%;
}
+
.offset-sm-6 {
margin-left: 50%;
}
+
.offset-sm-7 {
- margin-left: 58.333333%;
+ margin-left: 58.3333333333%;
}
+
.offset-sm-8 {
- margin-left: 66.666667%;
+ margin-left: 66.6666666667%;
}
+
.offset-sm-9 {
margin-left: 75%;
}
+
.offset-sm-10 {
- margin-left: 83.333333%;
+ margin-left: 83.3333333333%;
}
+
.offset-sm-11 {
- margin-left: 91.666667%;
+ margin-left: 91.6666666667%;
+ }
+
+ .g-sm-0,
+.gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-sm-0,
+.gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-sm-1,
+.gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-sm-1,
+.gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-sm-2,
+.gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-sm-2,
+.gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-sm-3,
+.gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-sm-3,
+.gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-sm-4,
+.gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-sm-4,
+.gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-sm-5,
+.gx-sm-5 {
+ --bs-gutter-x: 3rem;
}
-}
+ .g-sm-5,
+.gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
@media (min-width: 768px) {
.col-md {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
+ flex: 1 0 0%;
+ }
+
+ .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
}
+
.row-cols-md-1 > * {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.row-cols-md-2 > * {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.row-cols-md-3 > * {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.row-cols-md-4 > * {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.row-cols-md-5 > * {
- -ms-flex: 0 0 20%;
- flex: 0 0 20%;
- max-width: 20%;
+ flex: 0 0 auto;
+ width: 20%;
}
+
.row-cols-md-6 > * {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-md-auto {
- -ms-flex: 0 0 auto;
flex: 0 0 auto;
width: auto;
- max-width: 100%;
}
+
.col-md-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
+ flex: 0 0 auto;
+ width: 8.3333333333%;
}
+
.col-md-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-md-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.col-md-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.col-md-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
+ flex: 0 0 auto;
+ width: 41.6666666667%;
}
+
.col-md-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.col-md-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
+ flex: 0 0 auto;
+ width: 58.3333333333%;
}
+
.col-md-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
+ flex: 0 0 auto;
+ width: 66.6666666667%;
}
+
.col-md-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
+ flex: 0 0 auto;
+ width: 75%;
}
+
.col-md-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
+ flex: 0 0 auto;
+ width: 83.3333333333%;
}
+
.col-md-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
+ flex: 0 0 auto;
+ width: 91.6666666667%;
}
+
.col-md-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-md-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-md-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-md-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-md-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-md-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-md-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-md-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-md-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-md-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-md-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-md-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-md-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-md-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-md-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-md-12 {
- -ms-flex-order: 12;
- order: 12;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.offset-md-0 {
margin-left: 0;
}
+
.offset-md-1 {
- margin-left: 8.333333%;
+ margin-left: 8.3333333333%;
}
+
.offset-md-2 {
- margin-left: 16.666667%;
+ margin-left: 16.6666666667%;
}
+
.offset-md-3 {
margin-left: 25%;
}
+
.offset-md-4 {
- margin-left: 33.333333%;
+ margin-left: 33.3333333333%;
}
+
.offset-md-5 {
- margin-left: 41.666667%;
+ margin-left: 41.6666666667%;
}
+
.offset-md-6 {
margin-left: 50%;
}
+
.offset-md-7 {
- margin-left: 58.333333%;
+ margin-left: 58.3333333333%;
}
+
.offset-md-8 {
- margin-left: 66.666667%;
+ margin-left: 66.6666666667%;
}
+
.offset-md-9 {
margin-left: 75%;
}
+
.offset-md-10 {
- margin-left: 83.333333%;
+ margin-left: 83.3333333333%;
}
+
.offset-md-11 {
- margin-left: 91.666667%;
+ margin-left: 91.6666666667%;
+ }
+
+ .g-md-0,
+.gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-md-0,
+.gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-md-1,
+.gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-md-1,
+.gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-md-2,
+.gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-md-2,
+.gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-md-3,
+.gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-md-3,
+.gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-md-4,
+.gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-md-4,
+.gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-md-5,
+.gx-md-5 {
+ --bs-gutter-x: 3rem;
}
-}
+ .g-md-5,
+.gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
@media (min-width: 992px) {
.col-lg {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
+ flex: 1 0 0%;
+ }
+
+ .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
}
+
.row-cols-lg-1 > * {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.row-cols-lg-2 > * {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.row-cols-lg-3 > * {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.row-cols-lg-4 > * {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.row-cols-lg-5 > * {
- -ms-flex: 0 0 20%;
- flex: 0 0 20%;
- max-width: 20%;
+ flex: 0 0 auto;
+ width: 20%;
}
+
.row-cols-lg-6 > * {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-lg-auto {
- -ms-flex: 0 0 auto;
flex: 0 0 auto;
width: auto;
- max-width: 100%;
}
+
.col-lg-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
+ flex: 0 0 auto;
+ width: 8.3333333333%;
}
+
.col-lg-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-lg-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.col-lg-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.col-lg-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
+ flex: 0 0 auto;
+ width: 41.6666666667%;
}
+
.col-lg-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.col-lg-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
+ flex: 0 0 auto;
+ width: 58.3333333333%;
}
+
.col-lg-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
+ flex: 0 0 auto;
+ width: 66.6666666667%;
}
+
.col-lg-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
+ flex: 0 0 auto;
+ width: 75%;
}
+
.col-lg-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
+ flex: 0 0 auto;
+ width: 83.3333333333%;
}
+
.col-lg-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
+ flex: 0 0 auto;
+ width: 91.6666666667%;
}
+
.col-lg-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-lg-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-lg-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-lg-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-lg-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-lg-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-lg-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-lg-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-lg-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-lg-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-lg-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-lg-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-lg-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-lg-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-lg-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-lg-12 {
- -ms-flex-order: 12;
- order: 12;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.offset-lg-0 {
margin-left: 0;
}
+
.offset-lg-1 {
- margin-left: 8.333333%;
+ margin-left: 8.3333333333%;
}
+
.offset-lg-2 {
- margin-left: 16.666667%;
+ margin-left: 16.6666666667%;
}
+
.offset-lg-3 {
margin-left: 25%;
}
+
.offset-lg-4 {
- margin-left: 33.333333%;
+ margin-left: 33.3333333333%;
}
+
.offset-lg-5 {
- margin-left: 41.666667%;
+ margin-left: 41.6666666667%;
}
+
.offset-lg-6 {
margin-left: 50%;
}
+
.offset-lg-7 {
- margin-left: 58.333333%;
+ margin-left: 58.3333333333%;
}
+
.offset-lg-8 {
- margin-left: 66.666667%;
+ margin-left: 66.6666666667%;
}
+
.offset-lg-9 {
margin-left: 75%;
}
+
.offset-lg-10 {
- margin-left: 83.333333%;
+ margin-left: 83.3333333333%;
}
+
.offset-lg-11 {
- margin-left: 91.666667%;
+ margin-left: 91.6666666667%;
+ }
+
+ .g-lg-0,
+.gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-lg-0,
+.gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-lg-1,
+.gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-lg-1,
+.gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-lg-2,
+.gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-lg-2,
+.gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-lg-3,
+.gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-lg-3,
+.gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-lg-4,
+.gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-lg-4,
+.gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-lg-5,
+.gx-lg-5 {
+ --bs-gutter-x: 3rem;
}
-}
+ .g-lg-5,
+.gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
@media (min-width: 1200px) {
.col-xl {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
+ flex: 1 0 0%;
+ }
+
+ .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
}
+
.row-cols-xl-1 > * {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.row-cols-xl-2 > * {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.row-cols-xl-3 > * {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.row-cols-xl-4 > * {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.row-cols-xl-5 > * {
- -ms-flex: 0 0 20%;
- flex: 0 0 20%;
- max-width: 20%;
+ flex: 0 0 auto;
+ width: 20%;
}
+
.row-cols-xl-6 > * {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-xl-auto {
- -ms-flex: 0 0 auto;
flex: 0 0 auto;
width: auto;
- max-width: 100%;
}
+
.col-xl-1 {
- -ms-flex: 0 0 8.333333%;
- flex: 0 0 8.333333%;
- max-width: 8.333333%;
+ flex: 0 0 auto;
+ width: 8.3333333333%;
}
+
.col-xl-2 {
- -ms-flex: 0 0 16.666667%;
- flex: 0 0 16.666667%;
- max-width: 16.666667%;
+ flex: 0 0 auto;
+ width: 16.6666666667%;
}
+
.col-xl-3 {
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
+ flex: 0 0 auto;
+ width: 25%;
}
+
.col-xl-4 {
- -ms-flex: 0 0 33.333333%;
- flex: 0 0 33.333333%;
- max-width: 33.333333%;
+ flex: 0 0 auto;
+ width: 33.3333333333%;
}
+
.col-xl-5 {
- -ms-flex: 0 0 41.666667%;
- flex: 0 0 41.666667%;
- max-width: 41.666667%;
+ flex: 0 0 auto;
+ width: 41.6666666667%;
}
+
.col-xl-6 {
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
+ flex: 0 0 auto;
+ width: 50%;
}
+
.col-xl-7 {
- -ms-flex: 0 0 58.333333%;
- flex: 0 0 58.333333%;
- max-width: 58.333333%;
+ flex: 0 0 auto;
+ width: 58.3333333333%;
}
+
.col-xl-8 {
- -ms-flex: 0 0 66.666667%;
- flex: 0 0 66.666667%;
- max-width: 66.666667%;
+ flex: 0 0 auto;
+ width: 66.6666666667%;
}
+
.col-xl-9 {
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
+ flex: 0 0 auto;
+ width: 75%;
}
+
.col-xl-10 {
- -ms-flex: 0 0 83.333333%;
- flex: 0 0 83.333333%;
- max-width: 83.333333%;
+ flex: 0 0 auto;
+ width: 83.3333333333%;
}
+
.col-xl-11 {
- -ms-flex: 0 0 91.666667%;
- flex: 0 0 91.666667%;
- max-width: 91.666667%;
+ flex: 0 0 auto;
+ width: 91.6666666667%;
}
+
.col-xl-12 {
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xl-first {
- -ms-flex-order: -1;
- order: -1;
- }
- .order-xl-last {
- -ms-flex-order: 13;
- order: 13;
- }
- .order-xl-0 {
- -ms-flex-order: 0;
- order: 0;
- }
- .order-xl-1 {
- -ms-flex-order: 1;
- order: 1;
- }
- .order-xl-2 {
- -ms-flex-order: 2;
- order: 2;
- }
- .order-xl-3 {
- -ms-flex-order: 3;
- order: 3;
- }
- .order-xl-4 {
- -ms-flex-order: 4;
- order: 4;
- }
- .order-xl-5 {
- -ms-flex-order: 5;
- order: 5;
- }
- .order-xl-6 {
- -ms-flex-order: 6;
- order: 6;
- }
- .order-xl-7 {
- -ms-flex-order: 7;
- order: 7;
- }
- .order-xl-8 {
- -ms-flex-order: 8;
- order: 8;
- }
- .order-xl-9 {
- -ms-flex-order: 9;
- order: 9;
- }
- .order-xl-10 {
- -ms-flex-order: 10;
- order: 10;
- }
- .order-xl-11 {
- -ms-flex-order: 11;
- order: 11;
- }
- .order-xl-12 {
- -ms-flex-order: 12;
- order: 12;
+ flex: 0 0 auto;
+ width: 100%;
}
+
.offset-xl-0 {
margin-left: 0;
}
+
.offset-xl-1 {
- margin-left: 8.333333%;
+ margin-left: 8.3333333333%;
}
+
.offset-xl-2 {
- margin-left: 16.666667%;
+ margin-left: 16.6666666667%;
}
+
.offset-xl-3 {
margin-left: 25%;
}
+
.offset-xl-4 {
- margin-left: 33.333333%;
+ margin-left: 33.3333333333%;
}
+
.offset-xl-5 {
- margin-left: 41.666667%;
+ margin-left: 41.6666666667%;
}
+
.offset-xl-6 {
margin-left: 50%;
}
+
.offset-xl-7 {
- margin-left: 58.333333%;
+ margin-left: 58.3333333333%;
}
+
.offset-xl-8 {
- margin-left: 66.666667%;
+ margin-left: 66.6666666667%;
}
+
.offset-xl-9 {
margin-left: 75%;
}
+
.offset-xl-10 {
- margin-left: 83.333333%;
+ margin-left: 83.3333333333%;
}
+
.offset-xl-11 {
- margin-left: 91.666667%;
+ margin-left: 91.6666666667%;
}
-}
-
-.table {
- width: 100%;
- margin-bottom: 1rem;
- color: #212529;
-}
-.table th,
-.table td {
- padding: 0.75rem;
- vertical-align: top;
- border-top: 1px solid #dee2e6;
-}
+ .g-xl-0,
+.gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
-.table thead th {
- vertical-align: bottom;
- border-bottom: 2px solid #dee2e6;
-}
+ .g-xl-0,
+.gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
-.table tbody + tbody {
- border-top: 2px solid #dee2e6;
-}
+ .g-xl-1,
+.gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
-.table-sm th,
-.table-sm td {
- padding: 0.3rem;
-}
+ .g-xl-1,
+.gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
-.table-bordered {
- border: 1px solid #dee2e6;
-}
+ .g-xl-2,
+.gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
-.table-bordered th,
-.table-bordered td {
- border: 1px solid #dee2e6;
-}
+ .g-xl-2,
+.gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
-.table-bordered thead th,
-.table-bordered thead td {
- border-bottom-width: 2px;
-}
+ .g-xl-3,
+.gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
-.table-borderless th,
-.table-borderless td,
-.table-borderless thead th,
-.table-borderless tbody + tbody {
- border: 0;
-}
+ .g-xl-3,
+.gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
-.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(0, 0, 0, 0.05);
-}
+ .g-xl-4,
+.gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
-.table-hover tbody tr:hover {
- color: #212529;
- background-color: rgba(0, 0, 0, 0.075);
-}
+ .g-xl-4,
+.gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
-.table-primary,
-.table-primary > th,
-.table-primary > td {
- background-color: #b8daff;
-}
+ .g-xl-5,
+.gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
-.table-primary th,
-.table-primary td,
-.table-primary thead th,
-.table-primary tbody + tbody {
- border-color: #7abaff;
+ .g-xl-5,
+.gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
}
+@media (min-width: 1400px) {
+ .col-xxl {
+ flex: 1 0 0%;
+ }
-.table-hover .table-primary:hover {
- background-color: #9fcdff;
-}
+ .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
-.table-hover .table-primary:hover > td,
-.table-hover .table-primary:hover > th {
- background-color: #9fcdff;
-}
+ .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
- background-color: #d6d8db;
-}
+ .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
-.table-secondary th,
-.table-secondary td,
-.table-secondary thead th,
-.table-secondary tbody + tbody {
- border-color: #b3b7bb;
-}
+ .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
-.table-hover .table-secondary:hover {
- background-color: #c8cbcf;
-}
+ .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
-.table-hover .table-secondary:hover > td,
-.table-hover .table-secondary:hover > th {
- background-color: #c8cbcf;
-}
+ .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
-.table-success,
-.table-success > th,
-.table-success > td {
- background-color: #c3e6cb;
-}
+ .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
-.table-success th,
-.table-success td,
-.table-success thead th,
-.table-success tbody + tbody {
- border-color: #8fd19e;
-}
+ .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
-.table-hover .table-success:hover {
- background-color: #b1dfbb;
-}
+ .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.3333333333%;
+ }
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
- background-color: #b1dfbb;
-}
+ .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.6666666667%;
+ }
-.table-info,
-.table-info > th,
-.table-info > td {
- background-color: #bee5eb;
-}
+ .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
-.table-info th,
-.table-info td,
-.table-info thead th,
-.table-info tbody + tbody {
- border-color: #86cfda;
-}
+ .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.3333333333%;
+ }
-.table-hover .table-info:hover {
- background-color: #abdde5;
-}
+ .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.6666666667%;
+ }
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
- background-color: #abdde5;
-}
+ .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
-.table-warning,
-.table-warning > th,
-.table-warning > td {
- background-color: #ffeeba;
-}
+ .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.3333333333%;
+ }
-.table-warning th,
-.table-warning td,
-.table-warning thead th,
-.table-warning tbody + tbody {
- border-color: #ffdf7e;
-}
+ .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.6666666667%;
+ }
-.table-hover .table-warning:hover {
- background-color: #ffe8a1;
-}
+ .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
- background-color: #ffe8a1;
-}
+ .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.3333333333%;
+ }
-.table-danger,
-.table-danger > th,
-.table-danger > td {
- background-color: #f5c6cb;
-}
+ .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.6666666667%;
+ }
-.table-danger th,
-.table-danger td,
-.table-danger thead th,
-.table-danger tbody + tbody {
- border-color: #ed969e;
-}
+ .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
-.table-hover .table-danger:hover {
- background-color: #f1b0b7;
-}
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
- background-color: #f1b0b7;
-}
+ .offset-xxl-1 {
+ margin-left: 8.3333333333%;
+ }
-.table-light,
-.table-light > th,
-.table-light > td {
- background-color: #fdfdfe;
-}
+ .offset-xxl-2 {
+ margin-left: 16.6666666667%;
+ }
-.table-light th,
-.table-light td,
-.table-light thead th,
-.table-light tbody + tbody {
- border-color: #fbfcfc;
-}
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .offset-xxl-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .offset-xxl-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .offset-xxl-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .offset-xxl-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .offset-xxl-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .offset-xxl-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .g-xxl-0,
+.gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-xxl-0,
+.gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
-.table-hover .table-light:hover {
- background-color: #ececf6;
+ .g-xxl-1,
+.gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-xxl-1,
+.gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-xxl-2,
+.gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-xxl-2,
+.gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-xxl-3,
+.gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-xxl-3,
+.gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-xxl-4,
+.gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-xxl-4,
+.gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-xxl-5,
+.gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-xxl-5,
+.gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+.table {
+ --bs-table-bg: transparent;
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: #212529;
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: #212529;
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: #212529;
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #212529;
+ vertical-align: top;
+ border-color: #dee2e6;
+}
+.table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+.table > tbody {
+ vertical-align: inherit;
+}
+.table > thead {
+ vertical-align: bottom;
+}
+.table > :not(:last-child) > :last-child > * {
+ border-bottom-color: currentColor;
}
-.table-hover .table-light:hover > td,
-.table-hover .table-light:hover > th {
- background-color: #ececf6;
+.caption-top {
+ caption-side: top;
}
-.table-dark,
-.table-dark > th,
-.table-dark > td {
- background-color: #c6c8ca;
+.table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
}
-.table-dark th,
-.table-dark td,
-.table-dark thead th,
-.table-dark tbody + tbody {
- border-color: #95999c;
+.table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+.table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
}
-.table-hover .table-dark:hover {
- background-color: #b9bbbe;
+.table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
}
-.table-hover .table-dark:hover > td,
-.table-hover .table-dark:hover > th {
- background-color: #b9bbbe;
+.table-striped > tbody > tr:nth-of-type(odd) {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
}
-.table-active,
-.table-active > th,
-.table-active > td {
- background-color: rgba(0, 0, 0, 0.075);
+.table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
}
-.table-hover .table-active:hover {
- background-color: rgba(0, 0, 0, 0.075);
+.table-hover > tbody > tr:hover {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
}
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
- background-color: rgba(0, 0, 0, 0.075);
+.table-primary {
+ --bs-table-bg: #cfe2ff;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bacbe6;
}
-.table .thead-dark th {
- color: #fff;
- background-color: #343a40;
- border-color: #454d55;
+.table-secondary {
+ --bs-table-bg: #e2e3e5;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #cbccce;
}
-.table .thead-light th {
- color: #495057;
- background-color: #e9ecef;
- border-color: #dee2e6;
+.table-success {
+ --bs-table-bg: #d1e7dd;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bcd0c7;
}
-.table-dark {
- color: #fff;
- background-color: #343a40;
+.table-info {
+ --bs-table-bg: #cff4fc;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #badce3;
}
-.table-dark th,
-.table-dark td,
-.table-dark thead th {
- border-color: #454d55;
+.table-warning {
+ --bs-table-bg: #fff3cd;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #e6dbb9;
}
-.table-dark.table-bordered {
- border: 0;
+.table-danger {
+ --bs-table-bg: #f8d7da;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfc2c4;
}
-.table-dark.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(255, 255, 255, 0.05);
+.table-light {
+ --bs-table-bg: #f8f9fa;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfe0e1;
}
-.table-dark.table-hover tbody tr:hover {
+.table-dark {
+ --bs-table-bg: #212529;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
color: #fff;
- background-color: rgba(255, 255, 255, 0.075);
+ border-color: #373b3e;
+}
+
+.table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
}
@media (max-width: 575.98px) {
.table-responsive-sm {
- display: block;
- width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
- .table-responsive-sm > .table-bordered {
- border: 0;
- }
}
-
@media (max-width: 767.98px) {
.table-responsive-md {
- display: block;
- width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
- .table-responsive-md > .table-bordered {
- border: 0;
- }
}
-
@media (max-width: 991.98px) {
.table-responsive-lg {
- display: block;
- width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
- .table-responsive-lg > .table-bordered {
- border: 0;
- }
}
-
@media (max-width: 1199.98px) {
.table-responsive-xl {
- display: block;
- width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
- .table-responsive-xl > .table-bordered {
- border: 0;
+}
+@media (max-width: 1399.98px) {
+ .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
}
}
+.form-label {
+ margin-bottom: 0.5rem;
+}
-.table-responsive {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
+.col-form-label {
+ padding-top: calc(0.375rem + 1px);
+ padding-bottom: calc(0.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
}
-.table-responsive > .table-bordered {
- border: 0;
+.col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+}
+
+.col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+}
+
+.form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #6c757d;
}
.form-control {
display: block;
width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
padding: 0.375rem 0.75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
- color: #495057;
+ color: #212529;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
border-radius: 0.25rem;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
-
@media (prefers-reduced-motion: reduce) {
.form-control {
transition: none;
}
}
-
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
+.form-control[type=file] {
+ overflow: hidden;
}
-
-.form-control:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 #495057;
+.form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
}
-
.form-control:focus {
- color: #495057;
+ color: #212529;
background-color: #fff;
- border-color: #80bdff;
+ border-color: #86b7fe;
outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
-
-.form-control::-webkit-input-placeholder {
- color: #6c757d;
- opacity: 1;
+.form-control::-webkit-date-and-time-value {
+ height: 1.5em;
}
-
.form-control::-moz-placeholder {
color: #6c757d;
opacity: 1;
}
-
-.form-control:-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
-.form-control::-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-
.form-control::placeholder {
color: #6c757d;
opacity: 1;
}
-
.form-control:disabled, .form-control[readonly] {
background-color: #e9ecef;
opacity: 1;
}
-
-input[type="date"].form-control,
-input[type="time"].form-control,
-input[type="datetime-local"].form-control,
-input[type="month"].form-control {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
+.form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
-
-select.form-control:focus::-ms-value {
- color: #495057;
- background-color: #fff;
+@media (prefers-reduced-motion: reduce) {
+ .form-control::file-selector-button {
+ transition: none;
+ }
}
-
-.form-control-file,
-.form-control-range {
- display: block;
- width: 100%;
+.form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: #dde0e3;
}
-
-.col-form-label {
- padding-top: calc(0.375rem + 1px);
- padding-bottom: calc(0.375rem + 1px);
- margin-bottom: 0;
- font-size: inherit;
- line-height: 1.5;
+.form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: #212529;
+ background-color: #e9ecef;
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: 1px;
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
-
-.col-form-label-lg {
- padding-top: calc(0.5rem + 1px);
- padding-bottom: calc(0.5rem + 1px);
- font-size: 1.25rem;
- line-height: 1.5;
+@media (prefers-reduced-motion: reduce) {
+ .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
}
-
-.col-form-label-sm {
- padding-top: calc(0.25rem + 1px);
- padding-bottom: calc(0.25rem + 1px);
- font-size: 0.875rem;
- line-height: 1.5;
+.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: #dde0e3;
}
.form-control-plaintext {
@@ -2119,1040 +2249,1154 @@ select.form-control:focus::-ms-value {
width: 100%;
padding: 0.375rem 0;
margin-bottom: 0;
- font-size: 1rem;
line-height: 1.5;
color: #212529;
background-color: transparent;
border: solid transparent;
border-width: 1px 0;
}
-
.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
padding-right: 0;
padding-left: 0;
}
.form-control-sm {
- height: calc(1.5em + 0.5rem + 2px);
+ min-height: calc(1.5em + 0.5rem + 2px);
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
- line-height: 1.5;
border-radius: 0.2rem;
}
+.form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+.form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
.form-control-lg {
- height: calc(1.5em + 1rem + 2px);
+ min-height: calc(1.5em + 1rem + 2px);
padding: 0.5rem 1rem;
font-size: 1.25rem;
- line-height: 1.5;
border-radius: 0.3rem;
}
-
-select.form-control[size], select.form-control[multiple] {
- height: auto;
-}
-
-textarea.form-control {
- height: auto;
-}
-
-.form-group {
- margin-bottom: 1rem;
-}
-
-.form-text {
- display: block;
- margin-top: 0.25rem;
+.form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
}
-
-.form-row {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -5px;
- margin-left: -5px;
+.form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
}
-.form-row > .col,
-.form-row > [class*="col-"] {
- padding-right: 5px;
- padding-left: 5px;
+textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + 2px);
}
-
-.form-check {
- position: relative;
- display: block;
- padding-left: 1.25rem;
+textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + 2px);
}
-
-.form-check-input {
- position: absolute;
- margin-top: 0.3rem;
- margin-left: -1.25rem;
+textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + 2px);
}
-.form-check-input[disabled] ~ .form-check-label,
-.form-check-input:disabled ~ .form-check-label {
- color: #6c757d;
+.form-control-color {
+ max-width: 3rem;
+ height: auto;
+ padding: 0.375rem;
}
-
-.form-check-label {
- margin-bottom: 0;
+.form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
}
-
-.form-check-inline {
- display: -ms-inline-flexbox;
- display: inline-flex;
- -ms-flex-align: center;
- align-items: center;
- padding-left: 0;
- margin-right: 0.75rem;
+.form-control-color::-moz-color-swatch {
+ height: 1.5em;
+ border-radius: 0.25rem;
}
-
-.form-check-inline .form-check-input {
- position: static;
- margin-top: 0;
- margin-right: 0.3125rem;
- margin-left: 0;
+.form-control-color::-webkit-color-swatch {
+ height: 1.5em;
+ border-radius: 0.25rem;
}
-.valid-feedback {
- display: none;
+.form-select {
+ display: block;
width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #28a745;
-}
-
-.valid-tooltip {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: .1rem;
- font-size: 0.875rem;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
line-height: 1.5;
- color: #fff;
- background-color: rgba(40, 167, 69, 0.9);
+ color: #212529;
+ background-color: #fff;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: 1px solid #ced4da;
border-radius: 0.25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
}
-
-.was-validated :valid ~ .valid-feedback,
-.was-validated :valid ~ .valid-tooltip,
-.is-valid ~ .valid-feedback,
-.is-valid ~ .valid-tooltip {
- display: block;
-}
-
-.was-validated .form-control:valid, .form-control.is-valid {
- border-color: #28a745;
- padding-right: calc(1.5em + 0.75rem);
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+.form-select:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
-
-.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+.form-select[multiple], .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
}
-
-.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+.form-select:disabled {
+ background-color: #e9ecef;
}
-
-.was-validated .custom-select:valid, .custom-select.is-valid {
- border-color: #28a745;
- padding-right: calc(0.75em + 2.3125rem);
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+.form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 #212529;
}
-.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+.form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
}
-.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
- color: #28a745;
+.form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
}
-.was-validated .form-check-input:valid ~ .valid-feedback,
-.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
-.form-check-input.is-valid ~ .valid-tooltip {
+.form-check {
display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
- color: #28a745;
+.form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
}
-.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
- border-color: #28a745;
+.form-check-input {
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
}
-
-.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
- border-color: #34ce57;
- background-color: #34ce57;
+.form-check-input[type=checkbox] {
+ border-radius: 0.25em;
}
-
-.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+.form-check-input[type=radio] {
+ border-radius: 50%;
}
-
-.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #28a745;
+.form-check-input:active {
+ filter: brightness(90%);
}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
- border-color: #28a745;
+.form-check-input:focus {
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
-
-.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
- border-color: #28a745;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+.form-check-input:checked {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
}
-
-.invalid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #dc3545;
+.form-check-input:checked[type=checkbox] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e");
}
-
-.invalid-tooltip {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: .1rem;
- font-size: 0.875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(220, 53, 69, 0.9);
- border-radius: 0.25rem;
+.form-check-input:checked[type=radio] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
}
-
-.was-validated :invalid ~ .invalid-feedback,
-.was-validated :invalid ~ .invalid-tooltip,
-.is-invalid ~ .invalid-feedback,
-.is-invalid ~ .invalid-tooltip {
- display: block;
+.form-check-input[type=checkbox]:indeterminate {
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
}
-
-.was-validated .form-control:invalid, .form-control.is-invalid {
- border-color: #dc3545;
- padding-right: calc(1.5em + 0.75rem);
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+.form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
}
-
-.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {
+ opacity: 0.5;
}
-.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+.form-switch {
+ padding-left: 2.5em;
}
-
-.was-validated .custom-select:invalid, .custom-select.is-invalid {
- border-color: #dc3545;
- padding-right: calc(0.75em + 2.3125rem);
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+.form-switch .form-check-input {
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
}
-
-.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+@media (prefers-reduced-motion: reduce) {
+ .form-switch .form-check-input {
+ transition: none;
+ }
}
-
-.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
- color: #dc3545;
+.form-switch .form-check-input:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
}
-
-.was-validated .form-check-input:invalid ~ .invalid-feedback,
-.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
-.form-check-input.is-invalid ~ .invalid-tooltip {
- display: block;
+.form-switch .form-check-input:checked {
+ background-position: right center;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
}
-.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
- color: #dc3545;
+.form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
}
-.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
- border-color: #dc3545;
+.btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
}
-
-.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
- border-color: #e4606d;
- background-color: #e4606d;
+.btn-check[disabled] + .btn, .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
}
-.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+.form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
}
-
-.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #dc3545;
+.form-range:focus {
+ outline: 0;
}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
- border-color: #dc3545;
+.form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
-
-.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
- border-color: #dc3545;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+.form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
-
-.form-inline {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -ms-flex-align: center;
- align-items: center;
+.form-range::-moz-focus-outer {
+ border: 0;
}
-
-.form-inline .form-check {
- width: 100%;
+.form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none;
}
-
-@media (min-width: 576px) {
- .form-inline label {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- margin-bottom: 0;
- }
- .form-inline .form-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -ms-flex-align: center;
- align-items: center;
- margin-bottom: 0;
- }
- .form-inline .form-control {
- display: inline-block;
- width: auto;
- vertical-align: middle;
- }
- .form-inline .form-control-plaintext {
- display: inline-block;
- }
- .form-inline .input-group,
- .form-inline .custom-select {
- width: auto;
- }
- .form-inline .form-check {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: auto;
- padding-left: 0;
- }
- .form-inline .form-check-input {
- position: relative;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- margin-top: 0;
- margin-right: 0.25rem;
- margin-left: 0;
- }
- .form-inline .custom-control {
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- }
- .form-inline .custom-control-label {
- margin-bottom: 0;
+@media (prefers-reduced-motion: reduce) {
+ .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
}
}
-
-.btn {
- display: inline-block;
- font-weight: 400;
- color: #212529;
- text-align: center;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- line-height: 1.5;
- border-radius: 0.25rem;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+.form-range::-webkit-slider-thumb:active {
+ background-color: #b6d4fe;
+}
+.form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+.form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #0d6efd;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none;
}
-
@media (prefers-reduced-motion: reduce) {
- .btn {
+ .form-range::-moz-range-thumb {
+ -moz-transition: none;
transition: none;
}
}
-
-.btn:hover {
- color: #212529;
- text-decoration: none;
-}
-
-.btn:focus, .btn.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.btn.disabled, .btn:disabled {
- opacity: 0.65;
+.form-range::-moz-range-thumb:active {
+ background-color: #b6d4fe;
}
-
-.btn:not(:disabled):not(.disabled) {
+.form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
}
-
-a.btn.disabled,
-fieldset:disabled a.btn {
+.form-range:disabled {
pointer-events: none;
}
-
-.btn-primary {
- color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+.form-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
}
-
-.btn-primary:hover {
- color: #fff;
- background-color: #0069d9;
- border-color: #0062cc;
+.form-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
}
-.btn-primary:focus, .btn-primary.focus {
- color: #fff;
- background-color: #0069d9;
- border-color: #0062cc;
- box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
+.form-floating {
+ position: relative;
}
-
-.btn-primary.disabled, .btn-primary:disabled {
- color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+.form-floating > .form-control,
+.form-floating > .form-select {
+ height: calc(3.5rem + 2px);
+ padding: 1rem 0.75rem;
}
-
-.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
-.show > .btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #0062cc;
- border-color: #005cbf;
+.form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ pointer-events: none;
+ border: 1px solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
}
-
-.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
+@media (prefers-reduced-motion: reduce) {
+ .form-floating > label {
+ transition: none;
+ }
}
-
-.btn-secondary {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+.form-floating > .form-control::-moz-placeholder {
+ color: transparent;
}
-
-.btn-secondary:hover {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
+.form-floating > .form-control::placeholder {
+ color: transparent;
}
-
-.btn-secondary:focus, .btn-secondary.focus {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
+.form-floating > .form-control:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
}
-
-.btn-secondary.disabled, .btn-secondary:disabled {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
}
-
-.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-secondary.dropdown-toggle {
- color: #fff;
- background-color: #545b62;
- border-color: #4e555b;
+.form-floating > .form-control:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
}
-
-.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
+.form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
}
-
-.btn-success {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
+.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}
-
-.btn-success:hover {
- color: #fff;
- background-color: #218838;
- border-color: #1e7e34;
+.form-floating > .form-control:focus ~ label,
+.form-floating > .form-control:not(:placeholder-shown) ~ label,
+.form-floating > .form-select ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}
-
-.btn-success:focus, .btn-success.focus {
- color: #fff;
- background-color: #218838;
- border-color: #1e7e34;
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
+.form-floating > .form-control:-webkit-autofill ~ label {
+ opacity: 0.65;
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}
-.btn-success.disabled, .btn-success:disabled {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
+.input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
}
-
-.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
-.show > .btn-success.dropdown-toggle {
- color: #fff;
- background-color: #1e7e34;
- border-color: #1c7430;
+.input-group > .form-control,
+.input-group > .form-select {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
}
-
-.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
+.input-group > .form-control:focus,
+.input-group > .form-select:focus {
+ z-index: 3;
}
-
-.btn-info {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
+.input-group .btn {
+ position: relative;
+ z-index: 2;
}
-
-.btn-info:hover {
- color: #fff;
- background-color: #138496;
- border-color: #117a8b;
+.input-group .btn:focus {
+ z-index: 3;
}
-.btn-info:focus, .btn-info.focus {
- color: #fff;
- background-color: #138496;
- border-color: #117a8b;
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
+.input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #ced4da;
+ border-radius: 0.25rem;
}
-.btn-info.disabled, .btn-info:disabled {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
+.input-group-lg > .form-control,
+.input-group-lg > .form-select,
+.input-group-lg > .input-group-text,
+.input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.3rem;
}
-.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
-.show > .btn-info.dropdown-toggle {
- color: #fff;
- background-color: #117a8b;
- border-color: #10707f;
+.input-group-sm > .form-control,
+.input-group-sm > .form-select,
+.input-group-sm > .input-group-text,
+.input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
}
-.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
+.input-group-lg > .form-select,
+.input-group-sm > .form-select {
+ padding-right: 3rem;
}
-.btn-warning {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
+.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
+.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
}
-
-.btn-warning:hover {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
+.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),
+.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
}
-
-.btn-warning:focus, .btn-warning.focus {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
+.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: -1px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
}
-.btn-warning.disabled, .btn-warning:disabled {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #198754;
}
-.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,
-.show > .btn-warning.dropdown-toggle {
- color: #212529;
- background-color: #d39e00;
- border-color: #c69500;
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: rgba(25, 135, 84, 0.9);
+ border-radius: 0.25rem;
}
-.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
+.was-validated :valid ~ .valid-feedback,
+.was-validated :valid ~ .valid-tooltip,
+.is-valid ~ .valid-feedback,
+.is-valid ~ .valid-tooltip {
+ display: block;
}
-.btn-danger {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+.was-validated .form-control:valid, .form-control.is-valid {
+ border-color: #198754;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
-
-.btn-danger:hover {
- color: #fff;
- background-color: #c82333;
- border-color: #bd2130;
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
}
-.btn-danger:focus, .btn-danger.focus {
- color: #fff;
- background-color: #c82333;
- border-color: #bd2130;
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
}
-.btn-danger.disabled, .btn-danger:disabled {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+.was-validated .form-select:valid, .form-select.is-valid {
+ border-color: #198754;
}
-
-.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
-.show > .btn-danger.dropdown-toggle {
- color: #fff;
- background-color: #bd2130;
- border-color: #b21f2d;
+.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
-
-.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
+.was-validated .form-select:valid:focus, .form-select.is-valid:focus {
+ border-color: #198754;
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
}
-.btn-light {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+.was-validated .form-check-input:valid, .form-check-input.is-valid {
+ border-color: #198754;
}
-
-.btn-light:hover {
- color: #212529;
- background-color: #e2e6ea;
- border-color: #dae0e5;
+.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {
+ background-color: #198754;
}
-
-.btn-light:focus, .btn-light.focus {
- color: #212529;
- background-color: #e2e6ea;
- border-color: #dae0e5;
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
+.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
}
-
-.btn-light.disabled, .btn-light:disabled {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+ color: #198754;
}
-.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,
-.show > .btn-light.dropdown-toggle {
- color: #212529;
- background-color: #dae0e5;
- border-color: #d3d9df;
+.form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
}
-.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
+.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,
+.was-validated .input-group .form-select:valid,
+.input-group .form-select.is-valid {
+ z-index: 1;
+}
+.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,
+.was-validated .input-group .form-select:valid:focus,
+.input-group .form-select.is-valid:focus {
+ z-index: 3;
}
-.btn-dark {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: #dc3545;
}
-.btn-dark:hover {
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
color: #fff;
- background-color: #23272b;
- border-color: #1d2124;
+ background-color: rgba(220, 53, 69, 0.9);
+ border-radius: 0.25rem;
}
-.btn-dark:focus, .btn-dark.focus {
- color: #fff;
- background-color: #23272b;
- border-color: #1d2124;
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
+.was-validated :invalid ~ .invalid-feedback,
+.was-validated :invalid ~ .invalid-tooltip,
+.is-invalid ~ .invalid-feedback,
+.is-invalid ~ .invalid-tooltip {
+ display: block;
}
-.btn-dark.disabled, .btn-dark:disabled {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
+.was-validated .form-control:invalid, .form-control.is-invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
}
-.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,
-.show > .btn-dark.dropdown-toggle {
- color: #fff;
- background-color: #1d2124;
- border-color: #171a1d;
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
}
-.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
+.was-validated .form-select:invalid, .form-select.is-invalid {
+ border-color: #dc3545;
+}
+.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] {
+ padding-right: 4.125rem;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
}
-.btn-outline-primary {
- color: #007bff;
- border-color: #007bff;
+.was-validated .form-check-input:invalid, .form-check-input.is-invalid {
+ border-color: #dc3545;
+}
+.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {
+ background-color: #dc3545;
+}
+.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
+}
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+ color: #dc3545;
}
-.btn-outline-primary:hover {
- color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+.form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
}
-.btn-outline-primary:focus, .btn-outline-primary.focus {
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,
+.was-validated .input-group .form-select:invalid,
+.input-group .form-select.is-invalid {
+ z-index: 2;
+}
+.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,
+.was-validated .input-group .form-select:invalid:focus,
+.input-group .form-select.is-invalid:focus {
+ z-index: 3;
}
-.btn-outline-primary.disabled, .btn-outline-primary:disabled {
- color: #007bff;
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
background-color: transparent;
+ border: 1px solid transparent;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ border-radius: 0.25rem;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+.btn:hover {
+ color: #212529;
+}
+.btn-check:focus + .btn, .btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+.btn:disabled, .btn.disabled, fieldset:disabled .btn {
+ pointer-events: none;
+ opacity: 0.65;
}
-.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-primary.dropdown-toggle {
+.btn-primary {
color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
}
-
-.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+.btn-primary:hover {
+ color: #fff;
+ background-color: #0b5ed7;
+ border-color: #0a58ca;
}
-
-.btn-outline-secondary {
- color: #6c757d;
- border-color: #6c757d;
+.btn-check:focus + .btn-primary, .btn-primary:focus {
+ color: #fff;
+ background-color: #0b5ed7;
+ border-color: #0a58ca;
+ box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
}
-
-.btn-outline-secondary:hover {
+.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {
color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+ background-color: #0a58ca;
+ border-color: #0a53be;
}
-
-.btn-outline-secondary:focus, .btn-outline-secondary.focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
}
-
-.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
- color: #6c757d;
- background-color: transparent;
+.btn-primary:disabled, .btn-primary.disabled {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
}
-.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-secondary.dropdown-toggle {
+.btn-secondary {
color: #fff;
background-color: #6c757d;
border-color: #6c757d;
}
-
-.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-success {
- color: #28a745;
- border-color: #28a745;
+.btn-secondary:hover {
+ color: #fff;
+ background-color: #5c636a;
+ border-color: #565e64;
}
-
-.btn-outline-success:hover {
+.btn-check:focus + .btn-secondary, .btn-secondary:focus {
color: #fff;
- background-color: #28a745;
- border-color: #28a745;
+ background-color: #5c636a;
+ border-color: #565e64;
+ box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
}
-
-.btn-outline-success:focus, .btn-outline-success.focus {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #565e64;
+ border-color: #51585e;
}
-
-.btn-outline-success.disabled, .btn-outline-success:disabled {
- color: #28a745;
- background-color: transparent;
+.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
}
-
-.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
-.show > .btn-outline-success.dropdown-toggle {
+.btn-secondary:disabled, .btn-secondary.disabled {
color: #fff;
- background-color: #28a745;
- border-color: #28a745;
+ background-color: #6c757d;
+ border-color: #6c757d;
}
-.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+.btn-success {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
}
-
-.btn-outline-info {
- color: #17a2b8;
- border-color: #17a2b8;
+.btn-success:hover {
+ color: #fff;
+ background-color: #157347;
+ border-color: #146c43;
}
-
-.btn-outline-info:hover {
+.btn-check:focus + .btn-success, .btn-success:focus {
color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
+ background-color: #157347;
+ border-color: #146c43;
+ box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
}
-
-.btn-outline-info:focus, .btn-outline-info.focus {
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #146c43;
+ border-color: #13653f;
}
-
-.btn-outline-info.disabled, .btn-outline-info:disabled {
- color: #17a2b8;
- background-color: transparent;
+.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
}
-
-.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
-.show > .btn-outline-info.dropdown-toggle {
+.btn-success:disabled, .btn-success.disabled {
color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
+ background-color: #198754;
+ border-color: #198754;
}
-.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+.btn-info {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
}
-
-.btn-outline-warning {
- color: #ffc107;
- border-color: #ffc107;
+.btn-info:hover {
+ color: #000;
+ background-color: #31d2f2;
+ border-color: #25cff2;
}
-
-.btn-outline-warning:hover {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
+.btn-check:focus + .btn-info, .btn-info:focus {
+ color: #000;
+ background-color: #31d2f2;
+ border-color: #25cff2;
+ box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
}
-
-.btn-outline-warning:focus, .btn-outline-warning.focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {
+ color: #000;
+ background-color: #3dd5f3;
+ border-color: #25cff2;
}
-
-.btn-outline-warning.disabled, .btn-outline-warning:disabled {
- color: #ffc107;
- background-color: transparent;
+.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
+}
+.btn-info:disabled, .btn-info.disabled {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
}
-.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
-.show > .btn-outline-warning.dropdown-toggle {
- color: #212529;
+.btn-warning {
+ color: #000;
background-color: #ffc107;
border-color: #ffc107;
}
-
-.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+.btn-warning:hover {
+ color: #000;
+ background-color: #ffca2c;
+ border-color: #ffc720;
}
-
-.btn-outline-danger {
- color: #dc3545;
- border-color: #dc3545;
+.btn-check:focus + .btn-warning, .btn-warning:focus {
+ color: #000;
+ background-color: #ffca2c;
+ border-color: #ffc720;
+ box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+}
+.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {
+ color: #000;
+ background-color: #ffcd39;
+ border-color: #ffc720;
+}
+.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+}
+.btn-warning:disabled, .btn-warning.disabled {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
}
-.btn-outline-danger:hover {
+.btn-danger {
color: #fff;
background-color: #dc3545;
border-color: #dc3545;
}
-
-.btn-outline-danger:focus, .btn-outline-danger.focus {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+.btn-danger:hover {
+ color: #fff;
+ background-color: #bb2d3b;
+ border-color: #b02a37;
}
-
-.btn-outline-danger.disabled, .btn-outline-danger:disabled {
- color: #dc3545;
- background-color: transparent;
+.btn-check:focus + .btn-danger, .btn-danger:focus {
+ color: #fff;
+ background-color: #bb2d3b;
+ border-color: #b02a37;
+ box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
-.show > .btn-outline-danger.dropdown-toggle {
+.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {
color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+ background-color: #b02a37;
+ border-color: #a52834;
}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
}
-
-.btn-outline-light {
- color: #f8f9fa;
- border-color: #f8f9fa;
+.btn-danger:disabled, .btn-danger.disabled {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
}
-.btn-outline-light:hover {
- color: #212529;
+.btn-light {
+ color: #000;
background-color: #f8f9fa;
border-color: #f8f9fa;
}
-
-.btn-outline-light:focus, .btn-outline-light.focus {
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+.btn-light:hover {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
}
-
-.btn-outline-light.disabled, .btn-outline-light:disabled {
- color: #f8f9fa;
- background-color: transparent;
+.btn-check:focus + .btn-light, .btn-light:focus {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
+ box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
}
-
-.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
-.show > .btn-outline-light.dropdown-toggle {
- color: #212529;
+.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
+}
+.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
+}
+.btn-light:disabled, .btn-light.disabled {
+ color: #000;
background-color: #f8f9fa;
border-color: #f8f9fa;
}
-.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+.btn-dark {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
}
-
-.btn-outline-dark {
- color: #343a40;
- border-color: #343a40;
+.btn-dark:hover {
+ color: #fff;
+ background-color: #1c1f23;
+ border-color: #1a1e21;
}
-
-.btn-outline-dark:hover {
+.btn-check:focus + .btn-dark, .btn-dark:focus {
color: #fff;
- background-color: #343a40;
- border-color: #343a40;
+ background-color: #1c1f23;
+ border-color: #1a1e21;
+ box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
}
-
-.btn-outline-dark:focus, .btn-outline-dark.focus {
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #1a1e21;
+ border-color: #191c1f;
}
-
-.btn-outline-dark.disabled, .btn-outline-dark:disabled {
- color: #343a40;
- background-color: transparent;
+.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
}
-
-.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
-.show > .btn-outline-dark.dropdown-toggle {
+.btn-dark:disabled, .btn-dark.disabled {
color: #fff;
- background-color: #343a40;
- border-color: #343a40;
+ background-color: #212529;
+ border-color: #212529;
}
-.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+.btn-outline-primary {
+ color: #0d6efd;
+ border-color: #0d6efd;
}
-
-.btn-link {
- font-weight: 400;
- color: #007bff;
- text-decoration: none;
+.btn-outline-primary:hover {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
}
-
-.btn-link:hover {
- color: #0056b3;
- text-decoration: underline;
+.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
}
-
-.btn-link:focus, .btn-link.focus {
- text-decoration: underline;
+.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
}
-
-.btn-link:disabled, .btn-link.disabled {
- color: #6c757d;
- pointer-events: none;
+.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
}
-
-.btn-lg, .btn-group-lg > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0.3rem;
+.btn-outline-primary:disabled, .btn-outline-primary.disabled {
+ color: #0d6efd;
+ background-color: transparent;
}
-.btn-sm, .btn-group-sm > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0.2rem;
+.btn-outline-secondary {
+ color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-outline-secondary:hover {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+}
+.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+}
+.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {
+ color: #6c757d;
+ background-color: transparent;
}
-.btn-block {
- display: block;
- width: 100%;
+.btn-outline-success {
+ color: #198754;
+ border-color: #198754;
+}
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+}
+.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+}
+.btn-outline-success:disabled, .btn-outline-success.disabled {
+ color: #198754;
+ background-color: transparent;
+}
+
+.btn-outline-info {
+ color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-outline-info:hover {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+}
+.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+}
+.btn-outline-info:disabled, .btn-outline-info.disabled {
+ color: #0dcaf0;
+ background-color: transparent;
}
-.btn-block + .btn-block {
- margin-top: 0.5rem;
+.btn-outline-warning {
+ color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-outline-warning:hover {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+}
+.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+}
+.btn-outline-warning:disabled, .btn-outline-warning.disabled {
+ color: #ffc107;
+ background-color: transparent;
}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
+.btn-outline-danger {
+ color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-outline-danger:hover {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+}
+.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+}
+.btn-outline-danger:disabled, .btn-outline-danger.disabled {
+ color: #dc3545;
+ background-color: transparent;
+}
+
+.btn-outline-light {
+ color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-outline-light:hover {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+}
+.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+}
+.btn-outline-light:disabled, .btn-outline-light.disabled {
+ color: #f8f9fa;
+ background-color: transparent;
+}
+
+.btn-outline-dark {
+ color: #212529;
+ border-color: #212529;
+}
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+}
+.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+}
+.btn-outline-dark:disabled, .btn-outline-dark.disabled {
+ color: #212529;
+ background-color: transparent;
+}
+
+.btn-link {
+ font-weight: 400;
+ color: #0d6efd;
+ text-decoration: underline;
+}
+.btn-link:hover {
+ color: #0a58ca;
+}
+.btn-link:disabled, .btn-link.disabled {
+ color: #6c757d;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.3rem;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
}
.fade {
transition: opacity 0.15s linear;
}
-
@media (prefers-reduced-motion: reduce) {
.fade {
transition: none;
}
}
-
.fade:not(.show) {
opacity: 0;
}
@@ -3162,12 +3406,10 @@ input[type="button"].btn-block {
}
.collapsing {
- position: relative;
height: 0;
overflow: hidden;
transition: height 0.35s ease;
}
-
@media (prefers-reduced-motion: reduce) {
.collapsing {
transition: none;
@@ -3175,16 +3417,15 @@ input[type="button"].btn-block {
}
.dropup,
-.dropright,
+.dropend,
.dropdown,
-.dropleft {
+.dropstart {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
}
-
.dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
@@ -3195,21 +3436,17 @@ input[type="button"].btn-block {
border-bottom: 0;
border-left: 0.3em solid transparent;
}
-
.dropdown-toggle:empty::after {
margin-left: 0;
}
.dropdown-menu {
position: absolute;
- top: 100%;
- left: 0;
z-index: 1000;
display: none;
- float: left;
min-width: 10rem;
padding: 0.5rem 0;
- margin: 0.125rem 0 0;
+ margin: 0;
font-size: 1rem;
color: #212529;
text-align: left;
@@ -3219,68 +3456,119 @@ input[type="button"].btn-block {
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
}
-
-.dropdown-menu-left {
- right: auto;
+.dropdown-menu[data-bs-popper] {
+ top: 100%;
left: 0;
+ margin-top: 0.125rem;
}
-.dropdown-menu-right {
- right: 0;
- left: auto;
+.dropdown-menu-start {
+ --bs-position: start;
+}
+.dropdown-menu-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
+}
+
+.dropdown-menu-end {
+ --bs-position: end;
+}
+.dropdown-menu-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
}
@media (min-width: 576px) {
- .dropdown-menu-sm-left {
- right: auto;
- left: 0;
+ .dropdown-menu-sm-start {
+ --bs-position: start;
}
- .dropdown-menu-sm-right {
- right: 0;
- left: auto;
+ .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
}
-}
-@media (min-width: 768px) {
- .dropdown-menu-md-left {
- right: auto;
- left: 0;
+ .dropdown-menu-sm-end {
+ --bs-position: end;
}
- .dropdown-menu-md-right {
- right: 0;
- left: auto;
+ .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
}
}
+@media (min-width: 768px) {
+ .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-md-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
+ }
-@media (min-width: 992px) {
- .dropdown-menu-lg-left {
- right: auto;
- left: 0;
+ .dropdown-menu-md-end {
+ --bs-position: end;
}
- .dropdown-menu-lg-right {
- right: 0;
- left: auto;
+ .dropdown-menu-md-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
}
}
+@media (min-width: 992px) {
+ .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
+ }
+ .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
+ }
+}
@media (min-width: 1200px) {
- .dropdown-menu-xl-left {
- right: auto;
- left: 0;
+ .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
+ }
+
+ .dropdown-menu-xl-end {
+ --bs-position: end;
}
- .dropdown-menu-xl-right {
- right: 0;
- left: auto;
+ .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
}
}
+@media (min-width: 1400px) {
+ .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto /* rtl:ignore */;
+ left: 0 /* rtl:ignore */;
+ }
-.dropup .dropdown-menu {
+ .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0 /* rtl:ignore */;
+ left: auto /* rtl:ignore */;
+ }
+}
+.dropup .dropdown-menu[data-bs-popper] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: 0.125rem;
}
-
.dropup .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
@@ -3291,20 +3579,18 @@ input[type="button"].btn-block {
border-bottom: 0.3em solid;
border-left: 0.3em solid transparent;
}
-
.dropup .dropdown-toggle:empty::after {
margin-left: 0;
}
-.dropright .dropdown-menu {
+.dropend .dropdown-menu[data-bs-popper] {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: 0.125rem;
}
-
-.dropright .dropdown-toggle::after {
+.dropend .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
@@ -3314,35 +3600,30 @@ input[type="button"].btn-block {
border-bottom: 0.3em solid transparent;
border-left: 0.3em solid;
}
-
-.dropright .dropdown-toggle:empty::after {
+.dropend .dropdown-toggle:empty::after {
margin-left: 0;
}
-
-.dropright .dropdown-toggle::after {
+.dropend .dropdown-toggle::after {
vertical-align: 0;
}
-.dropleft .dropdown-menu {
+.dropstart .dropdown-menu[data-bs-popper] {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: 0.125rem;
}
-
-.dropleft .dropdown-toggle::after {
+.dropstart .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
content: "";
}
-
-.dropleft .dropdown-toggle::after {
+.dropstart .dropdown-toggle::after {
display: none;
}
-
-.dropleft .dropdown-toggle::before {
+.dropstart .dropdown-toggle::before {
display: inline-block;
margin-right: 0.255em;
vertical-align: 0.255em;
@@ -3351,54 +3632,44 @@ input[type="button"].btn-block {
border-right: 0.3em solid;
border-bottom: 0.3em solid transparent;
}
-
-.dropleft .dropdown-toggle:empty::after {
+.dropstart .dropdown-toggle:empty::after {
margin-left: 0;
}
-
-.dropleft .dropdown-toggle::before {
+.dropstart .dropdown-toggle::before {
vertical-align: 0;
}
-.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
- right: auto;
- bottom: auto;
-}
-
.dropdown-divider {
height: 0;
margin: 0.5rem 0;
overflow: hidden;
- border-top: 1px solid #e9ecef;
+ border-top: 1px solid rgba(0, 0, 0, 0.15);
}
.dropdown-item {
display: block;
width: 100%;
- padding: 0.25rem 1.5rem;
+ padding: 0.25rem 1rem;
clear: both;
font-weight: 400;
color: #212529;
text-align: inherit;
+ text-decoration: none;
white-space: nowrap;
background-color: transparent;
border: 0;
}
-
.dropdown-item:hover, .dropdown-item:focus {
- color: #16181b;
- text-decoration: none;
- background-color: #f8f9fa;
+ color: #1e2125;
+ background-color: #e9ecef;
}
-
.dropdown-item.active, .dropdown-item:active {
color: #fff;
text-decoration: none;
- background-color: #007bff;
+ background-color: #0d6efd;
}
-
.dropdown-item.disabled, .dropdown-item:disabled {
- color: #6c757d;
+ color: #adb5bd;
pointer-events: none;
background-color: transparent;
}
@@ -3409,7 +3680,7 @@ input[type="button"].btn-block {
.dropdown-header {
display: block;
- padding: 0.5rem 1.5rem;
+ padding: 0.5rem 1rem;
margin-bottom: 0;
font-size: 0.875rem;
color: #6c757d;
@@ -3418,31 +3689,59 @@ input[type="button"].btn-block {
.dropdown-item-text {
display: block;
- padding: 0.25rem 1.5rem;
+ padding: 0.25rem 1rem;
color: #212529;
}
+.dropdown-menu-dark {
+ color: #dee2e6;
+ background-color: #343a40;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {
+ color: #fff;
+ background-color: rgba(255, 255, 255, 0.15);
+}
+.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {
+ color: #fff;
+ background-color: #0d6efd;
+}
+.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {
+ color: #adb5bd;
+}
+.dropdown-menu-dark .dropdown-divider {
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item-text {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-header {
+ color: #adb5bd;
+}
+
.btn-group,
.btn-group-vertical {
position: relative;
- display: -ms-inline-flexbox;
display: inline-flex;
vertical-align: middle;
}
-
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
- -ms-flex: 1 1 auto;
flex: 1 1 auto;
}
-
+.btn-group > .btn-check:checked + .btn,
+.btn-group > .btn-check:focus + .btn,
.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
- z-index: 1;
-}
-
-.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn-check:checked + .btn,
+.btn-group-vertical > .btn-check:focus + .btn,
+.btn-group-vertical > .btn:hover,
.btn-group-vertical > .btn:focus,
.btn-group-vertical > .btn:active,
.btn-group-vertical > .btn.active {
@@ -3450,14 +3749,10 @@ input[type="button"].btn-block {
}
.btn-toolbar {
- display: -ms-flexbox;
display: flex;
- -ms-flex-wrap: wrap;
flex-wrap: wrap;
- -ms-flex-pack: start;
justify-content: flex-start;
}
-
.btn-toolbar .input-group {
width: auto;
}
@@ -3466,14 +3761,13 @@ input[type="button"].btn-block {
.btn-group > .btn-group:not(:first-child) {
margin-left: -1px;
}
-
.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
.btn-group > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-
-.btn-group > .btn:not(:first-child),
+.btn-group > .btn:nth-child(n+3),
+.btn-group > :not(.btn-check) + .btn,
.btn-group > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
@@ -3483,14 +3777,10 @@ input[type="button"].btn-block {
padding-right: 0.5625rem;
padding-left: 0.5625rem;
}
-
-.dropdown-toggle-split::after,
-.dropup .dropdown-toggle-split::after,
-.dropright .dropdown-toggle-split::after {
+.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {
margin-left: 0;
}
-
-.dropleft .dropdown-toggle-split::before {
+.dropstart .dropdown-toggle-split::before {
margin-right: 0;
}
@@ -3505,3404 +3795,3675 @@ input[type="button"].btn-block {
}
.btn-group-vertical {
- -ms-flex-direction: column;
flex-direction: column;
- -ms-flex-align: start;
align-items: flex-start;
- -ms-flex-pack: center;
justify-content: center;
}
-
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group {
width: 100%;
}
-
.btn-group-vertical > .btn:not(:first-child),
.btn-group-vertical > .btn-group:not(:first-child) {
margin-top: -1px;
}
-
.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
.btn-group-vertical > .btn-group:not(:last-child) > .btn {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
-
-.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn ~ .btn,
.btn-group-vertical > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
-.btn-group-toggle > .btn,
-.btn-group-toggle > .btn-group > .btn {
+.nav {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
margin-bottom: 0;
+ list-style: none;
}
-.btn-group-toggle > .btn input[type="radio"],
-.btn-group-toggle > .btn input[type="checkbox"],
-.btn-group-toggle > .btn-group > .btn input[type="radio"],
-.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
- position: absolute;
- clip: rect(0, 0, 0, 0);
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+ color: #0d6efd;
+ text-decoration: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .nav-link {
+ transition: none;
+ }
+}
+.nav-link:hover, .nav-link:focus {
+ color: #0a58ca;
+}
+.nav-link.disabled {
+ color: #6c757d;
pointer-events: none;
+ cursor: default;
}
-.input-group {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: stretch;
- align-items: stretch;
- width: 100%;
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6;
}
-
-.input-group > .form-control,
-.input-group > .form-control-plaintext,
-.input-group > .custom-select,
-.input-group > .custom-file {
- position: relative;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- width: 1%;
- min-width: 0;
- margin-bottom: 0;
-}
-
-.input-group > .form-control + .form-control,
-.input-group > .form-control + .custom-select,
-.input-group > .form-control + .custom-file,
-.input-group > .form-control-plaintext + .form-control,
-.input-group > .form-control-plaintext + .custom-select,
-.input-group > .form-control-plaintext + .custom-file,
-.input-group > .custom-select + .form-control,
-.input-group > .custom-select + .custom-select,
-.input-group > .custom-select + .custom-file,
-.input-group > .custom-file + .form-control,
-.input-group > .custom-file + .custom-select,
-.input-group > .custom-file + .custom-file {
- margin-left: -1px;
+.nav-tabs .nav-link {
+ margin-bottom: -1px;
+ background: none;
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
-
-.input-group > .form-control:focus,
-.input-group > .custom-select:focus,
-.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
- z-index: 3;
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ border-color: #e9ecef #e9ecef #dee2e6;
+ isolation: isolate;
}
-
-.input-group > .custom-file .custom-file-input:focus {
- z-index: 4;
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent;
}
-
-.input-group > .form-control:not(:last-child),
-.input-group > .custom-select:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff;
}
-
-.input-group > .form-control:not(:first-child),
-.input-group > .custom-select:not(:first-child) {
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.input-group > .custom-file {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.input-group > .custom-file:not(:last-child) .custom-file-label,
-.input-group > .custom-file:not(:last-child) .custom-file-label::after {
border-top-right-radius: 0;
- border-bottom-right-radius: 0;
}
-.input-group > .custom-file:not(:first-child) .custom-file-label {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
+.nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: 0.25rem;
}
-
-.input-group-prepend,
-.input-group-append {
- display: -ms-flexbox;
- display: flex;
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #0d6efd;
}
-.input-group-prepend .btn,
-.input-group-append .btn {
- position: relative;
- z-index: 2;
+.nav-fill > .nav-link,
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
}
-.input-group-prepend .btn:focus,
-.input-group-append .btn:focus {
- z-index: 3;
+.nav-justified > .nav-link,
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
}
-.input-group-prepend .btn + .btn,
-.input-group-prepend .btn + .input-group-text,
-.input-group-prepend .input-group-text + .input-group-text,
-.input-group-prepend .input-group-text + .btn,
-.input-group-append .btn + .btn,
-.input-group-append .btn + .input-group-text,
-.input-group-append .input-group-text + .input-group-text,
-.input-group-append .input-group-text + .btn {
- margin-left: -1px;
+.nav-fill .nav-item .nav-link,
+.nav-justified .nav-item .nav-link {
+ width: 100%;
}
-.input-group-prepend {
- margin-right: -1px;
+.tab-content > .tab-pane {
+ display: none;
}
-
-.input-group-append {
- margin-left: -1px;
+.tab-content > .active {
+ display: block;
}
-.input-group-text {
- display: -ms-flexbox;
+.navbar {
+ position: relative;
display: flex;
- -ms-flex-align: center;
+ flex-wrap: wrap;
align-items: center;
- padding: 0.375rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- text-align: center;
- white-space: nowrap;
- background-color: #e9ecef;
- border: 1px solid #ced4da;
- border-radius: 0.25rem;
-}
-
-.input-group-text input[type="radio"],
-.input-group-text input[type="checkbox"] {
- margin-top: 0;
-}
-
-.input-group-lg > .form-control:not(textarea),
-.input-group-lg > .custom-select {
- height: calc(1.5em + 1rem + 2px);
-}
-
-.input-group-lg > .form-control,
-.input-group-lg > .custom-select,
-.input-group-lg > .input-group-prepend > .input-group-text,
-.input-group-lg > .input-group-append > .input-group-text,
-.input-group-lg > .input-group-prepend > .btn,
-.input-group-lg > .input-group-append > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0.3rem;
-}
-
-.input-group-sm > .form-control:not(textarea),
-.input-group-sm > .custom-select {
- height: calc(1.5em + 0.5rem + 2px);
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .custom-select,
-.input-group-sm > .input-group-prepend > .input-group-text,
-.input-group-sm > .input-group-append > .input-group-text,
-.input-group-sm > .input-group-prepend > .btn,
-.input-group-sm > .input-group-append > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0.2rem;
-}
-
-.input-group-lg > .custom-select,
-.input-group-sm > .custom-select {
- padding-right: 1.75rem;
-}
-
-.input-group > .input-group-prepend > .btn,
-.input-group > .input-group-prepend > .input-group-text,
-.input-group > .input-group-append:not(:last-child) > .btn,
-.input-group > .input-group-append:not(:last-child) > .input-group-text,
-.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.input-group > .input-group-append > .btn,
-.input-group > .input-group-append > .input-group-text,
-.input-group > .input-group-prepend:not(:first-child) > .btn,
-.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
-.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
-.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
+ justify-content: space-between;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
}
-
-.custom-control {
- position: relative;
- z-index: 1;
- display: block;
- min-height: 1.5rem;
- padding-left: 1.5rem;
- -webkit-print-color-adjust: exact;
- color-adjust: exact;
+.navbar > .container,
+.navbar > .container-fluid,
+.navbar > .container-sm,
+.navbar > .container-md,
+.navbar > .container-lg,
+.navbar > .container-xl,
+.navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
}
-
-.custom-control-inline {
- display: -ms-inline-flexbox;
- display: inline-flex;
+.navbar-brand {
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
margin-right: 1rem;
+ font-size: 1.25rem;
+ text-decoration: none;
+ white-space: nowrap;
}
-
-.custom-control-input {
- position: absolute;
- left: 0;
- z-index: -1;
- width: 1rem;
- height: 1.25rem;
- opacity: 0;
-}
-
-.custom-control-input:checked ~ .custom-control-label::before {
- color: #fff;
- border-color: #007bff;
- background-color: #007bff;
-}
-
-.custom-control-input:focus ~ .custom-control-label::before {
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #80bdff;
-}
-
-.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
- color: #fff;
- background-color: #b3d7ff;
- border-color: #b3d7ff;
-}
-
-.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {
- color: #6c757d;
-}
-
-.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {
- background-color: #e9ecef;
-}
-
-.custom-control-label {
- position: relative;
+.navbar-nav {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
margin-bottom: 0;
- vertical-align: top;
-}
-
-.custom-control-label::before {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- pointer-events: none;
- content: "";
- background-color: #fff;
- border: #adb5bd solid 1px;
-}
-
-.custom-control-label::after {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- content: "";
- background: no-repeat 50% / 50% 50%;
-}
-
-.custom-checkbox .custom-control-label::before {
- border-radius: 0.25rem;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e");
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
- border-color: #007bff;
- background-color: #007bff;
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
-}
-
-.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(0, 123, 255, 0.5);
-}
-
-.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
- background-color: rgba(0, 123, 255, 0.5);
-}
-
-.custom-radio .custom-control-label::before {
- border-radius: 50%;
+ list-style: none;
}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
}
-
-.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(0, 123, 255, 0.5);
+.navbar-nav .dropdown-menu {
+ position: static;
}
-.custom-switch {
- padding-left: 2.25rem;
+.navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
}
-.custom-switch .custom-control-label::before {
- left: -2.25rem;
- width: 1.75rem;
- pointer-events: all;
- border-radius: 0.5rem;
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
}
-.custom-switch .custom-control-label::after {
- top: calc(0.25rem + 2px);
- left: calc(-2.25rem + 2px);
- width: calc(1rem - 4px);
- height: calc(1rem - 4px);
- background-color: #adb5bd;
- border-radius: 0.5rem;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
- transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+.navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
+ transition: box-shadow 0.15s ease-in-out;
}
-
@media (prefers-reduced-motion: reduce) {
- .custom-switch .custom-control-label::after {
+ .navbar-toggler {
transition: none;
}
}
-
-.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
- background-color: #fff;
- -webkit-transform: translateX(0.75rem);
- transform: translateX(0.75rem);
+.navbar-toggler:hover {
+ text-decoration: none;
}
-
-.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(0, 123, 255, 0.5);
+.navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem;
}
-.custom-select {
+.navbar-toggler-icon {
display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 1.75rem 0.375rem 0.75rem;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
+ width: 1.5em;
+ height: 1.5em;
vertical-align: middle;
- background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
- border: 1px solid #ced4da;
- border-radius: 0.25rem;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-
-.custom-select:focus {
- border-color: #80bdff;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-.custom-select:focus::-ms-value {
- color: #495057;
- background-color: #fff;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
}
-.custom-select[multiple], .custom-select[size]:not([size="1"]) {
- height: auto;
- padding-right: 0.75rem;
- background-image: none;
+.navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
}
-.custom-select:disabled {
- color: #6c757d;
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+}
+@media (min-width: 1400px) {
+ .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+}
+.navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+.navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+}
+.navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+.navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.55);
+}
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+ color: rgba(0, 0, 0, 0.7);
+}
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3);
+}
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .nav-link.active {
+ color: rgba(0, 0, 0, 0.9);
+}
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.55);
+ border-color: rgba(0, 0, 0, 0.1);
+}
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.55);
+}
+.navbar-light .navbar-text a,
+.navbar-light .navbar-text a:hover,
+.navbar-light .navbar-text a:focus {
+ color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-dark .navbar-brand {
+ color: #fff;
+}
+.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+ color: #fff;
+}
+.navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.55);
+}
+.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+ color: rgba(255, 255, 255, 0.75);
+}
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .nav-link.active {
+ color: #fff;
+}
+.navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, 0.55);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, 0.55);
+}
+.navbar-dark .navbar-text a,
+.navbar-dark .navbar-text a:hover,
+.navbar-dark .navbar-text a:focus {
+ color: #fff;
+}
+
+.card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: 0.25rem;
+}
+.card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+.card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+.card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+.card > .card-header + .list-group,
+.card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.card-body {
+ flex: 1 1 auto;
+ padding: 1rem 1rem;
+}
+
+.card-title {
+ margin-bottom: 0.5rem;
+}
+
+.card-subtitle {
+ margin-top: -0.25rem;
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link:hover {
+ text-decoration: none;
+}
+.card-link + .card-link {
+ margin-left: 1rem;
+}
+
+.card-header {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-header:first-child {
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+}
+
+.card-footer {
+ padding: 0.5rem 1rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-footer:last-child {
+ border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+
+.card-header-tabs {
+ margin-right: -0.5rem;
+ margin-bottom: -0.5rem;
+ margin-left: -0.5rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -0.5rem;
+ margin-left: -0.5rem;
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1rem;
+ border-radius: calc(0.25rem - 1px);
+}
+
+.card-img,
+.card-img-top,
+.card-img-bottom {
+ width: 100%;
+}
+
+.card-img,
+.card-img-top {
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+
+.card-img,
+.card-img-bottom {
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+
+.card-group > .card {
+ margin-bottom: 0.75rem;
+}
+@media (min-width: 576px) {
+ .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+ .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+ .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+ .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-img-top,
+.card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-img-bottom,
+.card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-img-top,
+.card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-img-bottom,
+.card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+.accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: 1rem 1.25rem;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ background-color: #fff;
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .accordion-button {
+ transition: none;
+ }
+}
+.accordion-button:not(.collapsed) {
+ color: #0c63e4;
+ background-color: #e7f1ff;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);
+}
+.accordion-button:not(.collapsed)::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ transform: rotate(-180deg);
+}
+.accordion-button::after {
+ flex-shrink: 0;
+ width: 1.25rem;
+ height: 1.25rem;
+ margin-left: auto;
+ content: "";
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-size: 1.25rem;
+ transition: transform 0.2s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .accordion-button::after {
+ transition: none;
+ }
+}
+.accordion-button:hover {
+ z-index: 2;
+}
+.accordion-button:focus {
+ z-index: 3;
+ border-color: #86b7fe;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.accordion-header {
+ margin-bottom: 0;
+}
+
+.accordion-item {
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+}
+.accordion-item:first-of-type {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.accordion-item:first-of-type .accordion-button {
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+.accordion-item:last-of-type {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+.accordion-item:last-of-type .accordion-button.collapsed {
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+.accordion-item:last-of-type .accordion-collapse {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.accordion-body {
+ padding: 1rem 1.25rem;
+}
+
+.accordion-flush .accordion-collapse {
+ border-width: 0;
+}
+.accordion-flush .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+.accordion-flush .accordion-item:first-child {
+ border-top: 0;
+}
+.accordion-flush .accordion-item:last-child {
+ border-bottom: 0;
+}
+.accordion-flush .accordion-item .accordion-button {
+ border-radius: 0;
+}
+
+.breadcrumb {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 0 0;
+ margin-bottom: 1rem;
+ list-style: none;
+}
+
+.breadcrumb-item + .breadcrumb-item {
+ padding-left: 0.5rem;
+}
+.breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: 0.5rem;
+ color: #6c757d;
+ content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */;
+}
+.breadcrumb-item.active {
+ color: #6c757d;
+}
+
+.pagination {
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ color: #0d6efd;
+ text-decoration: none;
+ background-color: #fff;
+ border: 1px solid #dee2e6;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .page-link {
+ transition: none;
+ }
+}
+.page-link:hover {
+ z-index: 2;
+ color: #0a58ca;
background-color: #e9ecef;
+ border-color: #dee2e6;
+}
+.page-link:focus {
+ z-index: 3;
+ color: #0a58ca;
+ background-color: #e9ecef;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.page-item:not(:first-child) .page-link {
+ margin-left: -1px;
+}
+.page-item.active .page-link {
+ z-index: 3;
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.page-item.disabled .page-link {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: #fff;
+ border-color: #dee2e6;
+}
+
+.page-link {
+ padding: 0.375rem 0.75rem;
+}
+
+.page-item:first-child .page-link {
+ border-top-left-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+.page-item:last-child .page-link {
+ border-top-right-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem;
+}
+
+.pagination-lg .page-link {
+ padding: 0.75rem 1.5rem;
+ font-size: 1.25rem;
+}
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 0.3rem;
+ border-bottom-left-radius: 0.3rem;
+}
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 0.3rem;
+ border-bottom-right-radius: 0.3rem;
+}
+
+.pagination-sm .page-link {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+}
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: 0.2rem;
+ border-bottom-left-radius: 0.2rem;
+}
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: 0.2rem;
+ border-bottom-right-radius: 0.2rem;
}
-.custom-select::-ms-expand {
+.badge {
+ display: inline-block;
+ padding: 0.35em 0.65em;
+ font-size: 0.75em;
+ font-weight: 700;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: 0.25rem;
+}
+.badge:empty {
display: none;
}
-.custom-select:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 #495057;
+.btn .badge {
+ position: relative;
+ top: -1px;
}
-.custom-select-sm {
- height: calc(1.5em + 0.5rem + 2px);
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- padding-left: 0.5rem;
- font-size: 0.875rem;
+.alert {
+ position: relative;
+ padding: 1rem 1rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
}
-.custom-select-lg {
- height: calc(1.5em + 1rem + 2px);
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 1rem;
- font-size: 1.25rem;
+.alert-heading {
+ color: inherit;
}
-.custom-file {
- position: relative;
- display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin-bottom: 0;
+.alert-link {
+ font-weight: 700;
}
-.custom-file-input {
- position: relative;
+.alert-dismissible {
+ padding-right: 3rem;
+}
+.alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
z-index: 2;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin: 0;
- opacity: 0;
+ padding: 1.25rem 1rem;
+}
+
+.alert-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+ border-color: #b6d4fe;
+}
+.alert-primary .alert-link {
+ color: #06357a;
+}
+
+.alert-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+ border-color: #d3d6d8;
+}
+.alert-secondary .alert-link {
+ color: #34383c;
+}
+
+.alert-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+ border-color: #badbcc;
+}
+.alert-success .alert-link {
+ color: #0c4128;
+}
+
+.alert-info {
+ color: #055160;
+ background-color: #cff4fc;
+ border-color: #b6effb;
+}
+.alert-info .alert-link {
+ color: #04414d;
+}
+
+.alert-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+ border-color: #ffecb5;
+}
+.alert-warning .alert-link {
+ color: #523e02;
+}
+
+.alert-danger {
+ color: #842029;
+ background-color: #f8d7da;
+ border-color: #f5c2c7;
+}
+.alert-danger .alert-link {
+ color: #6a1a21;
+}
+
+.alert-light {
+ color: #636464;
+ background-color: #fefefe;
+ border-color: #fdfdfe;
+}
+.alert-light .alert-link {
+ color: #4f5050;
+}
+
+.alert-dark {
+ color: #141619;
+ background-color: #d3d3d4;
+ border-color: #bcbebf;
+}
+.alert-dark .alert-link {
+ color: #101214;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+.progress {
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: 0.75rem;
+ background-color: #e9ecef;
+ border-radius: 0.25rem;
+}
+
+.progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #0d6efd;
+ transition: width 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar {
+ transition: none;
+ }
}
-.custom-file-input:focus ~ .custom-file-label {
- border-color: #80bdff;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 1rem 1rem;
+}
+
+.progress-bar-animated {
+ -webkit-animation: 1s linear infinite progress-bar-stripes;
+ animation: 1s linear infinite progress-bar-stripes;
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+.list-group {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: 0.25rem;
}
-.custom-file-input[disabled] ~ .custom-file-label,
-.custom-file-input:disabled ~ .custom-file-label {
+.list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+.list-group-numbered > li::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit;
+}
+.list-group-item-action:hover, .list-group-item-action:focus {
+ z-index: 1;
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa;
+}
+.list-group-item-action:active {
+ color: #212529;
background-color: #e9ecef;
}
-.custom-file-input:lang(en) ~ .custom-file-label::after {
- content: "Browse";
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.5rem 1rem;
+ color: #212529;
+ text-decoration: none;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+}
+.list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: #fff;
+}
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+.list-group-item + .list-group-item.active {
+ margin-top: -1px;
+ border-top-width: 1px;
+}
+
+.list-group-horizontal {
+ flex-direction: row;
+}
+.list-group-horizontal > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+}
+.list-group-horizontal > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+}
+.list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+.list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+}
+.list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
}
-.custom-file-input ~ .custom-file-label[data-browse]::after {
- content: attr(data-browse);
+@media (min-width: 576px) {
+ .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ flex-direction: row;
+ }
+ .list-group-horizontal-md > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-md > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
}
-
-.custom-file-label {
- position: absolute;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 0.75rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- border: 1px solid #ced4da;
- border-radius: 0.25rem;
+@media (min-width: 992px) {
+ .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
}
-
-.custom-file-label::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- z-index: 3;
- display: block;
- height: calc(1.5em + 0.75rem);
- padding: 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- content: "Browse";
- background-color: #e9ecef;
- border-left: inherit;
- border-radius: 0 0.25rem 0.25rem 0;
+@media (min-width: 1200px) {
+ .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
}
-
-.custom-range {
- width: 100%;
- height: 1.4rem;
- padding: 0;
- background-color: transparent;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
+@media (min-width: 1400px) {
+ .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xxl > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
}
-
-.custom-range:focus {
- outline: none;
+.list-group-flush {
+ border-radius: 0;
}
-
-.custom-range:focus::-webkit-slider-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+.list-group-flush > .list-group-item {
+ border-width: 0 0 1px;
}
-
-.custom-range:focus::-moz-range-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+.list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
}
-.custom-range:focus::-ms-thumb {
- box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+.list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
}
-
-.custom-range::-moz-focus-outer {
- border: 0;
+.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
}
-
-.custom-range::-webkit-slider-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: -0.25rem;
- background-color: #007bff;
- border: 0;
- border-radius: 1rem;
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- -webkit-appearance: none;
- appearance: none;
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-webkit-slider-thumb {
- -webkit-transition: none;
- transition: none;
- }
+.list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
}
-
-.custom-range::-webkit-slider-thumb:active {
- background-color: #b3d7ff;
+.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
}
-
-.custom-range::-webkit-slider-runnable-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
}
-.custom-range::-moz-range-thumb {
- width: 1rem;
- height: 1rem;
- background-color: #007bff;
- border: 0;
- border-radius: 1rem;
- -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- -moz-appearance: none;
- appearance: none;
+.list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
}
-
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-moz-range-thumb {
- -moz-transition: none;
- transition: none;
- }
+.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
}
-
-.custom-range::-moz-range-thumb:active {
- background-color: #b3d7ff;
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
}
-.custom-range::-moz-range-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
+.list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
}
-
-.custom-range::-ms-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: 0;
- margin-right: 0.2rem;
- margin-left: 0.2rem;
- background-color: #007bff;
- border: 0;
- border-radius: 1rem;
- -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- appearance: none;
+.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
}
-
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-ms-thumb {
- -ms-transition: none;
- transition: none;
- }
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
}
-.custom-range::-ms-thumb:active {
- background-color: #b3d7ff;
+.list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
}
-
-.custom-range::-ms-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: transparent;
- border-color: transparent;
- border-width: 0.5rem;
+.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
}
-
-.custom-range::-ms-fill-lower {
- background-color: #dee2e6;
- border-radius: 1rem;
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
}
-.custom-range::-ms-fill-upper {
- margin-right: 15px;
- background-color: #dee2e6;
- border-radius: 1rem;
+.list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
}
-
-.custom-range:disabled::-webkit-slider-thumb {
- background-color: #adb5bd;
+.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
}
-
-.custom-range:disabled::-webkit-slider-runnable-track {
- cursor: default;
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
}
-.custom-range:disabled::-moz-range-thumb {
- background-color: #adb5bd;
+.list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
}
-
-.custom-range:disabled::-moz-range-track {
- cursor: default;
+.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
}
-
-.custom-range:disabled::-ms-thumb {
- background-color: #adb5bd;
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
}
-.custom-control-label::before,
-.custom-file-label,
-.custom-select {
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+.list-group-item-dark {
+ color: #141619;
+ background-color: #d3d3d4;
}
-
-@media (prefers-reduced-motion: reduce) {
- .custom-control-label::before,
- .custom-file-label,
- .custom-select {
- transition: none;
- }
+.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
}
-
-.nav {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
}
-.nav-link {
- display: block;
- padding: 0.5rem 1rem;
+.btn-close {
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: #000;
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.25rem;
+ opacity: 0.5;
}
-
-.nav-link:hover, .nav-link:focus {
+.btn-close:hover {
+ color: #000;
text-decoration: none;
+ opacity: 0.75;
}
-
-.nav-link.disabled {
- color: #6c757d;
+.btn-close:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ opacity: 1;
+}
+.btn-close:disabled, .btn-close.disabled {
pointer-events: none;
- cursor: default;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: 0.25;
}
-.nav-tabs {
- border-bottom: 1px solid #dee2e6;
+.btn-close-white {
+ filter: invert(1) grayscale(100%) brightness(200%);
}
-.nav-tabs .nav-item {
- margin-bottom: -1px;
+.toast {
+ width: 350px;
+ max-width: 100%;
+ font-size: 0.875rem;
+ pointer-events: auto;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-
-.nav-tabs .nav-link {
- border: 1px solid transparent;
- border-top-left-radius: 0.25rem;
- border-top-right-radius: 0.25rem;
+.toast:not(.showing):not(.show) {
+ opacity: 0;
+}
+.toast.hide {
+ display: none;
}
-.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
- border-color: #e9ecef #e9ecef #dee2e6;
+.toast-container {
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+.toast-container > :not(:last-child) {
+ margin-bottom: 0.75rem;
}
-.nav-tabs .nav-link.disabled {
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: 0.5rem 0.75rem;
color: #6c757d;
- background-color: transparent;
- border-color: transparent;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
}
-
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
- color: #495057;
- background-color: #fff;
- border-color: #dee2e6 #dee2e6 #fff;
+.toast-header .btn-close {
+ margin-right: -0.375rem;
+ margin-left: 0.75rem;
}
-.nav-tabs .dropdown-menu {
- margin-top: -1px;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
+.toast-body {
+ padding: 0.75rem;
+ word-wrap: break-word;
}
-.nav-pills .nav-link {
- border-radius: 0.25rem;
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
}
-.nav-pills .nav-link.active,
-.nav-pills .show > .nav-link {
- color: #fff;
- background-color: #007bff;
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
}
-
-.nav-fill > .nav-link,
-.nav-fill .nav-item {
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- text-align: center;
+.modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
}
-
-.nav-justified > .nav-link,
-.nav-justified .nav-item {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -ms-flex-positive: 1;
- flex-grow: 1;
- text-align: center;
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
}
-
-.tab-content > .tab-pane {
- display: none;
+.modal.show .modal-dialog {
+ transform: none;
+}
+.modal.modal-static .modal-dialog {
+ transform: scale(1.02);
}
-.tab-content > .active {
- display: block;
+.modal-dialog-scrollable {
+ height: calc(100% - 1rem);
+}
+.modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
}
-.navbar {
- position: relative;
- display: -ms-flexbox;
+.modal-dialog-centered {
display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: center;
align-items: center;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 0.5rem 1rem;
+ min-height: calc(100% - 1rem);
}
-.navbar .container,
-.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl {
- display: -ms-flexbox;
+.modal-content {
+ position: relative;
display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: justify;
- justify-content: space-between;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
+ outline: 0;
}
-.navbar-brand {
- display: inline-block;
- padding-top: 0.3125rem;
- padding-bottom: 0.3125rem;
- margin-right: 1rem;
- font-size: 1.25rem;
- line-height: inherit;
- white-space: nowrap;
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
}
-
-.navbar-brand:hover, .navbar-brand:focus {
- text-decoration: none;
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop.show {
+ opacity: 0.5;
}
-.navbar-nav {
- display: -ms-flexbox;
+.modal-header {
display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 1rem;
+ border-bottom: 1px solid #dee2e6;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
}
-
-.navbar-nav .nav-link {
- padding-right: 0;
- padding-left: 0;
+.modal-header .btn-close {
+ padding: 0.5rem 0.5rem;
+ margin: -0.5rem -0.5rem -0.5rem auto;
}
-.navbar-nav .dropdown-menu {
- position: static;
- float: none;
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.5;
}
-.navbar-text {
- display: inline-block;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
+.modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: 1rem;
}
-.navbar-collapse {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -ms-flex-align: center;
+.modal-footer {
+ display: flex;
+ flex-wrap: wrap;
+ flex-shrink: 0;
align-items: center;
+ justify-content: flex-end;
+ padding: 0.75rem;
+ border-top: 1px solid #dee2e6;
+ border-bottom-right-radius: calc(0.3rem - 1px);
+ border-bottom-left-radius: calc(0.3rem - 1px);
}
-
-.navbar-toggler {
- padding: 0.25rem 0.75rem;
- font-size: 1.25rem;
- line-height: 1;
- background-color: transparent;
- border: 1px solid transparent;
- border-radius: 0.25rem;
+.modal-footer > * {
+ margin: 0.25rem;
}
-.navbar-toggler:hover, .navbar-toggler:focus {
- text-decoration: none;
-}
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- content: "";
- background: no-repeat center center;
- background-size: 100% 100%;
-}
+ .modal-dialog-scrollable {
+ height: calc(100% - 3.5rem);
+ }
-@media (max-width: 575.98px) {
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
- padding-right: 0;
- padding-left: 0;
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.5rem);
}
-}
-@media (min-width: 576px) {
- .navbar-expand-sm {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ .modal-sm {
+ max-width: 300px;
}
- .navbar-expand-sm .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
+}
+@media (min-width: 992px) {
+ .modal-lg,
+.modal-xl {
+ max-width: 800px;
}
- .navbar-expand-sm .navbar-nav .dropdown-menu {
- position: absolute;
+}
+@media (min-width: 1200px) {
+ .modal-xl {
+ max-width: 1140px;
}
- .navbar-expand-sm .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
+}
+.modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+.modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+.modal-fullscreen .modal-header {
+ border-radius: 0;
+}
+.modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+.modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+
+@media (max-width: 575.98px) {
+ .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
}
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ .modal-fullscreen-sm-down .modal-header {
+ border-radius: 0;
}
- .navbar-expand-sm .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
+ .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
}
- .navbar-expand-sm .navbar-toggler {
- display: none;
+ .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
}
}
-
@media (max-width: 767.98px) {
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
- padding-right: 0;
- padding-left: 0;
+ .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
}
-}
-
-@media (min-width: 768px) {
- .navbar-expand-md {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ .modal-fullscreen-md-down .modal-header {
+ border-radius: 0;
}
- .navbar-expand-md .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
+ .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
}
- .navbar-expand-md .navbar-nav .dropdown-menu {
- position: absolute;
+ .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
}
- .navbar-expand-md .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
+}
+@media (max-width: 991.98px) {
+ .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
}
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ .modal-fullscreen-lg-down .modal-header {
+ border-radius: 0;
}
- .navbar-expand-md .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
+ .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
}
- .navbar-expand-md .navbar-toggler {
- display: none;
+ .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
}
}
-
-@media (max-width: 991.98px) {
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
- padding-right: 0;
- padding-left: 0;
+@media (max-width: 1199.98px) {
+ .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
}
-}
-
-@media (min-width: 992px) {
- .navbar-expand-lg {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ .modal-fullscreen-xl-down .modal-header {
+ border-radius: 0;
}
- .navbar-expand-lg .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
+ .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
}
- .navbar-expand-lg .navbar-nav .dropdown-menu {
- position: absolute;
+ .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
}
- .navbar-expand-lg .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
+}
+@media (max-width: 1399.98px) {
+ .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
}
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
}
- .navbar-expand-lg .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
+ .modal-fullscreen-xxl-down .modal-header {
+ border-radius: 0;
}
- .navbar-expand-lg .navbar-toggler {
- display: none;
+ .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
}
+ .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+}
+.tooltip {
+ position: absolute;
+ z-index: 1080;
+ display: block;
+ margin: 0;
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ opacity: 0;
+}
+.tooltip.show {
+ opacity: 0.9;
+}
+.tooltip .tooltip-arrow {
+ position: absolute;
+ display: block;
+ width: 0.8rem;
+ height: 0.4rem;
+}
+.tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
}
-@media (max-width: 1199.98px) {
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
- padding-right: 0;
- padding-left: 0;
- }
+.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {
+ padding: 0.4rem 0;
+}
+.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: 0.4rem 0.4rem 0;
+ border-top-color: #000;
}
-@media (min-width: 1200px) {
- .navbar-expand-xl {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-xl .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-xl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-xl .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-xl .navbar-toggler {
- display: none;
- }
+.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {
+ padding: 0 0.4rem;
+}
+.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: 0.4rem;
+ height: 0.8rem;
+}
+.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: 0.4rem 0.4rem 0.4rem 0;
+ border-right-color: #000;
}
-.navbar-expand {
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -ms-flex-pack: start;
- justify-content: flex-start;
+.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {
+ padding: 0.4rem 0;
+}
+.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 0.4rem 0.4rem;
+ border-bottom-color: #000;
}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
- padding-right: 0;
- padding-left: 0;
+.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {
+ padding: 0 0.4rem;
+}
+.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: 0.4rem;
+ height: 0.8rem;
+}
+.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: 0.4rem 0 0.4rem 0.4rem;
+ border-left-color: #000;
}
-.navbar-expand .navbar-nav {
- -ms-flex-direction: row;
- flex-direction: row;
+.tooltip-inner {
+ max-width: 200px;
+ padding: 0.25rem 0.5rem;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 0.25rem;
}
-.navbar-expand .navbar-nav .dropdown-menu {
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0 /* rtl:ignore */;
+ z-index: 1070;
+ display: block;
+ max-width: 276px;
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
+}
+.popover .popover-arrow {
+ position: absolute;
+ display: block;
+ width: 1rem;
+ height: 0.5rem;
+}
+.popover .popover-arrow::before, .popover .popover-arrow::after {
position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
}
-.navbar-expand .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
+.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-0.5rem - 1px);
+}
+.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-width: 0.5rem 0.5rem 0;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: 1px;
+ border-width: 0.5rem 0.5rem 0;
+ border-top-color: #fff;
}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-0.5rem - 1px);
+ width: 0.5rem;
+ height: 1rem;
+}
+.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-width: 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: 1px;
+ border-width: 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: #fff;
+}
+
+.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-0.5rem - 1px);
+}
+.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-width: 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: 1px;
+ border-width: 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: #fff;
+}
+.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 1rem;
+ margin-left: -0.5rem;
+ content: "";
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-0.5rem - 1px);
+ width: 0.5rem;
+ height: 1rem;
+}
+.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-width: 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: 1px;
+ border-width: 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: #fff;
}
-.navbar-expand .navbar-collapse {
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
+.popover-header {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ background-color: #f0f0f0;
+ border-bottom: 1px solid #d8d8d8;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
}
-
-.navbar-expand .navbar-toggler {
+.popover-header:empty {
display: none;
}
-.navbar-light .navbar-brand {
- color: rgba(0, 0, 0, 0.9);
+.popover-body {
+ padding: 1rem 1rem;
+ color: #212529;
}
-.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
- color: rgba(0, 0, 0, 0.9);
+.carousel {
+ position: relative;
}
-.navbar-light .navbar-nav .nav-link {
- color: rgba(0, 0, 0, 0.5);
+.carousel.pointer-event {
+ touch-action: pan-y;
}
-.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
- color: rgba(0, 0, 0, 0.7);
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
}
-
-.navbar-light .navbar-nav .nav-link.disabled {
- color: rgba(0, 0, 0, 0.3);
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
}
-.navbar-light .navbar-nav .show > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.show,
-.navbar-light .navbar-nav .nav-link.active {
- color: rgba(0, 0, 0, 0.9);
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease-in-out;
}
-
-.navbar-light .navbar-toggler {
- color: rgba(0, 0, 0, 0.5);
- border-color: rgba(0, 0, 0, 0.1);
+@media (prefers-reduced-motion: reduce) {
+ .carousel-item {
+ transition: none;
+ }
}
-.navbar-light .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: block;
}
-.navbar-light .navbar-text {
- color: rgba(0, 0, 0, 0.5);
+/* rtl:begin:ignore */
+.carousel-item-next:not(.carousel-item-start),
+.active.carousel-item-end {
+ transform: translateX(100%);
}
-.navbar-light .navbar-text a {
- color: rgba(0, 0, 0, 0.9);
+.carousel-item-prev:not(.carousel-item-end),
+.active.carousel-item-start {
+ transform: translateX(-100%);
}
-.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
- color: rgba(0, 0, 0, 0.9);
+/* rtl:end:ignore */
+.carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
}
-
-.navbar-dark .navbar-brand {
- color: #fff;
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-start,
+.carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
}
-
-.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
- color: #fff;
+.carousel-fade .active.carousel-item-start,
+.carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
}
-
-.navbar-dark .navbar-nav .nav-link {
- color: rgba(255, 255, 255, 0.5);
+@media (prefers-reduced-motion: reduce) {
+ .carousel-fade .active.carousel-item-start,
+.carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
}
-.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
- color: rgba(255, 255, 255, 0.75);
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
}
-
-.navbar-dark .navbar-nav .nav-link.disabled {
- color: rgba(255, 255, 255, 0.25);
+@media (prefers-reduced-motion: reduce) {
+ .carousel-control-prev,
+.carousel-control-next {
+ transition: none;
+ }
}
-
-.navbar-dark .navbar-nav .show > .nav-link,
-.navbar-dark .navbar-nav .active > .nav-link,
-.navbar-dark .navbar-nav .nav-link.show,
-.navbar-dark .navbar-nav .nav-link.active {
+.carousel-control-prev:hover, .carousel-control-prev:focus,
+.carousel-control-next:hover,
+.carousel-control-next:focus {
color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
}
-.navbar-dark .navbar-toggler {
- color: rgba(255, 255, 255, 0.5);
- border-color: rgba(255, 255, 255, 0.1);
+.carousel-control-prev {
+ left: 0;
}
-.navbar-dark .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+.carousel-control-next {
+ right: 0;
}
-.navbar-dark .navbar-text {
- color: rgba(255, 255, 255, 0.5);
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
}
-.navbar-dark .navbar-text a {
- color: #fff;
+/* rtl:options: {
+ "autoRename": true,
+ "stringMap":[ {
+ "name" : "prev-next",
+ "search" : "prev",
+ "replace" : "next"
+ } ]
+} */
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
}
-.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
- color: #fff;
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
}
-.card {
- position: relative;
- display: -ms-flexbox;
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- min-width: 0;
- word-wrap: break-word;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+ list-style: none;
+}
+.carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
background-color: #fff;
- background-clip: border-box;
- border: 1px solid rgba(0, 0, 0, 0.125);
- border-radius: 0.25rem;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+.carousel-indicators .active {
+ opacity: 1;
}
-.card > hr {
- margin-right: 0;
- margin-left: 0;
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
}
-.card > .list-group {
- border-top: inherit;
- border-bottom: inherit;
+.carousel-dark .carousel-control-prev-icon,
+.carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+.carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+.carousel-dark .carousel-caption {
+ color: #000;
}
-.card > .list-group:first-child {
- border-top-width: 0;
- border-top-left-radius: calc(0.25rem - 1px);
- border-top-right-radius: calc(0.25rem - 1px);
+@-webkit-keyframes spinner-border {
+ to {
+ transform: rotate(360deg) /* rtl:ignore */;
+ }
}
-.card > .list-group:last-child {
- border-bottom-width: 0;
- border-bottom-right-radius: calc(0.25rem - 1px);
- border-bottom-left-radius: calc(0.25rem - 1px);
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg) /* rtl:ignore */;
+ }
+}
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: -0.125em;
+ border: 0.25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: 0.75s linear infinite spinner-border;
+ animation: 0.75s linear infinite spinner-border;
}
-.card > .card-header + .list-group,
-.card > .list-group + .card-footer {
- border-top: 0;
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: 0.2em;
}
-.card-body {
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- min-height: 1px;
- padding: 1.25rem;
+@-webkit-keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
}
-.card-title {
- margin-bottom: 0.75rem;
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: -0.125em;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ -webkit-animation: 0.75s linear infinite spinner-grow;
+ animation: 0.75s linear infinite spinner-grow;
}
-.card-subtitle {
- margin-top: -0.375rem;
- margin-bottom: 0;
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem;
}
-.card-text:last-child {
- margin-bottom: 0;
+@media (prefers-reduced-motion: reduce) {
+ .spinner-border,
+.spinner-grow {
+ -webkit-animation-duration: 1.5s;
+ animation-duration: 1.5s;
+ }
}
-
-.card-link:hover {
- text-decoration: none;
+.offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: 1050;
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ visibility: hidden;
+ background-color: #fff;
+ background-clip: padding-box;
+ outline: 0;
+ transition: transform 0.3s ease-in-out;
}
-
-.card-link + .card-link {
- margin-left: 1.25rem;
+@media (prefers-reduced-motion: reduce) {
+ .offcanvas {
+ transition: none;
+ }
}
-.card-header {
- padding: 0.75rem 1.25rem;
- margin-bottom: 0;
- background-color: rgba(0, 0, 0, 0.03);
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+.offcanvas-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 1rem;
}
-
-.card-header:first-child {
- border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+.offcanvas-header .btn-close {
+ padding: 0.5rem 0.5rem;
+ margin: -0.5rem -0.5rem -0.5rem auto;
}
-.card-footer {
- padding: 0.75rem 1.25rem;
- background-color: rgba(0, 0, 0, 0.03);
- border-top: 1px solid rgba(0, 0, 0, 0.125);
+.offcanvas-title {
+ margin-bottom: 0;
+ line-height: 1.5;
}
-.card-footer:last-child {
- border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+.offcanvas-body {
+ flex-grow: 1;
+ padding: 1rem 1rem;
+ overflow-y: auto;
}
-.card-header-tabs {
- margin-right: -0.625rem;
- margin-bottom: -0.75rem;
- margin-left: -0.625rem;
- border-bottom: 0;
+.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: 400px;
+ border-right: 1px solid rgba(0, 0, 0, 0.2);
+ transform: translateX(-100%);
}
-.card-header-pills {
- margin-right: -0.625rem;
- margin-left: -0.625rem;
+.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: 400px;
+ border-left: 1px solid rgba(0, 0, 0, 0.2);
+ transform: translateX(100%);
}
-.card-img-overlay {
- position: absolute;
+.offcanvas-top {
top: 0;
right: 0;
- bottom: 0;
left: 0;
- padding: 1.25rem;
- border-radius: calc(0.25rem - 1px);
+ height: 30vh;
+ max-height: 100%;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ transform: translateY(-100%);
}
-.card-img,
-.card-img-top,
-.card-img-bottom {
- -ms-flex-negative: 0;
- flex-shrink: 0;
- width: 100%;
+.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: 30vh;
+ max-height: 100%;
+ border-top: 1px solid rgba(0, 0, 0, 0.2);
+ transform: translateY(100%);
}
-.card-img,
-.card-img-top {
- border-top-left-radius: calc(0.25rem - 1px);
- border-top-right-radius: calc(0.25rem - 1px);
+.offcanvas.show {
+ transform: none;
}
-.card-img,
-.card-img-bottom {
- border-bottom-right-radius: calc(0.25rem - 1px);
- border-bottom-left-radius: calc(0.25rem - 1px);
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
}
-.card-deck .card {
- margin-bottom: 15px;
+.link-primary {
+ color: #0d6efd;
}
-
-@media (min-width: 576px) {
- .card-deck {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- margin-right: -15px;
- margin-left: -15px;
- }
- .card-deck .card {
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- margin-right: 15px;
- margin-bottom: 0;
- margin-left: 15px;
- }
+.link-primary:hover, .link-primary:focus {
+ color: #0a58ca;
}
-.card-group > .card {
- margin-bottom: 15px;
+.link-secondary {
+ color: #6c757d;
}
-
-@media (min-width: 576px) {
- .card-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- }
- .card-group > .card {
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- margin-bottom: 0;
- }
- .card-group > .card + .card {
- margin-left: 0;
- border-left: 0;
- }
- .card-group > .card:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-top,
- .card-group > .card:not(:last-child) .card-header {
- border-top-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-bottom,
- .card-group > .card:not(:last-child) .card-footer {
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-top,
- .card-group > .card:not(:first-child) .card-header {
- border-top-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-bottom,
- .card-group > .card:not(:first-child) .card-footer {
- border-bottom-left-radius: 0;
- }
+.link-secondary:hover, .link-secondary:focus {
+ color: #565e64;
}
-.card-columns .card {
- margin-bottom: 0.75rem;
+.link-success {
+ color: #198754;
}
-
-@media (min-width: 576px) {
- .card-columns {
- -webkit-column-count: 3;
- -moz-column-count: 3;
- column-count: 3;
- -webkit-column-gap: 1.25rem;
- -moz-column-gap: 1.25rem;
- column-gap: 1.25rem;
- orphans: 1;
- widows: 1;
- }
- .card-columns .card {
- display: inline-block;
- width: 100%;
- }
+.link-success:hover, .link-success:focus {
+ color: #146c43;
}
-.accordion {
- overflow-anchor: none;
+.link-info {
+ color: #0dcaf0;
}
-
-.accordion > .card {
- overflow: hidden;
+.link-info:hover, .link-info:focus {
+ color: #3dd5f3;
}
-.accordion > .card:not(:last-of-type) {
- border-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
+.link-warning {
+ color: #ffc107;
}
-
-.accordion > .card:not(:first-of-type) {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
+.link-warning:hover, .link-warning:focus {
+ color: #ffcd39;
}
-.accordion > .card > .card-header {
- border-radius: 0;
- margin-bottom: -1px;
+.link-danger {
+ color: #dc3545;
}
-
-.breadcrumb {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding: 0.75rem 1rem;
- margin-bottom: 1rem;
- list-style: none;
- background-color: #e9ecef;
- border-radius: 0.25rem;
+.link-danger:hover, .link-danger:focus {
+ color: #b02a37;
}
-.breadcrumb-item {
- display: -ms-flexbox;
- display: flex;
+.link-light {
+ color: #f8f9fa;
}
-
-.breadcrumb-item + .breadcrumb-item {
- padding-left: 0.5rem;
+.link-light:hover, .link-light:focus {
+ color: #f9fafb;
}
-.breadcrumb-item + .breadcrumb-item::before {
- display: inline-block;
- padding-right: 0.5rem;
- color: #6c757d;
- content: "/";
+.link-dark {
+ color: #212529;
}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: underline;
+.link-dark:hover, .link-dark:focus {
+ color: #1a1e21;
}
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: none;
+.ratio {
+ position: relative;
+ width: 100%;
+}
+.ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+.ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
}
-.breadcrumb-item.active {
- color: #6c757d;
+.ratio-1x1 {
+ --bs-aspect-ratio: 100%;
}
-.pagination {
- display: -ms-flexbox;
- display: flex;
- padding-left: 0;
- list-style: none;
- border-radius: 0.25rem;
+.ratio-4x3 {
+ --bs-aspect-ratio: calc(3 / 4 * 100%);
}
-.page-link {
- position: relative;
- display: block;
- padding: 0.5rem 0.75rem;
- margin-left: -1px;
- line-height: 1.25;
- color: #007bff;
- background-color: #fff;
- border: 1px solid #dee2e6;
+.ratio-16x9 {
+ --bs-aspect-ratio: calc(9 / 16 * 100%);
}
-.page-link:hover {
- z-index: 2;
- color: #0056b3;
- text-decoration: none;
- background-color: #e9ecef;
- border-color: #dee2e6;
+.ratio-21x9 {
+ --bs-aspect-ratio: calc(9 / 21 * 100%);
}
-.page-link:focus {
- z-index: 3;
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
}
-.page-item:first-child .page-link {
- margin-left: 0;
- border-top-left-radius: 0.25rem;
- border-bottom-left-radius: 0.25rem;
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
}
-.page-item:last-child .page-link {
- border-top-right-radius: 0.25rem;
- border-bottom-right-radius: 0.25rem;
+.sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
}
-.page-item.active .page-link {
- z-index: 3;
- color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+@media (min-width: 576px) {
+ .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 768px) {
+ .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 992px) {
+ .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 1200px) {
+ .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 1400px) {
+ .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+.visually-hidden,
+.visually-hidden-focusable:not(:focus):not(:focus-within) {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
}
-.page-item.disabled .page-link {
- color: #6c757d;
- pointer-events: none;
- cursor: auto;
- background-color: #fff;
- border-color: #dee2e6;
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
}
-.pagination-lg .page-link {
- padding: 0.75rem 1.5rem;
- font-size: 1.25rem;
- line-height: 1.5;
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
-.pagination-lg .page-item:first-child .page-link {
- border-top-left-radius: 0.3rem;
- border-bottom-left-radius: 0.3rem;
+.align-baseline {
+ vertical-align: baseline !important;
}
-.pagination-lg .page-item:last-child .page-link {
- border-top-right-radius: 0.3rem;
- border-bottom-right-radius: 0.3rem;
+.align-top {
+ vertical-align: top !important;
}
-.pagination-sm .page-link {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
+.align-middle {
+ vertical-align: middle !important;
}
-.pagination-sm .page-item:first-child .page-link {
- border-top-left-radius: 0.2rem;
- border-bottom-left-radius: 0.2rem;
+.align-bottom {
+ vertical-align: bottom !important;
}
-.pagination-sm .page-item:last-child .page-link {
- border-top-right-radius: 0.2rem;
- border-bottom-right-radius: 0.2rem;
+.align-text-bottom {
+ vertical-align: text-bottom !important;
}
-.badge {
- display: inline-block;
- padding: 0.25em 0.4em;
- font-size: 75%;
- font-weight: 700;
- line-height: 1;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- border-radius: 0.25rem;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+.align-text-top {
+ vertical-align: text-top !important;
}
-@media (prefers-reduced-motion: reduce) {
- .badge {
- transition: none;
- }
+.float-start {
+ float: left !important;
}
-a.badge:hover, a.badge:focus {
- text-decoration: none;
+.float-end {
+ float: right !important;
}
-.badge:empty {
- display: none;
+.float-none {
+ float: none !important;
}
-.btn .badge {
- position: relative;
- top: -1px;
+.overflow-auto {
+ overflow: auto !important;
}
-.badge-pill {
- padding-right: 0.6em;
- padding-left: 0.6em;
- border-radius: 10rem;
+.overflow-hidden {
+ overflow: hidden !important;
}
-.badge-primary {
- color: #fff;
- background-color: #007bff;
+.overflow-visible {
+ overflow: visible !important;
}
-a.badge-primary:hover, a.badge-primary:focus {
- color: #fff;
- background-color: #0062cc;
+.overflow-scroll {
+ overflow: scroll !important;
}
-a.badge-primary:focus, a.badge-primary.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+.d-inline {
+ display: inline !important;
}
-.badge-secondary {
- color: #fff;
- background-color: #6c757d;
+.d-inline-block {
+ display: inline-block !important;
}
-a.badge-secondary:hover, a.badge-secondary:focus {
- color: #fff;
- background-color: #545b62;
+.d-block {
+ display: block !important;
}
-a.badge-secondary:focus, a.badge-secondary.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+.d-grid {
+ display: grid !important;
}
-.badge-success {
- color: #fff;
- background-color: #28a745;
+.d-table {
+ display: table !important;
}
-a.badge-success:hover, a.badge-success:focus {
- color: #fff;
- background-color: #1e7e34;
+.d-table-row {
+ display: table-row !important;
}
-a.badge-success:focus, a.badge-success.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+.d-table-cell {
+ display: table-cell !important;
}
-.badge-info {
- color: #fff;
- background-color: #17a2b8;
+.d-flex {
+ display: flex !important;
}
-a.badge-info:hover, a.badge-info:focus {
- color: #fff;
- background-color: #117a8b;
+.d-inline-flex {
+ display: inline-flex !important;
}
-a.badge-info:focus, a.badge-info.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+.d-none {
+ display: none !important;
}
-.badge-warning {
- color: #212529;
- background-color: #ffc107;
+.shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
}
-a.badge-warning:hover, a.badge-warning:focus {
- color: #212529;
- background-color: #d39e00;
+.shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
}
-a.badge-warning:focus, a.badge-warning.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
}
-.badge-danger {
- color: #fff;
- background-color: #dc3545;
+.shadow-none {
+ box-shadow: none !important;
}
-a.badge-danger:hover, a.badge-danger:focus {
- color: #fff;
- background-color: #bd2130;
+.position-static {
+ position: static !important;
}
-a.badge-danger:focus, a.badge-danger.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+.position-relative {
+ position: relative !important;
}
-.badge-light {
- color: #212529;
- background-color: #f8f9fa;
+.position-absolute {
+ position: absolute !important;
}
-a.badge-light:hover, a.badge-light:focus {
- color: #212529;
- background-color: #dae0e5;
+.position-fixed {
+ position: fixed !important;
}
-a.badge-light:focus, a.badge-light.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important;
}
-.badge-dark {
- color: #fff;
- background-color: #343a40;
+.top-0 {
+ top: 0 !important;
}
-a.badge-dark:hover, a.badge-dark:focus {
- color: #fff;
- background-color: #1d2124;
+.top-50 {
+ top: 50% !important;
}
-a.badge-dark:focus, a.badge-dark.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+.top-100 {
+ top: 100% !important;
}
-.jumbotron {
- padding: 2rem 1rem;
- margin-bottom: 2rem;
- background-color: #e9ecef;
- border-radius: 0.3rem;
+.bottom-0 {
+ bottom: 0 !important;
}
-@media (min-width: 576px) {
- .jumbotron {
- padding: 4rem 2rem;
- }
+.bottom-50 {
+ bottom: 50% !important;
}
-.jumbotron-fluid {
- padding-right: 0;
- padding-left: 0;
- border-radius: 0;
+.bottom-100 {
+ bottom: 100% !important;
}
-.alert {
- position: relative;
- padding: 0.75rem 1.25rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
- border-radius: 0.25rem;
+.start-0 {
+ left: 0 !important;
}
-.alert-heading {
- color: inherit;
+.start-50 {
+ left: 50% !important;
}
-.alert-link {
- font-weight: 700;
+.start-100 {
+ left: 100% !important;
}
-.alert-dismissible {
- padding-right: 4rem;
+.end-0 {
+ right: 0 !important;
}
-.alert-dismissible .close {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- padding: 0.75rem 1.25rem;
- color: inherit;
+.end-50 {
+ right: 50% !important;
}
-.alert-primary {
- color: #004085;
- background-color: #cce5ff;
- border-color: #b8daff;
+.end-100 {
+ right: 100% !important;
}
-.alert-primary hr {
- border-top-color: #9fcdff;
+.translate-middle {
+ transform: translate(-50%, -50%) !important;
}
-.alert-primary .alert-link {
- color: #002752;
+.translate-middle-x {
+ transform: translateX(-50%) !important;
}
-.alert-secondary {
- color: #383d41;
- background-color: #e2e3e5;
- border-color: #d6d8db;
+.translate-middle-y {
+ transform: translateY(-50%) !important;
}
-.alert-secondary hr {
- border-top-color: #c8cbcf;
+.border {
+ border: 1px solid #dee2e6 !important;
}
-.alert-secondary .alert-link {
- color: #202326;
+.border-0 {
+ border: 0 !important;
}
-.alert-success {
- color: #155724;
- background-color: #d4edda;
- border-color: #c3e6cb;
+.border-top {
+ border-top: 1px solid #dee2e6 !important;
}
-.alert-success hr {
- border-top-color: #b1dfbb;
+.border-top-0 {
+ border-top: 0 !important;
}
-.alert-success .alert-link {
- color: #0b2e13;
+.border-end {
+ border-right: 1px solid #dee2e6 !important;
}
-.alert-info {
- color: #0c5460;
- background-color: #d1ecf1;
- border-color: #bee5eb;
+.border-end-0 {
+ border-right: 0 !important;
}
-.alert-info hr {
- border-top-color: #abdde5;
+.border-bottom {
+ border-bottom: 1px solid #dee2e6 !important;
}
-.alert-info .alert-link {
- color: #062c33;
+.border-bottom-0 {
+ border-bottom: 0 !important;
}
-.alert-warning {
- color: #856404;
- background-color: #fff3cd;
- border-color: #ffeeba;
+.border-start {
+ border-left: 1px solid #dee2e6 !important;
}
-.alert-warning hr {
- border-top-color: #ffe8a1;
+.border-start-0 {
+ border-left: 0 !important;
}
-.alert-warning .alert-link {
- color: #533f03;
+.border-primary {
+ border-color: #0d6efd !important;
}
-.alert-danger {
- color: #721c24;
- background-color: #f8d7da;
- border-color: #f5c6cb;
+.border-secondary {
+ border-color: #6c757d !important;
}
-.alert-danger hr {
- border-top-color: #f1b0b7;
+.border-success {
+ border-color: #198754 !important;
}
-.alert-danger .alert-link {
- color: #491217;
+.border-info {
+ border-color: #0dcaf0 !important;
}
-.alert-light {
- color: #818182;
- background-color: #fefefe;
- border-color: #fdfdfe;
+.border-warning {
+ border-color: #ffc107 !important;
}
-.alert-light hr {
- border-top-color: #ececf6;
+.border-danger {
+ border-color: #dc3545 !important;
}
-.alert-light .alert-link {
- color: #686868;
+.border-light {
+ border-color: #f8f9fa !important;
}
-.alert-dark {
- color: #1b1e21;
- background-color: #d6d8d9;
- border-color: #c6c8ca;
+.border-dark {
+ border-color: #212529 !important;
}
-.alert-dark hr {
- border-top-color: #b9bbbe;
+.border-white {
+ border-color: #fff !important;
}
-.alert-dark .alert-link {
- color: #040505;
+.border-1 {
+ border-width: 1px !important;
}
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
+.border-2 {
+ border-width: 2px !important;
}
-@keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
+.border-3 {
+ border-width: 3px !important;
}
-.progress {
- display: -ms-flexbox;
- display: flex;
- height: 1rem;
- overflow: hidden;
- line-height: 0;
- font-size: 0.75rem;
- background-color: #e9ecef;
- border-radius: 0.25rem;
+.border-4 {
+ border-width: 4px !important;
}
-.progress-bar {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- -ms-flex-pack: center;
- justify-content: center;
- overflow: hidden;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- background-color: #007bff;
- transition: width 0.6s ease;
+.border-5 {
+ border-width: 5px !important;
}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar {
- transition: none;
- }
+.w-25 {
+ width: 25% !important;
}
-.progress-bar-striped {
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-size: 1rem 1rem;
+.w-50 {
+ width: 50% !important;
}
-.progress-bar-animated {
- -webkit-animation: progress-bar-stripes 1s linear infinite;
- animation: progress-bar-stripes 1s linear infinite;
+.w-75 {
+ width: 75% !important;
}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar-animated {
- -webkit-animation: none;
- animation: none;
- }
+.w-100 {
+ width: 100% !important;
}
-.media {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: start;
- align-items: flex-start;
+.w-auto {
+ width: auto !important;
}
-.media-body {
- -ms-flex: 1;
- flex: 1;
+.mw-100 {
+ max-width: 100% !important;
}
-.list-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- border-radius: 0.25rem;
+.vw-100 {
+ width: 100vw !important;
}
-.list-group-item-action {
- width: 100%;
- color: #495057;
- text-align: inherit;
+.min-vw-100 {
+ min-width: 100vw !important;
}
-.list-group-item-action:hover, .list-group-item-action:focus {
- z-index: 1;
- color: #495057;
- text-decoration: none;
- background-color: #f8f9fa;
+.h-25 {
+ height: 25% !important;
}
-.list-group-item-action:active {
- color: #212529;
- background-color: #e9ecef;
+.h-50 {
+ height: 50% !important;
}
-.list-group-item {
- position: relative;
- display: block;
- padding: 0.75rem 1.25rem;
- background-color: #fff;
- border: 1px solid rgba(0, 0, 0, 0.125);
+.h-75 {
+ height: 75% !important;
}
-.list-group-item:first-child {
- border-top-left-radius: inherit;
- border-top-right-radius: inherit;
+.h-100 {
+ height: 100% !important;
}
-.list-group-item:last-child {
- border-bottom-right-radius: inherit;
- border-bottom-left-radius: inherit;
+.h-auto {
+ height: auto !important;
}
-.list-group-item.disabled, .list-group-item:disabled {
- color: #6c757d;
- pointer-events: none;
- background-color: #fff;
+.mh-100 {
+ max-height: 100% !important;
}
-.list-group-item.active {
- z-index: 2;
- color: #fff;
- background-color: #007bff;
- border-color: #007bff;
+.vh-100 {
+ height: 100vh !important;
}
-.list-group-item + .list-group-item {
- border-top-width: 0;
+.min-vh-100 {
+ min-height: 100vh !important;
}
-.list-group-item + .list-group-item.active {
- margin-top: -1px;
- border-top-width: 1px;
+.flex-fill {
+ flex: 1 1 auto !important;
}
-.list-group-horizontal {
- -ms-flex-direction: row;
- flex-direction: row;
+.flex-row {
+ flex-direction: row !important;
}
-.list-group-horizontal > .list-group-item:first-child {
- border-bottom-left-radius: 0.25rem;
- border-top-right-radius: 0;
+.flex-column {
+ flex-direction: column !important;
}
-.list-group-horizontal > .list-group-item:last-child {
- border-top-right-radius: 0.25rem;
- border-bottom-left-radius: 0;
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
}
-.list-group-horizontal > .list-group-item.active {
- margin-top: 0;
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
}
-.list-group-horizontal > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
+.flex-grow-0 {
+ flex-grow: 0 !important;
}
-.list-group-horizontal > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
+.flex-grow-1 {
+ flex-grow: 1 !important;
}
-@media (min-width: 576px) {
- .list-group-horizontal-sm {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-sm > .list-group-item:first-child {
- border-bottom-left-radius: 0.25rem;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-sm > .list-group-item:last-child {
- border-top-right-radius: 0.25rem;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-sm > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-sm > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
}
-@media (min-width: 768px) {
- .list-group-horizontal-md {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-md > .list-group-item:first-child {
- border-bottom-left-radius: 0.25rem;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-md > .list-group-item:last-child {
- border-top-right-radius: 0.25rem;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-md > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-md > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-md > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
}
-@media (min-width: 992px) {
- .list-group-horizontal-lg {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-lg > .list-group-item:first-child {
- border-bottom-left-radius: 0.25rem;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-lg > .list-group-item:last-child {
- border-top-right-radius: 0.25rem;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-lg > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-lg > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
+.flex-wrap {
+ flex-wrap: wrap !important;
}
-@media (min-width: 1200px) {
- .list-group-horizontal-xl {
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-xl > .list-group-item:first-child {
- border-bottom-left-radius: 0.25rem;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-xl > .list-group-item:last-child {
- border-top-right-radius: 0.25rem;
- border-bottom-left-radius: 0;
- }
- .list-group-horizontal-xl > .list-group-item.active {
- margin-top: 0;
- }
- .list-group-horizontal-xl > .list-group-item + .list-group-item {
- border-top-width: 1px;
- border-left-width: 0;
- }
- .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
- margin-left: -1px;
- border-left-width: 1px;
- }
+.flex-nowrap {
+ flex-wrap: nowrap !important;
}
-.list-group-flush {
- border-radius: 0;
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
}
-.list-group-flush > .list-group-item {
- border-width: 0 0 1px;
+.gap-0 {
+ gap: 0 !important;
}
-.list-group-flush > .list-group-item:last-child {
- border-bottom-width: 0;
+.gap-1 {
+ gap: 0.25rem !important;
}
-.list-group-item-primary {
- color: #004085;
- background-color: #b8daff;
+.gap-2 {
+ gap: 0.5rem !important;
}
-.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
- color: #004085;
- background-color: #9fcdff;
+.gap-3 {
+ gap: 1rem !important;
}
-.list-group-item-primary.list-group-item-action.active {
- color: #fff;
- background-color: #004085;
- border-color: #004085;
+.gap-4 {
+ gap: 1.5rem !important;
}
-.list-group-item-secondary {
- color: #383d41;
- background-color: #d6d8db;
+.gap-5 {
+ gap: 3rem !important;
}
-.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
- color: #383d41;
- background-color: #c8cbcf;
+.justify-content-start {
+ justify-content: flex-start !important;
}
-.list-group-item-secondary.list-group-item-action.active {
- color: #fff;
- background-color: #383d41;
- border-color: #383d41;
+.justify-content-end {
+ justify-content: flex-end !important;
}
-.list-group-item-success {
- color: #155724;
- background-color: #c3e6cb;
+.justify-content-center {
+ justify-content: center !important;
}
-.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
- color: #155724;
- background-color: #b1dfbb;
+.justify-content-between {
+ justify-content: space-between !important;
}
-.list-group-item-success.list-group-item-action.active {
- color: #fff;
- background-color: #155724;
- border-color: #155724;
+.justify-content-around {
+ justify-content: space-around !important;
}
-.list-group-item-info {
- color: #0c5460;
- background-color: #bee5eb;
+.justify-content-evenly {
+ justify-content: space-evenly !important;
}
-.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
- color: #0c5460;
- background-color: #abdde5;
+.align-items-start {
+ align-items: flex-start !important;
}
-.list-group-item-info.list-group-item-action.active {
- color: #fff;
- background-color: #0c5460;
- border-color: #0c5460;
+.align-items-end {
+ align-items: flex-end !important;
}
-.list-group-item-warning {
- color: #856404;
- background-color: #ffeeba;
+.align-items-center {
+ align-items: center !important;
}
-.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
- color: #856404;
- background-color: #ffe8a1;
+.align-items-baseline {
+ align-items: baseline !important;
}
-.list-group-item-warning.list-group-item-action.active {
- color: #fff;
- background-color: #856404;
- border-color: #856404;
+.align-items-stretch {
+ align-items: stretch !important;
}
-.list-group-item-danger {
- color: #721c24;
- background-color: #f5c6cb;
+.align-content-start {
+ align-content: flex-start !important;
}
-.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
- color: #721c24;
- background-color: #f1b0b7;
+.align-content-end {
+ align-content: flex-end !important;
}
-.list-group-item-danger.list-group-item-action.active {
- color: #fff;
- background-color: #721c24;
- border-color: #721c24;
+.align-content-center {
+ align-content: center !important;
}
-.list-group-item-light {
- color: #818182;
- background-color: #fdfdfe;
+.align-content-between {
+ align-content: space-between !important;
}
-.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
- color: #818182;
- background-color: #ececf6;
+.align-content-around {
+ align-content: space-around !important;
}
-.list-group-item-light.list-group-item-action.active {
- color: #fff;
- background-color: #818182;
- border-color: #818182;
+.align-content-stretch {
+ align-content: stretch !important;
}
-.list-group-item-dark {
- color: #1b1e21;
- background-color: #c6c8ca;
+.align-self-auto {
+ align-self: auto !important;
}
-.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
- color: #1b1e21;
- background-color: #b9bbbe;
+.align-self-start {
+ align-self: flex-start !important;
}
-.list-group-item-dark.list-group-item-action.active {
- color: #fff;
- background-color: #1b1e21;
- border-color: #1b1e21;
+.align-self-end {
+ align-self: flex-end !important;
}
-.close {
- float: right;
- font-size: 1.5rem;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: .5;
+.align-self-center {
+ align-self: center !important;
}
-.close:hover {
- color: #000;
- text-decoration: none;
+.align-self-baseline {
+ align-self: baseline !important;
}
-.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
- opacity: .75;
+.align-self-stretch {
+ align-self: stretch !important;
}
-button.close {
- padding: 0;
- background-color: transparent;
- border: 0;
+.order-first {
+ order: -1 !important;
}
-a.close.disabled {
- pointer-events: none;
+.order-0 {
+ order: 0 !important;
}
-.toast {
- -ms-flex-preferred-size: 350px;
- flex-basis: 350px;
- max-width: 350px;
- font-size: 0.875rem;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.1);
- box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
- opacity: 0;
- border-radius: 0.25rem;
+.order-1 {
+ order: 1 !important;
}
-.toast:not(:last-child) {
- margin-bottom: 0.75rem;
+.order-2 {
+ order: 2 !important;
}
-.toast.showing {
- opacity: 1;
+.order-3 {
+ order: 3 !important;
}
-.toast.show {
- display: block;
- opacity: 1;
+.order-4 {
+ order: 4 !important;
}
-.toast.hide {
- display: none;
+.order-5 {
+ order: 5 !important;
}
-.toast-header {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- padding: 0.25rem 0.75rem;
- color: #6c757d;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
- border-top-left-radius: calc(0.25rem - 1px);
- border-top-right-radius: calc(0.25rem - 1px);
+.order-last {
+ order: 6 !important;
}
-.toast-body {
- padding: 0.75rem;
+.m-0 {
+ margin: 0 !important;
}
-.modal-open {
- overflow: hidden;
+.m-1 {
+ margin: 0.25rem !important;
}
-.modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
+.m-2 {
+ margin: 0.5rem !important;
}
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1050;
- display: none;
- width: 100%;
- height: 100%;
- overflow: hidden;
- outline: 0;
+.m-3 {
+ margin: 1rem !important;
}
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
+.m-4 {
+ margin: 1.5rem !important;
}
-.modal.fade .modal-dialog {
- transition: -webkit-transform 0.3s ease-out;
- transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
- -webkit-transform: translate(0, -50px);
- transform: translate(0, -50px);
+.m-5 {
+ margin: 3rem !important;
}
-@media (prefers-reduced-motion: reduce) {
- .modal.fade .modal-dialog {
- transition: none;
- }
+.m-auto {
+ margin: auto !important;
}
-.modal.show .modal-dialog {
- -webkit-transform: none;
- transform: none;
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
}
-.modal.modal-static .modal-dialog {
- -webkit-transform: scale(1.02);
- transform: scale(1.02);
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
}
-.modal-dialog-scrollable {
- display: -ms-flexbox;
- display: flex;
- max-height: calc(100% - 1rem);
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
}
-.modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 1rem);
- overflow: hidden;
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
}
-.modal-dialog-scrollable .modal-header,
-.modal-dialog-scrollable .modal-footer {
- -ms-flex-negative: 0;
- flex-shrink: 0;
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
}
-.modal-dialog-scrollable .modal-body {
- overflow-y: auto;
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
}
-.modal-dialog-centered {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- min-height: calc(100% - 1rem);
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
-.modal-dialog-centered::before {
- display: block;
- height: calc(100vh - 1rem);
- height: -webkit-min-content;
- height: -moz-min-content;
- height: min-content;
- content: "";
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
}
-.modal-dialog-centered.modal-dialog-scrollable {
- -ms-flex-direction: column;
- flex-direction: column;
- -ms-flex-pack: center;
- justify-content: center;
- height: 100%;
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
}
-.modal-dialog-centered.modal-dialog-scrollable .modal-content {
- max-height: none;
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
}
-.modal-dialog-centered.modal-dialog-scrollable::before {
- content: none;
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
}
-.modal-content {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0.3rem;
- outline: 0;
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
}
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1040;
- width: 100vw;
- height: 100vh;
- background-color: #000;
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
}
-.modal-backdrop.fade {
- opacity: 0;
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
-.modal-backdrop.show {
- opacity: 0.5;
+.mt-0 {
+ margin-top: 0 !important;
}
-.modal-header {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: start;
- align-items: flex-start;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 1rem 1rem;
- border-bottom: 1px solid #dee2e6;
- border-top-left-radius: calc(0.3rem - 1px);
- border-top-right-radius: calc(0.3rem - 1px);
+.mt-1 {
+ margin-top: 0.25rem !important;
}
-.modal-header .close {
- padding: 1rem 1rem;
- margin: -1rem -1rem -1rem auto;
+.mt-2 {
+ margin-top: 0.5rem !important;
}
-.modal-title {
- margin-bottom: 0;
- line-height: 1.5;
+.mt-3 {
+ margin-top: 1rem !important;
}
-.modal-body {
- position: relative;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1rem;
+.mt-4 {
+ margin-top: 1.5rem !important;
}
-.modal-footer {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: end;
- justify-content: flex-end;
- padding: 0.75rem;
- border-top: 1px solid #dee2e6;
- border-bottom-right-radius: calc(0.3rem - 1px);
- border-bottom-left-radius: calc(0.3rem - 1px);
+.mt-5 {
+ margin-top: 3rem !important;
}
-.modal-footer > * {
- margin: 0.25rem;
+.mt-auto {
+ margin-top: auto !important;
}
-.modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
+.me-0 {
+ margin-right: 0 !important;
}
-@media (min-width: 576px) {
- .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
- .modal-dialog-scrollable {
- max-height: calc(100% - 3.5rem);
- }
- .modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 3.5rem);
- }
- .modal-dialog-centered {
- min-height: calc(100% - 3.5rem);
- }
- .modal-dialog-centered::before {
- height: calc(100vh - 3.5rem);
- height: -webkit-min-content;
- height: -moz-min-content;
- height: min-content;
- }
- .modal-sm {
- max-width: 300px;
- }
+.me-1 {
+ margin-right: 0.25rem !important;
}
-@media (min-width: 992px) {
- .modal-lg,
- .modal-xl {
- max-width: 800px;
- }
+.me-2 {
+ margin-right: 0.5rem !important;
}
-@media (min-width: 1200px) {
- .modal-xl {
- max-width: 1140px;
- }
+.me-3 {
+ margin-right: 1rem !important;
}
-.tooltip {
- position: absolute;
- z-index: 1070;
- display: block;
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- opacity: 0;
+.me-4 {
+ margin-right: 1.5rem !important;
}
-.tooltip.show {
- opacity: 0.9;
+.me-5 {
+ margin-right: 3rem !important;
}
-.tooltip .arrow {
- position: absolute;
- display: block;
- width: 0.8rem;
- height: 0.4rem;
+.me-auto {
+ margin-right: auto !important;
}
-.tooltip .arrow::before {
- position: absolute;
- content: "";
- border-color: transparent;
- border-style: solid;
+.mb-0 {
+ margin-bottom: 0 !important;
}
-.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
- padding: 0.4rem 0;
+.mb-1 {
+ margin-bottom: 0.25rem !important;
}
-.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
- bottom: 0;
+.mb-2 {
+ margin-bottom: 0.5rem !important;
}
-.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
- top: 0;
- border-width: 0.4rem 0.4rem 0;
- border-top-color: #000;
+.mb-3 {
+ margin-bottom: 1rem !important;
}
-.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
- padding: 0 0.4rem;
+.mb-4 {
+ margin-bottom: 1.5rem !important;
}
-.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
- left: 0;
- width: 0.4rem;
- height: 0.8rem;
+.mb-5 {
+ margin-bottom: 3rem !important;
}
-.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
- right: 0;
- border-width: 0.4rem 0.4rem 0.4rem 0;
- border-right-color: #000;
+.mb-auto {
+ margin-bottom: auto !important;
}
-.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
- padding: 0.4rem 0;
+.ms-0 {
+ margin-left: 0 !important;
}
-.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
- top: 0;
+.ms-1 {
+ margin-left: 0.25rem !important;
}
-.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
- bottom: 0;
- border-width: 0 0.4rem 0.4rem;
- border-bottom-color: #000;
+.ms-2 {
+ margin-left: 0.5rem !important;
}
-.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
- padding: 0 0.4rem;
+.ms-3 {
+ margin-left: 1rem !important;
}
-.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
- right: 0;
- width: 0.4rem;
- height: 0.8rem;
+.ms-4 {
+ margin-left: 1.5rem !important;
}
-.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
- left: 0;
- border-width: 0.4rem 0 0.4rem 0.4rem;
- border-left-color: #000;
+.ms-5 {
+ margin-left: 3rem !important;
}
-.tooltip-inner {
- max-width: 200px;
- padding: 0.25rem 0.5rem;
- color: #fff;
- text-align: center;
- background-color: #000;
- border-radius: 0.25rem;
+.ms-auto {
+ margin-left: auto !important;
}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1060;
- display: block;
- max-width: 276px;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0.3rem;
+.p-0 {
+ padding: 0 !important;
}
-.popover .arrow {
- position: absolute;
- display: block;
- width: 1rem;
- height: 0.5rem;
- margin: 0 0.3rem;
+.p-1 {
+ padding: 0.25rem !important;
}
-.popover .arrow::before, .popover .arrow::after {
- position: absolute;
- display: block;
- content: "";
- border-color: transparent;
- border-style: solid;
+.p-2 {
+ padding: 0.5rem !important;
}
-.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
- margin-bottom: 0.5rem;
+.p-3 {
+ padding: 1rem !important;
}
-.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
- bottom: calc(-0.5rem - 1px);
+.p-4 {
+ padding: 1.5rem !important;
}
-.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
- bottom: 0;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: rgba(0, 0, 0, 0.25);
+.p-5 {
+ padding: 3rem !important;
}
-.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after {
- bottom: 1px;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: #fff;
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
}
-.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
- margin-left: 0.5rem;
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
}
-.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
- left: calc(-0.5rem - 1px);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
}
-.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before {
- left: 0;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: rgba(0, 0, 0, 0.25);
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
}
-.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after {
- left: 1px;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: #fff;
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
}
-.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
- margin-top: 0.5rem;
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
}
-.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
- top: calc(-0.5rem - 1px);
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
}
-.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
- top: 0;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: rgba(0, 0, 0, 0.25);
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
}
-.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after {
- top: 1px;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: #fff;
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
}
-.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: 1rem;
- margin-left: -0.5rem;
- content: "";
- border-bottom: 1px solid #f7f7f7;
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
}
-.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
- margin-right: 0.5rem;
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
}
-.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
- right: calc(-0.5rem - 1px);
- width: 0.5rem;
- height: 1rem;
- margin: 0.3rem 0;
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
}
-.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before {
- right: 0;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: rgba(0, 0, 0, 0.25);
+.pt-0 {
+ padding-top: 0 !important;
}
-.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after {
- right: 1px;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: #fff;
+.pt-1 {
+ padding-top: 0.25rem !important;
}
-.popover-header {
- padding: 0.5rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- border-top-left-radius: calc(0.3rem - 1px);
- border-top-right-radius: calc(0.3rem - 1px);
+.pt-2 {
+ padding-top: 0.5rem !important;
}
-.popover-header:empty {
- display: none;
+.pt-3 {
+ padding-top: 1rem !important;
}
-.popover-body {
- padding: 0.5rem 0.75rem;
- color: #212529;
+.pt-4 {
+ padding-top: 1.5rem !important;
}
-.carousel {
- position: relative;
+.pt-5 {
+ padding-top: 3rem !important;
}
-.carousel.pointer-event {
- -ms-touch-action: pan-y;
- touch-action: pan-y;
+.pe-0 {
+ padding-right: 0 !important;
}
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
+.pe-1 {
+ padding-right: 0.25rem !important;
}
-.carousel-inner::after {
- display: block;
- clear: both;
- content: "";
+.pe-2 {
+ padding-right: 0.5rem !important;
}
-.carousel-item {
- position: relative;
- display: none;
- float: left;
- width: 100%;
- margin-right: -100%;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- transition: -webkit-transform 0.6s ease-in-out;
- transition: transform 0.6s ease-in-out;
- transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+.pe-3 {
+ padding-right: 1rem !important;
}
-@media (prefers-reduced-motion: reduce) {
- .carousel-item {
- transition: none;
- }
+.pe-4 {
+ padding-right: 1.5rem !important;
}
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
- display: block;
+.pe-5 {
+ padding-right: 3rem !important;
}
-.carousel-item-next:not(.carousel-item-left),
-.active.carousel-item-right {
- -webkit-transform: translateX(100%);
- transform: translateX(100%);
+.pb-0 {
+ padding-bottom: 0 !important;
}
-.carousel-item-prev:not(.carousel-item-right),
-.active.carousel-item-left {
- -webkit-transform: translateX(-100%);
- transform: translateX(-100%);
+.pb-1 {
+ padding-bottom: 0.25rem !important;
}
-.carousel-fade .carousel-item {
- opacity: 0;
- transition-property: opacity;
- -webkit-transform: none;
- transform: none;
+.pb-2 {
+ padding-bottom: 0.5rem !important;
}
-.carousel-fade .carousel-item.active,
-.carousel-fade .carousel-item-next.carousel-item-left,
-.carousel-fade .carousel-item-prev.carousel-item-right {
- z-index: 1;
- opacity: 1;
+.pb-3 {
+ padding-bottom: 1rem !important;
}
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-right {
- z-index: 0;
- opacity: 0;
- transition: opacity 0s 0.6s;
+.pb-4 {
+ padding-bottom: 1.5rem !important;
}
-@media (prefers-reduced-motion: reduce) {
- .carousel-fade .active.carousel-item-left,
- .carousel-fade .active.carousel-item-right {
- transition: none;
- }
+.pb-5 {
+ padding-bottom: 3rem !important;
}
-.carousel-control-prev,
-.carousel-control-next {
- position: absolute;
- top: 0;
- bottom: 0;
- z-index: 1;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-align: center;
- align-items: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: 15%;
- color: #fff;
- text-align: center;
- opacity: 0.5;
- transition: opacity 0.15s ease;
+.ps-0 {
+ padding-left: 0 !important;
}
-@media (prefers-reduced-motion: reduce) {
- .carousel-control-prev,
- .carousel-control-next {
- transition: none;
- }
+.ps-1 {
+ padding-left: 0.25rem !important;
}
-.carousel-control-prev:hover, .carousel-control-prev:focus,
-.carousel-control-next:hover,
-.carousel-control-next:focus {
- color: #fff;
- text-decoration: none;
- outline: 0;
- opacity: 0.9;
+.ps-2 {
+ padding-left: 0.5rem !important;
}
-.carousel-control-prev {
- left: 0;
+.ps-3 {
+ padding-left: 1rem !important;
}
-.carousel-control-next {
- right: 0;
+.ps-4 {
+ padding-left: 1.5rem !important;
}
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
- display: inline-block;
- width: 20px;
- height: 20px;
- background: no-repeat 50% / 100% 100%;
+.ps-5 {
+ padding-left: 3rem !important;
}
-.carousel-control-prev-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e");
+.font-monospace {
+ font-family: var(--bs-font-monospace) !important;
}
-.carousel-control-next-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e");
+.fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
}
-.carousel-indicators {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 15;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-pack: center;
- justify-content: center;
- padding-left: 0;
- margin-right: 15%;
- margin-left: 15%;
- list-style: none;
+.fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
}
-.carousel-indicators li {
- box-sizing: content-box;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
- width: 30px;
- height: 3px;
- margin-right: 3px;
- margin-left: 3px;
- text-indent: -999px;
- cursor: pointer;
- background-color: #fff;
- background-clip: padding-box;
- border-top: 10px solid transparent;
- border-bottom: 10px solid transparent;
- opacity: .5;
- transition: opacity 0.6s ease;
+.fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
}
-@media (prefers-reduced-motion: reduce) {
- .carousel-indicators li {
- transition: none;
- }
+.fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
}
-.carousel-indicators .active {
- opacity: 1;
+.fs-5 {
+ font-size: 1.25rem !important;
}
-.carousel-caption {
- position: absolute;
- right: 15%;
- bottom: 20px;
- left: 15%;
- z-index: 10;
- padding-top: 20px;
- padding-bottom: 20px;
- color: #fff;
- text-align: center;
+.fs-6 {
+ font-size: 1rem !important;
}
-@-webkit-keyframes spinner-border {
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+.fst-italic {
+ font-style: italic !important;
}
-@keyframes spinner-border {
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
+.fst-normal {
+ font-style: normal !important;
}
-.spinner-border {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: text-bottom;
- border: 0.25em solid currentColor;
- border-right-color: transparent;
- border-radius: 50%;
- -webkit-animation: spinner-border .75s linear infinite;
- animation: spinner-border .75s linear infinite;
+.fw-light {
+ font-weight: 300 !important;
}
-.spinner-border-sm {
- width: 1rem;
- height: 1rem;
- border-width: 0.2em;
+.fw-lighter {
+ font-weight: lighter !important;
}
-@-webkit-keyframes spinner-grow {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- -webkit-transform: none;
- transform: none;
- }
+.fw-normal {
+ font-weight: 400 !important;
}
-@keyframes spinner-grow {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- -webkit-transform: none;
- transform: none;
- }
+.fw-bold {
+ font-weight: 700 !important;
}
-.spinner-grow {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: text-bottom;
- background-color: currentColor;
- border-radius: 50%;
- opacity: 0;
- -webkit-animation: spinner-grow .75s linear infinite;
- animation: spinner-grow .75s linear infinite;
+.fw-bolder {
+ font-weight: bolder !important;
}
-.spinner-grow-sm {
- width: 1rem;
- height: 1rem;
+.lh-1 {
+ line-height: 1 !important;
}
-.align-baseline {
- vertical-align: baseline !important;
+.lh-sm {
+ line-height: 1.25 !important;
}
-.align-top {
- vertical-align: top !important;
+.lh-base {
+ line-height: 1.5 !important;
}
-.align-middle {
- vertical-align: middle !important;
+.lh-lg {
+ line-height: 2 !important;
}
-.align-bottom {
- vertical-align: bottom !important;
+.text-start {
+ text-align: left !important;
}
-.align-text-bottom {
- vertical-align: text-bottom !important;
+.text-end {
+ text-align: right !important;
}
-.align-text-top {
- vertical-align: text-top !important;
+.text-center {
+ text-align: center !important;
}
-.bg-primary {
- background-color: #007bff !important;
+.text-decoration-none {
+ text-decoration: none !important;
}
-a.bg-primary:hover, a.bg-primary:focus,
-button.bg-primary:hover,
-button.bg-primary:focus {
- background-color: #0062cc !important;
+.text-decoration-underline {
+ text-decoration: underline !important;
}
-.bg-secondary {
- background-color: #6c757d !important;
+.text-decoration-line-through {
+ text-decoration: line-through !important;
}
-a.bg-secondary:hover, a.bg-secondary:focus,
-button.bg-secondary:hover,
-button.bg-secondary:focus {
- background-color: #545b62 !important;
+.text-lowercase {
+ text-transform: lowercase !important;
}
-.bg-success {
- background-color: #28a745 !important;
+.text-uppercase {
+ text-transform: uppercase !important;
}
-a.bg-success:hover, a.bg-success:focus,
-button.bg-success:hover,
-button.bg-success:focus {
- background-color: #1e7e34 !important;
+.text-capitalize {
+ text-transform: capitalize !important;
}
-.bg-info {
- background-color: #17a2b8 !important;
+.text-wrap {
+ white-space: normal !important;
}
-a.bg-info:hover, a.bg-info:focus,
-button.bg-info:hover,
-button.bg-info:focus {
- background-color: #117a8b !important;
+.text-nowrap {
+ white-space: nowrap !important;
}
-.bg-warning {
- background-color: #ffc107 !important;
+/* rtl:begin:remove */
+.text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
}
-a.bg-warning:hover, a.bg-warning:focus,
-button.bg-warning:hover,
-button.bg-warning:focus {
- background-color: #d39e00 !important;
+/* rtl:end:remove */
+.text-primary {
+ color: #0d6efd !important;
}
-.bg-danger {
- background-color: #dc3545 !important;
+.text-secondary {
+ color: #6c757d !important;
}
-a.bg-danger:hover, a.bg-danger:focus,
-button.bg-danger:hover,
-button.bg-danger:focus {
- background-color: #bd2130 !important;
+.text-success {
+ color: #198754 !important;
}
-.bg-light {
- background-color: #f8f9fa !important;
+.text-info {
+ color: #0dcaf0 !important;
}
-a.bg-light:hover, a.bg-light:focus,
-button.bg-light:hover,
-button.bg-light:focus {
- background-color: #dae0e5 !important;
+.text-warning {
+ color: #ffc107 !important;
}
-.bg-dark {
- background-color: #343a40 !important;
+.text-danger {
+ color: #dc3545 !important;
}
-a.bg-dark:hover, a.bg-dark:focus,
-button.bg-dark:hover,
-button.bg-dark:focus {
- background-color: #1d2124 !important;
+.text-light {
+ color: #f8f9fa !important;
}
-.bg-white {
- background-color: #fff !important;
+.text-dark {
+ color: #212529 !important;
}
-.bg-transparent {
- background-color: transparent !important;
+.text-white {
+ color: #fff !important;
}
-.border {
- border: 1px solid #dee2e6 !important;
+.text-body {
+ color: #212529 !important;
}
-.border-top {
- border-top: 1px solid #dee2e6 !important;
+.text-muted {
+ color: #6c757d !important;
}
-.border-right {
- border-right: 1px solid #dee2e6 !important;
+.text-black-50 {
+ color: rgba(0, 0, 0, 0.5) !important;
}
-.border-bottom {
- border-bottom: 1px solid #dee2e6 !important;
+.text-white-50 {
+ color: rgba(255, 255, 255, 0.5) !important;
}
-.border-left {
- border-left: 1px solid #dee2e6 !important;
+.text-reset {
+ color: inherit !important;
}
-.border-0 {
- border: 0 !important;
+.bg-primary {
+ background-color: #0d6efd !important;
}
-.border-top-0 {
- border-top: 0 !important;
+.bg-secondary {
+ background-color: #6c757d !important;
}
-.border-right-0 {
- border-right: 0 !important;
+.bg-success {
+ background-color: #198754 !important;
}
-.border-bottom-0 {
- border-bottom: 0 !important;
+.bg-info {
+ background-color: #0dcaf0 !important;
}
-.border-left-0 {
- border-left: 0 !important;
+.bg-warning {
+ background-color: #ffc107 !important;
}
-.border-primary {
- border-color: #007bff !important;
+.bg-danger {
+ background-color: #dc3545 !important;
}
-.border-secondary {
- border-color: #6c757d !important;
+.bg-light {
+ background-color: #f8f9fa !important;
+}
+
+.bg-dark {
+ background-color: #212529 !important;
+}
+
+.bg-body {
+ background-color: #fff !important;
}
-.border-success {
- border-color: #28a745 !important;
+.bg-white {
+ background-color: #fff !important;
}
-.border-info {
- border-color: #17a2b8 !important;
+.bg-transparent {
+ background-color: transparent !important;
}
-.border-warning {
- border-color: #ffc107 !important;
+.bg-gradient {
+ background-image: var(--bs-gradient) !important;
}
-.border-danger {
- border-color: #dc3545 !important;
+.user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
}
-.border-light {
- border-color: #f8f9fa !important;
+.user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
}
-.border-dark {
- border-color: #343a40 !important;
+.user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
}
-.border-white {
- border-color: #fff !important;
+.pe-none {
+ pointer-events: none !important;
}
-.rounded-sm {
- border-radius: 0.2rem !important;
+.pe-auto {
+ pointer-events: auto !important;
}
.rounded {
border-radius: 0.25rem !important;
}
-.rounded-top {
- border-top-left-radius: 0.25rem !important;
- border-top-right-radius: 0.25rem !important;
-}
-
-.rounded-right {
- border-top-right-radius: 0.25rem !important;
- border-bottom-right-radius: 0.25rem !important;
+.rounded-0 {
+ border-radius: 0 !important;
}
-.rounded-bottom {
- border-bottom-right-radius: 0.25rem !important;
- border-bottom-left-radius: 0.25rem !important;
+.rounded-1 {
+ border-radius: 0.2rem !important;
}
-.rounded-left {
- border-top-left-radius: 0.25rem !important;
- border-bottom-left-radius: 0.25rem !important;
+.rounded-2 {
+ border-radius: 0.25rem !important;
}
-.rounded-lg {
+.rounded-3 {
border-radius: 0.3rem !important;
}
@@ -6914,3350 +7475,3346 @@ button.bg-dark:focus {
border-radius: 50rem !important;
}
-.rounded-0 {
- border-radius: 0 !important;
-}
-
-.clearfix::after {
- display: block;
- clear: both;
- content: "";
-}
-
-.d-none {
- display: none !important;
-}
-
-.d-inline {
- display: inline !important;
+.rounded-top {
+ border-top-left-radius: 0.25rem !important;
+ border-top-right-radius: 0.25rem !important;
}
-.d-inline-block {
- display: inline-block !important;
+.rounded-end {
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
}
-.d-block {
- display: block !important;
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
}
-.d-table {
- display: table !important;
+.rounded-start {
+ border-bottom-left-radius: 0.25rem !important;
+ border-top-left-radius: 0.25rem !important;
}
-.d-table-row {
- display: table-row !important;
+.visible {
+ visibility: visible !important;
}
-.d-table-cell {
- display: table-cell !important;
+.invisible {
+ visibility: hidden !important;
}
-.d-flex {
- display: -ms-flexbox !important;
- display: flex !important;
-}
+@media (min-width: 576px) {
+ .float-sm-start {
+ float: left !important;
+ }
-.d-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
-}
+ .float-sm-end {
+ float: right !important;
+ }
-@media (min-width: 576px) {
- .d-sm-none {
- display: none !important;
+ .float-sm-none {
+ float: none !important;
}
+
.d-sm-inline {
display: inline !important;
}
+
.d-sm-inline-block {
display: inline-block !important;
}
+
.d-sm-block {
display: block !important;
}
+
+ .d-sm-grid {
+ display: grid !important;
+ }
+
.d-sm-table {
display: table !important;
}
+
.d-sm-table-row {
display: table-row !important;
}
+
.d-sm-table-cell {
display: table-cell !important;
}
+
.d-sm-flex {
- display: -ms-flexbox !important;
display: flex !important;
}
+
.d-sm-inline-flex {
- display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
-}
-@media (min-width: 768px) {
- .d-md-none {
+ .d-sm-none {
display: none !important;
}
- .d-md-inline {
- display: inline !important;
- }
- .d-md-inline-block {
- display: inline-block !important;
- }
- .d-md-block {
- display: block !important;
- }
- .d-md-table {
- display: table !important;
- }
- .d-md-table-row {
- display: table-row !important;
- }
- .d-md-table-cell {
- display: table-cell !important;
- }
- .d-md-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-md-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-@media (min-width: 992px) {
- .d-lg-none {
- display: none !important;
- }
- .d-lg-inline {
- display: inline !important;
- }
- .d-lg-inline-block {
- display: inline-block !important;
- }
- .d-lg-block {
- display: block !important;
- }
- .d-lg-table {
- display: table !important;
- }
- .d-lg-table-row {
- display: table-row !important;
- }
- .d-lg-table-cell {
- display: table-cell !important;
- }
- .d-lg-flex {
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-lg-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
}
-}
-@media (min-width: 1200px) {
- .d-xl-none {
- display: none !important;
- }
- .d-xl-inline {
- display: inline !important;
- }
- .d-xl-inline-block {
- display: inline-block !important;
- }
- .d-xl-block {
- display: block !important;
- }
- .d-xl-table {
- display: table !important;
- }
- .d-xl-table-row {
- display: table-row !important;
+ .flex-sm-row {
+ flex-direction: row !important;
}
- .d-xl-table-cell {
- display: table-cell !important;
+
+ .flex-sm-column {
+ flex-direction: column !important;
}
- .d-xl-flex {
- display: -ms-flexbox !important;
- display: flex !important;
+
+ .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
}
- .d-xl-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
+
+ .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
}
-}
-@media print {
- .d-print-none {
- display: none !important;
+ .flex-sm-grow-0 {
+ flex-grow: 0 !important;
}
- .d-print-inline {
- display: inline !important;
+
+ .flex-sm-grow-1 {
+ flex-grow: 1 !important;
}
- .d-print-inline-block {
- display: inline-block !important;
+
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
}
- .d-print-block {
- display: block !important;
+
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
}
- .d-print-table {
- display: table !important;
+
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
}
- .d-print-table-row {
- display: table-row !important;
+
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
}
- .d-print-table-cell {
- display: table-cell !important;
+
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
}
- .d-print-flex {
- display: -ms-flexbox !important;
- display: flex !important;
+
+ .gap-sm-0 {
+ gap: 0 !important;
}
- .d-print-inline-flex {
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
+
+ .gap-sm-1 {
+ gap: 0.25rem !important;
}
-}
-.embed-responsive {
- position: relative;
- display: block;
- width: 100%;
- padding: 0;
- overflow: hidden;
-}
+ .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
-.embed-responsive::before {
- display: block;
- content: "";
-}
+ .gap-sm-3 {
+ gap: 1rem !important;
+ }
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 0;
-}
+ .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
-.embed-responsive-21by9::before {
- padding-top: 42.857143%;
-}
+ .gap-sm-5 {
+ gap: 3rem !important;
+ }
-.embed-responsive-16by9::before {
- padding-top: 56.25%;
-}
+ .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
-.embed-responsive-4by3::before {
- padding-top: 75%;
-}
+ .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
-.embed-responsive-1by1::before {
- padding-top: 100%;
-}
+ .justify-content-sm-center {
+ justify-content: center !important;
+ }
-.flex-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
-}
+ .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
-.flex-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
-}
+ .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
-.flex-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
-}
+ .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
-.flex-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
-}
+ .align-items-sm-start {
+ align-items: flex-start !important;
+ }
-.flex-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
-}
+ .align-items-sm-end {
+ align-items: flex-end !important;
+ }
-.flex-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
-}
+ .align-items-sm-center {
+ align-items: center !important;
+ }
-.flex-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
-}
+ .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
-.flex-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
-}
+ .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
-.flex-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
-}
+ .align-content-sm-start {
+ align-content: flex-start !important;
+ }
-.flex-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
-}
+ .align-content-sm-end {
+ align-content: flex-end !important;
+ }
-.flex-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
-}
+ .align-content-sm-center {
+ align-content: center !important;
+ }
-.flex-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
-}
+ .align-content-sm-between {
+ align-content: space-between !important;
+ }
-.justify-content-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
-}
+ .align-content-sm-around {
+ align-content: space-around !important;
+ }
-.justify-content-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
-}
+ .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
-.justify-content-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
-}
+ .align-self-sm-auto {
+ align-self: auto !important;
+ }
-.justify-content-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
-}
+ .align-self-sm-start {
+ align-self: flex-start !important;
+ }
-.justify-content-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
-}
+ .align-self-sm-end {
+ align-self: flex-end !important;
+ }
-.align-items-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
-}
+ .align-self-sm-center {
+ align-self: center !important;
+ }
-.align-items-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
-}
+ .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
-.align-items-center {
- -ms-flex-align: center !important;
- align-items: center !important;
-}
+ .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
-.align-items-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
-}
+ .order-sm-first {
+ order: -1 !important;
+ }
-.align-items-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
-}
+ .order-sm-0 {
+ order: 0 !important;
+ }
-.align-content-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
-}
+ .order-sm-1 {
+ order: 1 !important;
+ }
-.align-content-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
-}
+ .order-sm-2 {
+ order: 2 !important;
+ }
-.align-content-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
-}
+ .order-sm-3 {
+ order: 3 !important;
+ }
-.align-content-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
-}
+ .order-sm-4 {
+ order: 4 !important;
+ }
-.align-content-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
-}
+ .order-sm-5 {
+ order: 5 !important;
+ }
-.align-content-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
-}
+ .order-sm-last {
+ order: 6 !important;
+ }
-.align-self-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
-}
+ .m-sm-0 {
+ margin: 0 !important;
+ }
-.align-self-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
-}
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
-.align-self-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
-}
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
-.align-self-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
-}
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
-.align-self-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
-}
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
-.align-self-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
-}
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
-@media (min-width: 576px) {
- .flex-sm-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ .m-sm-auto {
+ margin: auto !important;
}
- .flex-sm-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
}
- .flex-sm-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
}
- .flex-sm-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
}
- .flex-sm-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
}
- .flex-sm-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
}
- .flex-sm-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
}
- .flex-sm-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
+
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
- .flex-sm-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
+
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
}
- .flex-sm-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
+
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
}
- .flex-sm-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
+
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
}
- .flex-sm-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
+
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
}
- .justify-content-sm-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
}
- .justify-content-sm-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
}
- .justify-content-sm-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
+
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
- .justify-content-sm-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+
+ .mt-sm-0 {
+ margin-top: 0 !important;
}
- .justify-content-sm-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
}
- .align-items-sm-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
}
- .align-items-sm-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+
+ .mt-sm-3 {
+ margin-top: 1rem !important;
}
- .align-items-sm-center {
- -ms-flex-align: center !important;
- align-items: center !important;
+
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
}
- .align-items-sm-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+
+ .mt-sm-5 {
+ margin-top: 3rem !important;
}
- .align-items-sm-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+
+ .mt-sm-auto {
+ margin-top: auto !important;
}
- .align-content-sm-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+
+ .me-sm-0 {
+ margin-right: 0 !important;
}
- .align-content-sm-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+
+ .me-sm-1 {
+ margin-right: 0.25rem !important;
}
- .align-content-sm-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+
+ .me-sm-2 {
+ margin-right: 0.5rem !important;
}
- .align-content-sm-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+
+ .me-sm-3 {
+ margin-right: 1rem !important;
}
- .align-content-sm-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+
+ .me-sm-4 {
+ margin-right: 1.5rem !important;
}
- .align-content-sm-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+
+ .me-sm-5 {
+ margin-right: 3rem !important;
}
- .align-self-sm-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
+
+ .me-sm-auto {
+ margin-right: auto !important;
}
- .align-self-sm-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
}
- .align-self-sm-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
}
- .align-self-sm-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
+
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
}
- .align-self-sm-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
}
- .align-self-sm-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
+
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
}
-}
-@media (min-width: 768px) {
- .flex-md-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
}
- .flex-md-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+
+ .mb-sm-auto {
+ margin-bottom: auto !important;
}
- .flex-md-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+
+ .ms-sm-0 {
+ margin-left: 0 !important;
}
- .flex-md-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+
+ .ms-sm-1 {
+ margin-left: 0.25rem !important;
}
- .flex-md-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+
+ .ms-sm-2 {
+ margin-left: 0.5rem !important;
}
- .flex-md-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+
+ .ms-sm-3 {
+ margin-left: 1rem !important;
}
- .flex-md-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+
+ .ms-sm-4 {
+ margin-left: 1.5rem !important;
}
- .flex-md-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
+
+ .ms-sm-5 {
+ margin-left: 3rem !important;
}
- .flex-md-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
+
+ .ms-sm-auto {
+ margin-left: auto !important;
}
- .flex-md-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
+
+ .p-sm-0 {
+ padding: 0 !important;
}
- .flex-md-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
+
+ .p-sm-1 {
+ padding: 0.25rem !important;
}
- .flex-md-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
+
+ .p-sm-2 {
+ padding: 0.5rem !important;
}
- .justify-content-md-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+
+ .p-sm-3 {
+ padding: 1rem !important;
}
- .justify-content-md-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+
+ .p-sm-4 {
+ padding: 1.5rem !important;
}
- .justify-content-md-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
+
+ .p-sm-5 {
+ padding: 3rem !important;
}
- .justify-content-md-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
}
- .justify-content-md-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
}
- .align-items-md-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
}
- .align-items-md-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
}
- .align-items-md-center {
- -ms-flex-align: center !important;
- align-items: center !important;
+
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
}
- .align-items-md-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
}
- .align-items-md-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
}
- .align-content-md-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
}
- .align-content-md-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
}
- .align-content-md-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
}
- .align-content-md-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
}
- .align-content-md-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
}
- .align-content-md-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+
+ .pt-sm-0 {
+ padding-top: 0 !important;
}
- .align-self-md-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
+
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
}
- .align-self-md-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
}
- .align-self-md-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+
+ .pt-sm-3 {
+ padding-top: 1rem !important;
}
- .align-self-md-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
+
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
}
- .align-self-md-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+
+ .pt-sm-5 {
+ padding-top: 3rem !important;
}
- .align-self-md-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
+
+ .pe-sm-0 {
+ padding-right: 0 !important;
}
-}
-@media (min-width: 992px) {
- .flex-lg-row {
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ .pe-sm-1 {
+ padding-right: 0.25rem !important;
}
- .flex-lg-column {
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+
+ .pe-sm-2 {
+ padding-right: 0.5rem !important;
}
- .flex-lg-row-reverse {
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+
+ .pe-sm-3 {
+ padding-right: 1rem !important;
}
- .flex-lg-column-reverse {
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+
+ .pe-sm-4 {
+ padding-right: 1.5rem !important;
}
- .flex-lg-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+
+ .pe-sm-5 {
+ padding-right: 3rem !important;
}
- .flex-lg-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
}
- .flex-lg-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
}
- .flex-lg-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
+
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
}
- .flex-lg-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
+
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
}
- .flex-lg-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
+
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
}
- .flex-lg-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
+
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
}
- .flex-lg-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
+
+ .ps-sm-0 {
+ padding-left: 0 !important;
}
- .justify-content-lg-start {
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+
+ .ps-sm-1 {
+ padding-left: 0.25rem !important;
}
- .justify-content-lg-end {
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+
+ .ps-sm-2 {
+ padding-left: 0.5rem !important;
}
- .justify-content-lg-center {
- -ms-flex-pack: center !important;
- justify-content: center !important;
+
+ .ps-sm-3 {
+ padding-left: 1rem !important;
}
- .justify-content-lg-between {
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+
+ .ps-sm-4 {
+ padding-left: 1.5rem !important;
}
- .justify-content-lg-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+
+ .ps-sm-5 {
+ padding-left: 3rem !important;
}
- .align-items-lg-start {
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+
+ .text-sm-start {
+ text-align: left !important;
}
- .align-items-lg-end {
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+
+ .text-sm-end {
+ text-align: right !important;
}
- .align-items-lg-center {
- -ms-flex-align: center !important;
- align-items: center !important;
+
+ .text-sm-center {
+ text-align: center !important;
}
- .align-items-lg-baseline {
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+}
+@media (min-width: 768px) {
+ .float-md-start {
+ float: left !important;
}
- .align-items-lg-stretch {
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+
+ .float-md-end {
+ float: right !important;
}
- .align-content-lg-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+
+ .float-md-none {
+ float: none !important;
}
- .align-content-lg-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+
+ .d-md-inline {
+ display: inline !important;
}
- .align-content-lg-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+
+ .d-md-inline-block {
+ display: inline-block !important;
}
- .align-content-lg-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+
+ .d-md-block {
+ display: block !important;
}
- .align-content-lg-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+
+ .d-md-grid {
+ display: grid !important;
}
- .align-content-lg-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+
+ .d-md-table {
+ display: table !important;
}
- .align-self-lg-auto {
- -ms-flex-item-align: auto !important;
- align-self: auto !important;
+
+ .d-md-table-row {
+ display: table-row !important;
}
- .align-self-lg-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+
+ .d-md-table-cell {
+ display: table-cell !important;
}
- .align-self-lg-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+
+ .d-md-flex {
+ display: flex !important;
}
- .align-self-lg-center {
- -ms-flex-item-align: center !important;
- align-self: center !important;
+
+ .d-md-inline-flex {
+ display: inline-flex !important;
}
- .align-self-lg-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+
+ .d-md-none {
+ display: none !important;
}
- .align-self-lg-stretch {
- -ms-flex-item-align: stretch !important;
- align-self: stretch !important;
+
+ .flex-md-fill {
+ flex: 1 1 auto !important;
}
-}
-@media (min-width: 1200px) {
- .flex-xl-row {
- -ms-flex-direction: row !important;
+ .flex-md-row {
flex-direction: row !important;
}
- .flex-xl-column {
- -ms-flex-direction: column !important;
+
+ .flex-md-column {
flex-direction: column !important;
}
- .flex-xl-row-reverse {
- -ms-flex-direction: row-reverse !important;
+
+ .flex-md-row-reverse {
flex-direction: row-reverse !important;
}
- .flex-xl-column-reverse {
- -ms-flex-direction: column-reverse !important;
+
+ .flex-md-column-reverse {
flex-direction: column-reverse !important;
}
- .flex-xl-wrap {
- -ms-flex-wrap: wrap !important;
+
+ .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-md-wrap {
flex-wrap: wrap !important;
}
- .flex-xl-nowrap {
- -ms-flex-wrap: nowrap !important;
+
+ .flex-md-nowrap {
flex-wrap: nowrap !important;
}
- .flex-xl-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
+
+ .flex-md-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
- .flex-xl-fill {
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
+
+ .gap-md-0 {
+ gap: 0 !important;
}
- .flex-xl-grow-0 {
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
+
+ .gap-md-1 {
+ gap: 0.25rem !important;
}
- .flex-xl-grow-1 {
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
+
+ .gap-md-2 {
+ gap: 0.5rem !important;
}
- .flex-xl-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
+
+ .gap-md-3 {
+ gap: 1rem !important;
}
- .flex-xl-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
+
+ .gap-md-4 {
+ gap: 1.5rem !important;
}
- .justify-content-xl-start {
- -ms-flex-pack: start !important;
+
+ .gap-md-5 {
+ gap: 3rem !important;
+ }
+
+ .justify-content-md-start {
justify-content: flex-start !important;
}
- .justify-content-xl-end {
- -ms-flex-pack: end !important;
+
+ .justify-content-md-end {
justify-content: flex-end !important;
}
- .justify-content-xl-center {
- -ms-flex-pack: center !important;
+
+ .justify-content-md-center {
justify-content: center !important;
}
- .justify-content-xl-between {
- -ms-flex-pack: justify !important;
+
+ .justify-content-md-between {
justify-content: space-between !important;
}
- .justify-content-xl-around {
- -ms-flex-pack: distribute !important;
+
+ .justify-content-md-around {
justify-content: space-around !important;
}
- .align-items-xl-start {
- -ms-flex-align: start !important;
+
+ .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-md-start {
align-items: flex-start !important;
}
- .align-items-xl-end {
- -ms-flex-align: end !important;
+
+ .align-items-md-end {
align-items: flex-end !important;
}
- .align-items-xl-center {
- -ms-flex-align: center !important;
+
+ .align-items-md-center {
align-items: center !important;
}
- .align-items-xl-baseline {
- -ms-flex-align: baseline !important;
+
+ .align-items-md-baseline {
align-items: baseline !important;
}
- .align-items-xl-stretch {
- -ms-flex-align: stretch !important;
+
+ .align-items-md-stretch {
align-items: stretch !important;
}
- .align-content-xl-start {
- -ms-flex-line-pack: start !important;
+
+ .align-content-md-start {
align-content: flex-start !important;
}
- .align-content-xl-end {
- -ms-flex-line-pack: end !important;
+
+ .align-content-md-end {
align-content: flex-end !important;
}
- .align-content-xl-center {
- -ms-flex-line-pack: center !important;
+
+ .align-content-md-center {
align-content: center !important;
}
- .align-content-xl-between {
- -ms-flex-line-pack: justify !important;
+
+ .align-content-md-between {
align-content: space-between !important;
}
- .align-content-xl-around {
- -ms-flex-line-pack: distribute !important;
+
+ .align-content-md-around {
align-content: space-around !important;
}
- .align-content-xl-stretch {
- -ms-flex-line-pack: stretch !important;
+
+ .align-content-md-stretch {
align-content: stretch !important;
}
- .align-self-xl-auto {
- -ms-flex-item-align: auto !important;
+
+ .align-self-md-auto {
align-self: auto !important;
}
- .align-self-xl-start {
- -ms-flex-item-align: start !important;
+
+ .align-self-md-start {
align-self: flex-start !important;
}
- .align-self-xl-end {
- -ms-flex-item-align: end !important;
+
+ .align-self-md-end {
align-self: flex-end !important;
}
- .align-self-xl-center {
- -ms-flex-item-align: center !important;
+
+ .align-self-md-center {
align-self: center !important;
}
- .align-self-xl-baseline {
- -ms-flex-item-align: baseline !important;
+
+ .align-self-md-baseline {
align-self: baseline !important;
}
- .align-self-xl-stretch {
- -ms-flex-item-align: stretch !important;
+
+ .align-self-md-stretch {
align-self: stretch !important;
}
-}
-.float-left {
- float: left !important;
-}
+ .order-md-first {
+ order: -1 !important;
+ }
-.float-right {
- float: right !important;
-}
+ .order-md-0 {
+ order: 0 !important;
+ }
-.float-none {
- float: none !important;
-}
+ .order-md-1 {
+ order: 1 !important;
+ }
-@media (min-width: 576px) {
- .float-sm-left {
- float: left !important;
+ .order-md-2 {
+ order: 2 !important;
}
- .float-sm-right {
- float: right !important;
+
+ .order-md-3 {
+ order: 3 !important;
}
- .float-sm-none {
- float: none !important;
+
+ .order-md-4 {
+ order: 4 !important;
}
-}
-@media (min-width: 768px) {
- .float-md-left {
- float: left !important;
+ .order-md-5 {
+ order: 5 !important;
}
- .float-md-right {
- float: right !important;
+
+ .order-md-last {
+ order: 6 !important;
}
- .float-md-none {
- float: none !important;
+
+ .m-md-0 {
+ margin: 0 !important;
}
-}
-@media (min-width: 992px) {
- .float-lg-left {
- float: left !important;
+ .m-md-1 {
+ margin: 0.25rem !important;
}
- .float-lg-right {
- float: right !important;
+
+ .m-md-2 {
+ margin: 0.5rem !important;
}
- .float-lg-none {
- float: none !important;
+
+ .m-md-3 {
+ margin: 1rem !important;
}
-}
-@media (min-width: 1200px) {
- .float-xl-left {
- float: left !important;
+ .m-md-4 {
+ margin: 1.5rem !important;
}
- .float-xl-right {
- float: right !important;
+
+ .m-md-5 {
+ margin: 3rem !important;
}
- .float-xl-none {
- float: none !important;
+
+ .m-md-auto {
+ margin: auto !important;
}
-}
-.user-select-all {
- -webkit-user-select: all !important;
- -moz-user-select: all !important;
- -ms-user-select: all !important;
- user-select: all !important;
-}
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
-.user-select-auto {
- -webkit-user-select: auto !important;
- -moz-user-select: auto !important;
- -ms-user-select: auto !important;
- user-select: auto !important;
-}
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
-.user-select-none {
- -webkit-user-select: none !important;
- -moz-user-select: none !important;
- -ms-user-select: none !important;
- user-select: none !important;
-}
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
-.overflow-auto {
- overflow: auto !important;
-}
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
-.overflow-hidden {
- overflow: hidden !important;
-}
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
-.position-static {
- position: static !important;
-}
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
-.position-relative {
- position: relative !important;
-}
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
-.position-absolute {
- position: absolute !important;
-}
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
-.position-fixed {
- position: fixed !important;
-}
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
-.position-sticky {
- position: -webkit-sticky !important;
- position: sticky !important;
-}
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1030;
-}
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1030;
-}
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
-@supports ((position: -webkit-sticky) or (position: sticky)) {
- .sticky-top {
- position: -webkit-sticky;
- position: sticky;
- top: 0;
- z-index: 1020;
+ .mb-md-auto {
+ margin-bottom: auto !important;
}
-}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border: 0;
-}
+ .ms-md-0 {
+ margin-left: 0 !important;
+ }
-.sr-only-focusable:active, .sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- overflow: visible;
- clip: auto;
- white-space: normal;
-}
+ .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
-.shadow-sm {
- box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
-}
+ .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
-.shadow {
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
-}
+ .ms-md-3 {
+ margin-left: 1rem !important;
+ }
-.shadow-lg {
- box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
-}
+ .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
-.shadow-none {
- box-shadow: none !important;
-}
+ .ms-md-5 {
+ margin-left: 3rem !important;
+ }
-.w-25 {
- width: 25% !important;
-}
+ .ms-md-auto {
+ margin-left: auto !important;
+ }
-.w-50 {
- width: 50% !important;
-}
+ .p-md-0 {
+ padding: 0 !important;
+ }
-.w-75 {
- width: 75% !important;
-}
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
-.w-100 {
- width: 100% !important;
-}
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
-.w-auto {
- width: auto !important;
-}
+ .p-md-3 {
+ padding: 1rem !important;
+ }
-.h-25 {
- height: 25% !important;
-}
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
-.h-50 {
- height: 50% !important;
-}
+ .p-md-5 {
+ padding: 3rem !important;
+ }
-.h-75 {
- height: 75% !important;
-}
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
-.h-100 {
- height: 100% !important;
-}
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
-.h-auto {
- height: auto !important;
-}
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
-.mw-100 {
- max-width: 100% !important;
-}
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
-.mh-100 {
- max-height: 100% !important;
-}
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
-.min-vw-100 {
- min-width: 100vw !important;
-}
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
-.min-vh-100 {
- min-height: 100vh !important;
-}
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
-.vw-100 {
- width: 100vw !important;
-}
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
-.vh-100 {
- height: 100vh !important;
-}
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
-.m-0 {
- margin: 0 !important;
-}
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
-.mt-0,
-.my-0 {
- margin-top: 0 !important;
-}
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
-.mr-0,
-.mx-0 {
- margin-right: 0 !important;
-}
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
-.mb-0,
-.my-0 {
- margin-bottom: 0 !important;
-}
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
-.ml-0,
-.mx-0 {
- margin-left: 0 !important;
-}
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
-.m-1 {
- margin: 0.25rem !important;
-}
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
-.mt-1,
-.my-1 {
- margin-top: 0.25rem !important;
-}
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
-.mr-1,
-.mx-1 {
- margin-right: 0.25rem !important;
-}
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
-.mb-1,
-.my-1 {
- margin-bottom: 0.25rem !important;
-}
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
-.ml-1,
-.mx-1 {
- margin-left: 0.25rem !important;
-}
+ .pe-md-0 {
+ padding-right: 0 !important;
+ }
-.m-2 {
- margin: 0.5rem !important;
-}
+ .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
-.mt-2,
-.my-2 {
- margin-top: 0.5rem !important;
-}
+ .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
-.mr-2,
-.mx-2 {
- margin-right: 0.5rem !important;
-}
+ .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
-.mb-2,
-.my-2 {
- margin-bottom: 0.5rem !important;
-}
+ .pe-md-5 {
+ padding-right: 3rem !important;
+ }
-.ml-2,
-.mx-2 {
- margin-left: 0.5rem !important;
-}
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
-.m-3 {
- margin: 1rem !important;
-}
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
-.mt-3,
-.my-3 {
- margin-top: 1rem !important;
-}
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
-.mr-3,
-.mx-3 {
- margin-right: 1rem !important;
-}
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
-.mb-3,
-.my-3 {
- margin-bottom: 1rem !important;
-}
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
-.ml-3,
-.mx-3 {
- margin-left: 1rem !important;
-}
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
-.m-4 {
- margin: 1.5rem !important;
-}
+ .ps-md-0 {
+ padding-left: 0 !important;
+ }
-.mt-4,
-.my-4 {
- margin-top: 1.5rem !important;
-}
+ .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
-.mr-4,
-.mx-4 {
- margin-right: 1.5rem !important;
-}
+ .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
-.mb-4,
-.my-4 {
- margin-bottom: 1.5rem !important;
-}
+ .ps-md-3 {
+ padding-left: 1rem !important;
+ }
-.ml-4,
-.mx-4 {
- margin-left: 1.5rem !important;
-}
+ .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
-.m-5 {
- margin: 3rem !important;
-}
+ .ps-md-5 {
+ padding-left: 3rem !important;
+ }
-.mt-5,
-.my-5 {
- margin-top: 3rem !important;
-}
+ .text-md-start {
+ text-align: left !important;
+ }
-.mr-5,
-.mx-5 {
- margin-right: 3rem !important;
-}
+ .text-md-end {
+ text-align: right !important;
+ }
-.mb-5,
-.my-5 {
- margin-bottom: 3rem !important;
+ .text-md-center {
+ text-align: center !important;
+ }
}
+@media (min-width: 992px) {
+ .float-lg-start {
+ float: left !important;
+ }
-.ml-5,
-.mx-5 {
- margin-left: 3rem !important;
-}
+ .float-lg-end {
+ float: right !important;
+ }
-.p-0 {
- padding: 0 !important;
-}
+ .float-lg-none {
+ float: none !important;
+ }
-.pt-0,
-.py-0 {
- padding-top: 0 !important;
-}
+ .d-lg-inline {
+ display: inline !important;
+ }
-.pr-0,
-.px-0 {
- padding-right: 0 !important;
-}
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
-.pb-0,
-.py-0 {
- padding-bottom: 0 !important;
-}
+ .d-lg-block {
+ display: block !important;
+ }
-.pl-0,
-.px-0 {
- padding-left: 0 !important;
-}
+ .d-lg-grid {
+ display: grid !important;
+ }
-.p-1 {
- padding: 0.25rem !important;
-}
+ .d-lg-table {
+ display: table !important;
+ }
-.pt-1,
-.py-1 {
- padding-top: 0.25rem !important;
-}
+ .d-lg-table-row {
+ display: table-row !important;
+ }
-.pr-1,
-.px-1 {
- padding-right: 0.25rem !important;
-}
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
-.pb-1,
-.py-1 {
- padding-bottom: 0.25rem !important;
-}
+ .d-lg-flex {
+ display: flex !important;
+ }
-.pl-1,
-.px-1 {
- padding-left: 0.25rem !important;
-}
+ .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
-.p-2 {
- padding: 0.5rem !important;
-}
+ .d-lg-none {
+ display: none !important;
+ }
-.pt-2,
-.py-2 {
- padding-top: 0.5rem !important;
-}
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
-.pr-2,
-.px-2 {
- padding-right: 0.5rem !important;
-}
+ .flex-lg-row {
+ flex-direction: row !important;
+ }
-.pb-2,
-.py-2 {
- padding-bottom: 0.5rem !important;
-}
+ .flex-lg-column {
+ flex-direction: column !important;
+ }
-.pl-2,
-.px-2 {
- padding-left: 0.5rem !important;
-}
+ .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
-.p-3 {
- padding: 1rem !important;
-}
+ .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
-.pt-3,
-.py-3 {
- padding-top: 1rem !important;
-}
+ .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
-.pr-3,
-.px-3 {
- padding-right: 1rem !important;
-}
+ .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
-.pb-3,
-.py-3 {
- padding-bottom: 1rem !important;
-}
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
-.pl-3,
-.px-3 {
- padding-left: 1rem !important;
-}
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
-.p-4 {
- padding: 1.5rem !important;
-}
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
-.pt-4,
-.py-4 {
- padding-top: 1.5rem !important;
-}
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
-.pr-4,
-.px-4 {
- padding-right: 1.5rem !important;
-}
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
-.pb-4,
-.py-4 {
- padding-bottom: 1.5rem !important;
-}
+ .gap-lg-0 {
+ gap: 0 !important;
+ }
-.pl-4,
-.px-4 {
- padding-left: 1.5rem !important;
-}
+ .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
-.p-5 {
- padding: 3rem !important;
-}
+ .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
-.pt-5,
-.py-5 {
- padding-top: 3rem !important;
-}
+ .gap-lg-3 {
+ gap: 1rem !important;
+ }
-.pr-5,
-.px-5 {
- padding-right: 3rem !important;
-}
+ .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
-.pb-5,
-.py-5 {
- padding-bottom: 3rem !important;
-}
+ .gap-lg-5 {
+ gap: 3rem !important;
+ }
-.pl-5,
-.px-5 {
- padding-left: 3rem !important;
-}
+ .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
-.m-n1 {
- margin: -0.25rem !important;
-}
+ .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
-.mt-n1,
-.my-n1 {
- margin-top: -0.25rem !important;
-}
+ .justify-content-lg-center {
+ justify-content: center !important;
+ }
-.mr-n1,
-.mx-n1 {
- margin-right: -0.25rem !important;
-}
+ .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
-.mb-n1,
-.my-n1 {
- margin-bottom: -0.25rem !important;
-}
+ .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
-.ml-n1,
-.mx-n1 {
- margin-left: -0.25rem !important;
-}
+ .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
-.m-n2 {
- margin: -0.5rem !important;
-}
+ .align-items-lg-start {
+ align-items: flex-start !important;
+ }
-.mt-n2,
-.my-n2 {
- margin-top: -0.5rem !important;
-}
+ .align-items-lg-end {
+ align-items: flex-end !important;
+ }
-.mr-n2,
-.mx-n2 {
- margin-right: -0.5rem !important;
-}
+ .align-items-lg-center {
+ align-items: center !important;
+ }
-.mb-n2,
-.my-n2 {
- margin-bottom: -0.5rem !important;
-}
+ .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
-.ml-n2,
-.mx-n2 {
- margin-left: -0.5rem !important;
-}
+ .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
-.m-n3 {
- margin: -1rem !important;
-}
+ .align-content-lg-start {
+ align-content: flex-start !important;
+ }
-.mt-n3,
-.my-n3 {
- margin-top: -1rem !important;
-}
+ .align-content-lg-end {
+ align-content: flex-end !important;
+ }
-.mr-n3,
-.mx-n3 {
- margin-right: -1rem !important;
-}
+ .align-content-lg-center {
+ align-content: center !important;
+ }
-.mb-n3,
-.my-n3 {
- margin-bottom: -1rem !important;
-}
+ .align-content-lg-between {
+ align-content: space-between !important;
+ }
-.ml-n3,
-.mx-n3 {
- margin-left: -1rem !important;
-}
+ .align-content-lg-around {
+ align-content: space-around !important;
+ }
-.m-n4 {
- margin: -1.5rem !important;
-}
+ .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
-.mt-n4,
-.my-n4 {
- margin-top: -1.5rem !important;
-}
+ .align-self-lg-auto {
+ align-self: auto !important;
+ }
-.mr-n4,
-.mx-n4 {
- margin-right: -1.5rem !important;
-}
+ .align-self-lg-start {
+ align-self: flex-start !important;
+ }
-.mb-n4,
-.my-n4 {
- margin-bottom: -1.5rem !important;
-}
+ .align-self-lg-end {
+ align-self: flex-end !important;
+ }
-.ml-n4,
-.mx-n4 {
- margin-left: -1.5rem !important;
-}
+ .align-self-lg-center {
+ align-self: center !important;
+ }
-.m-n5 {
- margin: -3rem !important;
-}
+ .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
-.mt-n5,
-.my-n5 {
- margin-top: -3rem !important;
-}
+ .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
-.mr-n5,
-.mx-n5 {
- margin-right: -3rem !important;
-}
+ .order-lg-first {
+ order: -1 !important;
+ }
-.mb-n5,
-.my-n5 {
- margin-bottom: -3rem !important;
-}
+ .order-lg-0 {
+ order: 0 !important;
+ }
-.ml-n5,
-.mx-n5 {
- margin-left: -3rem !important;
-}
+ .order-lg-1 {
+ order: 1 !important;
+ }
-.m-auto {
- margin: auto !important;
-}
+ .order-lg-2 {
+ order: 2 !important;
+ }
-.mt-auto,
-.my-auto {
- margin-top: auto !important;
-}
+ .order-lg-3 {
+ order: 3 !important;
+ }
-.mr-auto,
-.mx-auto {
- margin-right: auto !important;
-}
+ .order-lg-4 {
+ order: 4 !important;
+ }
-.mb-auto,
-.my-auto {
- margin-bottom: auto !important;
-}
+ .order-lg-5 {
+ order: 5 !important;
+ }
-.ml-auto,
-.mx-auto {
- margin-left: auto !important;
-}
+ .order-lg-last {
+ order: 6 !important;
+ }
-@media (min-width: 576px) {
- .m-sm-0 {
+ .m-lg-0 {
margin: 0 !important;
}
- .mt-sm-0,
- .my-sm-0 {
- margin-top: 0 !important;
- }
- .mr-sm-0,
- .mx-sm-0 {
- margin-right: 0 !important;
+
+ .m-lg-1 {
+ margin: 0.25rem !important;
}
- .mb-sm-0,
- .my-sm-0 {
- margin-bottom: 0 !important;
+
+ .m-lg-2 {
+ margin: 0.5rem !important;
}
- .ml-sm-0,
- .mx-sm-0 {
- margin-left: 0 !important;
+
+ .m-lg-3 {
+ margin: 1rem !important;
}
- .m-sm-1 {
- margin: 0.25rem !important;
+
+ .m-lg-4 {
+ margin: 1.5rem !important;
}
- .mt-sm-1,
- .my-sm-1 {
- margin-top: 0.25rem !important;
+
+ .m-lg-5 {
+ margin: 3rem !important;
}
- .mr-sm-1,
- .mx-sm-1 {
- margin-right: 0.25rem !important;
+
+ .m-lg-auto {
+ margin: auto !important;
}
- .mb-sm-1,
- .my-sm-1 {
- margin-bottom: 0.25rem !important;
+
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
}
- .ml-sm-1,
- .mx-sm-1 {
+
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
- .m-sm-2 {
- margin: 0.5rem !important;
+
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
}
- .mt-sm-2,
- .my-sm-2 {
- margin-top: 0.5rem !important;
+
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
}
- .mr-sm-2,
- .mx-sm-2 {
- margin-right: 0.5rem !important;
+
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
}
- .mb-sm-2,
- .my-sm-2 {
- margin-bottom: 0.5rem !important;
+
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
}
- .ml-sm-2,
- .mx-sm-2 {
- margin-left: 0.5rem !important;
+
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
- .m-sm-3 {
- margin: 1rem !important;
+
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
}
- .mt-sm-3,
- .my-sm-3 {
- margin-top: 1rem !important;
+
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
}
- .mr-sm-3,
- .mx-sm-3 {
- margin-right: 1rem !important;
+
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
}
- .mb-sm-3,
- .my-sm-3 {
+
+ .my-lg-3 {
+ margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
- .ml-sm-3,
- .mx-sm-3 {
- margin-left: 1rem !important;
+
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
}
- .m-sm-4 {
- margin: 1.5rem !important;
+
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
}
- .mt-sm-4,
- .my-sm-4 {
- margin-top: 1.5rem !important;
+
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
- .mr-sm-4,
- .mx-sm-4 {
- margin-right: 1.5rem !important;
+
+ .mt-lg-0 {
+ margin-top: 0 !important;
}
- .mb-sm-4,
- .my-sm-4 {
- margin-bottom: 1.5rem !important;
+
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
}
- .ml-sm-4,
- .mx-sm-4 {
- margin-left: 1.5rem !important;
+
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
}
- .m-sm-5 {
- margin: 3rem !important;
+
+ .mt-lg-3 {
+ margin-top: 1rem !important;
}
- .mt-sm-5,
- .my-sm-5 {
+
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-lg-5 {
margin-top: 3rem !important;
}
- .mr-sm-5,
- .mx-sm-5 {
- margin-right: 3rem !important;
- }
- .mb-sm-5,
- .my-sm-5 {
- margin-bottom: 3rem !important;
+
+ .mt-lg-auto {
+ margin-top: auto !important;
}
- .ml-sm-5,
- .mx-sm-5 {
- margin-left: 3rem !important;
+
+ .me-lg-0 {
+ margin-right: 0 !important;
}
- .p-sm-0 {
- padding: 0 !important;
+
+ .me-lg-1 {
+ margin-right: 0.25rem !important;
}
- .pt-sm-0,
- .py-sm-0 {
- padding-top: 0 !important;
+
+ .me-lg-2 {
+ margin-right: 0.5rem !important;
}
- .pr-sm-0,
- .px-sm-0 {
- padding-right: 0 !important;
+
+ .me-lg-3 {
+ margin-right: 1rem !important;
}
- .pb-sm-0,
- .py-sm-0 {
- padding-bottom: 0 !important;
+
+ .me-lg-4 {
+ margin-right: 1.5rem !important;
}
- .pl-sm-0,
- .px-sm-0 {
- padding-left: 0 !important;
+
+ .me-lg-5 {
+ margin-right: 3rem !important;
}
- .p-sm-1 {
- padding: 0.25rem !important;
+
+ .me-lg-auto {
+ margin-right: auto !important;
}
- .pt-sm-1,
- .py-sm-1 {
- padding-top: 0.25rem !important;
+
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
}
- .pr-sm-1,
- .px-sm-1 {
- padding-right: 0.25rem !important;
+
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
}
- .pb-sm-1,
- .py-sm-1 {
- padding-bottom: 0.25rem !important;
+
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
}
- .pl-sm-1,
- .px-sm-1 {
- padding-left: 0.25rem !important;
+
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
}
- .p-sm-2 {
- padding: 0.5rem !important;
+
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
}
- .pt-sm-2,
- .py-sm-2 {
- padding-top: 0.5rem !important;
+
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
}
- .pr-sm-2,
- .px-sm-2 {
- padding-right: 0.5rem !important;
+
+ .mb-lg-auto {
+ margin-bottom: auto !important;
}
- .pb-sm-2,
- .py-sm-2 {
- padding-bottom: 0.5rem !important;
+
+ .ms-lg-0 {
+ margin-left: 0 !important;
}
- .pl-sm-2,
- .px-sm-2 {
- padding-left: 0.5rem !important;
+
+ .ms-lg-1 {
+ margin-left: 0.25rem !important;
}
- .p-sm-3 {
- padding: 1rem !important;
+
+ .ms-lg-2 {
+ margin-left: 0.5rem !important;
}
- .pt-sm-3,
- .py-sm-3 {
- padding-top: 1rem !important;
+
+ .ms-lg-3 {
+ margin-left: 1rem !important;
}
- .pr-sm-3,
- .px-sm-3 {
- padding-right: 1rem !important;
+
+ .ms-lg-4 {
+ margin-left: 1.5rem !important;
}
- .pb-sm-3,
- .py-sm-3 {
- padding-bottom: 1rem !important;
+
+ .ms-lg-5 {
+ margin-left: 3rem !important;
}
- .pl-sm-3,
- .px-sm-3 {
- padding-left: 1rem !important;
+
+ .ms-lg-auto {
+ margin-left: auto !important;
}
- .p-sm-4 {
- padding: 1.5rem !important;
+
+ .p-lg-0 {
+ padding: 0 !important;
}
- .pt-sm-4,
- .py-sm-4 {
- padding-top: 1.5rem !important;
+
+ .p-lg-1 {
+ padding: 0.25rem !important;
}
- .pr-sm-4,
- .px-sm-4 {
- padding-right: 1.5rem !important;
+
+ .p-lg-2 {
+ padding: 0.5rem !important;
}
- .pb-sm-4,
- .py-sm-4 {
- padding-bottom: 1.5rem !important;
+
+ .p-lg-3 {
+ padding: 1rem !important;
}
- .pl-sm-4,
- .px-sm-4 {
- padding-left: 1.5rem !important;
+
+ .p-lg-4 {
+ padding: 1.5rem !important;
}
- .p-sm-5 {
+
+ .p-lg-5 {
padding: 3rem !important;
}
- .pt-sm-5,
- .py-sm-5 {
- padding-top: 3rem !important;
+
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
}
- .pr-sm-5,
- .px-sm-5 {
- padding-right: 3rem !important;
+
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
}
- .pb-sm-5,
- .py-sm-5 {
- padding-bottom: 3rem !important;
+
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
}
- .pl-sm-5,
- .px-sm-5 {
- padding-left: 3rem !important;
+
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
}
- .m-sm-n1 {
- margin: -0.25rem !important;
+
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
}
- .mt-sm-n1,
- .my-sm-n1 {
- margin-top: -0.25rem !important;
+
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
}
- .mr-sm-n1,
- .mx-sm-n1 {
- margin-right: -0.25rem !important;
+
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
}
- .mb-sm-n1,
- .my-sm-n1 {
- margin-bottom: -0.25rem !important;
+
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
}
- .ml-sm-n1,
- .mx-sm-n1 {
- margin-left: -0.25rem !important;
+
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
}
- .m-sm-n2 {
- margin: -0.5rem !important;
+
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
}
- .mt-sm-n2,
- .my-sm-n2 {
- margin-top: -0.5rem !important;
+
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
}
- .mr-sm-n2,
- .mx-sm-n2 {
- margin-right: -0.5rem !important;
+
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
}
- .mb-sm-n2,
- .my-sm-n2 {
- margin-bottom: -0.5rem !important;
+
+ .pt-lg-0 {
+ padding-top: 0 !important;
}
- .ml-sm-n2,
- .mx-sm-n2 {
- margin-left: -0.5rem !important;
+
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
}
- .m-sm-n3 {
- margin: -1rem !important;
+
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
}
- .mt-sm-n3,
- .my-sm-n3 {
- margin-top: -1rem !important;
+
+ .pt-lg-3 {
+ padding-top: 1rem !important;
}
- .mr-sm-n3,
- .mx-sm-n3 {
- margin-right: -1rem !important;
+
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
}
- .mb-sm-n3,
- .my-sm-n3 {
- margin-bottom: -1rem !important;
+
+ .pt-lg-5 {
+ padding-top: 3rem !important;
}
- .ml-sm-n3,
- .mx-sm-n3 {
- margin-left: -1rem !important;
+
+ .pe-lg-0 {
+ padding-right: 0 !important;
}
- .m-sm-n4 {
- margin: -1.5rem !important;
+
+ .pe-lg-1 {
+ padding-right: 0.25rem !important;
}
- .mt-sm-n4,
- .my-sm-n4 {
- margin-top: -1.5rem !important;
+
+ .pe-lg-2 {
+ padding-right: 0.5rem !important;
}
- .mr-sm-n4,
- .mx-sm-n4 {
- margin-right: -1.5rem !important;
+
+ .pe-lg-3 {
+ padding-right: 1rem !important;
}
- .mb-sm-n4,
- .my-sm-n4 {
- margin-bottom: -1.5rem !important;
+
+ .pe-lg-4 {
+ padding-right: 1.5rem !important;
}
- .ml-sm-n4,
- .mx-sm-n4 {
- margin-left: -1.5rem !important;
+
+ .pe-lg-5 {
+ padding-right: 3rem !important;
}
- .m-sm-n5 {
- margin: -3rem !important;
+
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
}
- .mt-sm-n5,
- .my-sm-n5 {
- margin-top: -3rem !important;
+
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
}
- .mr-sm-n5,
- .mx-sm-n5 {
- margin-right: -3rem !important;
+
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
}
- .mb-sm-n5,
- .my-sm-n5 {
- margin-bottom: -3rem !important;
+
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
}
- .ml-sm-n5,
- .mx-sm-n5 {
- margin-left: -3rem !important;
+
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
}
- .m-sm-auto {
- margin: auto !important;
+
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
}
- .mt-sm-auto,
- .my-sm-auto {
- margin-top: auto !important;
+
+ .ps-lg-0 {
+ padding-left: 0 !important;
}
- .mr-sm-auto,
- .mx-sm-auto {
- margin-right: auto !important;
+
+ .ps-lg-1 {
+ padding-left: 0.25rem !important;
}
- .mb-sm-auto,
- .my-sm-auto {
- margin-bottom: auto !important;
+
+ .ps-lg-2 {
+ padding-left: 0.5rem !important;
}
- .ml-sm-auto,
- .mx-sm-auto {
- margin-left: auto !important;
+
+ .ps-lg-3 {
+ padding-left: 1rem !important;
}
-}
-@media (min-width: 768px) {
- .m-md-0 {
- margin: 0 !important;
+ .ps-lg-4 {
+ padding-left: 1.5rem !important;
}
- .mt-md-0,
- .my-md-0 {
- margin-top: 0 !important;
+
+ .ps-lg-5 {
+ padding-left: 3rem !important;
}
- .mr-md-0,
- .mx-md-0 {
- margin-right: 0 !important;
+
+ .text-lg-start {
+ text-align: left !important;
}
- .mb-md-0,
- .my-md-0 {
- margin-bottom: 0 !important;
+
+ .text-lg-end {
+ text-align: right !important;
}
- .ml-md-0,
- .mx-md-0 {
- margin-left: 0 !important;
+
+ .text-lg-center {
+ text-align: center !important;
}
- .m-md-1 {
- margin: 0.25rem !important;
+}
+@media (min-width: 1200px) {
+ .float-xl-start {
+ float: left !important;
}
- .mt-md-1,
- .my-md-1 {
- margin-top: 0.25rem !important;
+
+ .float-xl-end {
+ float: right !important;
}
- .mr-md-1,
- .mx-md-1 {
- margin-right: 0.25rem !important;
+
+ .float-xl-none {
+ float: none !important;
}
- .mb-md-1,
- .my-md-1 {
- margin-bottom: 0.25rem !important;
+
+ .d-xl-inline {
+ display: inline !important;
}
- .ml-md-1,
- .mx-md-1 {
- margin-left: 0.25rem !important;
+
+ .d-xl-inline-block {
+ display: inline-block !important;
}
- .m-md-2 {
- margin: 0.5rem !important;
+
+ .d-xl-block {
+ display: block !important;
}
- .mt-md-2,
- .my-md-2 {
- margin-top: 0.5rem !important;
+
+ .d-xl-grid {
+ display: grid !important;
}
- .mr-md-2,
- .mx-md-2 {
- margin-right: 0.5rem !important;
+
+ .d-xl-table {
+ display: table !important;
}
- .mb-md-2,
- .my-md-2 {
- margin-bottom: 0.5rem !important;
+
+ .d-xl-table-row {
+ display: table-row !important;
}
- .ml-md-2,
- .mx-md-2 {
- margin-left: 0.5rem !important;
+
+ .d-xl-table-cell {
+ display: table-cell !important;
}
- .m-md-3 {
- margin: 1rem !important;
+
+ .d-xl-flex {
+ display: flex !important;
}
- .mt-md-3,
- .my-md-3 {
- margin-top: 1rem !important;
+
+ .d-xl-inline-flex {
+ display: inline-flex !important;
}
- .mr-md-3,
- .mx-md-3 {
- margin-right: 1rem !important;
+
+ .d-xl-none {
+ display: none !important;
}
- .mb-md-3,
- .my-md-3 {
- margin-bottom: 1rem !important;
+
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
}
- .ml-md-3,
- .mx-md-3 {
- margin-left: 1rem !important;
+
+ .flex-xl-row {
+ flex-direction: row !important;
}
- .m-md-4 {
- margin: 1.5rem !important;
+
+ .flex-xl-column {
+ flex-direction: column !important;
}
- .mt-md-4,
- .my-md-4 {
- margin-top: 1.5rem !important;
+
+ .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
}
- .mr-md-4,
- .mx-md-4 {
- margin-right: 1.5rem !important;
+
+ .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
}
- .mb-md-4,
- .my-md-4 {
- margin-bottom: 1.5rem !important;
+
+ .flex-xl-grow-0 {
+ flex-grow: 0 !important;
}
- .ml-md-4,
- .mx-md-4 {
- margin-left: 1.5rem !important;
+
+ .flex-xl-grow-1 {
+ flex-grow: 1 !important;
}
- .m-md-5 {
- margin: 3rem !important;
+
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
}
- .mt-md-5,
- .my-md-5 {
- margin-top: 3rem !important;
+
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
}
- .mr-md-5,
- .mx-md-5 {
- margin-right: 3rem !important;
+
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
}
- .mb-md-5,
- .my-md-5 {
- margin-bottom: 3rem !important;
+
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
}
- .ml-md-5,
- .mx-md-5 {
- margin-left: 3rem !important;
+
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
}
- .p-md-0 {
- padding: 0 !important;
+
+ .gap-xl-0 {
+ gap: 0 !important;
}
- .pt-md-0,
- .py-md-0 {
- padding-top: 0 !important;
+
+ .gap-xl-1 {
+ gap: 0.25rem !important;
}
- .pr-md-0,
- .px-md-0 {
- padding-right: 0 !important;
+
+ .gap-xl-2 {
+ gap: 0.5rem !important;
}
- .pb-md-0,
- .py-md-0 {
- padding-bottom: 0 !important;
+
+ .gap-xl-3 {
+ gap: 1rem !important;
}
- .pl-md-0,
- .px-md-0 {
- padding-left: 0 !important;
+
+ .gap-xl-4 {
+ gap: 1.5rem !important;
}
- .p-md-1 {
- padding: 0.25rem !important;
+
+ .gap-xl-5 {
+ gap: 3rem !important;
}
- .pt-md-1,
- .py-md-1 {
- padding-top: 0.25rem !important;
+
+ .justify-content-xl-start {
+ justify-content: flex-start !important;
}
- .pr-md-1,
- .px-md-1 {
- padding-right: 0.25rem !important;
+
+ .justify-content-xl-end {
+ justify-content: flex-end !important;
}
- .pb-md-1,
- .py-md-1 {
- padding-bottom: 0.25rem !important;
+
+ .justify-content-xl-center {
+ justify-content: center !important;
}
- .pl-md-1,
- .px-md-1 {
- padding-left: 0.25rem !important;
+
+ .justify-content-xl-between {
+ justify-content: space-between !important;
}
- .p-md-2 {
- padding: 0.5rem !important;
+
+ .justify-content-xl-around {
+ justify-content: space-around !important;
}
- .pt-md-2,
- .py-md-2 {
- padding-top: 0.5rem !important;
+
+ .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
}
- .pr-md-2,
- .px-md-2 {
- padding-right: 0.5rem !important;
+
+ .align-items-xl-start {
+ align-items: flex-start !important;
}
- .pb-md-2,
- .py-md-2 {
- padding-bottom: 0.5rem !important;
+
+ .align-items-xl-end {
+ align-items: flex-end !important;
}
- .pl-md-2,
- .px-md-2 {
- padding-left: 0.5rem !important;
+
+ .align-items-xl-center {
+ align-items: center !important;
}
- .p-md-3 {
- padding: 1rem !important;
+
+ .align-items-xl-baseline {
+ align-items: baseline !important;
}
- .pt-md-3,
- .py-md-3 {
- padding-top: 1rem !important;
+
+ .align-items-xl-stretch {
+ align-items: stretch !important;
}
- .pr-md-3,
- .px-md-3 {
- padding-right: 1rem !important;
+
+ .align-content-xl-start {
+ align-content: flex-start !important;
}
- .pb-md-3,
- .py-md-3 {
- padding-bottom: 1rem !important;
+
+ .align-content-xl-end {
+ align-content: flex-end !important;
}
- .pl-md-3,
- .px-md-3 {
- padding-left: 1rem !important;
+
+ .align-content-xl-center {
+ align-content: center !important;
}
- .p-md-4 {
- padding: 1.5rem !important;
+
+ .align-content-xl-between {
+ align-content: space-between !important;
}
- .pt-md-4,
- .py-md-4 {
- padding-top: 1.5rem !important;
+
+ .align-content-xl-around {
+ align-content: space-around !important;
}
- .pr-md-4,
- .px-md-4 {
- padding-right: 1.5rem !important;
+
+ .align-content-xl-stretch {
+ align-content: stretch !important;
}
- .pb-md-4,
- .py-md-4 {
- padding-bottom: 1.5rem !important;
+
+ .align-self-xl-auto {
+ align-self: auto !important;
}
- .pl-md-4,
- .px-md-4 {
- padding-left: 1.5rem !important;
+
+ .align-self-xl-start {
+ align-self: flex-start !important;
}
- .p-md-5 {
- padding: 3rem !important;
+
+ .align-self-xl-end {
+ align-self: flex-end !important;
}
- .pt-md-5,
- .py-md-5 {
- padding-top: 3rem !important;
+
+ .align-self-xl-center {
+ align-self: center !important;
}
- .pr-md-5,
- .px-md-5 {
- padding-right: 3rem !important;
+
+ .align-self-xl-baseline {
+ align-self: baseline !important;
}
- .pb-md-5,
- .py-md-5 {
- padding-bottom: 3rem !important;
+
+ .align-self-xl-stretch {
+ align-self: stretch !important;
}
- .pl-md-5,
- .px-md-5 {
- padding-left: 3rem !important;
+
+ .order-xl-first {
+ order: -1 !important;
}
- .m-md-n1 {
- margin: -0.25rem !important;
+
+ .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .order-xl-1 {
+ order: 1 !important;
}
- .mt-md-n1,
- .my-md-n1 {
- margin-top: -0.25rem !important;
+
+ .order-xl-2 {
+ order: 2 !important;
}
- .mr-md-n1,
- .mx-md-n1 {
- margin-right: -0.25rem !important;
+
+ .order-xl-3 {
+ order: 3 !important;
}
- .mb-md-n1,
- .my-md-n1 {
- margin-bottom: -0.25rem !important;
+
+ .order-xl-4 {
+ order: 4 !important;
}
- .ml-md-n1,
- .mx-md-n1 {
- margin-left: -0.25rem !important;
+
+ .order-xl-5 {
+ order: 5 !important;
}
- .m-md-n2 {
- margin: -0.5rem !important;
+
+ .order-xl-last {
+ order: 6 !important;
}
- .mt-md-n2,
- .my-md-n2 {
- margin-top: -0.5rem !important;
+
+ .m-xl-0 {
+ margin: 0 !important;
}
- .mr-md-n2,
- .mx-md-n2 {
- margin-right: -0.5rem !important;
+
+ .m-xl-1 {
+ margin: 0.25rem !important;
}
- .mb-md-n2,
- .my-md-n2 {
- margin-bottom: -0.5rem !important;
+
+ .m-xl-2 {
+ margin: 0.5rem !important;
}
- .ml-md-n2,
- .mx-md-n2 {
- margin-left: -0.5rem !important;
+
+ .m-xl-3 {
+ margin: 1rem !important;
}
- .m-md-n3 {
- margin: -1rem !important;
+
+ .m-xl-4 {
+ margin: 1.5rem !important;
}
- .mt-md-n3,
- .my-md-n3 {
- margin-top: -1rem !important;
+
+ .m-xl-5 {
+ margin: 3rem !important;
}
- .mr-md-n3,
- .mx-md-n3 {
- margin-right: -1rem !important;
+
+ .m-xl-auto {
+ margin: auto !important;
}
- .mb-md-n3,
- .my-md-n3 {
- margin-bottom: -1rem !important;
+
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
}
- .ml-md-n3,
- .mx-md-n3 {
- margin-left: -1rem !important;
+
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
}
- .m-md-n4 {
- margin: -1.5rem !important;
+
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
}
- .mt-md-n4,
- .my-md-n4 {
- margin-top: -1.5rem !important;
+
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
}
- .mr-md-n4,
- .mx-md-n4 {
- margin-right: -1.5rem !important;
+
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
}
- .mb-md-n4,
- .my-md-n4 {
- margin-bottom: -1.5rem !important;
+
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
}
- .ml-md-n4,
- .mx-md-n4 {
- margin-left: -1.5rem !important;
+
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
- .m-md-n5 {
- margin: -3rem !important;
+
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
}
- .mt-md-n5,
- .my-md-n5 {
- margin-top: -3rem !important;
+
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
}
- .mr-md-n5,
- .mx-md-n5 {
- margin-right: -3rem !important;
+
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
}
- .mb-md-n5,
- .my-md-n5 {
- margin-bottom: -3rem !important;
+
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
}
- .ml-md-n5,
- .mx-md-n5 {
- margin-left: -3rem !important;
+
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
}
- .m-md-auto {
- margin: auto !important;
+
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
}
- .mt-md-auto,
- .my-md-auto {
+
+ .my-xl-auto {
margin-top: auto !important;
- }
- .mr-md-auto,
- .mx-md-auto {
- margin-right: auto !important;
- }
- .mb-md-auto,
- .my-md-auto {
margin-bottom: auto !important;
}
- .ml-md-auto,
- .mx-md-auto {
- margin-left: auto !important;
+
+ .mt-xl-0 {
+ margin-top: 0 !important;
}
-}
-@media (min-width: 992px) {
- .m-lg-0 {
- margin: 0 !important;
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
}
- .mt-lg-0,
- .my-lg-0 {
- margin-top: 0 !important;
+
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
}
- .mr-lg-0,
- .mx-lg-0 {
- margin-right: 0 !important;
+
+ .mt-xl-3 {
+ margin-top: 1rem !important;
}
- .mb-lg-0,
- .my-lg-0 {
- margin-bottom: 0 !important;
+
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
}
- .ml-lg-0,
- .mx-lg-0 {
- margin-left: 0 !important;
+
+ .mt-xl-5 {
+ margin-top: 3rem !important;
}
- .m-lg-1 {
- margin: 0.25rem !important;
+
+ .mt-xl-auto {
+ margin-top: auto !important;
}
- .mt-lg-1,
- .my-lg-1 {
- margin-top: 0.25rem !important;
+
+ .me-xl-0 {
+ margin-right: 0 !important;
}
- .mr-lg-1,
- .mx-lg-1 {
+
+ .me-xl-1 {
margin-right: 0.25rem !important;
}
- .mb-lg-1,
- .my-lg-1 {
- margin-bottom: 0.25rem !important;
+
+ .me-xl-2 {
+ margin-right: 0.5rem !important;
}
- .ml-lg-1,
- .mx-lg-1 {
- margin-left: 0.25rem !important;
+
+ .me-xl-3 {
+ margin-right: 1rem !important;
}
- .m-lg-2 {
- margin: 0.5rem !important;
+
+ .me-xl-4 {
+ margin-right: 1.5rem !important;
}
- .mt-lg-2,
- .my-lg-2 {
- margin-top: 0.5rem !important;
+
+ .me-xl-5 {
+ margin-right: 3rem !important;
}
- .mr-lg-2,
- .mx-lg-2 {
- margin-right: 0.5rem !important;
+
+ .me-xl-auto {
+ margin-right: auto !important;
}
- .mb-lg-2,
- .my-lg-2 {
- margin-bottom: 0.5rem !important;
+
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
}
- .ml-lg-2,
- .mx-lg-2 {
- margin-left: 0.5rem !important;
+
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
}
- .m-lg-3 {
- margin: 1rem !important;
+
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
}
- .mt-lg-3,
- .my-lg-3 {
- margin-top: 1rem !important;
+
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
}
- .mr-lg-3,
- .mx-lg-3 {
- margin-right: 1rem !important;
+
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
}
- .mb-lg-3,
- .my-lg-3 {
- margin-bottom: 1rem !important;
+
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
}
- .ml-lg-3,
- .mx-lg-3 {
- margin-left: 1rem !important;
+
+ .mb-xl-auto {
+ margin-bottom: auto !important;
}
- .m-lg-4 {
- margin: 1.5rem !important;
+
+ .ms-xl-0 {
+ margin-left: 0 !important;
}
- .mt-lg-4,
- .my-lg-4 {
- margin-top: 1.5rem !important;
+
+ .ms-xl-1 {
+ margin-left: 0.25rem !important;
}
- .mr-lg-4,
- .mx-lg-4 {
- margin-right: 1.5rem !important;
+
+ .ms-xl-2 {
+ margin-left: 0.5rem !important;
}
- .mb-lg-4,
- .my-lg-4 {
- margin-bottom: 1.5rem !important;
+
+ .ms-xl-3 {
+ margin-left: 1rem !important;
}
- .ml-lg-4,
- .mx-lg-4 {
+
+ .ms-xl-4 {
margin-left: 1.5rem !important;
}
- .m-lg-5 {
- margin: 3rem !important;
+
+ .ms-xl-5 {
+ margin-left: 3rem !important;
}
- .mt-lg-5,
- .my-lg-5 {
- margin-top: 3rem !important;
+
+ .ms-xl-auto {
+ margin-left: auto !important;
}
- .mr-lg-5,
- .mx-lg-5 {
- margin-right: 3rem !important;
+
+ .p-xl-0 {
+ padding: 0 !important;
}
- .mb-lg-5,
- .my-lg-5 {
- margin-bottom: 3rem !important;
+
+ .p-xl-1 {
+ padding: 0.25rem !important;
}
- .ml-lg-5,
- .mx-lg-5 {
- margin-left: 3rem !important;
+
+ .p-xl-2 {
+ padding: 0.5rem !important;
}
- .p-lg-0 {
- padding: 0 !important;
+
+ .p-xl-3 {
+ padding: 1rem !important;
}
- .pt-lg-0,
- .py-lg-0 {
- padding-top: 0 !important;
+
+ .p-xl-4 {
+ padding: 1.5rem !important;
}
- .pr-lg-0,
- .px-lg-0 {
+
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .px-xl-0 {
padding-right: 0 !important;
+ padding-left: 0 !important;
}
- .pb-lg-0,
- .py-lg-0 {
- padding-bottom: 0 !important;
+
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
}
- .pl-lg-0,
- .px-lg-0 {
- padding-left: 0 !important;
+
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
}
- .p-lg-1 {
- padding: 0.25rem !important;
+
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
}
- .pt-lg-1,
- .py-lg-1 {
+
+ .py-xl-1 {
padding-top: 0.25rem !important;
- }
- .pr-lg-1,
- .px-lg-1 {
- padding-right: 0.25rem !important;
- }
- .pb-lg-1,
- .py-lg-1 {
padding-bottom: 0.25rem !important;
}
- .pl-lg-1,
- .px-lg-1 {
- padding-left: 0.25rem !important;
- }
- .p-lg-2 {
- padding: 0.5rem !important;
- }
- .pt-lg-2,
- .py-lg-2 {
+
+ .py-xl-2 {
padding-top: 0.5rem !important;
- }
- .pr-lg-2,
- .px-lg-2 {
- padding-right: 0.5rem !important;
- }
- .pb-lg-2,
- .py-lg-2 {
padding-bottom: 0.5rem !important;
}
- .pl-lg-2,
- .px-lg-2 {
- padding-left: 0.5rem !important;
- }
- .p-lg-3 {
- padding: 1rem !important;
- }
- .pt-lg-3,
- .py-lg-3 {
+
+ .py-xl-3 {
padding-top: 1rem !important;
- }
- .pr-lg-3,
- .px-lg-3 {
- padding-right: 1rem !important;
- }
- .pb-lg-3,
- .py-lg-3 {
padding-bottom: 1rem !important;
}
- .pl-lg-3,
- .px-lg-3 {
- padding-left: 1rem !important;
- }
- .p-lg-4 {
- padding: 1.5rem !important;
- }
- .pt-lg-4,
- .py-lg-4 {
+
+ .py-xl-4 {
padding-top: 1.5rem !important;
- }
- .pr-lg-4,
- .px-lg-4 {
- padding-right: 1.5rem !important;
- }
- .pb-lg-4,
- .py-lg-4 {
padding-bottom: 1.5rem !important;
}
- .pl-lg-4,
- .px-lg-4 {
- padding-left: 1.5rem !important;
- }
- .p-lg-5 {
- padding: 3rem !important;
- }
- .pt-lg-5,
- .py-lg-5 {
+
+ .py-xl-5 {
padding-top: 3rem !important;
- }
- .pr-lg-5,
- .px-lg-5 {
- padding-right: 3rem !important;
- }
- .pb-lg-5,
- .py-lg-5 {
padding-bottom: 3rem !important;
}
- .pl-lg-5,
- .px-lg-5 {
- padding-left: 3rem !important;
- }
- .m-lg-n1 {
- margin: -0.25rem !important;
+
+ .pt-xl-0 {
+ padding-top: 0 !important;
}
- .mt-lg-n1,
- .my-lg-n1 {
- margin-top: -0.25rem !important;
+
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
}
- .mr-lg-n1,
- .mx-lg-n1 {
- margin-right: -0.25rem !important;
+
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
}
- .mb-lg-n1,
- .my-lg-n1 {
- margin-bottom: -0.25rem !important;
+
+ .pt-xl-3 {
+ padding-top: 1rem !important;
}
- .ml-lg-n1,
- .mx-lg-n1 {
- margin-left: -0.25rem !important;
+
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
}
- .m-lg-n2 {
- margin: -0.5rem !important;
+
+ .pt-xl-5 {
+ padding-top: 3rem !important;
}
- .mt-lg-n2,
- .my-lg-n2 {
- margin-top: -0.5rem !important;
+
+ .pe-xl-0 {
+ padding-right: 0 !important;
}
- .mr-lg-n2,
- .mx-lg-n2 {
- margin-right: -0.5rem !important;
+
+ .pe-xl-1 {
+ padding-right: 0.25rem !important;
}
- .mb-lg-n2,
- .my-lg-n2 {
- margin-bottom: -0.5rem !important;
+
+ .pe-xl-2 {
+ padding-right: 0.5rem !important;
}
- .ml-lg-n2,
- .mx-lg-n2 {
- margin-left: -0.5rem !important;
+
+ .pe-xl-3 {
+ padding-right: 1rem !important;
}
- .m-lg-n3 {
- margin: -1rem !important;
+
+ .pe-xl-4 {
+ padding-right: 1.5rem !important;
}
- .mt-lg-n3,
- .my-lg-n3 {
- margin-top: -1rem !important;
+
+ .pe-xl-5 {
+ padding-right: 3rem !important;
}
- .mr-lg-n3,
- .mx-lg-n3 {
- margin-right: -1rem !important;
+
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
}
- .mb-lg-n3,
- .my-lg-n3 {
- margin-bottom: -1rem !important;
+
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
}
- .ml-lg-n3,
- .mx-lg-n3 {
- margin-left: -1rem !important;
+
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
}
- .m-lg-n4 {
- margin: -1.5rem !important;
+
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
}
- .mt-lg-n4,
- .my-lg-n4 {
- margin-top: -1.5rem !important;
+
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
}
- .mr-lg-n4,
- .mx-lg-n4 {
- margin-right: -1.5rem !important;
+
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
}
- .mb-lg-n4,
- .my-lg-n4 {
- margin-bottom: -1.5rem !important;
+
+ .ps-xl-0 {
+ padding-left: 0 !important;
}
- .ml-lg-n4,
- .mx-lg-n4 {
- margin-left: -1.5rem !important;
+
+ .ps-xl-1 {
+ padding-left: 0.25rem !important;
}
- .m-lg-n5 {
- margin: -3rem !important;
+
+ .ps-xl-2 {
+ padding-left: 0.5rem !important;
}
- .mt-lg-n5,
- .my-lg-n5 {
- margin-top: -3rem !important;
+
+ .ps-xl-3 {
+ padding-left: 1rem !important;
}
- .mr-lg-n5,
- .mx-lg-n5 {
- margin-right: -3rem !important;
+
+ .ps-xl-4 {
+ padding-left: 1.5rem !important;
}
- .mb-lg-n5,
- .my-lg-n5 {
- margin-bottom: -3rem !important;
+
+ .ps-xl-5 {
+ padding-left: 3rem !important;
}
- .ml-lg-n5,
- .mx-lg-n5 {
- margin-left: -3rem !important;
+
+ .text-xl-start {
+ text-align: left !important;
}
- .m-lg-auto {
- margin: auto !important;
+
+ .text-xl-end {
+ text-align: right !important;
}
- .mt-lg-auto,
- .my-lg-auto {
- margin-top: auto !important;
+
+ .text-xl-center {
+ text-align: center !important;
}
- .mr-lg-auto,
- .mx-lg-auto {
- margin-right: auto !important;
+}
+@media (min-width: 1400px) {
+ .float-xxl-start {
+ float: left !important;
}
- .mb-lg-auto,
- .my-lg-auto {
- margin-bottom: auto !important;
+
+ .float-xxl-end {
+ float: right !important;
}
- .ml-lg-auto,
- .mx-lg-auto {
- margin-left: auto !important;
+
+ .float-xxl-none {
+ float: none !important;
}
-}
-@media (min-width: 1200px) {
- .m-xl-0 {
- margin: 0 !important;
+ .d-xxl-inline {
+ display: inline !important;
}
- .mt-xl-0,
- .my-xl-0 {
- margin-top: 0 !important;
+
+ .d-xxl-inline-block {
+ display: inline-block !important;
}
- .mr-xl-0,
- .mx-xl-0 {
- margin-right: 0 !important;
+
+ .d-xxl-block {
+ display: block !important;
}
- .mb-xl-0,
- .my-xl-0 {
- margin-bottom: 0 !important;
+
+ .d-xxl-grid {
+ display: grid !important;
}
- .ml-xl-0,
- .mx-xl-0 {
- margin-left: 0 !important;
+
+ .d-xxl-table {
+ display: table !important;
}
- .m-xl-1 {
- margin: 0.25rem !important;
+
+ .d-xxl-table-row {
+ display: table-row !important;
}
- .mt-xl-1,
- .my-xl-1 {
- margin-top: 0.25rem !important;
+
+ .d-xxl-table-cell {
+ display: table-cell !important;
}
- .mr-xl-1,
- .mx-xl-1 {
- margin-right: 0.25rem !important;
+
+ .d-xxl-flex {
+ display: flex !important;
}
- .mb-xl-1,
- .my-xl-1 {
- margin-bottom: 0.25rem !important;
+
+ .d-xxl-inline-flex {
+ display: inline-flex !important;
}
- .ml-xl-1,
- .mx-xl-1 {
- margin-left: 0.25rem !important;
+
+ .d-xxl-none {
+ display: none !important;
}
- .m-xl-2 {
- margin: 0.5rem !important;
+
+ .flex-xxl-fill {
+ flex: 1 1 auto !important;
}
- .mt-xl-2,
- .my-xl-2 {
- margin-top: 0.5rem !important;
+
+ .flex-xxl-row {
+ flex-direction: row !important;
}
- .mr-xl-2,
- .mx-xl-2 {
- margin-right: 0.5rem !important;
+
+ .flex-xxl-column {
+ flex-direction: column !important;
}
- .mb-xl-2,
- .my-xl-2 {
- margin-bottom: 0.5rem !important;
+
+ .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
}
- .ml-xl-2,
- .mx-xl-2 {
- margin-left: 0.5rem !important;
+
+ .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
}
- .m-xl-3 {
- margin: 1rem !important;
+
+ .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
}
- .mt-xl-3,
- .my-xl-3 {
- margin-top: 1rem !important;
+
+ .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
}
- .mr-xl-3,
- .mx-xl-3 {
- margin-right: 1rem !important;
+
+ .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
}
- .mb-xl-3,
- .my-xl-3 {
- margin-bottom: 1rem !important;
+
+ .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
}
- .ml-xl-3,
- .mx-xl-3 {
- margin-left: 1rem !important;
+
+ .flex-xxl-wrap {
+ flex-wrap: wrap !important;
}
- .m-xl-4 {
- margin: 1.5rem !important;
+
+ .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
}
- .mt-xl-4,
- .my-xl-4 {
- margin-top: 1.5rem !important;
+
+ .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
}
- .mr-xl-4,
- .mx-xl-4 {
- margin-right: 1.5rem !important;
+
+ .gap-xxl-0 {
+ gap: 0 !important;
}
- .mb-xl-4,
- .my-xl-4 {
- margin-bottom: 1.5rem !important;
+
+ .gap-xxl-1 {
+ gap: 0.25rem !important;
}
- .ml-xl-4,
- .mx-xl-4 {
- margin-left: 1.5rem !important;
+
+ .gap-xxl-2 {
+ gap: 0.5rem !important;
}
- .m-xl-5 {
- margin: 3rem !important;
+
+ .gap-xxl-3 {
+ gap: 1rem !important;
}
- .mt-xl-5,
- .my-xl-5 {
- margin-top: 3rem !important;
+
+ .gap-xxl-4 {
+ gap: 1.5rem !important;
}
- .mr-xl-5,
- .mx-xl-5 {
- margin-right: 3rem !important;
+
+ .gap-xxl-5 {
+ gap: 3rem !important;
}
- .mb-xl-5,
- .my-xl-5 {
- margin-bottom: 3rem !important;
+
+ .justify-content-xxl-start {
+ justify-content: flex-start !important;
}
- .ml-xl-5,
- .mx-xl-5 {
- margin-left: 3rem !important;
+
+ .justify-content-xxl-end {
+ justify-content: flex-end !important;
}
- .p-xl-0 {
- padding: 0 !important;
+
+ .justify-content-xxl-center {
+ justify-content: center !important;
}
- .pt-xl-0,
- .py-xl-0 {
- padding-top: 0 !important;
+
+ .justify-content-xxl-between {
+ justify-content: space-between !important;
}
- .pr-xl-0,
- .px-xl-0 {
- padding-right: 0 !important;
+
+ .justify-content-xxl-around {
+ justify-content: space-around !important;
}
- .pb-xl-0,
- .py-xl-0 {
- padding-bottom: 0 !important;
+
+ .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
}
- .pl-xl-0,
- .px-xl-0 {
- padding-left: 0 !important;
+
+ .align-items-xxl-start {
+ align-items: flex-start !important;
}
- .p-xl-1 {
- padding: 0.25rem !important;
+
+ .align-items-xxl-end {
+ align-items: flex-end !important;
}
- .pt-xl-1,
- .py-xl-1 {
- padding-top: 0.25rem !important;
+
+ .align-items-xxl-center {
+ align-items: center !important;
}
- .pr-xl-1,
- .px-xl-1 {
- padding-right: 0.25rem !important;
+
+ .align-items-xxl-baseline {
+ align-items: baseline !important;
}
- .pb-xl-1,
- .py-xl-1 {
- padding-bottom: 0.25rem !important;
+
+ .align-items-xxl-stretch {
+ align-items: stretch !important;
}
- .pl-xl-1,
- .px-xl-1 {
- padding-left: 0.25rem !important;
+
+ .align-content-xxl-start {
+ align-content: flex-start !important;
}
- .p-xl-2 {
- padding: 0.5rem !important;
+
+ .align-content-xxl-end {
+ align-content: flex-end !important;
}
- .pt-xl-2,
- .py-xl-2 {
- padding-top: 0.5rem !important;
+
+ .align-content-xxl-center {
+ align-content: center !important;
}
- .pr-xl-2,
- .px-xl-2 {
- padding-right: 0.5rem !important;
+
+ .align-content-xxl-between {
+ align-content: space-between !important;
}
- .pb-xl-2,
- .py-xl-2 {
- padding-bottom: 0.5rem !important;
+
+ .align-content-xxl-around {
+ align-content: space-around !important;
}
- .pl-xl-2,
- .px-xl-2 {
- padding-left: 0.5rem !important;
+
+ .align-content-xxl-stretch {
+ align-content: stretch !important;
}
- .p-xl-3 {
- padding: 1rem !important;
+
+ .align-self-xxl-auto {
+ align-self: auto !important;
}
- .pt-xl-3,
- .py-xl-3 {
- padding-top: 1rem !important;
+
+ .align-self-xxl-start {
+ align-self: flex-start !important;
}
- .pr-xl-3,
- .px-xl-3 {
- padding-right: 1rem !important;
+
+ .align-self-xxl-end {
+ align-self: flex-end !important;
}
- .pb-xl-3,
- .py-xl-3 {
- padding-bottom: 1rem !important;
+
+ .align-self-xxl-center {
+ align-self: center !important;
}
- .pl-xl-3,
- .px-xl-3 {
- padding-left: 1rem !important;
+
+ .align-self-xxl-baseline {
+ align-self: baseline !important;
}
- .p-xl-4 {
- padding: 1.5rem !important;
+
+ .align-self-xxl-stretch {
+ align-self: stretch !important;
}
- .pt-xl-4,
- .py-xl-4 {
- padding-top: 1.5rem !important;
+
+ .order-xxl-first {
+ order: -1 !important;
}
- .pr-xl-4,
- .px-xl-4 {
- padding-right: 1.5rem !important;
+
+ .order-xxl-0 {
+ order: 0 !important;
}
- .pb-xl-4,
- .py-xl-4 {
- padding-bottom: 1.5rem !important;
+
+ .order-xxl-1 {
+ order: 1 !important;
}
- .pl-xl-4,
- .px-xl-4 {
- padding-left: 1.5rem !important;
+
+ .order-xxl-2 {
+ order: 2 !important;
}
- .p-xl-5 {
- padding: 3rem !important;
+
+ .order-xxl-3 {
+ order: 3 !important;
}
- .pt-xl-5,
- .py-xl-5 {
- padding-top: 3rem !important;
+
+ .order-xxl-4 {
+ order: 4 !important;
}
- .pr-xl-5,
- .px-xl-5 {
- padding-right: 3rem !important;
+
+ .order-xxl-5 {
+ order: 5 !important;
}
- .pb-xl-5,
- .py-xl-5 {
- padding-bottom: 3rem !important;
+
+ .order-xxl-last {
+ order: 6 !important;
}
- .pl-xl-5,
- .px-xl-5 {
- padding-left: 3rem !important;
+
+ .m-xxl-0 {
+ margin: 0 !important;
}
- .m-xl-n1 {
- margin: -0.25rem !important;
+
+ .m-xxl-1 {
+ margin: 0.25rem !important;
}
- .mt-xl-n1,
- .my-xl-n1 {
- margin-top: -0.25rem !important;
+
+ .m-xxl-2 {
+ margin: 0.5rem !important;
}
- .mr-xl-n1,
- .mx-xl-n1 {
- margin-right: -0.25rem !important;
+
+ .m-xxl-3 {
+ margin: 1rem !important;
}
- .mb-xl-n1,
- .my-xl-n1 {
- margin-bottom: -0.25rem !important;
+
+ .m-xxl-4 {
+ margin: 1.5rem !important;
}
- .ml-xl-n1,
- .mx-xl-n1 {
- margin-left: -0.25rem !important;
+
+ .m-xxl-5 {
+ margin: 3rem !important;
}
- .m-xl-n2 {
- margin: -0.5rem !important;
+
+ .m-xxl-auto {
+ margin: auto !important;
}
- .mt-xl-n2,
- .my-xl-n2 {
- margin-top: -0.5rem !important;
+
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
}
- .mr-xl-n2,
- .mx-xl-n2 {
- margin-right: -0.5rem !important;
+
+ .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
}
- .mb-xl-n2,
- .my-xl-n2 {
- margin-bottom: -0.5rem !important;
+
+ .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
}
- .ml-xl-n2,
- .mx-xl-n2 {
- margin-left: -0.5rem !important;
+
+ .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
}
- .m-xl-n3 {
- margin: -1rem !important;
+
+ .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
}
- .mt-xl-n3,
- .my-xl-n3 {
- margin-top: -1rem !important;
+
+ .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
}
- .mr-xl-n3,
- .mx-xl-n3 {
- margin-right: -1rem !important;
+
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
- .mb-xl-n3,
- .my-xl-n3 {
- margin-bottom: -1rem !important;
+
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
}
- .ml-xl-n3,
- .mx-xl-n3 {
- margin-left: -1rem !important;
+
+ .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
}
- .m-xl-n4 {
- margin: -1.5rem !important;
+
+ .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
}
- .mt-xl-n4,
- .my-xl-n4 {
- margin-top: -1.5rem !important;
+
+ .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
}
- .mr-xl-n4,
- .mx-xl-n4 {
- margin-right: -1.5rem !important;
+
+ .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
}
- .mb-xl-n4,
- .my-xl-n4 {
- margin-bottom: -1.5rem !important;
+
+ .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
}
- .ml-xl-n4,
- .mx-xl-n4 {
- margin-left: -1.5rem !important;
+
+ .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
- .m-xl-n5 {
- margin: -3rem !important;
+
+ .mt-xxl-0 {
+ margin-top: 0 !important;
}
- .mt-xl-n5,
- .my-xl-n5 {
- margin-top: -3rem !important;
+
+ .mt-xxl-1 {
+ margin-top: 0.25rem !important;
}
- .mr-xl-n5,
- .mx-xl-n5 {
- margin-right: -3rem !important;
+
+ .mt-xxl-2 {
+ margin-top: 0.5rem !important;
}
- .mb-xl-n5,
- .my-xl-n5 {
- margin-bottom: -3rem !important;
+
+ .mt-xxl-3 {
+ margin-top: 1rem !important;
}
- .ml-xl-n5,
- .mx-xl-n5 {
- margin-left: -3rem !important;
+
+ .mt-xxl-4 {
+ margin-top: 1.5rem !important;
}
- .m-xl-auto {
- margin: auto !important;
+
+ .mt-xxl-5 {
+ margin-top: 3rem !important;
}
- .mt-xl-auto,
- .my-xl-auto {
+
+ .mt-xxl-auto {
margin-top: auto !important;
}
- .mr-xl-auto,
- .mx-xl-auto {
- margin-right: auto !important;
+
+ .me-xxl-0 {
+ margin-right: 0 !important;
}
- .mb-xl-auto,
- .my-xl-auto {
- margin-bottom: auto !important;
+
+ .me-xxl-1 {
+ margin-right: 0.25rem !important;
}
- .ml-xl-auto,
- .mx-xl-auto {
- margin-left: auto !important;
+
+ .me-xxl-2 {
+ margin-right: 0.5rem !important;
}
-}
-.stretched-link::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1;
- pointer-events: auto;
- content: "";
- background-color: rgba(0, 0, 0, 0);
-}
+ .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
-.text-monospace {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
-}
+ .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
-.text-justify {
- text-align: justify !important;
-}
+ .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
-.text-wrap {
- white-space: normal !important;
-}
+ .me-xxl-auto {
+ margin-right: auto !important;
+ }
-.text-nowrap {
- white-space: nowrap !important;
-}
+ .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
-.text-truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
+ .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
-.text-left {
- text-align: left !important;
-}
+ .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
-.text-right {
- text-align: right !important;
-}
+ .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
-.text-center {
- text-align: center !important;
-}
+ .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
-@media (min-width: 576px) {
- .text-sm-left {
- text-align: left !important;
+ .mb-xxl-5 {
+ margin-bottom: 3rem !important;
}
- .text-sm-right {
- text-align: right !important;
+
+ .mb-xxl-auto {
+ margin-bottom: auto !important;
}
- .text-sm-center {
- text-align: center !important;
+
+ .ms-xxl-0 {
+ margin-left: 0 !important;
}
-}
-@media (min-width: 768px) {
- .text-md-left {
- text-align: left !important;
+ .ms-xxl-1 {
+ margin-left: 0.25rem !important;
}
- .text-md-right {
- text-align: right !important;
+
+ .ms-xxl-2 {
+ margin-left: 0.5rem !important;
}
- .text-md-center {
- text-align: center !important;
+
+ .ms-xxl-3 {
+ margin-left: 1rem !important;
}
-}
-@media (min-width: 992px) {
- .text-lg-left {
- text-align: left !important;
+ .ms-xxl-4 {
+ margin-left: 1.5rem !important;
}
- .text-lg-right {
- text-align: right !important;
+
+ .ms-xxl-5 {
+ margin-left: 3rem !important;
}
- .text-lg-center {
- text-align: center !important;
+
+ .ms-xxl-auto {
+ margin-left: auto !important;
}
-}
-@media (min-width: 1200px) {
- .text-xl-left {
- text-align: left !important;
+ .p-xxl-0 {
+ padding: 0 !important;
}
- .text-xl-right {
- text-align: right !important;
+
+ .p-xxl-1 {
+ padding: 0.25rem !important;
}
- .text-xl-center {
- text-align: center !important;
+
+ .p-xxl-2 {
+ padding: 0.5rem !important;
}
-}
-.text-lowercase {
- text-transform: lowercase !important;
-}
+ .p-xxl-3 {
+ padding: 1rem !important;
+ }
-.text-uppercase {
- text-transform: uppercase !important;
-}
+ .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
-.text-capitalize {
- text-transform: capitalize !important;
-}
+ .p-xxl-5 {
+ padding: 3rem !important;
+ }
-.font-weight-light {
- font-weight: 300 !important;
-}
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
-.font-weight-lighter {
- font-weight: lighter !important;
-}
+ .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
-.font-weight-normal {
- font-weight: 400 !important;
-}
+ .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
-.font-weight-bold {
- font-weight: 700 !important;
-}
+ .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
-.font-weight-bolder {
- font-weight: bolder !important;
-}
+ .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
-.font-italic {
- font-style: italic !important;
-}
+ .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
-.text-white {
- color: #fff !important;
-}
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
-.text-primary {
- color: #007bff !important;
-}
+ .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
-a.text-primary:hover, a.text-primary:focus {
- color: #0056b3 !important;
-}
+ .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
-.text-secondary {
- color: #6c757d !important;
-}
+ .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
-a.text-secondary:hover, a.text-secondary:focus {
- color: #494f54 !important;
-}
+ .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
-.text-success {
- color: #28a745 !important;
-}
+ .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
-a.text-success:hover, a.text-success:focus {
- color: #19692c !important;
-}
+ .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
-.text-info {
- color: #17a2b8 !important;
-}
+ .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
-a.text-info:hover, a.text-info:focus {
- color: #0f6674 !important;
-}
+ .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
-.text-warning {
- color: #ffc107 !important;
-}
+ .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
-a.text-warning:hover, a.text-warning:focus {
- color: #ba8b00 !important;
-}
+ .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
-.text-danger {
- color: #dc3545 !important;
-}
+ .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
-a.text-danger:hover, a.text-danger:focus {
- color: #a71d2a !important;
-}
+ .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
-.text-light {
- color: #f8f9fa !important;
-}
+ .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
-a.text-light:hover, a.text-light:focus {
- color: #cbd3da !important;
-}
+ .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
-.text-dark {
- color: #343a40 !important;
-}
+ .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
-a.text-dark:hover, a.text-dark:focus {
- color: #121416 !important;
-}
+ .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
-.text-body {
- color: #212529 !important;
-}
+ .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
-.text-muted {
- color: #6c757d !important;
-}
+ .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
-.text-black-50 {
- color: rgba(0, 0, 0, 0.5) !important;
-}
+ .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
-.text-white-50 {
- color: rgba(255, 255, 255, 0.5) !important;
-}
+ .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
+ .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
-.text-decoration-none {
- text-decoration: none !important;
-}
+ .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
-.text-break {
- word-break: break-word !important;
- word-wrap: break-word !important;
-}
+ .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
-.text-reset {
- color: inherit !important;
-}
+ .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
-.visible {
- visibility: visible !important;
-}
+ .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
-.invisible {
- visibility: hidden !important;
-}
+ .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
-@media print {
- *,
- *::before,
- *::after {
- text-shadow: none !important;
- box-shadow: none !important;
+ .ps-xxl-3 {
+ padding-left: 1rem !important;
}
- a:not(.btn) {
- text-decoration: underline;
+
+ .ps-xxl-4 {
+ padding-left: 1.5rem !important;
}
- abbr[title]::after {
- content: " (" attr(title) ")";
+
+ .ps-xxl-5 {
+ padding-left: 3rem !important;
}
- pre {
- white-space: pre-wrap !important;
+
+ .text-xxl-start {
+ text-align: left !important;
}
- pre,
- blockquote {
- border: 1px solid #adb5bd;
- page-break-inside: avoid;
+
+ .text-xxl-end {
+ text-align: right !important;
}
- thead {
- display: table-header-group;
+
+ .text-xxl-center {
+ text-align: center !important;
}
- tr,
- img {
- page-break-inside: avoid;
+}
+@media (min-width: 1200px) {
+ .fs-1 {
+ font-size: 2.5rem !important;
}
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
+
+ .fs-2 {
+ font-size: 2rem !important;
}
- h2,
- h3 {
- page-break-after: avoid;
+
+ .fs-3 {
+ font-size: 1.75rem !important;
}
- @page {
- size: a3;
+
+ .fs-4 {
+ font-size: 1.5rem !important;
}
- body {
- min-width: 992px !important;
+}
+@media print {
+ .d-print-inline {
+ display: inline !important;
}
- .container {
- min-width: 992px !important;
+
+ .d-print-inline-block {
+ display: inline-block !important;
}
- .navbar {
- display: none;
+
+ .d-print-block {
+ display: block !important;
}
- .badge {
- border: 1px solid #000;
+
+ .d-print-grid {
+ display: grid !important;
}
- .table {
- border-collapse: collapse !important;
+
+ .d-print-table {
+ display: table !important;
}
- .table td,
- .table th {
- background-color: #fff !important;
+
+ .d-print-table-row {
+ display: table-row !important;
}
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #dee2e6 !important;
+
+ .d-print-table-cell {
+ display: table-cell !important;
}
- .table-dark {
- color: inherit;
+
+ .d-print-flex {
+ display: flex !important;
}
- .table-dark th,
- .table-dark td,
- .table-dark thead th,
- .table-dark tbody + tbody {
- border-color: #dee2e6;
+
+ .d-print-inline-flex {
+ display: inline-flex !important;
}
- .table .thead-dark th {
- color: inherit;
- border-color: #dee2e6;
+
+ .d-print-none {
+ display: none !important;
}
}
+
/*# sourceMappingURL=bootstrap.css.map */
\ No newline at end of file
diff --git a/src/static/scripts/datatables.css b/src/static/scripts/datatables.css
@@ -4,13 +4,18 @@
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
- * https://datatables.net/download/#bs4/dt-1.10.23
+ * https://datatables.net/download/#bs5/dt-1.10.25
*
* Included libraries:
- * DataTables 1.10.23
+ * DataTables 1.10.25
*/
@charset "UTF-8";
+/*! Bootstrap 5 integration for DataTables
+ *
+ * ©2020 SpryMedia Ltd, all rights reserved.
+ * License: MIT datatables.net/license/mit
+ */
table.dataTable {
clear: both;
margin-top: 6px !important;
@@ -105,7 +110,7 @@ table.dataTable > thead .sorting_asc_disabled:after,
table.dataTable > thead .sorting_desc_disabled:before,
table.dataTable > thead .sorting_desc_disabled:after {
position: absolute;
- bottom: 0.9em;
+ bottom: 0.5em;
display: block;
opacity: 0.3;
}
@@ -193,18 +198,27 @@ table.dataTable.table-sm .sorting_desc:after {
table.table-bordered.dataTable {
border-right-width: 0;
}
+table.table-bordered.dataTable thead tr:first-child th,
+table.table-bordered.dataTable thead tr:first-child td {
+ border-top-width: 1px;
+}
table.table-bordered.dataTable th,
table.table-bordered.dataTable td {
border-left-width: 0;
}
+table.table-bordered.dataTable th:first-child, table.table-bordered.dataTable th:first-child,
+table.table-bordered.dataTable td:first-child,
+table.table-bordered.dataTable td:first-child {
+ border-left-width: 1px;
+}
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
table.table-bordered.dataTable td:last-child,
table.table-bordered.dataTable td:last-child {
border-right-width: 1px;
}
-table.table-bordered.dataTable tbody th,
-table.table-bordered.dataTable tbody td {
- border-bottom-width: 0;
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+ border-bottom-width: 1px;
}
div.dataTables_scrollHead table.table-bordered {
diff --git a/src/static/scripts/datatables.js b/src/static/scripts/datatables.js
@@ -4,24 +4,24 @@
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
- * https://datatables.net/download/#bs4/dt-1.10.23
+ * https://datatables.net/download/#bs5/dt-1.10.25
*
* Included libraries:
- * DataTables 1.10.23
+ * DataTables 1.10.25
*/
-/*! DataTables 1.10.23
- * ©2008-2020 SpryMedia Ltd - datatables.net/license
+/*! DataTables 1.10.25
+ * ©2008-2021 SpryMedia Ltd - datatables.net/license
*/
/**
* @summary DataTables
* @description Paginate, search and order HTML tables
- * @version 1.10.23
+ * @version 1.10.25
* @file jquery.dataTables.js
* @author SpryMedia Ltd
* @contact www.datatables.net
- * @copyright Copyright 2008-2020 SpryMedia Ltd.
+ * @copyright Copyright 2008-2021 SpryMedia Ltd.
*
* This source file is free software, available under the following license:
* MIT license - http://datatables.net/license
@@ -1100,6 +1100,8 @@
_fnLanguageCompat( json );
_fnCamelToHungarian( defaults.oLanguage, json );
$.extend( true, oLanguage, json );
+
+ _fnCallbackFire( oSettings, null, 'i18n', [oSettings]);
_fnInitialise( oSettings );
},
error: function () {
@@ -1109,6 +1111,9 @@
} );
bInitHandedOff = true;
}
+ else {
+ _fnCallbackFire( oSettings, null, 'i18n', [oSettings]);
+ }
/*
* Stripes
@@ -1260,7 +1265,7 @@
var tbody = $this.children('tbody');
if ( tbody.length === 0 ) {
- tbody = $('<tbody/>').appendTo($this);
+ tbody = $('<tbody/>').insertAfter(thead);
}
oSettings.nTBody = tbody[0];
@@ -2315,8 +2320,9 @@
}
// Only a single match is needed for html type since it is
- // bottom of the pile and very similar to string
- if ( detectedType === 'html' ) {
+ // bottom of the pile and very similar to string - but it
+ // must not be empty
+ if ( detectedType === 'html' && ! _empty(cache[k]) ) {
break;
}
}
@@ -3421,9 +3427,10 @@
/**
* Insert the required TR nodes into the table for display
* @param {object} oSettings dataTables settings object
+ * @param ajaxComplete true after ajax call to complete rendering
* @memberof DataTable#oApi
*/
- function _fnDraw( oSettings )
+ function _fnDraw( oSettings, ajaxComplete )
{
/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
@@ -3472,8 +3479,9 @@
{
oSettings.iDraw++;
}
- else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+ else if ( !oSettings.bDestroying && !ajaxComplete)
{
+ _fnAjaxUpdate( oSettings );
return;
}
@@ -4005,21 +4013,16 @@
*/
function _fnAjaxUpdate( settings )
{
- if ( settings.bAjaxDataGet ) {
- settings.iDraw++;
- _fnProcessingDisplay( settings, true );
-
- _fnBuildAjax(
- settings,
- _fnAjaxParameters( settings ),
- function(json) {
- _fnAjaxUpdateDraw( settings, json );
- }
- );
+ settings.iDraw++;
+ _fnProcessingDisplay( settings, true );
- return false;
- }
- return true;
+ _fnBuildAjax(
+ settings,
+ _fnAjaxParameters( settings ),
+ function(json) {
+ _fnAjaxUpdateDraw( settings, json );
+ }
+ );
}
@@ -4172,14 +4175,12 @@
}
settings.aiDisplay = settings.aiDisplayMaster.slice();
- settings.bAjaxDataGet = false;
- _fnDraw( settings );
+ _fnDraw( settings, true );
if ( ! settings._bInitComplete ) {
_fnInitComplete( settings, json );
}
- settings.bAjaxDataGet = true;
_fnProcessingDisplay( settings, false );
}
@@ -6108,7 +6109,7 @@
{
var col = columns[i];
var asSorting = col.asSorting;
- var sTitle = col.sTitle.replace( /<.*?>/g, "" );
+ var sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, "" );
var th = col.nTh;
// IE7 is throwing an error when setting these properties with jQuery's
@@ -9542,7 +9543,7 @@
* @type string
* @default Version number
*/
- DataTable.version = "1.10.23";
+ DataTable.version = "1.10.25";
/**
* Private data store, containing all of the settings objects that are
@@ -13624,13 +13625,6 @@
"sAjaxDataProp": null,
/**
- * Note if draw should be blocked while getting data
- * @type boolean
- * @default true
- */
- "bAjaxDataGet": true,
-
- /**
* The last jQuery XHR object that was used for server-side data gathering.
* This can be used for working with the XHR information in one of the
* callbacks
@@ -13966,7 +13960,7 @@
*
* @type string
*/
- build:"bs4/dt-1.10.23",
+ build:"bs5/dt-1.10.25",
/**
@@ -14494,8 +14488,8 @@
"sSortAsc": "sorting_asc",
"sSortDesc": "sorting_desc",
"sSortable": "sorting", /* Sortable in both directions */
- "sSortableAsc": "sorting_asc_disabled",
- "sSortableDesc": "sorting_desc_disabled",
+ "sSortableAsc": "sorting_desc_disabled",
+ "sSortableDesc": "sorting_asc_disabled",
"sSortableNone": "sorting_disabled",
"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
@@ -14936,7 +14930,6 @@
cell
.removeClass(
- column.sSortingClass +' '+
classes.sSortAsc +' '+
classes.sSortDesc
)
@@ -15061,6 +15054,11 @@
decimal+(d - intPart).toFixed( precision ).substring( 2 ):
'';
+ // If zero, then can't have a negative prefix
+ if (intPart === 0 && parseFloat(floatPart) === 0) {
+ negative = '';
+ }
+
return negative + (prefix||'') +
intPart.toString().replace(
/\B(?=(\d{3})+(?!\d))/g, thousands
@@ -15395,12 +15393,12 @@
}));
-/*! DataTables Bootstrap 4 integration
- * ©2011-2017 SpryMedia Ltd - datatables.net/license
+/*! DataTables Bootstrap 5 integration
+ * 2020 SpryMedia Ltd - datatables.net/license
*/
/**
- * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
+ * DataTables integration for Bootstrap 4. This requires Bootstrap 5 and
* DataTables 1.10 or newer.
*
* This file sets the defaults and adds options to DataTables to style its
@@ -15452,9 +15450,9 @@ $.extend( true, DataTable.defaults, {
/* Default class modification */
$.extend( DataTable.ext.classes, {
- sWrapper: "dataTables_wrapper dt-bootstrap4",
+ sWrapper: "dataTables_wrapper dt-bootstrap5",
sFilterInput: "form-control form-control-sm",
- sLengthSelect: "custom-select custom-select-sm form-control form-control-sm",
+ sLengthSelect: "form-select form-select-sm",
sProcessing: "dataTables_processing card",
sPageButton: "paginate_button page-item"
} );
diff --git a/src/static/scripts/jquery-3.5.1.slim.js b/src/static/scripts/jquery-3.5.1.slim.js
@@ -1,8777 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2020-05-04T22:49Z
- */
-( function( global, factory ) {
-
- "use strict";
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
-
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var flat = arr.flat ? function( array ) {
- return arr.flat.call( array );
-} : function( array ) {
- return arr.concat.apply( [], array );
-};
-
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-var isFunction = function isFunction( obj ) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
-
-
-var isWindow = function isWindow( obj ) {
- return obj != null && obj === obj.window;
- };
-
-
-var document = window.document;
-
-
-
- var preservedScriptAttributes = {
- type: true,
- src: true,
- nonce: true,
- noModule: true
- };
-
- function DOMEval( code, node, doc ) {
- doc = doc || document;
-
- var i, val,
- script = doc.createElement( "script" );
-
- script.text = code;
- if ( node ) {
- for ( i in preservedScriptAttributes ) {
-
- // Support: Firefox 64+, Edge 18+
- // Some browsers don't support the "nonce" property on scripts.
- // On the other hand, just using `getAttribute` is not enough as
- // the `nonce` attribute is reset to an empty string whenever it
- // becomes browsing-context connected.
- // See https://github.com/whatwg/html/issues/2369
- // See https://html.spec.whatwg.org/#nonce-attributes
- // The `node.getAttribute` check was added for the sake of
- // `jQuery.globalEval` so that it can fake a nonce-containing node
- // via an object.
- val = node[ i ] || node.getAttribute && node.getAttribute( i );
- if ( val ) {
- script.setAttribute( i, val );
- }
- }
- }
- doc.head.appendChild( script ).parentNode.removeChild( script );
- }
-
-
-function toType( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- // Support: Android <=2.3 only (functionish RegExp)
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
-}
-/* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-var
- version = "3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
-
- // The jQuery object is actually just the init constructor 'enhanced'
- // Need init if jQuery is called (just allow error to be thrown if not included)
- return new jQuery.fn.init( selector, context );
- };
-
-jQuery.fn = jQuery.prototype = {
-
- // The current version of jQuery being used
- jquery: version,
-
- constructor: jQuery,
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
-
- // Return all the elements in a clean array
- if ( num == null ) {
- return slice.call( this );
- }
-
- // Return just the one element from the set
- return num < 0 ? this[ num + this.length ] : this[ num ];
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- each: function( callback ) {
- return jQuery.each( this, callback );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ) );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- even: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return ( i + 1 ) % 2;
- } ) );
- },
-
- odd: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return i % 2;
- } ) );
- },
-
- eq: function( i ) {
- var len = this.length,
- j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
- },
-
- end: function() {
- return this.prevObject || this.constructor();
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: arr.sort,
- splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[ 0 ] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
-
- // Skip the boolean and the target
- target = arguments[ i ] || {};
- i++;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !isFunction( target ) ) {
- target = {};
- }
-
- // Extend jQuery itself if only one argument is passed
- if ( i === length ) {
- target = this;
- i--;
- }
-
- for ( ; i < length; i++ ) {
-
- // Only deal with non-null/undefined values
- if ( ( options = arguments[ i ] ) != null ) {
-
- // Extend the base object
- for ( name in options ) {
- copy = options[ name ];
-
- // Prevent Object.prototype pollution
- // Prevent never-ending loop
- if ( name === "__proto__" || target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = Array.isArray( copy ) ) ) ) {
- src = target[ name ];
-
- // Ensure proper type for the source value
- if ( copyIsArray && !Array.isArray( src ) ) {
- clone = [];
- } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
- clone = {};
- } else {
- clone = src;
- }
- copyIsArray = false;
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend( {
-
- // Unique for each copy of jQuery on the page
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
- // Assume jQuery is ready without the ready module
- isReady: true,
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- noop: function() {},
-
- isPlainObject: function( obj ) {
- var proto, Ctor;
-
- // Detect obvious negatives
- // Use toString instead of jQuery.type to catch host objects
- if ( !obj || toString.call( obj ) !== "[object Object]" ) {
- return false;
- }
-
- proto = getProto( obj );
-
- // Objects with no prototype (e.g., `Object.create( null )`) are plain
- if ( !proto ) {
- return true;
- }
-
- // Objects with prototype are plain iff they were constructed by a global Object function
- Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
- return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
- },
-
- isEmptyObject: function( obj ) {
- var name;
-
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- // Evaluates a script in a provided context; falls back to the global one
- // if not specified.
- globalEval: function( code, options, doc ) {
- DOMEval( code, { nonce: options && options.nonce }, doc );
- },
-
- each: function( obj, callback ) {
- var length, i = 0;
-
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- }
-
- return obj;
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var ret = results || [];
-
- if ( arr != null ) {
- if ( isArrayLike( Object( arr ) ) ) {
- jQuery.merge( ret,
- typeof arr === "string" ?
- [ arr ] : arr
- );
- } else {
- push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- return arr == null ? -1 : indexOf.call( arr, elem, i );
- },
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- merge: function( first, second ) {
- var len = +second.length,
- j = 0,
- i = first.length;
-
- for ( ; j < len; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, invert ) {
- var callbackInverse,
- matches = [],
- i = 0,
- length = elems.length,
- callbackExpect = !invert;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- callbackInverse = !callback( elems[ i ], i );
- if ( callbackInverse !== callbackExpect ) {
- matches.push( elems[ i ] );
- }
- }
-
- return matches;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var length, value,
- i = 0,
- ret = [];
-
- // Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
- }
-
- // Flatten any nested arrays
- return flat( ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // jQuery.support is not used in Core but other projects attach their
- // properties to it so it needs to exist.
- support: support
-} );
-
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
- // Support: real iOS 8.2 only (not reproducible in simulator)
- // `in` check used to prevent JIT error (gh-2145)
- // hasOwn isn't used here due to false negatives
- // regarding Nodelist length in IE
- var length = !!obj && "length" in obj && obj.length,
- type = toType( obj );
-
- if ( isFunction( obj ) || isWindow( obj ) ) {
- return false;
- }
-
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.3.5
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://js.foundation/
- *
- * Date: 2020-03-14
- */
-( function( window ) {
-var i,
- support,
- Expr,
- getText,
- isXML,
- tokenize,
- compile,
- select,
- outermostContext,
- sortInput,
- hasDuplicate,
-
- // Local document vars
- setDocument,
- document,
- docElem,
- documentIsHTML,
- rbuggyQSA,
- rbuggyMatches,
- matches,
- contains,
-
- // Instance-specific data
- expando = "sizzle" + 1 * new Date(),
- preferredDoc = window.document,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- nonnativeSelectorCache = createCache(),
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- }
- return 0;
- },
-
- // Instance methods
- hasOwn = ( {} ).hasOwnProperty,
- arr = [],
- pop = arr.pop,
- pushNative = arr.push,
- push = arr.push,
- slice = arr.slice,
-
- // Use a stripped-down indexOf as it's faster than native
- // https://jsperf.com/thor-indexof-vs-for/5
- indexOf = function( list, elem ) {
- var i = 0,
- len = list.length;
- for ( ; i < len; i++ ) {
- if ( list[ i ] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
- "ismap|loop|multiple|open|readonly|required|scoped",
-
- // Regular expressions
-
- // http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
-
- // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
- identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
- "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
-
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-
- // Operator (capture 2)
- "*([*^$|!~]?=)" + whitespace +
-
- // "Attribute values must be CSS identifiers [capture 5]
- // or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
- whitespace + "*\\]",
-
- pseudos = ":(" + identifier + ")(?:\\((" +
-
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
- // 1. quoted (capture 3; capture 4 or capture 5)
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-
- // 2. simple (capture 6)
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-
- // 3. anything else (capture 2)
- ".*" +
- ")\\)|)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
- whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
- "*" ),
- rdescend = new RegExp( whitespace + "|>" ),
-
- rpseudo = new RegExp( pseudos ),
- ridentifier = new RegExp( "^" + identifier + "$" ),
-
- matchExpr = {
- "ID": new RegExp( "^#(" + identifier + ")" ),
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
- whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
- whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-
- // For use in libraries implementing .is()
- // We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace +
- "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
- "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
- },
-
- rhtml = /HTML$/i,
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- rnative = /^[^{]+\{\s*\[native \w/,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rsibling = /[+~]/,
-
- // CSS escapes
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
- funescape = function( escape, nonHex ) {
- var high = "0x" + escape.slice( 1 ) - 0x10000;
-
- return nonHex ?
-
- // Strip the backslash prefix from a non-hex escape sequence
- nonHex :
-
- // Replace a hexadecimal escape sequence with the encoded Unicode code point
- // Support: IE <=11+
- // For values outside the Basic Multilingual Plane (BMP), manually construct a
- // surrogate pair
- high < 0 ?
- String.fromCharCode( high + 0x10000 ) :
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- },
-
- // CSS string/identifier serialization
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
- fcssescape = function( ch, asCodePoint ) {
- if ( asCodePoint ) {
-
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
- if ( ch === "\0" ) {
- return "\uFFFD";
- }
-
- // Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" +
- ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
- }
-
- // Other potentially-special ASCII characters get backslash-escaped
- return "\\" + ch;
- },
-
- // Used for iframes
- // See setDocument()
- // Removing the function wrapper causes a "Permission Denied"
- // error in IE
- unloadHandler = function() {
- setDocument();
- },
-
- inDisabledFieldset = addCombinator(
- function( elem ) {
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
- },
- { dir: "parentNode", next: "legend" }
- );
-
-// Optimize for push.apply( _, NodeList )
-try {
- push.apply(
- ( arr = slice.call( preferredDoc.childNodes ) ),
- preferredDoc.childNodes
- );
-
- // Support: Android<4.0
- // Detect silently failing push.apply
- // eslint-disable-next-line no-unused-expressions
- arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
- push = { apply: arr.length ?
-
- // Leverage slice if possible
- function( target, els ) {
- pushNative.apply( target, slice.call( els ) );
- } :
-
- // Support: IE<9
- // Otherwise append directly
- function( target, els ) {
- var j = target.length,
- i = 0;
-
- // Can't trust NodeList.length
- while ( ( target[ j++ ] = els[ i++ ] ) ) {}
- target.length = j - 1;
- }
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- var m, i, elem, nid, match, groups, newSelector,
- newContext = context && context.ownerDocument,
-
- // nodeType defaults to 9, since context defaults to document
- nodeType = context ? context.nodeType : 9;
-
- results = results || [];
-
- // Return early from calls with invalid selector or context
- if ( typeof selector !== "string" || !selector ||
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
- return results;
- }
-
- // Try to shortcut find operations (as opposed to filters) in HTML documents
- if ( !seed ) {
- setDocument( context );
- context = context || document;
-
- if ( documentIsHTML ) {
-
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
- // (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
-
- // ID selector
- if ( ( m = match[ 1 ] ) ) {
-
- // Document context
- if ( nodeType === 9 ) {
- if ( ( elem = context.getElementById( m ) ) ) {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
-
- // Element context
- } else {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( newContext && ( elem = newContext.getElementById( m ) ) &&
- contains( context, elem ) &&
- elem.id === m ) {
-
- results.push( elem );
- return results;
- }
- }
-
- // Type selector
- } else if ( match[ 2 ] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Class selector
- } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
- context.getElementsByClassName ) {
-
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // Take advantage of querySelectorAll
- if ( support.qsa &&
- !nonnativeSelectorCache[ selector + " " ] &&
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
-
- // Support: IE 8 only
- // Exclude object elements
- ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
-
- newSelector = selector;
- newContext = context;
-
- // qSA considers elements outside a scoping root when evaluating child or
- // descendant combinators, which is not what we want.
- // In such cases, we work around the behavior by prefixing every selector in the
- // list with an ID selector referencing the scope context.
- // The technique has to be used as well when a leading combinator is used
- // as such selectors are not recognized by querySelectorAll.
- // Thanks to Andrew Dupont for this technique.
- if ( nodeType === 1 &&
- ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
-
- // We can use :scope instead of the ID hack if the browser
- // supports it & if we're not changing the context.
- if ( newContext !== context || !support.scope ) {
-
- // Capture the context ID, setting it first if necessary
- if ( ( nid = context.getAttribute( "id" ) ) ) {
- nid = nid.replace( rcssescape, fcssescape );
- } else {
- context.setAttribute( "id", ( nid = expando ) );
- }
- }
-
- // Prefix every selector in the list
- groups = tokenize( selector );
- i = groups.length;
- while ( i-- ) {
- groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
- toSelector( groups[ i ] );
- }
- newSelector = groups.join( "," );
- }
-
- try {
- push.apply( results,
- newContext.querySelectorAll( newSelector )
- );
- return results;
- } catch ( qsaError ) {
- nonnativeSelectorCache( selector, true );
- } finally {
- if ( nid === expando ) {
- context.removeAttribute( "id" );
- }
- }
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- * deleting the oldest entry
- */
-function createCache() {
- var keys = [];
-
- function cache( key, value ) {
-
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
- if ( keys.push( key + " " ) > Expr.cacheLength ) {
-
- // Only keep the most recent entries
- delete cache[ keys.shift() ];
- }
- return ( cache[ key + " " ] = value );
- }
- return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
- fn[ expando ] = true;
- return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
- */
-function assert( fn ) {
- var el = document.createElement( "fieldset" );
-
- try {
- return !!fn( el );
- } catch ( e ) {
- return false;
- } finally {
-
- // Remove from its parent by default
- if ( el.parentNode ) {
- el.parentNode.removeChild( el );
- }
-
- // release memory in IE
- el = null;
- }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
- var arr = attrs.split( "|" ),
- i = arr.length;
-
- while ( i-- ) {
- Expr.attrHandle[ arr[ i ] ] = handler;
- }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
- var cur = b && a,
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
- a.sourceIndex - b.sourceIndex;
-
- // Use IE sourceIndex if available on both nodes
- if ( diff ) {
- return diff;
- }
-
- // Check if b follows a
- if ( cur ) {
- while ( ( cur = cur.nextSibling ) ) {
- if ( cur === b ) {
- return -1;
- }
- }
- }
-
- return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return ( name === "input" || name === "button" ) && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-
- // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
- return function( elem ) {
-
- // Only certain elements can match :enabled or :disabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
- if ( "form" in elem ) {
-
- // Check for inherited disabledness on relevant non-disabled elements:
- // * listed form-associated elements in a disabled fieldset
- // https://html.spec.whatwg.org/multipage/forms.html#category-listed
- // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
- // * option elements in a disabled optgroup
- // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
- // All such elements have a "form" property.
- if ( elem.parentNode && elem.disabled === false ) {
-
- // Option elements defer to a parent optgroup if present
- if ( "label" in elem ) {
- if ( "label" in elem.parentNode ) {
- return elem.parentNode.disabled === disabled;
- } else {
- return elem.disabled === disabled;
- }
- }
-
- // Support: IE 6 - 11
- // Use the isDisabled shortcut property to check for disabled fieldset ancestors
- return elem.isDisabled === disabled ||
-
- // Where there is no isDisabled, check manually
- /* jshint -W018 */
- elem.isDisabled !== !disabled &&
- inDisabledFieldset( elem ) === disabled;
- }
-
- return elem.disabled === disabled;
-
- // Try to winnow out elements that can't be disabled before trusting the disabled property.
- // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
- // even exist on them, let alone have a boolean value.
- } else if ( "label" in elem ) {
- return elem.disabled === disabled;
- }
-
- // Remaining elements are neither :enabled nor :disabled
- return false;
- };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
- return markFunction( function( argument ) {
- argument = +argument;
- return markFunction( function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
- seed[ j ] = !( matches[ j ] = seed[ j ] );
- }
- }
- } );
- } );
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
- return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
-
- // Support: IE <=8
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
- // https://bugs.jquery.com/ticket/4833
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
- var hasCompare, subWindow,
- doc = node ? node.ownerDocument || node : preferredDoc;
-
- // Return early if doc is invalid or already selected
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
- return document;
- }
-
- // Update global variables
- document = doc;
- docElem = document.documentElement;
- documentIsHTML = !isXML( document );
-
- // Support: IE 9 - 11+, Edge 12 - 18+
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( preferredDoc != document &&
- ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
-
- // Support: IE 11, Edge
- if ( subWindow.addEventListener ) {
- subWindow.addEventListener( "unload", unloadHandler, false );
-
- // Support: IE 9 - 10 only
- } else if ( subWindow.attachEvent ) {
- subWindow.attachEvent( "onunload", unloadHandler );
- }
- }
-
- // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
- // Safari 4 - 5 only, Opera <=11.6 - 12.x only
- // IE/Edge & older browsers don't support the :scope pseudo-class.
- // Support: Safari 6.0 only
- // Safari 6.0 supports :scope but it's an alias of :root there.
- support.scope = assert( function( el ) {
- docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
- return typeof el.querySelectorAll !== "undefined" &&
- !el.querySelectorAll( ":scope fieldset div" ).length;
- } );
-
- /* Attributes
- ---------------------------------------------------------------------- */
-
- // Support: IE<8
- // Verify that getAttribute really returns attributes and not properties
- // (excepting IE8 booleans)
- support.attributes = assert( function( el ) {
- el.className = "i";
- return !el.getAttribute( "className" );
- } );
-
- /* getElement(s)By*
- ---------------------------------------------------------------------- */
-
- // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert( function( el ) {
- el.appendChild( document.createComment( "" ) );
- return !el.getElementsByTagName( "*" ).length;
- } );
-
- // Support: IE<9
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
- // Support: IE<10
- // Check if getElementById returns elements by name
- // The broken getElementById methods don't pick up programmatically-set names,
- // so use a roundabout getElementsByName test
- support.getById = assert( function( el ) {
- docElem.appendChild( el ).id = expando;
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
- } );
-
- // ID filter and find
- if ( support.getById ) {
- Expr.filter[ "ID" ] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- return elem.getAttribute( "id" ) === attrId;
- };
- };
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var elem = context.getElementById( id );
- return elem ? [ elem ] : [];
- }
- };
- } else {
- Expr.filter[ "ID" ] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== "undefined" &&
- elem.getAttributeNode( "id" );
- return node && node.value === attrId;
- };
- };
-
- // Support: IE 6 - 7 only
- // getElementById is not reliable as a find shortcut
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var node, i, elems,
- elem = context.getElementById( id );
-
- if ( elem ) {
-
- // Verify the id attribute
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
-
- // Fall back on getElementsByName
- elems = context.getElementsByName( id );
- i = 0;
- while ( ( elem = elems[ i++ ] ) ) {
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
- }
- }
-
- return [];
- }
- };
- }
-
- // Tag
- Expr.find[ "TAG" ] = support.getElementsByTagName ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( tag );
-
- // DocumentFragment nodes don't have gEBTN
- } else if ( support.qsa ) {
- return context.querySelectorAll( tag );
- }
- } :
-
- function( tag, context ) {
- var elem,
- tmp = [],
- i = 0,
-
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
- results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- };
-
- // Class
- Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
- return context.getElementsByClassName( className );
- }
- };
-
- /* QSA/matchesSelector
- ---------------------------------------------------------------------- */
-
- // QSA and matchesSelector support
-
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- rbuggyMatches = [];
-
- // qSa(:focus) reports false when true (Chrome 21)
- // We allow this because of a bug in IE8/9 that throws an error
- // whenever `document.activeElement` is accessed on an iframe
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
- // See https://bugs.jquery.com/ticket/13378
- rbuggyQSA = [];
-
- if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert( function( el ) {
-
- var input;
-
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explicitly
- // setting a boolean content attribute,
- // since its presence should be enough
- // https://bugs.jquery.com/ticket/12359
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
- "<option selected=''></option></select>";
-
- // Support: IE8, Opera 11-12.16
- // Nothing should be selected when empty strings follow ^= or $= or *=
- // The test attribute must be unknown in Opera but "safe" for WinRT
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
- }
-
- // Support: IE8
- // Boolean attributes and "value" are not treated correctly
- if ( !el.querySelectorAll( "[selected]" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push( "~=" );
- }
-
- // Support: IE 11+, Edge 15 - 18+
- // IE 11/Edge don't find elements on a `[name='']` query in some cases.
- // Adding a temporary attribute to the document before the selection works
- // around the issue.
- // Interestingly, IE 10 & older don't seem to have the issue.
- input = document.createElement( "input" );
- input.setAttribute( "name", "" );
- el.appendChild( input );
- if ( !el.querySelectorAll( "[name='']" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
- whitespace + "*(?:''|\"\")" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here and will not see later tests
- if ( !el.querySelectorAll( ":checked" ).length ) {
- rbuggyQSA.push( ":checked" );
- }
-
- // Support: Safari 8+, iOS 8+
- // https://bugs.webkit.org/show_bug.cgi?id=136851
- // In-page `selector#id sibling-combinator selector` fails
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push( ".#.+[+~]" );
- }
-
- // Support: Firefox <=3.6 - 5 only
- // Old Firefox doesn't throw on a badly-escaped identifier.
- el.querySelectorAll( "\\\f" );
- rbuggyQSA.push( "[\\r\\n\\f]" );
- } );
-
- assert( function( el ) {
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
- "<select disabled='disabled'><option/></select>";
-
- // Support: Windows 8 Native Apps
- // The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement( "input" );
- input.setAttribute( "type", "hidden" );
- el.appendChild( input ).setAttribute( "name", "D" );
-
- // Support: IE8
- // Enforce case-sensitivity of name attribute
- if ( el.querySelectorAll( "[name=d]" ).length ) {
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here and will not see later tests
- if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Support: IE9-11+
- // IE's :disabled selector does not pick up the children of disabled fieldsets
- docElem.appendChild( el ).disabled = true;
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Support: Opera 10 - 11 only
- // Opera 10-11 does not throw on post-comma invalid pseudos
- el.querySelectorAll( "*,:x" );
- rbuggyQSA.push( ",.*:" );
- } );
- }
-
- if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
- docElem.webkitMatchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector ) ) ) ) {
-
- assert( function( el ) {
-
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- support.disconnectedMatch = matches.call( el, "*" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( el, "[s!='']:x" );
- rbuggyMatches.push( "!=", pseudos );
- } );
- }
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
-
- /* Contains
- ---------------------------------------------------------------------- */
- hasCompare = rnative.test( docElem.compareDocumentPosition );
-
- // Element contains another
- // Purposefully self-exclusive
- // As in, an element does not contain itself
- contains = hasCompare || rnative.test( docElem.contains ) ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && (
- adown.contains ?
- adown.contains( bup ) :
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ) );
- } :
- function( a, b ) {
- if ( b ) {
- while ( ( b = b.parentNode ) ) {
- if ( b === a ) {
- return true;
- }
- }
- }
- return false;
- };
-
- /* Sorting
- ---------------------------------------------------------------------- */
-
- // Document order sorting
- sortOrder = hasCompare ?
- function( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- // Sort on method existence if only one input has compareDocumentPosition
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if ( compare ) {
- return compare;
- }
-
- // Calculate position if both inputs belong to the same document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
- a.compareDocumentPosition( b ) :
-
- // Otherwise we know they are disconnected
- 1;
-
- // Disconnected nodes
- if ( compare & 1 ||
- ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
-
- // Choose the first element that is related to our preferred document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( a == document || a.ownerDocument == preferredDoc &&
- contains( preferredDoc, a ) ) {
- return -1;
- }
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( b == document || b.ownerDocument == preferredDoc &&
- contains( preferredDoc, b ) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- } :
- function( a, b ) {
-
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- var cur,
- i = 0,
- aup = a.parentNode,
- bup = b.parentNode,
- ap = [ a ],
- bp = [ b ];
-
- // Parentless nodes are either documents or disconnected
- if ( !aup || !bup ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- return a == document ? -1 :
- b == document ? 1 :
- /* eslint-enable eqeqeq */
- aup ? -1 :
- bup ? 1 :
- sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
-
- // If the nodes are siblings, we can do a quick check
- } else if ( aup === bup ) {
- return siblingCheck( a, b );
- }
-
- // Otherwise we need full lists of their ancestors for comparison
- cur = a;
- while ( ( cur = cur.parentNode ) ) {
- ap.unshift( cur );
- }
- cur = b;
- while ( ( cur = cur.parentNode ) ) {
- bp.unshift( cur );
- }
-
- // Walk down the tree looking for a discrepancy
- while ( ap[ i ] === bp[ i ] ) {
- i++;
- }
-
- return i ?
-
- // Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[ i ], bp[ i ] ) :
-
- // Otherwise nodes in our document sort first
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- ap[ i ] == preferredDoc ? -1 :
- bp[ i ] == preferredDoc ? 1 :
- /* eslint-enable eqeqeq */
- 0;
- };
-
- return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- setDocument( elem );
-
- if ( support.matchesSelector && documentIsHTML &&
- !nonnativeSelectorCache[ expr + " " ] &&
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
-
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || support.disconnectedMatch ||
-
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch ( e ) {
- nonnativeSelectorCache( expr, true );
- }
- }
-
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-
- // Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( context.ownerDocument || context ) != document ) {
- setDocument( context );
- }
- return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-
- // Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( elem.ownerDocument || elem ) != document ) {
- setDocument( elem );
- }
-
- var fn = Expr.attrHandle[ name.toLowerCase() ],
-
- // Don't get fooled by Object.prototype properties (jQuery #13807)
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, !documentIsHTML ) :
- undefined;
-
- return val !== undefined ?
- val :
- support.attributes || !documentIsHTML ?
- elem.getAttribute( name ) :
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
- val.value :
- null;
-};
-
-Sizzle.escape = function( sel ) {
- return ( sel + "" ).replace( rcssescape, fcssescape );
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- // Unless we *know* we can detect duplicates, assume their presence
- hasDuplicate = !support.detectDuplicates;
- sortInput = !support.sortStable && results.slice( 0 );
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( !nodeType ) {
-
- // If no nodeType, this is expected to be an array
- while ( ( node = elem[ i++ ] ) ) {
-
- // Do not traverse comment nodes
- ret += getText( node );
- }
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (jQuery #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
-
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
-
- // Do not include comment or processing instruction nodes
-
- return ret;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- attrHandle: {},
-
- find: {},
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[ 1 ] = match[ 1 ].replace( runescape, funescape );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
- match[ 5 ] || "" ).replace( runescape, funescape );
-
- if ( match[ 2 ] === "~=" ) {
- match[ 3 ] = " " + match[ 3 ] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
-
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 what (child|of-type)
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 4 xn-component of xn+y argument ([+-]?\d*n|)
- 5 sign of xn-component
- 6 x of xn-component
- 7 sign of y-component
- 8 y of y-component
- */
- match[ 1 ] = match[ 1 ].toLowerCase();
-
- if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
-
- // nth-* requires argument
- if ( !match[ 3 ] ) {
- Sizzle.error( match[ 0 ] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[ 4 ] = +( match[ 4 ] ?
- match[ 5 ] + ( match[ 6 ] || 1 ) :
- 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
- match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[ 3 ] ) {
- Sizzle.error( match[ 0 ] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var excess,
- unquoted = !match[ 6 ] && match[ 2 ];
-
- if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
- return null;
- }
-
- // Accept quoted arguments as-is
- if ( match[ 3 ] ) {
- match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
-
- // Strip excess characters from unquoted arguments
- } else if ( unquoted && rpseudo.test( unquoted ) &&
-
- // Get excess from tokenize (recursively)
- ( excess = tokenize( unquoted, true ) ) &&
-
- // advance to the next closing parenthesis
- ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
-
- // excess is a negative index
- match[ 0 ] = match[ 0 ].slice( 0, excess );
- match[ 2 ] = unquoted.slice( 0, excess );
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
-
- "TAG": function( nodeNameSelector ) {
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
- return nodeNameSelector === "*" ?
- function() {
- return true;
- } :
- function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ className + " " ];
-
- return pattern ||
- ( pattern = new RegExp( "(^|" + whitespace +
- ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
- className, function( elem ) {
- return pattern.test(
- typeof elem.className === "string" && elem.className ||
- typeof elem.getAttribute !== "undefined" &&
- elem.getAttribute( "class" ) ||
- ""
- );
- } );
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- /* eslint-disable max-len */
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.slice( -check.length ) === check :
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
- false;
- /* eslint-enable max-len */
-
- };
- },
-
- "CHILD": function( type, what, _argument, first, last ) {
- var simple = type.slice( 0, 3 ) !== "nth",
- forward = type.slice( -4 ) !== "last",
- ofType = what === "of-type";
-
- return first === 1 && last === 0 ?
-
- // Shortcut for :nth-*(n)
- function( elem ) {
- return !!elem.parentNode;
- } :
-
- function( elem, _context, xml ) {
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
- dir = simple !== forward ? "nextSibling" : "previousSibling",
- parent = elem.parentNode,
- name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType,
- diff = false;
-
- if ( parent ) {
-
- // :(first|last|only)-(child|of-type)
- if ( simple ) {
- while ( dir ) {
- node = elem;
- while ( ( node = node[ dir ] ) ) {
- if ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) {
-
- return false;
- }
- }
-
- // Reverse direction for :only-* (if we haven't yet done so)
- start = dir = type === "only" && !start && "nextSibling";
- }
- return true;
- }
-
- start = [ forward ? parent.firstChild : parent.lastChild ];
-
- // non-xml :nth-child(...) stores cache data on `parent`
- if ( forward && useCache ) {
-
- // Seek `elem` from a previously-cached index
-
- // ...in a gzip-friendly way
- node = parent;
- outerCache = node[ expando ] || ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex && cache[ 2 ];
- node = nodeIndex && parent.childNodes[ nodeIndex ];
-
- while ( ( node = ++nodeIndex && node && node[ dir ] ||
-
- // Fallback to seeking `elem` from the start
- ( diff = nodeIndex = 0 ) || start.pop() ) ) {
-
- // When found, cache indexes on `parent` and break
- if ( node.nodeType === 1 && ++diff && node === elem ) {
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- } else {
-
- // Use previously-cached element index if available
- if ( useCache ) {
-
- // ...in a gzip-friendly way
- node = elem;
- outerCache = node[ expando ] || ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex;
- }
-
- // xml :nth-child(...)
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
- if ( diff === false ) {
-
- // Use the same loop as above to seek `elem` from the start
- while ( ( node = ++nodeIndex && node && node[ dir ] ||
- ( diff = nodeIndex = 0 ) || start.pop() ) ) {
-
- if ( ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) &&
- ++diff ) {
-
- // Cache the index of each encountered element
- if ( useCache ) {
- outerCache = node[ expando ] ||
- ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- uniqueCache[ type ] = [ dirruns, diff ];
- }
-
- if ( node === elem ) {
- break;
- }
- }
- }
- }
- }
-
- // Incorporate the offset, then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
-
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction( function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf( seed, matched[ i ] );
- seed[ idx ] = !( matches[ idx ] = matched[ i ] );
- }
- } ) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
-
- // Potentially complex pseudos
- "not": markFunction( function( selector ) {
-
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction( function( seed, matches, _context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( ( elem = unmatched[ i ] ) ) {
- seed[ i ] = !( matches[ i ] = elem );
- }
- }
- } ) :
- function( elem, _context, xml ) {
- input[ 0 ] = elem;
- matcher( input, null, xml, results );
-
- // Don't keep the element (issue #299)
- input[ 0 ] = null;
- return !results.pop();
- };
- } ),
-
- "has": markFunction( function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- } ),
-
- "contains": markFunction( function( text ) {
- text = text.replace( runescape, funescape );
- return function( elem ) {
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
- };
- } ),
-
- // "Whether an element is represented by a :lang() selector
- // is based solely on the element's language value
- // being equal to the identifier C,
- // or beginning with the identifier C immediately followed by "-".
- // The matching of C against the element's language value is performed case-insensitively.
- // The identifier C does not have to be a valid language name."
- // http://www.w3.org/TR/selectors/#lang-pseudo
- "lang": markFunction( function( lang ) {
-
- // lang value must be a valid identifier
- if ( !ridentifier.test( lang || "" ) ) {
- Sizzle.error( "unsupported lang: " + lang );
- }
- lang = lang.replace( runescape, funescape ).toLowerCase();
- return function( elem ) {
- var elemLang;
- do {
- if ( ( elemLang = documentIsHTML ?
- elem.lang :
- elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
-
- elemLang = elemLang.toLowerCase();
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
- }
- } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
- return false;
- };
- } ),
-
- // Miscellaneous
- "target": function( elem ) {
- var hash = window.location && window.location.hash;
- return hash && hash.slice( 1 ) === elem.id;
- },
-
- "root": function( elem ) {
- return elem === docElem;
- },
-
- "focus": function( elem ) {
- return elem === document.activeElement &&
- ( !document.hasFocus || document.hasFocus() ) &&
- !!( elem.type || elem.href || ~elem.tabIndex );
- },
-
- // Boolean properties
- "enabled": createDisabledPseudo( false ),
- "disabled": createDisabledPseudo( true ),
-
- "checked": function( elem ) {
-
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return ( nodeName === "input" && !!elem.checked ) ||
- ( nodeName === "option" && !!elem.selected );
- },
-
- "selected": function( elem ) {
-
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- // eslint-disable-next-line no-unused-expressions
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- // Contents
- "empty": function( elem ) {
-
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
- // but not by others (comment: 8; processing instruction: 7; etc.)
- // nodeType < 6 works because attributes (2) do not appear as children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeType < 6 ) {
- return false;
- }
- }
- return true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos[ "empty" ]( elem );
- },
-
- // Element/input types
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "text": function( elem ) {
- var attr;
- return elem.nodeName.toLowerCase() === "input" &&
- elem.type === "text" &&
-
- // Support: IE<8
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( ( attr = elem.getAttribute( "type" ) ) == null ||
- attr.toLowerCase() === "text" );
- },
-
- // Position-in-collection
- "first": createPositionalPseudo( function() {
- return [ 0 ];
- } ),
-
- "last": createPositionalPseudo( function( _matchIndexes, length ) {
- return [ length - 1 ];
- } ),
-
- "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- } ),
-
- "even": createPositionalPseudo( function( matchIndexes, length ) {
- var i = 0;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "odd": createPositionalPseudo( function( matchIndexes, length ) {
- var i = 1;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
- var i = argument < 0 ?
- argument + length :
- argument > length ?
- length :
- argument;
- for ( ; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } )
- }
-};
-
-Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
- Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
- Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
- var matched, match, tokens, type,
- soFar, groups, preFilters,
- cached = tokenCache[ selector + " " ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
- if ( match ) {
-
- // Don't consume trailing commas as valid
- soFar = soFar.slice( match[ 0 ].length ) || soFar;
- }
- groups.push( ( tokens = [] ) );
- }
-
- matched = false;
-
- // Combinators
- if ( ( match = rcombinators.exec( soFar ) ) ) {
- matched = match.shift();
- tokens.push( {
- value: matched,
-
- // Cast descendant combinators to space
- type: match[ 0 ].replace( rtrim, " " )
- } );
- soFar = soFar.slice( matched.length );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
- ( match = preFilters[ type ]( match ) ) ) ) {
- matched = match.shift();
- tokens.push( {
- value: matched,
- type: type,
- matches: match
- } );
- soFar = soFar.slice( matched.length );
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
-
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
- var i = 0,
- len = tokens.length,
- selector = "";
- for ( ; i < len; i++ ) {
- selector += tokens[ i ].value;
- }
- return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- skip = combinator.next,
- key = skip || dir,
- checkNonElements = base && key === "parentNode",
- doneName = done++;
-
- return combinator.first ?
-
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- return matcher( elem, context, xml );
- }
- }
- return false;
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- var oldCache, uniqueCache, outerCache,
- newCache = [ dirruns, doneName ];
-
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
- if ( xml ) {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- if ( matcher( elem, context, xml ) ) {
- return true;
- }
- }
- }
- } else {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || ( elem[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] ||
- ( outerCache[ elem.uniqueID ] = {} );
-
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
- elem = elem[ dir ] || elem;
- } else if ( ( oldCache = uniqueCache[ key ] ) &&
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
- // Assign to newCache so results back-propagate to previous elements
- return ( newCache[ 2 ] = oldCache[ 2 ] );
- } else {
-
- // Reuse newcache so results back-propagate to previous elements
- uniqueCache[ key ] = newCache;
-
- // A match means we're done; a fail means we have to keep checking
- if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
- return true;
- }
- }
- }
- }
- }
- return false;
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[ i ]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[ 0 ];
-}
-
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[ i ], results );
- }
- return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( ( elem = unmatched[ i ] ) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction( function( seed, results, context, xml ) {
- var temp, i, elem,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts(
- selector || "*",
- context.nodeType ? [ context ] : context,
- []
- ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
-
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- temp = condense( matcherOut, postMap );
- postFilter( temp, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = temp.length;
- while ( i-- ) {
- if ( ( elem = temp[ i ] ) ) {
- matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
- }
- }
- }
-
- if ( seed ) {
- if ( postFinder || preFilter ) {
- if ( postFinder ) {
-
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
- temp = [];
- i = matcherOut.length;
- while ( i-- ) {
- if ( ( elem = matcherOut[ i ] ) ) {
-
- // Restore matcherIn since elem is not yet a final match
- temp.push( ( matcherIn[ i ] = elem ) );
- }
- }
- postFinder( null, ( matcherOut = [] ), temp, xml );
- }
-
- // Move matched elements from seed to results to keep them synchronized
- i = matcherOut.length;
- while ( i-- ) {
- if ( ( elem = matcherOut[ i ] ) &&
- ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
-
- seed[ temp ] = !( results[ temp ] = elem );
- }
- }
- }
-
- // Add elements to results, through postFinder if defined
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- } );
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[ 0 ].type ],
- implicitRelative = leadingRelative || Expr.relative[ " " ],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- ( checkContext = context ).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
-
- // Avoid hanging onto element (issue #299)
- checkContext = null;
- return ret;
- } ];
-
- for ( ; i < len; i++ ) {
- if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
- matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
- } else {
- matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
-
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[ j ].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && toSelector(
-
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens
- .slice( 0, i - 1 )
- .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
- ).replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
- j < len && toSelector( tokens )
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, outermost ) {
- var elem, j, matcher,
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- setMatched = [],
- contextBackup = outermostContext,
-
- // We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
-
- // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
- len = elems.length;
-
- if ( outermost ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- outermostContext = context == document || context || outermost;
- }
-
- // Add elements passing elementMatchers directly to results
- // Support: IE<9, Safari
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
- if ( byElement && elem ) {
- j = 0;
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( !context && elem.ownerDocument != document ) {
- setDocument( elem );
- xml = !documentIsHTML;
- }
- while ( ( matcher = elementMatchers[ j++ ] ) ) {
- if ( matcher( elem, context || document, xml ) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
-
- // They will have gone through all possible matchers
- if ( ( elem = !matcher && elem ) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
- // makes the latter nonnegative.
- matchedCount += i;
-
- // Apply set filters to unmatched elements
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
- // no element matchers and no seed.
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
- // numerically zero.
- if ( bySet && i !== matchedCount ) {
- j = 0;
- while ( ( matcher = setMatchers[ j++ ] ) ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
-
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
- setMatched[ i ] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ selector + " " ];
-
- if ( !cached ) {
-
- // Generate a function of recursive functions that can be used to check each element
- if ( !match ) {
- match = tokenize( selector );
- }
- i = match.length;
- while ( i-- ) {
- cached = matcherFromTokens( match[ i ] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache(
- selector,
- matcherFromGroupMatchers( elementMatchers, setMatchers )
- );
-
- // Save selector and tokenization
- cached.selector = selector;
- }
- return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- * selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- * selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
- var i, tokens, token, type, find,
- compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( ( selector = compiled.selector || selector ) );
-
- results = results || [];
-
- // Try to minimize operations if there is only one selector in the list and no seed
- // (the latter of which guarantees us context)
- if ( match.length === 1 ) {
-
- // Reduce context if the leading compound selector is an ID
- tokens = match[ 0 ] = match[ 0 ].slice( 0 );
- if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
-
- context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
- .replace( runescape, funescape ), context ) || [] )[ 0 ];
- if ( !context ) {
- return results;
-
- // Precompiled matchers will still verify ancestry, so step up a level
- } else if ( compiled ) {
- context = context.parentNode;
- }
-
- selector = selector.slice( tokens.shift().value.length );
- }
-
- // Fetch a seed set for right-to-left matching
- i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
- while ( i-- ) {
- token = tokens[ i ];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ ( type = token.type ) ] ) {
- break;
- }
- if ( ( find = Expr.find[ type ] ) ) {
-
- // Search, expanding context for leading sibling combinators
- if ( ( seed = find(
- token.matches[ 0 ].replace( runescape, funescape ),
- rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
- context
- ) ) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && toSelector( tokens );
- if ( !selector ) {
- push.apply( results, seed );
- return results;
- }
-
- break;
- }
- }
- }
- }
-
- // Compile and execute a filtering function if one is not provided
- // Provide `match` to avoid retokenization if we modified the selector above
- ( compiled || compile( selector, match ) )(
- seed,
- context,
- !documentIsHTML,
- results,
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
- );
- return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert( function( el ) {
-
- // Should return 1, but returns 4 (following)
- return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
-} );
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert( function( el ) {
- el.innerHTML = "<a href='#'></a>";
- return el.firstChild.getAttribute( "href" ) === "#";
-} ) ) {
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
- if ( !isXML ) {
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
- }
- } );
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert( function( el ) {
- el.innerHTML = "<input/>";
- el.firstChild.setAttribute( "value", "" );
- return el.firstChild.getAttribute( "value" ) === "";
-} ) ) {
- addHandle( "value", function( elem, _name, isXML ) {
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
- return elem.defaultValue;
- }
- } );
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert( function( el ) {
- return el.getAttribute( "disabled" ) == null;
-} ) ) {
- addHandle( booleans, function( elem, name, isXML ) {
- var val;
- if ( !isXML ) {
- return elem[ name ] === true ? name.toLowerCase() :
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
- val.value :
- null;
- }
- } );
-}
-
-return Sizzle;
-
-} )( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-var dir = function( elem, dir, until ) {
- var matched = [],
- truncate = until !== undefined;
-
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
- if ( elem.nodeType === 1 ) {
- if ( truncate && jQuery( elem ).is( until ) ) {
- break;
- }
- matched.push( elem );
- }
- }
- return matched;
-};
-
-
-var siblings = function( n, elem ) {
- var matched = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- matched.push( n );
- }
- }
-
- return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-
-
-function nodeName( elem, name ) {
-
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-};
-var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- return !!qualifier.call( elem, i, elem ) !== not;
- } );
- }
-
- // Single element
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- } );
- }
-
- // Arraylike of elements (jQuery, arguments, Array)
- if ( typeof qualifier !== "string" ) {
- return jQuery.grep( elements, function( elem ) {
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
- } );
- }
-
- // Filtered directly for both simple and complex selectors
- return jQuery.filter( qualifier, elements, not );
-}
-
-jQuery.filter = function( expr, elems, not ) {
- var elem = elems[ 0 ];
-
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- if ( elems.length === 1 && elem.nodeType === 1 ) {
- return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
- }
-
- return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
-};
-
-jQuery.fn.extend( {
- find: function( selector ) {
- var i, ret,
- len = this.length,
- self = this;
-
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter( function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } ) );
- }
-
- ret = this.pushStack( [] );
-
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
-
- return len > 1 ? jQuery.uniqueSort( ret ) : ret;
- },
- filter: function( selector ) {
- return this.pushStack( winnow( this, selector || [], false ) );
- },
- not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
- },
- is: function( selector ) {
- return !!winnow(
- this,
-
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- // Shortcut simple #id case for speed
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
- init = jQuery.fn.init = function( selector, context, root ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Method init() accepts an alternate rootjQuery
- // so migrate can support jQuery.sub (gh-2101)
- root = root || rootjQuery;
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector[ 0 ] === "<" &&
- selector[ selector.length - 1 ] === ">" &&
- selector.length >= 3 ) {
-
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && ( match[ 1 ] || !context ) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[ 1 ] ) {
- context = context instanceof jQuery ? context[ 0 ] : context;
-
- // Option to run scripts is true for back-compat
- // Intentionally let the error be thrown if parseHTML is not present
- jQuery.merge( this, jQuery.parseHTML(
- match[ 1 ],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
-
- // Properties of context are called as methods if possible
- if ( isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[ 2 ] );
-
- if ( elem ) {
-
- // Inject the element directly into the jQuery object
- this[ 0 ] = elem;
- this.length = 1;
- }
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || root ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this[ 0 ] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( isFunction( selector ) ) {
- return root.ready !== undefined ?
- root.ready( selector ) :
-
- // Execute immediately if ready is not present
- selector( jQuery );
- }
-
- return jQuery.makeArray( selector, this );
- };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
- // Methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend( {
- has: function( target ) {
- var targets = jQuery( target, this ),
- l = targets.length;
-
- return this.filter( function() {
- var i = 0;
- for ( ; i < l; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
- return true;
- }
- }
- } );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- matched = [],
- targets = typeof selectors !== "string" && jQuery( selectors );
-
- // Positional selectors never match, since there's no _selection_ context
- if ( !rneedsContext.test( selectors ) ) {
- for ( ; i < l; i++ ) {
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
- // Always skip document fragments
- if ( cur.nodeType < 11 && ( targets ?
- targets.index( cur ) > -1 :
-
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
- matched.push( cur );
- break;
- }
- }
- }
- }
-
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
- },
-
- // Determine the position of an element within the set
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
- }
-
- // Index in selector
- if ( typeof elem === "string" ) {
- return indexOf.call( jQuery( elem ), this[ 0 ] );
- }
-
- // Locate the position of the desired element
- return indexOf.call( this,
-
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[ 0 ] : elem
- );
- },
-
- add: function( selector, context ) {
- return this.pushStack(
- jQuery.uniqueSort(
- jQuery.merge( this.get(), jQuery( selector, context ) )
- )
- );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- }
-} );
-
-function sibling( cur, dir ) {
- while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
- return cur;
-}
-
-jQuery.each( {
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, _i, until ) {
- return dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, _i, until ) {
- return dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, _i, until ) {
- return dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return siblings( elem.firstChild );
- },
- contents: function( elem ) {
- if ( elem.contentDocument != null &&
-
- // Support: IE 11+
- // <object> elements with no `data` attribute has an object
- // `contentDocument` with a `null` prototype.
- getProto( elem.contentDocument ) ) {
-
- return elem.contentDocument;
- }
-
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
- // Treat the template element as a regular one in browsers that
- // don't support it.
- if ( nodeName( elem, "template" ) ) {
- elem = elem.content || elem;
- }
-
- return jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var matched = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- matched = jQuery.filter( selector, matched );
- }
-
- if ( this.length > 1 ) {
-
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- jQuery.uniqueSort( matched );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- matched.reverse();
- }
- }
-
- return this.pushStack( matched );
- };
-} );
-var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
- object[ flag ] = true;
- } );
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- createOptions( options ) :
- jQuery.extend( {}, options );
-
- var // Flag to know if list is currently firing
- firing,
-
- // Last fire value for non-forgettable lists
- memory,
-
- // Flag to know if list was already fired
- fired,
-
- // Flag to prevent firing
- locked,
-
- // Actual callback list
- list = [],
-
- // Queue of execution data for repeatable lists
- queue = [],
-
- // Index of currently firing callback (modified by add/remove as needed)
- firingIndex = -1,
-
- // Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = locked || options.once;
-
- // Execute callbacks for all pending executions,
- // respecting firingIndex overrides and runtime changes
- fired = firing = true;
- for ( ; queue.length; firingIndex = -1 ) {
- memory = queue.shift();
- while ( ++firingIndex < list.length ) {
-
- // Run callback and check for early termination
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
- options.stopOnFalse ) {
-
- // Jump to end and forget the data so .add doesn't re-fire
- firingIndex = list.length;
- memory = false;
- }
- }
- }
-
- // Forget the data if we're done with it
- if ( !options.memory ) {
- memory = false;
- }
-
- firing = false;
-
- // Clean up if we're done firing for good
- if ( locked ) {
-
- // Keep an empty list if we have data for future add calls
- if ( memory ) {
- list = [];
-
- // Otherwise, this object is spent
- } else {
- list = "";
- }
- }
- },
-
- // Actual Callbacks object
- self = {
-
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
-
- // If we have memory from a past run, we should fire after adding
- if ( memory && !firing ) {
- firingIndex = list.length - 1;
- queue.push( memory );
- }
-
- ( function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( isFunction( arg ) ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && toType( arg ) !== "string" ) {
-
- // Inspect recursively
- add( arg );
- }
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Remove a callback from the list
- remove: function() {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
-
- // Handle firing indexes
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- } );
- return this;
- },
-
- // Check if a given callback is in the list.
- // If no argument is given, return whether or not list has callbacks attached.
- has: function( fn ) {
- return fn ?
- jQuery.inArray( fn, list ) > -1 :
- list.length > 0;
- },
-
- // Remove all callbacks from the list
- empty: function() {
- if ( list ) {
- list = [];
- }
- return this;
- },
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
- disable: function() {
- locked = queue = [];
- list = memory = "";
- return this;
- },
- disabled: function() {
- return !list;
- },
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
- lock: function() {
- locked = queue = [];
- if ( !memory && !firing ) {
- list = memory = "";
- }
- return this;
- },
- locked: function() {
- return !!locked;
- },
-
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( !locked ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
-
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-
-
-function Identity( v ) {
- return v;
-}
-function Thrower( ex ) {
- throw ex;
-}
-
-function adoptValue( value, resolve, reject, noValue ) {
- var method;
-
- try {
-
- // Check for promise aspect first to privilege synchronous behavior
- if ( value && isFunction( ( method = value.promise ) ) ) {
- method.call( value ).done( resolve ).fail( reject );
-
- // Other thenables
- } else if ( value && isFunction( ( method = value.then ) ) ) {
- method.call( value, resolve, reject );
-
- // Other non-thenables
- } else {
-
- // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
- // * false: [ value ].slice( 0 ) => resolve( value )
- // * true: [ value ].slice( 1 ) => resolve()
- resolve.apply( undefined, [ value ].slice( noValue ) );
- }
-
- // For Promises/A+, convert exceptions into rejections
- // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
- // Deferred#then to conditionally suppress rejection.
- } catch ( value ) {
-
- // Support: Android 4.0 only
- // Strict mode functions invoked without .call/.apply get global-object context
- reject.apply( undefined, [ value ] );
- }
-}
-
-jQuery.extend( {
-
- Deferred: function( func ) {
- var tuples = [
-
- // action, add listener, callbacks,
- // ... .then handlers, argument index, [final state]
- [ "notify", "progress", jQuery.Callbacks( "memory" ),
- jQuery.Callbacks( "memory" ), 2 ],
- [ "resolve", "done", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 0, "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 1, "rejected" ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- "catch": function( fn ) {
- return promise.then( null, fn );
- },
-
- // Keep pipe for back-compat
- pipe: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
-
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( _i, tuple ) {
-
- // Map tuples (progress, done, fail) to arguments (done, fail, progress)
- var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
- // deferred.progress(function() { bind to newDefer or newDefer.notify })
- // deferred.done(function() { bind to newDefer or newDefer.resolve })
- // deferred.fail(function() { bind to newDefer or newDefer.reject })
- deferred[ tuple[ 1 ] ]( function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && isFunction( returned.promise ) ) {
- returned.promise()
- .progress( newDefer.notify )
- .done( newDefer.resolve )
- .fail( newDefer.reject );
- } else {
- newDefer[ tuple[ 0 ] + "With" ](
- this,
- fn ? [ returned ] : arguments
- );
- }
- } );
- } );
- fns = null;
- } ).promise();
- },
- then: function( onFulfilled, onRejected, onProgress ) {
- var maxDepth = 0;
- function resolve( depth, deferred, handler, special ) {
- return function() {
- var that = this,
- args = arguments,
- mightThrow = function() {
- var returned, then;
-
- // Support: Promises/A+ section 2.3.3.3.3
- // https://promisesaplus.com/#point-59
- // Ignore double-resolution attempts
- if ( depth < maxDepth ) {
- return;
- }
-
- returned = handler.apply( that, args );
-
- // Support: Promises/A+ section 2.3.1
- // https://promisesaplus.com/#point-48
- if ( returned === deferred.promise() ) {
- throw new TypeError( "Thenable self-resolution" );
- }
-
- // Support: Promises/A+ sections 2.3.3.1, 3.5
- // https://promisesaplus.com/#point-54
- // https://promisesaplus.com/#point-75
- // Retrieve `then` only once
- then = returned &&
-
- // Support: Promises/A+ section 2.3.4
- // https://promisesaplus.com/#point-64
- // Only check objects and functions for thenability
- ( typeof returned === "object" ||
- typeof returned === "function" ) &&
- returned.then;
-
- // Handle a returned thenable
- if ( isFunction( then ) ) {
-
- // Special processors (notify) just wait for resolution
- if ( special ) {
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special )
- );
-
- // Normal processors (resolve) also hook into progress
- } else {
-
- // ...and disregard older resolution values
- maxDepth++;
-
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special ),
- resolve( maxDepth, deferred, Identity,
- deferred.notifyWith )
- );
- }
-
- // Handle all other returned values
- } else {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Identity ) {
- that = undefined;
- args = [ returned ];
- }
-
- // Process the value(s)
- // Default process is resolve
- ( special || deferred.resolveWith )( that, args );
- }
- },
-
- // Only normal processors (resolve) catch and reject exceptions
- process = special ?
- mightThrow :
- function() {
- try {
- mightThrow();
- } catch ( e ) {
-
- if ( jQuery.Deferred.exceptionHook ) {
- jQuery.Deferred.exceptionHook( e,
- process.stackTrace );
- }
-
- // Support: Promises/A+ section 2.3.3.3.4.1
- // https://promisesaplus.com/#point-61
- // Ignore post-resolution exceptions
- if ( depth + 1 >= maxDepth ) {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Thrower ) {
- that = undefined;
- args = [ e ];
- }
-
- deferred.rejectWith( that, args );
- }
- }
- };
-
- // Support: Promises/A+ section 2.3.3.3.1
- // https://promisesaplus.com/#point-57
- // Re-resolve promises immediately to dodge false rejection from
- // subsequent errors
- if ( depth ) {
- process();
- } else {
-
- // Call an optional hook to record the stack, in case of exception
- // since it's otherwise lost when execution goes async
- if ( jQuery.Deferred.getStackHook ) {
- process.stackTrace = jQuery.Deferred.getStackHook();
- }
- window.setTimeout( process );
- }
- };
- }
-
- return jQuery.Deferred( function( newDefer ) {
-
- // progress_handlers.add( ... )
- tuples[ 0 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onProgress ) ?
- onProgress :
- Identity,
- newDefer.notifyWith
- )
- );
-
- // fulfilled_handlers.add( ... )
- tuples[ 1 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onFulfilled ) ?
- onFulfilled :
- Identity
- )
- );
-
- // rejected_handlers.add( ... )
- tuples[ 2 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onRejected ) ?
- onRejected :
- Thrower
- )
- );
- } ).promise();
- },
-
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 5 ];
-
- // promise.progress = list.add
- // promise.done = list.add
- // promise.fail = list.add
- promise[ tuple[ 1 ] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add(
- function() {
-
- // state = "resolved" (i.e., fulfilled)
- // state = "rejected"
- state = stateString;
- },
-
- // rejected_callbacks.disable
- // fulfilled_callbacks.disable
- tuples[ 3 - i ][ 2 ].disable,
-
- // rejected_handlers.disable
- // fulfilled_handlers.disable
- tuples[ 3 - i ][ 3 ].disable,
-
- // progress_callbacks.lock
- tuples[ 0 ][ 2 ].lock,
-
- // progress_handlers.lock
- tuples[ 0 ][ 3 ].lock
- );
- }
-
- // progress_handlers.fire
- // fulfilled_handlers.fire
- // rejected_handlers.fire
- list.add( tuple[ 3 ].fire );
-
- // deferred.notify = function() { deferred.notifyWith(...) }
- // deferred.resolve = function() { deferred.resolveWith(...) }
- // deferred.reject = function() { deferred.rejectWith(...) }
- deferred[ tuple[ 0 ] ] = function() {
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
- return this;
- };
-
- // deferred.notifyWith = list.fireWith
- // deferred.resolveWith = list.fireWith
- // deferred.rejectWith = list.fireWith
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
- } );
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( singleValue ) {
- var
-
- // count of uncompleted subordinates
- remaining = arguments.length,
-
- // count of unprocessed arguments
- i = remaining,
-
- // subordinate fulfillment data
- resolveContexts = Array( i ),
- resolveValues = slice.call( arguments ),
-
- // the master Deferred
- master = jQuery.Deferred(),
-
- // subordinate callback factory
- updateFunc = function( i ) {
- return function( value ) {
- resolveContexts[ i ] = this;
- resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
- if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
- }
- };
- };
-
- // Single- and empty arguments are adopted like Promise.resolve
- if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
- !remaining );
-
- // Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
- isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
- return master.then();
- }
- }
-
- // Multiple arguments are aggregated like Promise.all array elements
- while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
- }
-
- return master.promise();
- }
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
- // Support: IE 8 - 9 only
- // Console exists when dev tools are open, which can happen at any time
- if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
- }
-};
-
-
-
-
-jQuery.readyException = function( error ) {
- window.setTimeout( function() {
- throw error;
- } );
-};
-
-
-
-
-// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
-
-jQuery.fn.ready = function( fn ) {
-
- readyList
- .then( fn )
-
- // Wrap jQuery.readyException in a function so that the lookup
- // happens at the time of error handling instead of callback
- // registration.
- .catch( function( error ) {
- jQuery.readyException( error );
- } );
-
- return this;
-};
-
-jQuery.extend( {
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
- }
-} );
-
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-function completed() {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
- jQuery.ready();
-}
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
-
-} else {
-
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
-}
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- len = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( toType( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
-
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
-
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, _key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < len; i++ ) {
- fn(
- elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
- }
- }
- }
-
- if ( chainable ) {
- return elems;
- }
-
- // Gets
- if ( bulk ) {
- return fn.call( elems );
- }
-
- return len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-
-
-// Matches dashed string for camelizing
-var rmsPrefix = /^-ms-/,
- rdashAlpha = /-([a-z])/g;
-
-// Used by camelCase as callback to replace()
-function fcamelCase( _all, letter ) {
- return letter.toUpperCase();
-}
-
-// Convert dashed to camelCase; used by the css and data modules
-// Support: IE <=9 - 11, Edge 12 - 15
-// Microsoft forgot to hump their vendor prefix (#9572)
-function camelCase( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-}
-var acceptData = function( owner ) {
-
- // Accepts only:
- // - Node
- // - Node.ELEMENT_NODE
- // - Node.DOCUMENT_NODE
- // - Object
- // - Any
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
- this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
- cache: function( owner ) {
-
- // Check if the owner object already has a cache
- var value = owner[ this.expando ];
-
- // If not, create one
- if ( !value ) {
- value = {};
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( acceptData( owner ) ) {
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable property
- // configurable must be true to allow the property to be
- // deleted when data is removed
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- configurable: true
- } );
- }
- }
- }
-
- return value;
- },
- set: function( owner, data, value ) {
- var prop,
- cache = this.cache( owner );
-
- // Handle: [ owner, key, value ] args
- // Always use camelCase key (gh-2257)
- if ( typeof data === "string" ) {
- cache[ camelCase( data ) ] = value;
-
- // Handle: [ owner, { properties } ] args
- } else {
-
- // Copy the properties one-by-one to the cache object
- for ( prop in data ) {
- cache[ camelCase( prop ) ] = data[ prop ];
- }
- }
- return cache;
- },
- get: function( owner, key ) {
- return key === undefined ?
- this.cache( owner ) :
-
- // Always use camelCase key (gh-2257)
- owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
- },
- access: function( owner, key, value ) {
-
- // In cases where either:
- //
- // 1. No key was specified
- // 2. A string key was specified, but no value provided
- //
- // Take the "read" path and allow the get method to determine
- // which value to return, respectively either:
- //
- // 1. The entire cache object
- // 2. The data stored at the key
- //
- if ( key === undefined ||
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
- return this.get( owner, key );
- }
-
- // When the key is not a string, or both a key and value
- // are specified, set or extend (existing objects) with either:
- //
- // 1. An object of properties
- // 2. A key and value
- //
- this.set( owner, key, value );
-
- // Since the "set" path can have two possible entry points
- // return the expected data based on which path was taken[*]
- return value !== undefined ? value : key;
- },
- remove: function( owner, key ) {
- var i,
- cache = owner[ this.expando ];
-
- if ( cache === undefined ) {
- return;
- }
-
- if ( key !== undefined ) {
-
- // Support array or space separated string of keys
- if ( Array.isArray( key ) ) {
-
- // If key is an array of keys...
- // We always set camelCase keys, so remove that.
- key = key.map( camelCase );
- } else {
- key = camelCase( key );
-
- // If a key with the spaces exists, use it.
- // Otherwise, create an array by matching non-whitespace
- key = key in cache ?
- [ key ] :
- ( key.match( rnothtmlwhite ) || [] );
- }
-
- i = key.length;
-
- while ( i-- ) {
- delete cache[ key[ i ] ];
- }
- }
-
- // Remove the expando if there's no more data
- if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
- // Support: Chrome <=35 - 45
- // Webkit & Blink performance suffers when deleting properties
- // from DOM nodes, so set to undefined instead
- // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
- if ( owner.nodeType ) {
- owner[ this.expando ] = undefined;
- } else {
- delete owner[ this.expando ];
- }
- }
- },
- hasData: function( owner ) {
- var cache = owner[ this.expando ];
- return cache !== undefined && !jQuery.isEmptyObject( cache );
- }
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-// Implementation Summary
-//
-// 1. Enforce API surface and semantic compatibility with 1.9.x branch
-// 2. Improve the module's maintainability by reducing the storage
-// paths to a single mechanism.
-// 3. Use the same single mechanism to support "private" and "user" data.
-// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-// 5. Avoid exposing implementation details on user objects (eg. expando properties)
-// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /[A-Z]/g;
-
-function getData( data ) {
- if ( data === "true" ) {
- return true;
- }
-
- if ( data === "false" ) {
- return false;
- }
-
- if ( data === "null" ) {
- return null;
- }
-
- // Only convert to a number if it doesn't change the string
- if ( data === +data + "" ) {
- return +data;
- }
-
- if ( rbrace.test( data ) ) {
- return JSON.parse( data );
- }
-
- return data;
-}
-
-function dataAttr( elem, key, data ) {
- var name;
-
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = getData( data );
- } catch ( e ) {}
-
- // Make sure we set the data so it isn't changed later
- dataUser.set( elem, key, data );
- } else {
- data = undefined;
- }
- }
- return data;
-}
-
-jQuery.extend( {
- hasData: function( elem ) {
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
- },
-
- data: function( elem, name, data ) {
- return dataUser.access( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- dataUser.remove( elem, name );
- },
-
- // TODO: Now that all calls to _data and _removeData have been replaced
- // with direct calls to dataPriv methods, these can be deprecated.
- _data: function( elem, name, data ) {
- return dataPriv.access( elem, name, data );
- },
-
- _removeData: function( elem, name ) {
- dataPriv.remove( elem, name );
- }
-} );
-
-jQuery.fn.extend( {
- data: function( key, value ) {
- var i, name, data,
- elem = this[ 0 ],
- attrs = elem && elem.attributes;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = dataUser.get( elem );
-
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
- i = attrs.length;
- while ( i-- ) {
-
- // Support: IE 11 only
- // The attrs elements can be null (#14894)
- if ( attrs[ i ] ) {
- name = attrs[ i ].name;
- if ( name.indexOf( "data-" ) === 0 ) {
- name = camelCase( name.slice( 5 ) );
- dataAttr( elem, name, data[ name ] );
- }
- }
- }
- dataPriv.set( elem, "hasDataAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each( function() {
- dataUser.set( this, key );
- } );
- }
-
- return access( this, function( value ) {
- var data;
-
- // The calling jQuery object (element matches) is not empty
- // (and therefore has an element appears at this[ 0 ]) and the
- // `value` parameter was not undefined. An empty jQuery object
- // will result in `undefined` for elem = this[ 0 ] which will
- // throw an exception if an attempt to read a data cache is made.
- if ( elem && value === undefined ) {
-
- // Attempt to get data from the cache
- // The key will always be camelCased in Data
- data = dataUser.get( elem, key );
- if ( data !== undefined ) {
- return data;
- }
-
- // Attempt to "discover" the data in
- // HTML5 custom data-* attrs
- data = dataAttr( elem, key );
- if ( data !== undefined ) {
- return data;
- }
-
- // We tried really hard, but the data doesn't exist.
- return;
- }
-
- // Set the data...
- this.each( function() {
-
- // We always store the camelCased key
- dataUser.set( this, key, value );
- } );
- }, null, value, arguments.length > 1, null, true );
- },
-
- removeData: function( key ) {
- return this.each( function() {
- dataUser.remove( this, key );
- } );
- }
-} );
-
-
-jQuery.extend( {
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = dataPriv.get( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || Array.isArray( data ) ) {
- queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // Clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // Not public - generate a queueHooks object, or return the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
- empty: jQuery.Callbacks( "once memory" ).add( function() {
- dataPriv.remove( elem, [ type + "queue", key ] );
- } )
- } );
- }
-} );
-
-jQuery.fn.extend( {
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[ 0 ], type );
- }
-
- return data === undefined ?
- this :
- this.each( function() {
- var queue = jQuery.queue( this, type, data );
-
- // Ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- dequeue: function( type ) {
- return this.each( function() {
- jQuery.dequeue( this, type );
- } );
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
-
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while ( i-- ) {
- tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var documentElement = document.documentElement;
-
-
-
- var isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem );
- },
- composed = { composed: true };
-
- // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
- // Check attachment across shadow DOM boundaries when possible (gh-3504)
- // Support: iOS 10.0-10.2 only
- // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
- // leading to errors. We need to check for `getRootNode`.
- if ( documentElement.getRootNode ) {
- isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem ) ||
- elem.getRootNode( composed ) === elem.ownerDocument;
- };
- }
-var isHiddenWithinTree = function( elem, el ) {
-
- // isHiddenWithinTree might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
-
- // Inline style trumps all
- return elem.style.display === "none" ||
- elem.style.display === "" &&
-
- // Otherwise, check computed style
- // Support: Firefox <=43 - 45
- // Disconnected elements can have computed display: none, so first confirm that elem is
- // in the document.
- isAttached( elem ) &&
-
- jQuery.css( elem, "display" ) === "none";
- };
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted, scale,
- maxIterations = 20,
- currentValue = tween ?
- function() {
- return tween.cur();
- } :
- function() {
- return jQuery.css( elem, prop, "" );
- },
- initial = currentValue(),
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- initialInUnit = elem.nodeType &&
- ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Support: Firefox <=54
- // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
- initial = initial / 2;
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- while ( maxIterations-- ) {
-
- // Evaluate and update our best guess (doubling guesses that zero out).
- // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
- jQuery.style( elem, prop, initialInUnit + unit );
- if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
- maxIterations = 0;
- }
- initialInUnit = initialInUnit / scale;
-
- }
-
- initialInUnit = initialInUnit * 2;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
- }
-
- if ( valueParts ) {
- initialInUnit = +initialInUnit || +initial || 0;
-
- // Apply relative offset (+=/-=) if specified
- adjusted = valueParts[ 1 ] ?
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
- +valueParts[ 2 ];
- if ( tween ) {
- tween.unit = unit;
- tween.start = initialInUnit;
- tween.end = adjusted;
- }
- }
- return adjusted;
-}
-
-
-var defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
- var temp,
- doc = elem.ownerDocument,
- nodeName = elem.nodeName,
- display = defaultDisplayMap[ nodeName ];
-
- if ( display ) {
- return display;
- }
-
- temp = doc.body.appendChild( doc.createElement( nodeName ) );
- display = jQuery.css( temp, "display" );
-
- temp.parentNode.removeChild( temp );
-
- if ( display === "none" ) {
- display = "block";
- }
- defaultDisplayMap[ nodeName ] = display;
-
- return display;
-}
-
-function showHide( elements, show ) {
- var display, elem,
- values = [],
- index = 0,
- length = elements.length;
-
- // Determine new display value for elements that need to change
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- display = elem.style.display;
- if ( show ) {
-
- // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
- // check is required in this first loop unless we have a nonempty display value (either
- // inline or about-to-be-restored)
- if ( display === "none" ) {
- values[ index ] = dataPriv.get( elem, "display" ) || null;
- if ( !values[ index ] ) {
- elem.style.display = "";
- }
- }
- if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
- values[ index ] = getDefaultDisplay( elem );
- }
- } else {
- if ( display !== "none" ) {
- values[ index ] = "none";
-
- // Remember what we're overwriting
- dataPriv.set( elem, "display", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop to avoid constant reflow
- for ( index = 0; index < length; index++ ) {
- if ( values[ index ] != null ) {
- elements[ index ].style.display = values[ index ];
- }
- }
-
- return elements;
-}
-
-jQuery.fn.extend( {
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each( function() {
- if ( isHiddenWithinTree( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
-
-var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
-
-
-
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0 - 4.3 only
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Android <=4.1 only
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE <=11 only
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
- // Support: IE <=9 only
- // IE <=9 replaces <option> tags with their contents when inserted outside of
- // the select element.
- div.innerHTML = "<option></option>";
- support.option = !!div.lastChild;
-} )();
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
- // XHTML parsers do not magically insert elements in the
- // same way that tag soup parsers do. So we cannot shorten
- // this by omitting <tbody> or other required elements.
- thead: [ 1, "<table>", "</table>" ],
- col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
- _default: [ 0, "", "" ]
-};
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// Support: IE <=9 only
-if ( !support.option ) {
- wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
-}
-
-
-function getAll( context, tag ) {
-
- // Support: IE <=9 - 11 only
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret;
-
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- ret = context.getElementsByTagName( tag || "*" );
-
- } else if ( typeof context.querySelectorAll !== "undefined" ) {
- ret = context.querySelectorAll( tag || "*" );
-
- } else {
- ret = [];
- }
-
- if ( tag === undefined || tag && nodeName( context, tag ) ) {
- return jQuery.merge( [ context ], ret );
- }
-
- return ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- dataPriv.set(
- elems[ i ],
- "globalEval",
- !refElements || dataPriv.get( refElements[ i ], "globalEval" )
- );
- }
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
- var elem, tmp, tag, wrap, attached, j,
- fragment = context.createDocumentFragment(),
- nodes = [],
- i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( toType( elem ) === "object" ) {
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
-
- // Convert html into DOM nodes
- } else {
- tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
- // Descend through wrappers to the right content
- j = wrap[ 0 ];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, tmp.childNodes );
-
- // Remember the top-level container
- tmp = fragment.firstChild;
-
- // Ensure the created nodes are orphaned (#12392)
- tmp.textContent = "";
- }
- }
- }
-
- // Remove wrapper from fragment
- fragment.textContent = "";
-
- i = 0;
- while ( ( elem = nodes[ i++ ] ) ) {
-
- // Skip elements already in the context collection (trac-4087)
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
- if ( ignored ) {
- ignored.push( elem );
- }
- continue;
- }
-
- attached = isAttached( elem );
-
- // Append to fragment
- tmp = getAll( fragment.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( attached ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( ( elem = tmp[ j++ ] ) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- return fragment;
-}
-
-
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-// Support: IE <=9 - 11+
-// focus() and blur() are asynchronous, except when they are no-op.
-// So expect focus to be synchronous when the element is already active,
-// and blur to be synchronous when the element is not already active.
-// (focus and blur are always synchronous in other supported browsers,
-// this just defines when we can count on it).
-function expectSync( elem, type ) {
- return ( elem === safeActiveElement() ) === ( type === "focus" );
-}
-
-// Support: IE <=9 only
-// Accessing document.activeElement can throw unexpectedly
-// https://bugs.jquery.com/ticket/13393
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
-
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
-
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- on( elem, type, selector, data, types[ type ], one );
- }
- return elem;
- }
-
- if ( data == null && fn == null ) {
-
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
-
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
-
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return elem;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
-
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
-
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return elem.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- global: {},
-
- add: function( elem, types, handler, data, selector ) {
-
- var handleObjIn, eventHandle, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.get( elem );
-
- // Only attach events to objects that accept data
- if ( !acceptData( elem ) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Ensure that invalid selectors throw exceptions at attach time
- // Evaluate against documentElement in case elem is a non-element node (e.g., document)
- if ( selector ) {
- jQuery.find.matchesSelector( documentElement, selector );
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- if ( !( events = elemData.events ) ) {
- events = elemData.events = Object.create( null );
- }
- if ( !( eventHandle = elemData.handle ) ) {
- eventHandle = elemData.handle = function( e ) {
-
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
- jQuery.event.dispatch.apply( elem, arguments ) : undefined;
- };
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // There *must* be a type, no attaching namespace-only handlers
- if ( !type ) {
- continue;
- }
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
- type: type,
- origType: origType,
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join( "." )
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- if ( !( handlers = events[ type ] ) ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener if the special events handler returns false
- if ( !special.setup ||
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var j, origCount, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
- if ( !elemData || !( events = elemData.events ) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- handlers = events[ type ] || [];
- tmp = tmp[ 2 ] &&
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
- // Remove matching events
- origCount = j = handlers.length;
- while ( j-- ) {
- handleObj = handlers[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector ||
- selector === "**" && handleObj.selector ) ) {
- handlers.splice( j, 1 );
-
- if ( handleObj.selector ) {
- handlers.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( origCount && !handlers.length ) {
- if ( !special.teardown ||
- special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove data and the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- dataPriv.remove( elem, "handle events" );
- }
- },
-
- dispatch: function( nativeEvent ) {
-
- var i, j, ret, matched, handleObj, handlerQueue,
- args = new Array( arguments.length ),
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( nativeEvent ),
-
- handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
- special = jQuery.event.special[ event.type ] || {};
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[ 0 ] = event;
-
- for ( i = 1; i < arguments.length; i++ ) {
- args[ i ] = arguments[ i ];
- }
-
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
- // Run delegates first; they may want to stop propagation beneath us
- i = 0;
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
- event.currentTarget = matched.elem;
-
- j = 0;
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
- !event.isImmediatePropagationStopped() ) {
-
- // If the event is namespaced, then each handler is only invoked if it is
- // specially universal or its namespaces are a superset of the event's.
- if ( !event.rnamespace || handleObj.namespace === false ||
- event.rnamespace.test( handleObj.namespace ) ) {
-
- event.handleObj = handleObj;
- event.data = handleObj.data;
-
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
- handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- if ( ( event.result = ret ) === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- handlers: function( event, handlers ) {
- var i, handleObj, sel, matchedHandlers, matchedSelectors,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Find delegate handlers
- if ( delegateCount &&
-
- // Support: IE <=9
- // Black-hole SVG <use> instance trees (trac-13180)
- cur.nodeType &&
-
- // Support: Firefox <=42
- // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
- // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
- // Support: IE 11 only
- // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
- !( event.type === "click" && event.button >= 1 ) ) {
-
- for ( ; cur !== this; cur = cur.parentNode || this ) {
-
- // Don't check non-elements (#13208)
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
- matchedHandlers = [];
- matchedSelectors = {};
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
-
- // Don't conflict with Object.prototype properties (#13203)
- sel = handleObj.selector + " ";
-
- if ( matchedSelectors[ sel ] === undefined ) {
- matchedSelectors[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) > -1 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( matchedSelectors[ sel ] ) {
- matchedHandlers.push( handleObj );
- }
- }
- if ( matchedHandlers.length ) {
- handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- cur = this;
- if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
- }
-
- return handlerQueue;
- },
-
- addProp: function( name, hook ) {
- Object.defineProperty( jQuery.Event.prototype, name, {
- enumerable: true,
- configurable: true,
-
- get: isFunction( hook ) ?
- function() {
- if ( this.originalEvent ) {
- return hook( this.originalEvent );
- }
- } :
- function() {
- if ( this.originalEvent ) {
- return this.originalEvent[ name ];
- }
- },
-
- set: function( value ) {
- Object.defineProperty( this, name, {
- enumerable: true,
- configurable: true,
- writable: true,
- value: value
- } );
- }
- } );
- },
-
- fix: function( originalEvent ) {
- return originalEvent[ jQuery.expando ] ?
- originalEvent :
- new jQuery.Event( originalEvent );
- },
-
- special: {
- load: {
-
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
- click: {
-
- // Utilize native event to ensure correct state for checkable inputs
- setup: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Claim the first handler
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- // dataPriv.set( el, "click", ... )
- leverageNative( el, "click", returnTrue );
- }
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Force setup before triggering a click
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- leverageNative( el, "click" );
- }
-
- // Return non-false to allow normal event-path propagation
- return true;
- },
-
- // For cross-browser consistency, suppress native .click() on links
- // Also prevent it if we're currently inside a leveraged native-event stack
- _default: function( event ) {
- var target = event.target;
- return rcheckableType.test( target.type ) &&
- target.click && nodeName( target, "input" ) &&
- dataPriv.get( target, "click" ) ||
- nodeName( target, "a" );
- }
- },
-
- beforeunload: {
- postDispatch: function( event ) {
-
- // Support: Firefox 20+
- // Firefox doesn't alert if the returnValue field is not set.
- if ( event.result !== undefined && event.originalEvent ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- }
-};
-
-// Ensure the presence of an event listener that handles manually-triggered
-// synthetic events by interrupting progress until reinvoked in response to
-// *native* events that it fires directly, ensuring that state changes have
-// already occurred before other listeners are invoked.
-function leverageNative( el, type, expectSync ) {
-
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
- if ( !expectSync ) {
- if ( dataPriv.get( el, type ) === undefined ) {
- jQuery.event.add( el, type, returnTrue );
- }
- return;
- }
-
- // Register the controller as a special universal handler for all event namespaces
- dataPriv.set( el, type, false );
- jQuery.event.add( el, type, {
- namespace: false,
- handler: function( event ) {
- var notAsync, result,
- saved = dataPriv.get( this, type );
-
- if ( ( event.isTrigger & 1 ) && this[ type ] ) {
-
- // Interrupt processing of the outer synthetic .trigger()ed event
- // Saved data should be false in such cases, but might be a leftover capture object
- // from an async native handler (gh-4350)
- if ( !saved.length ) {
-
- // Store arguments for use when handling the inner native event
- // There will always be at least one argument (an event object), so this array
- // will not be confused with a leftover capture object.
- saved = slice.call( arguments );
- dataPriv.set( this, type, saved );
-
- // Trigger the native event and capture its result
- // Support: IE <=9 - 11+
- // focus() and blur() are asynchronous
- notAsync = expectSync( this, type );
- this[ type ]();
- result = dataPriv.get( this, type );
- if ( saved !== result || notAsync ) {
- dataPriv.set( this, type, false );
- } else {
- result = {};
- }
- if ( saved !== result ) {
-
- // Cancel the outer synthetic event
- event.stopImmediatePropagation();
- event.preventDefault();
- return result.value;
- }
-
- // If this is an inner synthetic event for an event with a bubbling surrogate
- // (focus or blur), assume that the surrogate already propagated from triggering the
- // native event and prevent that from happening again here.
- // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
- // bubbling surrogate propagates *after* the non-bubbling base), but that seems
- // less bad than duplication.
- } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
- event.stopPropagation();
- }
-
- // If this is a native event triggered above, everything is now in order
- // Fire an inner synthetic event with the original arguments
- } else if ( saved.length ) {
-
- // ...and capture the result
- dataPriv.set( this, type, {
- value: jQuery.event.trigger(
-
- // Support: IE <=9 - 11+
- // Extend with the prototype to reset the above stopImmediatePropagation()
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
- saved.slice( 1 ),
- this
- )
- } );
-
- // Abort handling of the native event
- event.stopImmediatePropagation();
- }
- }
- } );
-}
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle );
- }
-};
-
-jQuery.Event = function( src, props ) {
-
- // Allow instantiation without the 'new' keyword
- if ( !( this instanceof jQuery.Event ) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = src.defaultPrevented ||
- src.defaultPrevented === undefined &&
-
- // Support: Android <=2.3 only
- src.returnValue === false ?
- returnTrue :
- returnFalse;
-
- // Create target properties
- // Support: Safari <=6 - 7 only
- // Target should not be a text node (#504, #13143)
- this.target = ( src.target && src.target.nodeType === 3 ) ?
- src.target.parentNode :
- src.target;
-
- this.currentTarget = src.currentTarget;
- this.relatedTarget = src.relatedTarget;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || Date.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- constructor: jQuery.Event,
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
- isSimulated: false,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.preventDefault();
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.stopPropagation();
- }
- },
- stopImmediatePropagation: function() {
- var e = this.originalEvent;
-
- this.isImmediatePropagationStopped = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.stopImmediatePropagation();
- }
-
- this.stopPropagation();
- }
-};
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
- altKey: true,
- bubbles: true,
- cancelable: true,
- changedTouches: true,
- ctrlKey: true,
- detail: true,
- eventPhase: true,
- metaKey: true,
- pageX: true,
- pageY: true,
- shiftKey: true,
- view: true,
- "char": true,
- code: true,
- charCode: true,
- key: true,
- keyCode: true,
- button: true,
- buttons: true,
- clientX: true,
- clientY: true,
- offsetX: true,
- offsetY: true,
- pointerId: true,
- pointerType: true,
- screenX: true,
- screenY: true,
- targetTouches: true,
- toElement: true,
- touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
-}, jQuery.event.addProp );
-
-jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
- jQuery.event.special[ type ] = {
-
- // Utilize native event if possible so blur/focus sequence is correct
- setup: function() {
-
- // Claim the first handler
- // dataPriv.set( this, "focus", ... )
- // dataPriv.set( this, "blur", ... )
- leverageNative( this, type, expectSync );
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function() {
-
- // Force setup before trigger
- leverageNative( this, type );
-
- // Return non-false to allow normal event-path propagation
- return true;
- },
-
- delegateType: delegateType
- };
-} );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
- mouseenter: "mouseover",
- mouseleave: "mouseout",
- pointerenter: "pointerover",
- pointerleave: "pointerout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj;
-
- // For mouseenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-} );
-
-jQuery.fn.extend( {
-
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
- },
- one: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
-
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ?
- handleObj.origType + "." + handleObj.namespace :
- handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
-
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
-
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function() {
- jQuery.event.remove( this, types, fn, selector );
- } );
- }
-} );
-
-
-var
-
- // Support: IE <=10 - 11, Edge 12 - 13 only
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /<script|<style|<link/i,
-
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Prefer a tbody over its parent table for containing new rows
-function manipulationTarget( elem, content ) {
- if ( nodeName( elem, "table" ) &&
- nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
- return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
- }
-
- return elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
- elem.type = elem.type.slice( 5 );
- } else {
- elem.removeAttribute( "type" );
- }
-
- return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, udataOld, udataCur, events;
-
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // 1. Copy private data: events, handlers, etc.
- if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.get( src );
- events = pdataOld.events;
-
- if ( events ) {
- dataPriv.remove( dest, "handle events" );
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
- }
-
- // 2. Copy user data
- if ( dataUser.hasData( src ) ) {
- udataOld = dataUser.access( src );
- udataCur = jQuery.extend( {}, udataOld );
-
- dataUser.set( dest, udataCur );
- }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
- var nodeName = dest.nodeName.toLowerCase();
-
- // Fails to persist the checked state of a cloned checkbox or radio button.
- if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- dest.checked = src.checked;
-
- // Fails to return the selected option to the default selected state when cloning options
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
- // Flatten any nested arrays
- args = flat( args );
-
- var fragment, first, scripts, hasScripts, node, doc,
- i = 0,
- l = collection.length,
- iNoClone = l - 1,
- value = args[ 0 ],
- valueIsFunction = isFunction( value );
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( valueIsFunction ||
- ( l > 1 && typeof value === "string" &&
- !support.checkClone && rchecked.test( value ) ) ) {
- return collection.each( function( index ) {
- var self = collection.eq( index );
- if ( valueIsFunction ) {
- args[ 0 ] = value.call( this, index, self.html() );
- }
- domManip( self, args, callback, ignored );
- } );
- }
-
- if ( l ) {
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- // Require either new content or an interest in ignored elements to invoke the callback
- if ( first || ignored ) {
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
- hasScripts = scripts.length;
-
- // Use the original fragment for the last item
- // instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- for ( ; i < l; i++ ) {
- node = fragment;
-
- if ( i !== iNoClone ) {
- node = jQuery.clone( node, true, true );
-
- // Keep references to cloned scripts for later restoration
- if ( hasScripts ) {
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( collection[ i ], node, i );
- }
-
- if ( hasScripts ) {
- doc = scripts[ scripts.length - 1 ].ownerDocument;
-
- // Reenable scripts
- jQuery.map( scripts, restoreScript );
-
- // Evaluate executable scripts on first document insertion
- for ( i = 0; i < hasScripts; i++ ) {
- node = scripts[ i ];
- if ( rscriptType.test( node.type || "" ) &&
- !dataPriv.access( node, "globalEval" ) &&
- jQuery.contains( doc, node ) ) {
-
- if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
-
- // Optional AJAX dependency, but won't run scripts if not present
- if ( jQuery._evalUrl && !node.noModule ) {
- jQuery._evalUrl( node.src, {
- nonce: node.nonce || node.getAttribute( "nonce" )
- }, doc );
- }
- } else {
- DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
- }
- }
- }
- }
- }
- }
-
- return collection;
-}
-
-function remove( elem, selector, keepData ) {
- var node,
- nodes = selector ? jQuery.filter( selector, elem ) : elem,
- i = 0;
-
- for ( ; ( node = nodes[ i ] ) != null; i++ ) {
- if ( !keepData && node.nodeType === 1 ) {
- jQuery.cleanData( getAll( node ) );
- }
-
- if ( node.parentNode ) {
- if ( keepData && isAttached( node ) ) {
- setGlobalEval( getAll( node, "script" ) );
- }
- node.parentNode.removeChild( node );
- }
- }
-
- return elem;
-}
-
-jQuery.extend( {
- htmlPrefilter: function( html ) {
- return html;
- },
-
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var i, l, srcElements, destElements,
- clone = elem.cloneNode( true ),
- inPage = isAttached( elem );
-
- // Fix IE cloning issues
- if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
- !jQuery.isXMLDoc( elem ) ) {
-
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- fixInput( srcElements[ i ], destElements[ i ] );
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- cloneCopyEvent( srcElements[ i ], destElements[ i ] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- // Return the cloned set
- return clone;
- },
-
- cleanData: function( elems ) {
- var data, elem, type,
- special = jQuery.event.special,
- i = 0;
-
- for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
- if ( acceptData( elem ) ) {
- if ( ( data = elem[ dataPriv.expando ] ) ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Support: Chrome <=35 - 45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataPriv.expando ] = undefined;
- }
- if ( elem[ dataUser.expando ] ) {
-
- // Support: Chrome <=35 - 45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataUser.expando ] = undefined;
- }
- }
- }
- }
-} );
-
-jQuery.fn.extend( {
- detach: function( selector ) {
- return remove( this, selector, true );
- },
-
- remove: function( selector ) {
- return remove( this, selector );
- },
-
- text: function( value ) {
- return access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().each( function() {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- this.textContent = value;
- }
- } );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- } );
- },
-
- prepend: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.insertBefore( elem, target.firstChild );
- }
- } );
- },
-
- before: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- } );
- },
-
- after: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- } );
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
- if ( elem.nodeType === 1 ) {
-
- // Prevent memory leaks
- jQuery.cleanData( getAll( elem, false ) );
-
- // Remove any remaining nodes
- elem.textContent = "";
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function() {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- } );
- },
-
- html: function( value ) {
- return access( this, function( value ) {
- var elem = this[ 0 ] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined && elem.nodeType === 1 ) {
- return elem.innerHTML;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
- value = jQuery.htmlPrefilter( value );
-
- try {
- for ( ; i < l; i++ ) {
- elem = this[ i ] || {};
-
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch ( e ) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function() {
- var ignored = [];
-
- // Make the changes, replacing each non-ignored context element with the new content
- return domManip( this, arguments, function( elem ) {
- var parent = this.parentNode;
-
- if ( jQuery.inArray( this, ignored ) < 0 ) {
- jQuery.cleanData( getAll( this ) );
- if ( parent ) {
- parent.replaceChild( elem, this );
- }
- }
-
- // Force callback invocation
- }, ignored );
- }
-} );
-
-jQuery.each( {
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1,
- i = 0;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone( true );
- jQuery( insert[ i ] )[ original ]( elems );
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // .get() because push.apply(_, arraylike) throws on ancient WebKit
- push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-} );
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
- // IE throws on elements created in popups
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
- var view = elem.ownerDocument.defaultView;
-
- if ( !view || !view.opener ) {
- view = window;
- }
-
- return view.getComputedStyle( elem );
- };
-
-var swap = function( elem, options, callback ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
-};
-
-
-var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
-
-
-
-( function() {
-
- // Executing both pixelPosition & boxSizingReliable tests require only one layout
- // so they're executed at the same time to save the second computation.
- function computeStyleTests() {
-
- // This is a singleton, we need to execute it only once
- if ( !div ) {
- return;
- }
-
- container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
- "margin-top:1px;padding:0;border:0";
- div.style.cssText =
- "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
- "margin:auto;border:1px;padding:1px;" +
- "width:60%;top:1%";
- documentElement.appendChild( container ).appendChild( div );
-
- var divStyle = window.getComputedStyle( div );
- pixelPositionVal = divStyle.top !== "1%";
-
- // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
- reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
-
- // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
- // Some styles come back with percentage values, even though they shouldn't
- div.style.right = "60%";
- pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
-
- // Support: IE 9 - 11 only
- // Detect misreporting of content dimensions for box-sizing:border-box elements
- boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
-
- // Support: IE 9 only
- // Detect overflow:scroll screwiness (gh-3699)
- // Support: Chrome <=64
- // Don't get tricked when zoom affects offsetWidth (gh-4029)
- div.style.position = "absolute";
- scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
-
- documentElement.removeChild( container );
-
- // Nullify the div so it wouldn't be stored in the memory and
- // it will also be a sign that checks already performed
- div = null;
- }
-
- function roundPixelMeasures( measure ) {
- return Math.round( parseFloat( measure ) );
- }
-
- var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
- reliableTrDimensionsVal, reliableMarginLeftVal,
- container = document.createElement( "div" ),
- div = document.createElement( "div" );
-
- // Finish early in limited (non-browser) environments
- if ( !div.style ) {
- return;
- }
-
- // Support: IE <=9 - 11 only
- // Style of cloned element affects source element cloned (#8908)
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- jQuery.extend( support, {
- boxSizingReliable: function() {
- computeStyleTests();
- return boxSizingReliableVal;
- },
- pixelBoxStyles: function() {
- computeStyleTests();
- return pixelBoxStylesVal;
- },
- pixelPosition: function() {
- computeStyleTests();
- return pixelPositionVal;
- },
- reliableMarginLeft: function() {
- computeStyleTests();
- return reliableMarginLeftVal;
- },
- scrollboxSize: function() {
- computeStyleTests();
- return scrollboxSizeVal;
- },
-
- // Support: IE 9 - 11+, Edge 15 - 18+
- // IE/Edge misreport `getComputedStyle` of table rows with width/height
- // set in CSS while `offset*` properties report correct values.
- // Behavior in IE 9 is more subtle than in newer versions & it passes
- // some versions of this test; make sure not to make it pass there!
- reliableTrDimensions: function() {
- var table, tr, trChild, trStyle;
- if ( reliableTrDimensionsVal == null ) {
- table = document.createElement( "table" );
- tr = document.createElement( "tr" );
- trChild = document.createElement( "div" );
-
- table.style.cssText = "position:absolute;left:-11111px";
- tr.style.height = "1px";
- trChild.style.height = "9px";
-
- documentElement
- .appendChild( table )
- .appendChild( tr )
- .appendChild( trChild );
-
- trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
-
- documentElement.removeChild( table );
- }
- return reliableTrDimensionsVal;
- }
- } );
-} )();
-
-
-function curCSS( elem, name, computed ) {
- var width, minWidth, maxWidth, ret,
-
- // Support: Firefox 51+
- // Retrieving style before computed somehow
- // fixes an issue with getting wrong values
- // on detached elements
- style = elem.style;
-
- computed = computed || getStyles( elem );
-
- // getPropertyValue is needed for:
- // .css('filter') (IE 9 only, #12537)
- // .css('--customProperty) (#3144)
- if ( computed ) {
- ret = computed.getPropertyValue( name ) || computed[ name ];
-
- if ( ret === "" && !isAttached( elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Android Browser returns percentage for some values,
- // but width seems to be reliably pixels.
- // This is against the CSSOM draft spec:
- // https://drafts.csswg.org/cssom/#resolved-values
- if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
-
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- return ret !== undefined ?
-
- // Support: IE <=9 - 11 only
- // IE returns zIndex value as an integer.
- ret + "" :
- ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
- // Define the hook, we'll check on the first run if it's really needed.
- return {
- get: function() {
- if ( conditionFn() ) {
-
- // Hook not needed (or it's not possible to use it due
- // to missing dependency), remove it.
- delete this.get;
- return;
- }
-
- // Hook needed; redefine it so that the support test is not executed again.
- return ( this.get = hookFn ).apply( this, arguments );
- }
- };
-}
-
-
-var cssPrefixes = [ "Webkit", "Moz", "ms" ],
- emptyStyle = document.createElement( "div" ).style,
- vendorProps = {};
-
-// Return a vendor-prefixed property or undefined
-function vendorPropName( name ) {
-
- // Check for vendor prefixed names
- var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in emptyStyle ) {
- return name;
- }
- }
-}
-
-// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
-function finalPropName( name ) {
- var final = jQuery.cssProps[ name ] || vendorProps[ name ];
-
- if ( final ) {
- return final;
- }
- if ( name in emptyStyle ) {
- return name;
- }
- return vendorProps[ name ] = vendorPropName( name ) || name;
-}
-
-
-var
-
- // Swappable if display is none or starts with table
- // except "table", "table-cell", or "table-caption"
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rcustomProp = /^--/,
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: "0",
- fontWeight: "400"
- };
-
-function setPositiveNumber( _elem, value, subtract ) {
-
- // Any relative (+/-) values have already been
- // normalized at this point
- var matches = rcssNum.exec( value );
- return matches ?
-
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
- value;
-}
-
-function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
- var i = dimension === "width" ? 1 : 0,
- extra = 0,
- delta = 0;
-
- // Adjustment may not be necessary
- if ( box === ( isBorderBox ? "border" : "content" ) ) {
- return 0;
- }
-
- for ( ; i < 4; i += 2 ) {
-
- // Both box models exclude margin
- if ( box === "margin" ) {
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
- }
-
- // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
- if ( !isBorderBox ) {
-
- // Add padding
- delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
- // For "border" or "margin", add border
- if ( box !== "padding" ) {
- delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-
- // But still keep track of it otherwise
- } else {
- extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
-
- // If we get here with a border-box (content + padding + border), we're seeking "content" or
- // "padding" or "margin"
- } else {
-
- // For "content", subtract padding
- if ( box === "content" ) {
- delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
- }
-
- // For "content" or "padding", subtract border
- if ( box !== "margin" ) {
- delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- }
- }
-
- // Account for positive content-box scroll gutter when requested by providing computedVal
- if ( !isBorderBox && computedVal >= 0 ) {
-
- // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
- // Assuming integer scroll gutter, subtract the rest and round down
- delta += Math.max( 0, Math.ceil(
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
- computedVal -
- delta -
- extra -
- 0.5
-
- // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
- // Use an explicit zero to avoid NaN (gh-3964)
- ) ) || 0;
- }
-
- return delta;
-}
-
-function getWidthOrHeight( elem, dimension, extra ) {
-
- // Start with computed style
- var styles = getStyles( elem ),
-
- // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
- // Fake content-box until we know it's needed to know the true value.
- boxSizingNeeded = !support.boxSizingReliable() || extra,
- isBorderBox = boxSizingNeeded &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- valueIsBorderBox = isBorderBox,
-
- val = curCSS( elem, dimension, styles ),
- offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
-
- // Support: Firefox <=54
- // Return a confounding non-pixel value or feign ignorance, as appropriate.
- if ( rnumnonpx.test( val ) ) {
- if ( !extra ) {
- return val;
- }
- val = "auto";
- }
-
-
- // Support: IE 9 - 11 only
- // Use offsetWidth/offsetHeight for when box sizing is unreliable.
- // In those cases, the computed value can be trusted to be border-box.
- if ( ( !support.boxSizingReliable() && isBorderBox ||
-
- // Support: IE 10 - 11+, Edge 15 - 18+
- // IE/Edge misreport `getComputedStyle` of table rows with width/height
- // set in CSS while `offset*` properties report correct values.
- // Interestingly, in some cases IE 9 doesn't suffer from this issue.
- !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
-
- // Fall back to offsetWidth/offsetHeight when value is "auto"
- // This happens for inline elements with no explicit setting (gh-3571)
- val === "auto" ||
-
- // Support: Android <=4.1 - 4.3 only
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
- !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
-
- // Make sure the element is visible & connected
- elem.getClientRects().length ) {
-
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // Where available, offsetWidth/offsetHeight approximate border box dimensions.
- // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
- // retrieved value as a content box dimension.
- valueIsBorderBox = offsetProp in elem;
- if ( valueIsBorderBox ) {
- val = elem[ offsetProp ];
- }
- }
-
- // Normalize "" and auto
- val = parseFloat( val ) || 0;
-
- // Adjust for the element's box model
- return ( val +
- boxModelAdjustment(
- elem,
- dimension,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles,
-
- // Provide the current computed size to request scroll gutter calculation (gh-3589)
- val
- )
- ) + "px";
-}
-
-jQuery.extend( {
-
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
-
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
- }
- }
- }
- },
-
- // Don't automatically add "px" to these possibly-unitless properties
- cssNumber: {
- "animationIterationCount": true,
- "columnCount": true,
- "fillOpacity": true,
- "flexGrow": true,
- "flexShrink": true,
- "fontWeight": true,
- "gridArea": true,
- "gridColumn": true,
- "gridColumnEnd": true,
- "gridColumnStart": true,
- "gridRow": true,
- "gridRowEnd": true,
- "gridRowStart": true,
- "lineHeight": true,
- "opacity": true,
- "order": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {},
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
-
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = camelCase( name ),
- isCustomProp = rcustomProp.test( name ),
- style = elem.style;
-
- // Make sure that we're working with the right name. We don't
- // want to query the value if it is a CSS custom property
- // since they are user-defined.
- if ( !isCustomProp ) {
- name = finalPropName( origName );
- }
-
- // Gets hook for the prefixed version, then unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Convert "+=" or "-=" to relative numbers (#7345)
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
- value = adjustCSS( elem, name, ret );
-
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that null and NaN values aren't set (#7116)
- if ( value == null || value !== value ) {
- return;
- }
-
- // If a number was passed in, add the unit (except for certain CSS properties)
- // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
- // "px" to a few hardcoded values.
- if ( type === "number" && !isCustomProp ) {
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
- }
-
- // background-* props affect original clone's values
- if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
- style[ name ] = "inherit";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !( "set" in hooks ) ||
- ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
- if ( isCustomProp ) {
- style.setProperty( name, value );
- } else {
- style[ name ] = value;
- }
- }
-
- } else {
-
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks &&
- ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra, styles ) {
- var val, num, hooks,
- origName = camelCase( name ),
- isCustomProp = rcustomProp.test( name );
-
- // Make sure that we're working with the right name. We don't
- // want to modify the value if it is a CSS custom property
- // since they are user-defined.
- if ( !isCustomProp ) {
- name = finalPropName( origName );
- }
-
- // Try prefixed name followed by the unprefixed name
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name, styles );
- }
-
- // Convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Make numeric if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || isFinite( num ) ? num || 0 : val;
- }
-
- return val;
- }
-} );
-
-jQuery.each( [ "height", "width" ], function( _i, dimension ) {
- jQuery.cssHooks[ dimension ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
-
- // Certain elements can have dimension info if we invisibly show them
- // but it must have a current display style that would benefit
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
- // Support: Safari 8+
- // Table columns in Safari have non-zero offsetWidth & zero
- // getBoundingClientRect().width unless display is changed.
- // Support: IE <=11 only
- // Running getBoundingClientRect on a disconnected node
- // in IE throws an error.
- ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var matches,
- styles = getStyles( elem ),
-
- // Only read styles.position if the test has a chance to fail
- // to avoid forcing a reflow.
- scrollboxSizeBuggy = !support.scrollboxSize() &&
- styles.position === "absolute",
-
- // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
- boxSizingNeeded = scrollboxSizeBuggy || extra,
- isBorderBox = boxSizingNeeded &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- subtract = extra ?
- boxModelAdjustment(
- elem,
- dimension,
- extra,
- isBorderBox,
- styles
- ) :
- 0;
-
- // Account for unreliable border-box dimensions by comparing offset* to computed and
- // faking a content-box to get border and padding (gh-3699)
- if ( isBorderBox && scrollboxSizeBuggy ) {
- subtract -= Math.ceil(
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
- parseFloat( styles[ dimension ] ) -
- boxModelAdjustment( elem, dimension, "border", false, styles ) -
- 0.5
- );
- }
-
- // Convert to pixels if value adjustment is needed
- if ( subtract && ( matches = rcssNum.exec( value ) ) &&
- ( matches[ 3 ] || "px" ) !== "px" ) {
-
- elem.style[ dimension ] = value;
- value = jQuery.css( elem, dimension );
- }
-
- return setPositiveNumber( elem, value, subtract );
- }
- };
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
- function( elem, computed ) {
- if ( computed ) {
- return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
- elem.getBoundingClientRect().left -
- swap( elem, { marginLeft: 0 }, function() {
- return elem.getBoundingClientRect().left;
- } )
- ) + "px";
- }
- }
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
-
- // Assumes a single number if not a string
- parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( prefix !== "margin" ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-} );
-
-jQuery.fn.extend( {
- css: function( name, value ) {
- return access( this, function( elem, name, value ) {
- var styles, len,
- map = {},
- i = 0;
-
- if ( Array.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- }
-} );
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = window.setTimeout( next, time );
- hooks.stop = function() {
- window.clearTimeout( timeout );
- };
- } );
-};
-
-
-( function() {
- var input = document.createElement( "input" ),
- select = document.createElement( "select" ),
- opt = select.appendChild( document.createElement( "option" ) );
-
- input.type = "checkbox";
-
- // Support: Android <=4.3 only
- // Default value for a checkbox should be "on"
- support.checkOn = input.value !== "";
-
- // Support: IE <=11 only
- // Must access selectedIndex to make default options select
- support.optSelected = opt.selected;
-
- // Support: IE <=11 only
- // An input loses its value after becoming a radio
- input = document.createElement( "input" );
- input.value = "t";
- input.type = "radio";
- support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
- attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
- attr: function( name, value ) {
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each( function() {
- jQuery.removeAttr( this, name );
- } );
- }
-} );
-
-jQuery.extend( {
- attr: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set attributes on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- // Attribute hooks are determined by the lowercase version
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
- }
-
- if ( value !== undefined ) {
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
- }
-
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ? undefined : ret;
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !support.radioValue && value === "radio" &&
- nodeName( elem, "input" ) ) {
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- removeAttr: function( elem, value ) {
- var name,
- i = 0,
-
- // Attribute names can contain non-HTML whitespace characters
- // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
- attrNames = value && value.match( rnothtmlwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( ( name = attrNames[ i++ ] ) ) {
- elem.removeAttribute( name );
- }
- }
- }
-} );
-
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
-
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- elem.setAttribute( name, name );
- }
- return name;
- }
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
- var getter = attrHandle[ name ] || jQuery.find.attr;
-
- attrHandle[ name ] = function( elem, name, isXML ) {
- var ret, handle,
- lowercaseName = name.toLowerCase();
-
- if ( !isXML ) {
-
- // Avoid an infinite loop by temporarily removing this function from the getter
- handle = attrHandle[ lowercaseName ];
- attrHandle[ lowercaseName ] = ret;
- ret = getter( elem, name, isXML ) != null ?
- lowercaseName :
- null;
- attrHandle[ lowercaseName ] = handle;
- }
- return ret;
- };
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
- rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
- prop: function( name, value ) {
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- return this.each( function() {
- delete this[ jQuery.propFix[ name ] || name ];
- } );
- }
-} );
-
-jQuery.extend( {
- prop: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set properties on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- return ( elem[ name ] = value );
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- return elem[ name ];
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
-
- // Support: IE <=9 - 11 only
- // elem.tabIndex doesn't always return the
- // correct value when it hasn't been explicitly set
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- if ( tabindex ) {
- return parseInt( tabindex, 10 );
- }
-
- if (
- rfocusable.test( elem.nodeName ) ||
- rclickable.test( elem.nodeName ) &&
- elem.href
- ) {
- return 0;
- }
-
- return -1;
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- }
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-// eslint rule "no-unused-expressions" is disabled for this code
-// since it considers such accessions noop
-if ( !support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
-
- /* eslint no-unused-expressions: "off" */
-
- var parent = elem.parentNode;
- if ( parent && parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- return null;
- },
- set: function( elem ) {
-
- /* eslint no-unused-expressions: "off" */
-
- var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
-
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- };
-}
-
-jQuery.each( [
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
- // Strip and collapse whitespace according to HTML spec
- // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
- function stripAndCollapse( value ) {
- var tokens = value.match( rnothtmlwhite ) || [];
- return tokens.join( " " );
- }
-
-
-function getClass( elem ) {
- return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-function classesToArray( value ) {
- if ( Array.isArray( value ) ) {
- return value;
- }
- if ( typeof value === "string" ) {
- return value.match( rnothtmlwhite ) || [];
- }
- return [];
-}
-
-jQuery.fn.extend( {
- addClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- classes = classesToArray( value );
-
- if ( classes.length ) {
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = stripAndCollapse( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( !arguments.length ) {
- return this.attr( "class", "" );
- }
-
- classes = classesToArray( value );
-
- if ( classes.length ) {
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
-
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
-
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = stripAndCollapse( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isValidValue = type === "string" || Array.isArray( value );
-
- if ( typeof stateVal === "boolean" && isValidValue ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( isFunction( value ) ) {
- return this.each( function( i ) {
- jQuery( this ).toggleClass(
- value.call( this, i, getClass( this ), stateVal ),
- stateVal
- );
- } );
- }
-
- return this.each( function() {
- var className, i, self, classNames;
-
- if ( isValidValue ) {
-
- // Toggle individual class names
- i = 0;
- self = jQuery( this );
- classNames = classesToArray( value );
-
- while ( ( className = classNames[ i++ ] ) ) {
-
- // Check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( value === undefined || type === "boolean" ) {
- className = getClass( this );
- if ( className ) {
-
- // Store className if set
- dataPriv.set( this, "__className__", className );
- }
-
- // If the element has a class name or if we're passed `false`,
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- if ( this.setAttribute ) {
- this.setAttribute( "class",
- className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
- );
- }
- }
- } );
- },
-
- hasClass: function( selector ) {
- var className, elem,
- i = 0;
-
- className = " " + selector + " ";
- while ( ( elem = this[ i++ ] ) ) {
- if ( elem.nodeType === 1 &&
- ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- }
-} );
-
-
-
-
-var rreturn = /\r/g;
-
-jQuery.fn.extend( {
- val: function( value ) {
- var hooks, ret, valueIsFunction,
- elem = this[ 0 ];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] ||
- jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks &&
- "get" in hooks &&
- ( ret = hooks.get( elem, "value" ) ) !== undefined
- ) {
- return ret;
- }
-
- ret = elem.value;
-
- // Handle most common string cases
- if ( typeof ret === "string" ) {
- return ret.replace( rreturn, "" );
- }
-
- // Handle cases where value is null/undef or number
- return ret == null ? "" : ret;
- }
-
- return;
- }
-
- valueIsFunction = isFunction( value );
-
- return this.each( function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( valueIsFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
-
- } else if ( typeof val === "number" ) {
- val += "";
-
- } else if ( Array.isArray( val ) ) {
- val = jQuery.map( val, function( value ) {
- return value == null ? "" : value + "";
- } );
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- } );
- }
-} );
-
-jQuery.extend( {
- valHooks: {
- option: {
- get: function( elem ) {
-
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
-
- // Support: IE <=10 - 11 only
- // option.text throws exceptions (#14686, #14858)
- // Strip and collapse whitespace
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- stripAndCollapse( jQuery.text( elem ) );
- }
- },
- select: {
- get: function( elem ) {
- var value, option, i,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one",
- values = one ? null : [],
- max = one ? index + 1 : options.length;
-
- if ( index < 0 ) {
- i = max;
-
- } else {
- i = one ? index : 0;
- }
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Support: IE <=9 only
- // IE8-9 doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
-
- // Don't return options that are disabled or in a disabled optgroup
- !option.disabled &&
- ( !option.parentNode.disabled ||
- !nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
-
- /* eslint-disable no-cond-assign */
-
- if ( option.selected =
- jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
- ) {
- optionSet = true;
- }
-
- /* eslint-enable no-cond-assign */
- }
-
- // Force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- }
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( Array.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
- }
- }
- };
- if ( !support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- };
- }
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-support.focusin = "onfocusin" in window;
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- stopPropagationCallback = function( e ) {
- e.stopPropagation();
- };
-
-jQuery.extend( jQuery.event, {
-
- trigger: function( event, data, elem, onlyHandlers ) {
-
- var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
- eventPath = [ elem || document ],
- type = hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
- cur = lastElement = tmp = elem = elem || document;
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "." ) > -1 ) {
-
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split( "." );
- type = namespaces.shift();
- namespaces.sort();
- }
- ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
- event = event[ jQuery.expando ] ?
- event :
- new jQuery.Event( type, typeof event === "object" && event );
-
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
- event.isTrigger = onlyHandlers ? 2 : 3;
- event.namespace = namespaces.join( "." );
- event.rnamespace = event.namespace ?
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
- null;
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data == null ?
- [ event ] :
- jQuery.makeArray( data, [ event ] );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- if ( !rfocusMorph.test( bubbleType + type ) ) {
- cur = cur.parentNode;
- }
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( cur );
- tmp = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( tmp === ( elem.ownerDocument || document ) ) {
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
- }
- }
-
- // Fire handlers on the event path
- i = 0;
- while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
- lastElement = cur;
- event.type = i > 1 ?
- bubbleType :
- special.bindType || type;
-
- // jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
- dataPriv.get( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && handle.apply && acceptData( cur ) ) {
- event.result = handle.apply( cur, data );
- if ( event.result === false ) {
- event.preventDefault();
- }
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( ( !special._default ||
- special._default.apply( eventPath.pop(), data ) === false ) &&
- acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name as the event.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- tmp = elem[ ontype ];
-
- if ( tmp ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
-
- if ( event.isPropagationStopped() ) {
- lastElement.addEventListener( type, stopPropagationCallback );
- }
-
- elem[ type ]();
-
- if ( event.isPropagationStopped() ) {
- lastElement.removeEventListener( type, stopPropagationCallback );
- }
-
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Piggyback on a donor event to simulate a different one
- // Used only for `focus(in | out)` events
- simulate: function( type, elem, event ) {
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true
- }
- );
-
- jQuery.event.trigger( e, null, elem );
- }
-
-} );
-
-jQuery.fn.extend( {
-
- trigger: function( type, data ) {
- return this.each( function() {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler: function( type, data ) {
- var elem = this[ 0 ];
- if ( elem ) {
- return jQuery.event.trigger( type, data, elem, true );
- }
- }
-} );
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler on the document while someone wants focusin/focusout
- var handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
-
- // Handle: regular nodes (via `this.ownerDocument`), window
- // (via `this.document`) & document (via `this`).
- var doc = this.ownerDocument || this.document || this,
- attaches = dataPriv.access( doc, fix );
-
- if ( !attaches ) {
- doc.addEventListener( orig, handler, true );
- }
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this.document || this,
- attaches = dataPriv.access( doc, fix ) - 1;
-
- if ( !attaches ) {
- doc.removeEventListener( orig, handler, true );
- dataPriv.remove( doc, fix );
-
- } else {
- dataPriv.access( doc, fix, attaches );
- }
- }
- };
- } );
-}
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
- var xml;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
-
- // Support: IE 9 - 11 only
- // IE throws on parseFromString with invalid input.
- try {
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
-
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
-};
-
-
-var
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( Array.isArray( obj ) ) {
-
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
-
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
-
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams(
- prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
- v,
- traditional,
- add
- );
- }
- } );
-
- } else if ( !traditional && toType( obj ) === "object" ) {
-
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
-
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, valueOrFunction ) {
-
- // If value is a function, invoke it and use its return value
- var value = isFunction( valueOrFunction ) ?
- valueOrFunction() :
- valueOrFunction;
-
- s[ s.length ] = encodeURIComponent( key ) + "=" +
- encodeURIComponent( value == null ? "" : value );
- };
-
- if ( a == null ) {
- return "";
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- } );
-
- } else {
-
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" );
-};
-
-jQuery.fn.extend( {
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map( function() {
-
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
- var type = this.type;
-
- // Use .is( ":disabled" ) so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
- var val = jQuery( this ).val();
-
- if ( val == null ) {
- return null;
- }
-
- if ( Array.isArray( val ) ) {
- return jQuery.map( val, function( val ) {
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } );
- }
-
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ).get();
- }
-} );
-
-
-jQuery.fn.extend( {
- wrapAll: function( html ) {
- var wrap;
-
- if ( this[ 0 ] ) {
- if ( isFunction( html ) ) {
- html = html.call( this[ 0 ] );
- }
-
- // The elements to wrap the target around
- wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
- if ( this[ 0 ].parentNode ) {
- wrap.insertBefore( this[ 0 ] );
- }
-
- wrap.map( function() {
- var elem = this;
-
- while ( elem.firstElementChild ) {
- elem = elem.firstElementChild;
- }
-
- return elem;
- } ).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapInner( html.call( this, i ) );
- } );
- }
-
- return this.each( function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- } );
- },
-
- wrap: function( html ) {
- var htmlIsFunction = isFunction( html );
-
- return this.each( function( i ) {
- jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
- } );
- },
-
- unwrap: function( selector ) {
- this.parent( selector ).not( "body" ).each( function() {
- jQuery( this ).replaceWith( this.childNodes );
- } );
- return this;
- }
-} );
-
-
-jQuery.expr.pseudos.hidden = function( elem ) {
- return !jQuery.expr.pseudos.visible( elem );
-};
-jQuery.expr.pseudos.visible = function( elem ) {
- return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-};
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
- var body = document.implementation.createHTMLDocument( "" ).body;
- body.innerHTML = "<form></form><form></form>";
- return body.childNodes.length === 2;
-} )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
- if ( typeof data !== "string" ) {
- return [];
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
-
- var base, parsed, scripts;
-
- if ( !context ) {
-
- // Stop scripts or inline event handlers from being executed immediately
- // by using document.implementation
- if ( support.createHTMLDocument ) {
- context = document.implementation.createHTMLDocument( "" );
-
- // Set the base href for the created document
- // so any parsed elements with URLs
- // are based on the document's URL (gh-2965)
- base = context.createElement( "base" );
- base.href = document.location.href;
- context.head.appendChild( base );
- } else {
- context = document;
- }
- }
-
- parsed = rsingleTag.exec( data );
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[ 1 ] ) ];
- }
-
- parsed = buildFragment( [ data ], context, scripts );
-
- if ( scripts && scripts.length ) {
- jQuery( scripts ).remove();
- }
-
- return jQuery.merge( [], parsed.childNodes );
-};
-
-
-jQuery.offset = {
- setOffset: function( elem, options, i ) {
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
- position = jQuery.css( elem, "position" ),
- curElem = jQuery( elem ),
- props = {};
-
- // Set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- curOffset = curElem.offset();
- curCSSTop = jQuery.css( elem, "top" );
- curCSSLeft = jQuery.css( elem, "left" );
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
- // Need to be able to calculate position if either
- // top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
-
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( isFunction( options ) ) {
-
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
- options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
-
- } else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
- curElem.css( props );
- }
- }
-};
-
-jQuery.fn.extend( {
-
- // offset() relates an element's border box to the document origin
- offset: function( options ) {
-
- // Preserve chaining for setter
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each( function( i ) {
- jQuery.offset.setOffset( this, options, i );
- } );
- }
-
- var rect, win,
- elem = this[ 0 ];
-
- if ( !elem ) {
- return;
- }
-
- // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
- // Support: IE <=11 only
- // Running getBoundingClientRect on a
- // disconnected node in IE throws an error
- if ( !elem.getClientRects().length ) {
- return { top: 0, left: 0 };
- }
-
- // Get document-relative position by adding viewport scroll to viewport-relative gBCR
- rect = elem.getBoundingClientRect();
- win = elem.ownerDocument.defaultView;
- return {
- top: rect.top + win.pageYOffset,
- left: rect.left + win.pageXOffset
- };
- },
-
- // position() relates an element's margin box to its offset parent's padding box
- // This corresponds to the behavior of CSS absolute positioning
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset, doc,
- elem = this[ 0 ],
- parentOffset = { top: 0, left: 0 };
-
- // position:fixed elements are offset from the viewport, which itself always has zero offset
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
- // Assume position:fixed implies availability of getBoundingClientRect
- offset = elem.getBoundingClientRect();
-
- } else {
- offset = this.offset();
-
- // Account for the *real* offset parent, which can be the document or its root element
- // when a statically positioned element is identified
- doc = elem.ownerDocument;
- offsetParent = elem.offsetParent || doc.documentElement;
- while ( offsetParent &&
- ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
- jQuery.css( offsetParent, "position" ) === "static" ) {
-
- offsetParent = offsetParent.parentNode;
- }
- if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
-
- // Incorporate borders into its offset, since they are outside its content origin
- parentOffset = jQuery( offsetParent ).offset();
- parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
- }
- }
-
- // Subtract parent offsets and element margins
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
- };
- },
-
- // This method will return documentElement in the following cases:
- // 1) For the element inside the iframe without offsetParent, this method will return
- // documentElement of the parent window
- // 2) For the hidden or detached element
- // 3) For body or html element, i.e. in case of the html node - it will return itself
- //
- // but those exceptions were never presented as a real life use-cases
- // and might be considered as more preferable results.
- //
- // This logic, however, is not guaranteed and can change at any point in the future
- offsetParent: function() {
- return this.map( function() {
- var offsetParent = this.offsetParent;
-
- while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
- offsetParent = offsetParent.offsetParent;
- }
-
- return offsetParent || documentElement;
- } );
- }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
- var top = "pageYOffset" === prop;
-
- jQuery.fn[ method ] = function( val ) {
- return access( this, function( elem, method, val ) {
-
- // Coalesce documents and windows
- var win;
- if ( isWindow( elem ) ) {
- win = elem;
- } else if ( elem.nodeType === 9 ) {
- win = elem.defaultView;
- }
-
- if ( val === undefined ) {
- return win ? win[ prop ] : elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : win.pageXOffset,
- top ? val : win.pageYOffset
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length );
- };
-} );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( _i, prop ) {
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
- function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
-
- // If curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
- }
- );
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
-
- // Margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return access( this, function( elem, type, value ) {
- var doc;
-
- if ( isWindow( elem ) ) {
-
- // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
- return funcName.indexOf( "outer" ) === 0 ?
- elem[ "inner" + name ] :
- elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
- // whichever is greatest
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
-
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable );
- };
- } );
-} );
-
-
-jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
-
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
- function( _i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
- } );
-
-
-
-
-// Support: Android <=4.0 only
-// Make sure we trim BOM and NBSP
-var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
-
-// Bind a function to a context, optionally partially applying any
-// arguments.
-// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
-// However, it is not slated for removal any time soon
-jQuery.proxy = function( fn, context ) {
- var tmp, args, proxy;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
-};
-
-jQuery.holdReady = function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
-};
-jQuery.isArray = Array.isArray;
-jQuery.parseJSON = JSON.parse;
-jQuery.nodeName = nodeName;
-jQuery.isFunction = isFunction;
-jQuery.isWindow = isWindow;
-jQuery.camelCase = camelCase;
-jQuery.type = toType;
-
-jQuery.now = Date.now;
-
-jQuery.isNumeric = function( obj ) {
-
- // As of jQuery 3.0, isNumeric is limited to
- // strings and numbers (primitives or objects)
- // that can be coerced to finite numbers (gh-2662)
- var type = jQuery.type( obj );
- return ( type === "number" || type === "string" ) &&
-
- // parseFloat NaNs numeric-cast false positives ("")
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
- // subtraction forces infinities to NaN
- !isNaN( obj - parseFloat( obj ) );
-};
-
-jQuery.trim = function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
-};
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function() {
- return jQuery;
- } );
-}
-
-
-
-
-var
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( typeof noGlobal === "undefined" ) {
- window.jQuery = window.$ = jQuery;
-}
-
-
-
-
-return jQuery;
-} );
diff --git a/src/static/scripts/jquery-3.6.0.slim.js b/src/static/scripts/jquery-3.6.0.slim.js
@@ -0,0 +1,8782 @@
+/*!
+ * jQuery JavaScript Library v3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2021-03-02T17:08Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
+
+
+var isWindow = function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+ };
+
+
+var document = window.document;
+
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ nonce: true,
+ noModule: true
+ };
+
+ function DOMEval( code, node, doc ) {
+ doc = doc || document;
+
+ var i, val,
+ script = doc.createElement( "script" );
+
+ script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+
+ // Support: Firefox 64+, Edge 18+
+ // Some browsers don't support the "nonce" property on scripts.
+ // On the other hand, just using `getAttribute` is not enough as
+ // the `nonce` attribute is reset to an empty string whenever it
+ // becomes browsing-context connected.
+ // See https://github.com/whatwg/html/issues/2369
+ // See https://html.spec.whatwg.org/#nonce-attributes
+ // The `node.getAttribute` check was added for the sake of
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
+ // via an object.
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
+ if ( val ) {
+ script.setAttribute( i, val );
+ }
+ }
+ }
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+
+
+function toType( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ even: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return ( i + 1 ) % 2;
+ } ) );
+ },
+
+ odd: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return i % 2;
+ } ) );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ copy = options[ name ];
+
+ // Prevent Object.prototype pollution
+ // Prevent never-ending loop
+ if ( name === "__proto__" || target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+ src = target[ name ];
+
+ // Ensure proper type for the source value
+ if ( copyIsArray && !Array.isArray( src ) ) {
+ clone = [];
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+ clone = {};
+ } else {
+ clone = src;
+ }
+ copyIsArray = false;
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a provided context; falls back to the global one
+ // if not specified.
+ globalEval: function( code, options, doc ) {
+ DOMEval( code, { nonce: options && options.nonce }, doc );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return flat( ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType( obj );
+
+ if ( isFunction( obj ) || isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.6
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2021-02-16
+ */
+( function( window ) {
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ nonnativeSelectorCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ( {} ).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ pushNative = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[ i ] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+ "ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+
+ // "Attribute values must be CSS identifiers [capture 5]
+ // or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+ whitespace + "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+ whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+ "*" ),
+ rdescend = new RegExp( whitespace + "|>" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace +
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rhtml = /HTML$/i,
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+ funescape = function( escape, nonHex ) {
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+ return nonHex ?
+
+ // Strip the backslash prefix from a non-hex escape sequence
+ nonHex :
+
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
+ // Support: IE <=11+
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
+ // surrogate pair
+ high < 0 ?
+ String.fromCharCode( high + 0x10000 ) :
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" +
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ inDisabledFieldset = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ ( arr = slice.call( preferredDoc.childNodes ) ),
+ preferredDoc.childNodes
+ );
+
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ // eslint-disable-next-line no-unused-expressions
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ pushNative.apply( target, slice.call( els ) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+
+ // Can't trust NodeList.length
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+ setDocument( context );
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
+
+ // ID selector
+ if ( ( m = match[ 1 ] ) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( ( elem = context.getElementById( m ) ) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[ 2 ] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !nonnativeSelectorCache[ selector + " " ] &&
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
+
+ // Support: IE 8 only
+ // Exclude object elements
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
+
+ newSelector = selector;
+ newContext = context;
+
+ // qSA considers elements outside a scoping root when evaluating child or
+ // descendant combinators, which is not what we want.
+ // In such cases, we work around the behavior by prefixing every selector in the
+ // list with an ID selector referencing the scope context.
+ // The technique has to be used as well when a leading combinator is used
+ // as such selectors are not recognized by querySelectorAll.
+ // Thanks to Andrew Dupont for this technique.
+ if ( nodeType === 1 &&
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+
+ // We can use :scope instead of the ID hack if the browser
+ // supports it & if we're not changing the context.
+ if ( newContext !== context || !support.scope ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", ( nid = expando ) );
+ }
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+ toSelector( groups[ i ] );
+ }
+ newSelector = groups.join( "," );
+ }
+
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ nonnativeSelectorCache( selector, true );
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return ( cache[ key + " " ] = value );
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement( "fieldset" );
+
+ try {
+ return !!fn( el );
+ } catch ( e ) {
+ return false;
+ } finally {
+
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split( "|" ),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[ i ] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( ( cur = cur.nextSibling ) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return ( name === "input" || name === "button" ) && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ inDisabledFieldset( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction( function( argument ) {
+ argument = +argument;
+ return markFunction( function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
+ }
+ }
+ } );
+ } );
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
+
+ // Support: IE <=8
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+ // https://bugs.jquery.com/ticket/4833
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9 - 11+, Edge 12 - 18+
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( preferredDoc != document &&
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
+ // Support: Safari 6.0 only
+ // Safari 6.0 supports :scope but it's an alias of :root there.
+ support.scope = assert( function( el ) {
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+ return typeof el.querySelectorAll !== "undefined" &&
+ !el.querySelectorAll( ":scope fieldset div" ).length;
+ } );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert( function( el ) {
+ el.className = "i";
+ return !el.getAttribute( "className" );
+ } );
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert( function( el ) {
+ el.appendChild( document.createComment( "" ) );
+ return !el.getElementsByTagName( "*" ).length;
+ } );
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert( function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ } );
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter[ "ID" ] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute( "id" ) === attrId;
+ };
+ };
+ Expr.find[ "ID" ] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter[ "ID" ] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode( "id" );
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find[ "ID" ] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode( "id" );
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( ( elem = elems[ i++ ] ) ) {
+ node = elem.getAttributeNode( "id" );
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( ( elem = results[ i++ ] ) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert( function( el ) {
+
+ var input;
+
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push( "~=" );
+ }
+
+ // Support: IE 11+, Edge 15 - 18+
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
+ // Adding a temporary attribute to the document before the selection works
+ // around the issue.
+ // Interestingly, IE 10 & older don't seem to have the issue.
+ input = document.createElement( "input" );
+ input.setAttribute( "name", "" );
+ el.appendChild( input );
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+ whitespace + "*(?:''|\"\")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll( ":checked" ).length ) {
+ rbuggyQSA.push( ":checked" );
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push( ".#.+[+~]" );
+ }
+
+ // Support: Firefox <=3.6 - 5 only
+ // Old Firefox doesn't throw on a badly-escaped identifier.
+ el.querySelectorAll( "\\\f" );
+ rbuggyQSA.push( "[\\r\\n\\f]" );
+ } );
+
+ assert( function( el ) {
+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
+ "<select disabled='disabled'><option/></select>";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement( "input" );
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: Opera 10 - 11 only
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll( "*,:x" );
+ rbuggyQSA.push( ",.*:" );
+ } );
+ }
+
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector ) ) ) ) {
+
+ assert( function( el ) {
+
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ } );
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ) );
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( ( b = b.parentNode ) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+
+ // Choose the first element that is related to our preferred document
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( a == document || a.ownerDocument == preferredDoc &&
+ contains( preferredDoc, a ) ) {
+ return -1;
+ }
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( b == document || b.ownerDocument == preferredDoc &&
+ contains( preferredDoc, b ) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ return a == document ? -1 :
+ b == document ? 1 :
+ /* eslint-enable eqeqeq */
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( ( cur = cur.parentNode ) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( ( cur = cur.parentNode ) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[ i ] === bp[ i ] ) {
+ i++;
+ }
+
+ return i ?
+
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[ i ], bp[ i ] ) :
+
+ // Otherwise nodes in our document sort first
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ ap[ i ] == preferredDoc ? -1 :
+ bp[ i ] == preferredDoc ? 1 :
+ /* eslint-enable eqeqeq */
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ setDocument( elem );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !nonnativeSelectorCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch ( e ) {
+ nonnativeSelectorCache( expr, true );
+ }
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+
+ // Set document vars if needed
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( context.ownerDocument || context ) != document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+
+ // Set document vars if needed
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( elem.ownerDocument || elem ) != document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return ( sel + "" ).replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( ( elem = results[ i++ ] ) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+
+ // If no nodeType, this is expected to be an array
+ while ( ( node = elem[ i++ ] ) ) {
+
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+ match[ 5 ] || "" ).replace( runescape, funescape );
+
+ if ( match[ 2 ] === "~=" ) {
+ match[ 3 ] = " " + match[ 3 ] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[ 1 ] = match[ 1 ].toLowerCase();
+
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+ // nth-* requires argument
+ if ( !match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[ 4 ] = +( match[ 4 ] ?
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[ 6 ] && match[ 2 ];
+
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[ 3 ] ) {
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+
+ // Get excess from tokenize (recursively)
+ ( excess = tokenize( unquoted, true ) ) &&
+
+ // advance to the next closing parenthesis
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+
+ // excess is a negative index
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
+ match[ 2 ] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() {
+ return true;
+ } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ ( pattern = new RegExp( "(^|" + whitespace +
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+ className, function( elem ) {
+ return pattern.test(
+ typeof elem.className === "string" && elem.className ||
+ typeof elem.getAttribute !== "undefined" &&
+ elem.getAttribute( "class" ) ||
+ ""
+ );
+ } );
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ /* eslint-disable max-len */
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ /* eslint-enable max-len */
+
+ };
+ },
+
+ "CHILD": function( type, what, _argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, _context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( ( node = node[ dir ] ) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+
+ // Use previously-cached element index if available
+ if ( useCache ) {
+
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+
+ // Use the same loop as above to seek `elem` from the start
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] ||
+ ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction( function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[ i ] );
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
+ }
+ } ) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+
+ // Potentially complex pseudos
+ "not": markFunction( function( selector ) {
+
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction( function( seed, matches, _context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( ( elem = unmatched[ i ] ) ) {
+ seed[ i ] = !( matches[ i ] = elem );
+ }
+ }
+ } ) :
+ function( elem, _context, xml ) {
+ input[ 0 ] = elem;
+ matcher( input, null, xml, results );
+
+ // Don't keep the element (issue #299)
+ input[ 0 ] = null;
+ return !results.pop();
+ };
+ } ),
+
+ "has": markFunction( function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ } ),
+
+ "contains": markFunction( function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+ };
+ } ),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+
+ // lang value must be a valid identifier
+ if ( !ridentifier.test( lang || "" ) ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( ( elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
+ return false;
+ };
+ } ),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement &&
+ ( !document.hasFocus || document.hasFocus() ) &&
+ !!( elem.type || elem.href || ~elem.tabIndex );
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return ( nodeName === "input" && !!elem.checked ) ||
+ ( nodeName === "option" && !!elem.selected );
+ },
+
+ "selected": function( elem ) {
+
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ // eslint-disable-next-line no-unused-expressions
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos[ "empty" ]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
+ attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo( function() {
+ return [ 0 ];
+ } ),
+
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
+ return [ length - 1 ];
+ } ),
+
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ } ),
+
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+ var i = argument < 0 ?
+ argument + length :
+ argument > length ?
+ length :
+ argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } )
+ }
+};
+
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+ if ( match ) {
+
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
+ }
+ groups.push( ( tokens = [] ) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+
+ // Cast descendant combinators to space
+ type: match[ 0 ].replace( rtrim, " " )
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+ ( match = preFilters[ type ]( match ) ) ) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+ type: type,
+ matches: match
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[ i ].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] ||
+ ( outerCache[ elem.uniqueID ] = {} );
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
+ } else {
+
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[ i ]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[ 0 ];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[ i ], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( ( elem = unmatched[ i ] ) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction( function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts(
+ selector || "*",
+ context.nodeType ? [ context ] : context,
+ []
+ ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( ( elem = temp[ i ] ) ) {
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( ( elem = matcherOut[ i ] ) ) {
+
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( ( matcherIn[ i ] = elem ) );
+ }
+ }
+ postFinder( null, ( matcherOut = [] ), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( ( elem = matcherOut[ i ] ) &&
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
+
+ seed[ temp ] = !( results[ temp ] = elem );
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ } );
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ ( checkContext = context ).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+ } else {
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[ j ].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens
+ .slice( 0, i - 1 )
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
+ len = elems.length;
+
+ if ( outermost ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ outermostContext = context == document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( !context && elem.ownerDocument != document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
+ if ( matcher( elem, context || document, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+
+ // They will have gone through all possible matchers
+ if ( ( elem = !matcher && elem ) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+ setMatched[ i ] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[ i ] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache(
+ selector,
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
+ );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[ i ];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ ( type = token.type ) ] ) {
+ break;
+ }
+ if ( ( find = Expr.find[ type ] ) ) {
+
+ // Search, expanding context for leading sibling combinators
+ if ( ( seed = find(
+ token.matches[ 0 ].replace( runescape, funescape ),
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+ context
+ ) ) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert( function( el ) {
+
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert( function( el ) {
+ el.innerHTML = "<a href='#'></a>";
+ return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ } );
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert( function( el ) {
+ el.innerHTML = "<input/>";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+} ) ) {
+ addHandle( "value", function( elem, _name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ } );
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert( function( el ) {
+ return el.getAttribute( "disabled" ) == null;
+} ) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
+ val.value :
+ null;
+ }
+ } );
+}
+
+return Sizzle;
+
+} )( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+}
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, _i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, _i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, _i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( elem.contentDocument != null &&
+
+ // Support: IE 11+
+ // <object> elements with no `data` attribute has an object
+ // `contentDocument` with a `null` prototype.
+ getProto( elem.contentDocument ) ) {
+
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( _i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[ 3 - i ][ 3 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock,
+
+ // progress_handlers.lock
+ tuples[ 0 ][ 3 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the primary Deferred
+ primary = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ primary.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( primary.state() === "pending" ||
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return primary.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
+ }
+
+ return primary.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( toType( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, _key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( _all, letter ) {
+ return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( camelCase );
+ } else {
+ key = camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+ var isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem );
+ },
+ composed = { composed: true };
+
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
+ // Support: iOS 10.0-10.2 only
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+ // leading to errors. We need to check for `getRootNode`.
+ if ( documentElement.getRootNode ) {
+ isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem ) ||
+ elem.getRootNode( composed ) === elem.ownerDocument;
+ };
+ }
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ isAttached( elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = elem.nodeType &&
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while ( maxIterations-- ) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style( elem, prop, initialInUnit + unit );
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+ // Support: IE <=9 only
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
+ // the select element.
+ div.innerHTML = "<option></option>";
+ support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting <tbody> or other required elements.
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+};
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: IE <=9 only
+if ( !support.option ) {
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, attached, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( toType( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ attached = isAttached( elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( attached ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Only attach events to objects that accept data
+ if ( !acceptData( elem ) ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = Object.create( null );
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( nativeEvent ),
+
+ handlers = (
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // If the event is namespaced, then each handler is only invoked if it is
+ // specially universal or its namespaces are a superset of the event's.
+ if ( !event.rnamespace || handleObj.namespace === false ||
+ event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG <use> instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ click: {
+
+ // Utilize native event to ensure correct state for checkable inputs
+ setup: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Claim the first handler
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ // dataPriv.set( el, "click", ... )
+ leverageNative( el, "click", returnTrue );
+ }
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Force setup before triggering a click
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ leverageNative( el, "click" );
+ }
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // For cross-browser consistency, suppress native .click() on links
+ // Also prevent it if we're currently inside a leveraged native-event stack
+ _default: function( event ) {
+ var target = event.target;
+ return rcheckableType.test( target.type ) &&
+ target.click && nodeName( target, "input" ) &&
+ dataPriv.get( target, "click" ) ||
+ nodeName( target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+ if ( !expectSync ) {
+ if ( dataPriv.get( el, type ) === undefined ) {
+ jQuery.event.add( el, type, returnTrue );
+ }
+ return;
+ }
+
+ // Register the controller as a special universal handler for all event namespaces
+ dataPriv.set( el, type, false );
+ jQuery.event.add( el, type, {
+ namespace: false,
+ handler: function( event ) {
+ var notAsync, result,
+ saved = dataPriv.get( this, type );
+
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+ // Interrupt processing of the outer synthetic .trigger()ed event
+ // Saved data should be false in such cases, but might be a leftover capture object
+ // from an async native handler (gh-4350)
+ if ( !saved.length ) {
+
+ // Store arguments for use when handling the inner native event
+ // There will always be at least one argument (an event object), so this array
+ // will not be confused with a leftover capture object.
+ saved = slice.call( arguments );
+ dataPriv.set( this, type, saved );
+
+ // Trigger the native event and capture its result
+ // Support: IE <=9 - 11+
+ // focus() and blur() are asynchronous
+ notAsync = expectSync( this, type );
+ this[ type ]();
+ result = dataPriv.get( this, type );
+ if ( saved !== result || notAsync ) {
+ dataPriv.set( this, type, false );
+ } else {
+ result = {};
+ }
+ if ( saved !== result ) {
+
+ // Cancel the outer synthetic event
+ event.stopImmediatePropagation();
+ event.preventDefault();
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
+ }
+
+ // If this is an inner synthetic event for an event with a bubbling surrogate
+ // (focus or blur), assume that the surrogate already propagated from triggering the
+ // native event and prevent that from happening again here.
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
+ // less bad than duplication.
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+ event.stopPropagation();
+ }
+
+ // If this is a native event triggered above, everything is now in order
+ // Fire an inner synthetic event with the original arguments
+ } else if ( saved.length ) {
+
+ // ...and capture the result
+ dataPriv.set( this, type, {
+ value: jQuery.event.trigger(
+
+ // Support: IE <=9 - 11+
+ // Extend with the prototype to reset the above stopImmediatePropagation()
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+ saved.slice( 1 ),
+ this
+ )
+ } );
+
+ // Abort handling of the native event
+ event.stopImmediatePropagation();
+ }
+ }
+ } );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ code: true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+ which: true
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+ jQuery.event.special[ type ] = {
+
+ // Utilize native event if possible so blur/focus sequence is correct
+ setup: function() {
+
+ // Claim the first handler
+ // dataPriv.set( this, "focus", ... )
+ // dataPriv.set( this, "blur", ... )
+ leverageNative( this, type, expectSync );
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function() {
+
+ // Force setup before trigger
+ leverageNative( this, type );
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
+ delegateType: delegateType
+ };
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /<script|<style|<link/i,
+
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+ if ( nodeName( elem, "table" ) &&
+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+ }
+
+ return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+ elem.type = elem.type.slice( 5 );
+ } else {
+ elem.removeAttribute( "type" );
+ }
+
+ return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( dataPriv.hasData( src ) ) {
+ pdataOld = dataPriv.get( src );
+ events = pdataOld.events;
+
+ if ( events ) {
+ dataPriv.remove( dest, "handle events" );
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( dataUser.hasData( src ) ) {
+ udataOld = dataUser.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ dataUser.set( dest, udataCur );
+ }
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+ // Flatten any nested arrays
+ args = flat( args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = collection.length,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ valueIsFunction = isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( valueIsFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return collection.each( function( index ) {
+ var self = collection.eq( index );
+ if ( valueIsFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ domManip( self, args, callback, ignored );
+ } );
+ }
+
+ if ( l ) {
+ fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ // Require either new content or an interest in ignored elements to invoke the callback
+ if ( first || ignored ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item
+ // instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( collection[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !dataPriv.access( node, "globalEval" ) &&
+ jQuery.contains( doc, node ) ) {
+
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
+
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl && !node.noModule ) {
+ jQuery._evalUrl( node.src, {
+ nonce: node.nonce || node.getAttribute( "nonce" )
+ }, doc );
+ }
+ } else {
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return collection;
+}
+
+function remove( elem, selector, keepData ) {
+ var node,
+ nodes = selector ? jQuery.filter( selector, elem ) : elem,
+ i = 0;
+
+ for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+ if ( !keepData && node.nodeType === 1 ) {
+ jQuery.cleanData( getAll( node ) );
+ }
+
+ if ( node.parentNode ) {
+ if ( keepData && isAttached( node ) ) {
+ setGlobalEval( getAll( node, "script" ) );
+ }
+ node.parentNode.removeChild( node );
+ }
+ }
+
+ return elem;
+}
+
+jQuery.extend( {
+ htmlPrefilter: function( html ) {
+ return html;
+ },
+
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = isAttached( elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+ if ( acceptData( elem ) ) {
+ if ( ( data = elem[ dataPriv.expando ] ) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataPriv.expando ] = undefined;
+ }
+ if ( elem[ dataUser.expando ] ) {
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataUser.expando ] = undefined;
+ }
+ }
+ }
+ }
+} );
+
+jQuery.fn.extend( {
+ detach: function( selector ) {
+ return remove( this, selector, true );
+ },
+
+ remove: function( selector ) {
+ return remove( this, selector );
+ },
+
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each( function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ } );
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ } );
+ },
+
+ prepend: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ } );
+ },
+
+ before: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ } );
+ },
+
+ after: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ } );
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; ( elem = this[ i ] ) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ } );
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = jQuery.htmlPrefilter( value );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch ( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var ignored = [];
+
+ // Make the changes, replacing each non-ignored context element with the new content
+ return domManip( this, arguments, function( elem ) {
+ var parent = this.parentNode;
+
+ if ( jQuery.inArray( this, ignored ) < 0 ) {
+ jQuery.cleanData( getAll( this ) );
+ if ( parent ) {
+ parent.replaceChild( elem, this );
+ }
+ }
+
+ // Force callback invocation
+ }, ignored );
+ }
+} );
+
+jQuery.each( {
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ var view = elem.ownerDocument.defaultView;
+
+ if ( !view || !view.opener ) {
+ view = window;
+ }
+
+ return view.getComputedStyle( elem );
+ };
+
+var swap = function( elem, options, callback ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computeStyleTests() {
+
+ // This is a singleton, we need to execute it only once
+ if ( !div ) {
+ return;
+ }
+
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+ "margin-top:1px;padding:0;border:0";
+ div.style.cssText =
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+ "margin:auto;border:1px;padding:1px;" +
+ "width:60%;top:1%";
+ documentElement.appendChild( container ).appendChild( div );
+
+ var divStyle = window.getComputedStyle( div );
+ pixelPositionVal = divStyle.top !== "1%";
+
+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+ // Some styles come back with percentage values, even though they shouldn't
+ div.style.right = "60%";
+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+ // Support: IE 9 - 11 only
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+ // Support: IE 9 only
+ // Detect overflow:scroll screwiness (gh-3699)
+ // Support: Chrome <=64
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
+ div.style.position = "absolute";
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+ documentElement.removeChild( container );
+
+ // Nullify the div so it wouldn't be stored in the memory and
+ // it will also be a sign that checks already performed
+ div = null;
+ }
+
+ function roundPixelMeasures( measure ) {
+ return Math.round( parseFloat( measure ) );
+ }
+
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+ reliableTrDimensionsVal, reliableMarginLeftVal,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ // Finish early in limited (non-browser) environments
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE <=9 - 11 only
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ jQuery.extend( support, {
+ boxSizingReliable: function() {
+ computeStyleTests();
+ return boxSizingReliableVal;
+ },
+ pixelBoxStyles: function() {
+ computeStyleTests();
+ return pixelBoxStylesVal;
+ },
+ pixelPosition: function() {
+ computeStyleTests();
+ return pixelPositionVal;
+ },
+ reliableMarginLeft: function() {
+ computeStyleTests();
+ return reliableMarginLeftVal;
+ },
+ scrollboxSize: function() {
+ computeStyleTests();
+ return scrollboxSizeVal;
+ },
+
+ // Support: IE 9 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
+ // some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
+ reliableTrDimensions: function() {
+ var table, tr, trChild, trStyle;
+ if ( reliableTrDimensionsVal == null ) {
+ table = document.createElement( "table" );
+ tr = document.createElement( "tr" );
+ trChild = document.createElement( "div" );
+
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
+ tr.style.height = "1px";
+ trChild.style.height = "9px";
+
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
+ documentElement
+ .appendChild( table )
+ .appendChild( tr )
+ .appendChild( trChild );
+
+ trStyle = window.getComputedStyle( tr );
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
+
+ documentElement.removeChild( table );
+ }
+ return reliableTrDimensionsVal;
+ }
+ } );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+
+ // Support: Firefox 51+
+ // Retrieving style before computed somehow
+ // fixes an issue with getting wrong values
+ // on detached elements
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // getPropertyValue is needed for:
+ // .css('filter') (IE 9 only, #12537)
+ // .css('--customProperty) (#3144)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+
+ if ( ret === "" && !isAttached( elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Android Browser returns percentage for some values,
+ // but width seems to be reliably pixels.
+ // This is against the CSSOM draft spec:
+ // https://drafts.csswg.org/cssom/#resolved-values
+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+
+ // Support: IE <=9 - 11 only
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return ( this.get = hookFn ).apply( this, arguments );
+ }
+ };
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+ emptyStyle = document.createElement( "div" ).style,
+ vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+ // Check for vendor prefixed names
+ var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in emptyStyle ) {
+ return name;
+ }
+ }
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+ if ( final ) {
+ return final;
+ }
+ if ( name in emptyStyle ) {
+ return name;
+ }
+ return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+ // Swappable if display is none or starts with table
+ // except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rcustomProp = /^--/,
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ };
+
+function setPositiveNumber( _elem, value, subtract ) {
+
+ // Any relative (+/-) values have already been
+ // normalized at this point
+ var matches = rcssNum.exec( value );
+ return matches ?
+
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+ value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+ var i = dimension === "width" ? 1 : 0,
+ extra = 0,
+ delta = 0;
+
+ // Adjustment may not be necessary
+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
+ return 0;
+ }
+
+ for ( ; i < 4; i += 2 ) {
+
+ // Both box models exclude margin
+ if ( box === "margin" ) {
+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+ }
+
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+ if ( !isBorderBox ) {
+
+ // Add padding
+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // For "border" or "margin", add border
+ if ( box !== "padding" ) {
+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+ // But still keep track of it otherwise
+ } else {
+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
+ // "padding" or "margin"
+ } else {
+
+ // For "content", subtract padding
+ if ( box === "content" ) {
+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // For "content" or "padding", subtract border
+ if ( box !== "margin" ) {
+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ // Account for positive content-box scroll gutter when requested by providing computedVal
+ if ( !isBorderBox && computedVal >= 0 ) {
+
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+ // Assuming integer scroll gutter, subtract the rest and round down
+ delta += Math.max( 0, Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ computedVal -
+ delta -
+ extra -
+ 0.5
+
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+ // Use an explicit zero to avoid NaN (gh-3964)
+ ) ) || 0;
+ }
+
+ return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+ // Start with computed style
+ var styles = getStyles( elem ),
+
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+ // Fake content-box until we know it's needed to know the true value.
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
+ isBorderBox = boxSizingNeeded &&
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ valueIsBorderBox = isBorderBox,
+
+ val = curCSS( elem, dimension, styles ),
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+ // Support: Firefox <=54
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
+ if ( rnumnonpx.test( val ) ) {
+ if ( !extra ) {
+ return val;
+ }
+ val = "auto";
+ }
+
+
+ // Support: IE 9 - 11 only
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
+ // In those cases, the computed value can be trusted to be border-box.
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+ // Support: IE 10 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
+ val === "auto" ||
+
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+ // Make sure the element is visible & connected
+ elem.getClientRects().length ) {
+
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+ // retrieved value as a content box dimension.
+ valueIsBorderBox = offsetProp in elem;
+ if ( valueIsBorderBox ) {
+ val = elem[ offsetProp ];
+ }
+ }
+
+ // Normalize "" and auto
+ val = parseFloat( val ) || 0;
+
+ // Adjust for the element's box model
+ return ( val +
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles,
+
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
+ val
+ )
+ ) + "px";
+}
+
+jQuery.extend( {
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "animationIterationCount": true,
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "gridArea": true,
+ "gridColumn": true,
+ "gridColumnEnd": true,
+ "gridColumnStart": true,
+ "gridRow": true,
+ "gridRowEnd": true,
+ "gridRowStart": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {},
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name ),
+ style = elem.style;
+
+ // Make sure that we're working with the right name. We don't
+ // want to query the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+ value = adjustCSS( elem, name, ret );
+
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add the unit (except for certain CSS properties)
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+ // "px" to a few hardcoded values.
+ if ( type === "number" && !isCustomProp ) {
+ value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+ }
+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !( "set" in hooks ) ||
+ ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+ if ( isCustomProp ) {
+ style.setProperty( name, value );
+ } else {
+ style[ name ] = value;
+ }
+ }
+
+ } else {
+
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks &&
+ ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name );
+
+ // Make sure that we're working with the right name. We don't
+ // want to modify the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || isFinite( num ) ? num || 0 : val;
+ }
+
+ return val;
+ }
+} );
+
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
+ jQuery.cssHooks[ dimension ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+ // Support: Safari 8+
+ // Table columns in Safari have non-zero offsetWidth & zero
+ // getBoundingClientRect().width unless display is changed.
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a disconnected node
+ // in IE throws an error.
+ ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var matches,
+ styles = getStyles( elem ),
+
+ // Only read styles.position if the test has a chance to fail
+ // to avoid forcing a reflow.
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
+ styles.position === "absolute",
+
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
+ isBorderBox = boxSizingNeeded &&
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ subtract = extra ?
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra,
+ isBorderBox,
+ styles
+ ) :
+ 0;
+
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
+ // faking a content-box to get border and padding (gh-3699)
+ if ( isBorderBox && scrollboxSizeBuggy ) {
+ subtract -= Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ parseFloat( styles[ dimension ] ) -
+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
+ 0.5
+ );
+ }
+
+ // Convert to pixels if value adjustment is needed
+ if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+ ( matches[ 3 ] || "px" ) !== "px" ) {
+
+ elem.style[ dimension ] = value;
+ value = jQuery.css( elem, dimension );
+ }
+
+ return setPositiveNumber( elem, value, subtract );
+ }
+ };
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+ function( elem, computed ) {
+ if ( computed ) {
+ return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+ elem.getBoundingClientRect().left -
+ swap( elem, { marginLeft: 0 }, function() {
+ return elem.getBoundingClientRect().left;
+ } )
+ ) + "px";
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( prefix !== "margin" ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+} );
+
+jQuery.fn.extend( {
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( Array.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ }
+} );
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = window.setTimeout( next, time );
+ hooks.stop = function() {
+ window.clearTimeout( timeout );
+ };
+ } );
+};
+
+
+( function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: Android <=4.3 only
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE <=11 only
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: IE <=11 only
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each( function() {
+ jQuery.removeAttr( this, name );
+ } );
+ }
+} );
+
+jQuery.extend( {
+ attr: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set attributes on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === "undefined" ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // Attribute hooks are determined by the lowercase version
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+ }
+
+ if ( value !== undefined ) {
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+ return;
+ }
+
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ? undefined : ret;
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name,
+ i = 0,
+
+ // Attribute names can contain non-HTML whitespace characters
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ attrNames = value && value.match( rnothtmlwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( ( name = attrNames[ i++ ] ) ) {
+ elem.removeAttribute( name );
+ }
+ }
+ }
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle,
+ lowercaseName = name.toLowerCase();
+
+ if ( !isXML ) {
+
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ lowercaseName ];
+ attrHandle[ lowercaseName ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ lowercaseName :
+ null;
+ attrHandle[ lowercaseName ] = handle;
+ }
+ return ret;
+ };
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+ rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each( function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ } );
+ }
+} );
+
+jQuery.extend( {
+ prop: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ return ( elem[ name ] = value );
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ return elem[ name ];
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+
+ // Support: IE <=9 - 11 only
+ // elem.tabIndex doesn't always return the
+ // correct value when it hasn't been explicitly set
+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+ if ( tabindex ) {
+ return parseInt( tabindex, 10 );
+ }
+
+ if (
+ rfocusable.test( elem.nodeName ) ||
+ rclickable.test( elem.nodeName ) &&
+ elem.href
+ ) {
+ return 0;
+ }
+
+ return -1;
+ }
+ }
+ },
+
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ }
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ },
+ set: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+ };
+}
+
+jQuery.each( [
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+ // Strip and collapse whitespace according to HTML spec
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+ function stripAndCollapse( value ) {
+ var tokens = value.match( rnothtmlwhite ) || [];
+ return tokens.join( " " );
+ }
+
+
+function getClass( elem ) {
+ return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+ if ( Array.isArray( value ) ) {
+ return value;
+ }
+ if ( typeof value === "string" ) {
+ return value.match( rnothtmlwhite ) || [];
+ }
+ return [];
+}
+
+jQuery.fn.extend( {
+ addClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ if ( !arguments.length ) {
+ return this.attr( "class", "" );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isValidValue = type === "string" || Array.isArray( value );
+
+ if ( typeof stateVal === "boolean" && isValidValue ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( isFunction( value ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).toggleClass(
+ value.call( this, i, getClass( this ), stateVal ),
+ stateVal
+ );
+ } );
+ }
+
+ return this.each( function() {
+ var className, i, self, classNames;
+
+ if ( isValidValue ) {
+
+ // Toggle individual class names
+ i = 0;
+ self = jQuery( this );
+ classNames = classesToArray( value );
+
+ while ( ( className = classNames[ i++ ] ) ) {
+
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( value === undefined || type === "boolean" ) {
+ className = getClass( this );
+ if ( className ) {
+
+ // Store className if set
+ dataPriv.set( this, "__className__", className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ if ( this.setAttribute ) {
+ this.setAttribute( "class",
+ className || value === false ?
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
+ );
+ }
+ }
+ } );
+ },
+
+ hasClass: function( selector ) {
+ var className, elem,
+ i = 0;
+
+ className = " " + selector + " ";
+ while ( ( elem = this[ i++ ] ) ) {
+ if ( elem.nodeType === 1 &&
+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+ val: function( value ) {
+ var hooks, ret, valueIsFunction,
+ elem = this[ 0 ];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] ||
+ jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks &&
+ "get" in hooks &&
+ ( ret = hooks.get( elem, "value" ) ) !== undefined
+ ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ // Handle most common string cases
+ if ( typeof ret === "string" ) {
+ return ret.replace( rreturn, "" );
+ }
+
+ // Handle cases where value is null/undef or number
+ return ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ valueIsFunction = isFunction( value );
+
+ return this.each( function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( valueIsFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( Array.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ } );
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ } );
+ }
+} );
+
+jQuery.extend( {
+ valHooks: {
+ option: {
+ get: function( elem ) {
+
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+
+ // Support: IE <=10 - 11 only
+ // option.text throws exceptions (#14686, #14858)
+ // Strip and collapse whitespace
+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+ stripAndCollapse( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option, i,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one",
+ values = one ? null : [],
+ max = one ? index + 1 : options.length;
+
+ if ( index < 0 ) {
+ i = max;
+
+ } else {
+ i = one ? index : 0;
+ }
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // Support: IE <=9 only
+ // IE8-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+
+ // Don't return options that are disabled or in a disabled optgroup
+ !option.disabled &&
+ ( !option.parentNode.disabled ||
+ !nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+
+ /* eslint-disable no-cond-assign */
+
+ if ( option.selected =
+ jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+ ) {
+ optionSet = true;
+ }
+
+ /* eslint-enable no-cond-assign */
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( Array.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+ };
+ }
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ stopPropagationCallback = function( e ) {
+ e.stopPropagation();
+ };
+
+jQuery.extend( jQuery.event, {
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+ cur = lastElement = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf( "." ) > -1 ) {
+
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split( "." );
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join( "." );
+ event.rnamespace = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === ( elem.ownerDocument || document ) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+ lastElement = cur;
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
+ dataPriv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( ( !special._default ||
+ special._default.apply( eventPath.pop(), data ) === false ) &&
+ acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.addEventListener( type, stopPropagationCallback );
+ }
+
+ elem[ type ]();
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.removeEventListener( type, stopPropagationCallback );
+ }
+
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ // Piggyback on a donor event to simulate a different one
+ // Used only for `focus(in | out)` events
+ simulate: function( type, elem, event ) {
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true
+ }
+ );
+
+ jQuery.event.trigger( e, null, elem );
+ }
+
+} );
+
+jQuery.fn.extend( {
+
+ trigger: function( type, data ) {
+ return this.each( function() {
+ jQuery.event.trigger( type, data, this );
+ } );
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[ 0 ];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+
+ // Handle: regular nodes (via `this.ownerDocument`), window
+ // (via `this.document`) & document (via `this`).
+ var doc = this.ownerDocument || this.document || this,
+ attaches = dataPriv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this.document || this,
+ attaches = dataPriv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ dataPriv.remove( doc, fix );
+
+ } else {
+ dataPriv.access( doc, fix, attaches );
+ }
+ }
+ };
+ } );
+}
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, parserErrorElem;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE 9 - 11 only
+ // IE throws on parseFromString with invalid input.
+ try {
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+ } catch ( e ) {}
+
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
+ }
+ return xml;
+};
+
+
+var
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( Array.isArray( obj ) ) {
+
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams(
+ prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+ v,
+ traditional,
+ add
+ );
+ }
+ } );
+
+ } else if ( !traditional && toType( obj ) === "object" ) {
+
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, valueOrFunction ) {
+
+ // If value is a function, invoke it and use its return value
+ var value = isFunction( valueOrFunction ) ?
+ valueOrFunction() :
+ valueOrFunction;
+
+ s[ s.length ] = encodeURIComponent( key ) + "=" +
+ encodeURIComponent( value == null ? "" : value );
+ };
+
+ if ( a == null ) {
+ return "";
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ } );
+
+ } else {
+
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map( function() {
+
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ } ).filter( function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ } ).map( function( _i, elem ) {
+ var val = jQuery( this ).val();
+
+ if ( val == null ) {
+ return null;
+ }
+
+ if ( Array.isArray( val ) ) {
+ return jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } );
+ }
+
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } ).get();
+ }
+} );
+
+
+jQuery.fn.extend( {
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( this[ 0 ] ) {
+ if ( isFunction( html ) ) {
+ html = html.call( this[ 0 ] );
+ }
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map( function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ } ).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( isFunction( html ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).wrapInner( html.call( this, i ) );
+ } );
+ }
+
+ return this.each( function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ } );
+ },
+
+ wrap: function( html ) {
+ var htmlIsFunction = isFunction( html );
+
+ return this.each( function( i ) {
+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+ } );
+ },
+
+ unwrap: function( selector ) {
+ this.parent( selector ).not( "body" ).each( function() {
+ jQuery( this ).replaceWith( this.childNodes );
+ } );
+ return this;
+ }
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+ return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+ return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+ var body = document.implementation.createHTMLDocument( "" ).body;
+ body.innerHTML = "<form></form><form></form>";
+ return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( typeof data !== "string" ) {
+ return [];
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+
+ var base, parsed, scripts;
+
+ if ( !context ) {
+
+ // Stop scripts or inline event handlers from being executed immediately
+ // by using document.implementation
+ if ( support.createHTMLDocument ) {
+ context = document.implementation.createHTMLDocument( "" );
+
+ // Set the base href for the created document
+ // so any parsed elements with URLs
+ // are based on the document's URL (gh-2965)
+ base = context.createElement( "base" );
+ base.href = document.location.href;
+ context.head.appendChild( base );
+ } else {
+ context = document;
+ }
+ }
+
+ parsed = rsingleTag.exec( data );
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[ 1 ] ) ];
+ }
+
+ parsed = buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( isFunction( options ) ) {
+
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend( {
+
+ // offset() relates an element's border box to the document origin
+ offset: function( options ) {
+
+ // Preserve chaining for setter
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each( function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ } );
+ }
+
+ var rect, win,
+ elem = this[ 0 ];
+
+ if ( !elem ) {
+ return;
+ }
+
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a
+ // disconnected node in IE throws an error
+ if ( !elem.getClientRects().length ) {
+ return { top: 0, left: 0 };
+ }
+
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
+ rect = elem.getBoundingClientRect();
+ win = elem.ownerDocument.defaultView;
+ return {
+ top: rect.top + win.pageYOffset,
+ left: rect.left + win.pageXOffset
+ };
+ },
+
+ // position() relates an element's margin box to its offset parent's padding box
+ // This corresponds to the behavior of CSS absolute positioning
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset, doc,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+ // Assume position:fixed implies availability of getBoundingClientRect
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ offset = this.offset();
+
+ // Account for the *real* offset parent, which can be the document or its root element
+ // when a statically positioned element is identified
+ doc = elem.ownerDocument;
+ offsetParent = elem.offsetParent || doc.documentElement;
+ while ( offsetParent &&
+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+ jQuery.css( offsetParent, "position" ) === "static" ) {
+
+ offsetParent = offsetParent.parentNode;
+ }
+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+ // Incorporate borders into its offset, since they are outside its content origin
+ parentOffset = jQuery( offsetParent ).offset();
+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+ }
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ // This method will return documentElement in the following cases:
+ // 1) For the element inside the iframe without offsetParent, this method will return
+ // documentElement of the parent window
+ // 2) For the hidden or detached element
+ // 3) For body or html element, i.e. in case of the html node - it will return itself
+ //
+ // but those exceptions were never presented as a real life use-cases
+ // and might be considered as more preferable results.
+ //
+ // This logic, however, is not guaranteed and can change at any point in the future
+ offsetParent: function() {
+ return this.map( function() {
+ var offsetParent = this.offsetParent;
+
+ while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || documentElement;
+ } );
+ }
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+
+ // Coalesce documents and windows
+ var win;
+ if ( isWindow( elem ) ) {
+ win = elem;
+ } else if ( elem.nodeType === 9 ) {
+ win = elem.defaultView;
+ }
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : win.pageXOffset,
+ top ? val : win.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length );
+ };
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
+
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( isWindow( elem ) ) {
+
+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+ return funcName.indexOf( "outer" ) === 0 ?
+ elem[ "inner" + name ] :
+ elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable );
+ };
+ } );
+} );
+
+
+jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+} );
+
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+ function( _i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+ }
+);
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type( obj );
+ return ( type === "number" || type === "string" ) &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN( obj - parseFloat( obj ) );
+};
+
+jQuery.trim = function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+};
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ } );
+}
+
+
+
+
+var
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === "undefined" ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
diff --git a/src/static/templates/admin/base.hbs b/src/static/templates/admin/base.hbs
@@ -15,14 +15,16 @@
width: 48px;
height: 48px;
}
- .navbar .vaultwarden-icon {
+ .vaultwarden-icon {
height: 32px;
width: auto;
- margin: -5px -3px 0 0;
+ margin: -5px 0 0 0;
}
</style>
<script src="{{urlpath}}/bwrs_static/identicon.js"></script>
<script>
+ 'use strict';
+
function reload() { window.location.reload(); }
function msg(text, reload_page = true) {
text && alert(text);
@@ -78,19 +80,18 @@
});
}
</script>
-
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4 shadow fixed-top">
<div class="container-xl">
- <a class="navbar-brand" href="{{urlpath}}/admin"><img class="pr-1 vaultwarden-icon" src="{{urlpath}}/bwrs_static/vaultwarden-icon.png" alt="V">aultwarden Admin</a>
- <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse"
+ <a class="navbar-brand" href="{{urlpath}}/admin"><img class="vaultwarden-icon" src="{{urlpath}}/bwrs_static/vaultwarden-icon.png" alt="V">aultwarden Admin</a>
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse"
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
- <ul class="navbar-nav mr-auto">
+ <ul class="navbar-nav me-auto">
{{#if logged_in}}
<li class="nav-item">
<a class="nav-link" href="{{urlpath}}/admin">Settings</a>
@@ -121,17 +122,19 @@
<!-- This script needs to be at the bottom, else it will fail! -->
<script>
+ 'use strict';
+
// get current URL path and assign 'active' class to the correct nav-item
- (function () {
+ (() => {
var pathname = window.location.pathname;
if (pathname === "") return;
var navItem = document.querySelectorAll('.navbar-nav .nav-item a[href="'+pathname+'"]');
if (navItem.length === 1) {
- navItem[0].parentElement.className = navItem[0].parentElement.className + ' active';
+ navItem[0].className = navItem[0].className + ' active';
+ navItem[0].setAttribute('aria-current', 'page');
}
})();
</script>
- <!-- This script needs to be at the bottom, else it will fail! -->
<script src="{{urlpath}}/bwrs_static/bootstrap-native.js"></script>
</body>
</html>
diff --git a/src/static/templates/admin/diagnostics.hbs b/src/static/templates/admin/diagnostics.hbs
@@ -7,37 +7,37 @@
<div class="col-md">
<dl class="row">
<dt class="col-sm-5">Server Installed
- <span class="badge badge-success d-none" id="server-success" title="Latest version is installed.">Ok</span>
- <span class="badge badge-warning d-none" id="server-warning" title="There seems to be an update available.">Update</span>
- <span class="badge badge-info d-none" id="server-branch" title="This is a branched version.">Branched</span>
+ <span class="badge bg-success d-none" id="server-success" title="Latest version is installed.">Ok</span>
+ <span class="badge bg-warning d-none" id="server-warning" title="There seems to be an update available.">Update</span>
+ <span class="badge bg-info d-none" id="server-branch" title="This is a branched version.">Branched</span>
</dt>
<dd class="col-sm-7">
<span id="server-installed">{{version}}</span>
</dd>
<dt class="col-sm-5">Server Latest
- <span class="badge badge-secondary d-none" id="server-failed" title="Unable to determine latest version.">Unknown</span>
+ <span class="badge bg-secondary d-none" id="server-failed" title="Unable to determine latest version.">Unknown</span>
</dt>
<dd class="col-sm-7">
- <span id="server-latest">{{diagnostics.latest_release}}<span id="server-latest-commit" class="d-none">-{{diagnostics.latest_commit}}</span></span>
+ <span id="server-latest">{{page_data.latest_release}}<span id="server-latest-commit" class="d-none">-{{page_data.latest_commit}}</span></span>
</dd>
- {{#if diagnostics.web_vault_enabled}}
+ {{#if page_data.web_vault_enabled}}
<dt class="col-sm-5">Web Installed
- <span class="badge badge-success d-none" id="web-success" title="Latest version is installed.">Ok</span>
- <span class="badge badge-warning d-none" id="web-warning" title="There seems to be an update available.">Update</span>
+ <span class="badge bg-success d-none" id="web-success" title="Latest version is installed.">Ok</span>
+ <span class="badge bg-warning d-none" id="web-warning" title="There seems to be an update available.">Update</span>
</dt>
<dd class="col-sm-7">
- <span id="web-installed">{{diagnostics.web_vault_version}}</span>
+ <span id="web-installed">{{page_data.web_vault_version}}</span>
</dd>
- {{#unless diagnostics.running_within_docker}}
+ {{#unless page_data.running_within_docker}}
<dt class="col-sm-5">Web Latest
- <span class="badge badge-secondary d-none" id="web-failed" title="Unable to determine latest version.">Unknown</span>
+ <span class="badge bg-secondary d-none" id="web-failed" title="Unable to determine latest version.">Unknown</span>
</dt>
<dd class="col-sm-7">
- <span id="web-latest">{{diagnostics.latest_web_build}}</span>
+ <span id="web-latest">{{page_data.latest_web_build}}</span>
</dd>
{{/unless}}
{{/if}}
- {{#unless diagnostics.web_vault_enabled}}
+ {{#unless page_data.web_vault_enabled}}
<dt class="col-sm-5">Web Installed</dt>
<dd class="col-sm-7">
<span id="web-installed">Web Vault is disabled</span>
@@ -45,7 +45,7 @@
{{/unless}}
<dt class="col-sm-5">Database</dt>
<dd class="col-sm-7">
- <span><b>{{diagnostics.db_type}}:</b> {{diagnostics.db_version}}</span>
+ <span><b>{{page_data.db_type}}:</b> {{page_data.db_version}}</span>
</dd>
</dl>
</div>
@@ -57,96 +57,105 @@
<dl class="row">
<dt class="col-sm-5">Running within Docker</dt>
<dd class="col-sm-7">
- {{#if diagnostics.running_within_docker}}
+ {{#if page_data.running_within_docker}}
<span class="d-block"><b>Yes</b></span>
{{/if}}
- {{#unless diagnostics.running_within_docker}}
+ {{#unless page_data.running_within_docker}}
+ <span class="d-block"><b>No</b></span>
+ {{/unless}}
+ </dd>
+ <dt class="col-sm-5">Environment settings overridden</dt>
+ <dd class="col-sm-7">
+ {{#if page_data.overrides}}
+ <span class="d-block" title="The following settings are overridden: {{page_data.overrides}}"><b>Yes</b></span>
+ {{/if}}
+ {{#unless page_data.overrides}}
<span class="d-block"><b>No</b></span>
{{/unless}}
</dd>
<dt class="col-sm-5">Uses a reverse proxy</dt>
<dd class="col-sm-7">
- {{#if diagnostics.ip_header_exists}}
+ {{#if page_data.ip_header_exists}}
<span class="d-block" title="IP Header found."><b>Yes</b></span>
{{/if}}
- {{#unless diagnostics.ip_header_exists}}
+ {{#unless page_data.ip_header_exists}}
<span class="d-block" title="No IP Header found."><b>No</b></span>
{{/unless}}
</dd>
{{!-- Only show this if the IP Header Exists --}}
- {{#if diagnostics.ip_header_exists}}
+ {{#if page_data.ip_header_exists}}
<dt class="col-sm-5">IP header
- {{#if diagnostics.ip_header_match}}
- <span class="badge badge-success" title="IP_HEADER config seems to be valid.">Match</span>
+ {{#if page_data.ip_header_match}}
+ <span class="badge bg-success" title="IP_HEADER config seems to be valid.">Match</span>
{{/if}}
- {{#unless diagnostics.ip_header_match}}
- <span class="badge badge-danger" title="IP_HEADER config seems to be invalid. IP's in the log could be invalid. Please fix.">No Match</span>
+ {{#unless page_data.ip_header_match}}
+ <span class="badge bg-danger" title="IP_HEADER config seems to be invalid. IP's in the log could be invalid. Please fix.">No Match</span>
{{/unless}}
</dt>
<dd class="col-sm-7">
- {{#if diagnostics.ip_header_match}}
- <span class="d-block"><b>Config/Server:</b> {{ diagnostics.ip_header_name }}</span>
+ {{#if page_data.ip_header_match}}
+ <span class="d-block"><b>Config/Server:</b> {{ page_data.ip_header_name }}</span>
{{/if}}
- {{#unless diagnostics.ip_header_match}}
- <span class="d-block"><b>Config:</b> {{ diagnostics.ip_header_config }}</span>
- <span class="d-block"><b>Server:</b> {{ diagnostics.ip_header_name }}</span>
+ {{#unless page_data.ip_header_match}}
+ <span class="d-block"><b>Config:</b> {{ page_data.ip_header_config }}</span>
+ <span class="d-block"><b>Server:</b> {{ page_data.ip_header_name }}</span>
{{/unless}}
</dd>
{{/if}}
{{!-- End if IP Header Exists --}}
<dt class="col-sm-5">Internet access
- {{#if diagnostics.has_http_access}}
- <span class="badge badge-success" title="We have internet access!">Ok</span>
+ {{#if page_data.has_http_access}}
+ <span class="badge bg-success" title="We have internet access!">Ok</span>
{{/if}}
- {{#unless diagnostics.has_http_access}}
- <span class="badge badge-danger" title="There seems to be no internet access. Please fix.">Error</span>
+ {{#unless page_data.has_http_access}}
+ <span class="badge bg-danger" title="There seems to be no internet access. Please fix.">Error</span>
{{/unless}}
</dt>
<dd class="col-sm-7">
- {{#if diagnostics.has_http_access}}
+ {{#if page_data.has_http_access}}
<span class="d-block"><b>Yes</b></span>
{{/if}}
- {{#unless diagnostics.has_http_access}}
+ {{#unless page_data.has_http_access}}
<span class="d-block"><b>No</b></span>
{{/unless}}
</dd>
<dt class="col-sm-5">Internet access via a proxy</dt>
<dd class="col-sm-7">
- {{#if diagnostics.uses_proxy}}
+ {{#if page_data.uses_proxy}}
<span class="d-block" title="Internet access goes via a proxy (HTTPS_PROXY or HTTP_PROXY is configured)."><b>Yes</b></span>
{{/if}}
- {{#unless diagnostics.uses_proxy}}
+ {{#unless page_data.uses_proxy}}
<span class="d-block" title="We have direct internet access, no outgoing proxy configured."><b>No</b></span>
{{/unless}}
</dd>
<dt class="col-sm-5">DNS (github.com)
- <span class="badge badge-success d-none" id="dns-success" title="DNS Resolving works!">Ok</span>
- <span class="badge badge-danger d-none" id="dns-warning" title="DNS Resolving failed. Please fix.">Error</span>
+ <span class="badge bg-success d-none" id="dns-success" title="DNS Resolving works!">Ok</span>
+ <span class="badge bg-danger d-none" id="dns-warning" title="DNS Resolving failed. Please fix.">Error</span>
</dt>
<dd class="col-sm-7">
- <span id="dns-resolved">{{diagnostics.dns_resolved}}</span>
+ <span id="dns-resolved">{{page_data.dns_resolved}}</span>
</dd>
<dt class="col-sm-5">Date & Time (Local)</dt>
<dd class="col-sm-7">
- <span><b>Server:</b> {{diagnostics.server_time_local}}</span>
+ <span><b>Server:</b> {{page_data.server_time_local}}</span>
</dd>
<dt class="col-sm-5">Date & Time (UTC)
- <span class="badge badge-success d-none" id="time-success" title="Time offsets seem to be correct.">Ok</span>
- <span class="badge badge-danger d-none" id="time-warning" title="Time offsets are too mouch at drift.">Error</span>
+ <span class="badge bg-success d-none" id="time-success" title="Time offsets seem to be correct.">Ok</span>
+ <span class="badge bg-danger d-none" id="time-warning" title="Time offsets are too mouch at drift.">Error</span>
</dt>
<dd class="col-sm-7">
- <span id="time-server" class="d-block"><b>Server:</b> <span id="time-server-string">{{diagnostics.server_time}}</span></span>
+ <span id="time-server" class="d-block"><b>Server:</b> <span id="time-server-string">{{page_data.server_time}}</span></span>
<span id="time-browser" class="d-block"><b>Browser:</b> <span id="time-browser-string"></span></span>
</dd>
<dt class="col-sm-5">Domain configuration
- <span class="badge badge-success d-none" id="domain-success" title="The domain variable matches the browser location and seems to be configured correctly.">Match</span>
- <span class="badge badge-danger d-none" id="domain-warning" title="The domain variable does not matches the browsers location.
The domain variable does not seem to be configured correctly.
Some features may not work as expected!">No Match</span>
- <span class="badge badge-success d-none" id="https-success" title="Configurued to use HTTPS">HTTPS</span>
- <span class="badge badge-danger d-none" id="https-warning" title="Not configured to use HTTPS.
Some features may not work as expected!">No HTTPS</span>
+ <span class="badge bg-success d-none" id="domain-success" title="The domain variable matches the browser location and seems to be configured correctly.">Match</span>
+ <span class="badge bg-danger d-none" id="domain-warning" title="The domain variable does not matches the browsers location.
The domain variable does not seem to be configured correctly.
Some features may not work as expected!">No Match</span>
+ <span class="badge bg-success d-none" id="https-success" title="Configurued to use HTTPS">HTTPS</span>
+ <span class="badge bg-danger d-none" id="https-warning" title="Not configured to use HTTPS.
Some features may not work as expected!">No HTTPS</span>
</dt>
<dd class="col-sm-7">
- <span id="domain-server" class="d-block"><b>Server:</b> <span id="domain-server-string">{{diagnostics.admin_url}}</span></span>
+ <span id="domain-server" class="d-block"><b>Server:</b> <span id="domain-server-string">{{page_data.admin_url}}</span></span>
<span id="domain-browser" class="d-block"><b>Browser:</b> <span id="domain-browser-string"></span></span>
</dd>
</dl>
@@ -173,10 +182,17 @@
<dt class="col-sm-3">
<button type="button" id="gen-support" class="btn btn-primary" onclick="generateSupportString(); return false;">Generate Support String</button>
<br><br>
- <button type="button" id="copy-support" class="btn btn-info d-none" onclick="copyToClipboard(); return false;">Copy To Clipboard</button>
+ <button type="button" id="copy-support" class="btn btn-info mb-3 d-none" onclick="copyToClipboard(); return false;">Copy To Clipboard</button>
+ <div class="toast-container position-absolute float-start" style="width: 15rem;">
+ <div id="toastClipboardCopy" class="toast fade hide" role="status" aria-live="polite" aria-atomic="true" data-bs-autohide="true" data-bs-delay="1500">
+ <div class="toast-body">
+ Copied to clipboard!
+ </div>
+ </div>
+ </div>
</dt>
<dd class="col-sm-9">
- <pre id="support-string" class="pre-scrollable d-none" style="width: 100%; height: 16em; size: 0.6em; border: 1px solid; padding: 4px;"></pre>
+ <pre id="support-string" class="pre-scrollable d-none w-100 border p-2" style="height: 16rem;"></pre>
</dd>
</dl>
</div>
@@ -185,10 +201,13 @@
</main>
<script>
- dnsCheck = false;
- timeCheck = false;
- domainCheck = false;
- httpsCheck = false;
+ 'use strict';
+
+ var dnsCheck = false;
+ var timeCheck = false;
+ var domainCheck = false;
+ var httpsCheck = false;
+
(() => {
// ================================
// Date & Time Check
@@ -203,7 +222,10 @@
document.getElementById("time-browser-string").innerText = browserUTC;
const serverUTC = document.getElementById("time-server-string").innerText;
- const timeDrift = (Date.parse(serverUTC) - Date.parse(browserUTC)) / 1000;
+ const timeDrift = (
+ Date.parse(serverUTC.replace(' ', 'T').replace(' UTC', '')) -
+ Date.parse(browserUTC.replace(' ', 'T').replace(' UTC', ''))
+ ) / 1000;
if (timeDrift > 30 || timeDrift < -30) {
document.getElementById('time-warning').classList.remove('d-none');
} else {
@@ -233,7 +255,7 @@
const webInstalled = document.getElementById('web-installed').innerText;
checkVersions('server', serverInstalled, serverLatest, serverLatestCommit);
- {{#unless diagnostics.running_within_docker}}
+ {{#unless page_data.running_within_docker}}
const webLatest = document.getElementById('web-latest').innerText;
checkVersions('web', webInstalled, webLatest);
{{/unless}}
@@ -303,30 +325,38 @@
// ================================
// Generate support string to be pasted on github or the forum
async function generateSupportString() {
- supportString = "### Your environment (Generated via diagnostics page)\n";
+ let supportString = "### Your environment (Generated via diagnostics page)\n";
supportString += "* Vaultwarden version: v{{ version }}\n";
- supportString += "* Web-vault version: v{{ diagnostics.web_vault_version }}\n";
- supportString += "* Running within Docker: {{ diagnostics.running_within_docker }}\n";
- supportString += "* Uses a reverse proxy: {{ diagnostics.ip_header_exists }}\n";
- {{#if diagnostics.ip_header_exists}}
- supportString += "* IP Header check: {{ diagnostics.ip_header_match }} ({{ diagnostics.ip_header_name }})\n";
+ supportString += "* Web-vault version: v{{ page_data.web_vault_version }}\n";
+ supportString += "* Running within Docker: {{ page_data.running_within_docker }}\n";
+ supportString += "* Environment settings overridden: ";
+ {{#if page_data.overrides}}
+ supportString += "true\n"
+ {{else}}
+ supportString += "false\n"
+ {{/if}}
+ supportString += "* Uses a reverse proxy: {{ page_data.ip_header_exists }}\n";
+ {{#if page_data.ip_header_exists}}
+ supportString += "* IP Header check: {{ page_data.ip_header_match }} ({{ page_data.ip_header_name }})\n";
{{/if}}
- supportString += "* Internet access: {{ diagnostics.has_http_access }}\n";
- supportString += "* Internet access via a proxy: {{ diagnostics.uses_proxy }}\n";
+ supportString += "* Internet access: {{ page_data.has_http_access }}\n";
+ supportString += "* Internet access via a proxy: {{ page_data.uses_proxy }}\n";
supportString += "* DNS Check: " + dnsCheck + "\n";
supportString += "* Time Check: " + timeCheck + "\n";
supportString += "* Domain Configuration Check: " + domainCheck + "\n";
supportString += "* HTTPS Check: " + httpsCheck + "\n";
- supportString += "* Database type: {{ diagnostics.db_type }}\n";
- supportString += "* Database version: {{ diagnostics.db_version }}\n";
+ supportString += "* Database type: {{ page_data.db_type }}\n";
+ supportString += "* Database version: {{ page_data.db_version }}\n";
supportString += "* Clients used: \n";
supportString += "* Reverse proxy and version: \n";
supportString += "* Other relevant information: \n";
- jsonResponse = await fetch('{{urlpath}}/admin/diagnostics/config');
- configJson = await jsonResponse.json();
- supportString += "\n### Config (Generated via diagnostics page)\n```json\n" + JSON.stringify(configJson, undefined, 2) + "\n```\n";
+ let jsonResponse = await fetch('{{urlpath}}/admin/diagnostics/config');
+ const configJson = await jsonResponse.json();
+ supportString += "\n### Config (Generated via diagnostics page)\n<details><summary>Show Running Config</summary>\n"
+ supportString += "\n**Environment settings which are overridden:** {{page_data.overrides}}\n"
+ supportString += "\n\n```json\n" + JSON.stringify(configJson, undefined, 2) + "\n```\n</details>\n";
document.getElementById('support-string').innerText = supportString;
document.getElementById('support-string').classList.remove('d-none');
@@ -334,16 +364,19 @@
}
function copyToClipboard() {
- const str = document.getElementById('support-string').innerText;
- const el = document.createElement('textarea');
- el.value = str;
- el.setAttribute('readonly', '');
- el.style.position = 'absolute';
- el.style.left = '-9999px';
- document.body.appendChild(el);
- el.select();
+ const supportStr = document.getElementById('support-string').innerText;
+ const tmpCopyEl = document.createElement('textarea');
+
+ tmpCopyEl.setAttribute('id', 'copy-support-string');
+ tmpCopyEl.setAttribute('readonly', '');
+ tmpCopyEl.value = supportStr;
+ tmpCopyEl.style.position = 'absolute';
+ tmpCopyEl.style.left = '-9999px';
+ document.body.appendChild(tmpCopyEl);
+ tmpCopyEl.select();
document.execCommand('copy');
- document.body.removeChild(el);
- }
+ tmpCopyEl.remove();
+ new BSN.Toast('#toastClipboardCopy').show();
+ }
</script>
diff --git a/src/static/templates/admin/organizations.hbs b/src/static/templates/admin/organizations.hbs
@@ -1,7 +1,6 @@
<main class="container-xl">
<div id="organizations-block" class="my-3 p-3 bg-white rounded shadow">
<h6 class="border-bottom pb-2 mb-3">Organizations</h6>
-
<div class="table-responsive-xl small">
<table id="orgs-table" class="table table-sm table-striped table-hover">
<thead>
@@ -10,19 +9,19 @@
<th>Users</th>
<th>Items</th>
<th>Attachments</th>
- <th style="width: 120px; min-width: 120px;">Actions</th>
+ <th style="width: 130px; min-width: 130px;">Actions</th>
</tr>
</thead>
<tbody>
- {{#each organizations}}
+ {{#each page_data}}
<tr>
<td>
- <img class="mr-2 float-left rounded identicon" data-src="{{Id}}">
- <div class="float-left">
+ <img class="float-start me-2 rounded identicon" data-src="{{Id}}">
+ <div class="float-start">
<strong>{{Name}}</strong>
- <span class="mr-2">({{BillingEmail}})</span>
+ <span class="me-2">({{BillingEmail}})</span>
<span class="d-block">
- <span class="badge badge-success">{{Id}}</span>
+ <span class="badge bg-success">{{Id}}</span>
</span>
</div>
</td>
@@ -38,7 +37,7 @@
<span class="d-block"><strong>Size:</strong> {{attachment_size}}</span>
{{/if}}
</td>
- <td style="font-size: 90%; text-align: right; padding-right: 15px">
+ <td class="text-end pe-2 small">
<a class="d-block" href="#" onclick='deleteOrganization({{jsesc Id}}, {{jsesc Name}}, {{jsesc BillingEmail}})'>Delete Organization</a>
</td>
</tr>
@@ -46,14 +45,15 @@
</tbody>
</table>
</div>
-
</div>
</main>
<link rel="stylesheet" href="{{urlpath}}/bwrs_static/datatables.css" />
-<script src="{{urlpath}}/bwrs_static/jquery-3.5.1.slim.js"></script>
+<script src="{{urlpath}}/bwrs_static/jquery-3.6.0.slim.js"></script>
<script src="{{urlpath}}/bwrs_static/datatables.js"></script>
<script>
+ 'use strict';
+
function deleteOrganization(id, name, billing_email) {
// First make sure the user wants to delete this organization
var continueDelete = confirm("WARNING: All data of this organization ("+ name +") will be lost!\nMake sure you have a backup, this cannot be undone!");
@@ -79,7 +79,7 @@
}
})();
- document.addEventListener("DOMContentLoaded", function(event) {
+ document.addEventListener("DOMContentLoaded", function() {
$('#orgs-table').DataTable({
"responsive": true,
"lengthMenu": [ [-1, 5, 10, 25, 50], ["All", 5, 10, 25, 50] ],
diff --git a/src/static/templates/admin/settings.hbs b/src/static/templates/admin/settings.hbs
@@ -3,34 +3,32 @@
<div>
<h6 class="text-white mb-3">Configuration</h6>
<div class="small text-white mb-3">
- NOTE: The settings here override the environment variables. Once saved, it's recommended to stop setting
- them to avoid confusion. This does not apply to the read-only section, which can only be set through the
- environment.
+ <span class="font-weight-bolder">NOTE:</span> The settings here override the environment variables. Once saved, it's recommended to stop setting them to avoid confusion.<br>
+ This does not apply to the read-only section, which can only be set via environment variables.<br>
+ Settings which are overridden are shown with <span class="is-overridden-true">double underscores</span>.
</div>
- <form class="form accordion" id="config-form" onsubmit="saveConfig(); return false;">
+ <form class="form needs-validation" id="config-form" onsubmit="saveConfig(); return false;" novalidate>
{{#each config}}
{{#if groupdoc}}
<div class="card bg-light mb-3">
- <div class="card-header"><button type="button" class="btn btn-link collapsed" data-toggle="collapse"
- data-target="#g_{{group}}">{{groupdoc}}</button></div>
- <div id="g_{{group}}" class="card-body collapse" data-parent="#config-form">
+ <div class="card-header" role="button" data-bs-toggle="collapse" data-bs-target="#g_{{group}}">
+ <button type="button" class="btn btn-link text-decoration-none collapsed" data-bs-toggle="collapse" data-bs-target="#g_{{group}}">{{groupdoc}}</button>
+ </div>
+ <div id="g_{{group}}" class="card-body collapse">
{{#each elements}}
{{#if editable}}
- <div class="form-group row align-items-center" title="[{{name}}] {{doc.description}}">
+ <div class="row my-2 align-items-center is-overridden-{{overridden}}" title="[{{name}}] {{doc.description}}">
{{#case type "text" "number" "password"}}
<label for="input_{{name}}" class="col-sm-3 col-form-label">{{doc.name}}</label>
- <div class="col-sm-8 input-group">
+ <div class="col-sm-8">
+ <div class="input-group">
<input class="form-control conf-{{type}}" id="input_{{name}}" type="{{type}}"
- name="{{name}}" value="{{value}}" {{#if default}} placeholder="Default: {{default}}"
- {{/if}}>
-
+ name="{{name}}" value="{{value}}" {{#if default}} placeholder="Default: {{default}}"{{/if}}>
{{#case type "password"}}
- <div class="input-group-append">
- <button class="btn btn-outline-secondary" type="button"
- onclick="toggleVis('input_{{name}}');">Show/hide</button>
- </div>
+ <button class="btn btn-outline-secondary input-group-text" type="button" onclick="toggleVis('input_{{name}}');">Show/hide</button>
{{/case}}
+ </div>
</div>
{{/case}}
{{#case type "checkbox"}}
@@ -48,13 +46,12 @@
{{/if}}
{{/each}}
{{#case group "smtp"}}
- <div class="form-group row align-items-center pt-3 border-top" title="Send a test email to given email address">
+ <div class="row my-2 align-items-center pt-3 border-top" title="Send a test email to given email address">
<label for="smtp-test-email" class="col-sm-3 col-form-label">Test SMTP</label>
<div class="col-sm-8 input-group">
- <input class="form-control" id="smtp-test-email" type="email" placeholder="Enter test email">
- <div class="input-group-append">
- <button type="button" class="btn btn-outline-primary" onclick="smtpTest(); return false;">Send test email</button>
- </div>
+ <input class="form-control" id="smtp-test-email" type="email" placeholder="Enter test email" required>
+ <button type="button" class="btn btn-outline-primary input-group-text" onclick="smtpTest(); return false;">Send test email</button>
+ <div class="invalid-tooltip">Please provide a valid email address</div>
</div>
</div>
{{/case}}
@@ -64,9 +61,11 @@
{{/each}}
<div class="card bg-light mb-3">
- <div class="card-header"><button type="button" class="btn btn-link collapsed" data-toggle="collapse"
- data-target="#g_readonly">Read-Only Config</button></div>
- <div id="g_readonly" class="card-body collapse" data-parent="#config-form">
+ <div class="card-header" role="button" data-bs-toggle="collapse" data-bs-target="#g_readonly">
+ <button type="button" class="btn btn-link text-decoration-none collapsed" data-bs-toggle="collapse" data-bs-target="#g_readonly">Read-Only Config</button>
+ </div>
+
+ <div id="g_readonly" class="card-body collapse">
<div class="small mb-3">
NOTE: These options can't be modified in the editor because they would require the server
to be restarted. To modify them, you need to set the correct environment variables when
@@ -76,19 +75,17 @@
{{#each config}}
{{#each elements}}
{{#unless editable}}
- <div class="form-group row align-items-center" title="[{{name}}] {{doc.description}}">
+ <div class="row my-2 align-items-center" title="[{{name}}] {{doc.description}}">
{{#case type "text" "number" "password"}}
<label for="input_{{name}}" class="col-sm-3 col-form-label">{{doc.name}}</label>
- <div class="col-sm-8 input-group">
+ <div class="col-sm-8">
+ <div class="input-group">
<input readonly class="form-control" id="input_{{name}}" type="{{type}}"
value="{{value}}" {{#if default}} placeholder="Default: {{default}}" {{/if}}>
-
{{#case type "password"}}
- <div class="input-group-append">
- <button class="btn btn-outline-secondary" type="button"
- onclick="toggleVis('input_{{name}}');">Show/hide</button>
- </div>
+ <button class="btn btn-outline-secondary" type="button" onclick="toggleVis('input_{{name}}');">Show/hide</button>
{{/case}}
+ </div>
</div>
{{/case}}
{{#case type "checkbox"}}
@@ -112,9 +109,10 @@
{{#if can_backup}}
<div class="card bg-light mb-3">
- <div class="card-header"><button type="button" class="btn btn-link collapsed" data-toggle="collapse"
- data-target="#g_database">Backup Database</button></div>
- <div id="g_database" class="card-body collapse" data-parent="#config-form">
+ <div class="card-header" role="button" data-bs-toggle="collapse" data-bs-target="#g_database">
+ <button type="button" class="btn btn-link text-decoration-none collapsed" data-bs-toggle="collapse" data-bs-target="#g_database">Backup Database</button>
+ </div>
+ <div id="g_database" class="card-body collapse">
<div class="small mb-3">
WARNING: This function only creates a backup copy of the SQLite database.
This does not include any configuration or file attachment data that may
@@ -128,7 +126,7 @@
{{/if}}
<button type="submit" class="btn btn-primary">Save</button>
- <button type="button" class="btn btn-danger float-right" onclick="deleteConf();">Reset defaults</button>
+ <button type="button" class="btn btn-danger float-end" onclick="deleteConf();">Reset defaults</button>
</form>
</div>
</div>
@@ -139,16 +137,34 @@
/* Most modern browsers support this now. */
color: orangered;
}
+
+ .is-overridden-true {
+ text-decoration: underline double;
+ }
</style>
<script>
+ 'use strict';
+
function smtpTest() {
if (formHasChanges(config_form)) {
+ event.preventDefault();
+ event.stopPropagation();
alert("Config has been changed but not yet saved.\nPlease save the changes first before sending a test email.");
return false;
}
- test_email = document.getElementById("smtp-test-email");
- data = JSON.stringify({ "email": test_email.value });
+
+ let test_email = document.getElementById("smtp-test-email");
+
+ // Do a very very basic email address check.
+ if (test_email.value.match(/\S+@\S+/i) === null) {
+ test_email.parentElement.classList.add('was-validated');
+ event.preventDefault();
+ event.stopPropagation();
+ return false;
+ }
+
+ const data = JSON.stringify({ "email": test_email.value });
_post("{{urlpath}}/admin/test/smtp/",
"SMTP Test email sent correctly",
"Error sending SMTP test email", data, false);
@@ -157,21 +173,21 @@
function getFormData() {
let data = {};
- document.querySelectorAll(".conf-checkbox").forEach(function (e, i) {
+ document.querySelectorAll(".conf-checkbox").forEach(function (e) {
data[e.name] = e.checked;
});
- document.querySelectorAll(".conf-number").forEach(function (e, i) {
+ document.querySelectorAll(".conf-number").forEach(function (e) {
data[e.name] = e.value ? +e.value : null;
});
- document.querySelectorAll(".conf-text, .conf-password").forEach(function (e, i) {
+ document.querySelectorAll(".conf-text, .conf-password").forEach(function (e) {
data[e.name] = e.value || null;
});
return data;
}
function saveConfig() {
- data = JSON.stringify(getFormData());
+ const data = JSON.stringify(getFormData());
_post("{{urlpath}}/admin/config/", "Config saved correctly",
"Error saving config", data);
return false;
@@ -198,10 +214,10 @@
function masterCheck(check_id, inputs_query) {
function onChanged(checkbox, inputs_query) {
return function _fn() {
- document.querySelectorAll(inputs_query).forEach(function (e, i) { e.disabled = !checkbox.checked; });
+ document.querySelectorAll(inputs_query).forEach(function (e) { e.disabled = !checkbox.checked; });
checkbox.disabled = false;
};
- };
+ }
const checkbox = document.getElementById(check_id);
const onChange = onChanged(checkbox, inputs_query);
@@ -238,7 +254,6 @@
Array.from(risk_el).forEach((el) => {
if (el.innerText.toLowerCase().includes('risks') ) {
el.parentElement.className += ' alert-danger'
- console.log(el)
}
});
}
diff --git a/src/static/templates/admin/users.hbs b/src/static/templates/admin/users.hbs
@@ -7,34 +7,34 @@
<thead>
<tr>
<th>User</th>
- <th style="width:65px; min-width: 65px;">Created at</th>
- <th style="width:70px; min-width: 65px;">Last Active</th>
- <th style="width:35px; min-width: 35px;">Items</th>
+ <th style="width: 85px; min-width: 70px;">Created at</th>
+ <th style="width: 85px; min-width: 70px;">Last Active</th>
+ <th style="width: 35px; min-width: 35px;">Items</th>
<th>Attachments</th>
<th style="min-width: 120px;">Organizations</th>
- <th style="width: 120px; min-width: 120px;">Actions</th>
+ <th style="width: 130px; min-width: 130px;">Actions</th>
</tr>
</thead>
<tbody>
- {{#each users}}
+ {{#each page_data}}
<tr>
<td>
- <img class="float-left mr-2 rounded identicon" data-src="{{Email}}">
- <div class="float-left">
+ <img class="float-start me-2 rounded identicon" data-src="{{Email}}">
+ <div class="float-start">
<strong>{{Name}}</strong>
<span class="d-block">{{Email}}</span>
<span class="d-block">
{{#unless user_enabled}}
- <span class="badge badge-danger mr-2" title="User is disabled">Disabled</span>
+ <span class="badge bg-danger me-2" title="User is disabled">Disabled</span>
{{/unless}}
{{#if TwoFactorEnabled}}
- <span class="badge badge-success mr-2" title="2FA is enabled">2FA</span>
+ <span class="badge bg-success me-2" title="2FA is enabled">2FA</span>
{{/if}}
{{#case _Status 1}}
- <span class="badge badge-warning mr-2" title="User is invited">Invited</span>
+ <span class="badge bg-warning me-2" title="User is invited">Invited</span>
{{/case}}
{{#if EmailVerified}}
- <span class="badge badge-success mr-2" title="Email has been verified">Verified</span>
+ <span class="badge bg-success me-2" title="Email has been verified">Verified</span>
{{/if}}
</span>
</div>
@@ -57,11 +57,11 @@
<td>
<div class="overflow-auto" style="max-height: 120px;">
{{#each Organizations}}
- <button class="badge badge-primary" data-toggle="modal" data-target="#userOrgTypeDialog" data-orgtype="{{Type}}" data-orguuid="{{jsesc Id no_quote}}" data-orgname="{{jsesc Name no_quote}}" data-useremail="{{jsesc ../Email no_quote}}" data-useruuid="{{jsesc ../Id no_quote}}">{{Name}}</button>
+ <button class="badge" data-bs-toggle="modal" data-bs-target="#userOrgTypeDialog" data-orgtype="{{Type}}" data-orguuid="{{jsesc Id no_quote}}" data-orgname="{{jsesc Name no_quote}}" data-useremail="{{jsesc ../Email no_quote}}" data-useruuid="{{jsesc ../Id no_quote}}">{{Name}}</button>
{{/each}}
</div>
</td>
- <td style="font-size: 90%; text-align: right; padding-right: 15px">
+ <td class="text-end pe-2 small">
{{#if TwoFactorEnabled}}
<a class="d-block" href="#" onclick='remove2fa({{jsesc Id}})'>Remove all 2FA</a>
{{/if}}
@@ -85,7 +85,7 @@
Force clients to resync
</button>
- <button type="button" class="btn btn-sm btn-primary float-right" onclick="reload();">Reload users</button>
+ <button type="button" class="btn btn-sm btn-primary float-end" onclick="reload();">Reload users</button>
</div>
</div>
@@ -94,8 +94,8 @@
<h6 class="mb-0 text-white">Invite User</h6>
<small>Email:</small>
- <form class="form-inline" id="invite-form" onsubmit="inviteUser(); return false;">
- <input type="email" class="form-control w-50 mr-2" id="email-invite" placeholder="Enter email">
+ <form class="form-inline input-group w-50" id="invite-form" onsubmit="inviteUser(); return false;">
+ <input type="email" class="form-control me-2" id="email-invite" placeholder="Enter email" required>
<button type="submit" class="btn btn-primary">Invite</button>
</form>
</div>
@@ -106,9 +106,7 @@
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title" id="userOrgTypeDialogTitle"></h6>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">×</span>
- </button>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form class="form" id="userOrgTypeForm" onsubmit="updateUserOrgType(); return false;">
<input type="hidden" name="user_uuid" id="userOrgTypeUserUuid" value="">
@@ -128,7 +126,7 @@
</div>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">Cancel</button>
+ <button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-sm btn-primary">Change Role</button>
</div>
</form>
@@ -138,9 +136,11 @@
</main>
<link rel="stylesheet" href="{{urlpath}}/bwrs_static/datatables.css" />
-<script src="{{urlpath}}/bwrs_static/jquery-3.5.1.slim.js"></script>
+<script src="{{urlpath}}/bwrs_static/jquery-3.6.0.slim.js"></script>
<script src="{{urlpath}}/bwrs_static/datatables.js"></script>
<script>
+ 'use strict';
+
function deleteUser(id, mail) {
var input_mail = prompt("To delete user '" + mail + "', please type the email below")
if (input_mail != null) {
@@ -191,8 +191,8 @@
return false;
}
function inviteUser() {
- inv = document.getElementById("email-invite");
- data = JSON.stringify({ "email": inv.value });
+ const inv = document.getElementById("email-invite");
+ const data = JSON.stringify({ "email": inv.value });
inv.value = "";
_post("{{urlpath}}/admin/invite/", "User invited correctly",
"Error inviting user", data);
@@ -212,7 +212,7 @@
}
})();
- document.querySelectorAll("[data-orgtype]").forEach(function (e, i) {
+ document.querySelectorAll("[data-orgtype]").forEach(function (e) {
let orgtype = OrgTypes[e.dataset.orgtype];
e.style.backgroundColor = orgtype.color;
e.title = orgtype.name;
@@ -225,7 +225,7 @@
let sortDate = a.replace(/(<([^>]+)>)/gi, "").trim();
if ( sortDate !== '' ) {
let dtParts = sortDate.split(' ');
- var timeParts = (undefined != dtParts[1]) ? dtParts[1].split(':') : [00,00,00];
+ var timeParts = (undefined != dtParts[1]) ? dtParts[1].split(':') : ['00','00','00'];
var dateParts = dtParts[0].split('-');
x = (dateParts[0] + dateParts[1] + dateParts[2] + timeParts[0] + timeParts[1] + ((undefined != timeParts[2]) ? timeParts[2] : 0)) * 1;
if ( isNaN(x) ) {
@@ -246,7 +246,7 @@
}
});
- document.addEventListener("DOMContentLoaded", function(event) {
+ document.addEventListener("DOMContentLoaded", function() {
$('#users-table').DataTable({
"responsive": true,
"lengthMenu": [ [-1, 5, 10, 25, 50], ["All", 5, 10, 25, 50] ],
@@ -275,7 +275,7 @@
}, false);
// Prevent accidental submission of the form with valid elements after the modal has been hidden.
- userOrgTypeDialog.addEventListener('hide.bs.modal', function(event){
+ userOrgTypeDialog.addEventListener('hide.bs.modal', function(){
document.getElementById("userOrgTypeDialogTitle").innerHTML = '';
document.getElementById("userOrgTypeUserUuid").value = '';
document.getElementById("userOrgTypeOrgUuid").value = '';