diff --git a/Gruntfile.js b/Gruntfile.js index ab0152e..5bd72fe 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -230,23 +230,29 @@ module.exports = function (grunt) { fonts: { files: [ { - expand: true, + expand: false, src: [ - '<%= project.dev %>/node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-500-normal.woff*', - '<%= project.dev %>/node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-600-normal.woff*', - '<%= project.dev %>/node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-700-normal.woff*', - '<%= project.dev %>/node_modules/fontsource-raleway/files/raleway-latin-200-normal.woff*', - '<%= project.dev %>/node_modules/fontsource-raleway/files/raleway-latin-400-normal.woff*', - '<%= project.dev %>/node_modules/fontsource-raleway/files/raleway-latin-700-normal.woff*' + '<%= project.dev %>node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-500-normal.woff*', + '<%= project.dev %>node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-600-normal.woff*', + '<%= project.dev %>node_modules/fontsource-barlow-condensed/files/barlow-condensed-latin-700-normal.woff*', + '<%= project.dev %>node_modules/fontsource-raleway/files/raleway-latin-200-normal.woff*', + '<%= project.dev %>node_modules/fontsource-raleway/files/raleway-latin-400-normal.woff*', + '<%= project.dev %>node_modules/fontsource-raleway/files/raleway-latin-700-normal.woff*' ], flatten: true, - dest: '<%= project.out %><%= project.theme %>/src/fonts/' + dest: '<%= project.out %><%= project.theme %>src/fonts/' }, { - expand: true, + expand: false, src: 'bootstrap.bundle.min.js', - cwd: '<%= project.dev %>/build/js/', - dest: '<%= project.out %><%= project.theme %>/src/js/' + cwd: '<%= project.dev %>build/js/', + dest: '<%= project.out %><%= project.theme %>src/js/' + }, + { + expand: true, + cwd: '<%= project.dev %>node_modules/bootstrap/scss/', + src: '**', + dest: '<%= project.dev %>build/vendor/bootstrap/' } ] }, diff --git a/README.md b/README.md index e69de29..2d9ef47 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,14 @@ +# Moga Theme +moga is the new bootstrap 5 based OXID Theme + +## installation +Use composer to install theme + +```bash +composer require -n moga-kit/moga-theme:dev-master +``` + +or simply clone the repository + +## Usage +For development you will need npm installed https://nodejs.org/ and grunt for the built tasks https://gruntjs.com/ diff --git a/build/scss/vendor/_variables_ORGINAL.scss b/build/scss/_variables_ORGINAL.scss similarity index 100% rename from build/scss/vendor/_variables_ORGINAL.scss rename to build/scss/_variables_ORGINAL.scss diff --git a/build/scss/style-opt.scss b/build/scss/style-opt.scss index aad2d31..5ad9481 100644 --- a/build/scss/style-opt.scss +++ b/build/scss/style-opt.scss @@ -1,7 +1,50 @@ @import 'variables'; @import 'custom_variables'; @import 'custom_styles'; -@import 'vendor/bootstrap-opt'; + +//all bootstrap stuff you may need +// Configuration +@import "../vendor/bootstrap/functions"; +@import "../vendor/bootstrap/variables"; +@import "../vendor/bootstrap/mixins"; +@import "../vendor/bootstrap/utilities"; + +$theme-colors: map-remove($theme-colors, "info", "secondary", "warning"); +$table-variants: map-remove($table-variants, "success", "danger", "info", "dark", "secondary", "warning"); + +// Layout & components +@import "../vendor/bootstrap/root"; +@import "../vendor/bootstrap/reboot"; +@import "../vendor/bootstrap/type"; +@import "../vendor/bootstrap/images"; +@import "../vendor/bootstrap/containers"; +@import "../vendor/bootstrap/grid"; +@import "../vendor/bootstrap/tables"; +@import "../vendor/bootstrap/forms"; +@import "../vendor/bootstrap/buttons"; +@import "../vendor/bootstrap/transitions"; +@import "../vendor/bootstrap/dropdown"; +@import "../vendor/bootstrap/button-group"; +@import "../vendor/bootstrap/nav"; +@import "../vendor/bootstrap/navbar"; +@import "../vendor/bootstrap/card"; +@import "../vendor/bootstrap/accordion"; +@import "../vendor/bootstrap/breadcrumb"; +@import "../vendor/bootstrap/pagination"; +@import "../vendor/bootstrap/badge"; +@import "../vendor/bootstrap/alert"; +//@import "../vendor/bootstrap/progress"; +@import "../vendor/bootstrap/list-group"; +@import "../vendor/bootstrap/close"; +//@import "../vendor/bootstrap/toasts"; +@import "../vendor/bootstrap/modal"; +//@import "../vendor/bootstrap/tooltip"; +//@import "../vendor/bootstrap/popover"; +@import "../vendor/bootstrap/carousel"; +//@import "../vendor/bootstrap/spinners"; +//@import "../vendor/bootstrap/offcanvas"; +//@import "../vendor/bootstrap/placeholders"; + @import 'icons'; @import 'webfont'; diff --git a/build/scss/style.scss b/build/scss/style.scss index d54dbf8..66ecf60 100644 --- a/build/scss/style.scss +++ b/build/scss/style.scss @@ -1,7 +1,63 @@ @import 'variables'; @import 'custom_variables'; @import 'custom_styles'; -@import 'vendor/bootstrap'; + +//all bootstrap stuff you may need +/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ + +// scss-docs-start import-stack +// Configuration +@import "../vendor/bootstrap/functions"; +@import "../vendor/bootstrap/variables"; +@import "../vendor/bootstrap/mixins"; +@import "../vendor/bootstrap/utilities"; + +// Layout & components +@import "../vendor/bootstrap/root"; +@import "../vendor/bootstrap/reboot"; +@import "../vendor/bootstrap/type"; +@import "../vendor/bootstrap/images"; +@import "../vendor/bootstrap/containers"; +@import "../vendor/bootstrap/grid"; +@import "../vendor/bootstrap/tables"; +@import "../vendor/bootstrap/forms"; +@import "../vendor/bootstrap/buttons"; +@import "../vendor/bootstrap/transitions"; +@import "../vendor/bootstrap/dropdown"; +@import "../vendor/bootstrap/button-group"; +@import "../vendor/bootstrap/nav"; +@import "../vendor/bootstrap/navbar"; +@import "../vendor/bootstrap/card"; +@import "../vendor/bootstrap/accordion"; +@import "../vendor/bootstrap/breadcrumb"; +@import "../vendor/bootstrap/pagination"; +@import "../vendor/bootstrap/badge"; +@import "../vendor/bootstrap/alert"; +@import "../vendor/bootstrap/progress"; +@import "../vendor/bootstrap/list-group"; +@import "../vendor/bootstrap/close"; +@import "../vendor/bootstrap/toasts"; +@import "../vendor/bootstrap/modal"; +@import "../vendor/bootstrap/tooltip"; +@import "../vendor/bootstrap/popover"; +@import "../vendor/bootstrap/carousel"; +@import "../vendor/bootstrap/spinners"; +@import "../vendor/bootstrap/offcanvas"; +@import "../vendor/bootstrap/placeholders"; + +// Helpers +@import "../vendor/bootstrap/helpers"; + +// Utilities +@import "../vendor/bootstrap/utilities/api"; +// scss-docs-end import-stack + + @import 'icons'; @import 'webfont'; diff --git a/build/scss/vendor/_bootstrap.scss b/build/scss/vendor/_bootstrap.scss index 6be847d..9b717b0 100644 --- a/build/scss/vendor/_bootstrap.scss +++ b/build/scss/vendor/_bootstrap.scss @@ -1,5 +1,5 @@ /*! - * Bootstrap v5.0.0 (https://getbootstrap.com/) + * Bootstrap v5.1.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) @@ -7,47 +7,47 @@ // scss-docs-start import-stack // Configuration - -@import "../../vendor/bootstrap/scss/functions"; -@import "../../vendor/bootstrap/scss/variables"; -@import "../../vendor/bootstrap/scss/mixins"; -@import "../../vendor/bootstrap/scss/utilities"; +@import "../../vendor/bootstrap/functions"; +@import "../../vendor/bootstrap/variables"; +@import "../../vendor/bootstrap/mixins"; +@import "../../vendor/bootstrap/utilities"; // Layout & components -@import "../../vendor/bootstrap/scss/root"; -@import "../../vendor/bootstrap/scss/reboot"; -@import "../../vendor/bootstrap/scss/type"; -@import "../../vendor/bootstrap/scss/images"; -@import "../../vendor/bootstrap/scss/containers"; -@import "../../vendor/bootstrap/scss/grid"; -@import "../../vendor/bootstrap/scss/tables"; -@import "../../vendor/bootstrap/scss/forms"; -@import "../../vendor/bootstrap/scss/buttons"; -@import "../../vendor/bootstrap/scss/transitions"; -@import "../../vendor/bootstrap/scss/dropdown"; -@import "../../vendor/bootstrap/scss/button-group"; -@import "../../vendor/bootstrap/scss/nav"; -@import "../../vendor/bootstrap/scss/navbar"; -@import "../../vendor/bootstrap/scss/card"; -@import "../../vendor/bootstrap/scss/accordion"; -@import "../../vendor/bootstrap/scss/breadcrumb"; -@import "../../vendor/bootstrap/scss/pagination"; -@import "../../vendor/bootstrap/scss/badge"; -@import "../../vendor/bootstrap/scss/alert"; -@import "../../vendor/bootstrap/scss/progress"; -@import "../../vendor/bootstrap/scss/list-group"; -@import "../../vendor/bootstrap/scss/close"; -@import "../../vendor/bootstrap/scss/toasts"; -@import "../../vendor/bootstrap/scss/modal"; -@import "../../vendor/bootstrap/scss/tooltip"; -@import "../../vendor/bootstrap/scss/popover"; -@import "../../vendor/bootstrap/scss/carousel"; -@import "../../vendor/bootstrap/scss/spinners"; -@import "../../vendor/bootstrap/scss/offcanvas"; +@import "../../vendor/bootstrap/root"; +@import "../../vendor/bootstrap/reboot"; +@import "../../vendor/bootstrap/type"; +@import "../../vendor/bootstrap/images"; +@import "../../vendor/bootstrap/containers"; +@import "../../vendor/bootstrap/grid"; +@import "../../vendor/bootstrap/tables"; +@import "../../vendor/bootstrap/forms"; +@import "../../vendor/bootstrap/buttons"; +@import "../../vendor/bootstrap/transitions"; +@import "../../vendor/bootstrap/dropdown"; +@import "../../vendor/bootstrap/button-group"; +@import "../../vendor/bootstrap/nav"; +@import "../../vendor/bootstrap/navbar"; +@import "../../vendor/bootstrap/card"; +@import "../../vendor/bootstrap/accordion"; +@import "../../vendor/bootstrap/breadcrumb"; +@import "../../vendor/bootstrap/pagination"; +@import "../../vendor/bootstrap/badge"; +@import "../../vendor/bootstrap/alert"; +@import "../../vendor/bootstrap/progress"; +@import "../../vendor/bootstrap/list-group"; +@import "../../vendor/bootstrap/close"; +@import "../../vendor/bootstrap/toasts"; +@import "../../vendor/bootstrap/modal"; +@import "../../vendor/bootstrap/tooltip"; +@import "../../vendor/bootstrap/popover"; +@import "../../vendor/bootstrap/carousel"; +@import "../../vendor/bootstrap/spinners"; +@import "../../vendor/bootstrap/offcanvas"; +@import "../../vendor/bootstrap/placeholders"; // Helpers -@import "../../vendor/bootstrap/scss/helpers"; +@import "../../vendor/bootstrap/helpers"; // Utilities -@import "../../vendor/bootstrap/scss/utilities/api"; +@import "../../vendor/bootstrap/utilities/api"; // scss-docs-end import-stack diff --git a/build/vendor/bootstrap/LICENSE b/build/vendor/bootstrap/LICENSE deleted file mode 100644 index 72dda23..0000000 --- a/build/vendor/bootstrap/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011-2021 Twitter, Inc. -Copyright (c) 2011-2021 The Bootstrap Authors - -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/build/vendor/bootstrap/README.md b/build/vendor/bootstrap/README.md deleted file mode 100644 index 789aeb9..0000000 --- a/build/vendor/bootstrap/README.md +++ /dev/null @@ -1,239 +0,0 @@ -

- - Bootstrap logo - -

- -

Bootstrap

- -

- Sleek, intuitive, and powerful front-end framework for faster and easier web development. -
- Explore Bootstrap docs » -
-
- Report bug - · - Request feature - · - Themes - · - Blog -

- - -## Bootstrap 4 - -Our default branch is for development of our upcoming Bootstrap 5 release. Head to the [`v4-dev` branch](https://github.com/twbs/bootstrap/tree/v4-dev) to view the readme, documentation, and source code for Bootstrap 4. - - -## Table of contents - -- [Quick start](#quick-start) -- [Status](#status) -- [What's included](#whats-included) -- [Bugs and feature requests](#bugs-and-feature-requests) -- [Documentation](#documentation) -- [Contributing](#contributing) -- [Community](#community) -- [Versioning](#versioning) -- [Creators](#creators) -- [Thanks](#thanks) -- [Copyright and license](#copyright-and-license) - - -## Quick start - -Several quick start options are available: - -- [Download the latest release](https://github.com/twbs/bootstrap/archive/v5.0.0.zip) -- Clone the repo: `git clone https://github.com/twbs/bootstrap.git` -- Install with [npm](https://www.npmjs.com/): `npm install bootstrap` -- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap` -- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:5.0.0` -- Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass` - -Read the [Getting started page](https://getbootstrap.com/docs/5.0/getting-started/introduction/) for information on the framework contents, templates and examples, and more. - - -## Status - -[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com/) -[![Build Status](https://img.shields.io/github/workflow/status/twbs/bootstrap/JS%20Tests/main?label=JS%20Tests&logo=github)](https://github.com/twbs/bootstrap/actions?query=workflow%3AJS+Tests+branch%3Amain) -[![npm version](https://img.shields.io/npm/v/bootstrap)](https://www.npmjs.com/package/bootstrap) -[![Gem version](https://img.shields.io/gem/v/bootstrap)](https://rubygems.org/gems/bootstrap) -[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue)](https://atmospherejs.com/twbs/bootstrap) -[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap)](https://packagist.org/packages/twbs/bootstrap) -[![NuGet](https://img.shields.io/nuget/vpre/bootstrap)](https://www.nuget.org/packages/bootstrap/absoluteLatest) -[![peerDependencies Status](https://img.shields.io/david/peer/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=peer) -[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap)](https://david-dm.org/twbs/bootstrap?type=dev) -[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/main)](https://coveralls.io/github/twbs/bootstrap?branch=main) -[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css) -[![CSS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=brotli&label=CSS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css) -[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js) -[![JS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=brotli&label=JS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js) -[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)](https://www.browserstack.com/automate/public-build/SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229) -[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap)](#backers) -[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap)](#sponsors) - - -## What's included - -Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: - -```text -bootstrap/ -├── css/ -│ ├── bootstrap-grid.css -│ ├── bootstrap-grid.css.map -│ ├── bootstrap-grid.min.css -│ ├── bootstrap-grid.min.css.map -│ ├── bootstrap-grid.rtl.css -│ ├── bootstrap-grid.rtl.css.map -│ ├── bootstrap-grid.rtl.min.css -│ ├── bootstrap-grid.rtl.min.css.map -│ ├── bootstrap-reboot.css -│ ├── bootstrap-reboot.css.map -│ ├── bootstrap-reboot.min.css -│ ├── bootstrap-reboot.min.css.map -│ ├── bootstrap-reboot.rtl.css -│ ├── bootstrap-reboot.rtl.css.map -│ ├── bootstrap-reboot.rtl.min.css -│ ├── bootstrap-reboot.rtl.min.css.map -│ ├── bootstrap-utilities.css -│ ├── bootstrap-utilities.css.map -│ ├── bootstrap-utilities.min.css -│ ├── bootstrap-utilities.min.css.map -│ ├── bootstrap-utilities.rtl.css -│ ├── bootstrap-utilities.rtl.css.map -│ ├── bootstrap-utilities.rtl.min.css -│ ├── bootstrap-utilities.rtl.min.css.map -│ ├── bootstrap.css -│ ├── bootstrap.css.map -│ ├── bootstrap.min.css -│ ├── bootstrap.min.css.map -│ ├── bootstrap.rtl.css -│ ├── bootstrap.rtl.css.map -│ ├── bootstrap.rtl.min.css -│ └── bootstrap.rtl.min.css.map -└── js/ - ├── bootstrap.bundle.js - ├── bootstrap.bundle.js.map - ├── bootstrap.bundle.min.js - ├── bootstrap.bundle.min.js.map - ├── bootstrap.esm.js - ├── bootstrap.esm.js.map - ├── bootstrap.esm.min.js - ├── bootstrap.esm.min.js.map - ├── bootstrap.js - ├── bootstrap.js.map - ├── bootstrap.min.js - └── bootstrap.min.js.map -``` - -We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [source maps](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/). - - -## Bugs and feature requests - -Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). - - -## Documentation - -Bootstrap's documentation, included in this repo in the root directory, is built with [Hugo](https://gohugo.io/) and publicly hosted on GitHub Pages at . The docs may also be run locally. - -Documentation search is powered by [Algolia's DocSearch](https://community.algolia.com/docsearch/). Working on our search? Be sure to set `debug: true` in `site/assets/js/search.js`. - -### Running documentation locally - -1. Run `npm install` to install the Node.js dependencies, including Hugo (the site builder). -2. Run `npm run test` (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets. -3. From the root `/bootstrap` directory, run `npm run docs-serve` in the command line. -4. Open `http://localhost:9001/` in your browser, and voilà. - -Learn more about using Hugo by reading its [documentation](https://gohugo.io/documentation/). - -### Documentation for previous releases - -You can find all our previous releases docs on . - -[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. - - -## Contributing - -Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. - -Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/main/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo). - -Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/main/.editorconfig) for easy use in common text editors. Read more and download plugins at . - - -## Community - -Get updates on Bootstrap's development and chat with the project maintainers and community members. - -- Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). -- Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com/). -- Join [the official Slack room](https://bootstrap-slack.herokuapp.com/). -- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel. -- Implementation help may be found at Stack Overflow (tagged [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5)). -- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. - - -## Versioning - -For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we adhere to those rules whenever possible. - -See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com/) contain summaries of the most noteworthy changes made in each release. - - -## Creators - -**Mark Otto** - -- -- - -**Jacob Thornton** - -- -- - - -## Thanks - - - BrowserStack Logo - - -Thanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers! - - -## Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bootstrap#sponsor)] - -[![OC sponsor 0](https://opencollective.com/bootstrap/sponsor/0/avatar.svg)](https://opencollective.com/bootstrap/sponsor/0/website) -[![OC sponsor 1](https://opencollective.com/bootstrap/sponsor/1/avatar.svg)](https://opencollective.com/bootstrap/sponsor/1/website) -[![OC sponsor 2](https://opencollective.com/bootstrap/sponsor/2/avatar.svg)](https://opencollective.com/bootstrap/sponsor/2/website) -[![OC sponsor 3](https://opencollective.com/bootstrap/sponsor/3/avatar.svg)](https://opencollective.com/bootstrap/sponsor/3/website) -[![OC sponsor 4](https://opencollective.com/bootstrap/sponsor/4/avatar.svg)](https://opencollective.com/bootstrap/sponsor/4/website) -[![OC sponsor 5](https://opencollective.com/bootstrap/sponsor/5/avatar.svg)](https://opencollective.com/bootstrap/sponsor/5/website) -[![OC sponsor 6](https://opencollective.com/bootstrap/sponsor/6/avatar.svg)](https://opencollective.com/bootstrap/sponsor/6/website) -[![OC sponsor 7](https://opencollective.com/bootstrap/sponsor/7/avatar.svg)](https://opencollective.com/bootstrap/sponsor/7/website) -[![OC sponsor 8](https://opencollective.com/bootstrap/sponsor/8/avatar.svg)](https://opencollective.com/bootstrap/sponsor/8/website) -[![OC sponsor 9](https://opencollective.com/bootstrap/sponsor/9/avatar.svg)](https://opencollective.com/bootstrap/sponsor/9/website) - - -## Backers - -Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)] - -[![Backers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers) - - -## Copyright and license - -Code and documentation copyright 2011–2021 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/build/vendor/bootstrap/scss/_accordion.scss b/build/vendor/bootstrap/_accordion.scss similarity index 100% rename from build/vendor/bootstrap/scss/_accordion.scss rename to build/vendor/bootstrap/_accordion.scss diff --git a/build/vendor/bootstrap/scss/_alert.scss b/build/vendor/bootstrap/_alert.scss similarity index 100% rename from build/vendor/bootstrap/scss/_alert.scss rename to build/vendor/bootstrap/_alert.scss diff --git a/build/vendor/bootstrap/scss/_badge.scss b/build/vendor/bootstrap/_badge.scss similarity index 100% rename from build/vendor/bootstrap/scss/_badge.scss rename to build/vendor/bootstrap/_badge.scss diff --git a/build/vendor/bootstrap/scss/_breadcrumb.scss b/build/vendor/bootstrap/_breadcrumb.scss similarity index 100% rename from build/vendor/bootstrap/scss/_breadcrumb.scss rename to build/vendor/bootstrap/_breadcrumb.scss diff --git a/build/vendor/bootstrap/scss/_button-group.scss b/build/vendor/bootstrap/_button-group.scss similarity index 100% rename from build/vendor/bootstrap/scss/_button-group.scss rename to build/vendor/bootstrap/_button-group.scss diff --git a/build/vendor/bootstrap/scss/_buttons.scss b/build/vendor/bootstrap/_buttons.scss similarity index 100% rename from build/vendor/bootstrap/scss/_buttons.scss rename to build/vendor/bootstrap/_buttons.scss diff --git a/build/vendor/bootstrap/scss/_card.scss b/build/vendor/bootstrap/_card.scss similarity index 93% rename from build/vendor/bootstrap/scss/_card.scss rename to build/vendor/bootstrap/_card.scss index e331421..22890f5 100644 --- a/build/vendor/bootstrap/scss/_card.scss +++ b/build/vendor/bootstrap/_card.scss @@ -13,6 +13,7 @@ background-clip: border-box; border: $card-border-width solid $card-border-color; @include border-radius($card-border-radius); + @include box-shadow($card-box-shadow); > hr { margin-right: 0; @@ -55,7 +56,7 @@ } .card-subtitle { - margin-top: -$card-title-spacer-y / 2; + margin-top: -$card-title-spacer-y * .5; margin-bottom: 0; } @@ -65,7 +66,7 @@ .card-link { &:hover { - text-decoration: none; + text-decoration: if($link-hover-decoration == underline, none, null); } + .card-link { @@ -106,9 +107,9 @@ // .card-header-tabs { - margin-right: -$card-cap-padding-x / 2; + margin-right: -$card-cap-padding-x * .5; margin-bottom: -$card-cap-padding-y; - margin-left: -$card-cap-padding-x / 2; + margin-left: -$card-cap-padding-x * .5; border-bottom: 0; @if $nav-tabs-link-active-bg != $card-bg { @@ -120,8 +121,8 @@ } .card-header-pills { - margin-right: -$card-cap-padding-x / 2; - margin-left: -$card-cap-padding-x / 2; + margin-right: -$card-cap-padding-x * .5; + margin-left: -$card-cap-padding-x * .5; } // Card image diff --git a/build/vendor/bootstrap/scss/_carousel.scss b/build/vendor/bootstrap/_carousel.scss similarity index 98% rename from build/vendor/bootstrap/scss/_carousel.scss rename to build/vendor/bootstrap/_carousel.scss index d389c30..3d8fb15 100644 --- a/build/vendor/bootstrap/scss/_carousel.scss +++ b/build/vendor/bootstrap/_carousel.scss @@ -202,9 +202,9 @@ .carousel-caption { position: absolute; - right: (100% - $carousel-caption-width) / 2; + right: (100% - $carousel-caption-width) * .5; bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) / 2; + left: (100% - $carousel-caption-width) * .5; padding-top: $carousel-caption-padding-y; padding-bottom: $carousel-caption-padding-y; color: $carousel-caption-color; diff --git a/build/vendor/bootstrap/scss/_close.scss b/build/vendor/bootstrap/_close.scss similarity index 100% rename from build/vendor/bootstrap/scss/_close.scss rename to build/vendor/bootstrap/_close.scss diff --git a/build/vendor/bootstrap/scss/_containers.scss b/build/vendor/bootstrap/_containers.scss similarity index 100% rename from build/vendor/bootstrap/scss/_containers.scss rename to build/vendor/bootstrap/_containers.scss diff --git a/build/vendor/bootstrap/scss/_dropdown.scss b/build/vendor/bootstrap/_dropdown.scss similarity index 97% rename from build/vendor/bootstrap/scss/_dropdown.scss rename to build/vendor/bootstrap/_dropdown.scss index 06e70f7..adc1143 100644 --- a/build/vendor/bootstrap/scss/_dropdown.scss +++ b/build/vendor/bootstrap/_dropdown.scss @@ -50,8 +50,8 @@ --bs-position: start; &[data-bs-popper] { - right: auto #{"/* rtl:ignore */"}; - left: 0 #{"/* rtl:ignore */"}; + right: auto; + left: 0; } } @@ -59,8 +59,8 @@ --bs-position: end; &[data-bs-popper] { - right: 0 #{"/* rtl:ignore */"}; - left: auto #{"/* rtl:ignore */"}; + right: 0; + left: auto; } } } diff --git a/build/vendor/bootstrap/scss/_forms.scss b/build/vendor/bootstrap/_forms.scss similarity index 100% rename from build/vendor/bootstrap/scss/_forms.scss rename to build/vendor/bootstrap/_forms.scss diff --git a/build/vendor/bootstrap/scss/_functions.scss b/build/vendor/bootstrap/_functions.scss similarity index 74% rename from build/vendor/bootstrap/scss/_functions.scss rename to build/vendor/bootstrap/_functions.scss index 29114fc..e003955 100644 --- a/build/vendor/bootstrap/scss/_functions.scss +++ b/build/vendor/bootstrap/_functions.scss @@ -32,6 +32,41 @@ } } +// Colors +@function to-rgb($value) { + @return red($value), green($value), blue($value); +} + +@function rgba-css-var($identifier, $target) { + @return rgba(var(--#{$variable-prefix}#{$identifier}-rgb), var(--#{$variable-prefix}#{$target}-opacity)); +} + +// stylelint-disable scss/dollar-variable-pattern +@function map-loop($map, $func, $args...) { + $_map: (); + + @each $key, $value in $map { + // allow to pass the $key and $value of the map as an function argument + $_args: (); + @each $arg in $args { + $_args: append($_args, if($arg == "$key", $key, if($arg == "$value", $value, $arg))); + } + + $_map: map-merge($_map, ($key: call(get-function($func), $_args...))); + } + + @return $_map; +} +// stylelint-enable scss/dollar-variable-pattern + +@function varify($list) { + $result: null; + @each $entry in $list { + $result: append($result, var(--#{$variable-prefix}#{$entry}), space); + } + @return $result; +} + // Internal Bootstrap function to turn maps into its negative variant. // It prefixes the keys with `n` and makes the value negative. @function negativify-map($map) { @@ -55,6 +90,16 @@ @return $result; } +// Merge multiple maps +@function map-merge-multiple($maps...) { + $merged-maps: (); + + @each $map in $maps { + $merged-maps: map-merge($merged-maps, $map); + } + @return $merged-maps; +} + // Replace `$search` with `$replace` in `$string` // Used on our SVG icon backgrounds for custom forms. // @@ -95,7 +140,7 @@ // Color contrast // See https://github.com/twbs/bootstrap/pull/30168 -// A list of pre-calculated numbers of pow(($value / 255 + .055) / 1.055, 2.4). (from 0 to 255) +// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255) // stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1; @@ -123,7 +168,7 @@ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 $l1: luminance($background); $l2: luminance(opaque($background, $foreground)); - @return if($l1 > $l2, ($l1 + .05) / ($l2 + .05), ($l2 + .05) / ($l1 + .05)); + @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05)); } // Return WCAG2.0 relative luminance @@ -137,7 +182,7 @@ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 ); @each $name, $value in $rgb { - $value: if($value / 255 < .03928, $value / 255 / 12.92, nth($_luminance-list, $value + 1)); + $value: if(divide($value, 255) < .03928, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1)); $rgb: map-merge($rgb, ($name: $value)); } @@ -201,5 +246,51 @@ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 @return $value1 - $value2; } + @if type-of($value2) != number { + $value2: unquote("(") + $value2 + unquote(")"); + } + @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2); } + +@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; +} diff --git a/build/vendor/bootstrap/_grid.scss b/build/vendor/bootstrap/_grid.scss new file mode 100644 index 0000000..27fd558 --- /dev/null +++ b/build/vendor/bootstrap/_grid.scss @@ -0,0 +1,33 @@ +// Row +// +// Rows contain your columns. + +@if $enable-grid-classes { + .row { + @include make-row(); + + > * { + @include make-col-ready(); + } + } +} + +@if $enable-cssgrid { + .grid { + display: grid; + grid-template-rows: repeat(var(--#{$variable-prefix}rows, 1), 1fr); + grid-template-columns: repeat(var(--#{$variable-prefix}columns, #{$grid-columns}), 1fr); + gap: var(--#{$variable-prefix}gap, #{$grid-gutter-width}); + + @include make-cssgrid(); + } +} + + +// Columns +// +// Common styles for small and large grid columns + +@if $enable-grid-classes { + @include make-grid-columns(); +} diff --git a/build/vendor/bootstrap/scss/_helpers.scss b/build/vendor/bootstrap/_helpers.scss similarity index 81% rename from build/vendor/bootstrap/scss/_helpers.scss rename to build/vendor/bootstrap/_helpers.scss index 8f566d1..4a989f5 100644 --- a/build/vendor/bootstrap/scss/_helpers.scss +++ b/build/vendor/bootstrap/_helpers.scss @@ -2,6 +2,8 @@ @import "helpers/colored-links"; @import "helpers/ratio"; @import "helpers/position"; +@import "helpers/stacks"; @import "helpers/visually-hidden"; @import "helpers/stretched-link"; @import "helpers/text-truncation"; +@import "helpers/vr"; diff --git a/build/vendor/bootstrap/scss/_images.scss b/build/vendor/bootstrap/_images.scss similarity index 97% rename from build/vendor/bootstrap/scss/_images.scss rename to build/vendor/bootstrap/_images.scss index b11b45a..3d6a101 100644 --- a/build/vendor/bootstrap/scss/_images.scss +++ b/build/vendor/bootstrap/_images.scss @@ -32,7 +32,7 @@ } .figure-img { - margin-bottom: $spacer / 2; + margin-bottom: $spacer * .5; line-height: 1; } diff --git a/build/vendor/bootstrap/scss/_list-group.scss b/build/vendor/bootstrap/_list-group.scss similarity index 89% rename from build/vendor/bootstrap/scss/_list-group.scss rename to build/vendor/bootstrap/_list-group.scss index 7daa9f1..dcd61d2 100644 --- a/build/vendor/bootstrap/scss/_list-group.scss +++ b/build/vendor/bootstrap/_list-group.scss @@ -163,12 +163,12 @@ // Organizationally, this must come after the `:hover` states. @each $state, $value in $theme-colors { - $list-group-background: shift-color($value, $list-group-item-bg-scale); - $list-group-color: shift-color($value, $list-group-item-color-scale); - @if (contrast-ratio($list-group-background, $list-group-color) < $min-contrast-ratio) { - $list-group-color: mix($value, color-contrast($list-group-background), abs($list-group-item-color-scale)); + $list-group-variant-bg: shift-color($value, $list-group-item-bg-scale); + $list-group-variant-color: shift-color($value, $list-group-item-color-scale); + @if (contrast-ratio($list-group-variant-bg, $list-group-variant-color) < $min-contrast-ratio) { + $list-group-variant-color: mix($value, color-contrast($list-group-variant-bg), abs($list-group-item-color-scale)); } - @include list-group-item-variant($state, $list-group-background, $list-group-color); + @include list-group-item-variant($state, $list-group-variant-bg, $list-group-variant-color); } // scss-docs-end list-group-modifiers diff --git a/build/vendor/bootstrap/scss/_mixins.scss b/build/vendor/bootstrap/_mixins.scss similarity index 96% rename from build/vendor/bootstrap/scss/_mixins.scss rename to build/vendor/bootstrap/_mixins.scss index eec0857..af1f74f 100644 --- a/build/vendor/bootstrap/scss/_mixins.scss +++ b/build/vendor/bootstrap/_mixins.scss @@ -22,6 +22,7 @@ // Components @import "mixins/alert"; +@import "mixins/backdrop"; @import "mixins/buttons"; @import "mixins/caret"; @import "mixins/pagination"; diff --git a/build/vendor/bootstrap/scss/_modal.scss b/build/vendor/bootstrap/_modal.scss similarity index 88% rename from build/vendor/bootstrap/scss/_modal.scss rename to build/vendor/bootstrap/_modal.scss index 5138986..21e1258 100644 --- a/build/vendor/bootstrap/scss/_modal.scss +++ b/build/vendor/bootstrap/_modal.scss @@ -4,16 +4,6 @@ // .modal-content - actual modal w/ bg and corners and stuff -.modal-open { - // Kill the scroll on the body - overflow: hidden; - - .modal { - overflow-x: hidden; - overflow-y: auto; - } -} - // Container that the modal scrolls within .modal { position: fixed; @@ -23,7 +13,8 @@ display: none; width: 100%; height: 100%; - overflow: hidden; + overflow-x: hidden; + overflow-y: auto; // Prevent Chrome on Windows from adding a focus outline. For details, see // https://github.com/twbs/bootstrap/pull/10951. outline: 0; @@ -94,17 +85,7 @@ // Modal background .modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: $zindex-modal-backdrop; - width: 100vw; - height: 100vh; - background-color: $modal-backdrop-bg; - - // Fade for backdrop - &.fade { opacity: 0; } - &.show { opacity: $modal-backdrop-opacity; } + @include overlay-backdrop($zindex-modal-backdrop, $modal-backdrop-bg, $modal-backdrop-opacity); } // Modal header @@ -119,8 +100,8 @@ @include border-top-radius($modal-content-inner-border-radius); .btn-close { - padding: ($modal-header-padding-y / 2) ($modal-header-padding-x / 2); - margin: ($modal-header-padding-y / -2) ($modal-header-padding-x / -2) ($modal-header-padding-y / -2) auto; + padding: ($modal-header-padding-y * .5) ($modal-header-padding-x * .5); + margin: ($modal-header-padding-y * -.5) ($modal-header-padding-x * -.5) ($modal-header-padding-y * -.5) auto; } } @@ -147,7 +128,7 @@ flex-shrink: 0; align-items: center; // vertically center justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items - padding: $modal-inner-padding - $modal-footer-margin-between / 2; + padding: $modal-inner-padding - $modal-footer-margin-between * .5; border-top: $modal-footer-border-width solid $modal-footer-border-color; @include border-bottom-radius($modal-content-inner-border-radius); @@ -155,7 +136,7 @@ // This solution is far from ideal because of the universal selector usage, // but is needed to fix https://github.com/twbs/bootstrap/issues/24800 > * { - margin: $modal-footer-margin-between / 2; + margin: $modal-footer-margin-between * .5; } } diff --git a/build/vendor/bootstrap/scss/_nav.scss b/build/vendor/bootstrap/_nav.scss similarity index 100% rename from build/vendor/bootstrap/scss/_nav.scss rename to build/vendor/bootstrap/_nav.scss diff --git a/build/vendor/bootstrap/scss/_navbar.scss b/build/vendor/bootstrap/_navbar.scss similarity index 90% rename from build/vendor/bootstrap/scss/_navbar.scss rename to build/vendor/bootstrap/_navbar.scss index 2ccef11..001dfc9 100644 --- a/build/vendor/bootstrap/scss/_navbar.scss +++ b/build/vendor/bootstrap/_navbar.scss @@ -193,13 +193,42 @@ .navbar-toggler { display: none; } + + .offcanvas-header { + display: none; + } + + .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; // stylelint-disable-line declaration-no-important + background-color: transparent; + border-right: 0; + border-left: 0; + @include transition(none); + transform: none; + } + .offcanvas-top, + .offcanvas-bottom { + height: auto; + border-top: 0; + border-bottom: 0; + } + + .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. diff --git a/build/vendor/bootstrap/scss/_offcanvas.scss b/build/vendor/bootstrap/_offcanvas.scss similarity index 82% rename from build/vendor/bootstrap/scss/_offcanvas.scss rename to build/vendor/bootstrap/_offcanvas.scss index f1d9945..a089c2a 100644 --- a/build/vendor/bootstrap/scss/_offcanvas.scss +++ b/build/vendor/bootstrap/_offcanvas.scss @@ -14,6 +14,10 @@ @include transition(transform $offcanvas-transition-duration ease-in-out); } +.offcanvas-backdrop { + @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity); +} + .offcanvas-header { display: flex; align-items: center; @@ -21,8 +25,10 @@ padding: $offcanvas-padding-y $offcanvas-padding-x; .btn-close { - padding: ($offcanvas-padding-y / 2) ($offcanvas-padding-x / 2); - margin: ($offcanvas-padding-y / -2) ($offcanvas-padding-x / -2) ($offcanvas-padding-y / -2) auto; + padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5); + margin-top: $offcanvas-padding-y * -.5; + margin-right: $offcanvas-padding-x * -.5; + margin-bottom: $offcanvas-padding-y * -.5; } } diff --git a/build/vendor/bootstrap/scss/_pagination.scss b/build/vendor/bootstrap/_pagination.scss similarity index 100% rename from build/vendor/bootstrap/scss/_pagination.scss rename to build/vendor/bootstrap/_pagination.scss diff --git a/build/vendor/bootstrap/_placeholders.scss b/build/vendor/bootstrap/_placeholders.scss new file mode 100644 index 0000000..2f647cc --- /dev/null +++ b/build/vendor/bootstrap/_placeholders.scss @@ -0,0 +1,51 @@ +.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/build/vendor/bootstrap/scss/_popover.scss b/build/vendor/bootstrap/_popover.scss similarity index 83% rename from build/vendor/bootstrap/scss/_popover.scss rename to build/vendor/bootstrap/_popover.scss index a55555e..3b8208e 100644 --- a/build/vendor/bootstrap/scss/_popover.scss +++ b/build/vendor/bootstrap/_popover.scss @@ -40,13 +40,13 @@ &::before { bottom: 0; - border-width: $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: $popover-arrow-height ($popover-arrow-width * .5) 0; border-top-color: $popover-arrow-outer-color; } &::after { bottom: $popover-border-width; - border-width: $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: $popover-arrow-height ($popover-arrow-width * .5) 0; border-top-color: $popover-arrow-color; } } @@ -60,13 +60,13 @@ &::before { left: 0; - border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0; border-right-color: $popover-arrow-outer-color; } &::after { left: $popover-border-width; - border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0; border-right-color: $popover-arrow-color; } } @@ -78,13 +78,13 @@ &::before { top: 0; - border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2); + border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5); border-bottom-color: $popover-arrow-outer-color; } &::after { top: $popover-border-width; - border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2); + border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5); border-bottom-color: $popover-arrow-color; } } @@ -96,7 +96,7 @@ left: 50%; display: block; width: $popover-arrow-width; - margin-left: -$popover-arrow-width / 2; + margin-left: -$popover-arrow-width * .5; content: ""; border-bottom: $popover-border-width solid $popover-header-bg; } @@ -110,13 +110,13 @@ &::before { right: 0; - border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height; + border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height; border-left-color: $popover-arrow-outer-color; } &::after { right: $popover-border-width; - border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height; + border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height; border-left-color: $popover-arrow-color; } } @@ -144,7 +144,7 @@ @include font-size($font-size-base); color: $popover-header-color; background-color: $popover-header-bg; - border-bottom: $popover-border-width solid shade-color($popover-header-bg, 10%); + border-bottom: $popover-border-width solid $popover-border-color; @include border-top-radius($popover-inner-border-radius); &:empty { diff --git a/build/vendor/bootstrap/scss/_progress.scss b/build/vendor/bootstrap/_progress.scss similarity index 100% rename from build/vendor/bootstrap/scss/_progress.scss rename to build/vendor/bootstrap/_progress.scss diff --git a/build/vendor/bootstrap/scss/_reboot.scss b/build/vendor/bootstrap/_reboot.scss similarity index 95% rename from build/vendor/bootstrap/scss/_reboot.scss rename to build/vendor/bootstrap/_reboot.scss index 3520469..80bfffb 100644 --- a/build/vendor/bootstrap/scss/_reboot.scss +++ b/build/vendor/bootstrap/_reboot.scss @@ -26,7 +26,9 @@ // null by default, thus nothing is generated. :root { - font-size: $font-size-root; + @if $font-size-root != null { + font-size: var(--#{$variable-prefix}-root-font-size); + } @if $enable-smooth-scroll { @media (prefers-reduced-motion: no-preference) { @@ -43,18 +45,20 @@ // 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: $font-family-base; - @include font-size($font-size-base); - font-weight: $font-weight-base; - line-height: $line-height-base; - color: $body-color; - text-align: $body-text-align; - background-color: $body-bg; // 2 + font-family: var(--#{$variable-prefix}body-font-family); + @include font-size(var(--#{$variable-prefix}body-font-size)); + font-weight: var(--#{$variable-prefix}body-font-weight); + line-height: var(--#{$variable-prefix}body-line-height); + color: var(--#{$variable-prefix}body-color); + text-align: var(--#{$variable-prefix}body-text-align); + background-color: var(--#{$variable-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 diff --git a/build/vendor/bootstrap/_root.scss b/build/vendor/bootstrap/_root.scss new file mode 100644 index 0000000..189b2b3 --- /dev/null +++ b/build/vendor/bootstrap/_root.scss @@ -0,0 +1,53 @@ +:root { + // Note: Custom variable values only support SassScript inside `#{}`. + + // Colors + // + // Generate palettes for full colors, grays, and theme colors. + + @each $color, $value in $colors { + --#{$variable-prefix}#{$color}: #{$value}; + } + + @each $color, $value in $grays { + --#{$variable-prefix}gray-#{$color}: #{$value}; + } + + @each $color, $value in $theme-colors { + --#{$variable-prefix}#{$color}: #{$value}; + } + + @each $color, $value in $theme-colors-rgb { + --#{$variable-prefix}#{$color}-rgb: #{$value}; + } + + --#{$variable-prefix}white-rgb: #{to-rgb($white)}; + --#{$variable-prefix}black-rgb: #{to-rgb($black)}; + --#{$variable-prefix}body-rgb: #{to-rgb($body-color)}; + + // Fonts + + // Note: Use `inspect` for lists so that quoted items keep the quotes. + // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 + --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)}; + --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)}; + --#{$variable-prefix}gradient: #{$gradient}; + + // Root and body + // stylelint-disable custom-property-empty-line-before + // scss-docs-start root-body-variables + @if $font-size-root != null { + --#{$variable-prefix}root-font-size: #{$font-size-root}; + } + --#{$variable-prefix}body-font-family: #{$font-family-base}; + --#{$variable-prefix}body-font-size: #{$font-size-base}; + --#{$variable-prefix}body-font-weight: #{$font-weight-base}; + --#{$variable-prefix}body-line-height: #{$line-height-base}; + --#{$variable-prefix}body-color: #{$body-color}; + @if $body-text-align != null { + --#{$variable-prefix}body-text-align: #{$body-text-align}; + } + --#{$variable-prefix}body-bg: #{$body-bg}; + // scss-docs-end root-body-variables + // stylelint-enable custom-property-empty-line-before +} diff --git a/build/vendor/bootstrap/scss/_spinners.scss b/build/vendor/bootstrap/_spinners.scss similarity index 100% rename from build/vendor/bootstrap/scss/_spinners.scss rename to build/vendor/bootstrap/_spinners.scss diff --git a/build/vendor/bootstrap/scss/_tables.scss b/build/vendor/bootstrap/_tables.scss similarity index 98% rename from build/vendor/bootstrap/scss/_tables.scss rename to build/vendor/bootstrap/_tables.scss index 5036829..92556ba 100644 --- a/build/vendor/bootstrap/scss/_tables.scss +++ b/build/vendor/bootstrap/_tables.scss @@ -4,6 +4,7 @@ .table { --#{$variable-prefix}table-bg: #{$table-bg}; + --#{$variable-prefix}table-accent-bg: #{$table-accent-bg}; --#{$variable-prefix}table-striped-color: #{$table-striped-color}; --#{$variable-prefix}table-striped-bg: #{$table-striped-bg}; --#{$variable-prefix}table-active-color: #{$table-active-color}; diff --git a/build/vendor/bootstrap/scss/_toasts.scss b/build/vendor/bootstrap/_toasts.scss similarity index 92% rename from build/vendor/bootstrap/scss/_toasts.scss rename to build/vendor/bootstrap/_toasts.scss index 5c533d7..0a2d6ec 100644 --- a/build/vendor/bootstrap/scss/_toasts.scss +++ b/build/vendor/bootstrap/_toasts.scss @@ -10,11 +10,11 @@ box-shadow: $toast-box-shadow; @include border-radius($toast-border-radius); - &:not(.showing):not(.show) { + &.showing { opacity: 0; } - &.hide { + &:not(.show) { display: none; } } @@ -40,7 +40,7 @@ @include border-top-radius(subtract($toast-border-radius, $toast-border-width)); .btn-close { - margin-right: $toast-padding-x / -2; + margin-right: $toast-padding-x * -.5; margin-left: $toast-padding-x; } } diff --git a/build/vendor/bootstrap/scss/_tooltip.scss b/build/vendor/bootstrap/_tooltip.scss similarity index 89% rename from build/vendor/bootstrap/scss/_tooltip.scss rename to build/vendor/bootstrap/_tooltip.scss index 2993bf7..75ff078 100644 --- a/build/vendor/bootstrap/scss/_tooltip.scss +++ b/build/vendor/bootstrap/_tooltip.scss @@ -37,7 +37,7 @@ &::before { top: -1px; - border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0; + border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0; border-top-color: $tooltip-arrow-color; } } @@ -53,7 +53,7 @@ &::before { right: -1px; - border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0; + border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0; border-right-color: $tooltip-arrow-color; } } @@ -67,7 +67,7 @@ &::before { bottom: -1px; - border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height; + border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height; border-bottom-color: $tooltip-arrow-color; } } @@ -83,7 +83,7 @@ &::before { left: -1px; - border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height; + border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height; border-left-color: $tooltip-arrow-color; } } diff --git a/build/vendor/bootstrap/scss/_transitions.scss b/build/vendor/bootstrap/_transitions.scss similarity index 72% rename from build/vendor/bootstrap/scss/_transitions.scss rename to build/vendor/bootstrap/_transitions.scss index 2905df4..bfb26aa 100644 --- a/build/vendor/bootstrap/scss/_transitions.scss +++ b/build/vendor/bootstrap/_transitions.scss @@ -17,5 +17,11 @@ 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/build/vendor/bootstrap/scss/_type.scss b/build/vendor/bootstrap/_type.scss similarity index 100% rename from build/vendor/bootstrap/scss/_type.scss rename to build/vendor/bootstrap/_type.scss diff --git a/build/vendor/bootstrap/scss/_utilities.scss b/build/vendor/bootstrap/_utilities.scss similarity index 93% rename from build/vendor/bootstrap/scss/_utilities.scss rename to build/vendor/bootstrap/_utilities.scss index 3c927cf..960d6f1 100644 --- a/build/vendor/bootstrap/scss/_utilities.scss +++ b/build/vendor/bootstrap/_utilities.scss @@ -24,6 +24,19 @@ $utilities: map-merge( ) ), // scss-docs-end utils-float + // 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, @@ -501,32 +514,55 @@ $utilities: map-merge( "color": ( property: color, class: text, + local-vars: ( + "text-opacity": 1 + ), values: map-merge( - $theme-colors, + $utilities-text-colors, ( - "white": $white, - "body": $body-color, "muted": $text-muted, - "black-50": rgba($black, .5), - "white-50": rgba($white, .5), + "black-50": rgba($black, .5), // deprecated + "white-50": rgba($white, .5), // deprecated "reset": inherit, ) ) ), + "text-opacity": ( + css-var: true, + class: text-opacity, + values: ( + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), // scss-docs-end utils-color // scss-docs-start utils-bg-color "background-color": ( property: background-color, class: bg, + local-vars: ( + "bg-opacity": 1 + ), values: map-merge( - $theme-colors, + $utilities-bg-colors, ( - "body": $body-bg, - "white": $white, "transparent": transparent ) ) ), + "bg-opacity": ( + css-var: true, + class: bg-opacity, + values: ( + 10: .1, + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), // scss-docs-end utils-bg-color "gradient": ( property: background-image, diff --git a/build/vendor/bootstrap/scss/_variables.scss b/build/vendor/bootstrap/_variables.scss similarity index 91% rename from build/vendor/bootstrap/scss/_variables.scss rename to build/vendor/bootstrap/_variables.scss index 1e17606..3750fa2 100644 --- a/build/vendor/bootstrap/scss/_variables.scss +++ b/build/vendor/bootstrap/_variables.scss @@ -90,6 +90,10 @@ $theme-colors: ( ) !default; // scss-docs-end theme-colors-map +// scss-docs-start theme-colors-rgb +$theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value") !default; +// scss-docs-end theme-colors-rgb + // The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7. // See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast $min-contrast-ratio: 4.5 !default; @@ -198,6 +202,126 @@ $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-200, + "purple-200": $purple-100, + "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 // Characters which are escaped by the escape-svg function @@ -221,6 +345,7 @@ $enable-transitions: true !default; $enable-reduced-motion: true !default; $enable-smooth-scroll: true !default; $enable-grid-classes: true !default; +$enable-cssgrid: false !default; $enable-button-pointers: true !default; $enable-rfs: true !default; $enable-validation-icons: true !default; @@ -250,8 +375,8 @@ $gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default; $spacer: 1rem !default; $spacers: ( 0: 0, - 1: $spacer / 4, - 2: $spacer / 2, + 1: $spacer * .25, + 2: $spacer * .5, 3: $spacer, 4: $spacer * 1.5, 5: $spacer * 3, @@ -280,6 +405,28 @@ $body-bg: $white !default; $body-color: $gray-900 !default; $body-text-align: null !default; +// Utilities maps +// +// Extends the default `$theme-colors` maps to help create our utilities. + +// scss-docs-start utilities-colors +$utilities-colors: map-merge( + $theme-colors-rgb, + ( + "black": to-rgb($black), + "white": to-rgb($white), + "body": to-rgb($body-color) + ) +) !default; +// scss-docs-end utilities-colors + +// scss-docs-start utilities-text-colors +$utilities-text-colors: map-loop($utilities-colors, rgba-css-var, "$key", "text") !default; +// scss-docs-end utilities-text-colors + +// scss-docs-start utilities-bg-colors +$utilities-bg-colors: map-loop($utilities-colors, rgba-css-var, "$key", "bg") !default; +// scss-docs-end utilities-bg-colors // Links // @@ -350,7 +497,7 @@ $gutters: $spacers !default; // Container padding -$container-padding-x: $grid-gutter-width / 2 !default; +$container-padding-x: $grid-gutter-width * .5 !default; // Components @@ -397,6 +544,7 @@ $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 @@ -422,8 +570,8 @@ $font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberati $font-family-base: var(--#{$variable-prefix}font-sans-serif) !default; $font-family-code: var(--#{$variable-prefix}font-monospace) !default; -// $font-size-root effects the value of `rem`, which is used for as well font sizes, paddings and margins -// $font-size-base effects the font size of the body text +// $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; @@ -461,7 +609,7 @@ $font-sizes: ( // scss-docs-end font-sizes // scss-docs-start headings-variables -$headings-margin-bottom: $spacer / 2 !default; +$headings-margin-bottom: $spacer * .5 !default; $headings-font-family: null !default; $headings-font-style: null !default; $headings-font-weight: 500 !default; @@ -535,6 +683,7 @@ $table-cell-vertical-align: top !default; $table-color: $body-color !default; $table-bg: transparent !default; +$table-accent-bg: transparent !default; $table-th-font-weight: null !default; @@ -691,7 +840,7 @@ $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: $white !default; +$input-bg: $body-bg !default; $input-disabled-bg: $gray-200 !default; $input-disabled-border-color: null !default; @@ -717,13 +866,15 @@ $input-height-border: $input-border-width * 2 !default; $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 / 2) !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 @@ -825,6 +976,8 @@ $form-select-font-size-sm: $input-font-size-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-transition: $input-transition !default; // scss-docs-end form-select-variables // scss-docs-start form-range-variables @@ -856,6 +1009,7 @@ $form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default // 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; @@ -902,9 +1056,10 @@ $form-validation-states: ( $zindex-dropdown: 1000 !default; $zindex-sticky: 1020 !default; $zindex-fixed: 1030 !default; -$zindex-modal-backdrop: 1040 !default; -$zindex-offcanvas: 1050 !default; -$zindex-modal: 1060 !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; // scss-docs-end zindex-stack @@ -939,7 +1094,7 @@ $nav-pills-link-active-bg: $component-active-bg !default; // Navbar // scss-docs-start navbar-variables -$navbar-padding-y: $spacer / 2 !default; +$navbar-padding-y: $spacer * .5 !default; $navbar-padding-x: null !default; $navbar-nav-link-padding-x: .5rem !default; @@ -948,7 +1103,7 @@ $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) / 2 !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; @@ -998,7 +1153,7 @@ $dropdown-border-radius: $border-radius !default; $dropdown-border-width: $border-width !default; $dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default; $dropdown-divider-bg: $dropdown-border-color !default; -$dropdown-divider-margin-y: $spacer / 2 !default; +$dropdown-divider-margin-y: $spacer * .5 !default; $dropdown-box-shadow: $box-shadow !default; $dropdown-link-color: $gray-900 !default; @@ -1010,7 +1165,7 @@ $dropdown-link-active-bg: $component-active-bg !default; $dropdown-link-disabled-color: $gray-500 !default; -$dropdown-item-padding-y: $spacer / 4 !default; +$dropdown-item-padding-y: $spacer * .25 !default; $dropdown-item-padding-x: $spacer !default; $dropdown-header-color: $gray-600 !default; @@ -1074,17 +1229,25 @@ $pagination-border-radius-lg: $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 / 2 !default; +$card-title-spacer-y: $spacer * .5 !default; $card-border-width: $border-width !default; -$card-border-radius: $border-radius !default; $card-border-color: rgba($black, .125) !default; +$card-border-radius: $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 / 2 !default; +$card-cap-padding-y: $card-spacer-y * .5 !default; $card-cap-padding-x: $card-spacer-x !default; $card-cap-bg: rgba($black, .03) !default; $card-cap-color: null !default; @@ -1092,7 +1255,7 @@ $card-height: null !default; $card-color: null !default; $card-bg: $white !default; $card-img-overlay-padding: $spacer !default; -$card-group-margin: $grid-gutter-width / 2 !default; +$card-group-margin: $grid-gutter-width * .5 !default; // scss-docs-end card-variables // Accordion @@ -1122,7 +1285,7 @@ $accordion-button-focus-border-color: $input-focus-border-color !default; $accordion-button-focus-box-shadow: $btn-focus-box-shadow !default; $accordion-icon-width: 1.25rem !default; -$accordion-icon-color: $accordion-color !default; +$accordion-icon-color: $accordion-button-color !default; $accordion-icon-active-color: $accordion-button-active-color !default; $accordion-icon-transition: transform .2s ease-in-out !default; $accordion-icon-transform: rotate(-180deg) !default; @@ -1140,8 +1303,8 @@ $tooltip-color: $white !default; $tooltip-bg: $black !default; $tooltip-border-radius: $border-radius !default; $tooltip-opacity: .9 !default; -$tooltip-padding-y: $spacer / 4 !default; -$tooltip-padding-x: $spacer / 2 !default; +$tooltip-padding-y: $spacer * .25 !default; +$tooltip-padding-x: $spacer * .5 !default; $tooltip-margin: 0 !default; $tooltip-arrow-width: .8rem !default; @@ -1157,7 +1320,7 @@ $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-start tooltip-feedback-variables +// scss-docs-end tooltip-feedback-variables // Popovers @@ -1307,7 +1470,7 @@ $list-group-border-color: rgba($black, .125) !default; $list-group-border-width: $border-width !default; $list-group-border-radius: $border-radius !default; -$list-group-item-padding-y: $spacer / 2 !default; +$list-group-item-padding-y: $spacer * .5 !default; $list-group-item-padding-x: $spacer !default; $list-group-item-bg-scale: -80% !default; $list-group-item-color-scale: 40% !default; @@ -1448,6 +1611,8 @@ $offcanvas-title-line-height: $modal-title-line-height !default; $offcanvas-bg-color: $modal-content-bg !default; $offcanvas-color: $modal-content-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 diff --git a/build/vendor/bootstrap/scss/bootstrap-grid.scss b/build/vendor/bootstrap/bootstrap-grid.scss similarity index 96% rename from build/vendor/bootstrap/scss/bootstrap-grid.scss rename to build/vendor/bootstrap/bootstrap-grid.scss index 815991c..2c68fbb 100644 --- a/build/vendor/bootstrap/scss/bootstrap-grid.scss +++ b/build/vendor/bootstrap/bootstrap-grid.scss @@ -1,5 +1,5 @@ /*! - * Bootstrap Grid v5.0.0 (https://getbootstrap.com/) + * Bootstrap Grid v5.1.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) diff --git a/build/vendor/bootstrap/scss/bootstrap-reboot.scss b/build/vendor/bootstrap/bootstrap-reboot.scss similarity index 92% rename from build/vendor/bootstrap/scss/bootstrap-reboot.scss rename to build/vendor/bootstrap/bootstrap-reboot.scss index 8da95a2..0c4bbe5 100644 --- a/build/vendor/bootstrap/scss/bootstrap-reboot.scss +++ b/build/vendor/bootstrap/bootstrap-reboot.scss @@ -1,5 +1,5 @@ /*! - * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) + * Bootstrap Reboot v5.1.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) diff --git a/build/vendor/bootstrap/scss/bootstrap-utilities.scss b/build/vendor/bootstrap/bootstrap-utilities.scss similarity index 85% rename from build/vendor/bootstrap/scss/bootstrap-utilities.scss rename to build/vendor/bootstrap/bootstrap-utilities.scss index 8ddb861..297e825 100644 --- a/build/vendor/bootstrap/scss/bootstrap-utilities.scss +++ b/build/vendor/bootstrap/bootstrap-utilities.scss @@ -1,5 +1,5 @@ /*! - * Bootstrap Utilities v5.0.0 (https://getbootstrap.com/) + * Bootstrap Utilities v5.1.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) diff --git a/build/vendor/bootstrap/scss/bootstrap.scss b/build/vendor/bootstrap/bootstrap.scss similarity index 93% rename from build/vendor/bootstrap/scss/bootstrap.scss rename to build/vendor/bootstrap/bootstrap.scss index cd149f9..e42b4b4 100644 --- a/build/vendor/bootstrap/scss/bootstrap.scss +++ b/build/vendor/bootstrap/bootstrap.scss @@ -1,5 +1,5 @@ /*! - * Bootstrap v5.0.0 (https://getbootstrap.com/) + * Bootstrap v5.1.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) @@ -43,6 +43,7 @@ @import "carousel"; @import "spinners"; @import "offcanvas"; +@import "placeholders"; // Helpers @import "helpers"; diff --git a/build/vendor/bootstrap/scss/forms/_floating-labels.scss b/build/vendor/bootstrap/forms/_floating-labels.scss similarity index 97% rename from build/vendor/bootstrap/scss/forms/_floating-labels.scss rename to build/vendor/bootstrap/forms/_floating-labels.scss index 8b2e2b8..2f42954 100644 --- a/build/vendor/bootstrap/scss/forms/_floating-labels.scss +++ b/build/vendor/bootstrap/forms/_floating-labels.scss @@ -4,7 +4,7 @@ > .form-control, > .form-select { height: $form-floating-height; - padding: $form-floating-padding-y $form-floating-padding-x; + line-height: $form-floating-line-height; } > label { @@ -21,6 +21,8 @@ // stylelint-disable no-duplicate-selectors > .form-control { + padding: $form-floating-padding-y $form-floating-padding-x; + &::placeholder { color: transparent; } diff --git a/build/vendor/bootstrap/scss/forms/_form-check.scss b/build/vendor/bootstrap/forms/_form-check.scss similarity index 97% rename from build/vendor/bootstrap/scss/forms/_form-check.scss rename to build/vendor/bootstrap/forms/_form-check.scss index b34250a..6321b41 100644 --- a/build/vendor/bootstrap/scss/forms/_form-check.scss +++ b/build/vendor/bootstrap/forms/_form-check.scss @@ -17,7 +17,7 @@ .form-check-input { width: $form-check-input-width; height: $form-check-input-width; - margin-top: ($line-height-base - $form-check-input-width) / 2; // line-height minus check height + margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height vertical-align: top; background-color: $form-check-input-bg; background-repeat: no-repeat; diff --git a/build/vendor/bootstrap/scss/forms/_form-control.scss b/build/vendor/bootstrap/forms/_form-control.scss similarity index 96% rename from build/vendor/bootstrap/scss/forms/_form-control.scss rename to build/vendor/bootstrap/forms/_form-control.scss index 5e43aea..96423c5 100644 --- a/build/vendor/bootstrap/scss/forms/_form-control.scss +++ b/build/vendor/bootstrap/forms/_form-control.scss @@ -25,7 +25,7 @@ &[type="file"] { overflow: hidden; // prevent pseudo element button overlap - &:not(:disabled):not(:read-only) { + &:not(:disabled):not([readonly]) { cursor: pointer; } } @@ -65,7 +65,7 @@ // disabled if the fieldset is disabled. Due to implementation difficulty, we // don't honor that edge case; we style them as disabled anyway. &:disabled, - &:read-only { + &[readonly] { 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. @@ -88,7 +88,7 @@ @include transition($btn-transition); } - &:hover:not(:disabled):not(:read-only)::file-selector-button { + &:hover:not(:disabled):not([readonly])::file-selector-button { background-color: $form-file-button-hover-bg; } @@ -107,7 +107,7 @@ @include transition($btn-transition); } - &:hover:not(:disabled):not(:read-only)::-webkit-file-upload-button { + &:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { background-color: $form-file-button-hover-bg; } } @@ -199,11 +199,11 @@ textarea { // stylelint-enable selector-no-qualifying-type .form-control-color { - max-width: 3rem; + width: $form-color-width; height: auto; // Override fixed browser height padding: $input-padding-y; - &:not(:disabled):not(:read-only) { + &:not(:disabled):not([readonly]) { cursor: pointer; } diff --git a/build/vendor/bootstrap/scss/forms/_form-range.scss b/build/vendor/bootstrap/forms/_form-range.scss similarity index 98% rename from build/vendor/bootstrap/scss/forms/_form-range.scss rename to build/vendor/bootstrap/forms/_form-range.scss index ae1d841..6de4213 100644 --- a/build/vendor/bootstrap/scss/forms/_form-range.scss +++ b/build/vendor/bootstrap/forms/_form-range.scss @@ -27,7 +27,7 @@ &::-webkit-slider-thumb { width: $form-range-thumb-width; height: $form-range-thumb-height; - margin-top: ($form-range-track-height - $form-range-thumb-height) / 2; // Webkit specific + margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific @include gradient-bg($form-range-thumb-bg); border: $form-range-thumb-border; @include border-radius($form-range-thumb-border-radius); diff --git a/build/vendor/bootstrap/scss/forms/_form-select.scss b/build/vendor/bootstrap/forms/_form-select.scss similarity index 90% rename from build/vendor/bootstrap/scss/forms/_form-select.scss rename to build/vendor/bootstrap/forms/_form-select.scss index 15d5061..4506a97 100644 --- a/build/vendor/bootstrap/scss/forms/_form-select.scss +++ b/build/vendor/bootstrap/forms/_form-select.scss @@ -7,6 +7,8 @@ display: block; width: 100%; padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x; + // stylelint-disable-next-line property-no-vendor-prefix + -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636 font-family: $form-select-font-family; @include font-size($form-select-font-size); font-weight: $form-select-font-weight; @@ -20,6 +22,7 @@ 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); appearance: none; &:focus { diff --git a/build/vendor/bootstrap/scss/forms/_form-text.scss b/build/vendor/bootstrap/forms/_form-text.scss similarity index 100% rename from build/vendor/bootstrap/scss/forms/_form-text.scss rename to build/vendor/bootstrap/forms/_form-text.scss diff --git a/build/vendor/bootstrap/scss/forms/_input-group.scss b/build/vendor/bootstrap/forms/_input-group.scss similarity index 100% rename from build/vendor/bootstrap/scss/forms/_input-group.scss rename to build/vendor/bootstrap/forms/_input-group.scss diff --git a/build/vendor/bootstrap/scss/forms/_labels.scss b/build/vendor/bootstrap/forms/_labels.scss similarity index 100% rename from build/vendor/bootstrap/scss/forms/_labels.scss rename to build/vendor/bootstrap/forms/_labels.scss diff --git a/build/vendor/bootstrap/scss/forms/_validation.scss b/build/vendor/bootstrap/forms/_validation.scss similarity index 100% rename from build/vendor/bootstrap/scss/forms/_validation.scss rename to build/vendor/bootstrap/forms/_validation.scss diff --git a/build/vendor/bootstrap/scss/helpers/_clearfix.scss b/build/vendor/bootstrap/helpers/_clearfix.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_clearfix.scss rename to build/vendor/bootstrap/helpers/_clearfix.scss diff --git a/build/vendor/bootstrap/scss/helpers/_colored-links.scss b/build/vendor/bootstrap/helpers/_colored-links.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_colored-links.scss rename to build/vendor/bootstrap/helpers/_colored-links.scss diff --git a/build/vendor/bootstrap/scss/helpers/_position.scss b/build/vendor/bootstrap/helpers/_position.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_position.scss rename to build/vendor/bootstrap/helpers/_position.scss diff --git a/build/vendor/bootstrap/scss/helpers/_ratio.scss b/build/vendor/bootstrap/helpers/_ratio.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_ratio.scss rename to build/vendor/bootstrap/helpers/_ratio.scss diff --git a/build/vendor/bootstrap/helpers/_stacks.scss b/build/vendor/bootstrap/helpers/_stacks.scss new file mode 100644 index 0000000..6cd237a --- /dev/null +++ b/build/vendor/bootstrap/helpers/_stacks.scss @@ -0,0 +1,15 @@ +// 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/build/vendor/bootstrap/scss/helpers/_stretched-link.scss b/build/vendor/bootstrap/helpers/_stretched-link.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_stretched-link.scss rename to build/vendor/bootstrap/helpers/_stretched-link.scss diff --git a/build/vendor/bootstrap/scss/helpers/_text-truncation.scss b/build/vendor/bootstrap/helpers/_text-truncation.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_text-truncation.scss rename to build/vendor/bootstrap/helpers/_text-truncation.scss diff --git a/build/vendor/bootstrap/scss/helpers/_visually-hidden.scss b/build/vendor/bootstrap/helpers/_visually-hidden.scss similarity index 100% rename from build/vendor/bootstrap/scss/helpers/_visually-hidden.scss rename to build/vendor/bootstrap/helpers/_visually-hidden.scss diff --git a/build/vendor/bootstrap/helpers/_vr.scss b/build/vendor/bootstrap/helpers/_vr.scss new file mode 100644 index 0000000..37f8647 --- /dev/null +++ b/build/vendor/bootstrap/helpers/_vr.scss @@ -0,0 +1,8 @@ +.vr { + display: inline-block; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentColor; + opacity: $hr-opacity; +} diff --git a/build/vendor/bootstrap/js/src/alert.js b/build/vendor/bootstrap/js/src/alert.js deleted file mode 100644 index 8840415..0000000 --- a/build/vendor/bootstrap/js/src/alert.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): alert.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - emulateTransitionEnd, - getElementFromSelector, - getTransitionDurationFromElement -} from './util/index' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'alert' -const DATA_KEY = 'bs.alert' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]' - -const EVENT_CLOSE = `close${EVENT_KEY}` -const EVENT_CLOSED = `closed${EVENT_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_ALERT = 'alert' -const CLASS_NAME_FADE = 'fade' -const CLASS_NAME_SHOW = 'show' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Alert extends BaseComponent { - // Getters - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - close(element) { - const rootElement = element ? this._getRootElement(element) : this._element - const customEvent = this._triggerCloseEvent(rootElement) - - if (customEvent === null || customEvent.defaultPrevented) { - return - } - - this._removeElement(rootElement) - } - - // Private - - _getRootElement(element) { - return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`) - } - - _triggerCloseEvent(element) { - return EventHandler.trigger(element, EVENT_CLOSE) - } - - _removeElement(element) { - element.classList.remove(CLASS_NAME_SHOW) - - if (!element.classList.contains(CLASS_NAME_FADE)) { - this._destroyElement(element) - return - } - - const transitionDuration = getTransitionDurationFromElement(element) - - EventHandler.one(element, 'transitionend', () => this._destroyElement(element)) - emulateTransitionEnd(element, transitionDuration) - } - - _destroyElement(element) { - if (element.parentNode) { - element.parentNode.removeChild(element) - } - - EventHandler.trigger(element, EVENT_CLOSED) - } - - // Static - - static jQueryInterface(config) { - return this.each(function () { - let data = Data.get(this, DATA_KEY) - - if (!data) { - data = new Alert(this) - } - - if (config === 'close') { - data[config](this) - } - }) - } - - static handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault() - } - - alertInstance.close(this) - } - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert())) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Alert to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Alert) - -export default Alert diff --git a/build/vendor/bootstrap/js/src/base-component.js b/build/vendor/bootstrap/js/src/base-component.js deleted file mode 100644 index a0bb623..0000000 --- a/build/vendor/bootstrap/js/src/base-component.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): base-component.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import Data from './dom/data' -import EventHandler from './dom/event-handler' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const VERSION = '5.0.0' - -class BaseComponent { - constructor(element) { - element = typeof element === 'string' ? document.querySelector(element) : element - - if (!element) { - return - } - - this._element = element - Data.set(this._element, this.constructor.DATA_KEY, this) - } - - dispose() { - Data.remove(this._element, this.constructor.DATA_KEY) - EventHandler.off(this._element, `.${this.constructor.DATA_KEY}`) - this._element = null - } - - /** Static */ - - static getInstance(element) { - return Data.get(element, this.DATA_KEY) - } - - static get VERSION() { - return VERSION - } -} - -export default BaseComponent diff --git a/build/vendor/bootstrap/js/src/button.js b/build/vendor/bootstrap/js/src/button.js deleted file mode 100644 index 45c691d..0000000 --- a/build/vendor/bootstrap/js/src/button.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): button.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { defineJQueryPlugin } from './util/index' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'button' -const DATA_KEY = 'bs.button' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const CLASS_NAME_ACTIVE = 'active' - -const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]' - -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Button extends BaseComponent { - // Getters - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - toggle() { - // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method - this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)) - } - - // Static - - static jQueryInterface(config) { - return this.each(function () { - let data = Data.get(this, DATA_KEY) - - if (!data) { - data = new Button(this) - } - - if (config === 'toggle') { - data[config]() - } - }) - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => { - event.preventDefault() - - const button = event.target.closest(SELECTOR_DATA_TOGGLE) - - let data = Data.get(button, DATA_KEY) - if (!data) { - data = new Button(button) - } - - data.toggle() -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Button to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Button) - -export default Button diff --git a/build/vendor/bootstrap/js/src/carousel.js b/build/vendor/bootstrap/js/src/carousel.js deleted file mode 100644 index 5bf7225..0000000 --- a/build/vendor/bootstrap/js/src/carousel.js +++ /dev/null @@ -1,622 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): carousel.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - emulateTransitionEnd, - getElementFromSelector, - getTransitionDurationFromElement, - isRTL, - isVisible, - reflow, - triggerTransitionEnd, - typeCheckConfig -} from './util/index' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import Manipulator from './dom/manipulator' -import SelectorEngine from './dom/selector-engine' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'carousel' -const DATA_KEY = 'bs.carousel' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const ARROW_LEFT_KEY = 'ArrowLeft' -const ARROW_RIGHT_KEY = 'ArrowRight' -const TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch -const SWIPE_THRESHOLD = 40 - -const Default = { - interval: 5000, - keyboard: true, - slide: false, - pause: 'hover', - wrap: true, - touch: true -} - -const DefaultType = { - interval: '(number|boolean)', - keyboard: 'boolean', - slide: '(boolean|string)', - pause: '(string|boolean)', - wrap: 'boolean', - touch: 'boolean' -} - -const ORDER_NEXT = 'next' -const ORDER_PREV = 'prev' -const DIRECTION_LEFT = 'left' -const DIRECTION_RIGHT = 'right' - -const EVENT_SLIDE = `slide${EVENT_KEY}` -const EVENT_SLID = `slid${EVENT_KEY}` -const EVENT_KEYDOWN = `keydown${EVENT_KEY}` -const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}` -const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}` -const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}` -const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}` -const EVENT_TOUCHEND = `touchend${EVENT_KEY}` -const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}` -const EVENT_POINTERUP = `pointerup${EVENT_KEY}` -const EVENT_DRAG_START = `dragstart${EVENT_KEY}` -const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_CAROUSEL = 'carousel' -const CLASS_NAME_ACTIVE = 'active' -const CLASS_NAME_SLIDE = 'slide' -const CLASS_NAME_END = 'carousel-item-end' -const CLASS_NAME_START = 'carousel-item-start' -const CLASS_NAME_NEXT = 'carousel-item-next' -const CLASS_NAME_PREV = 'carousel-item-prev' -const CLASS_NAME_POINTER_EVENT = 'pointer-event' - -const SELECTOR_ACTIVE = '.active' -const SELECTOR_ACTIVE_ITEM = '.active.carousel-item' -const SELECTOR_ITEM = '.carousel-item' -const SELECTOR_ITEM_IMG = '.carousel-item img' -const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev' -const SELECTOR_INDICATORS = '.carousel-indicators' -const SELECTOR_INDICATOR = '[data-bs-target]' -const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]' -const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]' - -const POINTER_TYPE_TOUCH = 'touch' -const POINTER_TYPE_PEN = 'pen' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ -class Carousel extends BaseComponent { - constructor(element, config) { - super(element) - - this._items = null - this._interval = null - this._activeElement = null - this._isPaused = false - this._isSliding = false - this.touchTimeout = null - this.touchStartX = 0 - this.touchDeltaX = 0 - - this._config = this._getConfig(config) - this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element) - this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0 - this._pointerEvent = Boolean(window.PointerEvent) - - this._addEventListeners() - } - - // Getters - - static get Default() { - return Default - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - next() { - if (!this._isSliding) { - this._slide(ORDER_NEXT) - } - } - - nextWhenVisible() { - // Don't call next when the page isn't visible - // or the carousel or its parent isn't visible - if (!document.hidden && isVisible(this._element)) { - this.next() - } - } - - prev() { - if (!this._isSliding) { - this._slide(ORDER_PREV) - } - } - - pause(event) { - if (!event) { - this._isPaused = true - } - - if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) { - triggerTransitionEnd(this._element) - this.cycle(true) - } - - clearInterval(this._interval) - this._interval = null - } - - cycle(event) { - if (!event) { - this._isPaused = false - } - - if (this._interval) { - clearInterval(this._interval) - this._interval = null - } - - if (this._config && this._config.interval && !this._isPaused) { - this._updateInterval() - - this._interval = setInterval( - (document.visibilityState ? this.nextWhenVisible : this.next).bind(this), - this._config.interval - ) - } - } - - to(index) { - this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element) - const activeIndex = this._getItemIndex(this._activeElement) - - if (index > this._items.length - 1 || index < 0) { - return - } - - if (this._isSliding) { - EventHandler.one(this._element, EVENT_SLID, () => this.to(index)) - return - } - - if (activeIndex === index) { - this.pause() - this.cycle() - return - } - - const order = index > activeIndex ? - ORDER_NEXT : - ORDER_PREV - - this._slide(order, this._items[index]) - } - - dispose() { - this._items = null - this._config = null - this._interval = null - this._isPaused = null - this._isSliding = null - this._activeElement = null - this._indicatorsElement = null - - super.dispose() - } - - // Private - - _getConfig(config) { - config = { - ...Default, - ...config - } - typeCheckConfig(NAME, config, DefaultType) - return config - } - - _handleSwipe() { - const absDeltax = Math.abs(this.touchDeltaX) - - if (absDeltax <= SWIPE_THRESHOLD) { - return - } - - const direction = absDeltax / this.touchDeltaX - - this.touchDeltaX = 0 - - if (!direction) { - return - } - - this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT) - } - - _addEventListeners() { - if (this._config.keyboard) { - EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event)) - } - - if (this._config.pause === 'hover') { - EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event)) - EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event)) - } - - if (this._config.touch && this._touchSupported) { - this._addTouchEventListeners() - } - } - - _addTouchEventListeners() { - const start = event => { - if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) { - this.touchStartX = event.clientX - } else if (!this._pointerEvent) { - this.touchStartX = event.touches[0].clientX - } - } - - const move = event => { - // ensure swiping with one touch and not pinching - this.touchDeltaX = event.touches && event.touches.length > 1 ? - 0 : - event.touches[0].clientX - this.touchStartX - } - - const end = event => { - if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) { - this.touchDeltaX = event.clientX - this.touchStartX - } - - this._handleSwipe() - if (this._config.pause === 'hover') { - // If it's a touch-enabled device, mouseenter/leave are fired as - // part of the mouse compatibility events on first tap - the carousel - // would stop cycling until user tapped out of it; - // here, we listen for touchend, explicitly pause the carousel - // (as if it's the second time we tap on it, mouseenter compat event - // is NOT fired) and after a timeout (to allow for mouse compatibility - // events to fire) we explicitly restart cycling - - this.pause() - if (this.touchTimeout) { - clearTimeout(this.touchTimeout) - } - - this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval) - } - } - - SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => { - EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault()) - }) - - if (this._pointerEvent) { - EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event)) - EventHandler.on(this._element, EVENT_POINTERUP, event => end(event)) - - this._element.classList.add(CLASS_NAME_POINTER_EVENT) - } else { - EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event)) - EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event)) - EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event)) - } - } - - _keydown(event) { - if (/input|textarea/i.test(event.target.tagName)) { - return - } - - if (event.key === ARROW_LEFT_KEY) { - event.preventDefault() - this._slide(DIRECTION_RIGHT) - } else if (event.key === ARROW_RIGHT_KEY) { - event.preventDefault() - this._slide(DIRECTION_LEFT) - } - } - - _getItemIndex(element) { - this._items = element && element.parentNode ? - SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : - [] - - return this._items.indexOf(element) - } - - _getItemByOrder(order, activeElement) { - const isNext = order === ORDER_NEXT - const isPrev = order === ORDER_PREV - const activeIndex = this._getItemIndex(activeElement) - const lastItemIndex = this._items.length - 1 - const isGoingToWrap = (isPrev && activeIndex === 0) || (isNext && activeIndex === lastItemIndex) - - if (isGoingToWrap && !this._config.wrap) { - return activeElement - } - - const delta = isPrev ? -1 : 1 - const itemIndex = (activeIndex + delta) % this._items.length - - return itemIndex === -1 ? - this._items[this._items.length - 1] : - this._items[itemIndex] - } - - _triggerSlideEvent(relatedTarget, eventDirectionName) { - const targetIndex = this._getItemIndex(relatedTarget) - const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)) - - return EventHandler.trigger(this._element, EVENT_SLIDE, { - relatedTarget, - direction: eventDirectionName, - from: fromIndex, - to: targetIndex - }) - } - - _setActiveIndicatorElement(element) { - if (this._indicatorsElement) { - const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement) - - activeIndicator.classList.remove(CLASS_NAME_ACTIVE) - activeIndicator.removeAttribute('aria-current') - - const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement) - - for (let i = 0; i < indicators.length; i++) { - if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) { - indicators[i].classList.add(CLASS_NAME_ACTIVE) - indicators[i].setAttribute('aria-current', 'true') - break - } - } - } - } - - _updateInterval() { - const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element) - - if (!element) { - return - } - - const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10) - - if (elementInterval) { - this._config.defaultInterval = this._config.defaultInterval || this._config.interval - this._config.interval = elementInterval - } else { - this._config.interval = this._config.defaultInterval || this._config.interval - } - } - - _slide(directionOrOrder, element) { - const order = this._directionToOrder(directionOrOrder) - const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element) - const activeElementIndex = this._getItemIndex(activeElement) - const nextElement = element || this._getItemByOrder(order, activeElement) - - const nextElementIndex = this._getItemIndex(nextElement) - const isCycling = Boolean(this._interval) - - const isNext = order === ORDER_NEXT - const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END - const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV - const eventDirectionName = this._orderToDirection(order) - - if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) { - this._isSliding = false - return - } - - const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName) - if (slideEvent.defaultPrevented) { - return - } - - if (!activeElement || !nextElement) { - // Some weirdness is happening, so we bail - return - } - - this._isSliding = true - - if (isCycling) { - this.pause() - } - - this._setActiveIndicatorElement(nextElement) - this._activeElement = nextElement - - if (this._element.classList.contains(CLASS_NAME_SLIDE)) { - nextElement.classList.add(orderClassName) - - reflow(nextElement) - - activeElement.classList.add(directionalClassName) - nextElement.classList.add(directionalClassName) - - const transitionDuration = getTransitionDurationFromElement(activeElement) - - EventHandler.one(activeElement, 'transitionend', () => { - nextElement.classList.remove(directionalClassName, orderClassName) - nextElement.classList.add(CLASS_NAME_ACTIVE) - - activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName) - - this._isSliding = false - - setTimeout(() => { - EventHandler.trigger(this._element, EVENT_SLID, { - relatedTarget: nextElement, - direction: eventDirectionName, - from: activeElementIndex, - to: nextElementIndex - }) - }, 0) - }) - - emulateTransitionEnd(activeElement, transitionDuration) - } else { - activeElement.classList.remove(CLASS_NAME_ACTIVE) - nextElement.classList.add(CLASS_NAME_ACTIVE) - - this._isSliding = false - EventHandler.trigger(this._element, EVENT_SLID, { - relatedTarget: nextElement, - direction: eventDirectionName, - from: activeElementIndex, - to: nextElementIndex - }) - } - - if (isCycling) { - this.cycle() - } - } - - _directionToOrder(direction) { - if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) { - return direction - } - - if (isRTL()) { - return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT - } - - return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV - } - - _orderToDirection(order) { - if (![ORDER_NEXT, ORDER_PREV].includes(order)) { - return order - } - - if (isRTL()) { - return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT - } - - return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT - } - - // Static - - static carouselInterface(element, config) { - let data = Data.get(element, DATA_KEY) - let _config = { - ...Default, - ...Manipulator.getDataAttributes(element) - } - - if (typeof config === 'object') { - _config = { - ..._config, - ...config - } - } - - const action = typeof config === 'string' ? config : _config.slide - - if (!data) { - data = new Carousel(element, _config) - } - - if (typeof config === 'number') { - data.to(config) - } else if (typeof action === 'string') { - if (typeof data[action] === 'undefined') { - throw new TypeError(`No method named "${action}"`) - } - - data[action]() - } else if (_config.interval && _config.ride) { - data.pause() - data.cycle() - } - } - - static jQueryInterface(config) { - return this.each(function () { - Carousel.carouselInterface(this, config) - }) - } - - static dataApiClickHandler(event) { - const target = getElementFromSelector(this) - - if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { - return - } - - const config = { - ...Manipulator.getDataAttributes(target), - ...Manipulator.getDataAttributes(this) - } - const slideIndex = this.getAttribute('data-bs-slide-to') - - if (slideIndex) { - config.interval = false - } - - Carousel.carouselInterface(target, config) - - if (slideIndex) { - Data.get(target, DATA_KEY).to(slideIndex) - } - - event.preventDefault() - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler) - -EventHandler.on(window, EVENT_LOAD_DATA_API, () => { - const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE) - - for (let i = 0, len = carousels.length; i < len; i++) { - Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY)) - } -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Carousel to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Carousel) - -export default Carousel diff --git a/build/vendor/bootstrap/js/src/collapse.js b/build/vendor/bootstrap/js/src/collapse.js deleted file mode 100644 index 947b6e6..0000000 --- a/build/vendor/bootstrap/js/src/collapse.js +++ /dev/null @@ -1,410 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): collapse.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - emulateTransitionEnd, - getSelectorFromElement, - getElementFromSelector, - getTransitionDurationFromElement, - isElement, - reflow, - typeCheckConfig -} from './util/index' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import Manipulator from './dom/manipulator' -import SelectorEngine from './dom/selector-engine' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'collapse' -const DATA_KEY = 'bs.collapse' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const Default = { - toggle: true, - parent: '' -} - -const DefaultType = { - toggle: 'boolean', - parent: '(string|element)' -} - -const EVENT_SHOW = `show${EVENT_KEY}` -const EVENT_SHOWN = `shown${EVENT_KEY}` -const EVENT_HIDE = `hide${EVENT_KEY}` -const EVENT_HIDDEN = `hidden${EVENT_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_SHOW = 'show' -const CLASS_NAME_COLLAPSE = 'collapse' -const CLASS_NAME_COLLAPSING = 'collapsing' -const CLASS_NAME_COLLAPSED = 'collapsed' - -const WIDTH = 'width' -const HEIGHT = 'height' - -const SELECTOR_ACTIVES = '.show, .collapsing' -const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Collapse extends BaseComponent { - constructor(element, config) { - super(element) - - this._isTransitioning = false - this._config = this._getConfig(config) - this._triggerArray = SelectorEngine.find( - `${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` + - `${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]` - ) - - const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE) - - for (let i = 0, len = toggleList.length; i < len; i++) { - const elem = toggleList[i] - const selector = getSelectorFromElement(elem) - const filterElement = SelectorEngine.find(selector) - .filter(foundElem => foundElem === this._element) - - if (selector !== null && filterElement.length) { - this._selector = selector - this._triggerArray.push(elem) - } - } - - this._parent = this._config.parent ? this._getParent() : null - - if (!this._config.parent) { - this._addAriaAndCollapsedClass(this._element, this._triggerArray) - } - - if (this._config.toggle) { - this.toggle() - } - } - - // Getters - - static get Default() { - return Default - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - toggle() { - if (this._element.classList.contains(CLASS_NAME_SHOW)) { - this.hide() - } else { - this.show() - } - } - - show() { - if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) { - return - } - - let actives - let activesData - - if (this._parent) { - actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent) - .filter(elem => { - if (typeof this._config.parent === 'string') { - return elem.getAttribute('data-bs-parent') === this._config.parent - } - - return elem.classList.contains(CLASS_NAME_COLLAPSE) - }) - - if (actives.length === 0) { - actives = null - } - } - - const container = SelectorEngine.findOne(this._selector) - if (actives) { - const tempActiveData = actives.find(elem => container !== elem) - activesData = tempActiveData ? Data.get(tempActiveData, DATA_KEY) : null - - if (activesData && activesData._isTransitioning) { - return - } - } - - const startEvent = EventHandler.trigger(this._element, EVENT_SHOW) - if (startEvent.defaultPrevented) { - return - } - - if (actives) { - actives.forEach(elemActive => { - if (container !== elemActive) { - Collapse.collapseInterface(elemActive, 'hide') - } - - if (!activesData) { - Data.set(elemActive, DATA_KEY, null) - } - }) - } - - const dimension = this._getDimension() - - this._element.classList.remove(CLASS_NAME_COLLAPSE) - this._element.classList.add(CLASS_NAME_COLLAPSING) - - this._element.style[dimension] = 0 - - if (this._triggerArray.length) { - this._triggerArray.forEach(element => { - element.classList.remove(CLASS_NAME_COLLAPSED) - element.setAttribute('aria-expanded', true) - }) - } - - this.setTransitioning(true) - - const complete = () => { - this._element.classList.remove(CLASS_NAME_COLLAPSING) - this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW) - - this._element.style[dimension] = '' - - this.setTransitioning(false) - - EventHandler.trigger(this._element, EVENT_SHOWN) - } - - const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1) - const scrollSize = `scroll${capitalizedDimension}` - const transitionDuration = getTransitionDurationFromElement(this._element) - - EventHandler.one(this._element, 'transitionend', complete) - - emulateTransitionEnd(this._element, transitionDuration) - this._element.style[dimension] = `${this._element[scrollSize]}px` - } - - hide() { - if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) { - return - } - - const startEvent = EventHandler.trigger(this._element, EVENT_HIDE) - if (startEvent.defaultPrevented) { - return - } - - const dimension = this._getDimension() - - this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px` - - reflow(this._element) - - this._element.classList.add(CLASS_NAME_COLLAPSING) - this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW) - - const triggerArrayLength = this._triggerArray.length - if (triggerArrayLength > 0) { - for (let i = 0; i < triggerArrayLength; i++) { - const trigger = this._triggerArray[i] - const elem = getElementFromSelector(trigger) - - if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) { - trigger.classList.add(CLASS_NAME_COLLAPSED) - trigger.setAttribute('aria-expanded', false) - } - } - } - - this.setTransitioning(true) - - const complete = () => { - this.setTransitioning(false) - this._element.classList.remove(CLASS_NAME_COLLAPSING) - this._element.classList.add(CLASS_NAME_COLLAPSE) - EventHandler.trigger(this._element, EVENT_HIDDEN) - } - - this._element.style[dimension] = '' - const transitionDuration = getTransitionDurationFromElement(this._element) - - EventHandler.one(this._element, 'transitionend', complete) - emulateTransitionEnd(this._element, transitionDuration) - } - - setTransitioning(isTransitioning) { - this._isTransitioning = isTransitioning - } - - dispose() { - super.dispose() - this._config = null - this._parent = null - this._triggerArray = null - this._isTransitioning = null - } - - // Private - - _getConfig(config) { - config = { - ...Default, - ...config - } - config.toggle = Boolean(config.toggle) // Coerce string values - typeCheckConfig(NAME, config, DefaultType) - return config - } - - _getDimension() { - return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT - } - - _getParent() { - let { parent } = this._config - - if (isElement(parent)) { - // it's a jQuery object - if (typeof parent.jquery !== 'undefined' || typeof parent[0] !== 'undefined') { - parent = parent[0] - } - } else { - parent = SelectorEngine.findOne(parent) - } - - const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent="${parent}"]` - - SelectorEngine.find(selector, parent) - .forEach(element => { - const selected = getElementFromSelector(element) - - this._addAriaAndCollapsedClass( - selected, - [element] - ) - }) - - return parent - } - - _addAriaAndCollapsedClass(element, triggerArray) { - if (!element || !triggerArray.length) { - return - } - - const isOpen = element.classList.contains(CLASS_NAME_SHOW) - - triggerArray.forEach(elem => { - if (isOpen) { - elem.classList.remove(CLASS_NAME_COLLAPSED) - } else { - elem.classList.add(CLASS_NAME_COLLAPSED) - } - - elem.setAttribute('aria-expanded', isOpen) - }) - } - - // Static - - static collapseInterface(element, config) { - let data = Data.get(element, DATA_KEY) - const _config = { - ...Default, - ...Manipulator.getDataAttributes(element), - ...(typeof config === 'object' && config ? config : {}) - } - - if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { - _config.toggle = false - } - - if (!data) { - data = new Collapse(element, _config) - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError(`No method named "${config}"`) - } - - data[config]() - } - } - - static jQueryInterface(config) { - return this.each(function () { - Collapse.collapseInterface(this, config) - }) - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - // preventDefault only for elements (which change the URL) not inside the collapsible element - if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) { - event.preventDefault() - } - - const triggerData = Manipulator.getDataAttributes(this) - const selector = getSelectorFromElement(this) - const selectorElements = SelectorEngine.find(selector) - - selectorElements.forEach(element => { - const data = Data.get(element, DATA_KEY) - let config - if (data) { - // update parent attribute - if (data._parent === null && typeof triggerData.parent === 'string') { - data._config.parent = triggerData.parent - data._parent = data._getParent() - } - - config = 'toggle' - } else { - config = triggerData - } - - Collapse.collapseInterface(element, config) - }) -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Collapse to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Collapse) - -export default Collapse diff --git a/build/vendor/bootstrap/js/src/dom/data.js b/build/vendor/bootstrap/js/src/dom/data.js deleted file mode 100644 index 5e47365..0000000 --- a/build/vendor/bootstrap/js/src/dom/data.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): dom/data.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const elementMap = new Map() - -export default { - set(element, key, instance) { - if (!elementMap.has(element)) { - elementMap.set(element, new Map()) - } - - const instanceMap = elementMap.get(element) - - // make it clear we only want one instance per element - // can be removed later when multiple key/instances are fine to be used - if (!instanceMap.has(key) && instanceMap.size !== 0) { - // eslint-disable-next-line no-console - console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`) - return - } - - instanceMap.set(key, instance) - }, - - get(element, key) { - if (elementMap.has(element)) { - return elementMap.get(element).get(key) || null - } - - return null - }, - - remove(element, key) { - if (!elementMap.has(element)) { - return - } - - const instanceMap = elementMap.get(element) - - instanceMap.delete(key) - - // free up element references if there are no instances left for an element - if (instanceMap.size === 0) { - elementMap.delete(element) - } - } -} diff --git a/build/vendor/bootstrap/js/src/dom/event-handler.js b/build/vendor/bootstrap/js/src/dom/event-handler.js deleted file mode 100644 index 3729f38..0000000 --- a/build/vendor/bootstrap/js/src/dom/event-handler.js +++ /dev/null @@ -1,349 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): dom/event-handler.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { getjQuery } from '../util/index' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const namespaceRegex = /[^.]*(?=\..*)\.|.*/ -const stripNameRegex = /\..*/ -const stripUidRegex = /::\d+$/ -const eventRegistry = {} // Events storage -let uidEvent = 1 -const customEvents = { - mouseenter: 'mouseover', - mouseleave: 'mouseout' -} -const customEventsRegex = /^(mouseenter|mouseleave)/i -const nativeEvents = new Set([ - 'click', - 'dblclick', - 'mouseup', - 'mousedown', - 'contextmenu', - 'mousewheel', - 'DOMMouseScroll', - 'mouseover', - 'mouseout', - 'mousemove', - 'selectstart', - 'selectend', - 'keydown', - 'keypress', - 'keyup', - 'orientationchange', - 'touchstart', - 'touchmove', - 'touchend', - 'touchcancel', - 'pointerdown', - 'pointermove', - 'pointerup', - 'pointerleave', - 'pointercancel', - 'gesturestart', - 'gesturechange', - 'gestureend', - 'focus', - 'blur', - 'change', - 'reset', - 'select', - 'submit', - 'focusin', - 'focusout', - 'load', - 'unload', - 'beforeunload', - 'resize', - 'move', - 'DOMContentLoaded', - 'readystatechange', - 'error', - 'abort', - 'scroll' -]) - -/** - * ------------------------------------------------------------------------ - * Private methods - * ------------------------------------------------------------------------ - */ - -function getUidEvent(element, uid) { - return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++ -} - -function getEvent(element) { - const uid = getUidEvent(element) - - element.uidEvent = uid - eventRegistry[uid] = eventRegistry[uid] || {} - - return eventRegistry[uid] -} - -function bootstrapHandler(element, fn) { - return function handler(event) { - event.delegateTarget = element - - if (handler.oneOff) { - EventHandler.off(element, event.type, fn) - } - - return fn.apply(element, [event]) - } -} - -function bootstrapDelegationHandler(element, selector, fn) { - return function handler(event) { - const domElements = element.querySelectorAll(selector) - - for (let { target } = event; target && target !== this; target = target.parentNode) { - for (let i = domElements.length; i--;) { - if (domElements[i] === target) { - event.delegateTarget = target - - if (handler.oneOff) { - // eslint-disable-next-line unicorn/consistent-destructuring - EventHandler.off(element, event.type, selector, fn) - } - - return fn.apply(target, [event]) - } - } - } - - // To please ESLint - return null - } -} - -function findHandler(events, handler, delegationSelector = null) { - const uidEventList = Object.keys(events) - - for (let i = 0, len = uidEventList.length; i < len; i++) { - const event = events[uidEventList[i]] - - if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { - return event - } - } - - return null -} - -function normalizeParams(originalTypeEvent, handler, delegationFn) { - const delegation = typeof handler === 'string' - const originalHandler = delegation ? delegationFn : handler - - let typeEvent = getTypeEvent(originalTypeEvent) - const isNative = nativeEvents.has(typeEvent) - - if (!isNative) { - typeEvent = originalTypeEvent - } - - return [delegation, originalHandler, typeEvent] -} - -function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) { - if (typeof originalTypeEvent !== 'string' || !element) { - return - } - - if (!handler) { - handler = delegationFn - delegationFn = null - } - - // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position - // this prevents the handler from being dispatched the same way as mouseover or mouseout does - if (customEventsRegex.test(originalTypeEvent)) { - const wrapFn = fn => { - return function (event) { - if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) { - return fn.call(this, event) - } - } - } - - if (delegationFn) { - delegationFn = wrapFn(delegationFn) - } else { - handler = wrapFn(handler) - } - } - - const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn) - const events = getEvent(element) - const handlers = events[typeEvent] || (events[typeEvent] = {}) - const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null) - - if (previousFn) { - previousFn.oneOff = previousFn.oneOff && oneOff - - return - } - - const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) - const fn = delegation ? - bootstrapDelegationHandler(element, handler, delegationFn) : - bootstrapHandler(element, handler) - - fn.delegationSelector = delegation ? handler : null - fn.originalHandler = originalHandler - fn.oneOff = oneOff - fn.uidEvent = uid - handlers[uid] = fn - - element.addEventListener(typeEvent, fn, delegation) -} - -function removeHandler(element, events, typeEvent, handler, delegationSelector) { - const fn = findHandler(events[typeEvent], handler, delegationSelector) - - if (!fn) { - return - } - - element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)) - delete events[typeEvent][fn.uidEvent] -} - -function removeNamespacedHandlers(element, events, typeEvent, namespace) { - const storeElementEvent = events[typeEvent] || {} - - Object.keys(storeElementEvent).forEach(handlerKey => { - if (handlerKey.includes(namespace)) { - const event = storeElementEvent[handlerKey] - - removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) - } - }) -} - -function getTypeEvent(event) { - // allow to get the native events from namespaced events ('click.bs.button' --> 'click') - event = event.replace(stripNameRegex, '') - return customEvents[event] || event -} - -const EventHandler = { - on(element, event, handler, delegationFn) { - addHandler(element, event, handler, delegationFn, false) - }, - - one(element, event, handler, delegationFn) { - addHandler(element, event, handler, delegationFn, true) - }, - - off(element, originalTypeEvent, handler, delegationFn) { - if (typeof originalTypeEvent !== 'string' || !element) { - return - } - - const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn) - const inNamespace = typeEvent !== originalTypeEvent - const events = getEvent(element) - const isNamespace = originalTypeEvent.startsWith('.') - - if (typeof originalHandler !== 'undefined') { - // Simplest case: handler is passed, remove that listener ONLY. - if (!events || !events[typeEvent]) { - return - } - - removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null) - return - } - - if (isNamespace) { - Object.keys(events).forEach(elementEvent => { - removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)) - }) - } - - const storeElementEvent = events[typeEvent] || {} - Object.keys(storeElementEvent).forEach(keyHandlers => { - const handlerKey = keyHandlers.replace(stripUidRegex, '') - - if (!inNamespace || originalTypeEvent.includes(handlerKey)) { - const event = storeElementEvent[keyHandlers] - - removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) - } - }) - }, - - trigger(element, event, args) { - if (typeof event !== 'string' || !element) { - return null - } - - const $ = getjQuery() - const typeEvent = getTypeEvent(event) - const inNamespace = event !== typeEvent - const isNative = nativeEvents.has(typeEvent) - - let jQueryEvent - let bubbles = true - let nativeDispatch = true - let defaultPrevented = false - let evt = null - - if (inNamespace && $) { - jQueryEvent = $.Event(event, args) - - $(element).trigger(jQueryEvent) - bubbles = !jQueryEvent.isPropagationStopped() - nativeDispatch = !jQueryEvent.isImmediatePropagationStopped() - defaultPrevented = jQueryEvent.isDefaultPrevented() - } - - if (isNative) { - evt = document.createEvent('HTMLEvents') - evt.initEvent(typeEvent, bubbles, true) - } else { - evt = new CustomEvent(event, { - bubbles, - cancelable: true - }) - } - - // merge custom information in our event - if (typeof args !== 'undefined') { - Object.keys(args).forEach(key => { - Object.defineProperty(evt, key, { - get() { - return args[key] - } - }) - }) - } - - if (defaultPrevented) { - evt.preventDefault() - } - - if (nativeDispatch) { - element.dispatchEvent(evt) - } - - if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') { - jQueryEvent.preventDefault() - } - - return evt - } -} - -export default EventHandler diff --git a/build/vendor/bootstrap/js/src/dom/manipulator.js b/build/vendor/bootstrap/js/src/dom/manipulator.js deleted file mode 100644 index 093f96c..0000000 --- a/build/vendor/bootstrap/js/src/dom/manipulator.js +++ /dev/null @@ -1,80 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): dom/manipulator.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -function normalizeData(val) { - if (val === 'true') { - return true - } - - if (val === 'false') { - return false - } - - if (val === Number(val).toString()) { - return Number(val) - } - - if (val === '' || val === 'null') { - return null - } - - return val -} - -function normalizeDataKey(key) { - return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`) -} - -const Manipulator = { - setDataAttribute(element, key, value) { - element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value) - }, - - removeDataAttribute(element, key) { - element.removeAttribute(`data-bs-${normalizeDataKey(key)}`) - }, - - getDataAttributes(element) { - if (!element) { - return {} - } - - const attributes = {} - - Object.keys(element.dataset) - .filter(key => key.startsWith('bs')) - .forEach(key => { - let pureKey = key.replace(/^bs/, '') - pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length) - attributes[pureKey] = normalizeData(element.dataset[key]) - }) - - return attributes - }, - - getDataAttribute(element, key) { - return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)) - }, - - offset(element) { - const rect = element.getBoundingClientRect() - - return { - top: rect.top + document.body.scrollTop, - left: rect.left + document.body.scrollLeft - } - }, - - position(element) { - return { - top: element.offsetTop, - left: element.offsetLeft - } - } -} - -export default Manipulator diff --git a/build/vendor/bootstrap/js/src/dom/selector-engine.js b/build/vendor/bootstrap/js/src/dom/selector-engine.js deleted file mode 100644 index 343dfbb..0000000 --- a/build/vendor/bootstrap/js/src/dom/selector-engine.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): dom/selector-engine.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NODE_TEXT = 3 - -const SelectorEngine = { - find(selector, element = document.documentElement) { - return [].concat(...Element.prototype.querySelectorAll.call(element, selector)) - }, - - findOne(selector, element = document.documentElement) { - return Element.prototype.querySelector.call(element, selector) - }, - - children(element, selector) { - return [].concat(...element.children) - .filter(child => child.matches(selector)) - }, - - parents(element, selector) { - const parents = [] - - let ancestor = element.parentNode - - while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { - if (ancestor.matches(selector)) { - parents.push(ancestor) - } - - ancestor = ancestor.parentNode - } - - return parents - }, - - prev(element, selector) { - let previous = element.previousElementSibling - - while (previous) { - if (previous.matches(selector)) { - return [previous] - } - - previous = previous.previousElementSibling - } - - return [] - }, - - next(element, selector) { - let next = element.nextElementSibling - - while (next) { - if (next.matches(selector)) { - return [next] - } - - next = next.nextElementSibling - } - - return [] - } -} - -export default SelectorEngine diff --git a/build/vendor/bootstrap/js/src/dropdown.js b/build/vendor/bootstrap/js/src/dropdown.js deleted file mode 100644 index bb2d01c..0000000 --- a/build/vendor/bootstrap/js/src/dropdown.js +++ /dev/null @@ -1,544 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): dropdown.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import * as Popper from '@popperjs/core' - -import { - defineJQueryPlugin, - getElementFromSelector, - isDisabled, - isElement, - isVisible, - isRTL, - noop, - typeCheckConfig -} from './util/index' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import Manipulator from './dom/manipulator' -import SelectorEngine from './dom/selector-engine' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'dropdown' -const DATA_KEY = 'bs.dropdown' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const ESCAPE_KEY = 'Escape' -const SPACE_KEY = 'Space' -const TAB_KEY = 'Tab' -const ARROW_UP_KEY = 'ArrowUp' -const ARROW_DOWN_KEY = 'ArrowDown' -const RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button - -const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`) - -const EVENT_HIDE = `hide${EVENT_KEY}` -const EVENT_HIDDEN = `hidden${EVENT_KEY}` -const EVENT_SHOW = `show${EVENT_KEY}` -const EVENT_SHOWN = `shown${EVENT_KEY}` -const EVENT_CLICK = `click${EVENT_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` -const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}` -const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_SHOW = 'show' -const CLASS_NAME_DROPUP = 'dropup' -const CLASS_NAME_DROPEND = 'dropend' -const CLASS_NAME_DROPSTART = 'dropstart' -const CLASS_NAME_NAVBAR = 'navbar' - -const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]' -const SELECTOR_MENU = '.dropdown-menu' -const SELECTOR_NAVBAR_NAV = '.navbar-nav' -const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' - -const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start' -const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end' -const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start' -const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end' -const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start' -const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start' - -const Default = { - offset: [0, 2], - boundary: 'clippingParents', - reference: 'toggle', - display: 'dynamic', - popperConfig: null, - autoClose: true -} - -const DefaultType = { - offset: '(array|string|function)', - boundary: '(string|element)', - reference: '(string|element|object)', - display: 'string', - popperConfig: '(null|object|function)', - autoClose: '(boolean|string)' -} - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Dropdown extends BaseComponent { - constructor(element, config) { - super(element) - - this._popper = null - this._config = this._getConfig(config) - this._menu = this._getMenuElement() - this._inNavbar = this._detectNavbar() - - this._addEventListeners() - } - - // Getters - - static get Default() { - return Default - } - - static get DefaultType() { - return DefaultType - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - toggle() { - if (isDisabled(this._element)) { - return - } - - const isActive = this._element.classList.contains(CLASS_NAME_SHOW) - - if (isActive) { - this.hide() - return - } - - this.show() - } - - show() { - if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) { - return - } - - const parent = Dropdown.getParentFromElement(this._element) - const relatedTarget = { - relatedTarget: this._element - } - - const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget) - - if (showEvent.defaultPrevented) { - return - } - - // Totally disable Popper for Dropdowns in Navbar - if (this._inNavbar) { - Manipulator.setDataAttribute(this._menu, 'popper', 'none') - } else { - if (typeof Popper === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)') - } - - let referenceElement = this._element - - if (this._config.reference === 'parent') { - referenceElement = parent - } else if (isElement(this._config.reference)) { - referenceElement = this._config.reference - - // Check if it's jQuery element - if (typeof this._config.reference.jquery !== 'undefined') { - referenceElement = this._config.reference[0] - } - } else if (typeof this._config.reference === 'object') { - referenceElement = this._config.reference - } - - const popperConfig = this._getPopperConfig() - const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false) - - this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig) - - if (isDisplayStatic) { - Manipulator.setDataAttribute(this._menu, 'popper', 'static') - } - } - - // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - if ('ontouchstart' in document.documentElement && - !parent.closest(SELECTOR_NAVBAR_NAV)) { - [].concat(...document.body.children) - .forEach(elem => EventHandler.on(elem, 'mouseover', noop)) - } - - this._element.focus() - this._element.setAttribute('aria-expanded', true) - - this._menu.classList.toggle(CLASS_NAME_SHOW) - this._element.classList.toggle(CLASS_NAME_SHOW) - EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget) - } - - hide() { - if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) { - return - } - - const relatedTarget = { - relatedTarget: this._element - } - - this._completeHide(relatedTarget) - } - - dispose() { - this._menu = null - - if (this._popper) { - this._popper.destroy() - this._popper = null - } - - super.dispose() - } - - update() { - this._inNavbar = this._detectNavbar() - if (this._popper) { - this._popper.update() - } - } - - // Private - - _addEventListeners() { - EventHandler.on(this._element, EVENT_CLICK, event => { - event.preventDefault() - this.toggle() - }) - } - - _completeHide(relatedTarget) { - const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget) - if (hideEvent.defaultPrevented) { - return - } - - // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - if ('ontouchstart' in document.documentElement) { - [].concat(...document.body.children) - .forEach(elem => EventHandler.off(elem, 'mouseover', noop)) - } - - if (this._popper) { - this._popper.destroy() - } - - this._menu.classList.remove(CLASS_NAME_SHOW) - this._element.classList.remove(CLASS_NAME_SHOW) - this._element.setAttribute('aria-expanded', 'false') - Manipulator.removeDataAttribute(this._menu, 'popper') - EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget) - } - - _getConfig(config) { - config = { - ...this.constructor.Default, - ...Manipulator.getDataAttributes(this._element), - ...config - } - - typeCheckConfig(NAME, config, this.constructor.DefaultType) - - if (typeof config.reference === 'object' && !isElement(config.reference) && - typeof config.reference.getBoundingClientRect !== 'function' - ) { - // Popper virtual elements require a getBoundingClientRect method - throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`) - } - - return config - } - - _getMenuElement() { - return SelectorEngine.next(this._element, SELECTOR_MENU)[0] - } - - _getPlacement() { - const parentDropdown = this._element.parentNode - - if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { - return PLACEMENT_RIGHT - } - - if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { - return PLACEMENT_LEFT - } - - // We need to trim the value because custom properties can also include spaces - const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end' - - if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { - return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP - } - - return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM - } - - _detectNavbar() { - return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null - } - - _getOffset() { - const { offset } = this._config - - if (typeof offset === 'string') { - return offset.split(',').map(val => Number.parseInt(val, 10)) - } - - if (typeof offset === 'function') { - return popperData => offset(popperData, this._element) - } - - return offset - } - - _getPopperConfig() { - const defaultBsPopperConfig = { - placement: this._getPlacement(), - modifiers: [{ - name: 'preventOverflow', - options: { - boundary: this._config.boundary - } - }, - { - name: 'offset', - options: { - offset: this._getOffset() - } - }] - } - - // Disable Popper if we have a static display - if (this._config.display === 'static') { - defaultBsPopperConfig.modifiers = [{ - name: 'applyStyles', - enabled: false - }] - } - - return { - ...defaultBsPopperConfig, - ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) - } - } - - _selectMenuItem(event) { - const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible) - - if (!items.length) { - return - } - - let index = items.indexOf(event.target) - - // Up - if (event.key === ARROW_UP_KEY && index > 0) { - index-- - } - - // Down - if (event.key === ARROW_DOWN_KEY && index < items.length - 1) { - index++ - } - - // index is -1 if the first keydown is an ArrowUp - index = index === -1 ? 0 : index - - items[index].focus() - } - - // Static - - static dropdownInterface(element, config) { - let data = Data.get(element, DATA_KEY) - const _config = typeof config === 'object' ? config : null - - if (!data) { - data = new Dropdown(element, _config) - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError(`No method named "${config}"`) - } - - data[config]() - } - } - - static jQueryInterface(config) { - return this.each(function () { - Dropdown.dropdownInterface(this, config) - }) - } - - static clearMenus(event) { - if (event) { - if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) { - return - } - - if (/input|select|option|textarea|form/i.test(event.target.tagName)) { - return - } - } - - const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE) - - for (let i = 0, len = toggles.length; i < len; i++) { - const context = Data.get(toggles[i], DATA_KEY) - if (!context || context._config.autoClose === false) { - continue - } - - if (!context._element.classList.contains(CLASS_NAME_SHOW)) { - continue - } - - const relatedTarget = { - relatedTarget: context._element - } - - if (event) { - const composedPath = event.composedPath() - const isMenuTarget = composedPath.includes(context._menu) - if ( - composedPath.includes(context._element) || - (context._config.autoClose === 'inside' && !isMenuTarget) || - (context._config.autoClose === 'outside' && isMenuTarget) - ) { - continue - } - - // Tab navigation through the dropdown menu shouldn't close the menu - if (event.type === 'keyup' && event.key === TAB_KEY && context._menu.contains(event.target)) { - continue - } - - if (event.type === 'click') { - relatedTarget.clickEvent = event - } - } - - context._completeHide(relatedTarget) - } - } - - static getParentFromElement(element) { - return getElementFromSelector(element) || element.parentNode - } - - static dataApiKeydownHandler(event) { - // If not input/textarea: - // - And not a key in REGEXP_KEYDOWN => not a dropdown command - // If input/textarea: - // - If space key => not a dropdown command - // - If key is other than escape - // - If key is not up or down => not a dropdown command - // - If trigger inside the menu => not a dropdown command - if (/input|textarea/i.test(event.target.tagName) ? - event.key === SPACE_KEY || (event.key !== ESCAPE_KEY && - ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) || - event.target.closest(SELECTOR_MENU))) : - !REGEXP_KEYDOWN.test(event.key)) { - return - } - - const isActive = this.classList.contains(CLASS_NAME_SHOW) - - if (!isActive && event.key === ESCAPE_KEY) { - return - } - - event.preventDefault() - event.stopPropagation() - - if (isDisabled(this)) { - return - } - - const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] - - if (event.key === ESCAPE_KEY) { - getToggleButton().focus() - Dropdown.clearMenus() - return - } - - if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) { - getToggleButton().click() - return - } - - if (!isActive || event.key === SPACE_KEY) { - Dropdown.clearMenus() - return - } - - Dropdown.getInstance(getToggleButton())._selectMenuItem(event) - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler) -EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler) -EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus) -EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus) -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - event.preventDefault() - Dropdown.dropdownInterface(this) -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Dropdown to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Dropdown) - -export default Dropdown diff --git a/build/vendor/bootstrap/js/src/modal.js b/build/vendor/bootstrap/js/src/modal.js deleted file mode 100644 index 773e426..0000000 --- a/build/vendor/bootstrap/js/src/modal.js +++ /dev/null @@ -1,467 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): modal.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - emulateTransitionEnd, - getElementFromSelector, - getTransitionDurationFromElement, - isRTL, - isVisible, - reflow, - typeCheckConfig -} from './util/index' -import EventHandler from './dom/event-handler' -import Manipulator from './dom/manipulator' -import SelectorEngine from './dom/selector-engine' -import { getWidth as getScrollBarWidth, hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar' -import BaseComponent from './base-component' -import Backdrop from './util/backdrop' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'modal' -const DATA_KEY = 'bs.modal' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' -const ESCAPE_KEY = 'Escape' - -const Default = { - backdrop: true, - keyboard: true, - focus: true -} - -const DefaultType = { - backdrop: '(boolean|string)', - keyboard: 'boolean', - focus: 'boolean' -} - -const EVENT_HIDE = `hide${EVENT_KEY}` -const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}` -const EVENT_HIDDEN = `hidden${EVENT_KEY}` -const EVENT_SHOW = `show${EVENT_KEY}` -const EVENT_SHOWN = `shown${EVENT_KEY}` -const EVENT_FOCUSIN = `focusin${EVENT_KEY}` -const EVENT_RESIZE = `resize${EVENT_KEY}` -const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}` -const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}` -const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}` -const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_OPEN = 'modal-open' -const CLASS_NAME_FADE = 'fade' -const CLASS_NAME_SHOW = 'show' -const CLASS_NAME_STATIC = 'modal-static' - -const SELECTOR_DIALOG = '.modal-dialog' -const SELECTOR_MODAL_BODY = '.modal-body' -const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]' -const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="modal"]' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Modal extends BaseComponent { - constructor(element, config) { - super(element) - - this._config = this._getConfig(config) - this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element) - this._backdrop = this._initializeBackDrop() - this._isShown = false - this._ignoreBackdropClick = false - this._isTransitioning = false - } - - // Getters - - static get Default() { - return Default - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget) - } - - show(relatedTarget) { - if (this._isShown || this._isTransitioning) { - return - } - - if (this._isAnimated()) { - this._isTransitioning = true - } - - const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { - relatedTarget - }) - - if (this._isShown || showEvent.defaultPrevented) { - return - } - - this._isShown = true - - scrollBarHide() - - document.body.classList.add(CLASS_NAME_OPEN) - - this._adjustDialog() - - this._setEscapeEvent() - this._setResizeEvent() - - EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event)) - - EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => { - EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => { - if (event.target === this._element) { - this._ignoreBackdropClick = true - } - }) - }) - - this._showBackdrop(() => this._showElement(relatedTarget)) - } - - hide(event) { - if (event) { - event.preventDefault() - } - - if (!this._isShown || this._isTransitioning) { - return - } - - const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE) - - if (hideEvent.defaultPrevented) { - return - } - - this._isShown = false - const isAnimated = this._isAnimated() - - if (isAnimated) { - this._isTransitioning = true - } - - this._setEscapeEvent() - this._setResizeEvent() - - EventHandler.off(document, EVENT_FOCUSIN) - - this._element.classList.remove(CLASS_NAME_SHOW) - - EventHandler.off(this._element, EVENT_CLICK_DISMISS) - EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS) - - if (isAnimated) { - const transitionDuration = getTransitionDurationFromElement(this._element) - - EventHandler.one(this._element, 'transitionend', event => this._hideModal(event)) - emulateTransitionEnd(this._element, transitionDuration) - } else { - this._hideModal() - } - } - - dispose() { - [window, this._dialog] - .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY)) - - super.dispose() - - /** - * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` - * Do not move `document` in `htmlElements` array - * It will remove `EVENT_CLICK_DATA_API` event that should remain - */ - EventHandler.off(document, EVENT_FOCUSIN) - - this._config = null - this._dialog = null - this._backdrop.dispose() - this._backdrop = null - this._isShown = null - this._ignoreBackdropClick = null - this._isTransitioning = null - } - - handleUpdate() { - this._adjustDialog() - } - - // Private - - _initializeBackDrop() { - return new Backdrop({ - isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value - isAnimated: this._isAnimated() - }) - } - - _getConfig(config) { - config = { - ...Default, - ...Manipulator.getDataAttributes(this._element), - ...config - } - typeCheckConfig(NAME, config, DefaultType) - return config - } - - _showElement(relatedTarget) { - const isAnimated = this._isAnimated() - const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog) - - if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { - // Don't move modal's DOM position - document.body.appendChild(this._element) - } - - this._element.style.display = 'block' - this._element.removeAttribute('aria-hidden') - this._element.setAttribute('aria-modal', true) - this._element.setAttribute('role', 'dialog') - this._element.scrollTop = 0 - - if (modalBody) { - modalBody.scrollTop = 0 - } - - if (isAnimated) { - reflow(this._element) - } - - this._element.classList.add(CLASS_NAME_SHOW) - - if (this._config.focus) { - this._enforceFocus() - } - - const transitionComplete = () => { - if (this._config.focus) { - this._element.focus() - } - - this._isTransitioning = false - EventHandler.trigger(this._element, EVENT_SHOWN, { - relatedTarget - }) - } - - if (isAnimated) { - const transitionDuration = getTransitionDurationFromElement(this._dialog) - - EventHandler.one(this._dialog, 'transitionend', transitionComplete) - emulateTransitionEnd(this._dialog, transitionDuration) - } else { - transitionComplete() - } - } - - _enforceFocus() { - EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop - EventHandler.on(document, EVENT_FOCUSIN, event => { - if (document !== event.target && - this._element !== event.target && - !this._element.contains(event.target)) { - this._element.focus() - } - }) - } - - _setEscapeEvent() { - if (this._isShown) { - EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { - if (this._config.keyboard && event.key === ESCAPE_KEY) { - event.preventDefault() - this.hide() - } else if (!this._config.keyboard && event.key === ESCAPE_KEY) { - this._triggerBackdropTransition() - } - }) - } else { - EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS) - } - } - - _setResizeEvent() { - if (this._isShown) { - EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog()) - } else { - EventHandler.off(window, EVENT_RESIZE) - } - } - - _hideModal() { - this._element.style.display = 'none' - this._element.setAttribute('aria-hidden', true) - this._element.removeAttribute('aria-modal') - this._element.removeAttribute('role') - this._isTransitioning = false - this._backdrop.hide(() => { - document.body.classList.remove(CLASS_NAME_OPEN) - this._resetAdjustments() - scrollBarReset() - EventHandler.trigger(this._element, EVENT_HIDDEN) - }) - } - - _showBackdrop(callback) { - EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => { - if (this._ignoreBackdropClick) { - this._ignoreBackdropClick = false - return - } - - if (event.target !== event.currentTarget) { - return - } - - if (this._config.backdrop === true) { - this.hide() - } else if (this._config.backdrop === 'static') { - this._triggerBackdropTransition() - } - }) - - this._backdrop.show(callback) - } - - _isAnimated() { - return this._element.classList.contains(CLASS_NAME_FADE) - } - - _triggerBackdropTransition() { - const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED) - if (hideEvent.defaultPrevented) { - return - } - - const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight - - if (!isModalOverflowing) { - this._element.style.overflowY = 'hidden' - } - - this._element.classList.add(CLASS_NAME_STATIC) - const modalTransitionDuration = getTransitionDurationFromElement(this._dialog) - EventHandler.off(this._element, 'transitionend') - EventHandler.one(this._element, 'transitionend', () => { - this._element.classList.remove(CLASS_NAME_STATIC) - if (!isModalOverflowing) { - EventHandler.one(this._element, 'transitionend', () => { - this._element.style.overflowY = '' - }) - emulateTransitionEnd(this._element, modalTransitionDuration) - } - }) - emulateTransitionEnd(this._element, modalTransitionDuration) - this._element.focus() - } - - // ---------------------------------------------------------------------- - // the following methods are used to handle overflowing modals - // ---------------------------------------------------------------------- - - _adjustDialog() { - const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight - const scrollbarWidth = getScrollBarWidth() - const isBodyOverflowing = scrollbarWidth > 0 - - if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) { - this._element.style.paddingLeft = `${scrollbarWidth}px` - } - - if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) { - this._element.style.paddingRight = `${scrollbarWidth}px` - } - } - - _resetAdjustments() { - this._element.style.paddingLeft = '' - this._element.style.paddingRight = '' - } - - // Static - - static jQueryInterface(config, relatedTarget) { - return this.each(function () { - const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {}) - - if (typeof config !== 'string') { - return - } - - if (typeof data[config] === 'undefined') { - throw new TypeError(`No method named "${config}"`) - } - - data[config](relatedTarget) - }) - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - const target = getElementFromSelector(this) - - if (['A', 'AREA'].includes(this.tagName)) { - event.preventDefault() - } - - EventHandler.one(target, EVENT_SHOW, showEvent => { - if (showEvent.defaultPrevented) { - // only register focus restorer if modal will actually get shown - return - } - - EventHandler.one(target, EVENT_HIDDEN, () => { - if (isVisible(this)) { - this.focus() - } - }) - }) - - const data = Modal.getInstance(target) || new Modal(target) - - data.toggle(this) -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Modal to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Modal) - -export default Modal diff --git a/build/vendor/bootstrap/js/src/offcanvas.js b/build/vendor/bootstrap/js/src/offcanvas.js deleted file mode 100644 index f3459e6..0000000 --- a/build/vendor/bootstrap/js/src/offcanvas.js +++ /dev/null @@ -1,285 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): offcanvas.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - emulateTransitionEnd, - getElementFromSelector, - getTransitionDurationFromElement, - isDisabled, - isVisible, - typeCheckConfig -} from './util/index' -import { hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar' -import Data from './dom/data' -import EventHandler from './dom/event-handler' -import BaseComponent from './base-component' -import SelectorEngine from './dom/selector-engine' -import Manipulator from './dom/manipulator' -import Backdrop from './util/backdrop' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'offcanvas' -const DATA_KEY = 'bs.offcanvas' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' -const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` -const ESCAPE_KEY = 'Escape' - -const Default = { - backdrop: true, - keyboard: true, - scroll: false -} - -const DefaultType = { - backdrop: 'boolean', - keyboard: 'boolean', - scroll: 'boolean' -} - -const CLASS_NAME_SHOW = 'show' -const OPEN_SELECTOR = '.offcanvas.show' - -const EVENT_SHOW = `show${EVENT_KEY}` -const EVENT_SHOWN = `shown${EVENT_KEY}` -const EVENT_HIDE = `hide${EVENT_KEY}` -const EVENT_HIDDEN = `hidden${EVENT_KEY}` -const EVENT_FOCUSIN = `focusin${EVENT_KEY}` -const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` -const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}` -const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}` - -const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="offcanvas"]' -const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Offcanvas extends BaseComponent { - constructor(element, config) { - super(element) - - this._config = this._getConfig(config) - this._isShown = false - this._backdrop = this._initializeBackDrop() - this._addEventListeners() - } - - // Getters - - static get Default() { - return Default - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget) - } - - show(relatedTarget) { - if (this._isShown) { - return - } - - const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget }) - - if (showEvent.defaultPrevented) { - return - } - - this._isShown = true - this._element.style.visibility = 'visible' - - this._backdrop.show() - - if (!this._config.scroll) { - scrollBarHide() - this._enforceFocusOnElement(this._element) - } - - this._element.removeAttribute('aria-hidden') - this._element.setAttribute('aria-modal', true) - this._element.setAttribute('role', 'dialog') - this._element.classList.add(CLASS_NAME_SHOW) - - const completeCallBack = () => { - EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget }) - } - - const transitionDuration = getTransitionDurationFromElement(this._element) - EventHandler.one(this._element, 'transitionend', completeCallBack) - emulateTransitionEnd(this._element, transitionDuration) - } - - hide() { - if (!this._isShown) { - return - } - - const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE) - - if (hideEvent.defaultPrevented) { - return - } - - EventHandler.off(document, EVENT_FOCUSIN) - this._element.blur() - this._isShown = false - this._element.classList.remove(CLASS_NAME_SHOW) - this._backdrop.hide() - - const completeCallback = () => { - this._element.setAttribute('aria-hidden', true) - this._element.removeAttribute('aria-modal') - this._element.removeAttribute('role') - this._element.style.visibility = 'hidden' - - if (!this._config.scroll) { - scrollBarReset() - } - - EventHandler.trigger(this._element, EVENT_HIDDEN) - } - - const transitionDuration = getTransitionDurationFromElement(this._element) - EventHandler.one(this._element, 'transitionend', completeCallback) - emulateTransitionEnd(this._element, transitionDuration) - } - - dispose() { - this._backdrop.dispose() - super.dispose() - EventHandler.off(document, EVENT_FOCUSIN) - - this._config = null - this._backdrop = null - } - - // Private - - _getConfig(config) { - config = { - ...Default, - ...Manipulator.getDataAttributes(this._element), - ...(typeof config === 'object' ? config : {}) - } - typeCheckConfig(NAME, config, DefaultType) - return config - } - - _initializeBackDrop() { - return new Backdrop({ - isVisible: this._config.backdrop, - isAnimated: true, - rootElement: this._element.parentNode, - clickCallback: () => this.hide() - }) - } - - _enforceFocusOnElement(element) { - EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop - EventHandler.on(document, EVENT_FOCUSIN, event => { - if (document !== event.target && - element !== event.target && - !element.contains(event.target)) { - element.focus() - } - }) - element.focus() - } - - _addEventListeners() { - EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide()) - - EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { - if (this._config.keyboard && event.key === ESCAPE_KEY) { - this.hide() - } - }) - } - - // Static - - static jQueryInterface(config) { - return this.each(function () { - const data = Data.get(this, DATA_KEY) || new Offcanvas(this, typeof config === 'object' ? config : {}) - - if (typeof config !== 'string') { - return - } - - if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { - throw new TypeError(`No method named "${config}"`) - } - - data[config](this) - }) - } -} - -/** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - -EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { - const target = getElementFromSelector(this) - - if (['A', 'AREA'].includes(this.tagName)) { - event.preventDefault() - } - - if (isDisabled(this)) { - return - } - - EventHandler.one(target, EVENT_HIDDEN, () => { - // focus on trigger when it is closed - if (isVisible(this)) { - this.focus() - } - }) - - // avoid conflict when clicking a toggler of an offcanvas, while another is open - const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR) - if (allReadyOpen && allReadyOpen !== target) { - Offcanvas.getInstance(allReadyOpen).hide() - } - - const data = Data.get(target, DATA_KEY) || new Offcanvas(target) - - data.toggle(this) -}) - -EventHandler.on(window, EVENT_LOAD_DATA_API, () => { - SelectorEngine.find(OPEN_SELECTOR).forEach(el => (Data.get(el, DATA_KEY) || new Offcanvas(el)).show()) -}) - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - -defineJQueryPlugin(NAME, Offcanvas) - -export default Offcanvas diff --git a/build/vendor/bootstrap/js/src/popover.js b/build/vendor/bootstrap/js/src/popover.js deleted file mode 100644 index 58b3623..0000000 --- a/build/vendor/bootstrap/js/src/popover.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): popover.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { defineJQueryPlugin } from './util/index' -import Data from './dom/data' -import SelectorEngine from './dom/selector-engine' -import Tooltip from './tooltip' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'popover' -const DATA_KEY = 'bs.popover' -const EVENT_KEY = `.${DATA_KEY}` -const CLASS_PREFIX = 'bs-popover' -const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g') - -const Default = { - ...Tooltip.Default, - placement: 'right', - offset: [0, 8], - trigger: 'click', - content: '', - template: '' -} - -const DefaultType = { - ...Tooltip.DefaultType, - content: '(string|element|function)' -} - -const Event = { - HIDE: `hide${EVENT_KEY}`, - HIDDEN: `hidden${EVENT_KEY}`, - SHOW: `show${EVENT_KEY}`, - SHOWN: `shown${EVENT_KEY}`, - INSERTED: `inserted${EVENT_KEY}`, - CLICK: `click${EVENT_KEY}`, - FOCUSIN: `focusin${EVENT_KEY}`, - FOCUSOUT: `focusout${EVENT_KEY}`, - MOUSEENTER: `mouseenter${EVENT_KEY}`, - MOUSELEAVE: `mouseleave${EVENT_KEY}` -} - -const CLASS_NAME_FADE = 'fade' -const CLASS_NAME_SHOW = 'show' - -const SELECTOR_TITLE = '.popover-header' -const SELECTOR_CONTENT = '.popover-body' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class Popover extends Tooltip { - // Getters - - static get Default() { - return Default - } - - static get NAME() { - return NAME - } - - static get DATA_KEY() { - return DATA_KEY - } - - static get Event() { - return Event - } - - static get EVENT_KEY() { - return EVENT_KEY - } - - static get DefaultType() { - return DefaultType - } - - // Overrides - - isWithContent() { - return this.getTitle() || this._getContent() - } - - setContent() { - const tip = this.getTipElement() - - // we use append for html objects to maintain js events - this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle()) - let content = this._getContent() - if (typeof content === 'function') { - content = content.call(this._element) - } - - this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content) - - tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW) - } - - // Private - - _addAttachmentClass(attachment) { - this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`) - } - - _getContent() { - return this._element.getAttribute('data-bs-content') || this.config.content - } - - _cleanTipClass() { - const tip = this.getTipElement() - const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX) - if (tabClass !== null && tabClass.length > 0) { - tabClass.map(token => token.trim()) - .forEach(tClass => tip.classList.remove(tClass)) - } - } - - // Static - - static jQueryInterface(config) { - return this.each(function () { - let data = Data.get(this, DATA_KEY) - const _config = typeof config === 'object' ? config : null - - if (!data && /dispose|hide/.test(config)) { - return - } - - if (!data) { - data = new Popover(this, _config) - Data.set(this, DATA_KEY, data) - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError(`No method named "${config}"`) - } - - data[config]() - } - }) - } -} - -/** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - * add .Popover to jQuery only if jQuery is present - */ - -defineJQueryPlugin(NAME, Popover) - -export default Popover diff --git a/build/vendor/bootstrap/js/src/scrollspy.js b/build/vendor/bootstrap/js/src/scrollspy.js deleted file mode 100644 index 0f59696..0000000 --- a/build/vendor/bootstrap/js/src/scrollspy.js +++ /dev/null @@ -1,316 +0,0 @@ -/** - * -------------------------------------------------------------------------- - * Bootstrap (v5.0.0): scrollspy.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - -import { - defineJQueryPlugin, - getSelectorFromElement, - getUID, - isElement, - typeCheckConfig -} from './util/index' -import EventHandler from './dom/event-handler' -import Manipulator from './dom/manipulator' -import SelectorEngine from './dom/selector-engine' -import BaseComponent from './base-component' - -/** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - -const NAME = 'scrollspy' -const DATA_KEY = 'bs.scrollspy' -const EVENT_KEY = `.${DATA_KEY}` -const DATA_API_KEY = '.data-api' - -const Default = { - offset: 10, - method: 'auto', - target: '' -} - -const DefaultType = { - offset: 'number', - method: 'string', - target: '(string|element)' -} - -const EVENT_ACTIVATE = `activate${EVENT_KEY}` -const EVENT_SCROLL = `scroll${EVENT_KEY}` -const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` - -const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item' -const CLASS_NAME_ACTIVE = 'active' - -const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]' -const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group' -const SELECTOR_NAV_LINKS = '.nav-link' -const SELECTOR_NAV_ITEMS = '.nav-item' -const SELECTOR_LIST_ITEMS = '.list-group-item' -const SELECTOR_DROPDOWN = '.dropdown' -const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle' - -const METHOD_OFFSET = 'offset' -const METHOD_POSITION = 'position' - -/** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - -class ScrollSpy extends BaseComponent { - constructor(element, config) { - super(element) - this._scrollElement = this._element.tagName === 'BODY' ? window : this._element - this._config = this._getConfig(config) - this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}` - this._offsets = [] - this._targets = [] - this._activeTarget = null - this._scrollHeight = 0 - - EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process()) - - this.refresh() - this._process() - } - - // Getters - - static get Default() { - return Default - } - - static get DATA_KEY() { - return DATA_KEY - } - - // Public - - refresh() { - const autoMethod = this._scrollElement === this._scrollElement.window ? - METHOD_OFFSET : - METHOD_POSITION - - const offsetMethod = this._config.method === 'auto' ? - autoMethod : - this._config.method - - const offsetBase = offsetMethod === METHOD_POSITION ? - this._getScrollTop() : - 0 - - this._offsets = [] - this._targets = [] - this._scrollHeight = this._getScrollHeight() - - const targets = SelectorEngine.find(this._selector) - - targets.map(element => { - const targetSelector = getSelectorFromElement(element) - const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null - - if (target) { - const targetBCR = target.getBoundingClientRect() - if (targetBCR.width || targetBCR.height) { - return [ - Manipulator[offsetMethod](target).top + offsetBase, - targetSelector - ] - } - } - - return null - }) - .filter(item => item) - .sort((a, b) => a[0] - b[0]) - .forEach(item => { - this._offsets.push(item[0]) - this._targets.push(item[1]) - }) - } - - dispose() { - super.dispose() - EventHandler.off(this._scrollElement, EVENT_KEY) - - this._scrollElement = null - this._config = null - this._selector = null - this._offsets = null - this._targets = null - this._activeTarget = null - this._scrollHeight = null - } - - // Private - - _getConfig(config) { - config = { - ...Default, - ...Manipulator.getDataAttributes(this._element), - ...(typeof config === 'object' && config ? config : {}) - } - - if (typeof config.target !== 'string' && isElement(config.target)) { - let { id } = config.target - if (!id) { - id = getUID(NAME) - config.target.id = id - } - - config.target = `#${id}` - } - - typeCheckConfig(NAME, config, DefaultType) - - return config - } - - _getScrollTop() { - return this._scrollElement === window ? - this._scrollElement.pageYOffset : - this._scrollElement.scrollTop - } - - _getScrollHeight() { - return this._scrollElement.scrollHeight || Math.max( - document.body.scrollHeight, - document.documentElement.scrollHeight - ) - } - - _getOffsetHeight() { - return this._scrollElement === window ? - window.innerHeight : - this._scrollElement.getBoundingClientRect().height - } - - _process() { - const scrollTop = this._getScrollTop() + this._config.offset - const scrollHeight = this._getScrollHeight() - const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight() - - if (this._scrollHeight !== scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - const target = this._targets[this._targets.length - 1] - - if (this._activeTarget !== target) { - this._activate(target) - } - - return - } - - if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { - this._activeTarget = null - this._clear() - return - } - - for (let i = this._offsets.length; i--;) { - const isActiveTarget = this._activeTarget !== this._targets[i] && - scrollTop >= this._offsets[i] && - (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]) - - if (isActiveTarget) { - this._activate(this._targets[i]) - } - } - } - - _activate(target) { - this._activeTarget = target - - this._clear() - - const queries = this._selector.split(',') - .map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`) - - const link = SelectorEngine.findOne(queries.join(',')) - - if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { - SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)) - .classList.add(CLASS_NAME_ACTIVE) - - link.classList.add(CLASS_NAME_ACTIVE) - } else { - // Set triggered link as active - link.classList.add(CLASS_NAME_ACTIVE) - - SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP) - .forEach(listGroup => { - // Set triggered links parents as active - // With both