`s.
-
-.nav {
- // scss-docs-start nav-css-vars
- --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};
- --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};
- @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);
- --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
- --#{$prefix}nav-link-color: #{$nav-link-color};
- --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};
- --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};
- // scss-docs-end nav-css-vars
-
- display: flex;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-
-.nav-link {
- display: block;
- padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);
- @include font-size(var(--#{$prefix}nav-link-font-size));
- font-weight: var(--#{$prefix}nav-link-font-weight);
- color: var(--#{$prefix}nav-link-color);
- text-decoration: if($link-decoration == none, null, none);
- background: none;
- border: 0;
- @include transition($nav-link-transition);
-
- &:hover,
- &:focus {
- color: var(--#{$prefix}nav-link-hover-color);
- text-decoration: if($link-hover-decoration == underline, none, null);
- }
-
- &:focus-visible {
- outline: 0;
- box-shadow: $nav-link-focus-box-shadow;
- }
-
- // Disabled state lightens text
- &.disabled,
- &:disabled {
- color: var(--#{$prefix}nav-link-disabled-color);
- pointer-events: none;
- cursor: default;
- }
-}
-
-//
-// Tabs
-//
-
-.nav-tabs {
- // scss-docs-start nav-tabs-css-vars
- --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};
- --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};
- --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};
- --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};
- --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};
- --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};
- --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};
- // scss-docs-end nav-tabs-css-vars
-
- border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);
-
- .nav-link {
- margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list
- border: var(--#{$prefix}nav-tabs-border-width) solid transparent;
- @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));
-
- &:hover,
- &:focus {
- // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
- isolation: isolate;
- border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);
- }
- }
-
- .nav-link.active,
- .nav-item.show .nav-link {
- color: var(--#{$prefix}nav-tabs-link-active-color);
- background-color: var(--#{$prefix}nav-tabs-link-active-bg);
- border-color: var(--#{$prefix}nav-tabs-link-active-border-color);
- }
-
- .dropdown-menu {
- // Make dropdown border overlap tab border
- margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list
- // Remove the top rounded corners here since there is a hard edge above the menu
- @include border-top-radius(0);
- }
-}
-
-
-//
-// Pills
-//
-
-.nav-pills {
- // scss-docs-start nav-pills-css-vars
- --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};
- --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};
- --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};
- // scss-docs-end nav-pills-css-vars
-
- .nav-link {
- @include border-radius(var(--#{$prefix}nav-pills-border-radius));
- }
-
- .nav-link.active,
- .show > .nav-link {
- color: var(--#{$prefix}nav-pills-link-active-color);
- @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));
- }
-}
-
-
-//
-// Underline
-//
-
-.nav-underline {
- // scss-docs-start nav-underline-css-vars
- --#{$prefix}nav-underline-gap: #{$nav-underline-gap};
- --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};
- --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};
- // scss-docs-end nav-underline-css-vars
-
- gap: var(--#{$prefix}nav-underline-gap);
-
- .nav-link {
- padding-right: 0;
- padding-left: 0;
- border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;
-
- &:hover,
- &:focus {
- border-bottom-color: currentcolor;
- }
- }
-
- .nav-link.active,
- .show > .nav-link {
- font-weight: $font-weight-bold;
- color: var(--#{$prefix}nav-underline-link-active-color);
- border-bottom-color: currentcolor;
- }
-}
-
-
-//
-// Justified variants
-//
-
-.nav-fill {
- > .nav-link,
- .nav-item {
- flex: 1 1 auto;
- text-align: center;
- }
-}
-
-.nav-justified {
- > .nav-link,
- .nav-item {
- flex-grow: 1;
- flex-basis: 0;
- text-align: center;
- }
-}
-
-.nav-fill,
-.nav-justified {
- .nav-item .nav-link {
- width: 100%; // Make sure button will grow
- }
-}
-
-
-// Tabbable tabs
-//
-// Hide tabbable panes to start, show them when `.active`
-
-.tab-content {
- > .tab-pane {
- display: none;
- }
- > .active {
- display: block;
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_navbar.scss b/publish/wwwroot/lib/bootstrap/scss/_navbar.scss
deleted file mode 100644
index 86aa441..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_navbar.scss
+++ /dev/null
@@ -1,289 +0,0 @@
-// Navbar
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
- // scss-docs-start navbar-css-vars
- --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};
- --#{$prefix}navbar-padding-y: #{$navbar-padding-y};
- --#{$prefix}navbar-color: #{$navbar-light-color};
- --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};
- --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};
- --#{$prefix}navbar-active-color: #{$navbar-light-active-color};
- --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};
- --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};
- --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};
- --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};
- --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};
- --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};
- --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};
- --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};
- --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};
- --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};
- --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};
- --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};
- --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};
- --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};
- // scss-docs-end navbar-css-vars
-
- position: relative;
- display: flex;
- flex-wrap: wrap; // allow us to do the line break for collapsing content
- align-items: center;
- justify-content: space-between; // space out brand from logo
- padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);
- @include gradient-bg();
-
- // Because flex properties aren't inherited, we need to redeclare these first
- // few properties so that content nested within behave properly.
- // The `flex-wrap` property is inherited to simplify the expanded navbars
- %container-flex-properties {
- display: flex;
- flex-wrap: inherit;
- align-items: center;
- justify-content: space-between;
- }
-
- > .container,
- > .container-fluid {
- @extend %container-flex-properties;
- }
-
- @each $breakpoint, $container-max-width in $container-max-widths {
- > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {
- @extend %container-flex-properties;
- }
- }
-}
-
-
-// Navbar brand
-//
-// Used for brand, project, or site names.
-
-.navbar-brand {
- padding-top: var(--#{$prefix}navbar-brand-padding-y);
- padding-bottom: var(--#{$prefix}navbar-brand-padding-y);
- margin-right: var(--#{$prefix}navbar-brand-margin-end);
- @include font-size(var(--#{$prefix}navbar-brand-font-size));
- color: var(--#{$prefix}navbar-brand-color);
- text-decoration: if($link-decoration == none, null, none);
- white-space: nowrap;
-
- &:hover,
- &:focus {
- color: var(--#{$prefix}navbar-brand-hover-color);
- text-decoration: if($link-hover-decoration == underline, none, null);
- }
-}
-
-
-// Navbar nav
-//
-// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
-
-.navbar-nav {
- // scss-docs-start navbar-nav-css-vars
- --#{$prefix}nav-link-padding-x: 0;
- --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};
- @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);
- --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
- --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);
- --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);
- --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);
- // scss-docs-end navbar-nav-css-vars
-
- display: flex;
- flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-
- .nav-link {
- &.active,
- &.show {
- color: var(--#{$prefix}navbar-active-color);
- }
- }
-
- .dropdown-menu {
- position: static;
- }
-}
-
-
-// Navbar text
-//
-//
-
-.navbar-text {
- padding-top: $nav-link-padding-y;
- padding-bottom: $nav-link-padding-y;
- color: var(--#{$prefix}navbar-color);
-
- a,
- a:hover,
- a:focus {
- color: var(--#{$prefix}navbar-active-color);
- }
-}
-
-
-// Responsive navbar
-//
-// Custom styles for responsive collapsing and toggling of navbar contents.
-// Powered by the collapse Bootstrap JavaScript plugin.
-
-// When collapsed, prevent the toggleable navbar contents from appearing in
-// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
-// on the `.navbar` parent.
-.navbar-collapse {
- flex-grow: 1;
- flex-basis: 100%;
- // For always expanded or extra full navbars, ensure content aligns itself
- // properly vertically. Can be easily overridden with flex utilities.
- align-items: center;
-}
-
-// Button for toggling the navbar when in its collapsed state
-.navbar-toggler {
- padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);
- @include font-size(var(--#{$prefix}navbar-toggler-font-size));
- line-height: 1;
- color: var(--#{$prefix}navbar-color);
- background-color: transparent; // remove default button style
- border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style
- @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));
- @include transition(var(--#{$prefix}navbar-toggler-transition));
-
- &:hover {
- text-decoration: none;
- }
-
- &:focus {
- text-decoration: none;
- outline: 0;
- box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);
- }
-}
-
-// Keep as a separate element so folks can easily override it with another icon
-// or image file as needed.
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- background-image: var(--#{$prefix}navbar-toggler-icon-bg);
- background-repeat: no-repeat;
- background-position: center;
- background-size: 100%;
-}
-
-.navbar-nav-scroll {
- max-height: var(--#{$prefix}scroll-height, 75vh);
- overflow-y: auto;
-}
-
-// scss-docs-start navbar-expand-loop
-// Generate series of `.navbar-expand-*` responsive classes for configuring
-// where your navbar collapses.
-.navbar-expand {
- @each $breakpoint in map-keys($grid-breakpoints) {
- $next: breakpoint-next($breakpoint, $grid-breakpoints);
- $infix: breakpoint-infix($next, $grid-breakpoints);
-
- // stylelint-disable-next-line scss/selector-no-union-class-name
- {$infix} {
- @include media-breakpoint-up($next) {
- flex-wrap: nowrap;
- justify-content: flex-start;
-
- .navbar-nav {
- flex-direction: row;
-
- .dropdown-menu {
- position: absolute;
- }
-
- .nav-link {
- padding-right: var(--#{$prefix}navbar-nav-link-padding-x);
- padding-left: var(--#{$prefix}navbar-nav-link-padding-x);
- }
- }
-
- .navbar-nav-scroll {
- overflow: visible;
- }
-
- .navbar-collapse {
- display: flex !important; // stylelint-disable-line declaration-no-important
- flex-basis: auto;
- }
-
- .navbar-toggler {
- display: none;
- }
-
- .offcanvas {
- // stylelint-disable declaration-no-important
- position: static;
- z-index: auto;
- flex-grow: 1;
- width: auto !important;
- height: auto !important;
- visibility: visible !important;
- background-color: transparent !important;
- border: 0 !important;
- transform: none !important;
- @include box-shadow(none);
- @include transition(none);
- // stylelint-enable declaration-no-important
-
- .offcanvas-header {
- display: none;
- }
-
- .offcanvas-body {
- display: flex;
- flex-grow: 0;
- padding: 0;
- overflow-y: visible;
- }
- }
- }
- }
- }
-}
-// scss-docs-end navbar-expand-loop
-
-// Navbar themes
-//
-// Styles for switching between navbars with light or dark background.
-
-.navbar-light {
- @include deprecate("`.navbar-light`", "v5.2.0", "v6.0.0", true);
-}
-
-.navbar-dark,
-.navbar[data-bs-theme="dark"] {
- // scss-docs-start navbar-dark-css-vars
- --#{$prefix}navbar-color: #{$navbar-dark-color};
- --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};
- --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};
- --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};
- --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};
- --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};
- --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};
- --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};
- // scss-docs-end navbar-dark-css-vars
-}
-
-@if $enable-dark-mode {
- @include color-mode(dark) {
- .navbar-toggler-icon {
- --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_offcanvas.scss b/publish/wwwroot/lib/bootstrap/scss/_offcanvas.scss
deleted file mode 100644
index b40b2cd..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_offcanvas.scss
+++ /dev/null
@@ -1,147 +0,0 @@
-// stylelint-disable function-disallowed-list
-
-%offcanvas-css-vars {
- // scss-docs-start offcanvas-css-vars
- --#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};
- --#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};
- --#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};
- --#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};
- --#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};
- --#{$prefix}offcanvas-color: #{$offcanvas-color};
- --#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};
- --#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};
- --#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};
- --#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};
- --#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out};
- --#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height};
- // scss-docs-end offcanvas-css-vars
-}
-
-@each $breakpoint in map-keys($grid-breakpoints) {
- $next: breakpoint-next($breakpoint, $grid-breakpoints);
- $infix: breakpoint-infix($next, $grid-breakpoints);
-
- .offcanvas#{$infix} {
- @extend %offcanvas-css-vars;
- }
-}
-
-@each $breakpoint in map-keys($grid-breakpoints) {
- $next: breakpoint-next($breakpoint, $grid-breakpoints);
- $infix: breakpoint-infix($next, $grid-breakpoints);
-
- .offcanvas#{$infix} {
- @include media-breakpoint-down($next) {
- position: fixed;
- bottom: 0;
- z-index: var(--#{$prefix}offcanvas-zindex);
- display: flex;
- flex-direction: column;
- max-width: 100%;
- color: var(--#{$prefix}offcanvas-color);
- visibility: hidden;
- background-color: var(--#{$prefix}offcanvas-bg);
- background-clip: padding-box;
- outline: 0;
- @include box-shadow(var(--#{$prefix}offcanvas-box-shadow));
- @include transition(var(--#{$prefix}offcanvas-transition));
-
- &.offcanvas-start {
- top: 0;
- left: 0;
- width: var(--#{$prefix}offcanvas-width);
- border-right: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);
- transform: translateX(-100%);
- }
-
- &.offcanvas-end {
- top: 0;
- right: 0;
- width: var(--#{$prefix}offcanvas-width);
- border-left: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);
- transform: translateX(100%);
- }
-
- &.offcanvas-top {
- top: 0;
- right: 0;
- left: 0;
- height: var(--#{$prefix}offcanvas-height);
- max-height: 100%;
- border-bottom: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);
- transform: translateY(-100%);
- }
-
- &.offcanvas-bottom {
- right: 0;
- left: 0;
- height: var(--#{$prefix}offcanvas-height);
- max-height: 100%;
- border-top: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);
- transform: translateY(100%);
- }
-
- &.showing,
- &.show:not(.hiding) {
- transform: none;
- }
-
- &.showing,
- &.hiding,
- &.show {
- visibility: visible;
- }
- }
-
- @if not ($infix == "") {
- @include media-breakpoint-up($next) {
- --#{$prefix}offcanvas-height: auto;
- --#{$prefix}offcanvas-border-width: 0;
- background-color: transparent !important; // stylelint-disable-line declaration-no-important
-
- .offcanvas-header {
- display: none;
- }
-
- .offcanvas-body {
- display: flex;
- flex-grow: 0;
- padding: 0;
- overflow-y: visible;
- // Reset `background-color` in case `.bg-*` classes are used in offcanvas
- background-color: transparent !important; // stylelint-disable-line declaration-no-important
- }
- }
- }
- }
-}
-
-.offcanvas-backdrop {
- @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);
-}
-
-.offcanvas-header {
- display: flex;
- align-items: center;
- padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);
-
- .btn-close {
- padding: calc(var(--#{$prefix}offcanvas-padding-y) * .5) calc(var(--#{$prefix}offcanvas-padding-x) * .5);
- // Split properties to avoid invalid calc() function if value is 0
- margin-top: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));
- margin-right: calc(-.5 * var(--#{$prefix}offcanvas-padding-x));
- margin-bottom: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));
- margin-left: auto;
- }
-}
-
-.offcanvas-title {
- margin-bottom: 0;
- line-height: var(--#{$prefix}offcanvas-title-line-height);
-}
-
-.offcanvas-body {
- flex-grow: 1;
- padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);
- overflow-y: auto;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_pagination.scss b/publish/wwwroot/lib/bootstrap/scss/_pagination.scss
deleted file mode 100644
index 9f09694..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_pagination.scss
+++ /dev/null
@@ -1,109 +0,0 @@
-.pagination {
- // scss-docs-start pagination-css-vars
- --#{$prefix}pagination-padding-x: #{$pagination-padding-x};
- --#{$prefix}pagination-padding-y: #{$pagination-padding-y};
- @include rfs($pagination-font-size, --#{$prefix}pagination-font-size);
- --#{$prefix}pagination-color: #{$pagination-color};
- --#{$prefix}pagination-bg: #{$pagination-bg};
- --#{$prefix}pagination-border-width: #{$pagination-border-width};
- --#{$prefix}pagination-border-color: #{$pagination-border-color};
- --#{$prefix}pagination-border-radius: #{$pagination-border-radius};
- --#{$prefix}pagination-hover-color: #{$pagination-hover-color};
- --#{$prefix}pagination-hover-bg: #{$pagination-hover-bg};
- --#{$prefix}pagination-hover-border-color: #{$pagination-hover-border-color};
- --#{$prefix}pagination-focus-color: #{$pagination-focus-color};
- --#{$prefix}pagination-focus-bg: #{$pagination-focus-bg};
- --#{$prefix}pagination-focus-box-shadow: #{$pagination-focus-box-shadow};
- --#{$prefix}pagination-active-color: #{$pagination-active-color};
- --#{$prefix}pagination-active-bg: #{$pagination-active-bg};
- --#{$prefix}pagination-active-border-color: #{$pagination-active-border-color};
- --#{$prefix}pagination-disabled-color: #{$pagination-disabled-color};
- --#{$prefix}pagination-disabled-bg: #{$pagination-disabled-bg};
- --#{$prefix}pagination-disabled-border-color: #{$pagination-disabled-border-color};
- // scss-docs-end pagination-css-vars
-
- display: flex;
- @include list-unstyled();
-}
-
-.page-link {
- position: relative;
- display: block;
- padding: var(--#{$prefix}pagination-padding-y) var(--#{$prefix}pagination-padding-x);
- @include font-size(var(--#{$prefix}pagination-font-size));
- color: var(--#{$prefix}pagination-color);
- text-decoration: if($link-decoration == none, null, none);
- background-color: var(--#{$prefix}pagination-bg);
- border: var(--#{$prefix}pagination-border-width) solid var(--#{$prefix}pagination-border-color);
- @include transition($pagination-transition);
-
- &:hover {
- z-index: 2;
- color: var(--#{$prefix}pagination-hover-color);
- text-decoration: if($link-hover-decoration == underline, none, null);
- background-color: var(--#{$prefix}pagination-hover-bg);
- border-color: var(--#{$prefix}pagination-hover-border-color);
- }
-
- &:focus {
- z-index: 3;
- color: var(--#{$prefix}pagination-focus-color);
- background-color: var(--#{$prefix}pagination-focus-bg);
- outline: $pagination-focus-outline;
- box-shadow: var(--#{$prefix}pagination-focus-box-shadow);
- }
-
- &.active,
- .active > & {
- z-index: 3;
- color: var(--#{$prefix}pagination-active-color);
- @include gradient-bg(var(--#{$prefix}pagination-active-bg));
- border-color: var(--#{$prefix}pagination-active-border-color);
- }
-
- &.disabled,
- .disabled > & {
- color: var(--#{$prefix}pagination-disabled-color);
- pointer-events: none;
- background-color: var(--#{$prefix}pagination-disabled-bg);
- border-color: var(--#{$prefix}pagination-disabled-border-color);
- }
-}
-
-.page-item {
- &:not(:first-child) .page-link {
- margin-left: $pagination-margin-start;
- }
-
- @if $pagination-margin-start == calc(-1 * #{$pagination-border-width}) {
- &:first-child {
- .page-link {
- @include border-start-radius(var(--#{$prefix}pagination-border-radius));
- }
- }
-
- &:last-child {
- .page-link {
- @include border-end-radius(var(--#{$prefix}pagination-border-radius));
- }
- }
- } @else {
- // Add border-radius to all pageLinks in case they have left margin
- .page-link {
- @include border-radius(var(--#{$prefix}pagination-border-radius));
- }
- }
-}
-
-
-//
-// Sizing
-//
-
-.pagination-lg {
- @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);
-}
-
-.pagination-sm {
- @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_placeholders.scss b/publish/wwwroot/lib/bootstrap/scss/_placeholders.scss
deleted file mode 100644
index 6e32e1c..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_placeholders.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-.placeholder {
- display: inline-block;
- min-height: 1em;
- vertical-align: middle;
- cursor: wait;
- background-color: currentcolor;
- opacity: $placeholder-opacity-max;
-
- &.btn::before {
- display: inline-block;
- content: "";
- }
-}
-
-// Sizing
-.placeholder-xs {
- min-height: .6em;
-}
-
-.placeholder-sm {
- min-height: .8em;
-}
-
-.placeholder-lg {
- min-height: 1.2em;
-}
-
-// Animation
-.placeholder-glow {
- .placeholder {
- animation: placeholder-glow 2s ease-in-out infinite;
- }
-}
-
-@keyframes placeholder-glow {
- 50% {
- opacity: $placeholder-opacity-min;
- }
-}
-
-.placeholder-wave {
- mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);
- mask-size: 200% 100%;
- animation: placeholder-wave 2s linear infinite;
-}
-
-@keyframes placeholder-wave {
- 100% {
- mask-position: -200% 0%;
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_popover.scss b/publish/wwwroot/lib/bootstrap/scss/_popover.scss
deleted file mode 100644
index 7b69f62..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_popover.scss
+++ /dev/null
@@ -1,196 +0,0 @@
-.popover {
- // scss-docs-start popover-css-vars
- --#{$prefix}popover-zindex: #{$zindex-popover};
- --#{$prefix}popover-max-width: #{$popover-max-width};
- @include rfs($popover-font-size, --#{$prefix}popover-font-size);
- --#{$prefix}popover-bg: #{$popover-bg};
- --#{$prefix}popover-border-width: #{$popover-border-width};
- --#{$prefix}popover-border-color: #{$popover-border-color};
- --#{$prefix}popover-border-radius: #{$popover-border-radius};
- --#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};
- --#{$prefix}popover-box-shadow: #{$popover-box-shadow};
- --#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};
- --#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};
- @include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);
- --#{$prefix}popover-header-color: #{$popover-header-color};
- --#{$prefix}popover-header-bg: #{$popover-header-bg};
- --#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};
- --#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};
- --#{$prefix}popover-body-color: #{$popover-body-color};
- --#{$prefix}popover-arrow-width: #{$popover-arrow-width};
- --#{$prefix}popover-arrow-height: #{$popover-arrow-height};
- --#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);
- // scss-docs-end popover-css-vars
-
- z-index: var(--#{$prefix}popover-zindex);
- display: block;
- max-width: var(--#{$prefix}popover-max-width);
- // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
- // So reset our font and text properties to avoid inheriting weird values.
- @include reset-text();
- @include font-size(var(--#{$prefix}popover-font-size));
- // Allow breaking very long words so they don't overflow the popover's bounds
- word-wrap: break-word;
- background-color: var(--#{$prefix}popover-bg);
- background-clip: padding-box;
- border: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);
- @include border-radius(var(--#{$prefix}popover-border-radius));
- @include box-shadow(var(--#{$prefix}popover-box-shadow));
-
- .popover-arrow {
- display: block;
- width: var(--#{$prefix}popover-arrow-width);
- height: var(--#{$prefix}popover-arrow-height);
-
- &::before,
- &::after {
- position: absolute;
- display: block;
- content: "";
- border-color: transparent;
- border-style: solid;
- border-width: 0;
- }
- }
-}
-
-.bs-popover-top {
- > .popover-arrow {
- bottom: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list
-
- &::before,
- &::after {
- border-width: var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list
- }
-
- &::before {
- bottom: 0;
- border-top-color: var(--#{$prefix}popover-arrow-border);
- }
-
- &::after {
- bottom: var(--#{$prefix}popover-border-width);
- border-top-color: var(--#{$prefix}popover-bg);
- }
- }
-}
-
-/* rtl:begin:ignore */
-.bs-popover-end {
- > .popover-arrow {
- left: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list
- width: var(--#{$prefix}popover-arrow-height);
- height: var(--#{$prefix}popover-arrow-width);
-
- &::before,
- &::after {
- border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list
- }
-
- &::before {
- left: 0;
- border-right-color: var(--#{$prefix}popover-arrow-border);
- }
-
- &::after {
- left: var(--#{$prefix}popover-border-width);
- border-right-color: var(--#{$prefix}popover-bg);
- }
- }
-}
-
-/* rtl:end:ignore */
-
-.bs-popover-bottom {
- > .popover-arrow {
- top: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list
-
- &::before,
- &::after {
- border-width: 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list
- }
-
- &::before {
- top: 0;
- border-bottom-color: var(--#{$prefix}popover-arrow-border);
- }
-
- &::after {
- top: var(--#{$prefix}popover-border-width);
- border-bottom-color: var(--#{$prefix}popover-bg);
- }
- }
-
- // This will remove the popover-header's border just below the arrow
- .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: var(--#{$prefix}popover-arrow-width);
- margin-left: calc(-.5 * var(--#{$prefix}popover-arrow-width)); // stylelint-disable-line function-disallowed-list
- content: "";
- border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-header-bg);
- }
-}
-
-/* rtl:begin:ignore */
-.bs-popover-start {
- > .popover-arrow {
- right: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list
- width: var(--#{$prefix}popover-arrow-height);
- height: var(--#{$prefix}popover-arrow-width);
-
- &::before,
- &::after {
- border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list
- }
-
- &::before {
- right: 0;
- border-left-color: var(--#{$prefix}popover-arrow-border);
- }
-
- &::after {
- right: var(--#{$prefix}popover-border-width);
- border-left-color: var(--#{$prefix}popover-bg);
- }
- }
-}
-
-/* rtl:end:ignore */
-
-.bs-popover-auto {
- &[data-popper-placement^="top"] {
- @extend .bs-popover-top;
- }
- &[data-popper-placement^="right"] {
- @extend .bs-popover-end;
- }
- &[data-popper-placement^="bottom"] {
- @extend .bs-popover-bottom;
- }
- &[data-popper-placement^="left"] {
- @extend .bs-popover-start;
- }
-}
-
-// Offset the popover to account for the popover arrow
-.popover-header {
- padding: var(--#{$prefix}popover-header-padding-y) var(--#{$prefix}popover-header-padding-x);
- margin-bottom: 0; // Reset the default from Reboot
- @include font-size(var(--#{$prefix}popover-header-font-size));
- color: var(--#{$prefix}popover-header-color);
- background-color: var(--#{$prefix}popover-header-bg);
- border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);
- @include border-top-radius(var(--#{$prefix}popover-inner-border-radius));
-
- &:empty {
- display: none;
- }
-}
-
-.popover-body {
- padding: var(--#{$prefix}popover-body-padding-y) var(--#{$prefix}popover-body-padding-x);
- color: var(--#{$prefix}popover-body-color);
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_progress.scss b/publish/wwwroot/lib/bootstrap/scss/_progress.scss
deleted file mode 100644
index 732365c..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_progress.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-// Disable animation if transitions are disabled
-
-// scss-docs-start progress-keyframes
-@if $enable-transitions {
- @keyframes progress-bar-stripes {
- 0% { background-position-x: var(--#{$prefix}progress-height); }
- }
-}
-// scss-docs-end progress-keyframes
-
-.progress,
-.progress-stacked {
- // scss-docs-start progress-css-vars
- --#{$prefix}progress-height: #{$progress-height};
- @include rfs($progress-font-size, --#{$prefix}progress-font-size);
- --#{$prefix}progress-bg: #{$progress-bg};
- --#{$prefix}progress-border-radius: #{$progress-border-radius};
- --#{$prefix}progress-box-shadow: #{$progress-box-shadow};
- --#{$prefix}progress-bar-color: #{$progress-bar-color};
- --#{$prefix}progress-bar-bg: #{$progress-bar-bg};
- --#{$prefix}progress-bar-transition: #{$progress-bar-transition};
- // scss-docs-end progress-css-vars
-
- display: flex;
- height: var(--#{$prefix}progress-height);
- overflow: hidden; // force rounded corners by cropping it
- @include font-size(var(--#{$prefix}progress-font-size));
- background-color: var(--#{$prefix}progress-bg);
- @include border-radius(var(--#{$prefix}progress-border-radius));
- @include box-shadow(var(--#{$prefix}progress-box-shadow));
-}
-
-.progress-bar {
- display: flex;
- flex-direction: column;
- justify-content: center;
- overflow: hidden;
- color: var(--#{$prefix}progress-bar-color);
- text-align: center;
- white-space: nowrap;
- background-color: var(--#{$prefix}progress-bar-bg);
- @include transition(var(--#{$prefix}progress-bar-transition));
-}
-
-.progress-bar-striped {
- @include gradient-striped();
- background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height);
-}
-
-.progress-stacked > .progress {
- overflow: visible;
-}
-
-.progress-stacked > .progress > .progress-bar {
- width: 100%;
-}
-
-@if $enable-transitions {
- .progress-bar-animated {
- animation: $progress-bar-animation-timing progress-bar-stripes;
-
- @if $enable-reduced-motion {
- @media (prefers-reduced-motion: reduce) {
- animation: none;
- }
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_reboot.scss b/publish/wwwroot/lib/bootstrap/scss/_reboot.scss
deleted file mode 100644
index 524645f..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_reboot.scss
+++ /dev/null
@@ -1,617 +0,0 @@
-// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
-
-
-// Reboot
-//
-// Normalization of HTML elements, manually forked from Normalize.css to remove
-// styles targeting irrelevant browsers while applying new styles.
-//
-// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
-
-// Document
-//
-// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-
-// Root
-//
-// Ability to the value of the root font sizes, affecting the value of `rem`.
-// null by default, thus nothing is generated.
-
-:root {
- @if $font-size-root != null {
- @include font-size(var(--#{$prefix}root-font-size));
- }
-
- @if $enable-smooth-scroll {
- @media (prefers-reduced-motion: no-preference) {
- scroll-behavior: smooth;
- }
- }
-}
-
-
-// Body
-//
-// 1. Remove the margin in all browsers.
-// 2. As a best practice, apply a default `background-color`.
-// 3. Prevent adjustments of font size after orientation changes in iOS.
-// 4. Change the default tap highlight to be completely transparent in iOS.
-
-// scss-docs-start reboot-body-rules
-body {
- margin: 0; // 1
- font-family: var(--#{$prefix}body-font-family);
- @include font-size(var(--#{$prefix}body-font-size));
- font-weight: var(--#{$prefix}body-font-weight);
- line-height: var(--#{$prefix}body-line-height);
- color: var(--#{$prefix}body-color);
- text-align: var(--#{$prefix}body-text-align);
- background-color: var(--#{$prefix}body-bg); // 2
- -webkit-text-size-adjust: 100%; // 3
- -webkit-tap-highlight-color: rgba($black, 0); // 4
-}
-// scss-docs-end reboot-body-rules
-
-
-// Content grouping
-//
-// 1. Reset Firefox's gray color
-
-hr {
- margin: $hr-margin-y 0;
- color: $hr-color; // 1
- border: 0;
- border-top: $hr-border-width solid $hr-border-color;
- opacity: $hr-opacity;
-}
-
-
-// Typography
-//
-// 1. Remove top margins from headings
-// By default, ``-`` all receive top and bottom margins. We nuke the top
-// margin for easier control within type scales as it avoids margin collapsing.
-
-%heading {
- margin-top: 0; // 1
- margin-bottom: $headings-margin-bottom;
- font-family: $headings-font-family;
- font-style: $headings-font-style;
- font-weight: $headings-font-weight;
- line-height: $headings-line-height;
- color: var(--#{$prefix}heading-color);
-}
-
-h1 {
- @extend %heading;
- @include font-size($h1-font-size);
-}
-
-h2 {
- @extend %heading;
- @include font-size($h2-font-size);
-}
-
-h3 {
- @extend %heading;
- @include font-size($h3-font-size);
-}
-
-h4 {
- @extend %heading;
- @include font-size($h4-font-size);
-}
-
-h5 {
- @extend %heading;
- @include font-size($h5-font-size);
-}
-
-h6 {
- @extend %heading;
- @include font-size($h6-font-size);
-}
-
-
-// Reset margins on paragraphs
-//
-// Similarly, the top margin on ` `s get reset. However, we also reset the
-// bottom margin to use `rem` units instead of `em`.
-
-p {
- margin-top: 0;
- margin-bottom: $paragraph-margin-bottom;
-}
-
-
-// Abbreviations
-//
-// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.
-// 2. Add explicit cursor to indicate changed behavior.
-// 3. Prevent the text-decoration to be skipped.
-
-abbr[title] {
- text-decoration: underline dotted; // 1
- cursor: help; // 2
- text-decoration-skip-ink: none; // 3
-}
-
-
-// Address
-
-address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
-}
-
-
-// Lists
-
-ol,
-ul {
- padding-left: 2rem;
-}
-
-ol,
-ul,
-dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
- margin-bottom: 0;
-}
-
-dt {
- font-weight: $dt-font-weight;
-}
-
-// 1. Undo browser default
-
-dd {
- margin-bottom: .5rem;
- margin-left: 0; // 1
-}
-
-
-// Blockquote
-
-blockquote {
- margin: 0 0 1rem;
-}
-
-
-// Strong
-//
-// Add the correct font weight in Chrome, Edge, and Safari
-
-b,
-strong {
- font-weight: $font-weight-bolder;
-}
-
-
-// Small
-//
-// Add the correct font size in all browsers
-
-small {
- @include font-size($small-font-size);
-}
-
-
-// Mark
-
-mark {
- padding: $mark-padding;
- color: var(--#{$prefix}highlight-color);
- background-color: var(--#{$prefix}highlight-bg);
-}
-
-
-// Sub and Sup
-//
-// Prevent `sub` and `sup` elements from affecting the line height in
-// all browsers.
-
-sub,
-sup {
- position: relative;
- @include font-size($sub-sup-font-size);
- line-height: 0;
- vertical-align: baseline;
-}
-
-sub { bottom: -.25em; }
-sup { top: -.5em; }
-
-
-// Links
-
-a {
- color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));
- text-decoration: $link-decoration;
-
- &:hover {
- --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);
- text-decoration: $link-hover-decoration;
- }
-}
-
-// And undo these styles for placeholder links/named anchors (without href).
-// It would be more straightforward to just use a[href] in previous block, but that
-// causes specificity issues in many other styles that are too complex to fix.
-// See https://github.com/twbs/bootstrap/issues/19402
-
-a:not([href]):not([class]) {
- &,
- &:hover {
- color: inherit;
- text-decoration: none;
- }
-}
-
-
-// Code
-
-pre,
-code,
-kbd,
-samp {
- font-family: $font-family-code;
- @include font-size(1em); // Correct the odd `em` font sizing in all browsers.
-}
-
-// 1. Remove browser default top margin
-// 2. Reset browser default of `1em` to use `rem`s
-// 3. Don't allow content to break outside
-
-pre {
- display: block;
- margin-top: 0; // 1
- margin-bottom: 1rem; // 2
- overflow: auto; // 3
- @include font-size($code-font-size);
- color: $pre-color;
-
- // Account for some code outputs that place code tags in pre tags
- code {
- @include font-size(inherit);
- color: inherit;
- word-break: normal;
- }
-}
-
-code {
- @include font-size($code-font-size);
- color: var(--#{$prefix}code-color);
- word-wrap: break-word;
-
- // Streamline the style when inside anchors to avoid broken underline and more
- a > & {
- color: inherit;
- }
-}
-
-kbd {
- padding: $kbd-padding-y $kbd-padding-x;
- @include font-size($kbd-font-size);
- color: $kbd-color;
- background-color: $kbd-bg;
- @include border-radius($border-radius-sm);
-
- kbd {
- padding: 0;
- @include font-size(1em);
- font-weight: $nested-kbd-font-weight;
- }
-}
-
-
-// Figures
-//
-// Apply a consistent margin strategy (matches our type styles).
-
-figure {
- margin: 0 0 1rem;
-}
-
-
-// Images and content
-
-img,
-svg {
- vertical-align: middle;
-}
-
-
-// Tables
-//
-// Prevent double borders
-
-table {
- caption-side: bottom;
- border-collapse: collapse;
-}
-
-caption {
- padding-top: $table-cell-padding-y;
- padding-bottom: $table-cell-padding-y;
- color: $table-caption-color;
- text-align: left;
-}
-
-// 1. Removes font-weight bold by inheriting
-// 2. Matches default `
` alignment by inheriting `text-align`.
-// 3. Fix alignment for Safari
-
-th {
- font-weight: $table-th-font-weight; // 1
- text-align: inherit; // 2
- text-align: -webkit-match-parent; // 3
-}
-
-thead,
-tbody,
-tfoot,
-tr,
-td,
-th {
- border-color: inherit;
- border-style: solid;
- border-width: 0;
-}
-
-
-// Forms
-//
-// 1. Allow labels to use `margin` for spacing.
-
-label {
- display: inline-block; // 1
-}
-
-// Remove the default `border-radius` that macOS Chrome adds.
-// See https://github.com/twbs/bootstrap/issues/24093
-
-button {
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 0;
-}
-
-// Explicitly remove focus outline in Chromium when it shouldn't be
-// visible (e.g. as result of mouse click or touch tap). It already
-// should be doing this automatically, but seems to currently be
-// confused and applies its very visible two-tone outline anyway.
-
-button:focus:not(:focus-visible) {
- outline: 0;
-}
-
-// 1. Remove the margin in Firefox and Safari
-
-input,
-button,
-select,
-optgroup,
-textarea {
- margin: 0; // 1
- font-family: inherit;
- @include font-size(inherit);
- line-height: inherit;
-}
-
-// Remove the inheritance of text transform in Firefox
-button,
-select {
- text-transform: none;
-}
-// Set the cursor for non-`` buttons
-//
-// Details at https://github.com/twbs/bootstrap/pull/30562
-[role="button"] {
- cursor: pointer;
-}
-
-select {
- // Remove the inheritance of word-wrap in Safari.
- // See https://github.com/twbs/bootstrap/issues/24990
- word-wrap: normal;
-
- // Undo the opacity change from Chrome
- &:disabled {
- opacity: 1;
- }
-}
-
-// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.
-// See https://stackoverflow.com/a/54997118
-
-[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator {
- display: none !important;
-}
-
-// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
-// controls in Android 4.
-// 2. Correct the inability to style clickable types in iOS and Safari.
-// 3. Opinionated: add "hand" cursor to non-disabled button elements.
-
-button,
-[type="button"], // 1
-[type="reset"],
-[type="submit"] {
- -webkit-appearance: button; // 2
-
- @if $enable-button-pointers {
- &:not(:disabled) {
- cursor: pointer; // 3
- }
- }
-}
-
-// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
-
-::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.
-
-textarea {
- resize: vertical; // 1
-}
-
-// 1. Browsers set a default `min-width: min-content;` on fieldsets,
-// unlike e.g. ``s, which have `min-width: 0;` by default.
-// So we reset that to ensure fieldsets behave more like a standard block element.
-// See https://github.com/twbs/bootstrap/issues/12359
-// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
-// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.
-
-fieldset {
- min-width: 0; // 1
- padding: 0; // 2
- margin: 0; // 2
- border: 0; // 2
-}
-
-// 1. By using `float: left`, the legend will behave like a block element.
-// This way the border of a fieldset wraps around the legend if present.
-// 2. Fix wrapping bug.
-// See https://github.com/twbs/bootstrap/issues/29712
-
-legend {
- float: left; // 1
- width: 100%;
- padding: 0;
- margin-bottom: $legend-margin-bottom;
- font-weight: $legend-font-weight;
- line-height: inherit;
- @include font-size($legend-font-size);
-
- + * {
- clear: left; // 2
- }
-}
-
-// Fix height of inputs with a type of datetime-local, date, month, week, or time
-// See https://github.com/twbs/bootstrap/issues/18842
-
-::-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;
-}
-
-::-webkit-inner-spin-button {
- height: auto;
-}
-
-// 1. This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-// 2. Correct the outline style in Safari.
-
-[type="search"] {
- -webkit-appearance: textfield; // 1
- outline-offset: -2px; // 2
-
- // 3. Better affordance and consistent appearance for search cancel button
- &::-webkit-search-cancel-button {
- cursor: pointer;
- filter: grayscale(1);
- }
-}
-
-// 1. A few input types should stay LTR
-// See https://rtlstyling.com/posts/rtl-styling#form-inputs
-// 2. RTL only output
-// See https://rtlcss.com/learn/usage-guide/control-directives/#raw
-
-/* rtl:raw:
-[type="tel"],
-[type="url"],
-[type="email"],
-[type="number"] {
- direction: ltr;
-}
-*/
-
-// Remove the inner padding in Chrome and Safari on macOS.
-
-::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-// Remove padding around color pickers in webkit browsers
-
-::-webkit-color-swatch-wrapper {
- padding: 0;
-}
-
-
-// 1. Inherit font family and line height for file input buttons
-// 2. Correct the inability to style clickable types in iOS and Safari.
-
-::file-selector-button {
- font: inherit; // 1
- -webkit-appearance: button; // 2
-}
-
-// Correct element displays
-
-output {
- display: inline-block;
-}
-
-// Remove border from iframe
-
-iframe {
- border: 0;
-}
-
-// Summary
-//
-// 1. Add the correct display in all browsers
-
-summary {
- display: list-item; // 1
- cursor: pointer;
-}
-
-
-// Progress
-//
-// Add the correct vertical alignment in Chrome, Firefox, and Opera.
-
-progress {
- vertical-align: baseline;
-}
-
-
-// Hidden attribute
-//
-// Always hide an element with the `hidden` HTML attribute.
-
-[hidden] {
- display: none !important;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_root.scss b/publish/wwwroot/lib/bootstrap/scss/_root.scss
deleted file mode 100644
index becddf1..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_root.scss
+++ /dev/null
@@ -1,187 +0,0 @@
-:root,
-[data-bs-theme="light"] {
- // Note: Custom variable values only support SassScript inside `#{}`.
-
- // Colors
- //
- // Generate palettes for full colors, grays, and theme colors.
-
- @each $color, $value in $colors {
- --#{$prefix}#{$color}: #{$value};
- }
-
- @each $color, $value in $grays {
- --#{$prefix}gray-#{$color}: #{$value};
- }
-
- @each $color, $value in $theme-colors {
- --#{$prefix}#{$color}: #{$value};
- }
-
- @each $color, $value in $theme-colors-rgb {
- --#{$prefix}#{$color}-rgb: #{$value};
- }
-
- @each $color, $value in $theme-colors-text {
- --#{$prefix}#{$color}-text-emphasis: #{$value};
- }
-
- @each $color, $value in $theme-colors-bg-subtle {
- --#{$prefix}#{$color}-bg-subtle: #{$value};
- }
-
- @each $color, $value in $theme-colors-border-subtle {
- --#{$prefix}#{$color}-border-subtle: #{$value};
- }
-
- --#{$prefix}white-rgb: #{to-rgb($white)};
- --#{$prefix}black-rgb: #{to-rgb($black)};
-
- // Fonts
-
- // Note: Use `inspect` for lists so that quoted items keep the quotes.
- // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
- --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
- --#{$prefix}font-monospace: #{inspect($font-family-monospace)};
- --#{$prefix}gradient: #{$gradient};
-
- // Root and body
- // scss-docs-start root-body-variables
- @if $font-size-root != null {
- --#{$prefix}root-font-size: #{$font-size-root};
- }
- --#{$prefix}body-font-family: #{inspect($font-family-base)};
- @include rfs($font-size-base, --#{$prefix}body-font-size);
- --#{$prefix}body-font-weight: #{$font-weight-base};
- --#{$prefix}body-line-height: #{$line-height-base};
- @if $body-text-align != null {
- --#{$prefix}body-text-align: #{$body-text-align};
- }
-
- --#{$prefix}body-color: #{$body-color};
- --#{$prefix}body-color-rgb: #{to-rgb($body-color)};
- --#{$prefix}body-bg: #{$body-bg};
- --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};
-
- --#{$prefix}emphasis-color: #{$body-emphasis-color};
- --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};
-
- --#{$prefix}secondary-color: #{$body-secondary-color};
- --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};
- --#{$prefix}secondary-bg: #{$body-secondary-bg};
- --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};
-
- --#{$prefix}tertiary-color: #{$body-tertiary-color};
- --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};
- --#{$prefix}tertiary-bg: #{$body-tertiary-bg};
- --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};
- // scss-docs-end root-body-variables
-
- --#{$prefix}heading-color: #{$headings-color};
-
- --#{$prefix}link-color: #{$link-color};
- --#{$prefix}link-color-rgb: #{to-rgb($link-color)};
- --#{$prefix}link-decoration: #{$link-decoration};
-
- --#{$prefix}link-hover-color: #{$link-hover-color};
- --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};
-
- @if $link-hover-decoration != null {
- --#{$prefix}link-hover-decoration: #{$link-hover-decoration};
- }
-
- --#{$prefix}code-color: #{$code-color};
- --#{$prefix}highlight-color: #{$mark-color};
- --#{$prefix}highlight-bg: #{$mark-bg};
-
- // scss-docs-start root-border-var
- --#{$prefix}border-width: #{$border-width};
- --#{$prefix}border-style: #{$border-style};
- --#{$prefix}border-color: #{$border-color};
- --#{$prefix}border-color-translucent: #{$border-color-translucent};
-
- --#{$prefix}border-radius: #{$border-radius};
- --#{$prefix}border-radius-sm: #{$border-radius-sm};
- --#{$prefix}border-radius-lg: #{$border-radius-lg};
- --#{$prefix}border-radius-xl: #{$border-radius-xl};
- --#{$prefix}border-radius-xxl: #{$border-radius-xxl};
- --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency
- --#{$prefix}border-radius-pill: #{$border-radius-pill};
- // scss-docs-end root-border-var
-
- --#{$prefix}box-shadow: #{$box-shadow};
- --#{$prefix}box-shadow-sm: #{$box-shadow-sm};
- --#{$prefix}box-shadow-lg: #{$box-shadow-lg};
- --#{$prefix}box-shadow-inset: #{$box-shadow-inset};
-
- // Focus styles
- // scss-docs-start root-focus-variables
- --#{$prefix}focus-ring-width: #{$focus-ring-width};
- --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};
- --#{$prefix}focus-ring-color: #{$focus-ring-color};
- // scss-docs-end root-focus-variables
-
- // scss-docs-start root-form-validation-variables
- --#{$prefix}form-valid-color: #{$form-valid-color};
- --#{$prefix}form-valid-border-color: #{$form-valid-border-color};
- --#{$prefix}form-invalid-color: #{$form-invalid-color};
- --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};
- // scss-docs-end root-form-validation-variables
-}
-
-@if $enable-dark-mode {
- @include color-mode(dark, true) {
- color-scheme: dark;
-
- // scss-docs-start root-dark-mode-vars
- --#{$prefix}body-color: #{$body-color-dark};
- --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};
- --#{$prefix}body-bg: #{$body-bg-dark};
- --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};
-
- --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};
- --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};
-
- --#{$prefix}secondary-color: #{$body-secondary-color-dark};
- --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};
- --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};
- --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};
-
- --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};
- --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};
- --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};
- --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};
-
- @each $color, $value in $theme-colors-text-dark {
- --#{$prefix}#{$color}-text-emphasis: #{$value};
- }
-
- @each $color, $value in $theme-colors-bg-subtle-dark {
- --#{$prefix}#{$color}-bg-subtle: #{$value};
- }
-
- @each $color, $value in $theme-colors-border-subtle-dark {
- --#{$prefix}#{$color}-border-subtle: #{$value};
- }
-
- --#{$prefix}heading-color: #{$headings-color-dark};
-
- --#{$prefix}link-color: #{$link-color-dark};
- --#{$prefix}link-hover-color: #{$link-hover-color-dark};
- --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};
- --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};
-
- --#{$prefix}code-color: #{$code-color-dark};
- --#{$prefix}highlight-color: #{$mark-color-dark};
- --#{$prefix}highlight-bg: #{$mark-bg-dark};
-
- --#{$prefix}border-color: #{$border-color-dark};
- --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};
-
- --#{$prefix}form-valid-color: #{$form-valid-color-dark};
- --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};
- --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};
- --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};
- // scss-docs-end root-dark-mode-vars
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_spinners.scss b/publish/wwwroot/lib/bootstrap/scss/_spinners.scss
deleted file mode 100644
index 9dff289..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_spinners.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-// Rotating border
-//
-
-.spinner-grow,
-.spinner-border {
- display: inline-block;
- flex-shrink: 0;
- width: var(--#{$prefix}spinner-width);
- height: var(--#{$prefix}spinner-height);
- vertical-align: var(--#{$prefix}spinner-vertical-align);
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 50%;
- animation: var(--#{$prefix}spinner-animation-speed) linear infinite var(--#{$prefix}spinner-animation-name);
-}
-
-// scss-docs-start spinner-border-keyframes
-@keyframes spinner-border {
- to { transform: rotate(360deg) #{"/* rtl:ignore */"}; }
-}
-// scss-docs-end spinner-border-keyframes
-
-.spinner-border {
- // scss-docs-start spinner-border-css-vars
- --#{$prefix}spinner-width: #{$spinner-width};
- --#{$prefix}spinner-height: #{$spinner-height};
- --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
- --#{$prefix}spinner-border-width: #{$spinner-border-width};
- --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
- --#{$prefix}spinner-animation-name: spinner-border;
- // scss-docs-end spinner-border-css-vars
-
- border: var(--#{$prefix}spinner-border-width) solid currentcolor;
- border-right-color: transparent;
-}
-
-.spinner-border-sm {
- // scss-docs-start spinner-border-sm-css-vars
- --#{$prefix}spinner-width: #{$spinner-width-sm};
- --#{$prefix}spinner-height: #{$spinner-height-sm};
- --#{$prefix}spinner-border-width: #{$spinner-border-width-sm};
- // scss-docs-end spinner-border-sm-css-vars
-}
-
-//
-// Growing circle
-//
-
-// scss-docs-start spinner-grow-keyframes
-@keyframes spinner-grow {
- 0% {
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- transform: none;
- }
-}
-// scss-docs-end spinner-grow-keyframes
-
-.spinner-grow {
- // scss-docs-start spinner-grow-css-vars
- --#{$prefix}spinner-width: #{$spinner-width};
- --#{$prefix}spinner-height: #{$spinner-height};
- --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
- --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
- --#{$prefix}spinner-animation-name: spinner-grow;
- // scss-docs-end spinner-grow-css-vars
-
- background-color: currentcolor;
- opacity: 0;
-}
-
-.spinner-grow-sm {
- --#{$prefix}spinner-width: #{$spinner-width-sm};
- --#{$prefix}spinner-height: #{$spinner-height-sm};
-}
-
-@if $enable-reduced-motion {
- @media (prefers-reduced-motion: reduce) {
- .spinner-border,
- .spinner-grow {
- --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed * 2};
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_tables.scss b/publish/wwwroot/lib/bootstrap/scss/_tables.scss
deleted file mode 100644
index 276521a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_tables.scss
+++ /dev/null
@@ -1,171 +0,0 @@
-//
-// Basic Bootstrap table
-//
-
-.table {
- // Reset needed for nesting tables
- --#{$prefix}table-color-type: initial;
- --#{$prefix}table-bg-type: initial;
- --#{$prefix}table-color-state: initial;
- --#{$prefix}table-bg-state: initial;
- // End of reset
- --#{$prefix}table-color: #{$table-color};
- --#{$prefix}table-bg: #{$table-bg};
- --#{$prefix}table-border-color: #{$table-border-color};
- --#{$prefix}table-accent-bg: #{$table-accent-bg};
- --#{$prefix}table-striped-color: #{$table-striped-color};
- --#{$prefix}table-striped-bg: #{$table-striped-bg};
- --#{$prefix}table-active-color: #{$table-active-color};
- --#{$prefix}table-active-bg: #{$table-active-bg};
- --#{$prefix}table-hover-color: #{$table-hover-color};
- --#{$prefix}table-hover-bg: #{$table-hover-bg};
-
- width: 100%;
- margin-bottom: $spacer;
- vertical-align: $table-cell-vertical-align;
- border-color: var(--#{$prefix}table-border-color);
-
- // Target th & td
- // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.
- // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).
- // Another advantage is that this generates less code and makes the selector less specific making it easier to override.
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- padding: $table-cell-padding-y $table-cell-padding-x;
- // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb
- color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));
- background-color: var(--#{$prefix}table-bg);
- border-bottom-width: $table-border-width;
- box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));
- }
-
- > tbody {
- vertical-align: inherit;
- }
-
- > thead {
- vertical-align: bottom;
- }
-}
-
-.table-group-divider {
- border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list
-}
-
-//
-// Change placement of captions with a class
-//
-
-.caption-top {
- caption-side: top;
-}
-
-
-//
-// Condensed table w/ half padding
-//
-
-.table-sm {
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;
- }
-}
-
-
-// Border versions
-//
-// Add or remove borders all around the table and between all the columns.
-//
-// When borders are added on all sides of the cells, the corners can render odd when
-// these borders do not have the same color or if they are semi-transparent.
-// Therefore we add top and border bottoms to the `tr`s and left and right borders
-// to the `td`s or `th`s
-
-.table-bordered {
- > :not(caption) > * {
- border-width: $table-border-width 0;
-
- // stylelint-disable-next-line selector-max-universal
- > * {
- border-width: 0 $table-border-width;
- }
- }
-}
-
-.table-borderless {
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- border-bottom-width: 0;
- }
-
- > :not(:first-child) {
- border-top-width: 0;
- }
-}
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-// For rows
-.table-striped {
- > tbody > tr:nth-of-type(#{$table-striped-order}) > * {
- --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);
- --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);
- }
-}
-
-// For columns
-.table-striped-columns {
- > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {
- --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);
- --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);
- }
-}
-
-// Active table
-//
-// The `.table-active` class can be added to highlight rows or cells
-
-.table-active {
- --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);
- --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);
-}
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
- > tbody > tr:hover > * {
- --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);
- --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);
- }
-}
-
-
-// Table variants
-//
-// Table variants set the table cell backgrounds, border colors
-// and the colors of the striped, hovered & active tables
-
-@each $color, $value in $table-variants {
- @include table-variant($color, $value);
-}
-
-// Responsive tables
-//
-// Generate series of `.table-responsive-*` classes for configuring the screen
-// size of where your table will overflow.
-
-@each $breakpoint in map-keys($grid-breakpoints) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- @include media-breakpoint-down($breakpoint) {
- .table-responsive#{$infix} {
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_toasts.scss b/publish/wwwroot/lib/bootstrap/scss/_toasts.scss
deleted file mode 100644
index 2ce378d..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_toasts.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-.toast {
- // scss-docs-start toast-css-vars
- --#{$prefix}toast-zindex: #{$zindex-toast};
- --#{$prefix}toast-padding-x: #{$toast-padding-x};
- --#{$prefix}toast-padding-y: #{$toast-padding-y};
- --#{$prefix}toast-spacing: #{$toast-spacing};
- --#{$prefix}toast-max-width: #{$toast-max-width};
- @include rfs($toast-font-size, --#{$prefix}toast-font-size);
- --#{$prefix}toast-color: #{$toast-color};
- --#{$prefix}toast-bg: #{$toast-background-color};
- --#{$prefix}toast-border-width: #{$toast-border-width};
- --#{$prefix}toast-border-color: #{$toast-border-color};
- --#{$prefix}toast-border-radius: #{$toast-border-radius};
- --#{$prefix}toast-box-shadow: #{$toast-box-shadow};
- --#{$prefix}toast-header-color: #{$toast-header-color};
- --#{$prefix}toast-header-bg: #{$toast-header-background-color};
- --#{$prefix}toast-header-border-color: #{$toast-header-border-color};
- // scss-docs-end toast-css-vars
-
- width: var(--#{$prefix}toast-max-width);
- max-width: 100%;
- @include font-size(var(--#{$prefix}toast-font-size));
- color: var(--#{$prefix}toast-color);
- pointer-events: auto;
- background-color: var(--#{$prefix}toast-bg);
- background-clip: padding-box;
- border: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-border-color);
- box-shadow: var(--#{$prefix}toast-box-shadow);
- @include border-radius(var(--#{$prefix}toast-border-radius));
-
- &.showing {
- opacity: 0;
- }
-
- &:not(.show) {
- display: none;
- }
-}
-
-.toast-container {
- --#{$prefix}toast-zindex: #{$zindex-toast};
-
- position: absolute;
- z-index: var(--#{$prefix}toast-zindex);
- width: max-content;
- max-width: 100%;
- pointer-events: none;
-
- > :not(:last-child) {
- margin-bottom: var(--#{$prefix}toast-spacing);
- }
-}
-
-.toast-header {
- display: flex;
- align-items: center;
- padding: var(--#{$prefix}toast-padding-y) var(--#{$prefix}toast-padding-x);
- color: var(--#{$prefix}toast-header-color);
- background-color: var(--#{$prefix}toast-header-bg);
- background-clip: padding-box;
- border-bottom: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-header-border-color);
- @include border-top-radius(calc(var(--#{$prefix}toast-border-radius) - var(--#{$prefix}toast-border-width)));
-
- .btn-close {
- margin-right: calc(-.5 * var(--#{$prefix}toast-padding-x)); // stylelint-disable-line function-disallowed-list
- margin-left: var(--#{$prefix}toast-padding-x);
- }
-}
-
-.toast-body {
- padding: var(--#{$prefix}toast-padding-x);
- word-wrap: break-word;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_tooltip.scss b/publish/wwwroot/lib/bootstrap/scss/_tooltip.scss
deleted file mode 100644
index 85de90f..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_tooltip.scss
+++ /dev/null
@@ -1,119 +0,0 @@
-// Base class
-.tooltip {
- // scss-docs-start tooltip-css-vars
- --#{$prefix}tooltip-zindex: #{$zindex-tooltip};
- --#{$prefix}tooltip-max-width: #{$tooltip-max-width};
- --#{$prefix}tooltip-padding-x: #{$tooltip-padding-x};
- --#{$prefix}tooltip-padding-y: #{$tooltip-padding-y};
- --#{$prefix}tooltip-margin: #{$tooltip-margin};
- @include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size);
- --#{$prefix}tooltip-color: #{$tooltip-color};
- --#{$prefix}tooltip-bg: #{$tooltip-bg};
- --#{$prefix}tooltip-border-radius: #{$tooltip-border-radius};
- --#{$prefix}tooltip-opacity: #{$tooltip-opacity};
- --#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width};
- --#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height};
- // scss-docs-end tooltip-css-vars
-
- z-index: var(--#{$prefix}tooltip-zindex);
- display: block;
- margin: var(--#{$prefix}tooltip-margin);
- @include deprecate("`$tooltip-margin`", "v5", "v5.x", true);
- // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
- // So reset our font and text properties to avoid inheriting weird values.
- @include reset-text();
- @include font-size(var(--#{$prefix}tooltip-font-size));
- // Allow breaking very long words so they don't overflow the tooltip's bounds
- word-wrap: break-word;
- opacity: 0;
-
- &.show { opacity: var(--#{$prefix}tooltip-opacity); }
-
- .tooltip-arrow {
- display: block;
- width: var(--#{$prefix}tooltip-arrow-width);
- height: var(--#{$prefix}tooltip-arrow-height);
-
- &::before {
- position: absolute;
- content: "";
- border-color: transparent;
- border-style: solid;
- }
- }
-}
-
-.bs-tooltip-top .tooltip-arrow {
- bottom: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list
-
- &::before {
- top: -1px;
- border-width: var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list
- border-top-color: var(--#{$prefix}tooltip-bg);
- }
-}
-
-/* rtl:begin:ignore */
-.bs-tooltip-end .tooltip-arrow {
- left: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list
- width: var(--#{$prefix}tooltip-arrow-height);
- height: var(--#{$prefix}tooltip-arrow-width);
-
- &::before {
- right: -1px;
- border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list
- border-right-color: var(--#{$prefix}tooltip-bg);
- }
-}
-
-/* rtl:end:ignore */
-
-.bs-tooltip-bottom .tooltip-arrow {
- top: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list
-
- &::before {
- bottom: -1px;
- border-width: 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list
- border-bottom-color: var(--#{$prefix}tooltip-bg);
- }
-}
-
-/* rtl:begin:ignore */
-.bs-tooltip-start .tooltip-arrow {
- right: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list
- width: var(--#{$prefix}tooltip-arrow-height);
- height: var(--#{$prefix}tooltip-arrow-width);
-
- &::before {
- left: -1px;
- border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list
- border-left-color: var(--#{$prefix}tooltip-bg);
- }
-}
-
-/* rtl:end:ignore */
-
-.bs-tooltip-auto {
- &[data-popper-placement^="top"] {
- @extend .bs-tooltip-top;
- }
- &[data-popper-placement^="right"] {
- @extend .bs-tooltip-end;
- }
- &[data-popper-placement^="bottom"] {
- @extend .bs-tooltip-bottom;
- }
- &[data-popper-placement^="left"] {
- @extend .bs-tooltip-start;
- }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
- max-width: var(--#{$prefix}tooltip-max-width);
- padding: var(--#{$prefix}tooltip-padding-y) var(--#{$prefix}tooltip-padding-x);
- color: var(--#{$prefix}tooltip-color);
- text-align: center;
- background-color: var(--#{$prefix}tooltip-bg);
- @include border-radius(var(--#{$prefix}tooltip-border-radius));
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_transitions.scss b/publish/wwwroot/lib/bootstrap/scss/_transitions.scss
deleted file mode 100644
index bfb26aa..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_transitions.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-.fade {
- @include transition($transition-fade);
-
- &:not(.show) {
- opacity: 0;
- }
-}
-
-// scss-docs-start collapse-classes
-.collapse {
- &:not(.show) {
- display: none;
- }
-}
-
-.collapsing {
- height: 0;
- overflow: hidden;
- @include transition($transition-collapse);
-
- &.collapse-horizontal {
- width: 0;
- height: auto;
- @include transition($transition-collapse-width);
- }
-}
-// scss-docs-end collapse-classes
diff --git a/publish/wwwroot/lib/bootstrap/scss/_type.scss b/publish/wwwroot/lib/bootstrap/scss/_type.scss
deleted file mode 100644
index 6961390..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_type.scss
+++ /dev/null
@@ -1,106 +0,0 @@
-//
-// Headings
-//
-.h1 {
- @extend h1;
-}
-
-.h2 {
- @extend h2;
-}
-
-.h3 {
- @extend h3;
-}
-
-.h4 {
- @extend h4;
-}
-
-.h5 {
- @extend h5;
-}
-
-.h6 {
- @extend h6;
-}
-
-
-.lead {
- @include font-size($lead-font-size);
- font-weight: $lead-font-weight;
-}
-
-// Type display classes
-@each $display, $font-size in $display-font-sizes {
- .display-#{$display} {
- font-family: $display-font-family;
- font-style: $display-font-style;
- font-weight: $display-font-weight;
- line-height: $display-line-height;
- @include font-size($font-size);
- }
-}
-
-//
-// Emphasis
-//
-.small {
- @extend small;
-}
-
-.mark {
- @extend mark;
-}
-
-//
-// Lists
-//
-
-.list-unstyled {
- @include list-unstyled();
-}
-
-// Inline turns list items into inline-block
-.list-inline {
- @include list-unstyled();
-}
-.list-inline-item {
- display: inline-block;
-
- &:not(:last-child) {
- margin-right: $list-inline-padding;
- }
-}
-
-
-//
-// Misc
-//
-
-// Builds on `abbr`
-.initialism {
- @include font-size($initialism-font-size);
- text-transform: uppercase;
-}
-
-// Blockquotes
-.blockquote {
- margin-bottom: $blockquote-margin-y;
- @include font-size($blockquote-font-size);
-
- > :last-child {
- margin-bottom: 0;
- }
-}
-
-.blockquote-footer {
- margin-top: -$blockquote-margin-y;
- margin-bottom: $blockquote-margin-y;
- @include font-size($blockquote-footer-font-size);
- color: $blockquote-footer-color;
-
- &::before {
- content: "\2014\00A0"; // em dash, nbsp
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/_utilities.scss b/publish/wwwroot/lib/bootstrap/scss/_utilities.scss
deleted file mode 100644
index 696f906..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_utilities.scss
+++ /dev/null
@@ -1,806 +0,0 @@
-// Utilities
-
-$utilities: () !default;
-// stylelint-disable-next-line scss/dollar-variable-default
-$utilities: map-merge(
- (
- // scss-docs-start utils-vertical-align
- "align": (
- property: vertical-align,
- class: align,
- values: baseline top middle bottom text-bottom text-top
- ),
- // scss-docs-end utils-vertical-align
- // scss-docs-start utils-float
- "float": (
- responsive: true,
- property: float,
- values: (
- start: left,
- end: right,
- none: none,
- )
- ),
- // scss-docs-end utils-float
- // Object Fit utilities
- // scss-docs-start utils-object-fit
- "object-fit": (
- responsive: true,
- property: object-fit,
- values: (
- contain: contain,
- cover: cover,
- fill: fill,
- scale: scale-down,
- none: none,
- )
- ),
- // scss-docs-end utils-object-fit
- // Opacity utilities
- // scss-docs-start utils-opacity
- "opacity": (
- property: opacity,
- values: (
- 0: 0,
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1,
- )
- ),
- // scss-docs-end utils-opacity
- // scss-docs-start utils-overflow
- "overflow": (
- property: overflow,
- values: auto hidden visible scroll,
- ),
- "overflow-x": (
- property: overflow-x,
- values: auto hidden visible scroll,
- ),
- "overflow-y": (
- property: overflow-y,
- values: auto hidden visible scroll,
- ),
- // scss-docs-end utils-overflow
- // scss-docs-start utils-display
- "display": (
- responsive: true,
- print: true,
- property: display,
- class: d,
- values: inline inline-block block grid inline-grid table table-row table-cell flex inline-flex none
- ),
- // scss-docs-end utils-display
- // scss-docs-start utils-shadow
- "shadow": (
- property: box-shadow,
- class: shadow,
- values: (
- null: var(--#{$prefix}box-shadow),
- sm: var(--#{$prefix}box-shadow-sm),
- lg: var(--#{$prefix}box-shadow-lg),
- none: none,
- )
- ),
- // scss-docs-end utils-shadow
- // scss-docs-start utils-focus-ring
- "focus-ring": (
- css-var: true,
- css-variable-name: focus-ring-color,
- class: focus-ring,
- values: map-loop($theme-colors-rgb, rgba-css-var, "$key", "focus-ring")
- ),
- // scss-docs-end utils-focus-ring
- // scss-docs-start utils-position
- "position": (
- property: position,
- values: static relative absolute fixed sticky
- ),
- "top": (
- property: top,
- values: $position-values
- ),
- "bottom": (
- property: bottom,
- values: $position-values
- ),
- "start": (
- property: left,
- class: start,
- values: $position-values
- ),
- "end": (
- property: right,
- class: end,
- values: $position-values
- ),
- "translate-middle": (
- property: transform,
- class: translate-middle,
- values: (
- null: translate(-50%, -50%),
- x: translateX(-50%),
- y: translateY(-50%),
- )
- ),
- // scss-docs-end utils-position
- // scss-docs-start utils-borders
- "border": (
- property: border,
- values: (
- null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),
- 0: 0,
- )
- ),
- "border-top": (
- property: border-top,
- values: (
- null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),
- 0: 0,
- )
- ),
- "border-end": (
- property: border-right,
- class: border-end,
- values: (
- null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),
- 0: 0,
- )
- ),
- "border-bottom": (
- property: border-bottom,
- values: (
- null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),
- 0: 0,
- )
- ),
- "border-start": (
- property: border-left,
- class: border-start,
- values: (
- null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),
- 0: 0,
- )
- ),
- "border-color": (
- property: border-color,
- class: border,
- local-vars: (
- "border-opacity": 1
- ),
- values: $utilities-border-colors
- ),
- "subtle-border-color": (
- property: border-color,
- class: border,
- values: $utilities-border-subtle
- ),
- "border-width": (
- property: border-width,
- class: border,
- values: $border-widths
- ),
- "border-opacity": (
- css-var: true,
- class: border-opacity,
- values: (
- 10: .1,
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1
- )
- ),
- // scss-docs-end utils-borders
- // Sizing utilities
- // scss-docs-start utils-sizing
- "width": (
- property: width,
- class: w,
- values: (
- 25: 25%,
- 50: 50%,
- 75: 75%,
- 100: 100%,
- auto: auto
- )
- ),
- "max-width": (
- property: max-width,
- class: mw,
- values: (100: 100%)
- ),
- "viewport-width": (
- property: width,
- class: vw,
- values: (100: 100vw)
- ),
- "min-viewport-width": (
- property: min-width,
- class: min-vw,
- values: (100: 100vw)
- ),
- "height": (
- property: height,
- class: h,
- values: (
- 25: 25%,
- 50: 50%,
- 75: 75%,
- 100: 100%,
- auto: auto
- )
- ),
- "max-height": (
- property: max-height,
- class: mh,
- values: (100: 100%)
- ),
- "viewport-height": (
- property: height,
- class: vh,
- values: (100: 100vh)
- ),
- "min-viewport-height": (
- property: min-height,
- class: min-vh,
- values: (100: 100vh)
- ),
- // scss-docs-end utils-sizing
- // Flex utilities
- // scss-docs-start utils-flex
- "flex": (
- responsive: true,
- property: flex,
- values: (fill: 1 1 auto)
- ),
- "flex-direction": (
- responsive: true,
- property: flex-direction,
- class: flex,
- values: row column row-reverse column-reverse
- ),
- "flex-grow": (
- responsive: true,
- property: flex-grow,
- class: flex,
- values: (
- grow-0: 0,
- grow-1: 1,
- )
- ),
- "flex-shrink": (
- responsive: true,
- property: flex-shrink,
- class: flex,
- values: (
- shrink-0: 0,
- shrink-1: 1,
- )
- ),
- "flex-wrap": (
- responsive: true,
- property: flex-wrap,
- class: flex,
- values: wrap nowrap wrap-reverse
- ),
- "justify-content": (
- responsive: true,
- property: justify-content,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- between: space-between,
- around: space-around,
- evenly: space-evenly,
- )
- ),
- "align-items": (
- responsive: true,
- property: align-items,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- baseline: baseline,
- stretch: stretch,
- )
- ),
- "align-content": (
- responsive: true,
- property: align-content,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- between: space-between,
- around: space-around,
- stretch: stretch,
- )
- ),
- "align-self": (
- responsive: true,
- property: align-self,
- values: (
- auto: auto,
- start: flex-start,
- end: flex-end,
- center: center,
- baseline: baseline,
- stretch: stretch,
- )
- ),
- "order": (
- responsive: true,
- property: order,
- values: (
- first: -1,
- 0: 0,
- 1: 1,
- 2: 2,
- 3: 3,
- 4: 4,
- 5: 5,
- last: 6,
- ),
- ),
- // scss-docs-end utils-flex
- // Margin utilities
- // scss-docs-start utils-spacing
- "margin": (
- responsive: true,
- property: margin,
- class: m,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-x": (
- responsive: true,
- property: margin-right margin-left,
- class: mx,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-y": (
- responsive: true,
- property: margin-top margin-bottom,
- class: my,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-top": (
- responsive: true,
- property: margin-top,
- class: mt,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-end": (
- responsive: true,
- property: margin-right,
- class: me,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-bottom": (
- responsive: true,
- property: margin-bottom,
- class: mb,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-start": (
- responsive: true,
- property: margin-left,
- class: ms,
- values: map-merge($spacers, (auto: auto))
- ),
- // Negative margin utilities
- "negative-margin": (
- responsive: true,
- property: margin,
- class: m,
- values: $negative-spacers
- ),
- "negative-margin-x": (
- responsive: true,
- property: margin-right margin-left,
- class: mx,
- values: $negative-spacers
- ),
- "negative-margin-y": (
- responsive: true,
- property: margin-top margin-bottom,
- class: my,
- values: $negative-spacers
- ),
- "negative-margin-top": (
- responsive: true,
- property: margin-top,
- class: mt,
- values: $negative-spacers
- ),
- "negative-margin-end": (
- responsive: true,
- property: margin-right,
- class: me,
- values: $negative-spacers
- ),
- "negative-margin-bottom": (
- responsive: true,
- property: margin-bottom,
- class: mb,
- values: $negative-spacers
- ),
- "negative-margin-start": (
- responsive: true,
- property: margin-left,
- class: ms,
- values: $negative-spacers
- ),
- // Padding utilities
- "padding": (
- responsive: true,
- property: padding,
- class: p,
- values: $spacers
- ),
- "padding-x": (
- responsive: true,
- property: padding-right padding-left,
- class: px,
- values: $spacers
- ),
- "padding-y": (
- responsive: true,
- property: padding-top padding-bottom,
- class: py,
- values: $spacers
- ),
- "padding-top": (
- responsive: true,
- property: padding-top,
- class: pt,
- values: $spacers
- ),
- "padding-end": (
- responsive: true,
- property: padding-right,
- class: pe,
- values: $spacers
- ),
- "padding-bottom": (
- responsive: true,
- property: padding-bottom,
- class: pb,
- values: $spacers
- ),
- "padding-start": (
- responsive: true,
- property: padding-left,
- class: ps,
- values: $spacers
- ),
- // Gap utility
- "gap": (
- responsive: true,
- property: gap,
- class: gap,
- values: $spacers
- ),
- "row-gap": (
- responsive: true,
- property: row-gap,
- class: row-gap,
- values: $spacers
- ),
- "column-gap": (
- responsive: true,
- property: column-gap,
- class: column-gap,
- values: $spacers
- ),
- // scss-docs-end utils-spacing
- // Text
- // scss-docs-start utils-text
- "font-family": (
- property: font-family,
- class: font,
- values: (monospace: var(--#{$prefix}font-monospace))
- ),
- "font-size": (
- rfs: true,
- property: font-size,
- class: fs,
- values: $font-sizes
- ),
- "font-style": (
- property: font-style,
- class: fst,
- values: italic normal
- ),
- "font-weight": (
- property: font-weight,
- class: fw,
- values: (
- lighter: $font-weight-lighter,
- light: $font-weight-light,
- normal: $font-weight-normal,
- medium: $font-weight-medium,
- semibold: $font-weight-semibold,
- bold: $font-weight-bold,
- bolder: $font-weight-bolder
- )
- ),
- "line-height": (
- property: line-height,
- class: lh,
- values: (
- 1: 1,
- sm: $line-height-sm,
- base: $line-height-base,
- lg: $line-height-lg,
- )
- ),
- "text-align": (
- responsive: true,
- property: text-align,
- class: text,
- values: (
- start: left,
- end: right,
- center: center,
- )
- ),
- "text-decoration": (
- property: text-decoration,
- values: none underline line-through
- ),
- "text-transform": (
- property: text-transform,
- class: text,
- values: lowercase uppercase capitalize
- ),
- "white-space": (
- property: white-space,
- class: text,
- values: (
- wrap: normal,
- nowrap: nowrap,
- )
- ),
- "word-wrap": (
- property: word-wrap word-break,
- class: text,
- values: (break: break-word),
- rtl: false
- ),
- // scss-docs-end utils-text
- // scss-docs-start utils-color
- "color": (
- property: color,
- class: text,
- local-vars: (
- "text-opacity": 1
- ),
- values: map-merge(
- $utilities-text-colors,
- (
- "muted": var(--#{$prefix}secondary-color), // deprecated
- "black-50": rgba($black, .5), // deprecated
- "white-50": rgba($white, .5), // deprecated
- "body-secondary": var(--#{$prefix}secondary-color),
- "body-tertiary": var(--#{$prefix}tertiary-color),
- "body-emphasis": var(--#{$prefix}emphasis-color),
- "reset": inherit,
- )
- )
- ),
- "text-opacity": (
- css-var: true,
- class: text-opacity,
- values: (
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1
- )
- ),
- "text-color": (
- property: color,
- class: text,
- values: $utilities-text-emphasis-colors
- ),
- // scss-docs-end utils-color
- // scss-docs-start utils-links
- "link-opacity": (
- css-var: true,
- class: link-opacity,
- state: hover,
- values: (
- 10: .1,
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1
- )
- ),
- "link-offset": (
- property: text-underline-offset,
- class: link-offset,
- state: hover,
- values: (
- 1: .125em,
- 2: .25em,
- 3: .375em,
- )
- ),
- "link-underline": (
- property: text-decoration-color,
- class: link-underline,
- local-vars: (
- "link-underline-opacity": 1
- ),
- values: map-merge(
- $utilities-links-underline,
- (
- null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1)),
- )
- )
- ),
- "link-underline-opacity": (
- css-var: true,
- class: link-underline-opacity,
- state: hover,
- values: (
- 0: 0,
- 10: .1,
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1
- ),
- ),
- // scss-docs-end utils-links
- // scss-docs-start utils-bg-color
- "background-color": (
- property: background-color,
- class: bg,
- local-vars: (
- "bg-opacity": 1
- ),
- values: map-merge(
- $utilities-bg-colors,
- (
- "transparent": transparent,
- "body-secondary": rgba(var(--#{$prefix}secondary-bg-rgb), var(--#{$prefix}bg-opacity)),
- "body-tertiary": rgba(var(--#{$prefix}tertiary-bg-rgb), var(--#{$prefix}bg-opacity)),
- )
- )
- ),
- "bg-opacity": (
- css-var: true,
- class: bg-opacity,
- values: (
- 10: .1,
- 25: .25,
- 50: .5,
- 75: .75,
- 100: 1
- )
- ),
- "subtle-background-color": (
- property: background-color,
- class: bg,
- values: $utilities-bg-subtle
- ),
- // scss-docs-end utils-bg-color
- "gradient": (
- property: background-image,
- class: bg,
- values: (gradient: var(--#{$prefix}gradient))
- ),
- // scss-docs-start utils-interaction
- "user-select": (
- property: user-select,
- values: all auto none
- ),
- "pointer-events": (
- property: pointer-events,
- class: pe,
- values: none auto,
- ),
- // scss-docs-end utils-interaction
- // scss-docs-start utils-border-radius
- "rounded": (
- property: border-radius,
- class: rounded,
- values: (
- null: var(--#{$prefix}border-radius),
- 0: 0,
- 1: var(--#{$prefix}border-radius-sm),
- 2: var(--#{$prefix}border-radius),
- 3: var(--#{$prefix}border-radius-lg),
- 4: var(--#{$prefix}border-radius-xl),
- 5: var(--#{$prefix}border-radius-xxl),
- circle: 50%,
- pill: var(--#{$prefix}border-radius-pill)
- )
- ),
- "rounded-top": (
- property: border-top-left-radius border-top-right-radius,
- class: rounded-top,
- values: (
- null: var(--#{$prefix}border-radius),
- 0: 0,
- 1: var(--#{$prefix}border-radius-sm),
- 2: var(--#{$prefix}border-radius),
- 3: var(--#{$prefix}border-radius-lg),
- 4: var(--#{$prefix}border-radius-xl),
- 5: var(--#{$prefix}border-radius-xxl),
- circle: 50%,
- pill: var(--#{$prefix}border-radius-pill)
- )
- ),
- "rounded-end": (
- property: border-top-right-radius border-bottom-right-radius,
- class: rounded-end,
- values: (
- null: var(--#{$prefix}border-radius),
- 0: 0,
- 1: var(--#{$prefix}border-radius-sm),
- 2: var(--#{$prefix}border-radius),
- 3: var(--#{$prefix}border-radius-lg),
- 4: var(--#{$prefix}border-radius-xl),
- 5: var(--#{$prefix}border-radius-xxl),
- circle: 50%,
- pill: var(--#{$prefix}border-radius-pill)
- )
- ),
- "rounded-bottom": (
- property: border-bottom-right-radius border-bottom-left-radius,
- class: rounded-bottom,
- values: (
- null: var(--#{$prefix}border-radius),
- 0: 0,
- 1: var(--#{$prefix}border-radius-sm),
- 2: var(--#{$prefix}border-radius),
- 3: var(--#{$prefix}border-radius-lg),
- 4: var(--#{$prefix}border-radius-xl),
- 5: var(--#{$prefix}border-radius-xxl),
- circle: 50%,
- pill: var(--#{$prefix}border-radius-pill)
- )
- ),
- "rounded-start": (
- property: border-bottom-left-radius border-top-left-radius,
- class: rounded-start,
- values: (
- null: var(--#{$prefix}border-radius),
- 0: 0,
- 1: var(--#{$prefix}border-radius-sm),
- 2: var(--#{$prefix}border-radius),
- 3: var(--#{$prefix}border-radius-lg),
- 4: var(--#{$prefix}border-radius-xl),
- 5: var(--#{$prefix}border-radius-xxl),
- circle: 50%,
- pill: var(--#{$prefix}border-radius-pill)
- )
- ),
- // scss-docs-end utils-border-radius
- // scss-docs-start utils-visibility
- "visibility": (
- property: visibility,
- class: null,
- values: (
- visible: visible,
- invisible: hidden,
- )
- ),
- // scss-docs-end utils-visibility
- // scss-docs-start utils-zindex
- "z-index": (
- property: z-index,
- class: z,
- values: $zindex-levels,
- )
- // scss-docs-end utils-zindex
- ),
- $utilities
-);
diff --git a/publish/wwwroot/lib/bootstrap/scss/_variables-dark.scss b/publish/wwwroot/lib/bootstrap/scss/_variables-dark.scss
deleted file mode 100644
index 260f6dc..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_variables-dark.scss
+++ /dev/null
@@ -1,102 +0,0 @@
-// Dark color mode variables
-//
-// Custom variables for the `[data-bs-theme="dark"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need.
-
-//
-// Global colors
-//
-
-// scss-docs-start sass-dark-mode-vars
-// scss-docs-start theme-text-dark-variables
-$primary-text-emphasis-dark: tint-color($primary, 40%) !default;
-$secondary-text-emphasis-dark: tint-color($secondary, 40%) !default;
-$success-text-emphasis-dark: tint-color($success, 40%) !default;
-$info-text-emphasis-dark: tint-color($info, 40%) !default;
-$warning-text-emphasis-dark: tint-color($warning, 40%) !default;
-$danger-text-emphasis-dark: tint-color($danger, 40%) !default;
-$light-text-emphasis-dark: $gray-100 !default;
-$dark-text-emphasis-dark: $gray-300 !default;
-// scss-docs-end theme-text-dark-variables
-
-// scss-docs-start theme-bg-subtle-dark-variables
-$primary-bg-subtle-dark: shade-color($primary, 80%) !default;
-$secondary-bg-subtle-dark: shade-color($secondary, 80%) !default;
-$success-bg-subtle-dark: shade-color($success, 80%) !default;
-$info-bg-subtle-dark: shade-color($info, 80%) !default;
-$warning-bg-subtle-dark: shade-color($warning, 80%) !default;
-$danger-bg-subtle-dark: shade-color($danger, 80%) !default;
-$light-bg-subtle-dark: $gray-800 !default;
-$dark-bg-subtle-dark: mix($gray-800, $black) !default;
-// scss-docs-end theme-bg-subtle-dark-variables
-
-// scss-docs-start theme-border-subtle-dark-variables
-$primary-border-subtle-dark: shade-color($primary, 40%) !default;
-$secondary-border-subtle-dark: shade-color($secondary, 40%) !default;
-$success-border-subtle-dark: shade-color($success, 40%) !default;
-$info-border-subtle-dark: shade-color($info, 40%) !default;
-$warning-border-subtle-dark: shade-color($warning, 40%) !default;
-$danger-border-subtle-dark: shade-color($danger, 40%) !default;
-$light-border-subtle-dark: $gray-700 !default;
-$dark-border-subtle-dark: $gray-800 !default;
-// scss-docs-end theme-border-subtle-dark-variables
-
-$body-color-dark: $gray-300 !default;
-$body-bg-dark: $gray-900 !default;
-$body-secondary-color-dark: rgba($body-color-dark, .75) !default;
-$body-secondary-bg-dark: $gray-800 !default;
-$body-tertiary-color-dark: rgba($body-color-dark, .5) !default;
-$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default;
-$body-emphasis-color-dark: $white !default;
-$border-color-dark: $gray-700 !default;
-$border-color-translucent-dark: rgba($white, .15) !default;
-$headings-color-dark: inherit !default;
-$link-color-dark: tint-color($primary, 40%) !default;
-$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage) !default;
-$code-color-dark: tint-color($code-color, 40%) !default;
-$mark-color-dark: $body-color-dark !default;
-$mark-bg-dark: $yellow-800 !default;
-
-
-//
-// Forms
-//
-
-$form-select-indicator-color-dark: $body-color-dark !default;
-$form-select-indicator-dark: url("data:image/svg+xml,
") !default;
-
-$form-switch-color-dark: rgba($white, .25) !default;
-$form-switch-bg-image-dark: url("data:image/svg+xml,
") !default;
-
-// scss-docs-start form-validation-colors-dark
-$form-valid-color-dark: $green-300 !default;
-$form-valid-border-color-dark: $green-300 !default;
-$form-invalid-color-dark: $red-300 !default;
-$form-invalid-border-color-dark: $red-300 !default;
-// scss-docs-end form-validation-colors-dark
-
-
-//
-// Accordion
-//
-
-$accordion-icon-color-dark: $primary-text-emphasis-dark !default;
-$accordion-icon-active-color-dark: $primary-text-emphasis-dark !default;
-
-$accordion-button-icon-dark: url("data:image/svg+xml,
") !default;
-$accordion-button-active-icon-dark: url("data:image/svg+xml,
") !default;
-// scss-docs-end sass-dark-mode-vars
-
-
-//
-// Carousel
-//
-
-$carousel-indicator-active-bg-dark: $carousel-dark-indicator-active-bg !default;
-$carousel-caption-color-dark: $carousel-dark-caption-color !default;
-$carousel-control-icon-filter-dark: $carousel-dark-control-icon-filter !default;
-
-//
-// Close button
-//
-
-$btn-close-filter-dark: $btn-close-white-filter !default;
diff --git a/publish/wwwroot/lib/bootstrap/scss/_variables.scss b/publish/wwwroot/lib/bootstrap/scss/_variables.scss
deleted file mode 100644
index 1ffa7e7..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/_variables.scss
+++ /dev/null
@@ -1,1753 +0,0 @@
-// Variables
-//
-// Variables should follow the `$component-state-property-size` formula for
-// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
-
-// Color system
-
-// scss-docs-start gray-color-variables
-$white: #fff !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #6c757d !default;
-$gray-700: #495057 !default;
-$gray-800: #343a40 !default;
-$gray-900: #212529 !default;
-$black: #000 !default;
-// scss-docs-end gray-color-variables
-
-// fusv-disable
-// scss-docs-start gray-colors-map
-$grays: (
- "100": $gray-100,
- "200": $gray-200,
- "300": $gray-300,
- "400": $gray-400,
- "500": $gray-500,
- "600": $gray-600,
- "700": $gray-700,
- "800": $gray-800,
- "900": $gray-900
-) !default;
-// scss-docs-end gray-colors-map
-// fusv-enable
-
-// scss-docs-start color-variables
-$blue: #0d6efd !default;
-$indigo: #6610f2 !default;
-$purple: #6f42c1 !default;
-$pink: #d63384 !default;
-$red: #dc3545 !default;
-$orange: #fd7e14 !default;
-$yellow: #ffc107 !default;
-$green: #198754 !default;
-$teal: #20c997 !default;
-$cyan: #0dcaf0 !default;
-// scss-docs-end color-variables
-
-// scss-docs-start colors-map
-$colors: (
- "blue": $blue,
- "indigo": $indigo,
- "purple": $purple,
- "pink": $pink,
- "red": $red,
- "orange": $orange,
- "yellow": $yellow,
- "green": $green,
- "teal": $teal,
- "cyan": $cyan,
- "black": $black,
- "white": $white,
- "gray": $gray-600,
- "gray-dark": $gray-800
-) !default;
-// scss-docs-end colors-map
-
-// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.2 are 3, 4.5 and 7.
-// See https://www.w3.org/TR/WCAG/#contrast-minimum
-$min-contrast-ratio: 4.5 !default;
-
-// Customize the light and dark text colors for use in our color contrast function.
-$color-contrast-dark: $black !default;
-$color-contrast-light: $white !default;
-
-// fusv-disable
-$blue-100: tint-color($blue, 80%) !default;
-$blue-200: tint-color($blue, 60%) !default;
-$blue-300: tint-color($blue, 40%) !default;
-$blue-400: tint-color($blue, 20%) !default;
-$blue-500: $blue !default;
-$blue-600: shade-color($blue, 20%) !default;
-$blue-700: shade-color($blue, 40%) !default;
-$blue-800: shade-color($blue, 60%) !default;
-$blue-900: shade-color($blue, 80%) !default;
-
-$indigo-100: tint-color($indigo, 80%) !default;
-$indigo-200: tint-color($indigo, 60%) !default;
-$indigo-300: tint-color($indigo, 40%) !default;
-$indigo-400: tint-color($indigo, 20%) !default;
-$indigo-500: $indigo !default;
-$indigo-600: shade-color($indigo, 20%) !default;
-$indigo-700: shade-color($indigo, 40%) !default;
-$indigo-800: shade-color($indigo, 60%) !default;
-$indigo-900: shade-color($indigo, 80%) !default;
-
-$purple-100: tint-color($purple, 80%) !default;
-$purple-200: tint-color($purple, 60%) !default;
-$purple-300: tint-color($purple, 40%) !default;
-$purple-400: tint-color($purple, 20%) !default;
-$purple-500: $purple !default;
-$purple-600: shade-color($purple, 20%) !default;
-$purple-700: shade-color($purple, 40%) !default;
-$purple-800: shade-color($purple, 60%) !default;
-$purple-900: shade-color($purple, 80%) !default;
-
-$pink-100: tint-color($pink, 80%) !default;
-$pink-200: tint-color($pink, 60%) !default;
-$pink-300: tint-color($pink, 40%) !default;
-$pink-400: tint-color($pink, 20%) !default;
-$pink-500: $pink !default;
-$pink-600: shade-color($pink, 20%) !default;
-$pink-700: shade-color($pink, 40%) !default;
-$pink-800: shade-color($pink, 60%) !default;
-$pink-900: shade-color($pink, 80%) !default;
-
-$red-100: tint-color($red, 80%) !default;
-$red-200: tint-color($red, 60%) !default;
-$red-300: tint-color($red, 40%) !default;
-$red-400: tint-color($red, 20%) !default;
-$red-500: $red !default;
-$red-600: shade-color($red, 20%) !default;
-$red-700: shade-color($red, 40%) !default;
-$red-800: shade-color($red, 60%) !default;
-$red-900: shade-color($red, 80%) !default;
-
-$orange-100: tint-color($orange, 80%) !default;
-$orange-200: tint-color($orange, 60%) !default;
-$orange-300: tint-color($orange, 40%) !default;
-$orange-400: tint-color($orange, 20%) !default;
-$orange-500: $orange !default;
-$orange-600: shade-color($orange, 20%) !default;
-$orange-700: shade-color($orange, 40%) !default;
-$orange-800: shade-color($orange, 60%) !default;
-$orange-900: shade-color($orange, 80%) !default;
-
-$yellow-100: tint-color($yellow, 80%) !default;
-$yellow-200: tint-color($yellow, 60%) !default;
-$yellow-300: tint-color($yellow, 40%) !default;
-$yellow-400: tint-color($yellow, 20%) !default;
-$yellow-500: $yellow !default;
-$yellow-600: shade-color($yellow, 20%) !default;
-$yellow-700: shade-color($yellow, 40%) !default;
-$yellow-800: shade-color($yellow, 60%) !default;
-$yellow-900: shade-color($yellow, 80%) !default;
-
-$green-100: tint-color($green, 80%) !default;
-$green-200: tint-color($green, 60%) !default;
-$green-300: tint-color($green, 40%) !default;
-$green-400: tint-color($green, 20%) !default;
-$green-500: $green !default;
-$green-600: shade-color($green, 20%) !default;
-$green-700: shade-color($green, 40%) !default;
-$green-800: shade-color($green, 60%) !default;
-$green-900: shade-color($green, 80%) !default;
-
-$teal-100: tint-color($teal, 80%) !default;
-$teal-200: tint-color($teal, 60%) !default;
-$teal-300: tint-color($teal, 40%) !default;
-$teal-400: tint-color($teal, 20%) !default;
-$teal-500: $teal !default;
-$teal-600: shade-color($teal, 20%) !default;
-$teal-700: shade-color($teal, 40%) !default;
-$teal-800: shade-color($teal, 60%) !default;
-$teal-900: shade-color($teal, 80%) !default;
-
-$cyan-100: tint-color($cyan, 80%) !default;
-$cyan-200: tint-color($cyan, 60%) !default;
-$cyan-300: tint-color($cyan, 40%) !default;
-$cyan-400: tint-color($cyan, 20%) !default;
-$cyan-500: $cyan !default;
-$cyan-600: shade-color($cyan, 20%) !default;
-$cyan-700: shade-color($cyan, 40%) !default;
-$cyan-800: shade-color($cyan, 60%) !default;
-$cyan-900: shade-color($cyan, 80%) !default;
-
-$blues: (
- "blue-100": $blue-100,
- "blue-200": $blue-200,
- "blue-300": $blue-300,
- "blue-400": $blue-400,
- "blue-500": $blue-500,
- "blue-600": $blue-600,
- "blue-700": $blue-700,
- "blue-800": $blue-800,
- "blue-900": $blue-900
-) !default;
-
-$indigos: (
- "indigo-100": $indigo-100,
- "indigo-200": $indigo-200,
- "indigo-300": $indigo-300,
- "indigo-400": $indigo-400,
- "indigo-500": $indigo-500,
- "indigo-600": $indigo-600,
- "indigo-700": $indigo-700,
- "indigo-800": $indigo-800,
- "indigo-900": $indigo-900
-) !default;
-
-$purples: (
- "purple-100": $purple-100,
- "purple-200": $purple-200,
- "purple-300": $purple-300,
- "purple-400": $purple-400,
- "purple-500": $purple-500,
- "purple-600": $purple-600,
- "purple-700": $purple-700,
- "purple-800": $purple-800,
- "purple-900": $purple-900
-) !default;
-
-$pinks: (
- "pink-100": $pink-100,
- "pink-200": $pink-200,
- "pink-300": $pink-300,
- "pink-400": $pink-400,
- "pink-500": $pink-500,
- "pink-600": $pink-600,
- "pink-700": $pink-700,
- "pink-800": $pink-800,
- "pink-900": $pink-900
-) !default;
-
-$reds: (
- "red-100": $red-100,
- "red-200": $red-200,
- "red-300": $red-300,
- "red-400": $red-400,
- "red-500": $red-500,
- "red-600": $red-600,
- "red-700": $red-700,
- "red-800": $red-800,
- "red-900": $red-900
-) !default;
-
-$oranges: (
- "orange-100": $orange-100,
- "orange-200": $orange-200,
- "orange-300": $orange-300,
- "orange-400": $orange-400,
- "orange-500": $orange-500,
- "orange-600": $orange-600,
- "orange-700": $orange-700,
- "orange-800": $orange-800,
- "orange-900": $orange-900
-) !default;
-
-$yellows: (
- "yellow-100": $yellow-100,
- "yellow-200": $yellow-200,
- "yellow-300": $yellow-300,
- "yellow-400": $yellow-400,
- "yellow-500": $yellow-500,
- "yellow-600": $yellow-600,
- "yellow-700": $yellow-700,
- "yellow-800": $yellow-800,
- "yellow-900": $yellow-900
-) !default;
-
-$greens: (
- "green-100": $green-100,
- "green-200": $green-200,
- "green-300": $green-300,
- "green-400": $green-400,
- "green-500": $green-500,
- "green-600": $green-600,
- "green-700": $green-700,
- "green-800": $green-800,
- "green-900": $green-900
-) !default;
-
-$teals: (
- "teal-100": $teal-100,
- "teal-200": $teal-200,
- "teal-300": $teal-300,
- "teal-400": $teal-400,
- "teal-500": $teal-500,
- "teal-600": $teal-600,
- "teal-700": $teal-700,
- "teal-800": $teal-800,
- "teal-900": $teal-900
-) !default;
-
-$cyans: (
- "cyan-100": $cyan-100,
- "cyan-200": $cyan-200,
- "cyan-300": $cyan-300,
- "cyan-400": $cyan-400,
- "cyan-500": $cyan-500,
- "cyan-600": $cyan-600,
- "cyan-700": $cyan-700,
- "cyan-800": $cyan-800,
- "cyan-900": $cyan-900
-) !default;
-// fusv-enable
-
-// scss-docs-start theme-color-variables
-$primary: $blue !default;
-$secondary: $gray-600 !default;
-$success: $green !default;
-$info: $cyan !default;
-$warning: $yellow !default;
-$danger: $red !default;
-$light: $gray-100 !default;
-$dark: $gray-900 !default;
-// scss-docs-end theme-color-variables
-
-// scss-docs-start theme-colors-map
-$theme-colors: (
- "primary": $primary,
- "secondary": $secondary,
- "success": $success,
- "info": $info,
- "warning": $warning,
- "danger": $danger,
- "light": $light,
- "dark": $dark
-) !default;
-// scss-docs-end theme-colors-map
-
-// scss-docs-start theme-text-variables
-$primary-text-emphasis: shade-color($primary, 60%) !default;
-$secondary-text-emphasis: shade-color($secondary, 60%) !default;
-$success-text-emphasis: shade-color($success, 60%) !default;
-$info-text-emphasis: shade-color($info, 60%) !default;
-$warning-text-emphasis: shade-color($warning, 60%) !default;
-$danger-text-emphasis: shade-color($danger, 60%) !default;
-$light-text-emphasis: $gray-700 !default;
-$dark-text-emphasis: $gray-700 !default;
-// scss-docs-end theme-text-variables
-
-// scss-docs-start theme-bg-subtle-variables
-$primary-bg-subtle: tint-color($primary, 80%) !default;
-$secondary-bg-subtle: tint-color($secondary, 80%) !default;
-$success-bg-subtle: tint-color($success, 80%) !default;
-$info-bg-subtle: tint-color($info, 80%) !default;
-$warning-bg-subtle: tint-color($warning, 80%) !default;
-$danger-bg-subtle: tint-color($danger, 80%) !default;
-$light-bg-subtle: mix($gray-100, $white) !default;
-$dark-bg-subtle: $gray-400 !default;
-// scss-docs-end theme-bg-subtle-variables
-
-// scss-docs-start theme-border-subtle-variables
-$primary-border-subtle: tint-color($primary, 60%) !default;
-$secondary-border-subtle: tint-color($secondary, 60%) !default;
-$success-border-subtle: tint-color($success, 60%) !default;
-$info-border-subtle: tint-color($info, 60%) !default;
-$warning-border-subtle: tint-color($warning, 60%) !default;
-$danger-border-subtle: tint-color($danger, 60%) !default;
-$light-border-subtle: $gray-200 !default;
-$dark-border-subtle: $gray-500 !default;
-// scss-docs-end theme-border-subtle-variables
-
-// Characters which are escaped by the escape-svg function
-$escaped-characters: (
- ("<", "%3c"),
- (">", "%3e"),
- ("#", "%23"),
- ("(", "%28"),
- (")", "%29"),
-) !default;
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-$enable-caret: true !default;
-$enable-rounded: true !default;
-$enable-shadows: false !default;
-$enable-gradients: false !default;
-$enable-transitions: true !default;
-$enable-reduced-motion: true !default;
-$enable-smooth-scroll: true !default;
-$enable-grid-classes: true !default;
-$enable-container-classes: true !default;
-$enable-cssgrid: false !default;
-$enable-button-pointers: true !default;
-$enable-rfs: true !default;
-$enable-validation-icons: true !default;
-$enable-negative-margins: false !default;
-$enable-deprecation-messages: true !default;
-$enable-important-utilities: true !default;
-
-$enable-dark-mode: true !default;
-$color-mode-type: data !default; // `data` or `media-query`
-
-// Prefix for :root CSS variables
-
-$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`
-$prefix: $variable-prefix !default;
-
-// Gradient
-//
-// The gradient which is added to components if `$enable-gradients` is `true`
-// This gradient is also added to elements with `.bg-gradient`
-// scss-docs-start variable-gradient
-$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;
-// scss-docs-end variable-gradient
-
-// Spacing
-//
-// Control the default styling of most Bootstrap elements by modifying these
-// variables. Mostly focused on spacing.
-// You can add more entries to the $spacers map, should you need more variation.
-
-// scss-docs-start spacer-variables-maps
-$spacer: 1rem !default;
-$spacers: (
- 0: 0,
- 1: $spacer * .25,
- 2: $spacer * .5,
- 3: $spacer,
- 4: $spacer * 1.5,
- 5: $spacer * 3,
-) !default;
-// scss-docs-end spacer-variables-maps
-
-// Position
-//
-// Define the edge positioning anchors of the position utilities.
-
-// scss-docs-start position-map
-$position-values: (
- 0: 0,
- 50: 50%,
- 100: 100%
-) !default;
-// scss-docs-end position-map
-
-// Body
-//
-// Settings for the `` element.
-
-$body-text-align: null !default;
-$body-color: $gray-900 !default;
-$body-bg: $white !default;
-
-$body-secondary-color: rgba($body-color, .75) !default;
-$body-secondary-bg: $gray-200 !default;
-
-$body-tertiary-color: rgba($body-color, .5) !default;
-$body-tertiary-bg: $gray-100 !default;
-
-$body-emphasis-color: $black !default;
-
-// Links
-//
-// Style anchor elements.
-
-$link-color: $primary !default;
-$link-decoration: underline !default;
-$link-shade-percentage: 20% !default;
-$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;
-$link-hover-decoration: null !default;
-
-$stretched-link-pseudo-element: after !default;
-$stretched-link-z-index: 1 !default;
-
-// Icon links
-// scss-docs-start icon-link-variables
-$icon-link-gap: .375rem !default;
-$icon-link-underline-offset: .25em !default;
-$icon-link-icon-size: 1em !default;
-$icon-link-icon-transition: .2s ease-in-out transform !default;
-$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;
-// scss-docs-end icon-link-variables
-
-// Paragraphs
-//
-// Style p element.
-
-$paragraph-margin-bottom: 1rem !default;
-
-
-// Grid breakpoints
-//
-// Define the minimum dimensions at which your layout will change,
-// adapting to different screen sizes, for use in media queries.
-
-// scss-docs-start grid-breakpoints
-$grid-breakpoints: (
- xs: 0,
- sm: 576px,
- md: 768px,
- lg: 992px,
- xl: 1200px,
- xxl: 1400px
-) !default;
-// scss-docs-end grid-breakpoints
-
-@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
-@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints");
-
-
-// Grid containers
-//
-// Define the maximum width of `.container` for different screen sizes.
-
-// scss-docs-start container-max-widths
-$container-max-widths: (
- sm: 540px,
- md: 720px,
- lg: 960px,
- xl: 1140px,
- xxl: 1320px
-) !default;
-// scss-docs-end container-max-widths
-
-@include _assert-ascending($container-max-widths, "$container-max-widths");
-
-
-// Grid columns
-//
-// Set the number of columns and specify the width of the gutters.
-
-$grid-columns: 12 !default;
-$grid-gutter-width: 1.5rem !default;
-$grid-row-columns: 6 !default;
-
-// Container padding
-
-$container-padding-x: $grid-gutter-width !default;
-
-
-// Components
-//
-// Define common padding and border radius sizes and more.
-
-// scss-docs-start border-variables
-$border-width: 1px !default;
-$border-widths: (
- 1: 1px,
- 2: 2px,
- 3: 3px,
- 4: 4px,
- 5: 5px
-) !default;
-$border-style: solid !default;
-$border-color: $gray-300 !default;
-$border-color-translucent: rgba($black, .175) !default;
-// scss-docs-end border-variables
-
-// scss-docs-start border-radius-variables
-$border-radius: .375rem !default;
-$border-radius-sm: .25rem !default;
-$border-radius-lg: .5rem !default;
-$border-radius-xl: 1rem !default;
-$border-radius-xxl: 2rem !default;
-$border-radius-pill: 50rem !default;
-// scss-docs-end border-radius-variables
-// fusv-disable
-$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0
-// fusv-enable
-
-// scss-docs-start box-shadow-variables
-$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
-$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
-$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
-$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;
-// scss-docs-end box-shadow-variables
-
-$component-active-color: $white !default;
-$component-active-bg: $primary !default;
-
-// scss-docs-start focus-ring-variables
-$focus-ring-width: .25rem !default;
-$focus-ring-opacity: .25 !default;
-$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;
-$focus-ring-blur: 0 !default;
-$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;
-// scss-docs-end focus-ring-variables
-
-// scss-docs-start caret-variables
-$caret-width: .3em !default;
-$caret-vertical-align: $caret-width * .85 !default;
-$caret-spacing: $caret-width * .85 !default;
-// scss-docs-end caret-variables
-
-$transition-base: all .2s ease-in-out !default;
-$transition-fade: opacity .15s linear !default;
-// scss-docs-start collapse-transition
-$transition-collapse: height .35s ease !default;
-$transition-collapse-width: width .35s ease !default;
-// scss-docs-end collapse-transition
-
-// stylelint-disable function-disallowed-list
-// scss-docs-start aspect-ratios
-$aspect-ratios: (
- "1x1": 100%,
- "4x3": calc(3 / 4 * 100%),
- "16x9": calc(9 / 16 * 100%),
- "21x9": calc(9 / 21 * 100%)
-) !default;
-// scss-docs-end aspect-ratios
-// stylelint-enable function-disallowed-list
-
-// Typography
-//
-// Font, line-height, and color for body text, headings, and more.
-
-// scss-docs-start font-variables
-// stylelint-disable value-keyword-case
-$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
-$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
-// stylelint-enable value-keyword-case
-$font-family-base: var(--#{$prefix}font-sans-serif) !default;
-$font-family-code: var(--#{$prefix}font-monospace) !default;
-
-// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins
-// $font-size-base affects the font size of the body text
-$font-size-root: null !default;
-$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
-$font-size-sm: $font-size-base * .875 !default;
-$font-size-lg: $font-size-base * 1.25 !default;
-
-$font-weight-lighter: lighter !default;
-$font-weight-light: 300 !default;
-$font-weight-normal: 400 !default;
-$font-weight-medium: 500 !default;
-$font-weight-semibold: 600 !default;
-$font-weight-bold: 700 !default;
-$font-weight-bolder: bolder !default;
-
-$font-weight-base: $font-weight-normal !default;
-
-$line-height-base: 1.5 !default;
-$line-height-sm: 1.25 !default;
-$line-height-lg: 2 !default;
-
-$h1-font-size: $font-size-base * 2.5 !default;
-$h2-font-size: $font-size-base * 2 !default;
-$h3-font-size: $font-size-base * 1.75 !default;
-$h4-font-size: $font-size-base * 1.5 !default;
-$h5-font-size: $font-size-base * 1.25 !default;
-$h6-font-size: $font-size-base !default;
-// scss-docs-end font-variables
-
-// scss-docs-start font-sizes
-$font-sizes: (
- 1: $h1-font-size,
- 2: $h2-font-size,
- 3: $h3-font-size,
- 4: $h4-font-size,
- 5: $h5-font-size,
- 6: $h6-font-size
-) !default;
-// scss-docs-end font-sizes
-
-// scss-docs-start headings-variables
-$headings-margin-bottom: $spacer * .5 !default;
-$headings-font-family: null !default;
-$headings-font-style: null !default;
-$headings-font-weight: 500 !default;
-$headings-line-height: 1.2 !default;
-$headings-color: inherit !default;
-// scss-docs-end headings-variables
-
-// scss-docs-start display-headings
-$display-font-sizes: (
- 1: 5rem,
- 2: 4.5rem,
- 3: 4rem,
- 4: 3.5rem,
- 5: 3rem,
- 6: 2.5rem
-) !default;
-
-$display-font-family: null !default;
-$display-font-style: null !default;
-$display-font-weight: 300 !default;
-$display-line-height: $headings-line-height !default;
-// scss-docs-end display-headings
-
-// scss-docs-start type-variables
-$lead-font-size: $font-size-base * 1.25 !default;
-$lead-font-weight: 300 !default;
-
-$small-font-size: .875em !default;
-
-$sub-sup-font-size: .75em !default;
-
-// fusv-disable
-$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0
-// fusv-enable
-
-$initialism-font-size: $small-font-size !default;
-
-$blockquote-margin-y: $spacer !default;
-$blockquote-font-size: $font-size-base * 1.25 !default;
-$blockquote-footer-color: $gray-600 !default;
-$blockquote-footer-font-size: $small-font-size !default;
-
-$hr-margin-y: $spacer !default;
-$hr-color: inherit !default;
-
-// fusv-disable
-$hr-bg-color: null !default; // Deprecated in v5.2.0
-$hr-height: null !default; // Deprecated in v5.2.0
-// fusv-enable
-
-$hr-border-color: null !default; // Allows for inherited colors
-$hr-border-width: var(--#{$prefix}border-width) !default;
-$hr-opacity: .25 !default;
-
-// scss-docs-start vr-variables
-$vr-border-width: var(--#{$prefix}border-width) !default;
-// scss-docs-end vr-variables
-
-$legend-margin-bottom: .5rem !default;
-$legend-font-size: 1.5rem !default;
-$legend-font-weight: null !default;
-
-$dt-font-weight: $font-weight-bold !default;
-
-$list-inline-padding: .5rem !default;
-
-$mark-padding: .1875em !default;
-$mark-color: $body-color !default;
-$mark-bg: $yellow-100 !default;
-// scss-docs-end type-variables
-
-
-// Tables
-//
-// Customizes the `.table` component with basic values, each used across all table variations.
-
-// scss-docs-start table-variables
-$table-cell-padding-y: .5rem !default;
-$table-cell-padding-x: .5rem !default;
-$table-cell-padding-y-sm: .25rem !default;
-$table-cell-padding-x-sm: .25rem !default;
-
-$table-cell-vertical-align: top !default;
-
-$table-color: var(--#{$prefix}emphasis-color) !default;
-$table-bg: var(--#{$prefix}body-bg) !default;
-$table-accent-bg: transparent !default;
-
-$table-th-font-weight: null !default;
-
-$table-striped-color: $table-color !default;
-$table-striped-bg-factor: .05 !default;
-$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;
-
-$table-active-color: $table-color !default;
-$table-active-bg-factor: .1 !default;
-$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;
-
-$table-hover-color: $table-color !default;
-$table-hover-bg-factor: .075 !default;
-$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;
-
-$table-border-factor: .2 !default;
-$table-border-width: var(--#{$prefix}border-width) !default;
-$table-border-color: var(--#{$prefix}border-color) !default;
-
-$table-striped-order: odd !default;
-$table-striped-columns-order: even !default;
-
-$table-group-separator-color: currentcolor !default;
-
-$table-caption-color: var(--#{$prefix}secondary-color) !default;
-
-$table-bg-scale: -80% !default;
-// scss-docs-end table-variables
-
-// scss-docs-start table-loop
-$table-variants: (
- "primary": shift-color($primary, $table-bg-scale),
- "secondary": shift-color($secondary, $table-bg-scale),
- "success": shift-color($success, $table-bg-scale),
- "info": shift-color($info, $table-bg-scale),
- "warning": shift-color($warning, $table-bg-scale),
- "danger": shift-color($danger, $table-bg-scale),
- "light": $light,
- "dark": $dark,
-) !default;
-// scss-docs-end table-loop
-
-
-// Buttons + Forms
-//
-// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
-
-// scss-docs-start input-btn-variables
-$input-btn-padding-y: .375rem !default;
-$input-btn-padding-x: .75rem !default;
-$input-btn-font-family: null !default;
-$input-btn-font-size: $font-size-base !default;
-$input-btn-line-height: $line-height-base !default;
-
-$input-btn-focus-width: $focus-ring-width !default;
-$input-btn-focus-color-opacity: $focus-ring-opacity !default;
-$input-btn-focus-color: $focus-ring-color !default;
-$input-btn-focus-blur: $focus-ring-blur !default;
-$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;
-
-$input-btn-padding-y-sm: .25rem !default;
-$input-btn-padding-x-sm: .5rem !default;
-$input-btn-font-size-sm: $font-size-sm !default;
-
-$input-btn-padding-y-lg: .5rem !default;
-$input-btn-padding-x-lg: 1rem !default;
-$input-btn-font-size-lg: $font-size-lg !default;
-
-$input-btn-border-width: var(--#{$prefix}border-width) !default;
-// scss-docs-end input-btn-variables
-
-
-// Buttons
-//
-// For each of Bootstrap's buttons, define text, background, and border color.
-
-// scss-docs-start btn-variables
-$btn-color: var(--#{$prefix}body-color) !default;
-$btn-padding-y: $input-btn-padding-y !default;
-$btn-padding-x: $input-btn-padding-x !default;
-$btn-font-family: $input-btn-font-family !default;
-$btn-font-size: $input-btn-font-size !default;
-$btn-line-height: $input-btn-line-height !default;
-$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping
-
-$btn-padding-y-sm: $input-btn-padding-y-sm !default;
-$btn-padding-x-sm: $input-btn-padding-x-sm !default;
-$btn-font-size-sm: $input-btn-font-size-sm !default;
-
-$btn-padding-y-lg: $input-btn-padding-y-lg !default;
-$btn-padding-x-lg: $input-btn-padding-x-lg !default;
-$btn-font-size-lg: $input-btn-font-size-lg !default;
-
-$btn-border-width: $input-btn-border-width !default;
-
-$btn-font-weight: $font-weight-normal !default;
-$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
-$btn-focus-width: $input-btn-focus-width !default;
-$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$btn-disabled-opacity: .65 !default;
-$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
-
-$btn-link-color: var(--#{$prefix}link-color) !default;
-$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;
-$btn-link-disabled-color: $gray-600 !default;
-$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;
-
-// Allows for customizing button radius independently from global border radius
-$btn-border-radius: var(--#{$prefix}border-radius) !default;
-$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
-$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
-
-$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$btn-hover-bg-shade-amount: 15% !default;
-$btn-hover-bg-tint-amount: 15% !default;
-$btn-hover-border-shade-amount: 20% !default;
-$btn-hover-border-tint-amount: 10% !default;
-$btn-active-bg-shade-amount: 20% !default;
-$btn-active-bg-tint-amount: 20% !default;
-$btn-active-border-shade-amount: 25% !default;
-$btn-active-border-tint-amount: 10% !default;
-// scss-docs-end btn-variables
-
-
-// Forms
-
-// scss-docs-start form-text-variables
-$form-text-margin-top: .25rem !default;
-$form-text-font-size: $small-font-size !default;
-$form-text-font-style: null !default;
-$form-text-font-weight: null !default;
-$form-text-color: var(--#{$prefix}secondary-color) !default;
-// scss-docs-end form-text-variables
-
-// scss-docs-start form-label-variables
-$form-label-margin-bottom: .5rem !default;
-$form-label-font-size: null !default;
-$form-label-font-style: null !default;
-$form-label-font-weight: null !default;
-$form-label-color: null !default;
-// scss-docs-end form-label-variables
-
-// scss-docs-start form-input-variables
-$input-padding-y: $input-btn-padding-y !default;
-$input-padding-x: $input-btn-padding-x !default;
-$input-font-family: $input-btn-font-family !default;
-$input-font-size: $input-btn-font-size !default;
-$input-font-weight: $font-weight-base !default;
-$input-line-height: $input-btn-line-height !default;
-
-$input-padding-y-sm: $input-btn-padding-y-sm !default;
-$input-padding-x-sm: $input-btn-padding-x-sm !default;
-$input-font-size-sm: $input-btn-font-size-sm !default;
-
-$input-padding-y-lg: $input-btn-padding-y-lg !default;
-$input-padding-x-lg: $input-btn-padding-x-lg !default;
-$input-font-size-lg: $input-btn-font-size-lg !default;
-
-$input-bg: var(--#{$prefix}body-bg) !default;
-$input-disabled-color: null !default;
-$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;
-$input-disabled-border-color: null !default;
-
-$input-color: var(--#{$prefix}body-color) !default;
-$input-border-color: var(--#{$prefix}border-color) !default;
-$input-border-width: $input-btn-border-width !default;
-$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;
-
-$input-border-radius: var(--#{$prefix}border-radius) !default;
-$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
-$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
-
-$input-focus-bg: $input-bg !default;
-$input-focus-border-color: tint-color($component-active-bg, 50%) !default;
-$input-focus-color: $input-color !default;
-$input-focus-width: $input-btn-focus-width !default;
-$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
-
-$input-placeholder-color: var(--#{$prefix}secondary-color) !default;
-$input-plaintext-color: var(--#{$prefix}body-color) !default;
-
-$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list
-
-$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;
-$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;
-$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;
-
-$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;
-$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;
-$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;
-
-$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$form-color-width: 3rem !default;
-// scss-docs-end form-input-variables
-
-// scss-docs-start form-check-variables
-$form-check-input-width: 1em !default;
-$form-check-min-height: $font-size-base * $line-height-base !default;
-$form-check-padding-start: $form-check-input-width + .5em !default;
-$form-check-margin-bottom: .125rem !default;
-$form-check-label-color: null !default;
-$form-check-label-cursor: null !default;
-$form-check-transition: null !default;
-
-$form-check-input-active-filter: brightness(90%) !default;
-
-$form-check-input-bg: $input-bg !default;
-$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;
-$form-check-input-border-radius: .25em !default;
-$form-check-radio-border-radius: 50% !default;
-$form-check-input-focus-border: $input-focus-border-color !default;
-$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;
-
-$form-check-input-checked-color: $component-active-color !default;
-$form-check-input-checked-bg-color: $component-active-bg !default;
-$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;
-$form-check-input-checked-bg-image: url("data:image/svg+xml,
") !default;
-$form-check-radio-checked-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-check-input-indeterminate-color: $component-active-color !default;
-$form-check-input-indeterminate-bg-color: $component-active-bg !default;
-$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;
-$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-check-input-disabled-opacity: .5 !default;
-$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;
-$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;
-
-$form-check-inline-margin-end: 1rem !default;
-// scss-docs-end form-check-variables
-
-// scss-docs-start form-switch-variables
-$form-switch-color: rgba($black, .25) !default;
-$form-switch-width: 2em !default;
-$form-switch-padding-start: $form-switch-width + .5em !default;
-$form-switch-bg-image: url("data:image/svg+xml,
") !default;
-$form-switch-border-radius: $form-switch-width !default;
-$form-switch-transition: background-position .15s ease-in-out !default;
-
-$form-switch-focus-color: $input-focus-border-color !default;
-$form-switch-focus-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-switch-checked-color: $component-active-color !default;
-$form-switch-checked-bg-image: url("data:image/svg+xml,
") !default;
-$form-switch-checked-bg-position: right center !default;
-// scss-docs-end form-switch-variables
-
-// scss-docs-start input-group-variables
-$input-group-addon-padding-y: $input-padding-y !default;
-$input-group-addon-padding-x: $input-padding-x !default;
-$input-group-addon-font-weight: $input-font-weight !default;
-$input-group-addon-color: $input-color !default;
-$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;
-$input-group-addon-border-color: $input-border-color !default;
-// scss-docs-end input-group-variables
-
-// scss-docs-start form-select-variables
-$form-select-padding-y: $input-padding-y !default;
-$form-select-padding-x: $input-padding-x !default;
-$form-select-font-family: $input-font-family !default;
-$form-select-font-size: $input-font-size !default;
-$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image
-$form-select-font-weight: $input-font-weight !default;
-$form-select-line-height: $input-line-height !default;
-$form-select-color: $input-color !default;
-$form-select-bg: $input-bg !default;
-$form-select-disabled-color: null !default;
-$form-select-disabled-bg: $input-disabled-bg !default;
-$form-select-disabled-border-color: $input-disabled-border-color !default;
-$form-select-bg-position: right $form-select-padding-x center !default;
-$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions
-$form-select-indicator-color: $gray-800 !default;
-$form-select-indicator: url("data:image/svg+xml,
") !default;
-
-$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;
-$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;
-$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
-
-$form-select-border-width: $input-border-width !default;
-$form-select-border-color: $input-border-color !default;
-$form-select-border-radius: $input-border-radius !default;
-$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;
-
-$form-select-focus-border-color: $input-focus-border-color !default;
-$form-select-focus-width: $input-focus-width !default;
-$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;
-
-$form-select-padding-y-sm: $input-padding-y-sm !default;
-$form-select-padding-x-sm: $input-padding-x-sm !default;
-$form-select-font-size-sm: $input-font-size-sm !default;
-$form-select-border-radius-sm: $input-border-radius-sm !default;
-
-$form-select-padding-y-lg: $input-padding-y-lg !default;
-$form-select-padding-x-lg: $input-padding-x-lg !default;
-$form-select-font-size-lg: $input-font-size-lg !default;
-$form-select-border-radius-lg: $input-border-radius-lg !default;
-
-$form-select-transition: $input-transition !default;
-// scss-docs-end form-select-variables
-
-// scss-docs-start form-range-variables
-$form-range-track-width: 100% !default;
-$form-range-track-height: .5rem !default;
-$form-range-track-cursor: pointer !default;
-$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;
-$form-range-track-border-radius: 1rem !default;
-$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;
-
-$form-range-thumb-width: 1rem !default;
-$form-range-thumb-height: $form-range-thumb-width !default;
-$form-range-thumb-bg: $component-active-bg !default;
-$form-range-thumb-border: 0 !default;
-$form-range-thumb-border-radius: 1rem !default;
-$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
-$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;
-$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge
-$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;
-$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;
-$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-// scss-docs-end form-range-variables
-
-// scss-docs-start form-file-variables
-$form-file-button-color: $input-color !default;
-$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;
-$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;
-// scss-docs-end form-file-variables
-
-// scss-docs-start form-floating-variables
-$form-floating-height: add(3.5rem, $input-height-border) !default;
-$form-floating-line-height: 1.25 !default;
-$form-floating-padding-x: $input-padding-x !default;
-$form-floating-padding-y: 1rem !default;
-$form-floating-input-padding-t: 1.625rem !default;
-$form-floating-input-padding-b: .625rem !default;
-$form-floating-label-height: 1.5em !default;
-$form-floating-label-opacity: .65 !default;
-$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;
-$form-floating-label-disabled-color: $gray-600 !default;
-$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;
-// scss-docs-end form-floating-variables
-
-// Form validation
-
-// scss-docs-start form-feedback-variables
-$form-feedback-margin-top: $form-text-margin-top !default;
-$form-feedback-font-size: $form-text-font-size !default;
-$form-feedback-font-style: $form-text-font-style !default;
-$form-feedback-valid-color: $success !default;
-$form-feedback-invalid-color: $danger !default;
-
-$form-feedback-icon-valid-color: $form-feedback-valid-color !default;
-$form-feedback-icon-valid: url("data:image/svg+xml,
") !default;
-$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;
-$form-feedback-icon-invalid: url("data:image/svg+xml,
") !default;
-// scss-docs-end form-feedback-variables
-
-// scss-docs-start form-validation-colors
-$form-valid-color: $form-feedback-valid-color !default;
-$form-valid-border-color: $form-feedback-valid-color !default;
-$form-invalid-color: $form-feedback-invalid-color !default;
-$form-invalid-border-color: $form-feedback-invalid-color !default;
-// scss-docs-end form-validation-colors
-
-// scss-docs-start form-validation-states
-$form-validation-states: (
- "valid": (
- "color": var(--#{$prefix}form-valid-color),
- "icon": $form-feedback-icon-valid,
- "tooltip-color": #fff,
- "tooltip-bg-color": var(--#{$prefix}success),
- "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),
- "border-color": var(--#{$prefix}form-valid-border-color),
- ),
- "invalid": (
- "color": var(--#{$prefix}form-invalid-color),
- "icon": $form-feedback-icon-invalid,
- "tooltip-color": #fff,
- "tooltip-bg-color": var(--#{$prefix}danger),
- "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),
- "border-color": var(--#{$prefix}form-invalid-border-color),
- )
-) !default;
-// scss-docs-end form-validation-states
-
-// Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-
-// scss-docs-start zindex-stack
-$zindex-dropdown: 1000 !default;
-$zindex-sticky: 1020 !default;
-$zindex-fixed: 1030 !default;
-$zindex-offcanvas-backdrop: 1040 !default;
-$zindex-offcanvas: 1045 !default;
-$zindex-modal-backdrop: 1050 !default;
-$zindex-modal: 1055 !default;
-$zindex-popover: 1070 !default;
-$zindex-tooltip: 1080 !default;
-$zindex-toast: 1090 !default;
-// scss-docs-end zindex-stack
-
-// scss-docs-start zindex-levels-map
-$zindex-levels: (
- n1: -1,
- 0: 0,
- 1: 1,
- 2: 2,
- 3: 3
-) !default;
-// scss-docs-end zindex-levels-map
-
-
-// Navs
-
-// scss-docs-start nav-variables
-$nav-link-padding-y: .5rem !default;
-$nav-link-padding-x: 1rem !default;
-$nav-link-font-size: null !default;
-$nav-link-font-weight: null !default;
-$nav-link-color: var(--#{$prefix}link-color) !default;
-$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;
-$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;
-$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;
-$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;
-
-$nav-tabs-border-color: var(--#{$prefix}border-color) !default;
-$nav-tabs-border-width: var(--#{$prefix}border-width) !default;
-$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;
-$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;
-$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;
-$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;
-$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;
-
-$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;
-$nav-pills-link-active-color: $component-active-color !default;
-$nav-pills-link-active-bg: $component-active-bg !default;
-
-$nav-underline-gap: 1rem !default;
-$nav-underline-border-width: .125rem !default;
-$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;
-// scss-docs-end nav-variables
-
-
-// Navbar
-
-// scss-docs-start navbar-variables
-$navbar-padding-y: $spacer * .5 !default;
-$navbar-padding-x: null !default;
-
-$navbar-nav-link-padding-x: .5rem !default;
-
-$navbar-brand-font-size: $font-size-lg !default;
-// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
-$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;
-$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
-$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;
-$navbar-brand-margin-end: 1rem !default;
-
-$navbar-toggler-padding-y: .25rem !default;
-$navbar-toggler-padding-x: .75rem !default;
-$navbar-toggler-font-size: $font-size-lg !default;
-$navbar-toggler-border-radius: $btn-border-radius !default;
-$navbar-toggler-focus-width: $btn-focus-width !default;
-$navbar-toggler-transition: box-shadow .15s ease-in-out !default;
-
-$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;
-$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;
-$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;
-$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;
-$navbar-light-icon-color: rgba($body-color, .75) !default;
-$navbar-light-toggler-icon-bg: url("data:image/svg+xml,
") !default;
-$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;
-$navbar-light-brand-color: $navbar-light-active-color !default;
-$navbar-light-brand-hover-color: $navbar-light-active-color !default;
-// scss-docs-end navbar-variables
-
-// scss-docs-start navbar-dark-variables
-$navbar-dark-color: rgba($white, .55) !default;
-$navbar-dark-hover-color: rgba($white, .75) !default;
-$navbar-dark-active-color: $white !default;
-$navbar-dark-disabled-color: rgba($white, .25) !default;
-$navbar-dark-icon-color: $navbar-dark-color !default;
-$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,
") !default;
-$navbar-dark-toggler-border-color: rgba($white, .1) !default;
-$navbar-dark-brand-color: $navbar-dark-active-color !default;
-$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
-// scss-docs-end navbar-dark-variables
-
-
-// Dropdowns
-//
-// Dropdown menu container and contents.
-
-// scss-docs-start dropdown-variables
-$dropdown-min-width: 10rem !default;
-$dropdown-padding-x: 0 !default;
-$dropdown-padding-y: .5rem !default;
-$dropdown-spacer: .125rem !default;
-$dropdown-font-size: $font-size-base !default;
-$dropdown-color: var(--#{$prefix}body-color) !default;
-$dropdown-bg: var(--#{$prefix}body-bg) !default;
-$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;
-$dropdown-border-radius: var(--#{$prefix}border-radius) !default;
-$dropdown-border-width: var(--#{$prefix}border-width) !default;
-$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list
-$dropdown-divider-bg: $dropdown-border-color !default;
-$dropdown-divider-margin-y: $spacer * .5 !default;
-$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;
-
-$dropdown-link-color: var(--#{$prefix}body-color) !default;
-$dropdown-link-hover-color: $dropdown-link-color !default;
-$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;
-
-$dropdown-link-active-color: $component-active-color !default;
-$dropdown-link-active-bg: $component-active-bg !default;
-
-$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;
-
-$dropdown-item-padding-y: $spacer * .25 !default;
-$dropdown-item-padding-x: $spacer !default;
-
-$dropdown-header-color: $gray-600 !default;
-$dropdown-header-padding-x: $dropdown-item-padding-x !default;
-$dropdown-header-padding-y: $dropdown-padding-y !default;
-// fusv-disable
-$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0
-// fusv-enable
-// scss-docs-end dropdown-variables
-
-// scss-docs-start dropdown-dark-variables
-$dropdown-dark-color: $gray-300 !default;
-$dropdown-dark-bg: $gray-800 !default;
-$dropdown-dark-border-color: $dropdown-border-color !default;
-$dropdown-dark-divider-bg: $dropdown-divider-bg !default;
-$dropdown-dark-box-shadow: null !default;
-$dropdown-dark-link-color: $dropdown-dark-color !default;
-$dropdown-dark-link-hover-color: $white !default;
-$dropdown-dark-link-hover-bg: rgba($white, .15) !default;
-$dropdown-dark-link-active-color: $dropdown-link-active-color !default;
-$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;
-$dropdown-dark-link-disabled-color: $gray-500 !default;
-$dropdown-dark-header-color: $gray-500 !default;
-// scss-docs-end dropdown-dark-variables
-
-
-// Pagination
-
-// scss-docs-start pagination-variables
-$pagination-padding-y: .375rem !default;
-$pagination-padding-x: .75rem !default;
-$pagination-padding-y-sm: .25rem !default;
-$pagination-padding-x-sm: .5rem !default;
-$pagination-padding-y-lg: .75rem !default;
-$pagination-padding-x-lg: 1.5rem !default;
-
-$pagination-font-size: $font-size-base !default;
-
-$pagination-color: var(--#{$prefix}link-color) !default;
-$pagination-bg: var(--#{$prefix}body-bg) !default;
-$pagination-border-radius: var(--#{$prefix}border-radius) !default;
-$pagination-border-width: var(--#{$prefix}border-width) !default;
-$pagination-margin-start: calc(-1 * #{$pagination-border-width}) !default; // stylelint-disable-line function-disallowed-list
-$pagination-border-color: var(--#{$prefix}border-color) !default;
-
-$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;
-$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;
-$pagination-focus-box-shadow: $focus-ring-box-shadow !default;
-$pagination-focus-outline: 0 !default;
-
-$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;
-$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;
-$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?
-
-$pagination-active-color: $component-active-color !default;
-$pagination-active-bg: $component-active-bg !default;
-$pagination-active-border-color: $component-active-bg !default;
-
-$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;
-$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;
-$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;
-
-$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;
-$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;
-// scss-docs-end pagination-variables
-
-
-// Placeholders
-
-// scss-docs-start placeholders
-$placeholder-opacity-max: .5 !default;
-$placeholder-opacity-min: .2 !default;
-// scss-docs-end placeholders
-
-// Cards
-
-// scss-docs-start card-variables
-$card-spacer-y: $spacer !default;
-$card-spacer-x: $spacer !default;
-$card-title-spacer-y: $spacer * .5 !default;
-$card-title-color: null !default;
-$card-subtitle-color: null !default;
-$card-border-width: var(--#{$prefix}border-width) !default;
-$card-border-color: var(--#{$prefix}border-color-translucent) !default;
-$card-border-radius: var(--#{$prefix}border-radius) !default;
-$card-box-shadow: null !default;
-$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;
-$card-cap-padding-y: $card-spacer-y * .5 !default;
-$card-cap-padding-x: $card-spacer-x !default;
-$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;
-$card-cap-color: null !default;
-$card-height: null !default;
-$card-color: null !default;
-$card-bg: var(--#{$prefix}body-bg) !default;
-$card-img-overlay-padding: $spacer !default;
-$card-group-margin: $grid-gutter-width * .5 !default;
-// scss-docs-end card-variables
-
-// Accordion
-
-// scss-docs-start accordion-variables
-$accordion-padding-y: 1rem !default;
-$accordion-padding-x: 1.25rem !default;
-$accordion-color: var(--#{$prefix}body-color) !default;
-$accordion-bg: var(--#{$prefix}body-bg) !default;
-$accordion-border-width: var(--#{$prefix}border-width) !default;
-$accordion-border-color: var(--#{$prefix}border-color) !default;
-$accordion-border-radius: var(--#{$prefix}border-radius) !default;
-$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;
-
-$accordion-body-padding-y: $accordion-padding-y !default;
-$accordion-body-padding-x: $accordion-padding-x !default;
-
-$accordion-button-padding-y: $accordion-padding-y !default;
-$accordion-button-padding-x: $accordion-padding-x !default;
-$accordion-button-color: var(--#{$prefix}body-color) !default;
-$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;
-$accordion-transition: $btn-transition, border-radius .15s ease !default;
-$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;
-$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;
-
-// fusv-disable
-$accordion-button-focus-border-color: $input-focus-border-color !default; // Deprecated in v5.3.3
-// fusv-enable
-$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;
-
-$accordion-icon-width: 1.25rem !default;
-$accordion-icon-color: $body-color !default;
-$accordion-icon-active-color: $primary-text-emphasis !default;
-$accordion-icon-transition: transform .2s ease-in-out !default;
-$accordion-icon-transform: rotate(-180deg) !default;
-
-$accordion-button-icon: url("data:image/svg+xml,
") !default;
-$accordion-button-active-icon: url("data:image/svg+xml,
") !default;
-// scss-docs-end accordion-variables
-
-// Tooltips
-
-// scss-docs-start tooltip-variables
-$tooltip-font-size: $font-size-sm !default;
-$tooltip-max-width: 200px !default;
-$tooltip-color: var(--#{$prefix}body-bg) !default;
-$tooltip-bg: var(--#{$prefix}emphasis-color) !default;
-$tooltip-border-radius: var(--#{$prefix}border-radius) !default;
-$tooltip-opacity: .9 !default;
-$tooltip-padding-y: $spacer * .25 !default;
-$tooltip-padding-x: $spacer * .5 !default;
-$tooltip-margin: null !default; // TODO: remove this in v6
-
-$tooltip-arrow-width: .8rem !default;
-$tooltip-arrow-height: .4rem !default;
-// fusv-disable
-$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables
-// fusv-enable
-// scss-docs-end tooltip-variables
-
-// Form tooltips must come after regular tooltips
-// scss-docs-start tooltip-feedback-variables
-$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;
-$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;
-$form-feedback-tooltip-font-size: $tooltip-font-size !default;
-$form-feedback-tooltip-line-height: null !default;
-$form-feedback-tooltip-opacity: $tooltip-opacity !default;
-$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;
-// scss-docs-end tooltip-feedback-variables
-
-
-// Popovers
-
-// scss-docs-start popover-variables
-$popover-font-size: $font-size-sm !default;
-$popover-bg: var(--#{$prefix}body-bg) !default;
-$popover-max-width: 276px !default;
-$popover-border-width: var(--#{$prefix}border-width) !default;
-$popover-border-color: var(--#{$prefix}border-color-translucent) !default;
-$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;
-$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list
-$popover-box-shadow: var(--#{$prefix}box-shadow) !default;
-
-$popover-header-font-size: $font-size-base !default;
-$popover-header-bg: var(--#{$prefix}secondary-bg) !default;
-$popover-header-color: $headings-color !default;
-$popover-header-padding-y: .5rem !default;
-$popover-header-padding-x: $spacer !default;
-
-$popover-body-color: var(--#{$prefix}body-color) !default;
-$popover-body-padding-y: $spacer !default;
-$popover-body-padding-x: $spacer !default;
-
-$popover-arrow-width: 1rem !default;
-$popover-arrow-height: .5rem !default;
-// scss-docs-end popover-variables
-
-// fusv-disable
-// Deprecated in Bootstrap 5.2.0 for CSS variables
-$popover-arrow-color: $popover-bg !default;
-$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;
-// fusv-enable
-
-
-// Toasts
-
-// scss-docs-start toast-variables
-$toast-max-width: 350px !default;
-$toast-padding-x: .75rem !default;
-$toast-padding-y: .5rem !default;
-$toast-font-size: .875rem !default;
-$toast-color: null !default;
-$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;
-$toast-border-width: var(--#{$prefix}border-width) !default;
-$toast-border-color: var(--#{$prefix}border-color-translucent) !default;
-$toast-border-radius: var(--#{$prefix}border-radius) !default;
-$toast-box-shadow: var(--#{$prefix}box-shadow) !default;
-$toast-spacing: $container-padding-x !default;
-
-$toast-header-color: var(--#{$prefix}secondary-color) !default;
-$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;
-$toast-header-border-color: $toast-border-color !default;
-// scss-docs-end toast-variables
-
-
-// Badges
-
-// scss-docs-start badge-variables
-$badge-font-size: .75em !default;
-$badge-font-weight: $font-weight-bold !default;
-$badge-color: $white !default;
-$badge-padding-y: .35em !default;
-$badge-padding-x: .65em !default;
-$badge-border-radius: var(--#{$prefix}border-radius) !default;
-// scss-docs-end badge-variables
-
-
-// Modals
-
-// scss-docs-start modal-variables
-$modal-inner-padding: $spacer !default;
-
-$modal-footer-margin-between: .5rem !default;
-
-$modal-dialog-margin: .5rem !default;
-$modal-dialog-margin-y-sm-up: 1.75rem !default;
-
-$modal-title-line-height: $line-height-base !default;
-
-$modal-content-color: var(--#{$prefix}body-color) !default;
-$modal-content-bg: var(--#{$prefix}body-bg) !default;
-$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;
-$modal-content-border-width: var(--#{$prefix}border-width) !default;
-$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;
-$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;
-$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;
-$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;
-
-$modal-backdrop-bg: $black !default;
-$modal-backdrop-opacity: .5 !default;
-
-$modal-header-border-color: var(--#{$prefix}border-color) !default;
-$modal-header-border-width: $modal-content-border-width !default;
-$modal-header-padding-y: $modal-inner-padding !default;
-$modal-header-padding-x: $modal-inner-padding !default;
-$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility
-
-$modal-footer-bg: null !default;
-$modal-footer-border-color: $modal-header-border-color !default;
-$modal-footer-border-width: $modal-header-border-width !default;
-
-$modal-sm: 300px !default;
-$modal-md: 500px !default;
-$modal-lg: 800px !default;
-$modal-xl: 1140px !default;
-
-$modal-fade-transform: translate(0, -50px) !default;
-$modal-show-transform: none !default;
-$modal-transition: transform .3s ease-out !default;
-$modal-scale-transform: scale(1.02) !default;
-// scss-docs-end modal-variables
-
-
-// Alerts
-//
-// Define alert colors, border radius, and padding.
-
-// scss-docs-start alert-variables
-$alert-padding-y: $spacer !default;
-$alert-padding-x: $spacer !default;
-$alert-margin-bottom: 1rem !default;
-$alert-border-radius: var(--#{$prefix}border-radius) !default;
-$alert-link-font-weight: $font-weight-bold !default;
-$alert-border-width: var(--#{$prefix}border-width) !default;
-$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side
-// scss-docs-end alert-variables
-
-// fusv-disable
-$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6
-$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6
-$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6
-// fusv-enable
-
-// Progress bars
-
-// scss-docs-start progress-variables
-$progress-height: 1rem !default;
-$progress-font-size: $font-size-base * .75 !default;
-$progress-bg: var(--#{$prefix}secondary-bg) !default;
-$progress-border-radius: var(--#{$prefix}border-radius) !default;
-$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;
-$progress-bar-color: $white !default;
-$progress-bar-bg: $primary !default;
-$progress-bar-animation-timing: 1s linear infinite !default;
-$progress-bar-transition: width .6s ease !default;
-// scss-docs-end progress-variables
-
-
-// List group
-
-// scss-docs-start list-group-variables
-$list-group-color: var(--#{$prefix}body-color) !default;
-$list-group-bg: var(--#{$prefix}body-bg) !default;
-$list-group-border-color: var(--#{$prefix}border-color) !default;
-$list-group-border-width: var(--#{$prefix}border-width) !default;
-$list-group-border-radius: var(--#{$prefix}border-radius) !default;
-
-$list-group-item-padding-y: $spacer * .5 !default;
-$list-group-item-padding-x: $spacer !default;
-// fusv-disable
-$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0
-$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0
-// fusv-enable
-
-$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;
-$list-group-active-color: $component-active-color !default;
-$list-group-active-bg: $component-active-bg !default;
-$list-group-active-border-color: $list-group-active-bg !default;
-
-$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;
-$list-group-disabled-bg: $list-group-bg !default;
-
-$list-group-action-color: var(--#{$prefix}secondary-color) !default;
-$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;
-
-$list-group-action-active-color: var(--#{$prefix}body-color) !default;
-$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;
-// scss-docs-end list-group-variables
-
-
-// Image thumbnails
-
-// scss-docs-start thumbnail-variables
-$thumbnail-padding: .25rem !default;
-$thumbnail-bg: var(--#{$prefix}body-bg) !default;
-$thumbnail-border-width: var(--#{$prefix}border-width) !default;
-$thumbnail-border-color: var(--#{$prefix}border-color) !default;
-$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;
-$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;
-// scss-docs-end thumbnail-variables
-
-
-// Figures
-
-// scss-docs-start figure-variables
-$figure-caption-font-size: $small-font-size !default;
-$figure-caption-color: var(--#{$prefix}secondary-color) !default;
-// scss-docs-end figure-variables
-
-
-// Breadcrumbs
-
-// scss-docs-start breadcrumb-variables
-$breadcrumb-font-size: null !default;
-$breadcrumb-padding-y: 0 !default;
-$breadcrumb-padding-x: 0 !default;
-$breadcrumb-item-padding-x: .5rem !default;
-$breadcrumb-margin-bottom: 1rem !default;
-$breadcrumb-bg: null !default;
-$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;
-$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;
-$breadcrumb-divider: quote("/") !default;
-$breadcrumb-divider-flipped: $breadcrumb-divider !default;
-$breadcrumb-border-radius: null !default;
-// scss-docs-end breadcrumb-variables
-
-// Carousel
-
-// scss-docs-start carousel-variables
-$carousel-control-color: $white !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-$carousel-control-hover-opacity: .9 !default;
-$carousel-control-transition: opacity .15s ease !default;
-$carousel-control-icon-filter: null !default;
-
-$carousel-indicator-width: 30px !default;
-$carousel-indicator-height: 3px !default;
-$carousel-indicator-hit-area-height: 10px !default;
-$carousel-indicator-spacer: 3px !default;
-$carousel-indicator-opacity: .5 !default;
-$carousel-indicator-active-bg: $white !default;
-$carousel-indicator-active-opacity: 1 !default;
-$carousel-indicator-transition: opacity .6s ease !default;
-
-$carousel-caption-width: 70% !default;
-$carousel-caption-color: $white !default;
-$carousel-caption-padding-y: 1.25rem !default;
-$carousel-caption-spacer: 1.25rem !default;
-
-$carousel-control-icon-width: 2rem !default;
-
-$carousel-control-prev-icon-bg: url("data:image/svg+xml,
") !default;
-$carousel-control-next-icon-bg: url("data:image/svg+xml,
") !default;
-
-$carousel-transition-duration: .6s !default;
-$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
-// scss-docs-end carousel-variables
-
-// scss-docs-start carousel-dark-variables
-$carousel-dark-indicator-active-bg: $black !default; // Deprecated in v5.3.4
-$carousel-dark-caption-color: $black !default; // Deprecated in v5.3.4
-$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; // Deprecated in v5.3.4
-// scss-docs-end carousel-dark-variables
-
-
-// Spinners
-
-// scss-docs-start spinner-variables
-$spinner-width: 2rem !default;
-$spinner-height: $spinner-width !default;
-$spinner-vertical-align: -.125em !default;
-$spinner-border-width: .25em !default;
-$spinner-animation-speed: .75s !default;
-
-$spinner-width-sm: 1rem !default;
-$spinner-height-sm: $spinner-width-sm !default;
-$spinner-border-width-sm: .2em !default;
-// scss-docs-end spinner-variables
-
-
-// Close
-
-// scss-docs-start close-variables
-$btn-close-width: 1em !default;
-$btn-close-height: $btn-close-width !default;
-$btn-close-padding-x: .25em !default;
-$btn-close-padding-y: $btn-close-padding-x !default;
-$btn-close-color: $black !default;
-$btn-close-bg: url("data:image/svg+xml,
") !default;
-$btn-close-focus-shadow: $focus-ring-box-shadow !default;
-$btn-close-opacity: .5 !default;
-$btn-close-hover-opacity: .75 !default;
-$btn-close-focus-opacity: 1 !default;
-$btn-close-disabled-opacity: .25 !default;
-$btn-close-filter: null !default;
-$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; // Deprecated in v5.3.4
-// scss-docs-end close-variables
-
-
-// Offcanvas
-
-// scss-docs-start offcanvas-variables
-$offcanvas-padding-y: $modal-inner-padding !default;
-$offcanvas-padding-x: $modal-inner-padding !default;
-$offcanvas-horizontal-width: 400px !default;
-$offcanvas-vertical-height: 30vh !default;
-$offcanvas-transition-duration: .3s !default;
-$offcanvas-border-color: $modal-content-border-color !default;
-$offcanvas-border-width: $modal-content-border-width !default;
-$offcanvas-title-line-height: $modal-title-line-height !default;
-$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;
-$offcanvas-color: var(--#{$prefix}body-color) !default;
-$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;
-$offcanvas-backdrop-bg: $modal-backdrop-bg !default;
-$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;
-// scss-docs-end offcanvas-variables
-
-// Code
-
-$code-font-size: $small-font-size !default;
-$code-color: $pink !default;
-
-$kbd-padding-y: .1875rem !default;
-$kbd-padding-x: .375rem !default;
-$kbd-font-size: $code-font-size !default;
-$kbd-color: var(--#{$prefix}body-bg) !default;
-$kbd-bg: var(--#{$prefix}body-color) !default;
-$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6
-
-$pre-color: null !default;
-
-@import "variables-dark"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3
diff --git a/publish/wwwroot/lib/bootstrap/scss/bootstrap-grid.scss b/publish/wwwroot/lib/bootstrap/scss/bootstrap-grid.scss
deleted file mode 100644
index 52bd577..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/bootstrap-grid.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-@import "mixins/banner";
-@include bsBanner(Grid);
-
-$include-column-box-sizing: true !default;
-
-@import "functions";
-@import "variables";
-@import "variables-dark";
-@import "maps";
-
-@import "mixins/breakpoints";
-@import "mixins/container";
-@import "mixins/grid";
-@import "mixins/utilities";
-
-@import "vendor/rfs";
-
-@import "containers";
-@import "grid";
-
-@import "utilities";
-// Only use the utilities we need
-// stylelint-disable-next-line scss/dollar-variable-default
-$utilities: map-get-multiple(
- $utilities,
- (
- "display",
- "order",
- "flex",
- "flex-direction",
- "flex-grow",
- "flex-shrink",
- "flex-wrap",
- "justify-content",
- "align-items",
- "align-content",
- "align-self",
- "margin",
- "margin-x",
- "margin-y",
- "margin-top",
- "margin-end",
- "margin-bottom",
- "margin-start",
- "negative-margin",
- "negative-margin-x",
- "negative-margin-y",
- "negative-margin-top",
- "negative-margin-end",
- "negative-margin-bottom",
- "negative-margin-start",
- "padding",
- "padding-x",
- "padding-y",
- "padding-top",
- "padding-end",
- "padding-bottom",
- "padding-start",
- )
-);
-
-@import "utilities/api";
diff --git a/publish/wwwroot/lib/bootstrap/scss/bootstrap-reboot.scss b/publish/wwwroot/lib/bootstrap/scss/bootstrap-reboot.scss
deleted file mode 100644
index 5b69b95..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/bootstrap-reboot.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "mixins/banner";
-@include bsBanner(Reboot);
-
-@import "functions";
-@import "variables";
-@import "variables-dark";
-@import "maps";
-@import "mixins";
-@import "root";
-@import "reboot";
diff --git a/publish/wwwroot/lib/bootstrap/scss/bootstrap-utilities.scss b/publish/wwwroot/lib/bootstrap/scss/bootstrap-utilities.scss
deleted file mode 100644
index 99c4a35..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/bootstrap-utilities.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-@import "mixins/banner";
-@include bsBanner(Utilities);
-
-// Configuration
-@import "functions";
-@import "variables";
-@import "variables-dark";
-@import "maps";
-@import "mixins";
-@import "utilities";
-
-// Layout & components
-@import "root";
-
-// Helpers
-@import "helpers";
-
-// Utilities
-@import "utilities/api";
diff --git a/publish/wwwroot/lib/bootstrap/scss/bootstrap.scss b/publish/wwwroot/lib/bootstrap/scss/bootstrap.scss
deleted file mode 100644
index 449d704..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/bootstrap.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-@import "mixins/banner";
-@include bsBanner("");
-
-
-// scss-docs-start import-stack
-// Configuration
-@import "functions";
-@import "variables";
-@import "variables-dark";
-@import "maps";
-@import "mixins";
-@import "utilities";
-
-// Layout & components
-@import "root";
-@import "reboot";
-@import "type";
-@import "images";
-@import "containers";
-@import "grid";
-@import "tables";
-@import "forms";
-@import "buttons";
-@import "transitions";
-@import "dropdown";
-@import "button-group";
-@import "nav";
-@import "navbar";
-@import "card";
-@import "accordion";
-@import "breadcrumb";
-@import "pagination";
-@import "badge";
-@import "alert";
-@import "progress";
-@import "list-group";
-@import "close";
-@import "toasts";
-@import "modal";
-@import "tooltip";
-@import "popover";
-@import "carousel";
-@import "spinners";
-@import "offcanvas";
-@import "placeholders";
-
-// Helpers
-@import "helpers";
-
-// Utilities
-@import "utilities/api";
-// scss-docs-end import-stack
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_floating-labels.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_floating-labels.scss
deleted file mode 100644
index 38df115..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_floating-labels.scss
+++ /dev/null
@@ -1,97 +0,0 @@
-.form-floating {
- position: relative;
-
- > .form-control,
- > .form-control-plaintext,
- > .form-select {
- height: $form-floating-height;
- min-height: $form-floating-height;
- line-height: $form-floating-line-height;
- }
-
- > label {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 2;
- max-width: 100%;
- height: 100%; // allow textareas
- padding: $form-floating-padding-y $form-floating-padding-x;
- overflow: hidden;
- color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity});
- text-align: start;
- text-overflow: ellipsis;
- white-space: nowrap;
- pointer-events: none;
- border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model
- transform-origin: 0 0;
- @include transition($form-floating-transition);
- }
-
- > .form-control,
- > .form-control-plaintext {
- padding: $form-floating-padding-y $form-floating-padding-x;
-
- &::placeholder {
- color: transparent;
- }
-
- &:focus,
- &:not(:placeholder-shown) {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- }
- // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
- &:-webkit-autofill {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- }
- }
-
- > .form-select {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- padding-left: $form-floating-padding-x;
- }
-
- > .form-control:focus,
- > .form-control:not(:placeholder-shown),
- > .form-control-plaintext,
- > .form-select {
- ~ label {
- transform: $form-floating-label-transform;
- }
- }
- // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
- > .form-control:-webkit-autofill {
- ~ label {
- transform: $form-floating-label-transform;
- }
- }
- > textarea:focus,
- > textarea:not(:placeholder-shown) {
- ~ label::after {
- position: absolute;
- inset: $form-floating-padding-y ($form-floating-padding-x * .5);
- z-index: -1;
- height: $form-floating-label-height;
- content: "";
- background-color: $input-bg;
- @include border-radius($input-border-radius);
- }
- }
- > textarea:disabled ~ label::after {
- background-color: $input-disabled-bg;
- }
-
- > .form-control-plaintext {
- ~ label {
- border-width: $input-border-width 0; // Required to properly position label text - as explained above
- }
- }
-
- > :disabled ~ label,
- > .form-control:disabled ~ label { // Required for `.form-control`s because of specificity
- color: $form-floating-label-disabled-color;
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_form-check.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_form-check.scss
deleted file mode 100644
index 8a1b639..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_form-check.scss
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// Check/radio
-//
-
-.form-check {
- display: block;
- min-height: $form-check-min-height;
- padding-left: $form-check-padding-start;
- margin-bottom: $form-check-margin-bottom;
-
- .form-check-input {
- float: left;
- margin-left: $form-check-padding-start * -1;
- }
-}
-
-.form-check-reverse {
- padding-right: $form-check-padding-start;
- padding-left: 0;
- text-align: right;
-
- .form-check-input {
- float: right;
- margin-right: $form-check-padding-start * -1;
- margin-left: 0;
- }
-}
-
-.form-check-input {
- --#{$prefix}form-check-bg: #{$form-check-input-bg};
-
- flex-shrink: 0;
- width: $form-check-input-width;
- height: $form-check-input-width;
- margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height
- vertical-align: top;
- appearance: none;
- background-color: var(--#{$prefix}form-check-bg);
- background-image: var(--#{$prefix}form-check-bg-image);
- background-repeat: no-repeat;
- background-position: center;
- background-size: contain;
- border: $form-check-input-border;
- print-color-adjust: exact; // Keep themed appearance for print
- @include transition($form-check-transition);
-
- &[type="checkbox"] {
- @include border-radius($form-check-input-border-radius);
- }
-
- &[type="radio"] {
- // stylelint-disable-next-line property-disallowed-list
- border-radius: $form-check-radio-border-radius;
- }
-
- &:active {
- filter: $form-check-input-active-filter;
- }
-
- &:focus {
- border-color: $form-check-input-focus-border;
- outline: 0;
- box-shadow: $form-check-input-focus-box-shadow;
- }
-
- &:checked {
- background-color: $form-check-input-checked-bg-color;
- border-color: $form-check-input-checked-border-color;
-
- &[type="checkbox"] {
- @if $enable-gradients {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)}, var(--#{$prefix}gradient);
- } @else {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)};
- }
- }
-
- &[type="radio"] {
- @if $enable-gradients {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)}, var(--#{$prefix}gradient);
- } @else {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)};
- }
- }
- }
-
- &[type="checkbox"]:indeterminate {
- background-color: $form-check-input-indeterminate-bg-color;
- border-color: $form-check-input-indeterminate-border-color;
-
- @if $enable-gradients {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)}, var(--#{$prefix}gradient);
- } @else {
- --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)};
- }
- }
-
- &:disabled {
- pointer-events: none;
- filter: none;
- opacity: $form-check-input-disabled-opacity;
- }
-
- // Use disabled attribute in addition of :disabled pseudo-class
- // See: https://github.com/twbs/bootstrap/issues/28247
- &[disabled],
- &:disabled {
- ~ .form-check-label {
- cursor: default;
- opacity: $form-check-label-disabled-opacity;
- }
- }
-}
-
-.form-check-label {
- color: $form-check-label-color;
- cursor: $form-check-label-cursor;
-}
-
-//
-// Switch
-//
-
-.form-switch {
- padding-left: $form-switch-padding-start;
-
- .form-check-input {
- --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image)};
-
- width: $form-switch-width;
- margin-left: $form-switch-padding-start * -1;
- background-image: var(--#{$prefix}form-switch-bg);
- background-position: left center;
- @include border-radius($form-switch-border-radius, 0);
- @include transition($form-switch-transition);
-
- &:focus {
- --#{$prefix}form-switch-bg: #{escape-svg($form-switch-focus-bg-image)};
- }
-
- &:checked {
- background-position: $form-switch-checked-bg-position;
-
- @if $enable-gradients {
- --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)}, var(--#{$prefix}gradient);
- } @else {
- --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)};
- }
- }
- }
-
- &.form-check-reverse {
- padding-right: $form-switch-padding-start;
- padding-left: 0;
-
- .form-check-input {
- margin-right: $form-switch-padding-start * -1;
- margin-left: 0;
- }
- }
-}
-
-.form-check-inline {
- display: inline-block;
- margin-right: $form-check-inline-margin-end;
-}
-
-.btn-check {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- pointer-events: none;
-
- &[disabled],
- &:disabled {
- + .btn {
- pointer-events: none;
- filter: none;
- opacity: $form-check-btn-check-disabled-opacity;
- }
- }
-}
-
-@if $enable-dark-mode {
- @include color-mode(dark) {
- .form-switch .form-check-input:not(:checked):not(:focus) {
- --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image-dark)};
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_form-control.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_form-control.scss
deleted file mode 100644
index 67ae5f4..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_form-control.scss
+++ /dev/null
@@ -1,214 +0,0 @@
-//
-// General form controls (plus a few specific high-level interventions)
-//
-
-.form-control {
- display: block;
- width: 100%;
- padding: $input-padding-y $input-padding-x;
- font-family: $input-font-family;
- @include font-size($input-font-size);
- font-weight: $input-font-weight;
- line-height: $input-line-height;
- color: $input-color;
- appearance: none; // Fix appearance for date inputs in Safari
- background-color: $input-bg;
- background-clip: padding-box;
- border: $input-border-width solid $input-border-color;
-
- // Note: This has no effect on
s in some browsers, due to the limited stylability of ``s in CSS.
- @include border-radius($input-border-radius, 0);
-
- @include box-shadow($input-box-shadow);
- @include transition($input-transition);
-
- &[type="file"] {
- overflow: hidden; // prevent pseudo element button overlap
-
- &:not(:disabled):not([readonly]) {
- cursor: pointer;
- }
- }
-
- // Customize the `:focus` state to imitate native WebKit styles.
- &:focus {
- color: $input-focus-color;
- background-color: $input-focus-bg;
- border-color: $input-focus-border-color;
- outline: 0;
- @if $enable-shadows {
- @include box-shadow($input-box-shadow, $input-focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $input-focus-box-shadow;
- }
- }
-
- &::-webkit-date-and-time-value {
- // On Android Chrome, form-control's "width: 100%" makes the input width too small
- // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109
- //
- // On iOS Safari, form-control's "appearance: none" + "width: 100%" makes the input width too small
- // Tested under iOS 16.2 / Safari 16.2
- min-width: 85px; // Seems to be a good minimum safe width
-
- // Add some height to date inputs on iOS
- // https://github.com/twbs/bootstrap/issues/23307
- // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved
- // Multiply line-height by 1em if it has no unit
- height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
-
- // Android Chrome type="date" is taller than the other inputs
- // because of "margin: 1px 24px 1px 4px" inside the shadow DOM
- // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109
- margin: 0;
- }
-
- // Prevent excessive date input height in Webkit
- // https://github.com/twbs/bootstrap/issues/34433
- &::-webkit-datetime-edit {
- display: block;
- padding: 0;
- }
-
- // Placeholder
- &::placeholder {
- color: $input-placeholder-color;
- // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
- opacity: 1;
- }
-
- // Disabled inputs
- //
- // HTML5 says that controls under a fieldset > legend:first-child won't be
- // disabled if the fieldset is disabled. Due to implementation difficulty, we
- // don't honor that edge case; we style them as disabled anyway.
- &:disabled {
- color: $input-disabled-color;
- background-color: $input-disabled-bg;
- border-color: $input-disabled-border-color;
- // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
- opacity: 1;
- }
-
- // File input buttons theming
- &::file-selector-button {
- padding: $input-padding-y $input-padding-x;
- margin: (-$input-padding-y) (-$input-padding-x);
- margin-inline-end: $input-padding-x;
- color: $form-file-button-color;
- @include gradient-bg($form-file-button-bg);
- pointer-events: none;
- border-color: inherit;
- border-style: solid;
- border-width: 0;
- border-inline-end-width: $input-border-width;
- border-radius: 0; // stylelint-disable-line property-disallowed-list
- @include transition($btn-transition);
- }
-
- &:hover:not(:disabled):not([readonly])::file-selector-button {
- background-color: $form-file-button-hover-bg;
- }
-}
-
-// Readonly controls as plain text
-//
-// Apply class to a readonly input to make it appear like regular plain
-// text (without any border, background color, focus indicator)
-
-.form-control-plaintext {
- display: block;
- width: 100%;
- padding: $input-padding-y 0;
- margin-bottom: 0; // match inputs if this class comes on inputs with default margins
- line-height: $input-line-height;
- color: $input-plaintext-color;
- background-color: transparent;
- border: solid transparent;
- border-width: $input-border-width 0;
-
- &:focus {
- outline: 0;
- }
-
- &.form-control-sm,
- &.form-control-lg {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-//
-// Repeated in `_input_group.scss` to avoid Sass extend issues.
-
-.form-control-sm {
- min-height: $input-height-sm;
- padding: $input-padding-y-sm $input-padding-x-sm;
- @include font-size($input-font-size-sm);
- @include border-radius($input-border-radius-sm);
-
- &::file-selector-button {
- padding: $input-padding-y-sm $input-padding-x-sm;
- margin: (-$input-padding-y-sm) (-$input-padding-x-sm);
- margin-inline-end: $input-padding-x-sm;
- }
-}
-
-.form-control-lg {
- min-height: $input-height-lg;
- padding: $input-padding-y-lg $input-padding-x-lg;
- @include font-size($input-font-size-lg);
- @include border-radius($input-border-radius-lg);
-
- &::file-selector-button {
- padding: $input-padding-y-lg $input-padding-x-lg;
- margin: (-$input-padding-y-lg) (-$input-padding-x-lg);
- margin-inline-end: $input-padding-x-lg;
- }
-}
-
-// Make sure textareas don't shrink too much when resized
-// https://github.com/twbs/bootstrap/pull/29124
-// stylelint-disable selector-no-qualifying-type
-textarea {
- &.form-control {
- min-height: $input-height;
- }
-
- &.form-control-sm {
- min-height: $input-height-sm;
- }
-
- &.form-control-lg {
- min-height: $input-height-lg;
- }
-}
-// stylelint-enable selector-no-qualifying-type
-
-.form-control-color {
- width: $form-color-width;
- height: $input-height;
- padding: $input-padding-y;
-
- &:not(:disabled):not([readonly]) {
- cursor: pointer;
- }
-
- &::-moz-color-swatch {
- border: 0 !important; // stylelint-disable-line declaration-no-important
- @include border-radius($input-border-radius);
- }
-
- &::-webkit-color-swatch {
- border: 0 !important; // stylelint-disable-line declaration-no-important
- @include border-radius($input-border-radius);
- }
-
- &.form-control-sm { height: $input-height-sm; }
- &.form-control-lg { height: $input-height-lg; }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_form-range.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_form-range.scss
deleted file mode 100644
index 4732213..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_form-range.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-// Range
-//
-// Style range inputs the same across browsers. Vendor-specific rules for pseudo
-// elements cannot be mixed. As such, there are no shared styles for focus or
-// active states on prefixed selectors.
-
-.form-range {
- width: 100%;
- height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);
- padding: 0; // Need to reset padding
- appearance: none;
- background-color: transparent;
-
- &:focus {
- outline: 0;
-
- // Pseudo-elements must be split across multiple rulesets to have an effect.
- // No box-shadow() mixin for focus accessibility.
- &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
- &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
- }
-
- &::-moz-focus-outer {
- border: 0;
- }
-
- &::-webkit-slider-thumb {
- width: $form-range-thumb-width;
- height: $form-range-thumb-height;
- margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific
- appearance: none;
- @include gradient-bg($form-range-thumb-bg);
- border: $form-range-thumb-border;
- @include border-radius($form-range-thumb-border-radius);
- @include box-shadow($form-range-thumb-box-shadow);
- @include transition($form-range-thumb-transition);
-
- &:active {
- @include gradient-bg($form-range-thumb-active-bg);
- }
- }
-
- &::-webkit-slider-runnable-track {
- width: $form-range-track-width;
- height: $form-range-track-height;
- color: transparent; // Why?
- cursor: $form-range-track-cursor;
- background-color: $form-range-track-bg;
- border-color: transparent;
- @include border-radius($form-range-track-border-radius);
- @include box-shadow($form-range-track-box-shadow);
- }
-
- &::-moz-range-thumb {
- width: $form-range-thumb-width;
- height: $form-range-thumb-height;
- appearance: none;
- @include gradient-bg($form-range-thumb-bg);
- border: $form-range-thumb-border;
- @include border-radius($form-range-thumb-border-radius);
- @include box-shadow($form-range-thumb-box-shadow);
- @include transition($form-range-thumb-transition);
-
- &:active {
- @include gradient-bg($form-range-thumb-active-bg);
- }
- }
-
- &::-moz-range-track {
- width: $form-range-track-width;
- height: $form-range-track-height;
- color: transparent;
- cursor: $form-range-track-cursor;
- background-color: $form-range-track-bg;
- border-color: transparent; // Firefox specific?
- @include border-radius($form-range-track-border-radius);
- @include box-shadow($form-range-track-box-shadow);
- }
-
- &:disabled {
- pointer-events: none;
-
- &::-webkit-slider-thumb {
- background-color: $form-range-thumb-disabled-bg;
- }
-
- &::-moz-range-thumb {
- background-color: $form-range-thumb-disabled-bg;
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_form-select.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_form-select.scss
deleted file mode 100644
index 69ace52..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_form-select.scss
+++ /dev/null
@@ -1,80 +0,0 @@
-// Select
-//
-// Replaces the browser default select with a custom one, mostly pulled from
-// https://primer.github.io/.
-
-.form-select {
- --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator)};
-
- display: block;
- width: 100%;
- padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
- font-family: $form-select-font-family;
- @include font-size($form-select-font-size);
- font-weight: $form-select-font-weight;
- line-height: $form-select-line-height;
- color: $form-select-color;
- appearance: none;
- background-color: $form-select-bg;
- background-image: var(--#{$prefix}form-select-bg-img), var(--#{$prefix}form-select-bg-icon, none);
- background-repeat: no-repeat;
- background-position: $form-select-bg-position;
- background-size: $form-select-bg-size;
- border: $form-select-border-width solid $form-select-border-color;
- @include border-radius($form-select-border-radius, 0);
- @include box-shadow($form-select-box-shadow);
- @include transition($form-select-transition);
-
- &:focus {
- border-color: $form-select-focus-border-color;
- outline: 0;
- @if $enable-shadows {
- @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $form-select-focus-box-shadow;
- }
- }
-
- &[multiple],
- &[size]:not([size="1"]) {
- padding-right: $form-select-padding-x;
- background-image: none;
- }
-
- &:disabled {
- color: $form-select-disabled-color;
- background-color: $form-select-disabled-bg;
- border-color: $form-select-disabled-border-color;
- }
-
- // Remove outline from select box in FF
- &:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 $form-select-color;
- }
-}
-
-.form-select-sm {
- padding-top: $form-select-padding-y-sm;
- padding-bottom: $form-select-padding-y-sm;
- padding-left: $form-select-padding-x-sm;
- @include font-size($form-select-font-size-sm);
- @include border-radius($form-select-border-radius-sm);
-}
-
-.form-select-lg {
- padding-top: $form-select-padding-y-lg;
- padding-bottom: $form-select-padding-y-lg;
- padding-left: $form-select-padding-x-lg;
- @include font-size($form-select-font-size-lg);
- @include border-radius($form-select-border-radius-lg);
-}
-
-@if $enable-dark-mode {
- @include color-mode(dark) {
- .form-select {
- --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator-dark)};
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_form-text.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_form-text.scss
deleted file mode 100644
index f080d1a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_form-text.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Form text
-//
-
-.form-text {
- margin-top: $form-text-margin-top;
- @include font-size($form-text-font-size);
- font-style: $form-text-font-style;
- font-weight: $form-text-font-weight;
- color: $form-text-color;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_input-group.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_input-group.scss
deleted file mode 100644
index 8078ebb..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_input-group.scss
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-// Base styles
-//
-
-.input-group {
- position: relative;
- display: flex;
- flex-wrap: wrap; // For form validation feedback
- align-items: stretch;
- width: 100%;
-
- > .form-control,
- > .form-select,
- > .form-floating {
- position: relative; // For focus state's z-index
- flex: 1 1 auto;
- width: 1%;
- min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
- }
-
- // Bring the "active" form control to the top of surrounding elements
- > .form-control:focus,
- > .form-select:focus,
- > .form-floating:focus-within {
- z-index: 5;
- }
-
- // Ensure buttons are always above inputs for more visually pleasing borders.
- // This isn't needed for `.input-group-text` since it shares the same border-color
- // as our inputs.
- .btn {
- position: relative;
- z-index: 2;
-
- &:focus {
- z-index: 5;
- }
- }
-}
-
-
-// Textual addons
-//
-// Serves as a catch-all element for any text or radio/checkbox input you wish
-// to prepend or append to an input.
-
-.input-group-text {
- display: flex;
- align-items: center;
- padding: $input-group-addon-padding-y $input-group-addon-padding-x;
- @include font-size($input-font-size); // Match inputs
- font-weight: $input-group-addon-font-weight;
- line-height: $input-line-height;
- color: $input-group-addon-color;
- text-align: center;
- white-space: nowrap;
- background-color: $input-group-addon-bg;
- border: $input-border-width solid $input-group-addon-border-color;
- @include border-radius($input-border-radius);
-}
-
-
-// Sizing
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .form-select,
-.input-group-lg > .input-group-text,
-.input-group-lg > .btn {
- padding: $input-padding-y-lg $input-padding-x-lg;
- @include font-size($input-font-size-lg);
- @include border-radius($input-border-radius-lg);
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .form-select,
-.input-group-sm > .input-group-text,
-.input-group-sm > .btn {
- padding: $input-padding-y-sm $input-padding-x-sm;
- @include font-size($input-font-size-sm);
- @include border-radius($input-border-radius-sm);
-}
-
-.input-group-lg > .form-select,
-.input-group-sm > .form-select {
- padding-right: $form-select-padding-x + $form-select-indicator-padding;
-}
-
-
-// Rounded corners
-//
-// These rulesets must come after the sizing ones to properly override sm and lg
-// border-radius values when extending. They're more specific than we'd like
-// with the `.input-group >` part, but without it, we cannot override the sizing.
-
-// stylelint-disable-next-line no-duplicate-selectors
-.input-group {
- &:not(.has-validation) {
- > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
- > .dropdown-toggle:nth-last-child(n + 3),
- > .form-floating:not(:last-child) > .form-control,
- > .form-floating:not(:last-child) > .form-select {
- @include border-end-radius(0);
- }
- }
-
- &.has-validation {
- > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
- > .dropdown-toggle:nth-last-child(n + 4),
- > .form-floating:nth-last-child(n + 3) > .form-control,
- > .form-floating:nth-last-child(n + 3) > .form-select {
- @include border-end-radius(0);
- }
- }
-
- $validation-messages: "";
- @each $state in map-keys($form-validation-states) {
- $validation-messages: $validation-messages + ":not(." + unquote($state) + "-tooltip)" + ":not(." + unquote($state) + "-feedback)";
- }
-
- > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
- margin-left: calc(-1 * #{$input-border-width}); // stylelint-disable-line function-disallowed-list
- @include border-start-radius(0);
- }
-
- > .form-floating:not(:first-child) > .form-control,
- > .form-floating:not(:first-child) > .form-select {
- @include border-start-radius(0);
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_labels.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_labels.scss
deleted file mode 100644
index 39ecafc..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_labels.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Labels
-//
-
-.form-label {
- margin-bottom: $form-label-margin-bottom;
- @include font-size($form-label-font-size);
- font-style: $form-label-font-style;
- font-weight: $form-label-font-weight;
- color: $form-label-color;
-}
-
-// For use with horizontal and inline forms, when you need the label (or legend)
-// text to align with the form controls.
-.col-form-label {
- padding-top: add($input-padding-y, $input-border-width);
- padding-bottom: add($input-padding-y, $input-border-width);
- margin-bottom: 0; // Override the `` default
- @include font-size(inherit); // Override the `` default
- font-style: $form-label-font-style;
- font-weight: $form-label-font-weight;
- line-height: $input-line-height;
- color: $form-label-color;
-}
-
-.col-form-label-lg {
- padding-top: add($input-padding-y-lg, $input-border-width);
- padding-bottom: add($input-padding-y-lg, $input-border-width);
- @include font-size($input-font-size-lg);
-}
-
-.col-form-label-sm {
- padding-top: add($input-padding-y-sm, $input-border-width);
- padding-bottom: add($input-padding-y-sm, $input-border-width);
- @include font-size($input-font-size-sm);
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/forms/_validation.scss b/publish/wwwroot/lib/bootstrap/scss/forms/_validation.scss
deleted file mode 100644
index c48123a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/forms/_validation.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Form validation
-//
-// Provide feedback to users when form field values are valid or invalid. Works
-// primarily for client-side validation via scoped `:invalid` and `:valid`
-// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
-// server-side validation.
-
-// scss-docs-start form-validation-states-loop
-@each $state, $data in $form-validation-states {
- @include form-validation-state($state, $data...);
-}
-// scss-docs-end form-validation-states-loop
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_clearfix.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_clearfix.scss
deleted file mode 100644
index e92522a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_clearfix.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.clearfix {
- @include clearfix();
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_color-bg.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_color-bg.scss
deleted file mode 100644
index 1a3a4cf..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_color-bg.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251
-@each $color, $value in $theme-colors {
- .text-bg-#{$color} {
- color: color-contrast($value) if($enable-important-utilities, !important, null);
- background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_colored-links.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_colored-links.scss
deleted file mode 100644
index 5f86857..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_colored-links.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251
-@each $color, $value in $theme-colors {
- .link-#{$color} {
- color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);
- text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);
-
- @if $link-shade-percentage != 0 {
- &:hover,
- &:focus {
- $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));
- color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);
- text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);
- }
- }
- }
-}
-
-// One-off special link helper as a bridge until v6
-.link-body-emphasis {
- color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);
- text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);
-
- @if $link-shade-percentage != 0 {
- &:hover,
- &:focus {
- color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);
- text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_focus-ring.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_focus-ring.scss
deleted file mode 100644
index 26508a8..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_focus-ring.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-.focus-ring:focus {
- outline: 0;
- // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values
- box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_icon-link.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_icon-link.scss
deleted file mode 100644
index 3f8bcb3..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_icon-link.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.icon-link {
- display: inline-flex;
- gap: $icon-link-gap;
- align-items: center;
- text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));
- text-underline-offset: $icon-link-underline-offset;
- backface-visibility: hidden;
-
- > .bi {
- flex-shrink: 0;
- width: $icon-link-icon-size;
- height: $icon-link-icon-size;
- fill: currentcolor;
- @include transition($icon-link-icon-transition);
- }
-}
-
-.icon-link-hover {
- &:hover,
- &:focus-visible {
- > .bi {
- transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_position.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_position.scss
deleted file mode 100644
index 59103d9..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_position.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// Shorthand
-
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: $zindex-fixed;
-}
-
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $zindex-fixed;
-}
-
-// Responsive sticky top and bottom
-@each $breakpoint in map-keys($grid-breakpoints) {
- @include media-breakpoint-up($breakpoint) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- .sticky#{$infix}-top {
- position: sticky;
- top: 0;
- z-index: $zindex-sticky;
- }
-
- .sticky#{$infix}-bottom {
- position: sticky;
- bottom: 0;
- z-index: $zindex-sticky;
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_ratio.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_ratio.scss
deleted file mode 100644
index b6a7654..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_ratio.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// Credit: Nicolas Gallagher and SUIT CSS.
-
-.ratio {
- position: relative;
- width: 100%;
-
- &::before {
- display: block;
- padding-top: var(--#{$prefix}aspect-ratio);
- content: "";
- }
-
- > * {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- }
-}
-
-@each $key, $ratio in $aspect-ratios {
- .ratio-#{$key} {
- --#{$prefix}aspect-ratio: #{$ratio};
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_stacks.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_stacks.scss
deleted file mode 100644
index 6cd237a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_stacks.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-// scss-docs-start stacks
-.hstack {
- display: flex;
- flex-direction: row;
- align-items: center;
- align-self: stretch;
-}
-
-.vstack {
- display: flex;
- flex: 1 1 auto;
- flex-direction: column;
- align-self: stretch;
-}
-// scss-docs-end stacks
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_stretched-link.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_stretched-link.scss
deleted file mode 100644
index 71a1c75..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_stretched-link.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Stretched link
-//
-
-.stretched-link {
- &::#{$stretched-link-pseudo-element} {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $stretched-link-z-index;
- content: "";
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_text-truncation.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_text-truncation.scss
deleted file mode 100644
index 6421dac..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_text-truncation.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Text truncation
-//
-
-.text-truncate {
- @include text-truncate();
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_visually-hidden.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_visually-hidden.scss
deleted file mode 100644
index 4760ff0..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_visually-hidden.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-//
-// Visually hidden
-//
-
-.visually-hidden,
-.visually-hidden-focusable:not(:focus):not(:focus-within) {
- @include visually-hidden();
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/helpers/_vr.scss b/publish/wwwroot/lib/bootstrap/scss/helpers/_vr.scss
deleted file mode 100644
index b6f9d42..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/helpers/_vr.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.vr {
- display: inline-block;
- align-self: stretch;
- width: $vr-border-width;
- min-height: 1em;
- background-color: currentcolor;
- opacity: $hr-opacity;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_alert.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_alert.scss
deleted file mode 100644
index fb524af..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_alert.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@include deprecate("`alert-variant()`", "v5.3.0", "v6.0.0");
-
-// scss-docs-start alert-variant-mixin
-@mixin alert-variant($background, $border, $color) {
- --#{$prefix}alert-color: #{$color};
- --#{$prefix}alert-bg: #{$background};
- --#{$prefix}alert-border-color: #{$border};
- --#{$prefix}alert-link-color: #{shade-color($color, 20%)};
-
- @if $enable-gradients {
- background-image: var(--#{$prefix}gradient);
- }
-
- .alert-link {
- color: var(--#{$prefix}alert-link-color);
- }
-}
-// scss-docs-end alert-variant-mixin
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_backdrop.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_backdrop.scss
deleted file mode 100644
index 9705ae9..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_backdrop.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-// Shared between modals and offcanvases
-@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {
- position: fixed;
- top: 0;
- left: 0;
- z-index: $zindex;
- width: 100vw;
- height: 100vh;
- background-color: $backdrop-bg;
-
- // Fade for backdrop
- &.fade { opacity: 0; }
- &.show { opacity: $backdrop-opacity; }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_banner.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_banner.scss
deleted file mode 100644
index dd8a510..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_banner.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-@mixin bsBanner($file) {
- /*!
- * Bootstrap #{$file} v5.3.8 (https://getbootstrap.com/)
- * Copyright 2011-2025 The Bootstrap Authors
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_border-radius.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_border-radius.scss
deleted file mode 100644
index 616decb..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_border-radius.scss
+++ /dev/null
@@ -1,78 +0,0 @@
-// stylelint-disable property-disallowed-list
-// Single side border-radius
-
-// Helper function to replace negative values with 0
-@function valid-radius($radius) {
- $return: ();
- @each $value in $radius {
- @if type-of($value) == number {
- $return: append($return, max($value, 0));
- } @else {
- $return: append($return, $value);
- }
- }
- @return $return;
-}
-
-// scss-docs-start border-radius-mixins
-@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {
- @if $enable-rounded {
- border-radius: valid-radius($radius);
- }
- @else if $fallback-border-radius != false {
- border-radius: $fallback-border-radius;
- }
-}
-
-@mixin border-top-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- border-top-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-right-radius: valid-radius($radius);
- border-bottom-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-right-radius: valid-radius($radius);
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-top-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-top-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-// scss-docs-end border-radius-mixins
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_box-shadow.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_box-shadow.scss
deleted file mode 100644
index 0bb6bf7..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_box-shadow.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-@mixin box-shadow($shadow...) {
- @if $enable-shadows {
- $result: ();
- $has-single-value: false;
- $single-value: null;
-
- @each $value in $shadow {
- @if $value != null {
- @if $value == none or $value == initial or $value == inherit or $value == unset {
- $has-single-value: true;
- $single-value: $value;
- } @else {
- $result: append($result, $value, "comma");
- }
- }
- }
-
- @if $has-single-value {
- box-shadow: $single-value;
- } @else if (length($result) > 0) {
- box-shadow: $result;
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_breakpoints.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_breakpoints.scss
deleted file mode 100644
index 286be89..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_breakpoints.scss
+++ /dev/null
@@ -1,127 +0,0 @@
-// Breakpoint viewport sizes and media queries.
-//
-// Breakpoints are defined as a map of (name: minimum width), order from small to large:
-//
-// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)
-//
-// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
-
-// Name of the next breakpoint, or null for the last breakpoint.
-//
-// >> breakpoint-next(sm)
-// md
-// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))
-// md
-// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))
-// md
-@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
- $n: index($breakpoint-names, $name);
- @if not $n {
- @error "breakpoint `#{$name}` not found in `#{$breakpoints}`";
- }
- @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
-}
-
-// Minimum breakpoint width. Null for the smallest (first) breakpoint.
-//
-// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))
-// 576px
-@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
- $min: map-get($breakpoints, $name);
- @return if($min != 0, $min, null);
-}
-
-// Maximum breakpoint width.
-// The maximum value is reduced by 0.02px to work around the limitations of
-// `min-` and `max-` prefixes and viewports with fractional widths.
-// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max
-// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.
-// See https://bugs.webkit.org/show_bug.cgi?id=178261
-//
-// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))
-// 767.98px
-@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
- $max: map-get($breakpoints, $name);
- @return if($max and $max > 0, $max - .02, null);
-}
-
-// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.
-// Useful for making responsive utilities.
-//
-// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))
-// "" (Returns a blank string)
-// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))
-// "-sm"
-@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
- @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
-}
-
-// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
-// Makes the @content apply to the given breakpoint and wider.
-@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($name, $breakpoints);
- @if $min {
- @media (min-width: $min) {
- @content;
- }
- } @else {
- @content;
- }
-}
-
-// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
-// Makes the @content apply to the given breakpoint and narrower.
-@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
- $max: breakpoint-max($name, $breakpoints);
- @if $max {
- @media (max-width: $max) {
- @content;
- }
- } @else {
- @content;
- }
-}
-
-// Media that spans multiple breakpoint widths.
-// Makes the @content apply between the min and max breakpoints
-@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($lower, $breakpoints);
- $max: breakpoint-max($upper, $breakpoints);
-
- @if $min != null and $max != null {
- @media (min-width: $min) and (max-width: $max) {
- @content;
- }
- } @else if $max == null {
- @include media-breakpoint-up($lower, $breakpoints) {
- @content;
- }
- } @else if $min == null {
- @include media-breakpoint-down($upper, $breakpoints) {
- @content;
- }
- }
-}
-
-// Media between the breakpoint's minimum and maximum widths.
-// No minimum for the smallest breakpoint, and no maximum for the largest one.
-// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
-@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($name, $breakpoints);
- $next: breakpoint-next($name, $breakpoints);
- $max: breakpoint-max($next, $breakpoints);
-
- @if $min != null and $max != null {
- @media (min-width: $min) and (max-width: $max) {
- @content;
- }
- } @else if $max == null {
- @include media-breakpoint-up($name, $breakpoints) {
- @content;
- }
- } @else if $min == null {
- @include media-breakpoint-down($next, $breakpoints) {
- @content;
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_buttons.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_buttons.scss
deleted file mode 100644
index cf087fd..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_buttons.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
-// scss-docs-start btn-variant-mixin
-@mixin button-variant(
- $background,
- $border,
- $color: color-contrast($background),
- $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
- $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
- $hover-color: color-contrast($hover-background),
- $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
- $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
- $active-color: color-contrast($active-background),
- $disabled-background: $background,
- $disabled-border: $border,
- $disabled-color: color-contrast($disabled-background)
-) {
- --#{$prefix}btn-color: #{$color};
- --#{$prefix}btn-bg: #{$background};
- --#{$prefix}btn-border-color: #{$border};
- --#{$prefix}btn-hover-color: #{$hover-color};
- --#{$prefix}btn-hover-bg: #{$hover-background};
- --#{$prefix}btn-hover-border-color: #{$hover-border};
- --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};
- --#{$prefix}btn-active-color: #{$active-color};
- --#{$prefix}btn-active-bg: #{$active-background};
- --#{$prefix}btn-active-border-color: #{$active-border};
- --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
- --#{$prefix}btn-disabled-color: #{$disabled-color};
- --#{$prefix}btn-disabled-bg: #{$disabled-background};
- --#{$prefix}btn-disabled-border-color: #{$disabled-border};
-}
-// scss-docs-end btn-variant-mixin
-
-// scss-docs-start btn-outline-variant-mixin
-@mixin button-outline-variant(
- $color,
- $color-hover: color-contrast($color),
- $active-background: $color,
- $active-border: $color,
- $active-color: color-contrast($active-background)
-) {
- --#{$prefix}btn-color: #{$color};
- --#{$prefix}btn-border-color: #{$color};
- --#{$prefix}btn-hover-color: #{$color-hover};
- --#{$prefix}btn-hover-bg: #{$active-background};
- --#{$prefix}btn-hover-border-color: #{$active-border};
- --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};
- --#{$prefix}btn-active-color: #{$active-color};
- --#{$prefix}btn-active-bg: #{$active-background};
- --#{$prefix}btn-active-border-color: #{$active-border};
- --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
- --#{$prefix}btn-disabled-color: #{$color};
- --#{$prefix}btn-disabled-bg: transparent;
- --#{$prefix}btn-disabled-border-color: #{$color};
- --#{$prefix}gradient: none;
-}
-// scss-docs-end btn-outline-variant-mixin
-
-// scss-docs-start btn-size-mixin
-@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {
- --#{$prefix}btn-padding-y: #{$padding-y};
- --#{$prefix}btn-padding-x: #{$padding-x};
- @include rfs($font-size, --#{$prefix}btn-font-size);
- --#{$prefix}btn-border-radius: #{$border-radius};
-}
-// scss-docs-end btn-size-mixin
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_caret.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_caret.scss
deleted file mode 100644
index be73116..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_caret.scss
+++ /dev/null
@@ -1,69 +0,0 @@
-// scss-docs-start caret-mixins
-@mixin caret-down($width: $caret-width) {
- border-top: $width solid;
- border-right: $width solid transparent;
- border-bottom: 0;
- border-left: $width solid transparent;
-}
-
-@mixin caret-up($width: $caret-width) {
- border-top: 0;
- border-right: $width solid transparent;
- border-bottom: $width solid;
- border-left: $width solid transparent;
-}
-
-@mixin caret-end($width: $caret-width) {
- border-top: $width solid transparent;
- border-right: 0;
- border-bottom: $width solid transparent;
- border-left: $width solid;
-}
-
-@mixin caret-start($width: $caret-width) {
- border-top: $width solid transparent;
- border-right: $width solid;
- border-bottom: $width solid transparent;
-}
-
-@mixin caret(
- $direction: down,
- $width: $caret-width,
- $spacing: $caret-spacing,
- $vertical-align: $caret-vertical-align
-) {
- @if $enable-caret {
- &::after {
- display: inline-block;
- margin-left: $spacing;
- vertical-align: $vertical-align;
- content: "";
- @if $direction == down {
- @include caret-down($width);
- } @else if $direction == up {
- @include caret-up($width);
- } @else if $direction == end {
- @include caret-end($width);
- }
- }
-
- @if $direction == start {
- &::after {
- display: none;
- }
-
- &::before {
- display: inline-block;
- margin-right: $spacing;
- vertical-align: $vertical-align;
- content: "";
- @include caret-start($width);
- }
- }
-
- &:empty::after {
- margin-left: 0;
- }
- }
-}
-// scss-docs-end caret-mixins
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_clearfix.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_clearfix.scss
deleted file mode 100644
index ffc62bb..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_clearfix.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// scss-docs-start clearfix
-@mixin clearfix() {
- &::after {
- display: block;
- clear: both;
- content: "";
- }
-}
-// scss-docs-end clearfix
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_color-mode.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_color-mode.scss
deleted file mode 100644
index 03338b0..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_color-mode.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// scss-docs-start color-mode-mixin
-@mixin color-mode($mode: light, $root: false) {
- @if $color-mode-type == "media-query" {
- @if $root == true {
- @media (prefers-color-scheme: $mode) {
- :root {
- @content;
- }
- }
- } @else {
- @media (prefers-color-scheme: $mode) {
- @content;
- }
- }
- } @else {
- [data-bs-theme="#{$mode}"] {
- @content;
- }
- }
-}
-// scss-docs-end color-mode-mixin
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_color-scheme.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_color-scheme.scss
deleted file mode 100644
index 90497aa..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_color-scheme.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// scss-docs-start mixin-color-scheme
-@mixin color-scheme($name) {
- @media (prefers-color-scheme: #{$name}) {
- @content;
- }
-}
-// scss-docs-end mixin-color-scheme
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_container.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_container.scss
deleted file mode 100644
index b9f3351..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_container.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-// Container mixins
-
-@mixin make-container($gutter: $container-padding-x) {
- --#{$prefix}gutter-x: #{$gutter};
- --#{$prefix}gutter-y: 0;
- width: 100%;
- padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
- padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
- margin-right: auto;
- margin-left: auto;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_deprecate.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_deprecate.scss
deleted file mode 100644
index df070bc..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_deprecate.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Deprecate mixin
-//
-// This mixin can be used to deprecate mixins or functions.
-// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to
-// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)
-@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {
- @if ($enable-deprecation-messages != false and $ignore-warning != true) {
- @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.";
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_forms.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_forms.scss
deleted file mode 100644
index 00b4764..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_forms.scss
+++ /dev/null
@@ -1,163 +0,0 @@
-// This mixin uses an `if()` technique to be compatible with Dart Sass
-// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details
-
-// scss-docs-start form-validation-mixins
-@mixin form-validation-state-selector($state) {
- @if ($state == "valid" or $state == "invalid") {
- .was-validated #{if(&, "&", "")}:#{$state},
- #{if(&, "&", "")}.is-#{$state} {
- @content;
- }
- } @else {
- #{if(&, "&", "")}.is-#{$state} {
- @content;
- }
- }
-}
-
-@mixin form-validation-state(
- $state,
- $color,
- $icon,
- $tooltip-color: color-contrast($color),
- $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
- $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),
- $border-color: $color
-) {
- .#{$state}-feedback {
- display: none;
- width: 100%;
- margin-top: $form-feedback-margin-top;
- @include font-size($form-feedback-font-size);
- font-style: $form-feedback-font-style;
- color: $color;
- }
-
- .#{$state}-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%; // Contain to parent when possible
- padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
- margin-top: .1rem;
- @include font-size($form-feedback-tooltip-font-size);
- line-height: $form-feedback-tooltip-line-height;
- color: $tooltip-color;
- background-color: $tooltip-bg-color;
- @include border-radius($form-feedback-tooltip-border-radius);
- }
-
- @include form-validation-state-selector($state) {
- ~ .#{$state}-feedback,
- ~ .#{$state}-tooltip {
- display: block;
- }
- }
-
- .form-control {
- @include form-validation-state-selector($state) {
- border-color: $border-color;
-
- @if $enable-validation-icons {
- padding-right: $input-height-inner;
- background-image: escape-svg($icon);
- background-repeat: no-repeat;
- background-position: right $input-height-inner-quarter center;
- background-size: $input-height-inner-half $input-height-inner-half;
- }
-
- &:focus {
- border-color: $border-color;
- @if $enable-shadows {
- @include box-shadow($input-box-shadow, $focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $focus-box-shadow;
- }
- }
- }
- }
-
- // stylelint-disable-next-line selector-no-qualifying-type
- textarea.form-control {
- @include form-validation-state-selector($state) {
- @if $enable-validation-icons {
- padding-right: $input-height-inner;
- background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
- }
- }
- }
-
- .form-select {
- @include form-validation-state-selector($state) {
- border-color: $border-color;
-
- @if $enable-validation-icons {
- &:not([multiple]):not([size]),
- &:not([multiple])[size="1"] {
- --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};
- padding-right: $form-select-feedback-icon-padding-end;
- background-position: $form-select-bg-position, $form-select-feedback-icon-position;
- background-size: $form-select-bg-size, $form-select-feedback-icon-size;
- }
- }
-
- &:focus {
- border-color: $border-color;
- @if $enable-shadows {
- @include box-shadow($form-select-box-shadow, $focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $focus-box-shadow;
- }
- }
- }
- }
-
- .form-control-color {
- @include form-validation-state-selector($state) {
- @if $enable-validation-icons {
- width: add($form-color-width, $input-height-inner);
- }
- }
- }
-
- .form-check-input {
- @include form-validation-state-selector($state) {
- border-color: $border-color;
-
- &:checked {
- background-color: $color;
- }
-
- &:focus {
- box-shadow: $focus-box-shadow;
- }
-
- ~ .form-check-label {
- color: $color;
- }
- }
- }
- .form-check-inline .form-check-input {
- ~ .#{$state}-feedback {
- margin-left: .5em;
- }
- }
-
- .input-group {
- > .form-control:not(:focus),
- > .form-select:not(:focus),
- > .form-floating:not(:focus-within) {
- @include form-validation-state-selector($state) {
- @if $state == "valid" {
- z-index: 3;
- } @else if $state == "invalid" {
- z-index: 4;
- }
- }
- }
- }
-}
-// scss-docs-end form-validation-mixins
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_gradients.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_gradients.scss
deleted file mode 100644
index 608e18d..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_gradients.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Gradients
-
-// scss-docs-start gradient-bg-mixin
-@mixin gradient-bg($color: null) {
- background-color: $color;
-
- @if $enable-gradients {
- background-image: var(--#{$prefix}gradient);
- }
-}
-// scss-docs-end gradient-bg-mixin
-
-// scss-docs-start gradient-mixins
-// Horizontal gradient, from left to right
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {
- background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
-}
-
-// Vertical gradient, from top to bottom
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {
- background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
-}
-
-@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {
- background-image: linear-gradient($deg, $start-color, $end-color);
-}
-
-@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
- background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
-}
-
-@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
- background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
-}
-
-@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
- background-image: radial-gradient(circle, $inner-color, $outer-color);
-}
-
-@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {
- background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-}
-// scss-docs-end gradient-mixins
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_grid.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_grid.scss
deleted file mode 100644
index db77e07..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_grid.scss
+++ /dev/null
@@ -1,151 +0,0 @@
-// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
-@mixin make-row($gutter: $grid-gutter-width) {
- --#{$prefix}gutter-x: #{$gutter};
- --#{$prefix}gutter-y: 0;
- display: flex;
- flex-wrap: wrap;
- // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed
- margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list
- margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list
- margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list
-}
-
-@mixin make-col-ready() {
- // Add box sizing if only the grid is loaded
- box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);
- // Prevent columns from becoming too narrow when at smaller grid tiers by
- // always setting `width: 100%;`. This works because we set the width
- // later on to override this initial width.
- flex-shrink: 0;
- width: 100%;
- max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid
- padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
- padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
- margin-top: var(--#{$prefix}gutter-y);
-}
-
-@mixin make-col($size: false, $columns: $grid-columns) {
- @if $size {
- flex: 0 0 auto;
- width: percentage(divide($size, $columns));
-
- } @else {
- flex: 1 1 0;
- max-width: 100%;
- }
-}
-
-@mixin make-col-auto() {
- flex: 0 0 auto;
- width: auto;
-}
-
-@mixin make-col-offset($size, $columns: $grid-columns) {
- $num: divide($size, $columns);
- margin-left: if($num == 0, 0, percentage($num));
-}
-
-// Row columns
-//
-// Specify on a parent element(e.g., .row) to force immediate children into NN
-// number of columns. Supports wrapping to new lines, but does not do a Masonry
-// style grid.
-@mixin row-cols($count) {
- > * {
- flex: 0 0 auto;
- width: percentage(divide(1, $count));
- }
-}
-
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `$grid-columns`.
-
-@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
- @each $breakpoint in map-keys($breakpoints) {
- $infix: breakpoint-infix($breakpoint, $breakpoints);
-
- @include media-breakpoint-up($breakpoint, $breakpoints) {
- // Provide basic `.col-{bp}` classes for equal-width flexbox columns
- .col#{$infix} {
- flex: 1 0 0;
- }
-
- .row-cols#{$infix}-auto > * {
- @include make-col-auto();
- }
-
- @if $grid-row-columns > 0 {
- @for $i from 1 through $grid-row-columns {
- .row-cols#{$infix}-#{$i} {
- @include row-cols($i);
- }
- }
- }
-
- .col#{$infix}-auto {
- @include make-col-auto();
- }
-
- @if $columns > 0 {
- @for $i from 1 through $columns {
- .col#{$infix}-#{$i} {
- @include make-col($i, $columns);
- }
- }
-
- // `$columns - 1` because offsetting by the width of an entire row isn't possible
- @for $i from 0 through ($columns - 1) {
- @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
- .offset#{$infix}-#{$i} {
- @include make-col-offset($i, $columns);
- }
- }
- }
- }
-
- // Gutters
- //
- // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.
- @each $key, $value in $gutters {
- .g#{$infix}-#{$key},
- .gx#{$infix}-#{$key} {
- --#{$prefix}gutter-x: #{$value};
- }
-
- .g#{$infix}-#{$key},
- .gy#{$infix}-#{$key} {
- --#{$prefix}gutter-y: #{$value};
- }
- }
- }
- }
-}
-
-@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {
- @each $breakpoint in map-keys($breakpoints) {
- $infix: breakpoint-infix($breakpoint, $breakpoints);
-
- @include media-breakpoint-up($breakpoint, $breakpoints) {
- @if $columns > 0 {
- @for $i from 1 through $columns {
- .g-col#{$infix}-#{$i} {
- grid-column: auto / span $i;
- }
- }
-
- // Start with `1` because `0` is an invalid value.
- // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.
- @for $i from 1 through ($columns - 1) {
- .g-start#{$infix}-#{$i} {
- grid-column-start: $i;
- }
- }
- }
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_image.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_image.scss
deleted file mode 100644
index e1df779..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_image.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-
-@mixin img-fluid {
- // Part 1: Set a maximum relative to the parent
- max-width: 100%;
- // Part 2: Override the height to auto, otherwise images will be stretched
- // when setting a width and height attribute on the img element.
- height: auto;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_list-group.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_list-group.scss
deleted file mode 100644
index 6274f34..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_list-group.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-@include deprecate("`list-group-item-variant()`", "v5.3.0", "v6.0.0");
-
-// List Groups
-
-// scss-docs-start list-group-mixin
-@mixin list-group-item-variant($state, $background, $color) {
- .list-group-item-#{$state} {
- color: $color;
- background-color: $background;
-
- &.list-group-item-action {
- &:hover,
- &:focus {
- color: $color;
- background-color: shade-color($background, 10%);
- }
-
- &.active {
- color: $white;
- background-color: $color;
- border-color: $color;
- }
- }
- }
-}
-// scss-docs-end list-group-mixin
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_lists.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_lists.scss
deleted file mode 100644
index 2518562..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_lists.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Lists
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-@mixin list-unstyled {
- padding-left: 0;
- list-style: none;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_pagination.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_pagination.scss
deleted file mode 100644
index 0d65796..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_pagination.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Pagination
-
-// scss-docs-start pagination-mixin
-@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {
- --#{$prefix}pagination-padding-x: #{$padding-x};
- --#{$prefix}pagination-padding-y: #{$padding-y};
- @include rfs($font-size, --#{$prefix}pagination-font-size);
- --#{$prefix}pagination-border-radius: #{$border-radius};
-}
-// scss-docs-end pagination-mixin
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_reset-text.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_reset-text.scss
deleted file mode 100644
index f5bd1af..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_reset-text.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-@mixin reset-text {
- font-family: $font-family-base;
- // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.
- font-style: normal;
- font-weight: $font-weight-normal;
- line-height: $line-height-base;
- text-align: left; // Fallback for where `start` is not supported
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- white-space: normal;
- word-spacing: normal;
- line-break: auto;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_resize.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_resize.scss
deleted file mode 100644
index 66f233a..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_resize.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Resize anything
-
-@mixin resizable($direction) {
- overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
- resize: $direction; // Options: horizontal, vertical, both
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_table-variants.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_table-variants.scss
deleted file mode 100644
index 5fe1b9b..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_table-variants.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// scss-docs-start table-variant
-@mixin table-variant($state, $background) {
- .table-#{$state} {
- $color: color-contrast(opaque($body-bg, $background));
- $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));
- $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));
- $active-bg: mix($color, $background, percentage($table-active-bg-factor));
- $table-border-color: mix($color, $background, percentage($table-border-factor));
-
- --#{$prefix}table-color: #{$color};
- --#{$prefix}table-bg: #{$background};
- --#{$prefix}table-border-color: #{$table-border-color};
- --#{$prefix}table-striped-bg: #{$striped-bg};
- --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};
- --#{$prefix}table-active-bg: #{$active-bg};
- --#{$prefix}table-active-color: #{color-contrast($active-bg)};
- --#{$prefix}table-hover-bg: #{$hover-bg};
- --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};
-
- color: var(--#{$prefix}table-color);
- border-color: var(--#{$prefix}table-border-color);
- }
-}
-// scss-docs-end table-variant
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_text-truncate.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_text-truncate.scss
deleted file mode 100644
index 3504bb1..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_text-truncate.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Text truncate
-// Requires inline-block or block for proper styling
-
-@mixin text-truncate() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_transition.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_transition.scss
deleted file mode 100644
index d437f6d..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_transition.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// stylelint-disable property-disallowed-list
-@mixin transition($transition...) {
- @if length($transition) == 0 {
- $transition: $transition-base;
- }
-
- @if length($transition) > 1 {
- @each $value in $transition {
- @if $value == null or $value == none {
- @warn "The keyword 'none' or 'null' must be used as a single argument.";
- }
- }
- }
-
- @if $enable-transitions {
- @if nth($transition, 1) != null {
- transition: $transition;
- }
-
- @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {
- @media (prefers-reduced-motion: reduce) {
- transition: none;
- }
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_utilities.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_utilities.scss
deleted file mode 100644
index 4795e89..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_utilities.scss
+++ /dev/null
@@ -1,97 +0,0 @@
-// Utility generator
-// Used to generate utilities & print utilities
-@mixin generate-utility($utility, $infix: "", $is-rfs-media-query: false) {
- $values: map-get($utility, values);
-
- // If the values are a list or string, convert it into a map
- @if type-of($values) == "string" or type-of(nth($values, 1)) != "list" {
- $values: zip($values, $values);
- }
-
- @each $key, $value in $values {
- $properties: map-get($utility, property);
-
- // Multiple properties are possible, for example with vertical or horizontal margins or paddings
- @if type-of($properties) == "string" {
- $properties: append((), $properties);
- }
-
- // Use custom class if present
- $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));
- $property-class: if($property-class == null, "", $property-class);
-
- // Use custom CSS variable name if present, otherwise default to `class`
- $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));
-
- // State params to generate pseudo-classes
- $state: if(map-has-key($utility, state), map-get($utility, state), ());
-
- $infix: if($property-class == "" and str-slice($infix, 1, 1) == "-", str-slice($infix, 2), $infix);
-
- // Don't prefix if value key is null (e.g. with shadow class)
- $property-class-modifier: if($key, if($property-class == "" and $infix == "", "", "-") + $key, "");
-
- @if map-get($utility, rfs) {
- // Inside the media query
- @if $is-rfs-media-query {
- $val: rfs-value($value);
-
- // Do not render anything if fluid and non fluid values are the same
- $value: if($val == rfs-fluid-value($value), null, $val);
- }
- @else {
- $value: rfs-fluid-value($value);
- }
- }
-
- $is-css-var: map-get($utility, css-var);
- $is-local-vars: map-get($utility, local-vars);
- $is-rtl: map-get($utility, rtl);
-
- @if $value != null {
- @if $is-rtl == false {
- /* rtl:begin:remove */
- }
-
- @if $is-css-var {
- .#{$property-class + $infix + $property-class-modifier} {
- --#{$prefix}#{$css-variable-name}: #{$value};
- }
-
- @each $pseudo in $state {
- .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
- --#{$prefix}#{$css-variable-name}: #{$value};
- }
- }
- } @else {
- .#{$property-class + $infix + $property-class-modifier} {
- @each $property in $properties {
- @if $is-local-vars {
- @each $local-var, $variable in $is-local-vars {
- --#{$prefix}#{$local-var}: #{$variable};
- }
- }
- #{$property}: $value if($enable-important-utilities, !important, null);
- }
- }
-
- @each $pseudo in $state {
- .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
- @each $property in $properties {
- @if $is-local-vars {
- @each $local-var, $variable in $is-local-vars {
- --#{$prefix}#{$local-var}: #{$variable};
- }
- }
- #{$property}: $value if($enable-important-utilities, !important, null);
- }
- }
- }
- }
-
- @if $is-rtl == false {
- /* rtl:end:remove */
- }
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/mixins/_visually-hidden.scss b/publish/wwwroot/lib/bootstrap/scss/mixins/_visually-hidden.scss
deleted file mode 100644
index 9dd0ad3..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/mixins/_visually-hidden.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Hide content visually while keeping it accessible to assistive technologies
-//
-// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
-// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/
-
-@mixin visually-hidden() {
- width: 1px !important;
- height: 1px !important;
- padding: 0 !important;
- margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686
- overflow: hidden !important;
- clip: rect(0, 0, 0, 0) !important;
- white-space: nowrap !important;
- border: 0 !important;
-
- // Fix for positioned table caption that could become anonymous cells
- &:not(caption) {
- position: absolute !important;
- }
-
- // Fix to prevent overflowing children to become focusable
- * {
- overflow: hidden !important;
- }
-}
-
-// Use to only display content when it's focused, or one of its child elements is focused
-// (i.e. when focus is within the element/container that the class was applied to)
-//
-// Useful for "Skip to main content" links; see https://www.w3.org/WAI/WCAG22/Techniques/general/G1.html
-
-@mixin visually-hidden-focusable() {
- &:not(:focus):not(:focus-within) {
- @include visually-hidden();
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/utilities/_api.scss b/publish/wwwroot/lib/bootstrap/scss/utilities/_api.scss
deleted file mode 100644
index 62e1d39..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/utilities/_api.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Loop over each breakpoint
-@each $breakpoint in map-keys($grid-breakpoints) {
-
- // Generate media query if needed
- @include media-breakpoint-up($breakpoint) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- // Loop over each utility property
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Only proceed if responsive media queries are enabled or if it's the base media query
- @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") {
- @include generate-utility($utility, $infix);
- }
- }
- }
-}
-
-// RFS rescaling
-@media (min-width: $rfs-mq-value) {
- @each $breakpoint in map-keys($grid-breakpoints) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {
- // Loop over each utility property
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Only proceed if responsive media queries are enabled or if it's the base media query
- @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
- @include generate-utility($utility, $infix, true);
- }
- }
- }
- }
-}
-
-
-// Print utilities
-@media print {
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Then check if the utility needs print styles
- @if type-of($utility) == "map" and map-get($utility, print) == true {
- @include generate-utility($utility, "-print");
- }
- }
-}
diff --git a/publish/wwwroot/lib/bootstrap/scss/vendor/_rfs.scss b/publish/wwwroot/lib/bootstrap/scss/vendor/_rfs.scss
deleted file mode 100644
index aa1f82b..0000000
--- a/publish/wwwroot/lib/bootstrap/scss/vendor/_rfs.scss
+++ /dev/null
@@ -1,348 +0,0 @@
-// stylelint-disable scss/dimension-no-non-numeric-values
-
-// SCSS RFS mixin
-//
-// Automated responsive values for font sizes, paddings, margins and much more
-//
-// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)
-
-// Configuration
-
-// Base value
-$rfs-base-value: 1.25rem !default;
-$rfs-unit: rem !default;
-
-@if $rfs-unit != rem and $rfs-unit != px {
- @error "`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.";
-}
-
-// Breakpoint at where values start decreasing if screen width is smaller
-$rfs-breakpoint: 1200px !default;
-$rfs-breakpoint-unit: px !default;
-
-@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {
- @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.";
-}
-
-// Resize values based on screen height and width
-$rfs-two-dimensional: false !default;
-
-// Factor of decrease
-$rfs-factor: 10 !default;
-
-@if type-of($rfs-factor) != number or $rfs-factor <= 1 {
- @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.";
-}
-
-// Mode. Possibilities: "min-media-query", "max-media-query"
-$rfs-mode: min-media-query !default;
-
-// Generate enable or disable classes. Possibilities: false, "enable" or "disable"
-$rfs-class: false !default;
-
-// 1 rem = $rfs-rem-value px
-$rfs-rem-value: 16 !default;
-
-// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14
-$rfs-safari-iframe-resize-bug-fix: false !default;
-
-// Disable RFS by setting $enable-rfs to false
-$enable-rfs: true !default;
-
-// Cache $rfs-base-value unit
-$rfs-base-value-unit: unit($rfs-base-value);
-
-@function divide($dividend, $divisor, $precision: 10) {
- $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);
- $dividend: abs($dividend);
- $divisor: abs($divisor);
- @if $dividend == 0 {
- @return 0;
- }
- @if $divisor == 0 {
- @error "Cannot divide by 0";
- }
- $remainder: $dividend;
- $result: 0;
- $factor: 10;
- @while ($remainder > 0 and $precision >= 0) {
- $quotient: 0;
- @while ($remainder >= $divisor) {
- $remainder: $remainder - $divisor;
- $quotient: $quotient + 1;
- }
- $result: $result * 10 + $quotient;
- $factor: $factor * .1;
- $remainder: $remainder * 10;
- $precision: $precision - 1;
- @if ($precision < 0 and $remainder >= $divisor * 5) {
- $result: $result + 1;
- }
- }
- $result: $result * $factor * $sign;
- $dividend-unit: unit($dividend);
- $divisor-unit: unit($divisor);
- $unit-map: (
- "px": 1px,
- "rem": 1rem,
- "em": 1em,
- "%": 1%
- );
- @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {
- $result: $result * map-get($unit-map, $dividend-unit);
- }
- @return $result;
-}
-
-// Remove px-unit from $rfs-base-value for calculations
-@if $rfs-base-value-unit == px {
- $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);
-}
-@else if $rfs-base-value-unit == rem {
- $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));
-}
-
-// Cache $rfs-breakpoint unit to prevent multiple calls
-$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);
-
-// Remove unit from $rfs-breakpoint for calculations
-@if $rfs-breakpoint-unit-cache == px {
- $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);
-}
-@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == "em" {
- $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));
-}
-
-// Calculate the media query value
-$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});
-$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);
-$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);
-
-// Internal mixin used to determine which media query needs to be used
-@mixin _rfs-media-query {
- @if $rfs-two-dimensional {
- @if $rfs-mode == max-media-query {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
- @content;
- }
- }
- @else {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
- @content;
- }
- }
- }
- @else {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {
- @content;
- }
- }
-}
-
-// Internal mixin that adds disable classes to the selector if needed.
-@mixin _rfs-rule {
- @if $rfs-class == disable and $rfs-mode == max-media-query {
- // Adding an extra class increases specificity, which prevents the media query to override the property
- &,
- .disable-rfs &,
- &.disable-rfs {
- @content;
- }
- }
- @else if $rfs-class == enable and $rfs-mode == min-media-query {
- .enable-rfs &,
- &.enable-rfs {
- @content;
- }
- } @else {
- @content;
- }
-}
-
-// Internal mixin that adds enable classes to the selector if needed.
-@mixin _rfs-media-query-rule {
-
- @if $rfs-class == enable {
- @if $rfs-mode == min-media-query {
- @content;
- }
-
- @include _rfs-media-query () {
- .enable-rfs &,
- &.enable-rfs {
- @content;
- }
- }
- }
- @else {
- @if $rfs-class == disable and $rfs-mode == min-media-query {
- .disable-rfs &,
- &.disable-rfs {
- @content;
- }
- }
- @include _rfs-media-query () {
- @content;
- }
- }
-}
-
-// Helper function to get the formatted non-responsive value
-@function rfs-value($values) {
- // Convert to list
- $values: if(type-of($values) != list, ($values,), $values);
-
- $val: "";
-
- // Loop over each value and calculate value
- @each $value in $values {
- @if $value == 0 {
- $val: $val + " 0";
- }
- @else {
- // Cache $value unit
- $unit: if(type-of($value) == "number", unit($value), false);
-
- @if $unit == px {
- // Convert to rem if needed
- $val: $val + " " + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);
- }
- @else if $unit == rem {
- // Convert to px if needed
- $val: $val + " " + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);
- } @else {
- // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
- $val: $val + " " + $value;
- }
- }
- }
-
- // Remove first space
- @return unquote(str-slice($val, 2));
-}
-
-// Helper function to get the responsive value calculated by RFS
-@function rfs-fluid-value($values) {
- // Convert to list
- $values: if(type-of($values) != list, ($values,), $values);
-
- $val: "";
-
- // Loop over each value and calculate value
- @each $value in $values {
- @if $value == 0 {
- $val: $val + " 0";
- } @else {
- // Cache $value unit
- $unit: if(type-of($value) == "number", unit($value), false);
-
- // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
- @if not $unit or $unit != px and $unit != rem {
- $val: $val + " " + $value;
- } @else {
- // Remove unit from $value for calculations
- $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));
-
- // Only add the media query if the value is greater than the minimum value
- @if abs($value) <= $rfs-base-value or not $enable-rfs {
- $val: $val + " " + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);
- }
- @else {
- // Calculate the minimum value
- $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);
-
- // Calculate difference between $value and the minimum value
- $value-diff: abs($value) - $value-min;
-
- // Base value formatting
- $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);
-
- // Use negative value if needed
- $min-width: if($value < 0, -$min-width, $min-width);
-
- // Use `vmin` if two-dimensional is enabled
- $variable-unit: if($rfs-two-dimensional, vmin, vw);
-
- // Calculate the variable width between 0 and $rfs-breakpoint
- $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};
-
- // Return the calculated value
- $val: $val + " calc(" + $min-width + if($value < 0, " - ", " + ") + $variable-width + ")";
- }
- }
- }
- }
-
- // Remove first space
- @return unquote(str-slice($val, 2));
-}
-
-// RFS mixin
-@mixin rfs($values, $property: font-size) {
- @if $values != null {
- $val: rfs-value($values);
- $fluid-val: rfs-fluid-value($values);
-
- // Do not print the media query if responsive & non-responsive values are the same
- @if $val == $fluid-val {
- #{$property}: $val;
- }
- @else {
- @include _rfs-rule () {
- #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);
-
- // Include safari iframe resize fix if needed
- min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);
- }
-
- @include _rfs-media-query-rule () {
- #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);
- }
- }
- }
-}
-
-// Shorthand helper mixins
-@mixin font-size($value) {
- @include rfs($value);
-}
-
-@mixin padding($value) {
- @include rfs($value, padding);
-}
-
-@mixin padding-top($value) {
- @include rfs($value, padding-top);
-}
-
-@mixin padding-right($value) {
- @include rfs($value, padding-right);
-}
-
-@mixin padding-bottom($value) {
- @include rfs($value, padding-bottom);
-}
-
-@mixin padding-left($value) {
- @include rfs($value, padding-left);
-}
-
-@mixin margin($value) {
- @include rfs($value, margin);
-}
-
-@mixin margin-top($value) {
- @include rfs($value, margin-top);
-}
-
-@mixin margin-right($value) {
- @include rfs($value, margin-right);
-}
-
-@mixin margin-bottom($value) {
- @include rfs($value, margin-bottom);
-}
-
-@mixin margin-left($value) {
- @include rfs($value, margin-left);
-}
diff --git a/publish/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/publish/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
deleted file mode 100644
index 984713a..0000000
--- a/publish/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) .NET Foundation and Contributors
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
deleted file mode 100644
index 0093060..0000000
--- a/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ /dev/null
@@ -1,435 +0,0 @@
-/**
- * @license
- * Unobtrusive validation support library for jQuery and jQuery Validate
- * Copyright (c) .NET Foundation. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
- * @version v4.0.0
- */
-
-/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
-/*global document: false, jQuery: false */
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD. Register as an anonymous module.
- define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
- } else if (typeof module === 'object' && module.exports) {
- // CommonJS-like environments that support module.exports
- module.exports = factory(require('jquery-validation'));
- } else {
- // Browser global
- jQuery.validator.unobtrusive = factory(jQuery);
- }
-}(function ($) {
- var $jQval = $.validator,
- adapters,
- data_validation = "unobtrusiveValidation";
-
- function setValidationValues(options, ruleName, value) {
- options.rules[ruleName] = value;
- if (options.message) {
- options.messages[ruleName] = options.message;
- }
- }
-
- function splitAndTrim(value) {
- return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
- }
-
- function escapeAttributeValue(value) {
- // As mentioned on http://api.jquery.com/category/selectors/
- return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
- }
-
- function getModelPrefix(fieldName) {
- return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
- }
-
- function appendModelPrefix(value, prefix) {
- if (value.indexOf("*.") === 0) {
- value = value.replace("*.", prefix);
- }
- return value;
- }
-
- function onError(error, inputElement) { // 'this' is the form element
- var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
- replaceAttrValue = container.attr("data-valmsg-replace"),
- replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
-
- container.removeClass("field-validation-valid").addClass("field-validation-error");
- error.data("unobtrusiveContainer", container);
-
- if (replace) {
- container.empty();
- error.removeClass("input-validation-error").appendTo(container);
- }
- else {
- error.hide();
- }
- }
-
- function onErrors(event, validator) { // 'this' is the form element
- var container = $(this).find("[data-valmsg-summary=true]"),
- list = container.find("ul");
-
- if (list && list.length && validator.errorList.length) {
- list.empty();
- container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
-
- $.each(validator.errorList, function () {
- $(" ").html(this.message).appendTo(list);
- });
- }
- }
-
- function onSuccess(error) { // 'this' is the form element
- var container = error.data("unobtrusiveContainer");
-
- if (container) {
- var replaceAttrValue = container.attr("data-valmsg-replace"),
- replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
-
- container.addClass("field-validation-valid").removeClass("field-validation-error");
- error.removeData("unobtrusiveContainer");
-
- if (replace) {
- container.empty();
- }
- }
- }
-
- function onReset(event) { // 'this' is the form element
- var $form = $(this),
- key = '__jquery_unobtrusive_validation_form_reset';
- if ($form.data(key)) {
- return;
- }
- // Set a flag that indicates we're currently resetting the form.
- $form.data(key, true);
- try {
- $form.data("validator").resetForm();
- } finally {
- $form.removeData(key);
- }
-
- $form.find(".validation-summary-errors")
- .addClass("validation-summary-valid")
- .removeClass("validation-summary-errors");
- $form.find(".field-validation-error")
- .addClass("field-validation-valid")
- .removeClass("field-validation-error")
- .removeData("unobtrusiveContainer")
- .find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
- }
-
- function validationInfo(form) {
- var $form = $(form),
- result = $form.data(data_validation),
- onResetProxy = $.proxy(onReset, form),
- defaultOptions = $jQval.unobtrusive.options || {},
- execInContext = function (name, args) {
- var func = defaultOptions[name];
- func && $.isFunction(func) && func.apply(form, args);
- };
-
- if (!result) {
- result = {
- options: { // options structure passed to jQuery Validate's validate() method
- errorClass: defaultOptions.errorClass || "input-validation-error",
- errorElement: defaultOptions.errorElement || "span",
- errorPlacement: function () {
- onError.apply(form, arguments);
- execInContext("errorPlacement", arguments);
- },
- invalidHandler: function () {
- onErrors.apply(form, arguments);
- execInContext("invalidHandler", arguments);
- },
- messages: {},
- rules: {},
- success: function () {
- onSuccess.apply(form, arguments);
- execInContext("success", arguments);
- }
- },
- attachValidation: function () {
- $form
- .off("reset." + data_validation, onResetProxy)
- .on("reset." + data_validation, onResetProxy)
- .validate(this.options);
- },
- validate: function () { // a validation function that is called by unobtrusive Ajax
- $form.validate();
- return $form.valid();
- }
- };
- $form.data(data_validation, result);
- }
-
- return result;
- }
-
- $jQval.unobtrusive = {
- adapters: [],
-
- parseElement: function (element, skipAttach) {
- ///
- /// Parses a single HTML element for unobtrusive validation attributes.
- ///
- /// The HTML element to be parsed.
- /// [Optional] true to skip attaching the
- /// validation to the form. If parsing just this single element, you should specify true.
- /// If parsing several elements, you should specify false, and manually attach the validation
- /// to the form when you are finished. The default is false.
- var $element = $(element),
- form = $element.parents("form")[0],
- valInfo, rules, messages;
-
- if (!form) { // Cannot do client-side validation without a form
- return;
- }
-
- valInfo = validationInfo(form);
- valInfo.options.rules[element.name] = rules = {};
- valInfo.options.messages[element.name] = messages = {};
-
- $.each(this.adapters, function () {
- var prefix = "data-val-" + this.name,
- message = $element.attr(prefix),
- paramValues = {};
-
- if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
- prefix += "-";
-
- $.each(this.params, function () {
- paramValues[this] = $element.attr(prefix + this);
- });
-
- this.adapt({
- element: element,
- form: form,
- message: message,
- params: paramValues,
- rules: rules,
- messages: messages
- });
- }
- });
-
- $.extend(rules, { "__dummy__": true });
-
- if (!skipAttach) {
- valInfo.attachValidation();
- }
- },
-
- parse: function (selector) {
- ///
- /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
- /// with the [data-val=true] attribute value and enables validation according to the data-val-*
- /// attribute values.
- ///
- /// Any valid jQuery selector.
-
- // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
- // element with data-val=true
- var $selector = $(selector),
- $forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
-
- $selector.find("[data-val=true]").each(function () {
- $jQval.unobtrusive.parseElement(this, true);
- });
-
- $forms.each(function () {
- var info = validationInfo(this);
- if (info) {
- info.attachValidation();
- }
- });
- }
- };
-
- adapters = $jQval.unobtrusive.adapters;
-
- adapters.add = function (adapterName, params, fn) {
- /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.
- /// The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- /// [Optional] An array of parameter names (strings) that will
- /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
- /// mmmm is the parameter name).
- /// The function to call, which adapts the values from the HTML
- /// attributes into jQuery Validate rules and/or messages.
- ///
- if (!fn) { // Called with no params, just a function
- fn = params;
- params = [];
- }
- this.push({ name: adapterName, params: params, adapt: fn });
- return this;
- };
-
- adapters.addBool = function (adapterName, ruleName) {
- /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation rule has no parameter values.
- /// The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- /// [Optional] The name of the jQuery Validate rule. If not provided, the value
- /// of adapterName will be used instead.
- ///
- return this.add(adapterName, function (options) {
- setValidationValues(options, ruleName || adapterName, true);
- });
- };
-
- adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
- /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
- /// one for min-and-max). The HTML parameters are expected to be named -min and -max.
- /// The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- /// The name of the jQuery Validate rule to be used when you only
- /// have a minimum value.
- /// The name of the jQuery Validate rule to be used when you only
- /// have a maximum value.
- /// The name of the jQuery Validate rule to be used when you
- /// have both a minimum and maximum value.
- /// [Optional] The name of the HTML attribute that
- /// contains the minimum value. The default is "min".
- /// [Optional] The name of the HTML attribute that
- /// contains the maximum value. The default is "max".
- ///
- return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
- var min = options.params.min,
- max = options.params.max;
-
- if (min && max) {
- setValidationValues(options, minMaxRuleName, [min, max]);
- }
- else if (min) {
- setValidationValues(options, minRuleName, min);
- }
- else if (max) {
- setValidationValues(options, maxRuleName, max);
- }
- });
- };
-
- adapters.addSingleVal = function (adapterName, attribute, ruleName) {
- /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation rule has a single value.
- /// The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).
- /// [Optional] The name of the HTML attribute that contains the value.
- /// The default is "val".
- /// [Optional] The name of the jQuery Validate rule. If not provided, the value
- /// of adapterName will be used instead.
- ///
- return this.add(adapterName, [attribute || "val"], function (options) {
- setValidationValues(options, ruleName || adapterName, options.params[attribute]);
- });
- };
-
- $jQval.addMethod("__dummy__", function (value, element, params) {
- return true;
- });
-
- $jQval.addMethod("regex", function (value, element, params) {
- var match;
- if (this.optional(element)) {
- return true;
- }
-
- match = new RegExp(params).exec(value);
- return (match && (match.index === 0) && (match[0].length === value.length));
- });
-
- $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
- var match;
- if (nonalphamin) {
- match = value.match(/\W/g);
- match = match && match.length >= nonalphamin;
- }
- return match;
- });
-
- if ($jQval.methods.extension) {
- adapters.addSingleVal("accept", "mimtype");
- adapters.addSingleVal("extension", "extension");
- } else {
- // for backward compatibility, when the 'extension' validation method does not exist, such as with versions
- // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
- // validating the extension, and ignore mime-type validations as they are not supported.
- adapters.addSingleVal("extension", "extension", "accept");
- }
-
- adapters.addSingleVal("regex", "pattern");
- adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
- adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
- adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
- adapters.add("equalto", ["other"], function (options) {
- var prefix = getModelPrefix(options.element.name),
- other = options.params.other,
- fullOtherName = appendModelPrefix(other, prefix),
- element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
-
- setValidationValues(options, "equalTo", element);
- });
- adapters.add("required", function (options) {
- // jQuery Validate equates "required" with "mandatory" for checkbox elements
- if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
- setValidationValues(options, "required", true);
- }
- });
- adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
- var value = {
- url: options.params.url,
- type: options.params.type || "GET",
- data: {}
- },
- prefix = getModelPrefix(options.element.name);
-
- $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
- var paramName = appendModelPrefix(fieldName, prefix);
- value.data[paramName] = function () {
- var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
- // For checkboxes and radio buttons, only pick up values from checked fields.
- if (field.is(":checkbox")) {
- return field.filter(":checked").val() || field.filter(":hidden").val() || '';
- }
- else if (field.is(":radio")) {
- return field.filter(":checked").val() || '';
- }
- return field.val();
- };
- });
-
- setValidationValues(options, "remote", value);
- });
- adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
- if (options.params.min) {
- setValidationValues(options, "minlength", options.params.min);
- }
- if (options.params.nonalphamin) {
- setValidationValues(options, "nonalphamin", options.params.nonalphamin);
- }
- if (options.params.regex) {
- setValidationValues(options, "regex", options.params.regex);
- }
- });
- adapters.add("fileextensions", ["extensions"], function (options) {
- setValidationValues(options, "extension", options.params.extensions);
- });
-
- $(function () {
- $jQval.unobtrusive.parse(document);
- });
-
- return $jQval.unobtrusive;
-}));
diff --git a/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
deleted file mode 100644
index d8d803c..0000000
--- a/publish/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @license
- * Unobtrusive validation support library for jQuery and jQuery Validate
- * Copyright (c) .NET Foundation. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
- * @version v4.0.0
- */
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s(" ").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive});
\ No newline at end of file
diff --git a/publish/wwwroot/lib/jquery-validation/LICENSE.md b/publish/wwwroot/lib/jquery-validation/LICENSE.md
deleted file mode 100644
index dc377cc..0000000
--- a/publish/wwwroot/lib/jquery-validation/LICENSE.md
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-=====================
-
-Copyright Jörn Zaefferer
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/publish/wwwroot/lib/jquery-validation/dist/additional-methods.js b/publish/wwwroot/lib/jquery-validation/dist/additional-methods.js
deleted file mode 100644
index c6a7229..0000000
--- a/publish/wwwroot/lib/jquery-validation/dist/additional-methods.js
+++ /dev/null
@@ -1,1512 +0,0 @@
-/*!
- * jQuery Validation Plugin v1.19.5
- *
- * https://jqueryvalidation.org/
- *
- * Copyright (c) 2022 Jörn Zaefferer
- * Released under the MIT license
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "./jquery.validate"], factory );
- } else if (typeof module === "object" && module.exports) {
- module.exports = factory( require( "jquery" ) );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-( function() {
-
- function stripHtml( value ) {
-
- // Remove html tags and space chars
- return value.replace( /<.[^<>]*?>/g, " " ).replace( / | /gi, " " )
-
- // Remove punctuation
- .replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
- }
-
- $.validator.addMethod( "maxWords", function( value, element, params ) {
- return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params;
- }, $.validator.format( "Please enter {0} words or less." ) );
-
- $.validator.addMethod( "minWords", function( value, element, params ) {
- return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params;
- }, $.validator.format( "Please enter at least {0} words." ) );
-
- $.validator.addMethod( "rangeWords", function( value, element, params ) {
- var valueStripped = stripHtml( value ),
- regex = /\b\w+\b/g;
- return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];
- }, $.validator.format( "Please enter between {0} and {1} words." ) );
-
-}() );
-
-/**
- * This is used in the United States to process payments, deposits,
- * or transfers using the Automated Clearing House (ACH) or Fedwire
- * systems. A very common use case would be to validate a form for
- * an ACH bill payment.
- */
-$.validator.addMethod( "abaRoutingNumber", function( value ) {
- var checksum = 0;
- var tokens = value.split( "" );
- var length = tokens.length;
-
- // Length Check
- if ( length !== 9 ) {
- return false;
- }
-
- // Calc the checksum
- // https://en.wikipedia.org/wiki/ABA_routing_transit_number
- for ( var i = 0; i < length; i += 3 ) {
- checksum += parseInt( tokens[ i ], 10 ) * 3 +
- parseInt( tokens[ i + 1 ], 10 ) * 7 +
- parseInt( tokens[ i + 2 ], 10 );
- }
-
- // If not zero and divisible by 10 then valid
- if ( checksum !== 0 && checksum % 10 === 0 ) {
- return true;
- }
-
- return false;
-}, "Please enter a valid routing number." );
-
-// Accept a value from a file input based on a required mimetype
-$.validator.addMethod( "accept", function( value, element, param ) {
-
- // Split mime on commas in case we have multiple types we can accept
- var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
- optionalValue = this.optional( element ),
- i, file, regex;
-
- // Element is optional
- if ( optionalValue ) {
- return optionalValue;
- }
-
- if ( $( element ).attr( "type" ) === "file" ) {
-
- // Escape string to be used in the regex
- // see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
- // Escape also "/*" as "/.*" as a wildcard
- typeParam = typeParam
- .replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
- .replace( /,/g, "|" )
- .replace( /\/\*/g, "/.*" );
-
- // Check if the element has a FileList before checking each file
- if ( element.files && element.files.length ) {
- regex = new RegExp( ".?(" + typeParam + ")$", "i" );
- for ( i = 0; i < element.files.length; i++ ) {
- file = element.files[ i ];
-
- // Grab the mimetype from the loaded file, verify it matches
- if ( !file.type.match( regex ) ) {
- return false;
- }
- }
- }
- }
-
- // Either return true because we've validated each file, or because the
- // browser does not support element.files and the FileList feature
- return true;
-}, $.validator.format( "Please enter a value with a valid mimetype." ) );
-
-$.validator.addMethod( "alphanumeric", function( value, element ) {
- return this.optional( element ) || /^\w+$/i.test( value );
-}, "Letters, numbers, and underscores only please." );
-
-/*
- * Dutch bank account numbers (not 'giro' numbers) have 9 digits
- * and pass the '11 check'.
- * We accept the notation with spaces, as that is common.
- * acceptable: 123456789 or 12 34 56 789
- */
-$.validator.addMethod( "bankaccountNL", function( value, element ) {
- if ( this.optional( element ) ) {
- return true;
- }
- if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
- return false;
- }
-
- // Now '11 check'
- var account = value.replace( / /g, "" ), // Remove spaces
- sum = 0,
- len = account.length,
- pos, factor, digit;
- for ( pos = 0; pos < len; pos++ ) {
- factor = len - pos;
- digit = account.substring( pos, pos + 1 );
- sum = sum + factor * digit;
- }
- return sum % 11 === 0;
-}, "Please specify a valid bank account number." );
-
-$.validator.addMethod( "bankorgiroaccountNL", function( value, element ) {
- return this.optional( element ) ||
- ( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||
- ( $.validator.methods.giroaccountNL.call( this, value, element ) );
-}, "Please specify a valid bank or giro account number." );
-
-/**
- * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
- *
- * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
- *
- * Validation is case-insensitive. Please make sure to normalize input yourself.
- *
- * BIC definition in detail:
- * - First 4 characters - bank code (only letters)
- * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
- * - Next 2 characters - location code (letters and digits)
- * a. shall not start with '0' or '1'
- * b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
- * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
- */
-$.validator.addMethod( "bic", function( value, element ) {
- return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
-}, "Please specify a valid BIC code." );
-
-/*
- * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
- * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
- *
- * Spanish CIF structure:
- *
- * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]
- *
- * Where:
- *
- * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]
- * P: 2 characters. Province.
- * N: 5 characters. Secuencial Number within the province.
- * C: 1 character. Control Digit: [0-9A-J].
- *
- * [ T ]: Kind of Organizations. Possible values:
- *
- * A. Corporations
- * B. LLCs
- * C. General partnerships
- * D. Companies limited partnerships
- * E. Communities of goods
- * F. Cooperative Societies
- * G. Associations
- * H. Communities of homeowners in horizontal property regime
- * J. Civil Societies
- * K. Old format
- * L. Old format
- * M. Old format
- * N. Nonresident entities
- * P. Local authorities
- * Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
- * R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
- * S. Organs of State Administration and regions
- * V. Agrarian Transformation
- * W. Permanent establishments of non-resident in Spain
- *
- * [ C ]: Control Digit. It can be a number or a letter depending on T value:
- * [ T ] --> [ C ]
- * ------ ----------
- * A Number
- * B Number
- * E Number
- * H Number
- * K Letter
- * P Letter
- * Q Letter
- * S Letter
- *
- */
-$.validator.addMethod( "cifES", function( value, element ) {
- "use strict";
-
- if ( this.optional( element ) ) {
- return true;
- }
-
- var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi );
- var letter = value.substring( 0, 1 ), // [ T ]
- number = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
- control = value.substring( 8, 9 ), // [ C ]
- all_sum = 0,
- even_sum = 0,
- odd_sum = 0,
- i, n,
- control_digit,
- control_letter;
-
- function isOdd( n ) {
- return n % 2 === 0;
- }
-
- // Quick format test
- if ( value.length !== 9 || !cifRegEx.test( value ) ) {
- return false;
- }
-
- for ( i = 0; i < number.length; i++ ) {
- n = parseInt( number[ i ], 10 );
-
- // Odd positions
- if ( isOdd( i ) ) {
-
- // Odd positions are multiplied first.
- n *= 2;
-
- // If the multiplication is bigger than 10 we need to adjust
- odd_sum += n < 10 ? n : n - 9;
-
- // Even positions
- // Just sum them
- } else {
- even_sum += n;
- }
- }
-
- all_sum = even_sum + odd_sum;
- control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();
- control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit;
- control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString();
-
- // Control must be a digit
- if ( letter.match( /[ABEH]/ ) ) {
- return control === control_digit;
-
- // Control must be a letter
- } else if ( letter.match( /[KPQS]/ ) ) {
- return control === control_letter;
- }
-
- // Can be either
- return control === control_digit || control === control_letter;
-
-}, "Please specify a valid CIF number." );
-
-/*
- * Brazillian CNH number (Carteira Nacional de Habilitacao) is the License Driver number.
- * CNH numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
- */
-$.validator.addMethod( "cnhBR", function( value ) {
-
- // Removing special characters from value
- value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
-
- // Checking value to have 11 digits only
- if ( value.length !== 11 ) {
- return false;
- }
-
- var sum = 0, dsc = 0, firstChar,
- firstCN, secondCN, i, j, v;
-
- firstChar = value.charAt( 0 );
-
- if ( new Array( 12 ).join( firstChar ) === value ) {
- return false;
- }
-
- // Step 1 - using first Check Number:
- for ( i = 0, j = 9, v = 0; i < 9; ++i, --j ) {
- sum += +( value.charAt( i ) * j );
- }
-
- firstCN = sum % 11;
- if ( firstCN >= 10 ) {
- firstCN = 0;
- dsc = 2;
- }
-
- sum = 0;
- for ( i = 0, j = 1, v = 0; i < 9; ++i, ++j ) {
- sum += +( value.charAt( i ) * j );
- }
-
- secondCN = sum % 11;
- if ( secondCN >= 10 ) {
- secondCN = 0;
- } else {
- secondCN = secondCN - dsc;
- }
-
- return ( String( firstCN ).concat( secondCN ) === value.substr( -2 ) );
-
-}, "Please specify a valid CNH number." );
-
-/*
- * Brazillian value number (Cadastrado de Pessoas Juridica).
- * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation.
- */
-$.validator.addMethod( "cnpjBR", function( value, element ) {
- "use strict";
-
- if ( this.optional( element ) ) {
- return true;
- }
-
- // Removing no number
- value = value.replace( /[^\d]+/g, "" );
-
- // Checking value to have 14 digits only
- if ( value.length !== 14 ) {
- return false;
- }
-
- // Elimina values invalidos conhecidos
- if ( value === "00000000000000" ||
- value === "11111111111111" ||
- value === "22222222222222" ||
- value === "33333333333333" ||
- value === "44444444444444" ||
- value === "55555555555555" ||
- value === "66666666666666" ||
- value === "77777777777777" ||
- value === "88888888888888" ||
- value === "99999999999999" ) {
- return false;
- }
-
- // Valida DVs
- var tamanho = ( value.length - 2 );
- var numeros = value.substring( 0, tamanho );
- var digitos = value.substring( tamanho );
- var soma = 0;
- var pos = tamanho - 7;
-
- for ( var i = tamanho; i >= 1; i-- ) {
- soma += numeros.charAt( tamanho - i ) * pos--;
- if ( pos < 2 ) {
- pos = 9;
- }
- }
-
- var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
-
- if ( resultado !== parseInt( digitos.charAt( 0 ), 10 ) ) {
- return false;
- }
-
- tamanho = tamanho + 1;
- numeros = value.substring( 0, tamanho );
- soma = 0;
- pos = tamanho - 7;
-
- for ( var il = tamanho; il >= 1; il-- ) {
- soma += numeros.charAt( tamanho - il ) * pos--;
- if ( pos < 2 ) {
- pos = 9;
- }
- }
-
- resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
-
- if ( resultado !== parseInt( digitos.charAt( 1 ), 10 ) ) {
- return false;
- }
-
- return true;
-
-}, "Please specify a CNPJ value number." );
-
-/*
- * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
- * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
- */
-$.validator.addMethod( "cpfBR", function( value, element ) {
- "use strict";
-
- if ( this.optional( element ) ) {
- return true;
- }
-
- // Removing special characters from value
- value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
-
- // Checking value to have 11 digits only
- if ( value.length !== 11 ) {
- return false;
- }
-
- var sum = 0,
- firstCN, secondCN, checkResult, i;
-
- firstCN = parseInt( value.substring( 9, 10 ), 10 );
- secondCN = parseInt( value.substring( 10, 11 ), 10 );
-
- checkResult = function( sum, cn ) {
- var result = ( sum * 10 ) % 11;
- if ( ( result === 10 ) || ( result === 11 ) ) {
- result = 0;
- }
- return ( result === cn );
- };
-
- // Checking for dump data
- if ( value === "" ||
- value === "00000000000" ||
- value === "11111111111" ||
- value === "22222222222" ||
- value === "33333333333" ||
- value === "44444444444" ||
- value === "55555555555" ||
- value === "66666666666" ||
- value === "77777777777" ||
- value === "88888888888" ||
- value === "99999999999"
- ) {
- return false;
- }
-
- // Step 1 - using first Check Number:
- for ( i = 1; i <= 9; i++ ) {
- sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
- }
-
- // If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
- if ( checkResult( sum, firstCN ) ) {
- sum = 0;
- for ( i = 1; i <= 10; i++ ) {
- sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
- }
- return checkResult( sum, secondCN );
- }
- return false;
-
-}, "Please specify a valid CPF number." );
-
-// https://jqueryvalidation.org/creditcard-method/
-// based on https://en.wikipedia.org/wiki/Luhn_algorithm
-$.validator.addMethod( "creditcard", function( value, element ) {
- if ( this.optional( element ) ) {
- return "dependency-mismatch";
- }
-
- // Accept only spaces, digits and dashes
- if ( /[^0-9 \-]+/.test( value ) ) {
- return false;
- }
-
- var nCheck = 0,
- nDigit = 0,
- bEven = false,
- n, cDigit;
-
- value = value.replace( /\D/g, "" );
-
- // Basing min and max length on
- // https://dev.ean.com/general-info/valid-card-types/
- if ( value.length < 13 || value.length > 19 ) {
- return false;
- }
-
- for ( n = value.length - 1; n >= 0; n-- ) {
- cDigit = value.charAt( n );
- nDigit = parseInt( cDigit, 10 );
- if ( bEven ) {
- if ( ( nDigit *= 2 ) > 9 ) {
- nDigit -= 9;
- }
- }
-
- nCheck += nDigit;
- bEven = !bEven;
- }
-
- return ( nCheck % 10 ) === 0;
-}, "Please enter a valid credit card number." );
-
-/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
- * Redistributed under the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
- * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
- */
-$.validator.addMethod( "creditcardtypes", function( value, element, param ) {
- if ( /[^0-9\-]+/.test( value ) ) {
- return false;
- }
-
- value = value.replace( /\D/g, "" );
-
- var validTypes = 0x0000;
-
- if ( param.mastercard ) {
- validTypes |= 0x0001;
- }
- if ( param.visa ) {
- validTypes |= 0x0002;
- }
- if ( param.amex ) {
- validTypes |= 0x0004;
- }
- if ( param.dinersclub ) {
- validTypes |= 0x0008;
- }
- if ( param.enroute ) {
- validTypes |= 0x0010;
- }
- if ( param.discover ) {
- validTypes |= 0x0020;
- }
- if ( param.jcb ) {
- validTypes |= 0x0040;
- }
- if ( param.unknown ) {
- validTypes |= 0x0080;
- }
- if ( param.all ) {
- validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
- }
- if ( validTypes & 0x0001 && ( /^(5[12345])/.test( value ) || /^(2[234567])/.test( value ) ) ) { // Mastercard
- return value.length === 16;
- }
- if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
- return value.length === 16;
- }
- if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
- return value.length === 15;
- }
- if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
- return value.length === 14;
- }
- if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
- return value.length === 15;
- }
- if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
- return value.length === 16;
- }
- if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
- return value.length === 16;
- }
- if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
- return value.length === 15;
- }
- if ( validTypes & 0x0080 ) { // Unknown
- return true;
- }
- return false;
-}, "Please enter a valid credit card number." );
-
-/**
- * Validates currencies with any given symbols by @jameslouiz
- * Symbols can be optional or required. Symbols required by default
- *
- * Usage examples:
- * currency: ["£", false] - Use false for soft currency validation
- * currency: ["$", false]
- * currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc
- *
- *
- *
- * Soft symbol checking
- * currencyInput: {
- * currency: ["$", false]
- * }
- *
- * Strict symbol checking (default)
- * currencyInput: {
- * currency: "$"
- * //OR
- * currency: ["$", true]
- * }
- *
- * Multiple Symbols
- * currencyInput: {
- * currency: "$,£,¢"
- * }
- */
-$.validator.addMethod( "currency", function( value, element, param ) {
- var isParamString = typeof param === "string",
- symbol = isParamString ? param : param[ 0 ],
- soft = isParamString ? true : param[ 1 ],
- regex;
-
- symbol = symbol.replace( /,/g, "" );
- symbol = soft ? symbol + "]" : symbol + "]?";
- regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
- regex = new RegExp( regex );
- return this.optional( element ) || regex.test( value );
-
-}, "Please specify a valid currency." );
-
-$.validator.addMethod( "dateFA", function( value, element ) {
- return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
-}, $.validator.messages.date );
-
-/**
- * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
- *
- * @example $.validator.methods.date("01/01/1900")
- * @result true
- *
- * @example $.validator.methods.date("01/13/1990")
- * @result false
- *
- * @example $.validator.methods.date("01.01.1900")
- * @result false
- *
- * @example
- * @desc Declares an optional input element whose value must be a valid date.
- *
- * @name $.validator.methods.dateITA
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod( "dateITA", function( value, element ) {
- var check = false,
- re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
- adata, gg, mm, aaaa, xdata;
- if ( re.test( value ) ) {
- adata = value.split( "/" );
- gg = parseInt( adata[ 0 ], 10 );
- mm = parseInt( adata[ 1 ], 10 );
- aaaa = parseInt( adata[ 2 ], 10 );
- xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
- if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
- check = true;
- } else {
- check = false;
- }
- } else {
- check = false;
- }
- return this.optional( element ) || check;
-}, $.validator.messages.date );
-
-$.validator.addMethod( "dateNL", function( value, element ) {
- return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
-}, $.validator.messages.date );
-
-// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
-$.validator.addMethod( "extension", function( value, element, param ) {
- param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
- return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
-}, $.validator.format( "Please enter a value with a valid extension." ) );
-
-/**
- * Dutch giro account numbers (not bank numbers) have max 7 digits
- */
-$.validator.addMethod( "giroaccountNL", function( value, element ) {
- return this.optional( element ) || /^[0-9]{1,7}$/.test( value );
-}, "Please specify a valid giro account number." );
-
-$.validator.addMethod( "greaterThan", function( value, element, param ) {
- var target = $( param );
-
- if ( this.settings.onfocusout && target.not( ".validate-greaterThan-blur" ).length ) {
- target.addClass( "validate-greaterThan-blur" ).on( "blur.validate-greaterThan", function() {
- $( element ).valid();
- } );
- }
-
- return value > target.val();
-}, "Please enter a greater value." );
-
-$.validator.addMethod( "greaterThanEqual", function( value, element, param ) {
- var target = $( param );
-
- if ( this.settings.onfocusout && target.not( ".validate-greaterThanEqual-blur" ).length ) {
- target.addClass( "validate-greaterThanEqual-blur" ).on( "blur.validate-greaterThanEqual", function() {
- $( element ).valid();
- } );
- }
-
- return value >= target.val();
-}, "Please enter a greater value." );
-
-/**
- * IBAN is the international bank account number.
- * It has a country - specific format, that is checked here too
- *
- * Validation is case-insensitive. Please make sure to normalize input yourself.
- */
-$.validator.addMethod( "iban", function( value, element ) {
-
- // Some quick simple tests to prevent needless work
- if ( this.optional( element ) ) {
- return true;
- }
-
- // Remove spaces and to upper case
- var iban = value.replace( / /g, "" ).toUpperCase(),
- ibancheckdigits = "",
- leadingZeroes = true,
- cRest = "",
- cOperator = "",
- countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
-
- // Check for IBAN code length.
- // It contains:
- // country code ISO 3166-1 - two letters,
- // two check digits,
- // Basic Bank Account Number (BBAN) - up to 30 chars
- var minimalIBANlength = 5;
- if ( iban.length < minimalIBANlength ) {
- return false;
- }
-
- // Check the country code and find the country specific format
- countrycode = iban.substring( 0, 2 );
- bbancountrypatterns = {
- "AL": "\\d{8}[\\dA-Z]{16}",
- "AD": "\\d{8}[\\dA-Z]{12}",
- "AT": "\\d{16}",
- "AZ": "[\\dA-Z]{4}\\d{20}",
- "BE": "\\d{12}",
- "BH": "[A-Z]{4}[\\dA-Z]{14}",
- "BA": "\\d{16}",
- "BR": "\\d{23}[A-Z][\\dA-Z]",
- "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
- "CR": "\\d{17}",
- "HR": "\\d{17}",
- "CY": "\\d{8}[\\dA-Z]{16}",
- "CZ": "\\d{20}",
- "DK": "\\d{14}",
- "DO": "[A-Z]{4}\\d{20}",
- "EE": "\\d{16}",
- "FO": "\\d{14}",
- "FI": "\\d{14}",
- "FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
- "GE": "[\\dA-Z]{2}\\d{16}",
- "DE": "\\d{18}",
- "GI": "[A-Z]{4}[\\dA-Z]{15}",
- "GR": "\\d{7}[\\dA-Z]{16}",
- "GL": "\\d{14}",
- "GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
- "HU": "\\d{24}",
- "IS": "\\d{22}",
- "IE": "[\\dA-Z]{4}\\d{14}",
- "IL": "\\d{19}",
- "IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
- "KZ": "\\d{3}[\\dA-Z]{13}",
- "KW": "[A-Z]{4}[\\dA-Z]{22}",
- "LV": "[A-Z]{4}[\\dA-Z]{13}",
- "LB": "\\d{4}[\\dA-Z]{20}",
- "LI": "\\d{5}[\\dA-Z]{12}",
- "LT": "\\d{16}",
- "LU": "\\d{3}[\\dA-Z]{13}",
- "MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
- "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
- "MR": "\\d{23}",
- "MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
- "MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
- "MD": "[\\dA-Z]{2}\\d{18}",
- "ME": "\\d{18}",
- "NL": "[A-Z]{4}\\d{10}",
- "NO": "\\d{11}",
- "PK": "[\\dA-Z]{4}\\d{16}",
- "PS": "[\\dA-Z]{4}\\d{21}",
- "PL": "\\d{24}",
- "PT": "\\d{21}",
- "RO": "[A-Z]{4}[\\dA-Z]{16}",
- "SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
- "SA": "\\d{2}[\\dA-Z]{18}",
- "RS": "\\d{18}",
- "SK": "\\d{20}",
- "SI": "\\d{15}",
- "ES": "\\d{20}",
- "SE": "\\d{20}",
- "CH": "\\d{5}[\\dA-Z]{12}",
- "TN": "\\d{20}",
- "TR": "\\d{5}[\\dA-Z]{17}",
- "AE": "\\d{3}\\d{16}",
- "GB": "[A-Z]{4}\\d{14}",
- "VG": "[\\dA-Z]{4}\\d{16}"
- };
-
- bbanpattern = bbancountrypatterns[ countrycode ];
-
- // As new countries will start using IBAN in the
- // future, we only check if the countrycode is known.
- // This prevents false negatives, while almost all
- // false positives introduced by this, will be caught
- // by the checksum validation below anyway.
- // Strict checking should return FALSE for unknown
- // countries.
- if ( typeof bbanpattern !== "undefined" ) {
- ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
- if ( !( ibanregexp.test( iban ) ) ) {
- return false; // Invalid country specific format
- }
- }
-
- // Now check the checksum, first convert to digits
- ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
- for ( i = 0; i < ibancheck.length; i++ ) {
- charAt = ibancheck.charAt( i );
- if ( charAt !== "0" ) {
- leadingZeroes = false;
- }
- if ( !leadingZeroes ) {
- ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt );
- }
- }
-
- // Calculate the result of: ibancheckdigits % 97
- for ( p = 0; p < ibancheckdigits.length; p++ ) {
- cChar = ibancheckdigits.charAt( p );
- cOperator = "" + cRest + "" + cChar;
- cRest = cOperator % 97;
- }
- return cRest === 1;
-}, "Please specify a valid IBAN." );
-
-$.validator.addMethod( "integer", function( value, element ) {
- return this.optional( element ) || /^-?\d+$/.test( value );
-}, "A positive or negative non-decimal number please." );
-
-$.validator.addMethod( "ipv4", function( value, element ) {
- return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value );
-}, "Please enter a valid IP v4 address." );
-
-$.validator.addMethod( "ipv6", function( value, element ) {
- return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
-}, "Please enter a valid IP v6 address." );
-
-$.validator.addMethod( "lessThan", function( value, element, param ) {
- var target = $( param );
-
- if ( this.settings.onfocusout && target.not( ".validate-lessThan-blur" ).length ) {
- target.addClass( "validate-lessThan-blur" ).on( "blur.validate-lessThan", function() {
- $( element ).valid();
- } );
- }
-
- return value < target.val();
-}, "Please enter a lesser value." );
-
-$.validator.addMethod( "lessThanEqual", function( value, element, param ) {
- var target = $( param );
-
- if ( this.settings.onfocusout && target.not( ".validate-lessThanEqual-blur" ).length ) {
- target.addClass( "validate-lessThanEqual-blur" ).on( "blur.validate-lessThanEqual", function() {
- $( element ).valid();
- } );
- }
-
- return value <= target.val();
-}, "Please enter a lesser value." );
-
-$.validator.addMethod( "lettersonly", function( value, element ) {
- return this.optional( element ) || /^[a-z]+$/i.test( value );
-}, "Letters only please." );
-
-$.validator.addMethod( "letterswithbasicpunc", function( value, element ) {
- return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value );
-}, "Letters or punctuation only please." );
-
-// Limit the number of files in a FileList.
-$.validator.addMethod( "maxfiles", function( value, element, param ) {
- if ( this.optional( element ) ) {
- return true;
- }
-
- if ( $( element ).attr( "type" ) === "file" ) {
- if ( element.files && element.files.length > param ) {
- return false;
- }
- }
-
- return true;
-}, $.validator.format( "Please select no more than {0} files." ) );
-
-// Limit the size of each individual file in a FileList.
-$.validator.addMethod( "maxsize", function( value, element, param ) {
- if ( this.optional( element ) ) {
- return true;
- }
-
- if ( $( element ).attr( "type" ) === "file" ) {
- if ( element.files && element.files.length ) {
- for ( var i = 0; i < element.files.length; i++ ) {
- if ( element.files[ i ].size > param ) {
- return false;
- }
- }
- }
- }
-
- return true;
-}, $.validator.format( "File size must not exceed {0} bytes each." ) );
-
-// Limit the size of all files in a FileList.
-$.validator.addMethod( "maxsizetotal", function( value, element, param ) {
- if ( this.optional( element ) ) {
- return true;
- }
-
- if ( $( element ).attr( "type" ) === "file" ) {
- if ( element.files && element.files.length ) {
- var totalSize = 0;
-
- for ( var i = 0; i < element.files.length; i++ ) {
- totalSize += element.files[ i ].size;
- if ( totalSize > param ) {
- return false;
- }
- }
- }
- }
-
- return true;
-}, $.validator.format( "Total size of all files must not exceed {0} bytes." ) );
-
-
-$.validator.addMethod( "mobileNL", function( value, element ) {
- return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
-}, "Please specify a valid mobile number." );
-
-$.validator.addMethod( "mobileRU", function( phone_number, element ) {
- var ruPhone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
- return this.optional( element ) || ruPhone_number.length > 9 && /^((\+7|7|8)+([0-9]){10})$/.test( ruPhone_number );
-}, "Please specify a valid mobile number." );
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-$.validator.addMethod( "mobileUK", function( phone_number, element ) {
- phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
- return this.optional( element ) || phone_number.length > 9 &&
- phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
-}, "Please specify a valid mobile number." );
-
-$.validator.addMethod( "netmask", function( value, element ) {
- return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value );
-}, "Please enter a valid netmask." );
-
-/*
- * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish
- * authorities to any foreigner.
- *
- * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal
- * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to
- * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.
- */
-$.validator.addMethod( "nieES", function( value, element ) {
- "use strict";
-
- if ( this.optional( element ) ) {
- return true;
- }
-
- var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );
- var validChars = "TRWAGMYFPDXBNJZSQVHLCKET",
- letter = value.substr( value.length - 1 ).toUpperCase(),
- number;
-
- value = value.toString().toUpperCase();
-
- // Quick format test
- if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {
- return false;
- }
-
- // X means same number
- // Y means number + 10000000
- // Z means number + 20000000
- value = value.replace( /^[X]/, "0" )
- .replace( /^[Y]/, "1" )
- .replace( /^[Z]/, "2" );
-
- number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );
-
- return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;
-
-}, "Please specify a valid NIE number." );
-
-/*
- * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
- */
-$.validator.addMethod( "nifES", function( value, element ) {
- "use strict";
-
- if ( this.optional( element ) ) {
- return true;
- }
-
- value = value.toUpperCase();
-
- // Basic format test
- if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
- return false;
- }
-
- // Test NIF
- if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
- return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
- }
-
- // Test specials NIF (starts with K, L or M)
- if ( /^[KLM]{1}/.test( value ) ) {
- return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) );
- }
-
- return false;
-
-}, "Please specify a valid NIF number." );
-
-/*
- * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies
- */
-$.validator.addMethod( "nipPL", function( value ) {
- "use strict";
-
- value = value.replace( /[^0-9]/g, "" );
-
- if ( value.length !== 10 ) {
- return false;
- }
-
- var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
- var intSum = 0;
- for ( var i = 0; i < 9; i++ ) {
- intSum += arrSteps[ i ] * value[ i ];
- }
- var int2 = intSum % 11;
- var intControlNr = ( int2 === 10 ) ? 0 : int2;
-
- return ( intControlNr === parseInt( value[ 9 ], 10 ) );
-}, "Please specify a valid NIP number." );
-
-/**
- * Created for project jquery-validation.
- * @Description Brazillian PIS or NIS number (Número de Identificação Social Pis ou Pasep) is the equivalent of a
- * Brazilian tax registration number NIS of PIS numbers have 11 digits in total: 10 numbers followed by 1 check numbers
- * that are being used for validation.
- * @copyright (c) 21/08/2018 13:14, Cleiton da Silva Mendonça
- * @author Cleiton da Silva Mendonça
- * @link http://gitlab.com/csmendonca Gitlab of Cleiton da Silva Mendonça
- * @link http://github.com/csmendonca Github of Cleiton da Silva Mendonça
- */
-$.validator.addMethod( "nisBR", function( value ) {
- var number;
- var cn;
- var sum = 0;
- var dv;
- var count;
- var multiplier;
-
- // Removing special characters from value
- value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
-
- // Checking value to have 11 digits only
- if ( value.length !== 11 ) {
- return false;
- }
-
- //Get check number of value
- cn = parseInt( value.substring( 10, 11 ), 10 );
-
- //Get number with 10 digits of the value
- number = parseInt( value.substring( 0, 10 ), 10 );
-
- for ( count = 2; count < 12; count++ ) {
- multiplier = count;
- if ( count === 10 ) {
- multiplier = 2;
- }
- if ( count === 11 ) {
- multiplier = 3;
- }
- sum += ( ( number % 10 ) * multiplier );
- number = parseInt( number / 10, 10 );
- }
- dv = ( sum % 11 );
-
- if ( dv > 1 ) {
- dv = ( 11 - dv );
- } else {
- dv = 0;
- }
-
- if ( cn === dv ) {
- return true;
- } else {
- return false;
- }
-}, "Please specify a valid NIS/PIS number." );
-
-$.validator.addMethod( "notEqualTo", function( value, element, param ) {
- return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
-}, "Please enter a different value, values must not be the same." );
-
-$.validator.addMethod( "nowhitespace", function( value, element ) {
- return this.optional( element ) || /^\S+$/i.test( value );
-}, "No white space please." );
-
-/**
-* Return true if the field value matches the given format RegExp
-*
-* @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/)
-* @result true
-*
-* @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/)
-* @result false
-*
-* @name $.validator.methods.pattern
-* @type Boolean
-* @cat Plugins/Validate/Methods
-*/
-$.validator.addMethod( "pattern", function( value, element, param ) {
- if ( this.optional( element ) ) {
- return true;
- }
- if ( typeof param === "string" ) {
- param = new RegExp( "^(?:" + param + ")$" );
- }
- return param.test( value );
-}, "Invalid format." );
-
-/**
- * Dutch phone numbers have 10 digits (or 11 and start with +31).
- */
-$.validator.addMethod( "phoneNL", function( value, element ) {
- return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
-}, "Please specify a valid phone number." );
-
-/**
- * Polish telephone numbers have 9 digits.
- *
- * Mobile phone numbers starts with following digits:
- * 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79, 88.
- *
- * Fixed-line numbers starts with area codes:
- * 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 29, 32, 33,
- * 34, 41, 42, 43, 44, 46, 48, 52, 54, 55, 56, 58, 59, 61,
- * 62, 63, 65, 67, 68, 71, 74, 75, 76, 77, 81, 82, 83, 84,
- * 85, 86, 87, 89, 91, 94, 95.
- *
- * Ministry of National Defence numbers and VoIP numbers starts with 26 and 39.
- *
- * Excludes intelligent networks (premium rate, shared cost, free phone numbers).
- *
- * Poland National Numbering Plan http://www.itu.int/oth/T02020000A8/en
- */
-$.validator.addMethod( "phonePL", function( phone_number, element ) {
- phone_number = phone_number.replace( /\s+/g, "" );
- var regexp = /^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;
- return this.optional( element ) || regexp.test( phone_number );
-}, "Please specify a valid phone number." );
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-
-// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
-$.validator.addMethod( "phonesUK", function( phone_number, element ) {
- phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
- return this.optional( element ) || phone_number.length > 9 &&
- phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
-}, "Please specify a valid uk phone number." );
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-$.validator.addMethod( "phoneUK", function( phone_number, element ) {
- phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
- return this.optional( element ) || phone_number.length > 9 &&
- phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ );
-}, "Please specify a valid phone number." );
-
-/**
- * Matches US phone number format
- *
- * where the area code may not start with 1 and the prefix may not start with 1
- * allows '-' or ' ' as a separator and allows parens around area code
- * some people may want to put a '1' in front of their number
- *
- * 1(212)-999-2345 or
- * 212 999 2344 or
- * 212-999-0983
- *
- * but not
- * 111-123-5434
- * and not
- * 212 123 4567
- */
-$.validator.addMethod( "phoneUS", function( phone_number, element ) {
- phone_number = phone_number.replace( /\s+/g, "" );
- return this.optional( element ) || phone_number.length > 9 &&
- phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/ );
-}, "Please specify a valid phone number." );
-
-/*
-* Valida CEPs do brasileiros:
-*
-* Formatos aceitos:
-* 99999-999
-* 99.999-999
-* 99999999
-*/
-$.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
- return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
-}, "Informe um CEP válido." );
-
-/**
- * Matches a valid Canadian Postal Code
- *
- * @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element )
- * @result true
- *
- * @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element )
- * @result false
- *
- * @name jQuery.validator.methods.postalCodeCA
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod( "postalCodeCA", function( value, element ) {
- return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
-}, "Please specify a valid postal code." );
-
-/* Matches Italian postcode (CAP) */
-$.validator.addMethod( "postalcodeIT", function( value, element ) {
- return this.optional( element ) || /^\d{5}$/.test( value );
-}, "Please specify a valid postal code." );
-
-$.validator.addMethod( "postalcodeNL", function( value, element ) {
- return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value );
-}, "Please specify a valid postal code." );
-
-// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
-$.validator.addMethod( "postcodeUK", function( value, element ) {
- return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value );
-}, "Please specify a valid UK postcode." );
-
-/*
- * Lets you say "at least X inputs that match selector Y must be filled."
- *
- * The end result is that neither of these inputs:
- *
- *
- *
- *
- * ...will validate unless at least one of them is filled.
- *
- * partnumber: {require_from_group: [1,".productinfo"]},
- * description: {require_from_group: [1,".productinfo"]}
- *
- * options[0]: number of fields that must be filled in the group
- * options[1]: CSS selector that defines the group of conditionally required fields
- */
-$.validator.addMethod( "require_from_group", function( value, element, options ) {
- var $fields = $( options[ 1 ], element.form ),
- $fieldsFirst = $fields.eq( 0 ),
- validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ),
- isValid = $fields.filter( function() {
- return validator.elementValue( this );
- } ).length >= options[ 0 ];
-
- // Store the cloned validator for future validation
- $fieldsFirst.data( "valid_req_grp", validator );
-
- // If element isn't being validated, run each require_from_group field's validation rules
- if ( !$( element ).data( "being_validated" ) ) {
- $fields.data( "being_validated", true );
- $fields.each( function() {
- validator.element( this );
- } );
- $fields.data( "being_validated", false );
- }
- return isValid;
-}, $.validator.format( "Please fill at least {0} of these fields." ) );
-
-/*
- * Lets you say "either at least X inputs that match selector Y must be filled,
- * OR they must all be skipped (left blank)."
- *
- * The end result, is that none of these inputs:
- *
- *
- *
- *
- *
- * ...will validate unless either at least two of them are filled,
- * OR none of them are.
- *
- * partnumber: {skip_or_fill_minimum: [2,".productinfo"]},
- * description: {skip_or_fill_minimum: [2,".productinfo"]},
- * color: {skip_or_fill_minimum: [2,".productinfo"]}
- *
- * options[0]: number of fields that must be filled in the group
- * options[1]: CSS selector that defines the group of conditionally required fields
- *
- */
-$.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) {
- var $fields = $( options[ 1 ], element.form ),
- $fieldsFirst = $fields.eq( 0 ),
- validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ),
- numberFilled = $fields.filter( function() {
- return validator.elementValue( this );
- } ).length,
- isValid = numberFilled === 0 || numberFilled >= options[ 0 ];
-
- // Store the cloned validator for future validation
- $fieldsFirst.data( "valid_skip", validator );
-
- // If element isn't being validated, run each skip_or_fill_minimum field's validation rules
- if ( !$( element ).data( "being_validated" ) ) {
- $fields.data( "being_validated", true );
- $fields.each( function() {
- validator.element( this );
- } );
- $fields.data( "being_validated", false );
- }
- return isValid;
-}, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) );
-
-/* Validates US States and/or Territories by @jdforsythe
- * Can be case insensitive or require capitalization - default is case insensitive
- * Can include US Territories or not - default does not
- * Can include US Military postal abbreviations (AA, AE, AP) - default does not
- *
- * Note: "States" always includes DC (District of Colombia)
- *
- * Usage examples:
- *
- * This is the default - case insensitive, no territories, no military zones
- * stateInput: {
- * caseSensitive: false,
- * includeTerritories: false,
- * includeMilitary: false
- * }
- *
- * Only allow capital letters, no territories, no military zones
- * stateInput: {
- * caseSensitive: false
- * }
- *
- * Case insensitive, include territories but not military zones
- * stateInput: {
- * includeTerritories: true
- * }
- *
- * Only allow capital letters, include territories and military zones
- * stateInput: {
- * caseSensitive: true,
- * includeTerritories: true,
- * includeMilitary: true
- * }
- *
- */
-$.validator.addMethod( "stateUS", function( value, element, options ) {
- var isDefault = typeof options === "undefined",
- caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
- includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
- includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
- regex;
-
- if ( !includeTerritories && !includeMilitary ) {
- regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
- } else if ( includeTerritories && includeMilitary ) {
- regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
- } else if ( includeTerritories ) {
- regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
- } else {
- regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
- }
-
- regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
- return this.optional( element ) || regex.test( value );
-}, "Please specify a valid state." );
-
-// TODO check if value starts with <, otherwise don't try stripping anything
-$.validator.addMethod( "strippedminlength", function( value, element, param ) {
- return $( value ).text().length >= param;
-}, $.validator.format( "Please enter at least {0} characters." ) );
-
-$.validator.addMethod( "time", function( value, element ) {
- return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
-}, "Please enter a valid time, between 00:00 and 23:59." );
-
-$.validator.addMethod( "time12h", function( value, element ) {
- return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
-}, "Please enter a valid time in 12-hour am/pm format." );
-
-// Same as url, but TLD is optional
-$.validator.addMethod( "url2", function( value, element ) {
- return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?)|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff])|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62}\.)))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
-}, $.validator.messages.url );
-
-/**
- * Return true, if the value is a valid vehicle identification number (VIN).
- *
- * Works with all kind of text inputs.
- *
- * @example
- * @desc Declares a required input element whose value must be a valid vehicle identification number.
- *
- * @name $.validator.methods.vinUS
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod( "vinUS", function( v ) {
- if ( v.length !== 17 ) {
- return false;
- }
-
- var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ],
- VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],
- FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],
- rs = 0,
- i, n, d, f, cd, cdv;
-
- for ( i = 0; i < 17; i++ ) {
- f = FL[ i ];
- d = v.slice( i, i + 1 );
- if ( i === 8 ) {
- cdv = d;
- }
- if ( !isNaN( d ) ) {
- d *= f;
- } else {
- for ( n = 0; n < LL.length; n++ ) {
- if ( d.toUpperCase() === LL[ n ] ) {
- d = VL[ n ];
- d *= f;
- if ( isNaN( cdv ) && n === 8 ) {
- cdv = LL[ n ];
- }
- break;
- }
- }
- }
- rs += d;
- }
- cd = rs % 11;
- if ( cd === 10 ) {
- cd = "X";
- }
- if ( cd === cdv ) {
- return true;
- }
- return false;
-}, "The specified vehicle identification number (VIN) is invalid." );
-
-$.validator.addMethod( "zipcodeUS", function( value, element ) {
- return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value );
-}, "The specified US ZIP Code is invalid." );
-
-$.validator.addMethod( "ziprange", function( value, element ) {
- return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
-}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx." );
-return $;
-}));
\ No newline at end of file
diff --git a/publish/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/publish/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
deleted file mode 100644
index 80f14b5..0000000
--- a/publish/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.19.5 - 7/1/2022
- * https://jqueryvalidation.org/
- * Copyright (c) 2022 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("abaRoutingNumber",function(a){var b=0,c=a.split(""),d=c.length;if(9!==d)return!1;for(var e=0;e9?"0":f,g="JABCDEFGHI".substr(f,1).toString(),i.match(/[ABEH]/)?k===f:i.match(/[KPQS]/)?k===g:k===f||k===g},"Please specify a valid CIF number."),a.validator.addMethod("cnhBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f,g,h=0,i=0;if(b=a.charAt(0),new Array(12).join(b)===a)return!1;for(e=0,f=9,g=0;e<9;++e,--f)h+=+(a.charAt(e)*f);for(c=h%11,c>=10&&(c=0,i=2),h=0,e=0,f=1,g=0;e<9;++e,++f)h+=+(a.charAt(e)*f);return d=h%11,d>=10?d=0:d-=i,String(c).concat(d)===a.substr(-2)},"Please specify a valid CNH number."),a.validator.addMethod("cnpjBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/[^\d]+/g,""),14!==a.length)return!1;if("00000000000000"===a||"11111111111111"===a||"22222222222222"===a||"33333333333333"===a||"44444444444444"===a||"55555555555555"===a||"66666666666666"===a||"77777777777777"===a||"88888888888888"===a||"99999999999999"===a)return!1;for(var c=a.length-2,d=a.substring(0,c),e=a.substring(c),f=0,g=c-7,h=c;h>=1;h--)f+=d.charAt(c-h)*g--,g<2&&(g=9);var i=f%11<2?0:11-f%11;if(i!==parseInt(e.charAt(0),10))return!1;c+=1,d=a.substring(0,c),f=0,g=c-7;for(var j=c;j>=1;j--)f+=d.charAt(c-j)*g--,g<2&&(g=9);return i=f%11<2?0:11-f%11,i===parseInt(e.charAt(1),10)},"Please specify a CNPJ value number."),a.validator.addMethod("cpfBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var c,d,e,f,g=0;if(c=parseInt(a.substring(9,10),10),d=parseInt(a.substring(10,11),10),e=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(f=1;f<=9;f++)g+=parseInt(a.substring(f-1,f),10)*(11-f);if(e(g,c)){for(g=0,f=1;f<=10;f++)g+=parseInt(a.substring(f-1,f),10)*(12-f);return e(g,d)}return!1},"Please specify a valid CPF number."),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&(/^(5[12345])/.test(a)||/^(2[234567])/.test(a))?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency."),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number."),a.validator.addMethod("greaterThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThan-blur").length&&e.addClass("validate-greaterThan-blur").on("blur.validate-greaterThan",function(){a(c).valid()}),b>e.val()},"Please enter a greater value."),a.validator.addMethod("greaterThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThanEqual-blur").length&&e.addClass("validate-greaterThanEqual-blur").on("blur.validate-greaterThanEqual",function(){a(c).valid()}),b>=e.val()},"Please enter a greater value."),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.lengthd)},a.validator.format("Please select no more than {0} files.")),a.validator.addMethod("maxsize",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0;ed)return!1;return!0},a.validator.format("File size must not exceed {0} bytes each.")),a.validator.addMethod("maxsizetotal",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0,f=0;fd)return!1;return!0},a.validator.format("Total size of all files must not exceed {0} bytes.")),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number."),a.validator.addMethod("mobileRU",function(a,b){var c=a.replace(/\(|\)|\s+|-/g,"");return this.optional(b)||c.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(c)},"Please specify a valid mobile number."),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number."),a.validator.addMethod("netmask",function(a,b){return this.optional(b)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(a)},"Please enter a valid netmask."),a.validator.addMethod("nieES",function(a,b){"use strict";if(this.optional(b))return!0;var c,d=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),e="TRWAGMYFPDXBNJZSQVHLCKET",f=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!d.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),c=9===a.length?a.substr(0,8):a.substr(0,9),e.charAt(parseInt(c,10)%23)===f)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a,b){"use strict";return!!this.optional(b)||(a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,1)%23)))},"Please specify a valid NIF number."),a.validator.addMethod("nipPL",function(a){"use strict";if(a=a.replace(/[^0-9]/g,""),10!==a.length)return!1;for(var b=[6,5,7,2,3,4,5,6,7],c=0,d=0;d<9;d++)c+=b[d]*a[d];var e=c%11,f=10===e?0:e;return f===parseInt(a[9],10)},"Please specify a valid NIP number."),a.validator.addMethod("nisBR",function(a){var b,c,d,e,f,g=0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;for(c=parseInt(a.substring(10,11),10),b=parseInt(a.substring(0,10),10),e=2;e<12;e++)f=e,10===e&&(f=2),11===e&&(f=3),g+=b%10*f,b=parseInt(b/10,10);return d=g%11,d=d>1?11-d:0,c===d},"Please specify a valid NIS/PIS number."),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please."),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonePL",function(a,b){a=a.replace(/\s+/g,"");var c=/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;return this.optional(b)||c.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number."),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number."),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code."),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode."),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state."),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters.")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59."),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format."),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?)|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff])|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62}\.)))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c " )
- .attr( "name", validator.submitButton.name )
- .val( $( validator.submitButton ).val() )
- .appendTo( validator.currentForm );
- }
-
- if ( validator.settings.submitHandler && !validator.settings.debug ) {
- result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
- if ( hidden ) {
-
- // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
- hidden.remove();
- }
- if ( result !== undefined ) {
- return result;
- }
- return false;
- }
- return true;
- }
-
- // Prevent submit for invalid forms or custom submit handlers
- if ( validator.cancelSubmit ) {
- validator.cancelSubmit = false;
- return handle();
- }
- if ( validator.form() ) {
- if ( validator.pendingRequest ) {
- validator.formSubmitted = true;
- return false;
- }
- return handle();
- } else {
- validator.focusInvalid();
- return false;
- }
- } );
- }
-
- return validator;
- },
-
- // https://jqueryvalidation.org/valid/
- valid: function() {
- var valid, validator, errorList;
-
- if ( $( this[ 0 ] ).is( "form" ) ) {
- valid = this.validate().form();
- } else {
- errorList = [];
- valid = true;
- validator = $( this[ 0 ].form ).validate();
- this.each( function() {
- valid = validator.element( this ) && valid;
- if ( !valid ) {
- errorList = errorList.concat( validator.errorList );
- }
- } );
- validator.errorList = errorList;
- }
- return valid;
- },
-
- // https://jqueryvalidation.org/rules/
- rules: function( command, argument ) {
- var element = this[ 0 ],
- isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
- settings, staticRules, existingRules, data, param, filtered;
-
- // If nothing is selected, return empty object; can't chain anyway
- if ( element == null ) {
- return;
- }
-
- if ( !element.form && isContentEditable ) {
- element.form = this.closest( "form" )[ 0 ];
- element.name = this.attr( "name" );
- }
-
- if ( element.form == null ) {
- return;
- }
-
- if ( command ) {
- settings = $.data( element.form, "validator" ).settings;
- staticRules = settings.rules;
- existingRules = $.validator.staticRules( element );
- switch ( command ) {
- case "add":
- $.extend( existingRules, $.validator.normalizeRule( argument ) );
-
- // Remove messages from rules, but allow them to be set separately
- delete existingRules.messages;
- staticRules[ element.name ] = existingRules;
- if ( argument.messages ) {
- settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
- }
- break;
- case "remove":
- if ( !argument ) {
- delete staticRules[ element.name ];
- return existingRules;
- }
- filtered = {};
- $.each( argument.split( /\s/ ), function( index, method ) {
- filtered[ method ] = existingRules[ method ];
- delete existingRules[ method ];
- } );
- return filtered;
- }
- }
-
- data = $.validator.normalizeRules(
- $.extend(
- {},
- $.validator.classRules( element ),
- $.validator.attributeRules( element ),
- $.validator.dataRules( element ),
- $.validator.staticRules( element )
- ), element );
-
- // Make sure required is at front
- if ( data.required ) {
- param = data.required;
- delete data.required;
- data = $.extend( { required: param }, data );
- }
-
- // Make sure remote is at back
- if ( data.remote ) {
- param = data.remote;
- delete data.remote;
- data = $.extend( data, { remote: param } );
- }
-
- return data;
- }
-} );
-
-// JQuery trim is deprecated, provide a trim method based on String.prototype.trim
-var trim = function( str ) {
-
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
- return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "" );
-};
-
-// Custom selectors
-$.extend( $.expr.pseudos || $.expr[ ":" ], { // '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
-
- // https://jqueryvalidation.org/blank-selector/
- blank: function( a ) {
- return !trim( "" + $( a ).val() );
- },
-
- // https://jqueryvalidation.org/filled-selector/
- filled: function( a ) {
- var val = $( a ).val();
- return val !== null && !!trim( "" + val );
- },
-
- // https://jqueryvalidation.org/unchecked-selector/
- unchecked: function( a ) {
- return !$( a ).prop( "checked" );
- }
-} );
-
-// Constructor for validator
-$.validator = function( options, form ) {
- this.settings = $.extend( true, {}, $.validator.defaults, options );
- this.currentForm = form;
- this.init();
-};
-
-// https://jqueryvalidation.org/jQuery.validator.format/
-$.validator.format = function( source, params ) {
- if ( arguments.length === 1 ) {
- return function() {
- var args = $.makeArray( arguments );
- args.unshift( source );
- return $.validator.format.apply( this, args );
- };
- }
- if ( params === undefined ) {
- return source;
- }
- if ( arguments.length > 2 && params.constructor !== Array ) {
- params = $.makeArray( arguments ).slice( 1 );
- }
- if ( params.constructor !== Array ) {
- params = [ params ];
- }
- $.each( params, function( i, n ) {
- source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
- return n;
- } );
- } );
- return source;
-};
-
-$.extend( $.validator, {
-
- defaults: {
- messages: {},
- groups: {},
- rules: {},
- errorClass: "error",
- pendingClass: "pending",
- validClass: "valid",
- errorElement: "label",
- focusCleanup: false,
- focusInvalid: true,
- errorContainer: $( [] ),
- errorLabelContainer: $( [] ),
- onsubmit: true,
- ignore: ":hidden",
- ignoreTitle: false,
- onfocusin: function( element ) {
- this.lastActive = element;
-
- // Hide error label and remove error class on focus if enabled
- if ( this.settings.focusCleanup ) {
- if ( this.settings.unhighlight ) {
- this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
- }
- this.hideThese( this.errorsFor( element ) );
- }
- },
- onfocusout: function( element ) {
- if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
- this.element( element );
- }
- },
- onkeyup: function( element, event ) {
-
- // Avoid revalidate the field when pressing one of the following keys
- // Shift => 16
- // Ctrl => 17
- // Alt => 18
- // Caps lock => 20
- // End => 35
- // Home => 36
- // Left arrow => 37
- // Up arrow => 38
- // Right arrow => 39
- // Down arrow => 40
- // Insert => 45
- // Num lock => 144
- // AltGr key => 225
- var excludedKeys = [
- 16, 17, 18, 20, 35, 36, 37,
- 38, 39, 40, 45, 144, 225
- ];
-
- if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
- return;
- } else if ( element.name in this.submitted || element.name in this.invalid ) {
- this.element( element );
- }
- },
- onclick: function( element ) {
-
- // Click on selects, radiobuttons and checkboxes
- if ( element.name in this.submitted ) {
- this.element( element );
-
- // Or option elements, check parent select in that case
- } else if ( element.parentNode.name in this.submitted ) {
- this.element( element.parentNode );
- }
- },
- highlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
- } else {
- $( element ).addClass( errorClass ).removeClass( validClass );
- }
- },
- unhighlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
- } else {
- $( element ).removeClass( errorClass ).addClass( validClass );
- }
- }
- },
-
- // https://jqueryvalidation.org/jQuery.validator.setDefaults/
- setDefaults: function( settings ) {
- $.extend( $.validator.defaults, settings );
- },
-
- messages: {
- required: "This field is required.",
- remote: "Please fix this field.",
- email: "Please enter a valid email address.",
- url: "Please enter a valid URL.",
- date: "Please enter a valid date.",
- dateISO: "Please enter a valid date (ISO).",
- number: "Please enter a valid number.",
- digits: "Please enter only digits.",
- equalTo: "Please enter the same value again.",
- maxlength: $.validator.format( "Please enter no more than {0} characters." ),
- minlength: $.validator.format( "Please enter at least {0} characters." ),
- rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
- range: $.validator.format( "Please enter a value between {0} and {1}." ),
- max: $.validator.format( "Please enter a value less than or equal to {0}." ),
- min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
- step: $.validator.format( "Please enter a multiple of {0}." )
- },
-
- autoCreateRanges: false,
-
- prototype: {
-
- init: function() {
- this.labelContainer = $( this.settings.errorLabelContainer );
- this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
- this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
- this.submitted = {};
- this.valueCache = {};
- this.pendingRequest = 0;
- this.pending = {};
- this.invalid = {};
- this.reset();
-
- var currentForm = this.currentForm,
- groups = ( this.groups = {} ),
- rules;
- $.each( this.settings.groups, function( key, value ) {
- if ( typeof value === "string" ) {
- value = value.split( /\s/ );
- }
- $.each( value, function( index, name ) {
- groups[ name ] = key;
- } );
- } );
- rules = this.settings.rules;
- $.each( rules, function( key, value ) {
- rules[ key ] = $.validator.normalizeRule( value );
- } );
-
- function delegate( event ) {
- var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
-
- // Set form expando on contenteditable
- if ( !this.form && isContentEditable ) {
- this.form = $( this ).closest( "form" )[ 0 ];
- this.name = $( this ).attr( "name" );
- }
-
- // Ignore the element if it belongs to another form. This will happen mainly
- // when setting the `form` attribute of an input to the id of another form.
- if ( currentForm !== this.form ) {
- return;
- }
-
- var validator = $.data( this.form, "validator" ),
- eventType = "on" + event.type.replace( /^validate/, "" ),
- settings = validator.settings;
- if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
- settings[ eventType ].call( validator, this, event );
- }
- }
-
- $( this.currentForm )
- .on( "focusin.validate focusout.validate keyup.validate",
- ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
- "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
- "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
- "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
-
- // Support: Chrome, oldIE
- // "select" is provided as event.target when clicking a option
- .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
-
- if ( this.settings.invalidHandler ) {
- $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
- }
- },
-
- // https://jqueryvalidation.org/Validator.form/
- form: function() {
- this.checkForm();
- $.extend( this.submitted, this.errorMap );
- this.invalid = $.extend( {}, this.errorMap );
- if ( !this.valid() ) {
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
- }
- this.showErrors();
- return this.valid();
- },
-
- checkForm: function() {
- this.prepareForm();
- for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
- this.check( elements[ i ] );
- }
- return this.valid();
- },
-
- // https://jqueryvalidation.org/Validator.element/
- element: function( element ) {
- var cleanElement = this.clean( element ),
- checkElement = this.validationTargetFor( cleanElement ),
- v = this,
- result = true,
- rs, group;
-
- if ( checkElement === undefined ) {
- delete this.invalid[ cleanElement.name ];
- } else {
- this.prepareElement( checkElement );
- this.currentElements = $( checkElement );
-
- // If this element is grouped, then validate all group elements already
- // containing a value
- group = this.groups[ checkElement.name ];
- if ( group ) {
- $.each( this.groups, function( name, testgroup ) {
- if ( testgroup === group && name !== checkElement.name ) {
- cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
- if ( cleanElement && cleanElement.name in v.invalid ) {
- v.currentElements.push( cleanElement );
- result = v.check( cleanElement ) && result;
- }
- }
- } );
- }
-
- rs = this.check( checkElement ) !== false;
- result = result && rs;
- if ( rs ) {
- this.invalid[ checkElement.name ] = false;
- } else {
- this.invalid[ checkElement.name ] = true;
- }
-
- if ( !this.numberOfInvalids() ) {
-
- // Hide error containers on last error
- this.toHide = this.toHide.add( this.containers );
- }
- this.showErrors();
-
- // Add aria-invalid status for screen readers
- $( element ).attr( "aria-invalid", !rs );
- }
-
- return result;
- },
-
- // https://jqueryvalidation.org/Validator.showErrors/
- showErrors: function( errors ) {
- if ( errors ) {
- var validator = this;
-
- // Add items to error list and map
- $.extend( this.errorMap, errors );
- this.errorList = $.map( this.errorMap, function( message, name ) {
- return {
- message: message,
- element: validator.findByName( name )[ 0 ]
- };
- } );
-
- // Remove items from success list
- this.successList = $.grep( this.successList, function( element ) {
- return !( element.name in errors );
- } );
- }
- if ( this.settings.showErrors ) {
- this.settings.showErrors.call( this, this.errorMap, this.errorList );
- } else {
- this.defaultShowErrors();
- }
- },
-
- // https://jqueryvalidation.org/Validator.resetForm/
- resetForm: function() {
- if ( $.fn.resetForm ) {
- $( this.currentForm ).resetForm();
- }
- this.invalid = {};
- this.submitted = {};
- this.prepareForm();
- this.hideErrors();
- var elements = this.elements()
- .removeData( "previousValue" )
- .removeAttr( "aria-invalid" );
-
- this.resetElements( elements );
- },
-
- resetElements: function( elements ) {
- var i;
-
- if ( this.settings.unhighlight ) {
- for ( i = 0; elements[ i ]; i++ ) {
- this.settings.unhighlight.call( this, elements[ i ],
- this.settings.errorClass, "" );
- this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
- }
- } else {
- elements
- .removeClass( this.settings.errorClass )
- .removeClass( this.settings.validClass );
- }
- },
-
- numberOfInvalids: function() {
- return this.objectLength( this.invalid );
- },
-
- objectLength: function( obj ) {
- /* jshint unused: false */
- var count = 0,
- i;
- for ( i in obj ) {
-
- // This check allows counting elements with empty error
- // message as invalid elements
- if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
- count++;
- }
- }
- return count;
- },
-
- hideErrors: function() {
- this.hideThese( this.toHide );
- },
-
- hideThese: function( errors ) {
- errors.not( this.containers ).text( "" );
- this.addWrapper( errors ).hide();
- },
-
- valid: function() {
- return this.size() === 0;
- },
-
- size: function() {
- return this.errorList.length;
- },
-
- focusInvalid: function() {
- if ( this.settings.focusInvalid ) {
- try {
- $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
- .filter( ":visible" )
- .trigger( "focus" )
-
- // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
- .trigger( "focusin" );
- } catch ( e ) {
-
- // Ignore IE throwing errors when focusing hidden elements
- }
- }
- },
-
- findLastActive: function() {
- var lastActive = this.lastActive;
- return lastActive && $.grep( this.errorList, function( n ) {
- return n.element.name === lastActive.name;
- } ).length === 1 && lastActive;
- },
-
- elements: function() {
- var validator = this,
- rulesCache = {};
-
- // Select all valid inputs inside the form (no submit or reset buttons)
- return $( this.currentForm )
- .find( "input, select, textarea, [contenteditable]" )
- .not( ":submit, :reset, :image, :disabled" )
- .not( this.settings.ignore )
- .filter( function() {
- var name = this.name || $( this ).attr( "name" ); // For contenteditable
- var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
-
- if ( !name && validator.settings.debug && window.console ) {
- console.error( "%o has no name assigned", this );
- }
-
- // Set form expando on contenteditable
- if ( isContentEditable ) {
- this.form = $( this ).closest( "form" )[ 0 ];
- this.name = name;
- }
-
- // Ignore elements that belong to other/nested forms
- if ( this.form !== validator.currentForm ) {
- return false;
- }
-
- // Select only the first element for each name, and only those with rules specified
- if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
- return false;
- }
-
- rulesCache[ name ] = true;
- return true;
- } );
- },
-
- clean: function( selector ) {
- return $( selector )[ 0 ];
- },
-
- errors: function() {
- var errorClass = this.settings.errorClass.split( " " ).join( "." );
- return $( this.settings.errorElement + "." + errorClass, this.errorContext );
- },
-
- resetInternals: function() {
- this.successList = [];
- this.errorList = [];
- this.errorMap = {};
- this.toShow = $( [] );
- this.toHide = $( [] );
- },
-
- reset: function() {
- this.resetInternals();
- this.currentElements = $( [] );
- },
-
- prepareForm: function() {
- this.reset();
- this.toHide = this.errors().add( this.containers );
- },
-
- prepareElement: function( element ) {
- this.reset();
- this.toHide = this.errorsFor( element );
- },
-
- elementValue: function( element ) {
- var $element = $( element ),
- type = element.type,
- isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
- val, idx;
-
- if ( type === "radio" || type === "checkbox" ) {
- return this.findByName( element.name ).filter( ":checked" ).val();
- } else if ( type === "number" && typeof element.validity !== "undefined" ) {
- return element.validity.badInput ? "NaN" : $element.val();
- }
-
- if ( isContentEditable ) {
- val = $element.text();
- } else {
- val = $element.val();
- }
-
- if ( type === "file" ) {
-
- // Modern browser (chrome & safari)
- if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
- return val.substr( 12 );
- }
-
- // Legacy browsers
- // Unix-based path
- idx = val.lastIndexOf( "/" );
- if ( idx >= 0 ) {
- return val.substr( idx + 1 );
- }
-
- // Windows-based path
- idx = val.lastIndexOf( "\\" );
- if ( idx >= 0 ) {
- return val.substr( idx + 1 );
- }
-
- // Just the file name
- return val;
- }
-
- if ( typeof val === "string" ) {
- return val.replace( /\r/g, "" );
- }
- return val;
- },
-
- check: function( element ) {
- element = this.validationTargetFor( this.clean( element ) );
-
- var rules = $( element ).rules(),
- rulesCount = $.map( rules, function( n, i ) {
- return i;
- } ).length,
- dependencyMismatch = false,
- val = this.elementValue( element ),
- result, method, rule, normalizer;
-
- // Prioritize the local normalizer defined for this element over the global one
- // if the former exists, otherwise user the global one in case it exists.
- if ( typeof rules.normalizer === "function" ) {
- normalizer = rules.normalizer;
- } else if ( typeof this.settings.normalizer === "function" ) {
- normalizer = this.settings.normalizer;
- }
-
- // If normalizer is defined, then call it to retreive the changed value instead
- // of using the real one.
- // Note that `this` in the normalizer is `element`.
- if ( normalizer ) {
- val = normalizer.call( element, val );
-
- // Delete the normalizer from rules to avoid treating it as a pre-defined method.
- delete rules.normalizer;
- }
-
- for ( method in rules ) {
- rule = { method: method, parameters: rules[ method ] };
- try {
- result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
-
- // If a method indicates that the field is optional and therefore valid,
- // don't mark it as valid when there are no other rules
- if ( result === "dependency-mismatch" && rulesCount === 1 ) {
- dependencyMismatch = true;
- continue;
- }
- dependencyMismatch = false;
-
- if ( result === "pending" ) {
- this.toHide = this.toHide.not( this.errorsFor( element ) );
- return;
- }
-
- if ( !result ) {
- this.formatAndAdd( element, rule );
- return false;
- }
- } catch ( e ) {
- if ( this.settings.debug && window.console ) {
- console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
- }
- if ( e instanceof TypeError ) {
- e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
- }
-
- throw e;
- }
- }
- if ( dependencyMismatch ) {
- return;
- }
- if ( this.objectLength( rules ) ) {
- this.successList.push( element );
- }
- return true;
- },
-
- // Return the custom message for the given element and validation method
- // specified in the element's HTML5 data attribute
- // return the generic message if present and no method specific message is present
- customDataMessage: function( element, method ) {
- return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
- method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
- },
-
- // Return the custom message for the given element name and validation method
- customMessage: function( name, method ) {
- var m = this.settings.messages[ name ];
- return m && ( m.constructor === String ? m : m[ method ] );
- },
-
- // Return the first defined argument, allowing empty strings
- findDefined: function() {
- for ( var i = 0; i < arguments.length; i++ ) {
- if ( arguments[ i ] !== undefined ) {
- return arguments[ i ];
- }
- }
- return undefined;
- },
-
- // The second parameter 'rule' used to be a string, and extended to an object literal
- // of the following form:
- // rule = {
- // method: "method name",
- // parameters: "the given method parameters"
- // }
- //
- // The old behavior still supported, kept to maintain backward compatibility with
- // old code, and will be removed in the next major release.
- defaultMessage: function( element, rule ) {
- if ( typeof rule === "string" ) {
- rule = { method: rule };
- }
-
- var message = this.findDefined(
- this.customMessage( element.name, rule.method ),
- this.customDataMessage( element, rule.method ),
-
- // 'title' is never undefined, so handle empty string as undefined
- !this.settings.ignoreTitle && element.title || undefined,
- $.validator.messages[ rule.method ],
- "Warning: No message defined for " + element.name + " "
- ),
- theregex = /\$?\{(\d+)\}/g;
- if ( typeof message === "function" ) {
- message = message.call( this, rule.parameters, element );
- } else if ( theregex.test( message ) ) {
- message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
- }
-
- return message;
- },
-
- formatAndAdd: function( element, rule ) {
- var message = this.defaultMessage( element, rule );
-
- this.errorList.push( {
- message: message,
- element: element,
- method: rule.method
- } );
-
- this.errorMap[ element.name ] = message;
- this.submitted[ element.name ] = message;
- },
-
- addWrapper: function( toToggle ) {
- if ( this.settings.wrapper ) {
- toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
- }
- return toToggle;
- },
-
- defaultShowErrors: function() {
- var i, elements, error;
- for ( i = 0; this.errorList[ i ]; i++ ) {
- error = this.errorList[ i ];
- if ( this.settings.highlight ) {
- this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
- }
- this.showLabel( error.element, error.message );
- }
- if ( this.errorList.length ) {
- this.toShow = this.toShow.add( this.containers );
- }
- if ( this.settings.success ) {
- for ( i = 0; this.successList[ i ]; i++ ) {
- this.showLabel( this.successList[ i ] );
- }
- }
- if ( this.settings.unhighlight ) {
- for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
- this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
- }
- }
- this.toHide = this.toHide.not( this.toShow );
- this.hideErrors();
- this.addWrapper( this.toShow ).show();
- },
-
- validElements: function() {
- return this.currentElements.not( this.invalidElements() );
- },
-
- invalidElements: function() {
- return $( this.errorList ).map( function() {
- return this.element;
- } );
- },
-
- showLabel: function( element, message ) {
- var place, group, errorID, v,
- error = this.errorsFor( element ),
- elementID = this.idOrName( element ),
- describedBy = $( element ).attr( "aria-describedby" );
-
- if ( error.length ) {
-
- // Refresh error/success class
- error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
-
- // Replace message on existing label
- error.html( message );
- } else {
-
- // Create error element
- error = $( "<" + this.settings.errorElement + ">" )
- .attr( "id", elementID + "-error" )
- .addClass( this.settings.errorClass )
- .html( message || "" );
-
- // Maintain reference to the element to be placed into the DOM
- place = error;
- if ( this.settings.wrapper ) {
-
- // Make sure the element is visible, even in IE
- // actually showing the wrapped element is handled elsewhere
- place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
- }
- if ( this.labelContainer.length ) {
- this.labelContainer.append( place );
- } else if ( this.settings.errorPlacement ) {
- this.settings.errorPlacement.call( this, place, $( element ) );
- } else {
- place.insertAfter( element );
- }
-
- // Link error back to the element
- if ( error.is( "label" ) ) {
-
- // If the error is a label, then associate using 'for'
- error.attr( "for", elementID );
-
- // If the element is not a child of an associated label, then it's necessary
- // to explicitly apply aria-describedby
- } else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
- errorID = error.attr( "id" );
-
- // Respect existing non-error aria-describedby
- if ( !describedBy ) {
- describedBy = errorID;
- } else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
-
- // Add to end of list if not already present
- describedBy += " " + errorID;
- }
- $( element ).attr( "aria-describedby", describedBy );
-
- // If this element is grouped, then assign to all elements in the same group
- group = this.groups[ element.name ];
- if ( group ) {
- v = this;
- $.each( v.groups, function( name, testgroup ) {
- if ( testgroup === group ) {
- $( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
- .attr( "aria-describedby", error.attr( "id" ) );
- }
- } );
- }
- }
- }
- if ( !message && this.settings.success ) {
- error.text( "" );
- if ( typeof this.settings.success === "string" ) {
- error.addClass( this.settings.success );
- } else {
- this.settings.success( error, element );
- }
- }
- this.toShow = this.toShow.add( error );
- },
-
- errorsFor: function( element ) {
- var name = this.escapeCssMeta( this.idOrName( element ) ),
- describer = $( element ).attr( "aria-describedby" ),
- selector = "label[for='" + name + "'], label[for='" + name + "'] *";
-
- // 'aria-describedby' should directly reference the error element
- if ( describer ) {
- selector = selector + ", #" + this.escapeCssMeta( describer )
- .replace( /\s+/g, ", #" );
- }
-
- return this
- .errors()
- .filter( selector );
- },
-
- // See https://api.jquery.com/category/selectors/, for CSS
- // meta-characters that should be escaped in order to be used with JQuery
- // as a literal part of a name/id or any selector.
- escapeCssMeta: function( string ) {
- if ( string === undefined ) {
- return "";
- }
-
- return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
- },
-
- idOrName: function( element ) {
- return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
- },
-
- validationTargetFor: function( element ) {
-
- // If radio/checkbox, validate first element in group instead
- if ( this.checkable( element ) ) {
- element = this.findByName( element.name );
- }
-
- // Always apply ignore filter
- return $( element ).not( this.settings.ignore )[ 0 ];
- },
-
- checkable: function( element ) {
- return ( /radio|checkbox/i ).test( element.type );
- },
-
- findByName: function( name ) {
- return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
- },
-
- getLength: function( value, element ) {
- switch ( element.nodeName.toLowerCase() ) {
- case "select":
- return $( "option:selected", element ).length;
- case "input":
- if ( this.checkable( element ) ) {
- return this.findByName( element.name ).filter( ":checked" ).length;
- }
- }
- return value.length;
- },
-
- depend: function( param, element ) {
- return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
- },
-
- dependTypes: {
- "boolean": function( param ) {
- return param;
- },
- "string": function( param, element ) {
- return !!$( param, element.form ).length;
- },
- "function": function( param, element ) {
- return param( element );
- }
- },
-
- optional: function( element ) {
- var val = this.elementValue( element );
- return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
- },
-
- startRequest: function( element ) {
- if ( !this.pending[ element.name ] ) {
- this.pendingRequest++;
- $( element ).addClass( this.settings.pendingClass );
- this.pending[ element.name ] = true;
- }
- },
-
- stopRequest: function( element, valid ) {
- this.pendingRequest--;
-
- // Sometimes synchronization fails, make sure pendingRequest is never < 0
- if ( this.pendingRequest < 0 ) {
- this.pendingRequest = 0;
- }
- delete this.pending[ element.name ];
- $( element ).removeClass( this.settings.pendingClass );
- if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {
- $( this.currentForm ).trigger( "submit" );
-
- // Remove the hidden input that was used as a replacement for the
- // missing submit button. The hidden input is added by `handle()`
- // to ensure that the value of the used submit button is passed on
- // for scripted submits triggered by this method
- if ( this.submitButton ) {
- $( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
- }
-
- this.formSubmitted = false;
- } else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
- this.formSubmitted = false;
- }
- },
-
- previousValue: function( element, method ) {
- method = typeof method === "string" && method || "remote";
-
- return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
- old: null,
- valid: true,
- message: this.defaultMessage( element, { method: method } )
- } );
- },
-
- // Cleans up all forms and elements, removes validator-specific events
- destroy: function() {
- this.resetForm();
-
- $( this.currentForm )
- .off( ".validate" )
- .removeData( "validator" )
- .find( ".validate-equalTo-blur" )
- .off( ".validate-equalTo" )
- .removeClass( "validate-equalTo-blur" )
- .find( ".validate-lessThan-blur" )
- .off( ".validate-lessThan" )
- .removeClass( "validate-lessThan-blur" )
- .find( ".validate-lessThanEqual-blur" )
- .off( ".validate-lessThanEqual" )
- .removeClass( "validate-lessThanEqual-blur" )
- .find( ".validate-greaterThanEqual-blur" )
- .off( ".validate-greaterThanEqual" )
- .removeClass( "validate-greaterThanEqual-blur" )
- .find( ".validate-greaterThan-blur" )
- .off( ".validate-greaterThan" )
- .removeClass( "validate-greaterThan-blur" );
- }
-
- },
-
- classRuleSettings: {
- required: { required: true },
- email: { email: true },
- url: { url: true },
- date: { date: true },
- dateISO: { dateISO: true },
- number: { number: true },
- digits: { digits: true },
- creditcard: { creditcard: true }
- },
-
- addClassRules: function( className, rules ) {
- if ( className.constructor === String ) {
- this.classRuleSettings[ className ] = rules;
- } else {
- $.extend( this.classRuleSettings, className );
- }
- },
-
- classRules: function( element ) {
- var rules = {},
- classes = $( element ).attr( "class" );
-
- if ( classes ) {
- $.each( classes.split( " " ), function() {
- if ( this in $.validator.classRuleSettings ) {
- $.extend( rules, $.validator.classRuleSettings[ this ] );
- }
- } );
- }
- return rules;
- },
-
- normalizeAttributeRule: function( rules, type, method, value ) {
-
- // Convert the value to a number for number inputs, and for text for backwards compability
- // allows type="date" and others to be compared as strings
- if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
- value = Number( value );
-
- // Support Opera Mini, which returns NaN for undefined minlength
- if ( isNaN( value ) ) {
- value = undefined;
- }
- }
-
- if ( value || value === 0 ) {
- rules[ method ] = value;
- } else if ( type === method && type !== "range" ) {
-
- // Exception: the jquery validate 'range' method
- // does not test for the html5 'range' type
- rules[ type === "date" ? "dateISO" : method ] = true;
- }
- },
-
- attributeRules: function( element ) {
- var rules = {},
- $element = $( element ),
- type = element.getAttribute( "type" ),
- method, value;
-
- for ( method in $.validator.methods ) {
-
- // Support for in both html5 and older browsers
- if ( method === "required" ) {
- value = element.getAttribute( method );
-
- // Some browsers return an empty string for the required attribute
- // and non-HTML5 browsers might have required="" markup
- if ( value === "" ) {
- value = true;
- }
-
- // Force non-HTML5 browsers to return bool
- value = !!value;
- } else {
- value = $element.attr( method );
- }
-
- this.normalizeAttributeRule( rules, type, method, value );
- }
-
- // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
- if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
- delete rules.maxlength;
- }
-
- return rules;
- },
-
- dataRules: function( element ) {
- var rules = {},
- $element = $( element ),
- type = element.getAttribute( "type" ),
- method, value;
-
- for ( method in $.validator.methods ) {
- value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
-
- // Cast empty attributes like `data-rule-required` to `true`
- if ( value === "" ) {
- value = true;
- }
-
- this.normalizeAttributeRule( rules, type, method, value );
- }
- return rules;
- },
-
- staticRules: function( element ) {
- var rules = {},
- validator = $.data( element.form, "validator" );
-
- if ( validator.settings.rules ) {
- rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
- }
- return rules;
- },
-
- normalizeRules: function( rules, element ) {
-
- // Handle dependency check
- $.each( rules, function( prop, val ) {
-
- // Ignore rule when param is explicitly false, eg. required:false
- if ( val === false ) {
- delete rules[ prop ];
- return;
- }
- if ( val.param || val.depends ) {
- var keepRule = true;
- switch ( typeof val.depends ) {
- case "string":
- keepRule = !!$( val.depends, element.form ).length;
- break;
- case "function":
- keepRule = val.depends.call( element, element );
- break;
- }
- if ( keepRule ) {
- rules[ prop ] = val.param !== undefined ? val.param : true;
- } else {
- $.data( element.form, "validator" ).resetElements( $( element ) );
- delete rules[ prop ];
- }
- }
- } );
-
- // Evaluate parameters
- $.each( rules, function( rule, parameter ) {
- rules[ rule ] = typeof parameter === "function" && rule !== "normalizer" ? parameter( element ) : parameter;
- } );
-
- // Clean number parameters
- $.each( [ "minlength", "maxlength" ], function() {
- if ( rules[ this ] ) {
- rules[ this ] = Number( rules[ this ] );
- }
- } );
- $.each( [ "rangelength", "range" ], function() {
- var parts;
- if ( rules[ this ] ) {
- if ( Array.isArray( rules[ this ] ) ) {
- rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
- } else if ( typeof rules[ this ] === "string" ) {
- parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
- rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
- }
- }
- } );
-
- if ( $.validator.autoCreateRanges ) {
-
- // Auto-create ranges
- if ( rules.min != null && rules.max != null ) {
- rules.range = [ rules.min, rules.max ];
- delete rules.min;
- delete rules.max;
- }
- if ( rules.minlength != null && rules.maxlength != null ) {
- rules.rangelength = [ rules.minlength, rules.maxlength ];
- delete rules.minlength;
- delete rules.maxlength;
- }
- }
-
- return rules;
- },
-
- // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
- normalizeRule: function( data ) {
- if ( typeof data === "string" ) {
- var transformed = {};
- $.each( data.split( /\s/ ), function() {
- transformed[ this ] = true;
- } );
- data = transformed;
- }
- return data;
- },
-
- // https://jqueryvalidation.org/jQuery.validator.addMethod/
- addMethod: function( name, method, message ) {
- $.validator.methods[ name ] = method;
- $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
- if ( method.length < 3 ) {
- $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
- }
- },
-
- // https://jqueryvalidation.org/jQuery.validator.methods/
- methods: {
-
- // https://jqueryvalidation.org/required-method/
- required: function( value, element, param ) {
-
- // Check if dependency is met
- if ( !this.depend( param, element ) ) {
- return "dependency-mismatch";
- }
- if ( element.nodeName.toLowerCase() === "select" ) {
-
- // Could be an array for select-multiple or a string, both are fine this way
- var val = $( element ).val();
- return val && val.length > 0;
- }
- if ( this.checkable( element ) ) {
- return this.getLength( value, element ) > 0;
- }
- return value !== undefined && value !== null && value.length > 0;
- },
-
- // https://jqueryvalidation.org/email-method/
- email: function( value, element ) {
-
- // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
- // Retrieved 2014-01-14
- // If you have a problem with this implementation, report a bug against the above spec
- // Or use custom methods to implement your own email validation
- return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
- },
-
- // https://jqueryvalidation.org/url-method/
- url: function( value, element ) {
-
- // Copyright (c) 2010-2013 Diego Perini, MIT licensed
- // https://gist.github.com/dperini/729294
- // see also https://mathiasbynens.be/demo/url-regex
- // modified to allow protocol-relative URLs
- return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
- },
-
- // https://jqueryvalidation.org/date-method/
- date: ( function() {
- var called = false;
-
- return function( value, element ) {
- if ( !called ) {
- called = true;
- if ( this.settings.debug && window.console ) {
- console.warn(
- "The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
- "Please don't use it, since it relies on the Date constructor, which\n" +
- "behaves very differently across browsers and locales. Use `dateISO`\n" +
- "instead or one of the locale specific methods in `localizations/`\n" +
- "and `additional-methods.js`."
- );
- }
- }
-
- return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
- };
- }() ),
-
- // https://jqueryvalidation.org/dateISO-method/
- dateISO: function( value, element ) {
- return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
- },
-
- // https://jqueryvalidation.org/number-method/
- number: function( value, element ) {
- return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
- },
-
- // https://jqueryvalidation.org/digits-method/
- digits: function( value, element ) {
- return this.optional( element ) || /^\d+$/.test( value );
- },
-
- // https://jqueryvalidation.org/minlength-method/
- minlength: function( value, element, param ) {
- var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || length >= param;
- },
-
- // https://jqueryvalidation.org/maxlength-method/
- maxlength: function( value, element, param ) {
- var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || length <= param;
- },
-
- // https://jqueryvalidation.org/rangelength-method/
- rangelength: function( value, element, param ) {
- var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
- },
-
- // https://jqueryvalidation.org/min-method/
- min: function( value, element, param ) {
- return this.optional( element ) || value >= param;
- },
-
- // https://jqueryvalidation.org/max-method/
- max: function( value, element, param ) {
- return this.optional( element ) || value <= param;
- },
-
- // https://jqueryvalidation.org/range-method/
- range: function( value, element, param ) {
- return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
- },
-
- // https://jqueryvalidation.org/step-method/
- step: function( value, element, param ) {
- var type = $( element ).attr( "type" ),
- errorMessage = "Step attribute on input type " + type + " is not supported.",
- supportedTypes = [ "text", "number", "range" ],
- re = new RegExp( "\\b" + type + "\\b" ),
- notSupported = type && !re.test( supportedTypes.join() ),
- decimalPlaces = function( num ) {
- var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
- if ( !match ) {
- return 0;
- }
-
- // Number of digits right of decimal point.
- return match[ 1 ] ? match[ 1 ].length : 0;
- },
- toInt = function( num ) {
- return Math.round( num * Math.pow( 10, decimals ) );
- },
- valid = true,
- decimals;
-
- // Works only for text, number and range input types
- // TODO find a way to support input types date, datetime, datetime-local, month, time and week
- if ( notSupported ) {
- throw new Error( errorMessage );
- }
-
- decimals = decimalPlaces( param );
-
- // Value can't have too many decimals
- if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
- valid = false;
- }
-
- return this.optional( element ) || valid;
- },
-
- // https://jqueryvalidation.org/equalTo-method/
- equalTo: function( value, element, param ) {
-
- // Bind to the blur event of the target in order to revalidate whenever the target field is updated
- var target = $( param );
- if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
- target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
- $( element ).valid();
- } );
- }
- return value === target.val();
- },
-
- // https://jqueryvalidation.org/remote-method/
- remote: function( value, element, param, method ) {
- if ( this.optional( element ) ) {
- return "dependency-mismatch";
- }
-
- method = typeof method === "string" && method || "remote";
-
- var previous = this.previousValue( element, method ),
- validator, data, optionDataString;
-
- if ( !this.settings.messages[ element.name ] ) {
- this.settings.messages[ element.name ] = {};
- }
- previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
- this.settings.messages[ element.name ][ method ] = previous.message;
-
- param = typeof param === "string" && { url: param } || param;
- optionDataString = $.param( $.extend( { data: value }, param.data ) );
- if ( previous.old === optionDataString ) {
- return previous.valid;
- }
-
- previous.old = optionDataString;
- validator = this;
- this.startRequest( element );
- data = {};
- data[ element.name ] = value;
- $.ajax( $.extend( true, {
- mode: "abort",
- port: "validate" + element.name,
- dataType: "json",
- data: data,
- context: validator.currentForm,
- success: function( response ) {
- var valid = response === true || response === "true",
- errors, message, submitted;
-
- validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
- if ( valid ) {
- submitted = validator.formSubmitted;
- validator.resetInternals();
- validator.toHide = validator.errorsFor( element );
- validator.formSubmitted = submitted;
- validator.successList.push( element );
- validator.invalid[ element.name ] = false;
- validator.showErrors();
- } else {
- errors = {};
- message = response || validator.defaultMessage( element, { method: method, parameters: value } );
- errors[ element.name ] = previous.message = message;
- validator.invalid[ element.name ] = true;
- validator.showErrors( errors );
- }
- previous.valid = valid;
- validator.stopRequest( element, valid );
- }
- }, param ) );
- return "pending";
- }
- }
-
-} );
-
-// Ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-
-var pendingRequests = {},
- ajax;
-
-// Use a prefilter if available (1.5+)
-if ( $.ajaxPrefilter ) {
- $.ajaxPrefilter( function( settings, _, xhr ) {
- var port = settings.port;
- if ( settings.mode === "abort" ) {
- if ( pendingRequests[ port ] ) {
- pendingRequests[ port ].abort();
- }
- pendingRequests[ port ] = xhr;
- }
- } );
-} else {
-
- // Proxy ajax
- ajax = $.ajax;
- $.ajax = function( settings ) {
- var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
- port = ( "port" in settings ? settings : $.ajaxSettings ).port;
- if ( mode === "abort" ) {
- if ( pendingRequests[ port ] ) {
- pendingRequests[ port ].abort();
- }
- pendingRequests[ port ] = ajax.apply( this, arguments );
- return pendingRequests[ port ];
- }
- return ajax.apply( this, arguments );
- };
-}
-return $;
-}));
\ No newline at end of file
diff --git a/publish/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/publish/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
deleted file mode 100644
index 442a413..0000000
--- a/publish/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.19.5 - 7/1/2022
- * https://jqueryvalidation.org/
- * Copyright (c) 2022 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a(" ").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a});
\ No newline at end of file
diff --git a/publish/wwwroot/lib/jquery/jquery.js b/publish/wwwroot/lib/jquery/jquery.js
deleted file mode 100644
index 1a86433..0000000
--- a/publish/wwwroot/lib/jquery/jquery.js
+++ /dev/null
@@ -1,10716 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.7.1
- * https://jquery.com/
- *
- * Copyright OpenJS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2023-08-28T13:37Z
- */
-( 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 trac-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 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.7.1",
-
- rhtmlSuffix = /HTML$/i,
-
- // 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;
- },
-
-
- // Retrieve the text value of an array of DOM nodes
- text: 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 += jQuery.text( node );
- }
- }
- if ( nodeType === 1 || nodeType === 11 ) {
- return elem.textContent;
- }
- if ( nodeType === 9 ) {
- return elem.documentElement.textContent;
- }
- if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
-
- // Do not include comment or processing instruction nodes
-
- return ret;
- },
-
- // 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 );
- },
-
- isXMLDoc: function( elem ) {
- var namespace = elem && elem.namespaceURI,
- docElem = elem && ( elem.ownerDocument || elem ).documentElement;
-
- // Assume HTML when documentElement doesn't yet exist, such as inside
- // document fragments.
- return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
- },
-
- // 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;
-}
-
-
-function nodeName( elem, name ) {
-
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-}
-var pop = arr.pop;
-
-
-var sort = arr.sort;
-
-
-var splice = arr.splice;
-
-
-var whitespace = "[\\x20\\t\\r\\n\\f]";
-
-
-var rtrimCSS = new RegExp(
- "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
- "g"
-);
-
-
-
-
-// Note: an element does not contain itself
-jQuery.contains = function( a, b ) {
- var bup = b && b.parentNode;
-
- return a === bup || !!( bup && bup.nodeType === 1 && (
-
- // Support: IE 9 - 11+
- // IE doesn't have `contains` on SVG.
- a.contains ?
- a.contains( bup ) :
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ) );
-};
-
-
-
-
-// CSS string/identifier serialization
-// https://drafts.csswg.org/cssom/#common-serializing-idioms
-var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
-
-function fcssescape( 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;
-}
-
-jQuery.escapeSelector = function( sel ) {
- return ( sel + "" ).replace( rcssescape, fcssescape );
-};
-
-
-
-
-var preferredDoc = document,
- pushNative = push;
-
-( function() {
-
-var i,
- Expr,
- outermostContext,
- sortInput,
- hasDuplicate,
- push = pushNative,
-
- // Local document vars
- document,
- documentElement,
- documentIsHTML,
- rbuggyQSA,
- matches,
-
- // Instance-specific data
- expando = jQuery.expando,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- nonnativeSelectorCache = createCache(),
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- }
- return 0;
- },
-
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
- "loop|multiple|open|readonly|required|scoped",
-
- // Regular expressions
-
- // 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: https://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" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rleadingCombinator = 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" )
- },
-
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rsibling = /[+~]/,
-
- // CSS escapes
- // https://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;
-
- if ( nonHex ) {
-
- // Strip the backslash prefix from a non-hex escape sequence
- return 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
- return high < 0 ?
- String.fromCharCode( high + 0x10000 ) :
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- },
-
- // Used for iframes; see `setDocument`.
- // Support: IE 9 - 11+, Edge 12 - 18+
- // Removing the function wrapper causes a "Permission Denied"
- // error in IE/Edge.
- unloadHandler = function() {
- setDocument();
- },
-
- inDisabledFieldset = addCombinator(
- function( elem ) {
- return elem.disabled === true && nodeName( elem, "fieldset" );
- },
- { dir: "parentNode", next: "legend" }
- );
-
-// Support: IE <=9 only
-// Accessing document.activeElement can throw unexpectedly
-// https://bugs.jquery.com/ticket/13393
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-// 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: function( target, els ) {
- pushNative.apply( target, slice.call( els ) );
- },
- call: function( target ) {
- pushNative.apply( target, slice.call( arguments, 1 ) );
- }
- };
-}
-
-function find( 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 9 only
- // getElementById can match elements by name instead of ID
- if ( elem.id === m ) {
- push.call( results, elem );
- return results;
- }
- } else {
- return results;
- }
-
- // Element context
- } else {
-
- // Support: IE 9 only
- // getElementById can match elements by name instead of ID
- if ( newContext && ( elem = newContext.getElementById( m ) ) &&
- find.contains( context, elem ) &&
- elem.id === m ) {
-
- push.call( results, elem );
- return results;
- }
- }
-
- // Type selector
- } else if ( match[ 2 ] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Class selector
- } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // Take advantage of querySelectorAll
- if ( !nonnativeSelectorCache[ selector + " " ] &&
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
-
- 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 ) || rleadingCombinator.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.
- // 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 ( newContext != context || !support.scope ) {
-
- // Capture the context ID, setting it first if necessary
- if ( ( nid = context.getAttribute( "id" ) ) ) {
- nid = jQuery.escapeSelector( nid );
- } 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( rtrimCSS, "$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 https://github.com/jquery/sizzle/issues/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 jQuery selector module
- * @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;
- }
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
- return function( elem ) {
- return nodeName( elem, "input" ) && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
- return function( elem ) {
- return ( nodeName( elem, "input" ) || nodeName( elem, "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
- 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 jQuery selector 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;
-}
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [node] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-function setDocument( node ) {
- var 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;
- documentElement = document.documentElement;
- documentIsHTML = !jQuery.isXMLDoc( document );
-
- // Support: iOS 7 only, IE 9 - 11+
- // Older browsers didn't support unprefixed `matches`.
- matches = documentElement.matches ||
- documentElement.webkitMatchesSelector ||
- documentElement.msMatchesSelector;
-
- // Support: IE 9 - 11+, Edge 12 - 18+
- // Accessing iframe documents after unload throws "permission denied" errors
- // (see trac-13936).
- // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
- // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
- if ( documentElement.msMatchesSelector &&
-
- // 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
- preferredDoc != document &&
- ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
-
- // Support: IE 9 - 11+, Edge 12 - 18+
- subWindow.addEventListener( "unload", unloadHandler );
- }
-
- // 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 ) {
- documentElement.appendChild( el ).id = jQuery.expando;
- return !document.getElementsByName ||
- !document.getElementsByName( jQuery.expando ).length;
- } );
-
- // Support: IE 9 only
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node.
- support.disconnectedMatch = assert( function( el ) {
- return matches.call( el, "*" );
- } );
-
- // Support: IE 9 - 11+, Edge 12 - 18+
- // IE/Edge don't support the :scope pseudo-class.
- support.scope = assert( function() {
- return document.querySelectorAll( ":scope" );
- } );
-
- // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
- // Make sure the `:has()` argument is parsed unforgivingly.
- // We include `*` in the test to detect buggy implementations that are
- // _selectively_ forgiving (specifically when the list includes at least
- // one valid selector).
- // Note that we treat complete lack of support for `:has()` as if it were
- // spec-compliant support, which is fine because use of `:has()` in such
- // environments will fail in the qSA path and fall back to jQuery traversal
- // anyway.
- support.cssHas = assert( function() {
- try {
- document.querySelector( ":has(*,:jqfake)" );
- return false;
- } catch ( e ) {
- return true;
- }
- } );
-
- // 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 = function( tag, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( tag );
-
- // DocumentFragment nodes don't have gEBTN
- } else {
- return context.querySelectorAll( tag );
- }
- };
-
- // Class
- Expr.find.CLASS = function( className, context ) {
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
- return context.getElementsByClassName( className );
- }
- };
-
- /* QSA/matchesSelector
- ---------------------------------------------------------------------- */
-
- // QSA and matchesSelector support
-
- rbuggyQSA = [];
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert( function( el ) {
-
- var input;
-
- documentElement.appendChild( el ).innerHTML =
- " " +
- "" +
- " ";
-
- // Support: iOS <=7 - 8 only
- // Boolean attributes and "value" are not treated correctly in some XML documents
- if ( !el.querySelectorAll( "[selected]" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Support: iOS <=7 - 8 only
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push( "~=" );
- }
-
- // Support: iOS 8 only
- // 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: Chrome <=105+, Firefox <=104+, Safari <=15.4+
- // In some of the document kinds, these selectors wouldn't work natively.
- // This is probably OK but for backwards compatibility we want to maintain
- // handling them through jQuery traversal in jQuery 3.x.
- if ( !el.querySelectorAll( ":checked" ).length ) {
- rbuggyQSA.push( ":checked" );
- }
-
- // Support: Windows 8 Native Apps
- // The type and name attributes are restricted during .innerHTML assignment
- input = document.createElement( "input" );
- input.setAttribute( "type", "hidden" );
- el.appendChild( input ).setAttribute( "name", "D" );
-
- // Support: IE 9 - 11+
- // IE's :disabled selector does not pick up the children of disabled fieldsets
- // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
- // In some of the document kinds, these selectors wouldn't work natively.
- // This is probably OK but for backwards compatibility we want to maintain
- // handling them through jQuery traversal in jQuery 3.x.
- documentElement.appendChild( el ).disabled = true;
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // 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 + "*(?:''|\"\")" );
- }
- } );
-
- if ( !support.cssHas ) {
-
- // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
- // Our regular `try-catch` mechanism fails to detect natively-unsupported
- // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
- // in browsers that parse the `:has()` argument as a forgiving selector list.
- // https://drafts.csswg.org/selectors/#relational now requires the argument
- // to be parsed unforgivingly, but browsers have not yet fully adjusted.
- rbuggyQSA.push( ":has" );
- }
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
-
- /* Sorting
- ---------------------------------------------------------------------- */
-
- // Document order sorting
- sortOrder = 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 &&
- find.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 &&
- find.contains( preferredDoc, b ) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- };
-
- return document;
-}
-
-find.matches = function( expr, elements ) {
- return find( expr, null, null, elements );
-};
-
-find.matchesSelector = function( elem, expr ) {
- setDocument( elem );
-
- if ( documentIsHTML &&
- !nonnativeSelectorCache[ 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 find( expr, document, null, [ elem ] ).length > 0;
-};
-
-find.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 jQuery.contains( context, elem );
-};
-
-
-find.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 (see trac-13807)
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, !documentIsHTML ) :
- undefined;
-
- if ( val !== undefined ) {
- return val;
- }
-
- return elem.getAttribute( name );
-};
-
-find.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-jQuery.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- // Unless we *know* we can detect duplicates, assume their presence
- //
- // Support: Android <=4.0+
- // Testing for detecting duplicates is unpredictable so instead assume we can't
- // depend on duplicate detection in all browsers without a stable sort.
- hasDuplicate = !support.sortStable;
- sortInput = !support.sortStable && slice.call( results, 0 );
- sort.call( results, sortOrder );
-
- if ( hasDuplicate ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- splice.call( results, duplicates[ j ], 1 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- return results;
-};
-
-jQuery.fn.uniqueSort = function() {
- return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
-};
-
-Expr = jQuery.expr = {
-
- // 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 ] ) {
- find.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 ] ) {
- find.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 expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
- return nodeNameSelector === "*" ?
- function() {
- return true;
- } :
- function( elem ) {
- return nodeName( elem, expectedNodeName );
- };
- },
-
- 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 = find.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- if ( operator === "=" ) {
- return result === check;
- }
- if ( operator === "!=" ) {
- return result !== check;
- }
- if ( operator === "^=" ) {
- return check && result.indexOf( check ) === 0;
- }
- if ( operator === "*=" ) {
- return check && result.indexOf( check ) > -1;
- }
- if ( operator === "$=" ) {
- return check && result.slice( -check.length ) === check;
- }
- if ( operator === "~=" ) {
- return ( " " + result.replace( rwhitespace, " " ) + " " )
- .indexOf( check ) > -1;
- }
- if ( operator === "|=" ) {
- return result === check || result.slice( 0, check.length + 1 ) === check + "-";
- }
-
- return false;
- };
- },
-
- 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, 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 ?
- nodeName( node, 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
- outerCache = parent[ expando ] || ( parent[ expando ] = {} );
- cache = outerCache[ 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 ) {
- outerCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- } else {
-
- // Use previously-cached element index if available
- if ( useCache ) {
- outerCache = elem[ expando ] || ( elem[ expando ] = {} );
- cache = outerCache[ 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 ?
- nodeName( node, name ) :
- node.nodeType === 1 ) &&
- ++diff ) {
-
- // Cache the index of each encountered element
- if ( useCache ) {
- outerCache = node[ expando ] ||
- ( node[ expando ] = {} );
- outerCache[ 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
- // https://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() ] ||
- find.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as jQuery 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.call( 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( rtrimCSS, "$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
- // (see https://github.com/jquery/sizzle/issues/299)
- input[ 0 ] = null;
- return !results.pop();
- };
- } ),
-
- has: markFunction( function( selector ) {
- return function( elem ) {
- return find( selector, elem ).length > 0;
- };
- } ),
-
- contains: markFunction( function( text ) {
- text = text.replace( runescape, funescape );
- return function( elem ) {
- return ( elem.textContent || jQuery.text( 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."
- // https://www.w3.org/TR/selectors/#lang-pseudo
- lang: markFunction( function( lang ) {
-
- // lang value must be a valid identifier
- if ( !ridentifier.test( lang || "" ) ) {
- find.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 === documentElement;
- },
-
- focus: function( elem ) {
- return elem === safeActiveElement() &&
- 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
- // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- return ( nodeName( elem, "input" ) && !!elem.checked ) ||
- ( nodeName( elem, "option" ) && !!elem.selected );
- },
-
- selected: function( elem ) {
-
- // Support: IE <=11+
- // Accessing the selectedIndex property
- // forces the browser to treat the default option as
- // selected when in an optgroup.
- if ( elem.parentNode ) {
- // eslint-disable-next-line no-unused-expressions
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- // Contents
- empty: function( elem ) {
-
- // https://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 ) {
- return nodeName( elem, "input" ) && elem.type === "button" ||
- nodeName( elem, "button" );
- },
-
- text: function( elem ) {
- var attr;
- return nodeName( elem, "input" ) && elem.type === "text" &&
-
- // Support: IE <10 only
- // 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;
-
- if ( argument < 0 ) {
- i = argument + length;
- } else if ( argument > length ) {
- i = length;
- } else {
- i = 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();
-
-function tokenize( 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 = rleadingCombinator.exec( soFar ) ) ) {
- matched = match.shift();
- tokens.push( {
- value: matched,
-
- // Cast descendant combinators to space
- type: match[ 0 ].replace( rtrimCSS, " " )
- } );
- 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
- if ( parseOnly ) {
- return soFar.length;
- }
-
- return soFar ?
- find.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, 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 ] = {} );
-
- if ( skip && nodeName( elem, skip ) ) {
- elem = elem[ dir ] || elem;
- } else if ( ( oldCache = outerCache[ 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
- outerCache[ 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++ ) {
- find( 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, matcherOut,
- 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;
-
- if ( matcher ) {
-
- // If we have a postFinder, or filtered seed, or non-seed postFilter
- // or preexisting results,
- matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results;
-
- // Find primary matches
- matcher( matcherIn, matcherOut, context, xml );
- } else {
- matcherOut = matcherIn;
- }
-
- // 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.call( 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.call( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
-
- // 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
- var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
- ( checkContext = context ).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
-
- // Avoid hanging onto element
- // (see https://github.com/jquery/sizzle/issues/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( rtrimCSS, "$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: iOS <=7 - 9 only
- // Tolerate NodeList properties (IE: "length"; Safari: ) matching
- // elements by id. (see trac-14142)
- 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 ) ) {
- push.call( results, 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 ) {
-
- jQuery.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-function compile( 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 jQuery's compiled
- * selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- * selector function built with jQuery selector compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-function select( 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
-
-// Support: Android <=4.0 - 4.1+
-// Sort stability
-support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Android <=4.0 - 4.1+
-// 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;
-} );
-
-jQuery.find = find;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.unique = jQuery.uniqueSort;
-
-// These have always been private, but they used to be documented as part of
-// Sizzle so let's maintain them for now for backwards compatibility purposes.
-find.compile = compile;
-find.select = select;
-find.setDocument = setDocument;
-find.tokenize = tokenize;
-
-find.escape = jQuery.escapeSelector;
-find.getText = jQuery.text;
-find.isXML = jQuery.isXMLDoc;
-find.selectors = jQuery.expr;
-find.support = jQuery.support;
-find.uniqueSort = jQuery.uniqueSort;
-
- /* eslint-enable */
-
-} )();
-
-
-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;
-
-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 to avoid XSS via location.hash (trac-9521)
- // Strict HTML recognition (trac-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 jQuery#find
- 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+
- // 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.error );
- }
-
- // 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 error, in case of exception
- // since it's otherwise lost when execution goes async
- if ( jQuery.Deferred.getErrorHook ) {
- process.error = jQuery.Deferred.getErrorHook();
-
- // The deprecated alias of the above. While the name suggests
- // returning the stack, not an error instance, jQuery just passes
- // it directly to `console.warn` so both will work; an instance
- // just better cooperates with source maps.
- } else if ( jQuery.Deferred.getStackHook ) {
- process.error = 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$/;
-
-// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
-// captured before the async barrier to get the original error cause
-// which may otherwise be hidden.
-jQuery.Deferred.exceptionHook = function( error, asyncError ) {
-
- // 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, asyncError );
- }
-};
-
-
-
-
-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 trac-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 (trac-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 trac-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 (trac-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 (trac-11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (trac-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 = "";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
- // Support: IE <=9 only
- // IE <=9 replaces tags with their contents when inserted outside of
- // the select element.
- div.innerHTML = " ";
- support.option = !!div.lastChild;
-} )();
-
-
-// We have to close these tags to support XHTML (trac-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 or other required elements.
- thead: [ 1, "" ],
- col: [ 2, "" ],
- tr: [ 2, "" ],
- td: [ 3, "" ],
-
- _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, "", " " ];
-}
-
-
-function getAll( context, tag ) {
-
- // Support: IE <=9 - 11 only
- // Use typeof to avoid zero-argument method invocation on host objects (trac-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 (trac-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;
-}
-
-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 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 (trac-13208)
- // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-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 (trac-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", true );
- }
-
- // 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, isSetup ) {
-
- // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
- if ( !isSetup ) {
- 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 result,
- saved = dataPriv.get( this, type );
-
- if ( ( event.isTrigger & 1 ) && this[ type ] ) {
-
- // Interrupt processing of the outer synthetic .trigger()ed event
- if ( !saved ) {
-
- // 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
- this[ type ]();
- result = dataPriv.get( this, type );
- dataPriv.set( this, type, false );
-
- if ( saved !== result ) {
-
- // Cancel the outer synthetic event
- event.stopImmediatePropagation();
- event.preventDefault();
-
- return result;
- }
-
- // 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 ) {
-
- // ...and capture the result
- dataPriv.set( this, type, jQuery.event.trigger(
- saved[ 0 ],
- saved.slice( 1 ),
- this
- ) );
-
- // Abort handling of the native event by all jQuery handlers while allowing
- // native handlers on the same element to run. On target, this is achieved
- // by stopping immediate propagation just on the jQuery event. However,
- // the native event is re-wrapped by a jQuery one on each level of the
- // propagation so the only way to stop it for jQuery is to stop it for
- // everyone via native `stopPropagation()`. This is not a problem for
- // focus/blur which don't bubble, but it does also stop click on checkboxes
- // and radios. We accept this limitation.
- event.stopPropagation();
- event.isImmediatePropagationStopped = returnTrue;
- }
- }
- } );
-}
-
-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 (trac-504, trac-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 ) {
-
- function focusMappedHandler( nativeEvent ) {
- if ( document.documentMode ) {
-
- // Support: IE 11+
- // Attach a single focusin/focusout handler on the document while someone wants
- // focus/blur. This is because the former are synchronous in IE while the latter
- // are async. In other browsers, all those handlers are invoked synchronously.
-
- // `handle` from private data would already wrap the event, but we need
- // to change the `type` here.
- var handle = dataPriv.get( this, "handle" ),
- event = jQuery.event.fix( nativeEvent );
- event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
- event.isSimulated = true;
-
- // First, handle focusin/focusout
- handle( nativeEvent );
-
- // ...then, handle focus/blur
- //
- // focus/blur don't bubble while focusin/focusout do; simulate the former by only
- // invoking the handler at the lower level.
- if ( event.target === event.currentTarget ) {
-
- // The setup part calls `leverageNative`, which, in turn, calls
- // `jQuery.event.add`, so event handle will already have been set
- // by this point.
- handle( event );
- }
- } else {
-
- // For non-IE browsers, attach a single capturing handler on the document
- // while someone wants focusin/focusout.
- jQuery.event.simulate( delegateType, nativeEvent.target,
- jQuery.event.fix( nativeEvent ) );
- }
- }
-
- jQuery.event.special[ type ] = {
-
- // Utilize native event if possible so blur/focus sequence is correct
- setup: function() {
-
- var attaches;
-
- // Claim the first handler
- // dataPriv.set( this, "focus", ... )
- // dataPriv.set( this, "blur", ... )
- leverageNative( this, type, true );
-
- if ( document.documentMode ) {
-
- // Support: IE 9 - 11+
- // We use the same native handler for focusin & focus (and focusout & blur)
- // so we need to coordinate setup & teardown parts between those events.
- // Use `delegateType` as the key as `type` is already used by `leverageNative`.
- attaches = dataPriv.get( this, delegateType );
- if ( !attaches ) {
- this.addEventListener( delegateType, focusMappedHandler );
- }
- dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
- } else {
-
- // 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;
- },
-
- teardown: function() {
- var attaches;
-
- if ( document.documentMode ) {
- attaches = dataPriv.get( this, delegateType ) - 1;
- if ( !attaches ) {
- this.removeEventListener( delegateType, focusMappedHandler );
- dataPriv.remove( this, delegateType );
- } else {
- dataPriv.set( this, delegateType, attaches );
- }
- } else {
-
- // Return false to indicate standard teardown should be applied
- return false;
- }
- },
-
- // Suppress native focus or blur if we're currently inside
- // a leveraged native-event stack
- _default: function( event ) {
- return dataPriv.get( event.target, type );
- },
-
- delegateType: delegateType
- };
-
- // 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
- //
- // Support: IE 9 - 11+
- // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
- // attach a single handler for both events in IE.
- jQuery.event.special[ delegateType ] = {
- setup: function() {
-
- // Handle: regular nodes (via `this.ownerDocument`), window
- // (via `this.document`) & document (via `this`).
- var doc = this.ownerDocument || this.document || this,
- dataHolder = document.documentMode ? this : doc,
- attaches = dataPriv.get( dataHolder, delegateType );
-
- // Support: IE 9 - 11+
- // We use the same native handler for focusin & focus (and focusout & blur)
- // so we need to coordinate setup & teardown parts between those events.
- // Use `delegateType` as the key as `type` is already used by `leverageNative`.
- if ( !attaches ) {
- if ( document.documentMode ) {
- this.addEventListener( delegateType, focusMappedHandler );
- } else {
- doc.addEventListener( type, focusMappedHandler, true );
- }
- }
- dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this.document || this,
- dataHolder = document.documentMode ? this : doc,
- attaches = dataPriv.get( dataHolder, delegateType ) - 1;
-
- if ( !attaches ) {
- if ( document.documentMode ) {
- this.removeEventListener( delegateType, focusMappedHandler );
- } else {
- doc.removeEventListener( type, focusMappedHandler, true );
- }
- dataPriv.remove( dataHolder, delegateType );
- } else {
- dataPriv.set( dataHolder, delegateType, attaches );
- }
- }
- };
-} );
-
-// 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 = /