Compare commits

...
Sign in to create a new pull request.

589 commits

Author SHA1 Message Date
XhmikosR
9b847e729c tooltip: cache element queries 2021-01-09 14:48:48 +02:00
XhmikosR
10efa38e86 utils: cache element query 2021-01-09 14:48:48 +02:00
XhmikosR
de89feb012 modal: cache element queries 2021-01-09 14:48:48 +02:00
XhmikosR
a33f970233 carousel: cache element query 2021-01-09 14:48:47 +02:00
XhmikosR
a33d7b2d21 alert: cache element query 2021-01-09 14:48:47 +02:00
XhmikosR
484843856d modal: move common check to a function 2021-01-09 14:48:47 +02:00
XhmikosR
37186db5fc
docs: add v5.0 in versions (#32728) 2021-01-08 21:03:22 +02:00
XhmikosR
6b788acf63 Update devDependencies
* @babel/cli                   ^7.12.8  →  ^7.12.10
* @babel/core                  ^7.12.8  →  ^7.12.10
* @babel/preset-env            ^7.12.7  →  ^7.12.11
* @rollup/plugin-babel          ^5.2.1  →    ^5.2.2
* @rollup/plugin-commonjs      ^16.0.0  →   ^17.0.0
* @rollup/plugin-node-resolve  ^10.0.0  →   ^11.0.1
* autoprefixer                 ^10.0.2  →   ^10.2.1
* cross-env                     ^7.0.2  →    ^7.0.3
* eslint                       ^7.14.0  →   ^7.17.0
* eslint-config-xo             ^0.33.1  →   ^0.34.0
* eslint-plugin-unicorn        ^23.0.0  →   ^25.0.1
* find-unused-sass-variables    ^3.0.0  →    ^3.1.0
* hugo-bin                     ^0.66.2  →   ^0.68.0
* linkinator                    ^2.2.2  →   ^2.11.2
* nodemon                       ^2.0.6  →    ^2.0.7
* postcss                      ^8.1.10  →    ^8.2.3
* postcss-cli                   ^8.3.0  →    ^8.3.1
* qunit                        ^2.12.0  →   ^2.13.0
* rollup                       ^2.33.3  →   ^2.36.1
2021-01-08 12:04:37 +02:00
XhmikosR
cafcca31ac Backport #32423
Add two new variables for pagination border-radius values
2021-01-08 12:04:37 +02:00
XhmikosR
b633c2befe Backport #32632
Docs: Tweak the wording for collapse to indicate button is preferred/more semantic
2021-01-08 12:04:37 +02:00
XhmikosR
4540436f3d Backport #32685
Clarify the `$enable-shadows` option in our docs
2021-01-08 12:04:37 +02:00
XhmikosR
3768b6e5b6 Backport #32713
Bump copyright year to 2021
2021-01-08 12:04:37 +02:00
Patrick H. Lauke
264a412589 Remove incorrect mention of dropdowns for dynamic tab behavior (#32634)
While technically it still works, we're already saying authors shouldn't do it later on, and we removed any examples of this. This was a straggler.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-08 12:04:37 +02:00
XhmikosR
1141a51789 CI: update to actions/setup-node@v2 (#32635) 2021-01-08 12:04:37 +02:00
XhmikosR
ccee913e59 Tooltips: add missing space (#32529) 2021-01-08 12:04:37 +02:00
XhmikosR
378f3939c8 Backport #32489
Fix popover docs example
2021-01-08 12:04:37 +02:00
XhmikosR
bb99676a8a BrowserStack: test on macOS Catalina instead of High Sierra (#32486) 2021-01-08 12:04:37 +02:00
Patrick H. Lauke
9fbf50c3ce Docs: style clipboard button on :focus, not just :hover (#32461)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-08 12:04:37 +02:00
XhmikosR
984aacc32f Update CodeQL Action (#32452) 2021-01-08 12:04:37 +02:00
XhmikosR
b0e7e02ab6 CI: add a 30-min timeout for BrowserStack (#32238) 2021-01-08 12:04:37 +02:00
XhmikosR
fcfd2ce4b2 CONTRIBUTING: mention dist files (#32314)
* CONTRIBUTING: mention dist files

* Update CONTRIBUTING.md

Co-authored-by: Mark Otto <markd.otto@gmail.com>
2021-01-08 12:04:37 +02:00
Christian Oliff
fca04236ad Remove duplicated 'follow Bootstrap on Twitter' link in Community section (#32399)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-08 12:04:37 +02:00
XhmikosR
810de41bc3 build-plugins: switch to "bundled" for babel helpers (#32312) 2021-01-08 12:04:37 +02:00
XhmikosR
307c08af42 README: fix path to search.js (#32257) 2021-01-08 12:04:37 +02:00
XhmikosR
4620b9838b
karma: add v4 in Browserstack build ID (#32502) 2021-01-08 10:05:56 +02:00
Aleksandr Gorbatov
d1e0610a45
docs: Add Russian translation (#32253) 2021-01-08 09:53:22 +02:00
Patrick H. Lauke
f1b2ed93df
v4: Add an actual data-touch="false" example in the carousel docs (#32639)
* v4: Add an actual `data-touch="false"` example in the carousel docs

Backport of https://github.com/twbs/bootstrap/pull/32638

* Remove data-ride from example carousel

* Correct attribute table explanation and remove slide class from example

i believe the correct option is `slide` here, not `ride`.
the `if "carousel"` bit was rather unclear/confusing

* Edits...

sorry, trying to make sense of our quirky carousel stuff, it seems some illogical things have been there ever since

* Add data-interval to suppress autoplay

* Tweak carousel options formatting

* Update site/content/docs/4.5/components/carousel.md

Co-authored-by: Mark Otto <markd.otto@gmail.com>

* Tweak language

mostly based on @mdo's suggestion, but also adds the word "attribute" after `data-ride` for better flow/legibility

Co-authored-by: Mark Otto <markd.otto@gmail.com>
2021-01-05 23:42:55 +00:00
Patrick H. Lauke
4fc35bdc3c
v4 backport: Replace Lorem Ipsum placeholder text with more representative (or at least english language) text (#32462)
Backport and expansion (for v4) of #32246 and #32479
2020-12-15 11:06:00 +02:00
Patrick H. Lauke
5db105e587
Add mention of the bs-custom-file-input plugin needed for the custom file input (#32457) 2020-12-15 09:22:34 +02:00
Kyle Tsang
1897b4cd89
v4: Move negative margin-bottom from .nav-item to .nav-link (#32211)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-10 11:02:28 +02:00
Mark Otto
17bb67dd5b
Add hex values to colors (#32411) 2020-12-10 11:01:13 +02:00
XhmikosR
fbfaba5bb8
Revert colors.yml accidental changes (#32206)
* Revert colors.yml accidental changes

* Bring colors data files up to par with the vars
2020-12-10 00:42:38 +02:00
Gaël Poupard
53542dc027
Remove useless .text-left in Layout / Overview (#32363) 2020-12-08 08:59:13 +02:00
Rohit Sharma
8e59752ee1
Partially backport #32217 (#32225)
Remove unnecessary `_getCustomClass` method.

`customClass` will be in the configuration already, even if it is provided in the data attributes, and jQuery's [`addClass()`](https://api.jquery.com/addclass/) method will handle it, either `this.config.customClass` is a function or a class name (even if it is a blank string).

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-25 09:35:36 +02:00
Rohit Sharma
22168e9b15
Fix typos (#32247) 2020-11-24 15:58:47 +02:00
XhmikosR
6f58383f5a Update codeql.yml (#32125)
Specify the branches and clean up the comments
2020-11-24 08:40:11 +02:00
XhmikosR
90ad4ffc82 introduction: split comments (#32223) 2020-11-24 08:40:11 +02:00
XhmikosR
b45b5e9e65 Update _syntax.scss (#32117)
* Update _syntax.scss with the latest chroma selectors

* Sort selectors

* Remove no longer needed chroma workaround

* remove comments
2020-11-24 08:40:11 +02:00
XhmikosR
c9876ed15b CI: specify FORCE_COLOR:2 (#32222)
This should show any colors in the output
2020-11-24 08:40:11 +02:00
XhmikosR
b26768ee42 postcss.config.js: remove arrow return (#32235) 2020-11-24 08:40:11 +02:00
XhmikosR
9260427a34 Update devDependencies 2020-11-24 08:40:11 +02:00
XhmikosR
398ddedac7 Manually backport #32226
docs: use `event` instead of `e`
2020-11-24 08:40:11 +02:00
XhmikosR
57e045f0ab Backport #32224
Be consistent with Popper's name.
2020-11-24 08:40:11 +02:00
Noah Rosenzweig
631b5d4df1 Improve build/generate-sri.js regex (#29753)
When using single-quotes in config.yml, the previous
regular expression in build/generate-cli.js wasn't working correctly,
it was replacing ALL string values with hashes.
Now both double- and single-quotes can be used in config.yml,
and the RegExp will work as expected.

Also, allow trailing whitespaces and empty ("") values to be matched.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-24 08:40:11 +02:00
XhmikosR
13486b8e27 examples: add the version number in title (#32198) 2020-11-24 08:40:11 +02:00
XhmikosR
aed84c9430 Backport #32189
docs(dropdowns): clarify where is `.show` applied
2020-11-24 08:40:11 +02:00
XhmikosR
7eee78c517 Backport #32178 and #32182
Handle Chromium to run Karma
2020-11-24 08:40:11 +02:00
Rohit Sharma
bfb773d64b
Backport #32179 (#32220)
Don't hide modal when `config.keyboard` is false
2020-11-21 22:14:28 +02:00
James Remeika
2d8c02eb10
tooltip/popover: add a customClass option (#31834)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-20 11:56:16 +02:00
XhmikosR
ffa88deb85
docs: update selector CodePen example (#32202)
Moving it to the CodePen org so that we can all edit it.
2020-11-20 11:36:35 +02:00
XhmikosR
6bc18dc113
scss: remove needless Stylelint disables (#32212) 2020-11-20 09:54:33 +02:00
XhmikosR
e567b9a7ab
Backport #32158 (#32203)
Switch to jsDelivr for the remaining docs assets

Also, update feather icons and chart.js
2020-11-19 20:35:28 +02:00
Patrick H. Lauke
e5b5881f8c
Add overflow suppression to custom file label (#32160)
Avoids unsightly spilling out of long filename text, particularly for multi file inputs

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-19 16:29:57 +02:00
XhmikosR
052f72d360 Use the example shortcode in more places
Now, it's safe to do use it since it covers more cases
2020-11-19 11:22:22 +02:00
XhmikosR
764184fc43 Fix syntax highlighting language 2020-11-19 11:22:22 +02:00
XhmikosR
b46f05a948 Switch to Hugo
This commit includes all the needed workarounds and most changes from the main branch for everything to work, like:

* removing empty lines in raw HTML that break output
* read .browserslistrc, CSS variables from disk instead of duplicating it
* using Hugo mounts
* using Hugo for the docs CSS/JS
* move ToC Sass code to a separate file while adapting it for Hugo

Thus, this patch makes our npm scripts faster since lint runs on one step and there's no separate docs assets processing.
2020-11-19 11:22:22 +02:00
XhmikosR
ae87f8f7ce
homepage: split snippets and show copy buttons (#32196) 2020-11-19 11:13:08 +02:00
XhmikosR
5fd0c239bc
alerts.md: use Markdown (#32193) 2020-11-18 21:29:41 +02:00
Mark Otto
4bdaa2604f
Mention user-select-all support in docs (#32151) 2020-11-13 20:49:32 +02:00
XhmikosR
5795e421ac
Manually backport #32121 (#32141)
Use correct value order

Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-11-13 18:58:51 +02:00
Patrick H. Lauke
d3cb97ad71
Avoid invisible real file input "spilling" out of container (#32145)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-13 18:52:42 +02:00
XhmikosR
c41897ca98
Fix caniuse.com redirects (#32147) 2020-11-13 17:45:11 +02:00
XhmikosR
6ddedbff77 Update devDependencies and gems 2020-11-13 12:50:13 +02:00
XhmikosR
4bbc32dda7 download.md: link to JS files comparison too (#32087) 2020-11-13 12:50:13 +02:00
XhmikosR
fb12b0bd6a search.js: check for search-input element early (#32100) 2020-11-13 12:50:13 +02:00
XhmikosR
45bf55e4ba package.json: fix clean-css level switch (#32097) 2020-11-13 12:50:13 +02:00
XhmikosR
e2e6e867f8
browsers-devices.md: make heading an h3 (#32136) 2020-11-13 12:44:27 +02:00
XhmikosR
49d5756f01
navbar.md: remove loading=lazy from snippets (#32138) 2020-11-12 20:40:15 +02:00
XhmikosR
03ec5342e0
input-group.md: fix wrong class .visually-hidden (#32137) 2020-11-12 20:39:19 +02:00
Mitchell Bryson
896e444895
Check for data-interval on the first slide of carousel - v4 (#31820)
When starting a cycle for a carousel, it only checks for a default interval, and not an interval defined on the slide element via data props. This adds a check in before creating the interval to move to the next slide.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-12 09:34:17 +02:00
Mark Otto
9e9e1e61d5
Clarify JS bundle docs once more for v4 (#32106)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-11-10 09:36:04 +02:00
Patrick H. Lauke
dec3d86514
Changes to navbar documentation/explanation (#32094) 2020-11-09 18:10:04 +00:00
XhmikosR
43f7befe36
docs: mention "Liberation Sans" (#32083) 2020-11-08 20:30:07 +02:00
Patrick H. Lauke
44d54eb578 Make docs anchorjs links darker on keyboard focus (#32050)
* Make docs anchorjs links darker on keyboard focus

Not just on mouse hover

* Update site/assets/scss/_anchor.scss

Co-authored-by: Mark Otto <markd.otto@gmail.com>

Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-11-05 11:22:05 +02:00
XhmikosR
f1acc7f1d8 Update devDependencies 2020-11-05 11:22:05 +02:00
XhmikosR
b3aa3958da Backport #32045
tests: fix sanitizer test.

The test template does not include a `script` tag so the test always returned true.
2020-11-05 11:22:05 +02:00
XhmikosR
3063d74b86 ESLint: enable new-cap rule but ignore properties (#32036) 2020-11-05 11:22:05 +02:00
XhmikosR
ecf7db731f CODE_OF_CONDUCT.md: fix redirect (#32033) 2020-11-05 11:22:05 +02:00
XhmikosR
39e9cced88 Clarify PRs section (#32027) 2020-11-05 11:22:05 +02:00
XhmikosR
30641eb346 Lint: stop ignoring package.js (#32021) 2020-11-05 11:22:05 +02:00
Patrick H. Lauke
bbfd22f924
Backport #32040 (#32054)
Add callouts about using light colors ideally on a dark background
2020-11-03 09:44:42 +02:00
XhmikosR
5664e728b4
Move js/src/index.js one folder up (#32001) 2020-11-01 07:31:17 +02:00
XhmikosR
465135a0f8 Backport #32015
Fix redirects
2020-10-30 16:34:06 +02:00
XhmikosR
f808026e5b Backport #31861
* Split up dropdown sizing docs to improve rendering

- Drop the included .btn-toolbar, no need
- Split large and small button examples
2020-10-30 16:34:06 +02:00
XhmikosR
76d4f728a0 Update devDependencies
* autoprefixer                ^9.8.6  →  ^10.0.1
* find-unused-sass-variables  ^2.0.0  →   ^3.0.0
* linkinator                  ^2.2.0  →   ^2.2.2
* postcss-cli                 ^7.1.2  →   ^8.2.0
2020-10-30 16:34:06 +02:00
Christian Oliff
1266103171 Update Edge's Rendering Engine on CONTRIBUTING.md (#32008)
* Update Edge's Rendering Engine on CONTRIBUTING.md

Also updated the URL to prevent a HTTP redirect.

* Add 'Go to "Help > Send Feedback" from the browser' note

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-30 16:34:06 +02:00
XhmikosR
3f0b15cca6 CI: switch to Node.js 14. (#32003) 2020-10-30 16:34:06 +02:00
XhmikosR
76958761f2 CI: Skip dependabot PR branches. (#32006)
Also, reword Node.js setup step
2020-10-30 16:34:06 +02:00
Martijn Cuppens
9a094d44ef Remove bugreport.apple.com since it doesn't work (#32005) 2020-10-30 16:34:06 +02:00
Adam Jones
71e5b7ca2b
Fix form validation tooltip alignment (#31557)
* Fix form validation tooltip alignment

* Remove CSS hacks

* Update _forms.scss

Co-authored-by: Gaël Poupard <ffoodd@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-30 16:15:31 +02:00
XhmikosR
23cf931c7f list-group.md: fix snippet (#31981) 2020-10-27 12:11:01 +02:00
XhmikosR
09df15cc3c CI: allow skipping BrowserStack (#31878)
This basically brings back the previous behavior we had on Travis CI, where if the commit message included `[ci skip]`, BrowserStack tests didn't run.

Additionally, this allows skipping BrowserStack if the commit message contains `[skip ci]` too.
2020-10-27 12:11:01 +02:00
XhmikosR
1a90b8a418 Update devDependencies and gems 2020-10-27 12:11:01 +02:00
XhmikosR
35de511cb3 Update CodeQL action (#31930)
Should run on PRs too.
2020-10-27 12:11:01 +02:00
Patrick H. Lauke
d8c189df59 Explicitly mention emoji fonts, tweak sentence in typography (#31960) 2020-10-27 12:11:01 +02:00
Patrick H. Lauke
5f1bc4a756 Remove redundant visually hidden "(current)" from pagination controls (#31892)
* Replace visually hidden span with aria-current in tests

* Remove redundant visually hidden "(current)" when `aria-current` already used

Closes #31891
2020-10-27 12:11:01 +02:00
Martijn Cuppens
a7d5923470 Suppress flexbox side effects in breadcrumb (#31700)
* Suppress flexbox side effects

* Trailing whitesapce

Co-authored-by: Mark Otto <markd.otto@gmail.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-27 12:11:01 +02:00
XhmikosR
084795db82 Update anchor-js to v4.3.0. (#31951) 2020-10-27 12:11:01 +02:00
XhmikosR
c0401ebfa0 Jekyll: switch to Liquid's strict mode.
This should make the build error out if there are any issues instead of emitting a warning, which we won't notice.
2020-10-27 12:11:01 +02:00
Gaël Poupard
d29b05c775 Handle the Ubuntu sans-serif case (#31657)
On Ubuntu, our native font-stack doesn't output the same font on Firefox and Chrome. This is [a known aliasing issue](http://fontfamily.io/sans-serif) — check at the bottom, Ubuntu 14.04. Ubuntu 18.04 (my current) doesn't use the same (Firefox uses Liberation Sans, Chrome uses the default system font Ubuntu).

I'm inclined to prefer Liberation Sans since it's closer to Arial / Helvetica. This patch already exists in Boosted, didn't notice it was missing in bootstrap until today…

BTW, our linked Smashing Magazine's system fonts post mentions this and is even more accurate since it targets the three major Linux distributions. AFAIK this is not needed since [Liberation Sans is available everywhere](http://fontfamily.io/Liberation_Sans) — but we might go back to `Oxygen, Ubuntu, Cantarell`if we want to stick to system fonts.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-27 12:11:01 +02:00
Gaël Poupard
4b30fe622c Backport #31882
* feature(spinners): slow down spinners when prefers-reduced-motion

* docs(spinners): add reduced motion callout and mention slowing down in accessibility page

* Update spinners.md

* docs(accessibility): rewording

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
Co-authored-by: Patrick H. Lauke <redux@splintered.co.uk>
2020-10-27 12:11:01 +02:00
XhmikosR
efabff3a74 browserconfig.xml: switch to relative image path 2020-10-27 12:11:01 +02:00
XhmikosR
59b65a2cb8 Backport #31893
Update manifest.json

Switch to relative URLs so that we don't need to change the path with every major/minor release
2020-10-27 12:11:01 +02:00
Gaël Poupard
5f3fa833c9 docs(forms): backport #31904
* docs(forms): use a legend for fieldset instead of aria-label

* docs(forms): fix incorrect legend nesting in fieldset
2020-10-27 12:11:01 +02:00
XhmikosR
cec8e5ddc3 Remove double spaces from homepage SVGs 2020-10-27 12:11:01 +02:00
Martijn Cuppens
5d310db486 Fix mobile menu jump & double border 2020-10-26 21:47:03 -07:00
Itamar Eduardo Gonçalves de Oliveira
61b5efbaf7 v4 Examples/Floating-labels: fix bad behavior with autofill 2020-10-26 21:19:56 -07:00
Martijn Cuppens
a1b2071fe0 Require .has-validation for input groups with validation 2020-10-26 13:43:52 -07:00
Julien Déramond
171da55628
docs(forms): change inline custom radio name (#31936) 2020-10-19 22:13:30 +01:00
Alexandre Rosario
b1ae785f40
Fixed: Undefined mixin 'deprecate' when importing 'bootstrap-grid-scss' (#31886)
* Fixed: Undefined mixin 'deprecate' when importing 'bootstrap-grid-scss'

* Updated: Mixin import moved down to feature together with others

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-15 16:32:08 +03:00
XhmikosR
f86149807d
docs: switch to suggesting jsDelivr as a CDN (#31898) 2020-10-14 20:41:37 +03:00
XhmikosR
a716fb03f9
Prepare v4.5.3. (#31880) 2020-10-13 18:38:30 +03:00
XhmikosR
d9f4bcf6ff Update devDependencies 2020-10-13 15:24:40 +03:00
XhmikosR
c049713382 Remove the unused js/dist/index.js.map 2020-10-13 15:24:40 +03:00
XhmikosR
1b48122641 Update .eslintrc.json
Enforce ES5 for tests
2020-10-13 15:24:40 +03:00
Ankit Mishra
5d066caace
Backport #31809 (#31851)
carousel: add missing `to` and `nextwhenvisible` description
2020-10-09 07:51:12 +03:00
Martijn Cuppens
429a84ff33
Backport #31826 (#31846)
Fix for alert-dismissible close button not clickable with stretched-link
2020-10-09 07:44:20 +03:00
Mark Otto
91d0a65243 Update .text-break for wider browser support 2020-10-05 16:12:47 +03:00
Mark Otto
c437735b6c Backport versions update from #31754 and reverse order of versions to match v5 2020-10-05 16:12:47 +03:00
Mark Otto
ca68277976 Backport color-adjust for v4
Keeps checkboxes, radios, and switches with their intended design when printing.

Backports #29714
2020-10-05 16:12:47 +03:00
Mark Otto
a03b2feff2 Backport Reboot's th updates
Manually backports #30781 to v4.
2020-10-05 16:12:47 +03:00
Laussel Loïc
24572b1577
buttons plugin : avoid multiple change event trigger (#31000)
- add unit test to count how many events are thrown when widget contains multiple tags inside label
- add a parameter to toggle, if click event is provided onto an input then don't trigger another change event already thrown by the browser
- simplify the case where toggle interface is called click provide from input itself OR it's a button without label. If label is present, then browser propagate click event from childrens through label and then cause multiple calls to toggle
- the test assumes that `.btn` class is always set onto the label if there's one, otherwise need to update this plugin and look for label around the input

Test with keyboard, mouse and js click call

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-10-02 17:40:20 +03:00
XhmikosR
d9b4426b07 Update .gitignore (#31783)
Add vscode and netlify folders
2020-09-30 08:44:42 +03:00
XhmikosR
d9cccf476b Compress the new images 2020-09-30 08:44:42 +03:00
Mark Otto
b25e6d5fa9 Add new Bootstrap Icons homepage images 2020-09-30 08:44:42 +03:00
XhmikosR
80fc8d9f76 Stylelint: enable --rd option 2020-09-30 08:44:42 +03:00
XhmikosR
e0cd05019e Stylelint: replace deprecated options 2020-09-30 08:44:42 +03:00
XhmikosR
3cd2cd25b7 Update devDependencies and gems 2020-09-30 08:44:42 +03:00
XhmikosR
6c051294aa typography.md: update wording about RFS and Bootstrap version. 2020-09-30 08:44:42 +03:00
XhmikosR
ff1d751e36 docs: link to the Asynchronous functions section 2020-09-30 08:44:42 +03:00
Mark Otto
d106b01dec Add new variable for -padding-x
(cherry picked from commit fe77208a01)
2020-09-30 08:44:42 +03:00
Mark Otto
f927a95b6c
Backport #31300 (#31769)
* Manually backport JS bundle guidance

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-09-28 10:57:42 +03:00
Johann-S
e45fbe7f72 add suggested fix for gpu acceleration 2020-09-24 15:06:30 +03:00
XhmikosR
16aa05752b Update popovers.md 2020-09-24 15:06:30 +03:00
Mark Otto
34208778ba v4: Mention GPU acceleration fix in docs callout
Closes #22610
2020-09-24 15:06:30 +03:00
XhmikosR
400364c7fd Update devDependencies 2020-09-21 14:58:34 +03:00
XhmikosR
30c3cd45a2 icons.md: add icofont like in v5 2020-09-21 14:58:34 +03:00
XhmikosR
6994dacee4 Backport #31689
docs: fix a few redirects

* Fix GitHub's permanent redirects

* Fix a11yproject redirects
2020-09-21 14:58:34 +03:00
XhmikosR
dfefd48c34 Backport #31516
Add new icons set - CoreUI Icons
2020-09-21 14:58:34 +03:00
XhmikosR
31eb108811 Add parentheses around multiple spread conditions 2020-09-21 14:58:34 +03:00
XhmikosR
b31046aab3 Cache a few variables. 2020-09-21 14:58:34 +03:00
XhmikosR
c86b74fe88 Unbreak lines and remove a TODO comment 2020-09-21 14:58:34 +03:00
XhmikosR
be18957933 Backport 65d130fbd8
Mention the quotes requirement in the docs too
2020-09-21 14:58:34 +03:00
Mark Otto
8acd7c9fbe Add a comment for escape-svg function
Closes #30835 by leaving a comment in the source that the escape-svg() function must have quotes around data URIs.

(cherry picked from commit 849fea5a1e)
2020-09-21 14:58:34 +03:00
Joakim Riedel
b0a0c56788
ensure hidePrevented.bs.modal can be prevented (#31696) 2020-09-21 14:41:40 +03:00
Mr. Will
ab0aec397e
Add new Chinese Simplified translation (#31540) 2020-09-20 14:24:13 +03:00
Patrick H. Lauke
63b8a6ffdd
Docs: Add top/bottom margin to highlighted code samples (#31706)
Backport of #31036 to v4
2020-09-19 18:59:56 +03:00
Mark Otto
7539cfb29c
Update _custom-forms.scss (#31693)
Typo in box-shadow attribute, global variable used instead of local.

Co-authored-by: Arthur Shlain <artur.slain@gmail.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-09-18 11:21:30 +03:00
XhmikosR
dc2f1e68cd
Dropdown: fix variable always evaluating to true (#31673) 2020-09-18 10:22:24 +03:00
XhmikosR
1bd1d78a78
Update devDependencies and gems (#31624)
* Update devDependencies and gems

* Bump bundlewatch limits
2020-09-15 08:31:57 +03:00
XhmikosR
3be585990c Comply to the new rules 2020-09-10 12:06:30 +03:00
XhmikosR
1c37a2ba77 Switch to xo and remove babel-eslint 2020-09-10 12:06:30 +03:00
Gaël Poupard
39282bcc9d
docs(build tools): mention how to get the sources (#31589) 2020-09-04 20:17:37 +03:00
XhmikosR
5f2480a90a
Prepare v4.5.2. (#31444) 2020-08-06 19:22:43 +03:00
Martijn Cuppens
c0aa405632 Remove undefined $ignore-warning 2020-08-06 19:08:24 +03:00
XhmikosR
e6ab4ad86a Deprecate the make-container-max-widths mixin 2020-08-06 19:08:24 +03:00
Mark Otto
af4419b723 Restore make-container-max-widths mixin 2020-08-06 19:08:24 +03:00
XhmikosR
f083759d03
Remove flex: 1 0 100% from rows (#31439) (#31445)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>

Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-08-06 18:59:17 +03:00
XhmikosR
89dc9750ec
Prepare v4.5.1. (#31408) 2020-08-04 19:24:33 +03:00
XhmikosR
e0f89dc90b
Backport #31339 (#31414)
* Backport #31339

Add view on GitHub links for easier content editing from the docs
2020-08-04 18:54:01 +03:00
XhmikosR
30d375b33f
Remove overflow: hidden from toasts (#31381) (#31407)
Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-08-03 19:13:32 +03:00
XhmikosR
6879a3c51d Update devDependencies and gems
* @babel/cli                   ^7.10.4  →  ^7.11.0
* @babel/core                  ^7.10.4  →  ^7.11.0
* @rollup/plugin-babel          ^5.0.4  →   ^5.1.0
* @rollup/plugin-commonjs      ^13.0.0  →  ^14.0.0
* @rollup/plugin-node-resolve   ^8.1.0  →   ^8.4.0
* autoprefixer                  ^9.8.4  →   ^9.8.6
* eslint                        ^7.4.0  →   ^7.6.0
* karma                         ^5.1.0  →   ^5.1.1
* rollup                       ^2.21.0  →  ^2.23.0
2020-08-03 19:06:36 +03:00
XhmikosR
d44a1e105e Backport #31344
Add toasts to the components requiring JavaScript
2020-08-03 19:06:36 +03:00
Gaël Poupard
81d3e2b917 docs(skippy): prevent skip links from overlapping header 2020-08-03 19:06:36 +03:00
Rohit Sharma
1abe9264aa Add unit test for toast to check clearTimeout to have been called (#31298) 2020-08-03 19:06:36 +03:00
Rohit Sharma
f530ab7549 Clear timeout before showing the toast (#31155)
* clear timeout before showing the toast

* Add unit test

* Remove the check for timeout

* Check for clearTimeout to have been called

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
# Conflicts:
#	js/tests/unit/toast.spec.js
2020-08-03 19:06:36 +03:00
XhmikosR
0ec2ce44b4
Update to Ruby 2.7/Bundler 2.x. (#31296) 2020-08-02 16:26:19 +03:00
Patrick H. Lauke
cc49a5b506
Turn off scroll anchoring for accordions (#31347)
New default behavior for scroll anchoring (rolled out in Chrome 84?) leads to unsightly/odd accordion interactions - see #31341
This rule suppresses this new behavior and reverts back to the old way.

See https://drafts.csswg.org/css-scroll-anchoring/
2020-07-21 21:44:41 +01:00
Patrick H. Lauke
99013a5c54
Docs: forms accessibility cleanup (backport from v5) (#31234)
* Expand advice for anchor-based controls

* Expand accessibility note in input group

* Correct statement about validation, fix server example

* Tweak label > accessible name

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-07-12 07:57:48 +03:00
XhmikosR
38bcf108c9
Update dependencies, gems and regenerate package-lock.json (#31261)
* @rollup/plugin-node-resolve 8.1.0
* popper.js 1.16.1
* qunit 2.10.1
* rollup 2.21.0
2020-07-09 15:21:41 +03:00
XhmikosR
f40e1b651b Update devDependencies and gems 2020-07-06 16:40:27 +03:00
XhmikosR
ad8d3a6c54 Update Babel config (#31011)
* remove plugin-proposal-object-rest-spread
* add bugfixes
* `exclude: ['transform-typeof-symbol']` did nothing with our config
2020-07-06 16:40:27 +03:00
ysds
9a6cfeb36e Backport #30326 (Unit test) 2020-07-06 16:40:27 +03:00
XhmikosR
ea01c29294 Backport #30326
Prevent overflowing static backdrop modal animation

TODO: backport the test too
2020-07-06 16:40:27 +03:00
XhmikosR
234dd96abf Backport #31135
* Move color utility callouts to start of page

Hierarchically/structurally, in the position they are currently at, the two callouts seem like they "belong" just to the "background color" section. Moving them to the start makes it clearer that those two callouts relate to everything in the page (both "Color" and "Background color" classes.

* Change heading level

otherwise the assistive technology callout looks like it's hierarchically under the "Dealing with specificity" heading
2020-07-06 16:40:27 +03:00
XhmikosR
c49b084158 BrowserStack: test on Edge 15 2020-07-06 16:40:27 +03:00
Mark Otto
b2ef98f154 Remove backdrop-filter from toasts 2020-07-06 16:40:27 +03:00
Gaël Poupard
04dbb6c24c Floating labels improvements (#30966)
* docs(example): floating-labels' better Edge fallback

* docs(example): refactor floating-labels' CSS
2020-06-24 15:16:58 +03:00
XhmikosR
5a9fc2938c Update devDependencies and gems 2020-06-24 15:16:58 +03:00
Patrick H. Lauke
c995886c0f Docs: add Gaël Poupard to the core team page (#31081)
Docs: add Gaël Poupard to the core team page
2020-06-24 15:16:58 +03:00
XhmikosR
9b241e630c Backport #31070
* Make example less broken-looking

don't want to give impression that now it's ok to just sprinkle `role="button"` around. this at least makes the `span` keyboard-focusable, similar to at least the start of a custom control
2020-06-24 15:16:58 +03:00
XhmikosR
920dc619a4 README.md: update badges
* remove .svg from shields.io badges since it's the default
* switch to shields.io for the OC badges too
* fix badgesize badges' labels
2020-06-24 15:16:58 +03:00
XhmikosR
f6b74b8b41 Fix typo 2020-06-24 15:16:58 +03:00
XhmikosR
2e991732de Update issue templates from main. 2020-06-24 15:16:58 +03:00
XhmikosR
2314247825 Remove unused issue templates 2020-06-24 15:16:58 +03:00
XhmikosR
3349eb6a41 Update links to point to v4-dev or main branches 2020-06-24 15:16:58 +03:00
XhmikosR
6c04d186e2 Split GitHub Actions. 2020-06-24 15:16:58 +03:00
XhmikosR
7de8582657 Stylelint: remove redundant inline suppressions 2020-06-24 15:16:58 +03:00
XhmikosR
242f75cd1f Update .gitattributes (#30934)
This requires git >= 2.10 but it was released almost 4 years ago.
2020-06-24 15:16:58 +03:00
XhmikosR
78a51cb12f Backport #30973
Remove the class `.nav-item` from `.nav-link` inside the non `ul` or `ol` based navs.
This makes the consistency for `.nav-item` (This class will not be required on the `.nav-link`).
`.nav-item` was only required when you use `.nav-fill` or `.nav-justified` on the `.nav`. In other cases, it was redundant. And the purpose of `.nav-item` on `.nav-link`s can be achieved via flexbox utilities as well (Mentioned in the docs also).
2020-06-24 15:16:58 +03:00
Gaël Poupard
89be07b51f Prevent .row from shrinking in flex container (#30940) 2020-06-24 15:16:58 +03:00
Martijn Cuppens
4f44a2afd0
Remove duplicate properties after #30922 (#31148) 2020-06-23 09:28:13 +03:00
Gaël Poupard
7b5e48d307
fix(custom forms): disabled checked states weren't overriding background-image (#30922) 2020-06-15 08:41:12 +03:00
k-utsumi
c3572ceca9
Avoid duplication of container breakpoints (#30969) 2020-06-14 00:25:39 +03:00
Gaël Poupard
7c6a0db820
Floating labels examples in IE (#30965)
* docs(example): drop IE workaround since it works fine in IE

* Serial comma

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-06-13 09:38:13 +03:00
Gaël Poupard
5b8163301c
Backport #30979 (#30999)
fix(grid)[manual backport]: zero min-width on .col has too much side-effects
2020-06-10 16:12:12 +03:00
Laussel Loïc
e9f039d1fe
avoid preventing input event onclick (#30992)
* instead of stopping event if onclick is triggered on input, call toggle method only if its not on checkbox inside a label

* add unit test

* add a dedicated test to ensure click event is forward to label

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-06-10 15:45:31 +03:00
Gaël Poupard
ba6d5e802b docs(toasts): centered examples flexbugs #3 in IE11 2020-06-10 08:14:30 +03:00
Gaël Poupard
8429acf460 fix(toasts): IE11 shrinks toasts when in flex container, unless we specify flex-basis 2020-06-10 08:14:30 +03:00
XhmikosR
3caea1ca02 visual/modal.html: fix close buttons placement 2020-06-04 17:53:16 +03:00
XhmikosR
7ac763bcdc Bump bundlewatch limits 2020-06-04 17:53:16 +03:00
XhmikosR
8bc6dcd280 Backport #30936
Add role="dialog" in modals via JavaScript
2020-06-04 17:53:16 +03:00
XhmikosR
288b9b82b5 Backport #30932
Restore word-break: break-word on .text-break to fix text breaking on flex containers
2020-06-04 17:53:16 +03:00
XhmikosR
ac3c2e2356 Update devDependencies and gems 2020-06-04 17:53:16 +03:00
XhmikosR
24d5a1e996 CI: update to actions/cache@2 2020-06-04 17:53:16 +03:00
XhmikosR
35310454b1 Remove ESLint object-curly-newline rule. 2020-06-04 17:53:16 +03:00
XhmikosR
7a9bbd4489 Backport #30742
Update to `@rollup/plugin-babel`
2020-06-04 17:53:16 +03:00
Martijn Cuppens
fdb596b2c3 Prevent conflicts with components with classes (#30830) 2020-06-04 17:53:16 +03:00
Mark Otto
ce23903a76 v5: Add border-radius to .card-img-overlay (#30817)
Allows use of background-color and more. Fixes #29033 for v5.
2020-06-04 17:53:16 +03:00
Mark Otto
ac48bbe081 Simplify list-group borders in cards (#30808) 2020-06-04 17:53:16 +03:00
Mark Otto
f4a7888af5
v4: Add z-index to .custom-check to fix custom checks in CSS columns (#30810)
For some reason, custom checks in CSS columns need a new stacking order to maintain visibility. This PR adds `z-index: 1` to trigger that new stacking order. Since v5's forms are being redone entirely, and we're dropping IE10/11 there, I think this is totally fine to ship with v4 only. Will need to check v5's forms it in Edge though.

Fixes #29607.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-06-04 16:11:33 +03:00
Gaël Poupard
4e685e70b7
fix(custom forms): nullify box-shadow for custom forms' states (#30957)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-06-04 09:34:30 +03:00
Gaël Poupard
b287736327
fix(forms): IE11 misalign validation tooltips in input-groups (#30960) 2020-06-04 09:27:08 +03:00
Gaël Poupard
6f4d9fff02
docs(cards): fix card-img-bottom example (#30925) 2020-05-29 18:01:40 +03:00
Gaël Poupard
daa01aacb5
docs(CDN): improve wording to match master and fix #30873 (#30896) 2020-05-26 18:48:53 +03:00
Mark Otto
58dd4cc66c
v4: Update docs callout for responsive SVG images (#30809)
Turns out this applies to IE11 as well as IE10, so this clarifies the docs callout.

Closes #25242.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-05-14 09:18:01 +03:00
Mark Otto
a8eb919f44
v4: Mention Bootstrap Icons in extend/icons.md (#30813)
- Closes #30796
2020-05-14 09:06:08 +03:00
XhmikosR
700c6036aa
Fix release script docs (#30797) 2020-05-13 09:13:27 +03:00
XhmikosR
7a6da5e3e7 Dist 2020-05-12 20:44:42 +03:00
XhmikosR
109ad5db90 Bump version to 4.5.0. 2020-05-12 20:44:42 +03:00
Mark Otto
4a0ddb02db Wording fixes 2020-05-12 19:21:36 +03:00
XhmikosR
0f26be5ff3 Move the input groups validation workaround in docs. 2020-05-12 19:21:36 +03:00
XhmikosR
842b0d2ae4 Remove mention of build tools
They are not included in npm.
2020-05-12 19:21:36 +03:00
XhmikosR
32932d27d5 Grammar fixes 2020-05-12 19:21:36 +03:00
XhmikosR
4a26e51540 Include the newly added utilities/interactions.scss file
We missed it in #30562
2020-05-12 19:21:36 +03:00
XhmikosR
0f3eda8254 Update devDependencies and gems. 2020-05-12 19:21:36 +03:00
XhmikosR
30e7df6cca Backport d59de33 from #30772
Add a test about the scrollbar issue on non-integer width
2020-05-12 19:21:36 +03:00
Giovanni Mendoza
f1827ce9cd Avoid bad scrollbar replacement into width values
Refs #30772
2020-05-12 19:21:36 +03:00
XhmikosR
eb1df3e079 Update codeql.yml (#30777)
Remove moot fail-fast option
2020-05-12 19:21:36 +03:00
XhmikosR
df91d2cab0 Improve build/zip-examples.js (#30759)
* remove favicons meta tags
* copy the two brand images we use in the examples
* copy dist and brand images into an assets folder
2020-05-12 19:21:36 +03:00
Rohit Sharma
d2f9fbd055 Removed role="document" from the modal dialog (#30755) 2020-05-12 19:21:36 +03:00
XhmikosR
bad48dc3b9 CI: simplify cache
While it might not be possible to invalidate the cache by changing test.yml, this should speed things up a lot due to `bundle i` taking most of the time.
2020-05-12 19:21:36 +03:00
XhmikosR
86f2c01459 Partially revert "Use regex.test() when we want to check for a Boolean. (#29969)"
This partially reverts commit 6c46493803.
2020-05-12 19:21:36 +03:00
XhmikosR
955c437f32 collapse.js: combine classes 2020-05-12 19:21:36 +03:00
XhmikosR
eb720f20ff Minor lint tweaks and rules cleanup 2020-05-12 19:21:36 +03:00
XhmikosR
53eace04df build-plugins.js: add missing shebang (#30743) 2020-05-12 19:21:36 +03:00
XhmikosR
1c9e203c52 dropdown.js: switch to a ternary 2020-05-12 19:21:36 +03:00
XhmikosR
5f79b75ea8 tests: switch to strictEqual/notStrictEqual 2020-05-12 19:21:36 +03:00
XhmikosR
195585f5a6 scrollspy.js add more tests 2020-05-12 19:21:36 +03:00
XhmikosR
fa8a7eca06 Remove variables used once. 2020-05-12 19:21:36 +03:00
XhmikosR
52fdab8d70 Join/break a few lines, no functional changes 2020-05-12 19:21:36 +03:00
XhmikosR
b3601aae5b README.md: change Tests badge to point to v4-dev 2020-05-12 19:21:36 +03:00
XhmikosR
456194da11 package.json: add a docs-build script
Make the `docs-compile` one an alias of `docs-build`.
2020-05-12 19:21:36 +03:00
XhmikosR
fb4c8eacb0 CI: stop updating RubyGems since it's not needed 2020-05-12 19:21:36 +03:00
Mark Otto
5d10e4a58e
Add new interaction utilities and role attr to Reboot (#30562)
- Adds .user-select-* utils from v5
- Adds button role attribute util, one of the top requested features in our issues for adding pointer cursors
- Adds new docs page to demonstrate both
- Includes Sass list for customizing user select
2020-05-11 20:57:29 +03:00
XhmikosR
fce3370843 Backport #29272 and adapt if for v4-dev
docs: fix tap targets
2020-05-10 12:19:58 -07:00
XhmikosR
345d68cdbb Add loading="lazy" in images
Backport of #30199 after adapting it for v4-dev.
2020-05-10 12:19:58 -07:00
Mark Otto
a1d8ed4413 v4: Update homepage, examples, and general docs styles
- Refreshes the look and feel of the homepage with fresh colors, new content, and simplified styles.
- Updates docs button styles
- Replaces bytesize icons with Bootstrap icons
- Adds themes callout to examples page
2020-05-10 12:19:58 -07:00
XhmikosR
4111242cbb Update devDependencies and gems 2020-05-07 09:31:49 +03:00
XhmikosR
e82888daf4 Revert "Avoid bad scrollbar replacement into width values (#30690)"
This reverts commit 5f00bba652.
2020-05-07 09:31:49 +03:00
Johann-S
015aaf3c3d ensure build plugins can exit in error (#30744)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-05-07 09:31:49 +03:00
Johann-S
22f75ca2e3 enforce element check on scrollspy target 2020-05-07 09:31:49 +03:00
XhmikosR
5f267b1854 Update jQuery to v3.5.1. 2020-05-07 09:31:49 +03:00
XhmikosR
0f6cb9139f scrollspy.js: remove temporary variable (#30724) 2020-05-07 09:31:49 +03:00
XhmikosR
f3aed77dc7 Backport #30723
Move babel whitelist helpers to a common file
2020-05-07 09:31:49 +03:00
XhmikosR
d8691fcd5a Update codeql.yml (#30719)
Remove `pull_request` event since it's not supported.
2020-05-07 09:31:49 +03:00
XhmikosR
566c829a1c package.json: fix release script for v4. 2020-05-07 09:31:49 +03:00
Mark Otto
e51a09a2b8 Wording fixes 2020-05-06 20:56:04 +03:00
XhmikosR
8876866399 Update browser-bugs.md
Add a danger callout that the page is outdated
2020-05-06 20:56:04 +03:00
Quy
d63b651f37
Fix typo (#30745)
Use possessive form of it
2020-05-06 06:54:42 +03:00
XhmikosR
1fef25b777
Revert "v4: Add Release Drafter (#30701)" (#30711)
This reverts commit f93e58eddb.
2020-05-04 20:00:19 +03:00
XhmikosR
63dbe4705d search.js: make the check for URL stricter (#30695) 2020-05-02 15:39:19 +03:00
Johann-S
5f00bba652 Avoid bad scrollbar replacement into width values (#30690) 2020-05-02 15:39:19 +03:00
XhmikosR
c06a1f305d Backport #30130
Add a script to zip the built examples
2020-05-02 15:39:19 +03:00
Johann-S
1b16736a72 fix package.json add extension in main field 2020-05-02 15:39:19 +03:00
Martijn Cuppens
ec637483f2 Backport #30685
`<pre>`: Disable auto-hiding scrollbar in IE & legacy Edge
2020-05-02 15:39:19 +03:00
XhmikosR
971738b4b5 Backport the CodeQL Action addition 2020-05-02 15:39:19 +03:00
XhmikosR
33f47771ca Fix redirect 2020-05-02 15:39:19 +03:00
XhmikosR
6d9256d2b1 Backport #30362
Remove unneeded og:image:secure_url from social.html

The image is always available over HTTPS anyway
2020-05-02 15:39:19 +03:00
Mark Otto
f93e58eddb
v4: Add Release Drafter (#30701)
* Create release-drafter.yml
* Create release-notes.yml
2020-05-01 11:22:10 +03:00
Shohei Yoshida
e344ed4446
v4: Change input group validation examples (#30180)
* Change input group examples

* Update forms.md

* Update site/docs/4.4/components/forms.md

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
Co-authored-by: Mark Otto <markd.otto@gmail.com>
Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-04-30 09:29:03 +03:00
Mark Otto
f79d14f7c8
Fixes #30503 to replace renamed position utility (#30505) 2020-04-30 08:11:51 +02:00
XhmikosR
748b1b9a5a CI: remove no longer needed steps (#30674)
The latest `actions/setup-node` prints this info by default
2020-04-28 20:59:30 +03:00
XhmikosR
5ecccd1171 Update devDependencies and gems. 2020-04-28 20:59:30 +03:00
Martijn Cuppens
92fe8445b1 Prevent list group style leaks (#30660) 2020-04-28 20:59:30 +03:00
XhmikosR
9c7ee5e554 CI: set CI_BRANCH_BASE to v4-dev
This is so that bundlewatch compares against v4-dev and not master.
2020-04-28 20:59:30 +03:00
XhmikosR
f5c7da4c78 Backport 9b97dc6
Tweak syntax highlighting colors to be WCAG2AA valid.

Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-04-28 20:59:30 +03:00
Martijn Cuppens
7a678fc64f Backport #30633
Remove caret element
2020-04-28 20:59:30 +03:00
Martijn Cuppens
a66d9a3d50 Backport #30605
grid: checks for `$grid-columns > 0`
2020-04-28 20:59:30 +03:00
Catalin Zalog
9d0097013a Backport #30606 (#30612)
checks for `$grid-row-columns`
2020-04-28 20:59:30 +03:00
Catalin Zalog
4853c5b527 feat: checks for $grid-breakpoints map list (#30609)
Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-04-28 20:59:30 +03:00
Mark Otto
c4355e4a6b v5: Improve the responsiveness of our Dashboard example (#30573)
Cleans up some column classes to ensure things line up across all viewports. Also fixes some broken padding on the .navbar-brand.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-04-28 20:59:30 +03:00
k-utsumi
0321c632ed Delete appearance from button.close (#30582) 2020-04-28 20:59:30 +03:00
XhmikosR
e33e344410 Revert "Add dependabot config for v4 (#30008)"
This reverts commit 04b8219c18.
2020-04-28 20:59:30 +03:00
Martijn Cuppens
9f7fc4ac2b
Deprecate bg-gradient-variant mixin (#30594)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-04-18 09:12:51 +03:00
XhmikosR
f5ec0dbf74 collapse: fix error with jQuery v3.5.0. 2020-04-17 11:41:32 +03:00
XhmikosR
d848c32297 Fix tests for jQuery v3.5.0. 2020-04-17 11:41:32 +03:00
XhmikosR
05cfefd32b Update jQuery to v3.5.0. 2020-04-17 11:41:32 +03:00
XhmikosR
04b8219c18
Add dependabot config for v4 (#30008) 2020-04-13 21:51:22 +03:00
XhmikosR
341ad62517 Update clipboard.js to v2.0.6 2020-04-13 21:12:29 +03:00
XhmikosR
5053725870 Update bs-custom-file-input.js to v1.3.4 2020-04-13 21:12:29 +03:00
XhmikosR
04c1ecd79d Update devDependencies and gems 2020-04-13 21:12:29 +03:00
Martijn Cuppens
abc17a4858 Backport #30555
Use `box-shadow` mixin for `.form-select`
2020-04-13 21:12:29 +03:00
Martijn Cuppens
4d863effdb Backport #30512
Use `box-shadow` mixin for `.btn`
2020-04-13 21:12:29 +03:00
XhmikosR
5455e30048 Backport #30542
Remove redundant class and line height
2020-04-13 21:12:29 +03:00
XhmikosR
c1a75a7d8f Add v4-dev in bundlewatch config. (#30541) 2020-04-13 21:12:29 +03:00
XhmikosR
adb08ca33a Replace bundlesize with bundlewatch. (#30538) 2020-04-13 21:12:29 +03:00
Mark Otto
5f15f8cdbd Fix spinner-grow animation (#30504)
* Fix spinner-grow animation

Safari seems to be interpreting the old keyframes animation as incomplete. Adding `transform` to the second frame seems to resolve the issue.

Co-Authored-By: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-04-13 21:12:29 +03:00
Catalin Zalog
6edeaa4291 Add .card-footer color (#30515) 2020-04-13 21:12:29 +03:00
Martijn Cuppens
fe9384c216 Backport #30497
Fix card list group borders & radii
2020-04-13 21:12:29 +03:00
Martijn Cuppens
ddc58343d3 Backport #30480
Use `box-shadow` mixin for form controls
2020-04-13 21:12:29 +03:00
Martijn Cuppens
706bd3602d Backport #30391
transition() mixin prevent redundant 'transition: none' and pass `null`
2020-04-13 21:12:29 +03:00
Laussel Loïc
0cf29baf63
v4 tabs - accessibility issue when using ul/li semantic (#30381)
Add aria-role presentation on li element when ul element has role tablist and remove dropdown from visual tests as they've been removed from doc
2020-04-10 08:35:09 +03:00
luktom
8cc9defbc0
Fix event propagation from inactive and disabled dropdowns (#30510) (#30511) 2020-04-07 21:16:17 +03:00
Martijn Cuppens
1b575c27cd
Backport #30353 (#30361)
Remove appearance from date inputs

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-04-01 08:53:07 +03:00
XhmikosR
f7ed579d91
Switch to string constants. (#30490)
This allows the minifier to mangle the constants. It also allows the linter to find unused strings properly.

While at it, remove a few unused properties.

File                        Before      After       Diff
--------------------------------------------------------
bootstrap.bundle.min.js     22.09 kB    21.13 kB    -0.96 kB (-4.35 %)
bootstrap.min.js            15.4 kB     14.46 kB    -0.94 kB (-3.86 %)
2020-03-31 21:27:35 +03:00
XhmikosR
0225c1173b Bump devDependencies and gems. 2020-03-31 21:11:29 +03:00
XhmikosR
467c961976 Remove holder.js leftovers (#30469) 2020-03-31 21:11:29 +03:00
Tim Dujardin
b30c68f8a1 Added focus state to .btn-link (#30036) 2020-03-31 21:11:29 +03:00
XhmikosR
573c10f099 Backport #30041 and #30448
Switch links to the GitHub organization and fix redirected links
2020-03-31 21:11:29 +03:00
Shohei Yoshida
effe4e9588 Update modal docs (#30325) 2020-03-31 21:11:29 +03:00
Johann-S
dabd458b4b Backport (#30383)
fix: ensure totype always return stringified null when null passed
2020-03-31 21:11:29 +03:00
XhmikosR
0c8d8a48e1 Backport (#30418)
Open icons in a new tab like the rest of the external links
2020-03-31 21:11:29 +03:00
XhmikosR
03fec36b44 Clarify card group behavior (#30416)
Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-03-31 21:11:29 +03:00
XhmikosR
138e8da421 CI: switch to Ruby 2.6. 2020-03-31 21:11:29 +03:00
Frank Liepert
45c99f7130
Prevent vertical offset in IE 11 (#29413)
Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-03-31 14:09:09 +02:00
Laussel Loïc
8b6dd449d7
fix $().button('toggle') not working for checkbox inside label (#30388) 2020-03-16 14:28:33 +02:00
XhmikosR
ac5685d368 Update .github/workflows/test.yml 2020-03-09 16:26:10 +02:00
XhmikosR
81e8f52fcb Revert "CI: switch to Ruby 2.6" 2020-03-09 16:26:10 +02:00
XhmikosR
d65977a991 Backport #29920
Add lockfile-lint
2020-03-09 16:26:10 +02:00
XhmikosR
90fef3086d CI: switch to Ruby 2.6 2020-03-09 16:26:10 +02:00
XhmikosR
9b71d9817d Update CI caching 2020-03-09 16:26:10 +02:00
XhmikosR
3b5283602c Replace uglify-js with terser. 2020-03-09 16:26:10 +02:00
XhmikosR
cc3ca2586f Update Jekyll to v4.0.0. 2020-03-09 16:26:10 +02:00
XhmikosR
906a5de548 Replace broken-link-checker with linkinator 2020-03-09 16:26:10 +02:00
XhmikosR
61276d0881 Drop Node.js < 10 support and update all devDependencies.
* sinon 8.x doesn't work with IE, so leave it at 7.x.
2020-03-09 16:26:10 +02:00
XhmikosR
0ca1ec6fc3 Update devDependencies and gems 2020-03-09 16:08:41 +02:00
XhmikosR
f852dff122 build/ship.sh: shellcheck fixes. (#30197)
Also add `set -e` so that if a command fails the whole script fails too.
2020-03-09 16:08:41 +02:00
Martijn Cuppens
efb3fc402e $link-decoration: underline affects some components (#30262)
Co-authored-by: Shohei Yoshida <fellows3@gmail.com>
Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-03-09 16:08:41 +02:00
Martijn Cuppens
81ba76bb3c CSS & alignment tweaks 2020-03-09 16:08:41 +02:00
Minobi
39ac525f6e Example dashboard: fix menu disappearing on small viewport 2020-03-09 16:08:41 +02:00
Shohei Yoshida
fa7510c6af Fix centered modal scrolling issue (#30244)
Use the `min-content` property.
2020-03-09 16:08:41 +02:00
XhmikosR
69f36286f9 Update jekyll-toc to v0.13.1. 2020-02-17 21:33:54 +02:00
XhmikosR
52c13233a3 Update devDependencies and gems. 2020-02-17 21:33:54 +02:00
XhmikosR
642d1001e3 .gitattributes: add .sh and remove .rb files. (#30196) 2020-02-17 21:33:54 +02:00
Gaël Poupard
473d36ff38 docs(theming): improve headings hierarchy under Sass → Functions (#30207) 2020-02-17 21:33:54 +02:00
XhmikosR
4a7cbd5b9f Backport #29971
Remove old versions from docs-navbar.html
2020-02-17 21:33:54 +02:00
Shohei Yoshida
c40b71318c Remove unnecessary reduce motion when $enable-transition: false (#30183) 2020-02-17 21:33:54 +02:00
Christian Oliff
037bad148c Add Microsoft Edge for MacOS to supported browsers (#29956)
The new Chromium-based Edge has been available as a beta for sometime and general availability of the final version is expected to ship from Jan 15. I think it makes sense to add it as a supported browser once it's out of beta.
REF: https://blogs.windows.com/windowsexperience/2019/11/04/introducing-the-new-microsoft-edge-and-bing/
2020-02-17 21:33:54 +02:00
Giovanni Mendoza
0bd57ce212 Added new variable for padding on dropdown header (#29946)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-02-17 21:33:54 +02:00
XhmikosR
8c4b61e30c change-version.js: Remove nuspec files (#30161)
The version in the nuspec files is updated automatically from package.json through MyGet.ps1
2020-02-17 21:33:54 +02:00
Shohei Yoshida
c77ec4fb06 Avoid border-radius functions return negative values (#30166)
* Avoid border-radius functions return negative values

* Update _border-radius.scss

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-02-17 21:33:54 +02:00
XhmikosR
4ea685a001 Bump bootstrap.min.js bundle size limit. 2020-02-17 21:33:54 +02:00
Martijn Cuppens
0d35f10842 Add ysds to the team page (#30145) 2020-02-17 21:33:54 +02:00
Giovanni Mendoza
6daae47cc0 Backport #29886
Close modal with keyboard=true & backdrop=static
2020-02-17 21:33:54 +02:00
Jesse Mandel
0f0a8c364d Updated nuspec content files and icon (#30148)
* #30045 - Update nuspec for updated content type

* Update iconUrl (deprecated) to icon

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-02-17 21:33:54 +02:00
Jens Luyten
7ca811315f Prevent grid with default cols from breaking when large pre was present (#30049) 2020-02-17 21:33:54 +02:00
Martijn Cuppens
1884b8a421 Backport #29325. (#30074)
`.text-break` fix
2020-02-17 21:33:54 +02:00
jorimvanhove
92525e9ec4 IE auto-size input-group to column (#30043) 2020-02-17 21:33:54 +02:00
XhmikosR
6c46493803 Use regex.test() when we want to check for a Boolean. (#29969) 2020-02-17 21:33:54 +02:00
XhmikosR
f737c73a27 javascript.md: Add srcset in sanitizer docs (#30007) 2020-02-17 21:33:54 +02:00
XhmikosR
411922b14d sanitizer.js: Add srcset in the allowed attributes (#29968) 2020-02-17 21:33:54 +02:00
Martijn Cuppens
21041eecb7
Backport #30090 (#30175)
Add version number to documentation `<title>`
2020-02-14 22:15:04 +02:00
Martijn Cuppens
fbf294a605
Fix disabled .btn cursor (#30004) 2020-02-03 19:54:29 +01:00
XhmikosR
0d1aee6a2f reboot.md: Add missing Noto Sans font (#29937)
* reboot.md: Add missing Noto Sans font

* Sans serif order fix

Co-authored-by: Martijn Cuppens <martijn.cuppens@gmail.com>
2020-01-02 12:11:56 +02:00
XhmikosR
3c0cf9365b Bump copyright year to 2020. (#29944) 2020-01-02 12:11:56 +02:00
XhmikosR
0e09c6b831 package.json: move funding property higher. (#29936) 2020-01-02 12:11:56 +02:00
XhmikosR
80d842b501 Update devDependencies and gems 2020-01-02 12:11:56 +02:00
Martijn Cuppens
55945dcc36 README.md: show sponsors first (#29931) 2020-01-02 12:11:56 +02:00
XhmikosR
42714733b6 CI: fix Ruby caching 2020-01-02 12:11:56 +02:00
Martijn Cuppens
35d5cbf4fd Escape brackets (#29857)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-01-02 12:11:56 +02:00
Martijn Cuppens
0d08c74d2f Allow percentages in container widths (#29819) 2020-01-02 12:11:56 +02:00
Martijn Cuppens
00b0e0a9b7 Documentation fix: move width after make-container() mixin (#29820)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-01-02 12:11:56 +02:00
XhmikosR
16a82e7e99 Update test.yml (#29863)
Fix cache name
2020-01-02 12:11:56 +02:00
XhmikosR
e2530bf312 Update devDependencies and gems 2019-12-14 17:09:46 +02:00
XhmikosR
2d54fa9c3f Actions: add gems caching 2019-12-14 17:09:46 +02:00
XhmikosR
97e2e0da7c CI: update to actions/checkout@v2 (#29847) 2019-12-14 17:09:46 +02:00
XhmikosR
b77af55325 Actions: add npm cache (#29765) 2019-12-14 17:09:46 +02:00
AlexKoala
52aceee0ab docs: Add Korean translation link 2019-12-14 17:09:46 +02:00
719media
70de5e8398 Fix breadcrumb spacing with whitespace (#29745) 2019-12-14 17:09:46 +02:00
Shohei Yoshida
52762f83d8 Improve wrapping and hit area of accordion example titles (#29782) 2019-12-14 17:09:46 +02:00
XhmikosR
dca1ab7d87 Release v4.4.1. 2019-11-28 14:59:49 +02:00
Shohei Yoshida
b07b6f743c Fix dart Sass compatibility for subtract (#29763) 2019-11-28 14:59:49 +02:00
Shohei Yoshida
0d148d8854 V4: Add :disabled for disabled fieldset (#29762) 2019-11-28 14:59:49 +02:00
Martijn Cuppens
c24aaa6cbf Fix dart Sass compatibility (#29755) 2019-11-28 14:59:49 +02:00
XhmikosR
301ee1972d Update Gemfile.lock 2019-11-28 14:59:49 +02:00
XhmikosR
593574d510
Release v4.4.0 (#29735) 2019-11-26 19:12:00 +02:00
XhmikosR
d61bba584f Backport #29734
justify-content:between ⇒ justify-content:space-between
2019-11-26 09:51:27 +02:00
XhmikosR
7aa1722a97 Update change-version.js (#29736)
Add `.nuspec` to the extensions list
2019-11-26 09:51:27 +02:00
XhmikosR
340009e6de Update devDependencies and gems. 2019-11-25 13:12:53 +02:00
XhmikosR
bdd8752994 Switch to the Coveralls Action (#29478)
This is the official way of using Coveralls with Actions. Also this brings back Coveralls for PRs.
2019-11-25 13:12:53 +02:00
XhmikosR
e0a2d5890d Backport #29624
config.yml: update popper.js to v1.16.0
2019-11-25 13:12:53 +02:00
XhmikosR
136afcf59b Update anchor.js to v4.2.1 (#29662) 2019-11-25 13:12:53 +02:00
Sam Duvall
eb1e1cfb49 Fixed input-height-sm and input-height-lg calculations (#29653) 2019-11-25 13:12:53 +02:00
Martijn Cuppens
5be0fe8820 package.json: Add funding property (#29646) 2019-11-25 13:12:53 +02:00
XhmikosR
a0bb417691 Fix icons link. 2019-11-25 13:12:53 +02:00
Martijn Cuppens
590c1baeeb progress: Fix IE overflow (#29629) 2019-11-25 13:12:53 +02:00
XhmikosR
f12ae8cea2 Sass: fix version in deprecation messages.
The final version will be bumped when the next version is released.
2019-11-25 13:12:53 +02:00
Gary PEGEOT
6b7ca1234b Make check label cursor customizable (#29633) 2019-11-07 21:02:10 +02:00
XhmikosR
0aa6a81c11 Update devDependencies and gems. 2019-11-02 10:02:07 +02:00
XhmikosR
7629daedc1 Update modal.md (#29621)
Fix typo
2019-11-02 10:02:07 +02:00
Johann-S
dd96b832f7 backport #29516: added animation when modal backdrop is static 2019-11-02 10:02:07 +02:00
Johann-S
29f585365f backport #29523: skip hidden dropdowns while focusing 2019-11-02 10:02:07 +02:00
Martijn Cuppens
f55566e36b Add configurable button text wrapping (#29554) 2019-11-02 10:02:07 +02:00
XhmikosR
7ecfa6a343 Backport #29585
Enable eslint no-console rule except for build directory
2019-11-02 10:02:07 +02:00
XhmikosR
7453733ff6 Backport #29544
Add link to Icons site in our docs
2019-11-02 10:02:07 +02:00
XhmikosR
dd6b8682a6 CI: disable gem docs globally 2019-11-02 10:02:07 +02:00
XhmikosR
8e935b60c8 CI: install bundler 1.17 and without docs 2019-11-02 10:02:07 +02:00
Mark Otto
9be7aac831 Add make-col-auto mixin (#29367) 2019-11-02 10:02:07 +02:00
XhmikosR
f830450ca8 Fix highlighting.
v4-dev is using Jekyll, not Hugo.
2019-11-01 20:22:37 +02:00
Martijn Cuppens
b0b8d3c982 Convert v4-dev calc() left overs to add/subtract functions 2019-11-01 20:22:37 +02:00
Martijn Cuppens
90d4b72e06 Add calc() to function blacklist 2019-11-01 20:22:37 +02:00
Mark Otto
ea1d09c444 Doc tweaks. 2019-11-01 20:22:37 +02:00
ysds
7bd70e54f2 Add add and subtract function 2019-11-01 20:22:37 +02:00
Martijn Cuppens
ed4a4e6081 Link to versioned RFS repo (#29598) 2019-10-28 08:41:08 +02:00
Christian Oliff
087d0ea1e1 The HTML5 Boilerplate Print CSS moved to a separate repo (#29522)
The HTML5 Boilerplate CSS has moved to a separate GitHub repo (h5bp/main.css) so the source link referenced here no longer works. This PR updates the link to the new correct location.
2019-10-15 09:40:01 +03:00
XhmikosR
8cf6c209d8 Update devDependencies and gems.
Locked qunit to v2.9.2 to prevent test failures. We should revisit qunit later.
2019-10-14 12:12:05 +03:00
ysds
db19e8c706 Fix incorrect aspect ratio on IE11 2019-10-14 12:12:05 +03:00
Martijn Cuppens
510a446be6 Remove redundant properties 2019-10-14 12:12:05 +03:00
Martijn Cuppens
327bfca418 Fix top level ampersand (#29518)
Fixes dart sass compatibility.
2019-10-14 12:12:05 +03:00
XhmikosR
be452a0ed3 CI: move CI env variable to the root of the workflow. (#29499)
This way we match the Travis CI behavior, and it's inherited by all steps.
2019-10-14 12:12:05 +03:00
XhmikosR
23a78f0ab1 Update .gitignore.
Remove the old Hugo static dist folder.
2019-10-14 12:12:05 +03:00
Martijn Cuppens
6c9640c245 Backport #29445
Remove outline from select box in Firefox
2019-10-14 12:12:05 +03:00
astrahov
1260b4fb3f Add variable for $breadcrumb-font-size (#29467) 2019-10-14 12:12:05 +03:00
Martijn Cuppens
d521e147f9 Fix border for single card in accordion (#29453) 2019-10-14 12:12:05 +03:00
Martijn Cuppens
f47243460e Variable card height (#29462) 2019-10-14 12:12:05 +03:00
XhmikosR
91a9fd96b9 coveralls: Add COVERALLS_GIT_BRANCH (#29458)
Without this, coveralls didn't receive the branch info thus leading to failures when we switched branches.
2019-10-14 12:12:05 +03:00
XhmikosR
5e304b60a1 workflows/test.yml: specify CI=true (#29440) 2019-10-14 12:12:05 +03:00
XhmikosR
4c74d58f26 README.md: link to the Actions page for Tests (#29480) 2019-10-14 12:12:05 +03:00
Martijn Cuppens
cd64a164f1 IE image fix (#29483) 2019-10-08 08:49:29 +03:00
XhmikosR
1f2b048312 Use 180 for the grid-cards placeholder images' height. 2019-09-26 18:37:07 +03:00
XhmikosR
caf889e49e Update devDependencies and gems. 2019-09-26 18:37:07 +03:00
Shohei Yoshida
b5ba078b12 Grid card example tweaks (#29409)
Stack in cards in one column when < md
2019-09-26 18:37:07 +03:00
XhmikosR
cdfba0be4a GH Actions updates. (#29429) 2019-09-26 18:37:07 +03:00
XhmikosR
61cc86d68d workflows/test.yml: use ruby-version.
`version` is deprecated.
2019-09-26 18:37:07 +03:00
XhmikosR
846b603413 workflows/test.yml: switch to setup-node@v1. (#29410) 2019-09-26 18:37:07 +03:00
XhmikosR
791b1943f2 Bump bundlesize limits. 2019-09-26 18:37:07 +03:00
ysds
8741eed7a5 Add responsive example 2019-09-26 18:37:07 +03:00
ysds
afc9cae32c Allow override default col width 2019-09-26 18:37:07 +03:00
Mark Otto
d08567797f Cleanup
- Rename and move the variable to variables file
- Move code to the grid file
- Use the mixin to generate our own classes
- Wrap in a grid classes enabled conditional
- Document the mixin
2019-09-26 18:37:07 +03:00
Mark Otto
acb2b7061c Move margins, and equal height via utility example 2019-09-26 18:37:07 +03:00
Mark Otto
9ed860ef24 First pass at .row-cols classes
Trying to find a new way to do responsive card decks while not locking ourselves into the cards themselves. My thinking here is we can easily control the column (.col) width by the parent, but I don't know how many we need (have 0-5 now) across each breakpoint. This works for cards so far, and I think could get us equal height, too.
2019-09-26 18:37:07 +03:00
XhmikosR
28758a03f0 carousel.md: Remove duplicate bd-example div. (#29341)
The example shortcode already adds this.
2019-09-26 18:37:07 +03:00
XhmikosR
f732bf025a docs: remove swatches for theme colors. (#29327)
Use the built-in utilities instead.
2019-09-26 18:37:07 +03:00
XhmikosR
68ddcec057 theming.md: bring :root up to par with Scss. (#29323)
Also, add a warning in _root.scss so that we don't miss it again.
2019-09-26 18:37:07 +03:00
XhmikosR
6d5739320e blog example: remove unused CSS. (#29316) 2019-09-26 18:37:07 +03:00
Martijn Cuppens
5d39e36083 Don't bind validation to form controls 2019-09-26 18:37:07 +03:00
XhmikosR
269e5351aa Update devDependencies and gems. 2019-08-27 16:32:25 +03:00
Johann-S
ef1c7aadbc Backport #29298
dropdown show method should do the same as toggle
2019-08-27 16:32:25 +03:00
XhmikosR
dd181e91bd Actions CI tweaks (#29276)
* Allow bundlesize to run for forks too.
* Add name for clone step.
* Add` fail-fast: false`
2019-08-27 16:32:25 +03:00
Johann-S
bab999701c Backport #29277
dropdown - destroy old popper.js references
2019-08-27 16:32:25 +03:00
tracyjordan
41b8ce278b fixed minor typo (#29291) 2019-08-27 16:32:25 +03:00
XhmikosR
de94f6003f test.yml: reindent. 2019-08-27 16:32:25 +03:00
XhmikosR
3a3b0a4eae change-version.js: Add _gh_pages folder in ignores. (#29270) 2019-08-27 16:32:25 +03:00
Martijn Cuppens
c4e5aa0d32 docs: fix tap targets (#29272) 2019-08-27 16:32:25 +03:00
Johann-S
7652d326e4 Backport #29251
allow to pass popper.js configuration for tooltip/popover and dropdown
2019-08-27 16:32:25 +03:00
Martijn Cuppens
6381c63fb1 Add deprecation warning 2019-08-26 09:29:50 +02:00
Martijn Cuppens
9e1ef5623f Deprecate nav-divider() mixin 2019-08-22 08:10:03 +02:00
Martijn Cuppens
9519b9e055 Enable wrapping for elements in .modal-footer (#25103) 2019-08-17 17:03:00 +03:00
Martijn Cuppens
94395af932 Restore cursor: pointer for checkbox/radio buttons (#29239) 2019-08-17 17:03:00 +03:00
Martijn Cuppens
81d5e6eb1b Clarify order documentation (#29252) 2019-08-17 17:03:00 +03:00
XhmikosR
38d055e7fb Fix redirects. (#29254) 2019-08-17 17:03:00 +03:00
XhmikosR
727c1684bb Update devDependencies and gems. 2019-08-17 17:03:00 +03:00
Martijn Cuppens
e538b9f23e Fix Firefox rendering issue (#29234) 2019-08-17 17:03:00 +03:00
XhmikosR
116da0b746 Bump bootstrap.min.css bundlesize limit. 2019-08-17 17:03:00 +03:00
Shohei Yoshida
c387223720 Fix min-width of input-group flex items (#29209) 2019-08-17 17:03:00 +03:00
Mark Otto
81fa902454 Responsive containers (follow-up to #29095) (#29118)
* Follow-up to #29095

This PR fixes the responsive containers that were added in #29095, originally stubbed out in #25631. Apologies to @browner12 for getting that wrong.

Fixes #25631.

* update navbar as well because we cannot reset all containers uniformly

* Update navbars example to include container-xl example to ensure containers match

* rewrite responsive containers docs, add table of max-widths

* Update container docs
- Move table up to the intro
- Remove the container example because it's actually hella confusing
- Update and link to grid example as a demo instead
2019-08-17 17:03:00 +03:00
XhmikosR
d55f6c3073 Simplify css-prefix scripts. (#29205) 2019-08-17 17:03:00 +03:00
Martijn Cuppens
e5a3ee5e9c Extend .container-fluid (#29106) 2019-08-17 17:03:00 +03:00
Mark Otto
3695c3a1fb fix broken classes 2019-08-17 17:03:00 +03:00
Mark Otto
2892675f65 v4/v5: Add responsive containers (#29095)
* create responsive containers

provide more flexibility and allow the user to determine when containers switch from fluid to fixed width.

* fix the base container code

this commit fixes the non-media portion of the generated CSS. I learned about the `@extends` directive and was able to put it to good use.

I create a new temporary map that contains all the main `$container-max-widths` and join it to our 2 special cases of 'xs' and 'fluid'.  Then we loop through that and, with the appropriate infixes, extend our placeholder

* formatting for style

forgot to run my tests before the last push, i think these are better.

* finish incomplete comment

* fix the responsive containers

using the `@extend` directive I was able to clean up this code

* fix responsive containers in the navbar

mostly we just look through all of our breakpoints so we can include all of the responsive container classes in the tweaks we have to do for the navbar (redeclaring flex properties, don't double up on padding, etc)

* Simplify container extends

* Simplify navbar containers

* Rearrange, add comments, ensure everything is nested in $enable-grid-classes

* Reduce new CSS by using attribute selector

We avoid using `@extend` whenever possible, and this is more readable

* Update _grid.scss

* Update _navbar.scss

* Add docs for responsive containers, redesign the container layout page

* Add to the Grid example
2019-08-17 17:03:00 +03:00
XhmikosR
9abaafa546
Add workflows/test.yml for v4-dev. (#29230) 2019-08-09 10:38:33 +03:00
XhmikosR
c93fdec2f0
Disallow crawling on Netlify. (#29194) 2019-08-03 17:09:25 +03:00
Herst
8c3a1298f7 Add missing role="document" (#29172) 2019-07-31 11:37:39 +03:00
XhmikosR
fb6266a8df carousel: fix transition properties order. (#29173) 2019-07-31 11:37:39 +03:00
XhmikosR
96d4a64944 Update devDependencies and gems. 2019-07-31 11:37:39 +03:00
Patrick H. Lauke
cf07b5a7ab Fix minor typo (#29168) 2019-07-31 11:37:39 +03:00
Shohei Yoshida
f6b00cda24 Fix reboot for placeholder links (#29164) 2019-07-31 11:37:39 +03:00
Patrick H. Lauke
af0786b10f Minor: fix sentence (#29160)
"Popovers whose both title..."
2019-07-31 11:37:39 +03:00
Patrick H. Lauke
d5266dc995 Fix reboot for placeholder links (#29162)
Backport of #29140
2019-07-31 11:37:39 +03:00
Chandan Deep
397359154c Change property from background to background-image (#29149)
For Gradient, We have to use the background-image instead of only background.
2019-07-31 11:37:39 +03:00
Brian Juul Andersen
cd58245f10 Update scrollspy.md (#29156)
Fixed minor grammatical error:

"... the best method get scroll ..."

=>

"... the best method to get scroll ..."
2019-07-31 11:37:39 +03:00
Johann-S
e4d4c5d0bc Backport #29155
allow dynamic modal body for scrollable modals
2019-07-31 11:37:39 +03:00
Martijn Cuppens
8f95b26d65 Haha, floats. It's 2019 (#29147) 2019-07-31 11:37:39 +03:00
XhmikosR
e1cd51e4fb Update docs vendor libs (#29134)
* Update bs-custom-file-input.min.js to v1.3.2.
* Update anchor.min.js to v4.2.0.
2019-07-31 11:37:39 +03:00
XhmikosR
dcdd9be0b3 Backport #29121.
Remove https://glyph.smarticons.co/ from list of suggestions.
The domain is now for sale and is triggers warnings in Firefox and Chrome
2019-07-31 11:37:39 +03:00
Martijn Cuppens
48e86c5796 Apply at-mixin-argumentless-call-parentheses: always stylelint rule for v4 mixins 2019-07-31 11:37:39 +03:00
Martijn Cuppens
d59aa2c702 Apply at-mixin-argumentless-call-parentheses: always stylelint rule 2019-07-31 11:37:39 +03:00
XhmikosR
22f6a4beea Add --continue-on-error in the css-lint script. (#29119) 2019-07-31 11:37:39 +03:00
Shohei Yoshida
470adc3f16 Force reflow for fade-in animation (#29113) 2019-07-31 11:37:39 +03:00
XhmikosR
e01103e3f9 Downgrade karma-browserstack-launcher to v1.4.0. (#29109)
This might fix the build failures we are getting.
2019-07-31 11:37:39 +03:00
Martijn Cuppens
9322cc83bc Simplify css-compile-main script (#29102) 2019-07-31 11:37:39 +03:00
XhmikosR
0f376c1107 Update svgo.yml. (#29089) 2019-07-31 11:37:39 +03:00
Kitten King
b66abdf3b1 Fix Typos across Bootstrap repository (#29082) 2019-07-31 11:37:39 +03:00
XhmikosR
1bee3c03cf Remove iconic and add feather icons. (#29079) 2019-07-31 11:37:39 +03:00
Martijn Cuppens
a2a38058af .custom-select: combine properties. 2019-07-30 15:43:38 +03:00
XhmikosR
41fd25abe1 Optimize the inline SVGs. 2019-07-30 15:43:38 +03:00
XhmikosR
f233e05acc Disable the !default rule for our docs variables. 2019-07-30 15:43:38 +03:00
XhmikosR
eeea633150 Use the background shorthand. 2019-07-30 15:43:38 +03:00
XhmikosR
a5d280365b docs: use the escape_svg function. 2019-07-30 15:43:38 +03:00
Martijn Cuppens
c26e68427c Backport "Use escape-svg() function (#29077)"
Adapted for v4-dev.
2019-07-30 15:43:38 +03:00
XhmikosR
68ab243ffa SVGs: lowercase hex values. 2019-07-30 15:43:38 +03:00
XhmikosR
cac30c0722 Update devDependencies. 2019-07-17 14:48:26 +03:00
XhmikosR
def8173e7b Fix bootstrap-themes.png. (#29061)
For some reason the old image was bad quality.
2019-07-17 14:48:26 +03:00
M. Wacker
921f17a650 Fix breaking layout breaking error in code (#28328)
Change `word-break: break-word;` to `word-wrap: break-word;`
2019-07-17 14:48:26 +03:00
Brian Juul Andersen
636204974b Updated sentence (#29051)
Checkboxes and radios use are built to support HTML-based form

=>

Checkboxes and radio buttons support ...
2019-07-17 14:48:26 +03:00
Manuel Alcaraz
c6cbae6b2a #29034 Fix broken links (#29035) 2019-07-17 14:48:26 +03:00
Sunny Dhoke
4e4a1febb0 Added link to creative commons license (#29032)
The previous link is dead one.
2019-07-17 14:48:26 +03:00
Brian Juul Andersen
f2185b9b5f Update collapse.md (#29025)
Corrected minor spelling error.
2019-07-17 14:48:26 +03:00
Johann-S
a894ea3a51 updated babel 2019-07-17 14:48:26 +03:00
XhmikosR
0ad0985ac0 Update devDependencies and gems.
Also lock babel versions, since we get failures with newer ones.
2019-07-10 11:03:54 +03:00
XhmikosR
d361194a99 Move bundlesize config to a separate file. (#29002) 2019-07-10 11:03:54 +03:00
Patrick H. Lauke
3d72b94ee9 Add prefers-reduced-motion callout to toast documentation (#28993)
x-ref #28987
2019-07-10 11:03:54 +03:00
Bardi Harborow
d395dfaafc Add ARIA search landmark to documentation. (#28983) 2019-07-10 11:03:54 +03:00
Martijn Cuppens
e61d609bc0 Ignore the bg-variant deprecation warning in our files. 2019-07-10 11:03:54 +03:00
Martijn Cuppens
23d7dd6dbd Remove redundant radius properties (#28956) 2019-07-10 11:03:54 +03:00
Patrick H. Lauke
be80d26cdb Ensure button plugin sets/removes active class correctly on page load (#28952)
* Ensure correct active class is set on button toggles/checkboxes/radios on page load

Sanity check, ensures that the UI visually matches the actual values/states of controls. Also ensures that if any autocomplete/autofill happened, this is visually accounted for
by having the correct class set.

Includes unit tests (and `autocomplete` has been removed from these as it's no longer necessary)

* Remove now unnecessary autocomplete attribute

As the attribute was there to force/ensure that the visual presentation matched the state, and this is now taken care of programmatically, there's no need to unnecessarily suppress autocomplete...let them autocomplete if they want to...
2019-07-10 11:03:54 +03:00
Sergey Kovalenko
22f6b373f9 Remove negative margins for group list items (#28940)
To fix RGBA borders overlapping issue.
2019-07-10 11:03:54 +03:00
XhmikosR
a92f838c8d Minor wording changes. 2019-07-10 11:03:54 +03:00
Jonathan Hawkins
e76fce5852 Combine duplicate documentation examples into one to fix the confusing text. 2019-07-10 11:03:54 +03:00
Martijn Cuppens
c121778b49 Change invalid icon from cross to exclamation mark (#28944)
The cross icon was confusing since some browsers use it as a reset button.
2019-07-10 11:03:54 +03:00
Robin D'Arcy
4376d92ea7 Docs – update extend/approach.md (#28941) 2019-07-10 11:03:54 +03:00
Martijn Cuppens
de163b337c
Deprecate bg-variant() mixin (#28938) 2019-06-20 21:30:09 +02:00
Patrick H. Lauke
5f44e01dab Add missing dropdown unit test for closing with ESC (#28929)
Backport of the unit test from https://github.com/twbs/bootstrap/pull/28928
2019-06-19 13:43:48 +03:00
Martijn Cuppens
1c5e1cb3c9 Typo fix (#28920) 2019-06-18 15:02:58 +03:00
Shohei Yoshida
b165aff2f7 Fix position of browser default validation message (#28852) 2019-06-18 15:02:58 +03:00
Morteza Ziyae
1bdeab8159 Fix width and height of data svg images in IE10 (#28883) 2019-06-18 15:02:58 +03:00
Patrick H. Lauke
1da3aa3103 Don't open dropdown on ESC on trigger element (#28912)
* Don't open dropdown on ESC on trigger element

Closes #28751
2019-06-18 15:02:58 +03:00
XhmikosR
6587e5cf80 Update devDependencies and gems. 2019-06-18 15:02:58 +03:00
Johann-S
6c9f833a90 tooltip dispose:removing only own event handler (#28896) 2019-06-18 15:02:58 +03:00
Patrick H. Lauke
24abed1336 Fix keyboard handling of button-style checkbox/radio button groups (#28834)
- adds more defensive checks to make sure no unnecessary toggling happens on disabled buttons; this also fixes an up-to-now undiscovered bug where a toggle button with `.disabled` class would still have its `aria-pressed` toggled
- adds a set of explicit tests for the above case of disabled buttons and `aria-pressed`
- remove a now irrelevant (or at least very nonsensical) test for `<label>` containing both an actionable and a `hidden` `<input>`
- expand the test for disabled checkbox to also explicitly test starting conditions (used mainly in my debugging)
- ensure that `$btn[0].click()` is used to click checkboxes in tests, rather than the `click()` on the jquery object which is simply a shorthand for `trigger('click')` and does not actually trigger the browser default behavior
- remove the `preventDefault()` from the button handling, which was preventing correct keyboard functionality for checkboxes/radio buttons
- add extra logic to the button.js code to handle checkboxes correctly and avoid double-triggering as a result of mouse interactions (which saw the checkboxes being toggled twice, thus returning them to their original state)
- add logic that prevents the `checked` property from being added incorrectly for any inputs other than radio buttons and checkboxes
- added more tests (including the most basic test for a properly triggered fake checkbox button)
- work around Firefox bug #1540995 (which this code was hitting after removing the `preventDefault()`, due to Firefox's incorrect toggling of disabled checkboxes when programmatically (but not manually) activated with a `click()` event
2019-06-18 15:02:58 +03:00
Patrick H. Lauke
5bf876cb0f Docs: add accessibility/keyboard callout to popovers, tweak tooltips callout (#28851)
- Add same advice about keyboard/AT handling to popovers as a callout; also add information about not adding excessive content or interactive controls (and the suggestion to opt for a modal)
- Tweak the tooltips callout for consistency
2019-06-18 15:02:58 +03:00
Shohei Yoshida
911b72cf78 Workaround for the image size bug in IE (#28855) 2019-06-18 15:02:58 +03:00
Christian Oliff
e0d0f5a1c6 HTTPS link to codeguide.co (#28860) 2019-06-18 15:02:58 +03:00
XhmikosR
5baad13902 Use npm-run-all in the netlify script. (#28846) 2019-05-30 11:58:34 +03:00
XhmikosR
d9a8b8ea80 Update devDependencies and gems. 2019-05-30 11:58:34 +03:00
Jay Pinho
1161bff6eb Make example description more accurate (#28842) 2019-05-30 11:58:34 +03:00
Shohei Yoshida
a84a05a56a Clean input group flex basis (#28785) 2019-05-30 11:58:34 +03:00
Shohei Yoshida
9d075734cb Calc modal header/footer border radius according to the border width (#28775) 2019-05-30 11:58:34 +03:00
Aditya Shankar
9508c4c11b Correct grammar in modal.scss (#28829) 2019-05-30 11:58:34 +03:00
Sezer Esen
01a71532d9 Fix background position (#28814) 2019-05-30 11:58:34 +03:00
XhmikosR
621391255b vnu.jar: Update ignores. (#28817)
Pass the `--no-langdetect` flag instead of ignoring the warning manually.
2019-05-30 11:58:34 +03:00
Johann-S
c6dd1a7d93 Backport #28777.
Toast should allow prevent default for hide and show events
2019-05-30 11:58:34 +03:00
Shohei Yoshida
fe777292b5 Fix z-index according to our z-index rule (#28784)
https://getbootstrap.com/docs/4.3/extend/approach/#z-index-scales
2019-05-30 11:58:34 +03:00
Christian Oliff
67be130c7b Update Yarn package link to link to the Bootstrap package (#28781)
I think it makes more sense to link to the Bootstrap package on Yarn here (like the package link for NPM above)
2019-05-30 11:58:34 +03:00
XhmikosR
be7198a05b Travis CI: Add Node.js 12. 2019-05-30 11:58:34 +03:00
XhmikosR
f72d2511ba Update devDependencies. 2019-05-09 21:30:32 +03:00
Shohei Yoshida
4251c23f71 Reset input padding for cross browser consistency (#28208) 2019-05-09 21:30:32 +03:00
zhangbao
fc745a3ec8 Consistency modification (#28750) 2019-05-09 21:30:32 +03:00
Martijn Cuppens
e9d8c1a9dd Backport #28679.
* Documentation tweaks
* Remove redundant `col-12` classes
2019-05-09 21:30:32 +03:00
Patrick H. Lauke
36ea7e7421 Album example: remove misleading jumbotron-heading classname (#28741) 2019-05-09 21:30:32 +03:00
Shohei Yoshida
aa7b055064 Fix incorrect variable for popover border radius (#28733)
* Use $popover-border-radius

* Move and rename the local $offset-border-width to the global variable
2019-05-09 21:30:32 +03:00
Christian Oliff
add38103ad Fix broken link to css-discuss.incutio.com/wiki/Printing_Tables (#28637)
Instead now pointing to the most recent Wayback Machine archive copy.
2019-05-09 21:30:32 +03:00
Martijn Cuppens
5c65ea6a38 Scrollbar fix (#28417) 2019-05-09 21:30:32 +03:00
XhmikosR
27287a6884 Update devDependencies including jQuery to v3.4.1. 2019-05-02 16:59:49 +03:00
XhmikosR
cc5292f510 Backport #28551.
Show the other navbar items on small screens too.
2019-05-02 16:59:49 +03:00
XhmikosR
7da9729a62 Update (dev)Dependencies and gems.
Also, fix the `update-deps` excludes and add karma since 4.x requires Node.js >= 8.
2019-04-29 17:41:28 +03:00
Mark Otto
605704d7f5 Prevent form validation mixin from generating invalid CSS (#28447)
Extrapolates the previously used selector into a new mixin that only generates valid CSS by creating psuedo-classes for `valid` and `invalid`, and nothing else.

Fixes #28380.
2019-04-29 17:41:28 +03:00
Shohei Yoshida
68932330f0 Sync plain text font-size with $input-font-size (#28464) 2019-04-29 17:41:28 +03:00
Martijn Cuppens
78f47133e9 Remove redundant slashes (#28677) 2019-04-29 17:41:28 +03:00
Johann-S
c50c1e9d23 fix unit tests for chrome mobile 2019-04-29 17:41:28 +03:00
Shohei Yoshida
10f91729aa Add $custom-control-label-color variable (#28633) 2019-04-29 17:41:28 +03:00
ysds
57ff6ee9ef Call hide() after delay time 2019-04-29 17:41:28 +03:00
XhmikosR
77973cd7fb Fix clean-css breakWith option. 2019-04-29 17:41:28 +03:00
Matěj Kříž
41eea9edc4 Fix buttons :focus state styles (#27890)
* Fix buttons :focus state styles

Buttons :hover and :focus state shares styles.
Buttons :focus text color on 'a.btn' is now consistent with others '.btn'.

* `:focus` styles should be in sync with `.focus`.

So shared styles with hover were copy to focus definition. Rather then using
`hover-focus` mixin which do not contain `.focus`.
2019-04-29 17:41:28 +03:00
XhmikosR
060880296a karma.conf.js: switch to CI === true. (#28588) 2019-04-29 17:41:28 +03:00
Loïc Goyet
1c7cb61072 Remove scss variable defined twice (#28567) 2019-04-29 17:41:28 +03:00
XhmikosR
3bf08d87c9 Update devDependencies and gems. 2019-03-27 20:57:28 +02:00
Johann-S
8fda884ad3 Reset carousel touch delta x to prevent click transformation in swipe (#28558) 2019-03-27 20:57:28 +02:00
XhmikosR
c0b2f72a06 Add a netlify npm script. (#28552) 2019-03-27 20:57:28 +02:00
XhmikosR
12532dc913 Remove http from docs search. (#28557)
We use only `https` for a few months now.
2019-03-27 20:57:28 +02:00
Patrick H. Lauke
3ab0441667 Check prefers-reduced-motion variable before adding reduced motion media query for animated progress bars (#28530) 2019-03-27 20:57:28 +02:00
Shohei Yoshida
60f31b32f8 Workaround for MS edge bug (#28275) 2019-03-27 20:57:28 +02:00
XhmikosR
77212386c0 Revert back to the old snippet and just add anonymize IP.
We don't need the extra bloat of gtag.
2019-03-27 20:57:28 +02:00
Mark Otto
e34ba3532f Update GA to latest script & anonymize IPs 2019-03-27 20:57:28 +02:00
XhmikosR
72a1437dae .gitignore: add the Hugo folders. 2019-03-27 20:57:28 +02:00
XhmikosR
413c313644 Use local doc versions favicon.ico. 2019-03-27 20:57:28 +02:00
XhmikosR
c9159ccf05 Include favicons for examples. 2019-03-27 20:57:28 +02:00
Jim Jiang
9ba80d31d4 Remove redundant placeholders in forms docs (#28406)
* Change state field to select
* Include "Choose..." placeholder for select
* Change validated select to .custom-select
2019-03-12 15:23:12 +02:00
Patrick H. Lauke
86a97d197e Remove indiscriminate outline suppression for tabindex="-1" elements (#28437)
instead, only apply outline suppression if the browser wouldn't normally apply the focus outline, using the (currently experimental) `:focus-visible` pseudo-class
2019-03-12 15:16:49 +02:00
Shohei Yoshida
87527d8149 Add <ol> to nav's comment (#28426) 2019-03-08 00:30:25 +02:00
mspae
be8ef5f655 disable assert assending check if the previous unit was a percentual value (#28400) 2019-03-08 00:30:25 +02:00
Johann-S
86de1d3875 fix jquery detection 2019-03-08 00:30:24 +02:00
XhmikosR
dad0765ed3 Update devDependencies and gems. (#28347) 2019-03-08 00:30:24 +02:00
Chris Barr
f2b9055c2b Fix issue template links to the contributing guidelines (#28378) 2019-03-08 00:29:21 +02:00
Laussel Loïc
a5179125b0 put secondary navigation in an explicit landmark nav and add a label on each nav (#28361) 2019-03-08 00:29:21 +02:00
Laussel Loïc
1a8886b7f7 add an explicit aria-label on link with svg on sample pages (#28360) 2019-03-08 00:29:21 +02:00
Martijn Cuppens
ba641ae507 Fix border if only one card (#28365) 2019-03-08 00:29:21 +02:00
XhmikosR
11c40217cf Add --continue-on-error in npm run lint. (#28338)
So if one of the two sub-tasks fails, it still completes linting the other one.
2019-03-08 00:29:21 +02:00
Pierre GIRAUD
3b6c5ee620 Fix indentation (#28321) 2019-03-08 00:29:21 +02:00
XhmikosR
d30039c1a9 Update CONTRIBUTING.md for the current state of things. (#28283) 2019-03-08 00:29:20 +02:00
Laussel Loïc
a46866c950 add tabindex="-1" and aria-disabled="true" on disabled links (#28305) 2019-03-08 00:29:20 +02:00
Bardi Harborow
146cfa21a3 Create SECURITY.md (#28288) 2019-03-08 00:29:20 +02:00
XhmikosR
5e9fd345da Use npm-run-all for the release script. (#28307)
It's shorter.
2019-03-08 00:29:20 +02:00
XhmikosR
b2e9341b8c Update devDependencies. (#28292) 2019-03-01 17:26:36 +02:00
XhmikosR
58a1c6ef92 Update devDependencies. (#28271) 2019-03-01 17:26:35 +02:00
Martijn Cuppens
fad6dda456 Deprecate form-control-focus mixin (#28262) 2019-03-01 17:25:58 +02:00
XhmikosR
60ba89b9a7 Replace 4.3.0 with 4.3.1 in nuget files. (#28273) 2019-03-01 17:25:58 +02:00
XhmikosR
8d109b62ba Update docs and meta for 3.4.1. (#28255) 2019-03-01 17:25:58 +02:00
514 changed files with 22108 additions and 18767 deletions

View file

@ -1,17 +1,14 @@
module.exports = {
presets: [
[
'@babel/env',
'@babel/preset-env',
{
loose: true,
modules: false,
exclude: ['transform-typeof-symbol']
bugfixes: true,
modules: false
}
]
],
plugins: [
'@babel/plugin-proposal-object-rest-spread'
],
env: {
test: {
plugins: [ 'istanbul' ]

50
.bundlewatch.config.json Normal file
View file

@ -0,0 +1,50 @@
{
"files": [
{
"path": "./dist/css/bootstrap-grid.css",
"maxSize": "7 kB"
},
{
"path": "./dist/css/bootstrap-grid.min.css",
"maxSize": "6.25 kB"
},
{
"path": "./dist/css/bootstrap-reboot.css",
"maxSize": "2 kB"
},
{
"path": "./dist/css/bootstrap-reboot.min.css",
"maxSize": "2 kB"
},
{
"path": "./dist/css/bootstrap.css",
"maxSize": "25.5 kB"
},
{
"path": "./dist/css/bootstrap.min.css",
"maxSize": "23.5 kB"
},
{
"path": "./dist/js/bootstrap.bundle.js",
"maxSize": "48 kB"
},
{
"path": "./dist/js/bootstrap.bundle.min.js",
"maxSize": "21.5 kB"
},
{
"path": "./dist/js/bootstrap.js",
"maxSize": "25.5 kB"
},
{
"path": "./dist/js/bootstrap.min.js",
"maxSize": "14.75 kB"
}
],
"ci": {
"trackBranches": [
"main",
"v4-dev"
]
}
}

View file

@ -3,4 +3,4 @@
**/vendor/
/_gh_pages/
/js/coverage/
/package.js
/site/static/sw.js

View file

@ -1,233 +1,63 @@
{
"root": true,
"parser": "babel-eslint",
"env": {
"browser": true,
"es6": true
},
"extends": ["eslint:recommended"],
"extends": [
"plugin:import/errors",
"plugin:import/warnings",
"plugin:unicorn/recommended",
"xo/esnext",
"xo/browser"
],
"rules": {
// Possible Errors
"no-await-in-loop": "error",
"no-extra-parens": "error",
"no-prototype-builtins": "error",
"no-template-curly-in-string": "error",
"valid-jsdoc": "error",
// Best Practices
"accessor-pairs": "error",
"array-callback-return": "error",
"block-scoped-var": "error",
"class-methods-use-this": "off",
"complexity": "error",
"consistent-return": "error",
"curly": "error",
"default-case": "error",
"dot-location": ["error", "property"],
"dot-notation": "error",
"eqeqeq": "error",
"guard-for-in": "error",
"no-alert": "error",
"no-caller": "error",
"no-div-regex": "error",
"no-else-return": "error",
"no-empty-function": "error",
"no-eq-null": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-extra-label": "error",
"no-floating-decimal": "error",
"no-implicit-coercion": "error",
"no-implicit-globals": "error",
"no-implied-eval": "error",
"no-invalid-this": "off",
"no-iterator": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-magic-numbers": ["error", {
"ignore": [-1, 0, 1],
"ignoreArrayIndexes": true
}
],
"no-multi-spaces": ["error", {
"ignoreEOLComments": true,
"exceptions": {
"AssignmentExpression": true,
"ArrowFunctionExpression": true,
"CallExpression": true,
"VariableDeclarator": true
}
}
],
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-param-reassign": "off",
"no-proto": "error",
"no-restricted-properties": "error",
"no-return-assign": "error",
"no-return-await": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-throw-literal": "error",
"no-unmodified-loop-condition": "error",
"no-unused-expressions": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-return": "error",
"no-void": "error",
"no-warning-comments": "off",
"no-with": "error",
"prefer-promise-reject-errors": "error",
"radix": "error",
"require-await": "error",
"vars-on-top": "error",
"wrap-iife": "error",
"yoda": "error",
// Strict Mode
"strict": "error",
// Variables
"init-declarations": "off",
"no-catch-shadow": "error",
"no-label-var": "error",
"no-restricted-globals": "error",
"no-shadow": "off",
"no-shadow-restricted-names": "error",
"no-undef-init": "error",
"no-undefined": "error",
"no-use-before-define": "off",
// Node.js and CommonJS
"callback-return": "off",
"global-require": "error",
"handle-callback-err": "error",
"no-mixed-requires": "error",
"no-new-require": "error",
"no-path-concat": "error",
"no-process-env": "error",
"no-process-exit": "error",
"no-restricted-modules": "error",
"no-sync": "error",
// Stylistic Issues
"array-bracket-spacing": "error",
"block-spacing": "error",
"brace-style": "error",
"camelcase": "error",
"capitalized-comments": "off",
"comma-dangle": "error",
"comma-spacing": "error",
"comma-style": "error",
"computed-property-spacing": "error",
"consistent-this": "error",
"eol-last": "error",
"func-call-spacing": "error",
"func-name-matching": "error",
"func-names": "off",
"func-style": ["error", "declaration"],
"id-blacklist": "error",
"id-length": "off",
"id-match": "error",
"indent": ["error", 2, { "SwitchCase": 1 }],
"jsx-quotes": "error",
"key-spacing": "off",
"keyword-spacing": "error",
"linebreak-style": ["error", "unix"],
"line-comment-position": "off",
"lines-around-comment": "off",
"lines-around-directive": "error",
"max-depth": ["error", 10],
"max-len": "off",
"max-lines": "off",
"max-nested-callbacks": "error",
"max-params": "off",
"max-statements": "off",
"max-statements-per-line": "error",
"multiline-ternary": "off",
"new-cap": ["error", { "capIsNewExceptionPattern": "$.*" }],
"newline-after-var": "off",
"newline-per-chained-call": ["error", { "ignoreChainWithDepth": 5 }],
"new-parens": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-continue": "off",
"no-inline-comments": "off",
"no-lonely-if": "error",
"indent": [
"error",
2,
{
"MemberExpression": "off",
"SwitchCase": 1
}
],
"max-params": [
"warn",
5
],
"new-cap": [
"error",
{
"properties": false
}
],
"no-console": "error",
"no-mixed-operators": "off",
"no-multi-assign": "error",
"no-multiple-empty-lines": "error",
"nonblock-statement-body-position": "error",
"no-negated-condition": "off",
"no-nested-ternary": "error",
"no-new-object": "error",
"no-plusplus": "off",
"no-restricted-syntax": "error",
"no-tabs": "error",
"no-ternary": "off",
"no-trailing-spaces": "error",
"no-underscore-dangle": "off",
"no-unneeded-ternary": "error",
"no-whitespace-before-property": "error",
"object-curly-newline": ["error", { "minProperties": 1 }],
"object-curly-spacing": ["error", "always"],
"object-property-newline": "error",
"one-var": ["error", "never"],
"one-var-declaration-per-line": "error",
"operator-assignment": "error",
"operator-linebreak": "error",
"padded-blocks": ["error", "never"],
"padding-line-between-statements": "off",
"quote-props": ["error", "as-needed"],
"quotes": ["error", "single"],
"require-jsdoc": "off",
"semi": ["error", "never"],
"semi-spacing": "error",
"sort-keys": "off",
"sort-vars": "error",
"space-before-blocks": "error",
"space-before-function-paren": ["error", {
"anonymous": "always",
"named": "never"
}],
"space-in-parens": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",
"spaced-comment": "error",
"template-tag-spacing": "error",
"unicode-bom": "error",
"wrap-regex": "off",
// ECMAScript 6
"arrow-body-style": ["error", "as-needed"],
"arrow-parens": "error",
"arrow-spacing": "error",
"generator-star-spacing": "error",
"no-confusing-arrow": "error",
"no-duplicate-imports": "error",
"no-restricted-imports": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-rename": "error",
"no-var": "error",
"object-shorthand": "error",
"prefer-arrow-callback": "error",
"prefer-const": "error",
"prefer-destructuring": "off",
"prefer-numeric-literals": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"prefer-template": "error",
"rest-spread-spacing": "error",
"sort-imports": "error",
"symbol-description": "error",
"template-curly-spacing": "error",
"yield-star-spacing": "error"
"object-curly-spacing": [
"error",
"always"
],
"prefer-named-capture-group": "off",
"semi": [
"error",
"never"
],
"unicorn/consistent-function-scoping": "off",
"unicorn/explicit-length-check": "off",
"unicorn/import-index": "off",
"unicorn/no-array-callback-reference": "off",
"unicorn/no-for-loop": "off",
"unicorn/no-null": "off",
"unicorn/no-unused-properties": "error",
"unicorn/no-useless-undefined": "off",
"unicorn/prefer-array-find": "off",
"unicorn/prefer-dom-node-dataset": "off",
"unicorn/prefer-includes": "off",
"unicorn/prefer-math-trunc": "off",
"unicorn/prefer-dom-node-append": "off",
"unicorn/prefer-dom-node-remove": "off",
"unicorn/prefer-number-properties": "off",
"unicorn/prefer-optional-catch-binding": "off",
"unicorn/prefer-query-selector": "off",
"unicorn/prefer-reflect-apply": "off",
"unicorn/prefer-set-has": "off",
"unicorn/prevent-abbreviations": "off"
}
}

12
.gitattributes vendored
View file

@ -1,15 +1,5 @@
# Enforce Unix newlines
*.css text eol=lf
*.html text eol=lf
*.js text eol=lf
*.json text eol=lf
*.md text eol=lf
*.rb text eol=lf
*.scss text eol=lf
*.svg text eol=lf
*.txt text eol=lf
*.xml text eol=lf
*.yml text eol=lf
* text=auto eol=lf
# Don't diff or textually merge source maps
*.map binary

View file

@ -19,7 +19,8 @@ and [submitting pull requests](#pull-requests), but please respect the following
restrictions:
* Please **do not** use the issue tracker for personal support requests. Stack
Overflow ([`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4) tag), [Slack](https://bootstrap-slack.herokuapp.com/) or [IRC](README.md#community) are better places to get help.
Overflow ([`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4) tag),
[Slack](https://bootstrap-slack.herokuapp.com/) or [IRC](README.md#community) are better places to get help.
* Please **do not** derail or troll issues. Keep the discussion on topic and
respect the opinions of others.
@ -57,15 +58,14 @@ Good bug reports are extremely helpful, so thanks!
Guidelines for bug reports:
0. **Validate and lint your code** &mdash; [validate your HTML](https://html5.validator.nu/)
and [lint your HTML](https://github.com/twbs/bootlint) to ensure your
0. **[validate your HTML](https://html5.validator.nu/)** to ensure your
problem isn't caused by a simple error in your own code.
1. **Use the GitHub issue search** &mdash; check if the issue has already been
reported.
2. **Check if the issue has been fixed** &mdash; try to reproduce it using the
latest `master` or development branch in the repository.
latest `master` or `v4-dev` branch in the repository.
3. **Isolate the problem** &mdash; ideally create a [reduced test
case](https://css-tricks.com/reduced-test-cases/) and a live example.
@ -103,15 +103,11 @@ Sometimes bugs reported to us are actually caused by bugs in the browser(s) them
When feasible, we aim to report such upstream bugs to the relevant browser vendor(s), and then list them on our [Wall of Browser Bugs](https://getbootstrap.com/browser-bugs/) and [document them in MDN](https://developer.mozilla.org/en-US/docs/Web).
| Vendor(s) | Browser(s) | Rendering engine | Bug reporting website(s) | Notes |
| ------------- | ---------------------------- | ---------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| ------------- | ---------------------------- | ---------------- | ------------------------------------------------------ | -------------------------------------------------------- |
| Mozilla | Firefox | Gecko | https://bugzilla.mozilla.org/enter_bug.cgi | "Core" is normally the right product option to choose. |
| Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit <br> https://bugreport.apple.com/ | In Apple's bug reporter, choose "Safari" as the product. |
| Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit | In Apple's bug reporter, choose "Safari" as the product. |
| Google, Opera | Chrome, Chromium, Opera v15+ | Blink | https://bugs.chromium.org/p/chromium/issues/list | Click the "New issue" button. |
| Microsoft | Edge | EdgeHTML | https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/ | |
### Issues bots
[@twbs-lmvtfy](https://github.com/twbs-lmvtfy) is a Bootstrap bot that hangs out in our GitHub issue tracker and automatically checks for HTML validation errors in live examples (e.g. jsFiddles, JS Bins, Bootplys, Plunks, CodePens, etc.) posted in issue comments. If it finds any errors, it will post a follow-up comment on the issue and point out the errors. If this happens with an example you've posted, please fix the errors and post an updated live example. If you opened a bug report, please check whether the bug still occurs with your revised, valid live example. If the bug no longer occurs, it was probably due to your invalid HTML rather than something in Bootstrap and we'd appreciate it if you could close out the GitHub issue.
| Microsoft | Edge | Blink | https://developer.microsoft.com/en-us/microsoft-edge/ | Go to "Help > Send Feedback" from the browser |
## Feature requests
@ -128,23 +124,25 @@ Good pull requests—patches, improvements, new features—are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits.
**Please ask first** before embarking on any significant pull request (e.g.
**Please ask first** before embarking on any **significant** pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project.
project's developers might not want to merge into the project. For trivial
things, or things that don't require a lot of your time, you can go ahead and
make a PR.
Please adhere to the [coding guidelines](#code-guidelines) used throughout the
project (indentation, accurate comments, etc.) and any other requirements
(such as test coverage).
**Do not edit `bootstrap.css`, or `bootstrap.js`
directly!** Those files are automatically generated. You should edit the
source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/master/scss)
and/or [`/bootstrap/js/`](https://github.com/twbs/bootstrap/tree/master/js) instead.
**Do not edit `bootstrap.css` or `bootstrap.js`, and do not commit
any dist files (`dist/` or `js/dist`).** Those files are automatically generated by our build tools. You should
edit the source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/v4-dev/scss)
and/or [`/bootstrap/js/src/`](https://github.com/twbs/bootstrap/tree/v4-dev/js/src) instead.
Similarly, when contributing to Bootstrap's documentation, you should edit the
documentation source files in
[the `/bootstrap/docs/` directory of the `master` branch](https://github.com/twbs/bootstrap/tree/master/docs).
[the `/bootstrap/site/content/docs/` directory of the `v4-dev` branch](https://github.com/twbs/bootstrap/tree/v4-dev/site/content/docs).
**Do not edit the `gh-pages` branch.** That branch is generated from the
documentation source files and is managed separately by the Bootstrap Core Team.
@ -166,8 +164,8 @@ included in the project:
2. If you cloned a while ago, get the latest changes from upstream:
```bash
git checkout master
git pull upstream master
git checkout v4-dev
git pull upstream v4-dev
```
3. Create a new topic branch (off the main project development branch) to
@ -186,7 +184,7 @@ included in the project:
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
git pull [--rebase] upstream master
git pull [--rebase] upstream v4-dev
```
6. Push your topic branch up to your fork:
@ -196,12 +194,12 @@ included in the project:
```
7. [Open a Pull Request](https://help.github.com/articles/about-pull-requests/)
with a clear title and description against the `master` branch.
with a clear title and description against the `v4-dev` branch.
**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
license your work under the terms of the [MIT License](LICENSE) (if it
license your work under the terms of the [MIT License](../LICENSE) (if it
includes code changes) and under the terms of the
[Creative Commons Attribution 3.0 Unported License](docs/LICENSE)
[Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/)
(if it includes documentation changes).
@ -209,7 +207,7 @@ includes code changes) and under the terms of the
### HTML
[Adhere to the Code Guide.](http://codeguide.co/#html)
[Adhere to the Code Guide.](https://codeguide.co/#html)
- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).
- Use CDNs and HTTPS for third-party JS when possible. We don't use protocol-relative URLs in this case because they break when viewing the page locally via `file://`.
@ -217,10 +215,10 @@ includes code changes) and under the terms of the
### CSS
[Adhere to the Code Guide.](http://codeguide.co/#css)
[Adhere to the Code Guide.](https://codeguide.co/#css)
- When feasible, default color palettes should comply with [WCAG color contrast guidelines](https://www.w3.org/TR/WCAG20/#visual-audio-contrast).
- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](https://a11yproject.com/posts/never-remove-css-outlines/) for more details.
- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](https://www.a11yproject.com/posts/2013-01-25-never-remove-css-outlines/) for more details.
### JS
@ -237,7 +235,7 @@ Run `npm run test` before committing to ensure your changes follow our coding st
## License
By contributing your code, you agree to license your contribution under the [MIT License](LICENSE).
By contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](docs/LICENSE).
By contributing your code, you agree to license your contribution under the [MIT License](../LICENSE).
By contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).
Prior to v3.1.0, Bootstrap's code was released under the Apache License v2.0.

View file

@ -1,11 +0,0 @@
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
- [Validate](https://html5.validator.nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
Bug reports must include:
- Operating system and version (Windows, macOS, Android, iOS, Win10 Mobile)
- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
- [Reduced test case](https://css-tricks.com/reduced-test-cases/) and suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)

View file

@ -1,17 +1,20 @@
---
name: Bug report
about: Tell us about a bug you may have identified in Bootstrap.
title: ''
labels: ''
assignees: ''
---
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
- [Validate](https://html5.validator.nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
- [Validate](https://html5.validator.nu/) any HTML to avoid common problems
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.github/CONTRIBUTING.md)
Bug reports must include:
- Operating system and version (Windows, macOS, Android, iOS, Win10 Mobile)
- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
- [Reduced test case](https://css-tricks.com/reduced-test-cases/) and suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
- Operating system and version (Windows, macOS, Android, iOS)
- Browser and version (Chrome, Firefox, Safari, Internet Explorer, Microsoft Edge, Opera, Android Browser)
- A [reduced test case](https://css-tricks.com/reduced-test-cases/) or suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)

View file

@ -1,9 +0,0 @@
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
Feature requests must include:
- As much detail as possible for what we should add and why it's important to Bootstrap
- Relevant links to prior art, screenshots, or live demos whenever possible

View file

@ -1,13 +1,16 @@
---
name: Feature request
about: Suggest an idea for a new feature in Bootstrap.
title: ''
labels: feature
assignees: ''
---
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.github/CONTRIBUTING.md)
Feature requests must include:

45
.github/workflows/browserstack.yml vendored Normal file
View file

@ -0,0 +1,45 @@
name: BrowserStack
on:
push:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
browserstack:
runs-on: ubuntu-latest
if: github.repository == 'twbs/bootstrap' && (!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]'))
timeout-minutes: 30
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}-
- name: Install npm dependencies
run: npm ci
- name: Run dist
run: npm run dist
- name: Run BrowserStack tests
run: npm run js-test-cloud
env:
BROWSER_STACK_ACCESS_KEY: "${{ secrets.BROWSER_STACK_ACCESS_KEY }}"
BROWSER_STACK_USERNAME: "${{ secrets.BROWSER_STACK_USERNAME }}"

46
.github/workflows/bundlewatch.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Bundlewatch
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
bundlewatch:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}-
- name: Install npm dependencies
run: npm ci
- name: Run dist
run: npm run dist
- name: Run bundlewatch
run: npm run bundlewatch
env:
BUNDLEWATCH_GITHUB_TOKEN: "${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}"
CI_BRANCH_BASE: v4-dev

36
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,36 @@
name: "CodeQL"
on:
push:
branches:
- main
- v4-dev
- "!dependabot/**"
pull_request:
# The branches below must be a subset of the branches above
branches:
- main
- v4-dev
schedule:
- cron: "0 2 * * 5"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: "javascript"
- name: Autobuild
uses: github/codeql-action/autobuild@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

40
.github/workflows/css.yml vendored Normal file
View file

@ -0,0 +1,40 @@
name: CSS
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
css:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}-
- name: Install npm dependencies
run: npm ci
- name: Build CSS
run: npm run css

31
.github/workflows/dart-sass.yml vendored Normal file
View file

@ -0,0 +1,31 @@
name: CSS (Dart Sass)
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
css:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- name: Build CSS with Dart Sass
run: |
npx --package sass@latest sass --version
npx --package sass@latest sass --style expanded --source-map --embed-sources --no-error-css scss/:dist-sass/css/
ls -Al dist-sass/css

42
.github/workflows/docs.yml vendored Normal file
View file

@ -0,0 +1,42 @@
name: Docs
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
docs:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- run: java -version
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}-
- name: Install npm dependencies
run: npm ci
- name: Test docs
run: npm run docs

55
.github/workflows/js.yml vendored Normal file
View file

@ -0,0 +1,55 @@
name: JS Tests
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
jobs:
run:
name: Node ${{ matrix.node }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [10, 12, 14]
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node }}
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}}
restore-keys: |
${{ runner.OS }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ matrix.node }}-
- name: Install npm dependencies
run: npm ci
- name: Run dist
run: npm run js
- name: Run JS tests
run: npm run js-test
- name: Run Coveralls
uses: coverallsapp/github-action@master
if: matrix.node == 14
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
path-to-lcov: "./js/coverage/lcov.info"

40
.github/workflows/lint.yml vendored Normal file
View file

@ -0,0 +1,40 @@
name: Lint
on:
push:
branches-ignore:
- "dependabot/**"
pull_request:
env:
CI: true
FORCE_COLOR: 2
NODE: 14.x
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: "${{ env.NODE }}"
- name: Set up npm cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}-
- name: Install npm dependencies
run: npm ci
- name: Lint
run: npm run lint

12
.gitignore vendored
View file

@ -1,12 +1,7 @@
# Ignore docs files
/_gh_pages/
/site/.jekyll-metadata
/site/docs/**/dist/
# Ignore ruby/bundler files
/.bundle/
/vendor/
/.ruby-version
# Hugo folders
/resources/
# Numerous always-ignore extensions
*.diff
@ -33,6 +28,9 @@
*.sublime-workspace
nbproject
Thumbs.db
/.vscode/
# Local Netlify folder
.netlify
# Komodo
.komodotools

View file

@ -2,3 +2,4 @@
**/dist/
**/vendor/
/_gh_pages/
/js/coverage/

View file

@ -3,7 +3,10 @@
"stylelint-config-twbs-bootstrap/scss"
],
"rules": {
"property-blacklist": [
"function-disallowed-list": [
"calc"
],
"property-disallowed-list": [
"border-radius",
"border-top-left-radius",
"border-top-right-radius",

View file

@ -1,25 +0,0 @@
addons:
chrome: stable
language: node_js
git:
depth: 3
node_js:
- "6"
- "8"
install:
- bundle install --deployment --jobs=3 --retry=3 --clean
- npm install
before_script:
- google-chrome-stable --product-version
script:
- npm test || travis_terminate 1
- if [[ "$TRAVIS_NODE_VERSION" = "8" ]]; then npm run check-broken-links; fi
- if [[ "$TRAVIS_NODE_VERSION" = "8" && "$TRAVIS_EVENT_TYPE" = "push" && ! `git log --format=%B --no-merges -n 1 | grep '\[skip browser\]'` ]]; then npm run js-test-cloud; fi
after_success:
- if [[ "$TRAVIS_NODE_VERSION" = "8" ]]; then npm run coveralls; fi
cache:
directories:
- node_modules
- vendor/bundle
notifications:
email: false

View file

@ -40,7 +40,4 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version]
[homepage]: https://www.contributor-covenant.org/
[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct/>

View file

@ -1,9 +0,0 @@
source 'https://rubygems.org'
group :development, :test do
gem 'jekyll', '~> 3.8.5'
gem 'jekyll-redirect-from', '~> 0.14.0'
gem 'jekyll-sitemap', '~> 1.2.0'
gem 'jekyll-toc', '~> 0.9.1'
gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform?
end

View file

@ -1,82 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.6.0)
public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
concurrent-ruby (1.1.4)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
eventmachine (1.2.7-x64-mingw32)
ffi (1.10.0)
ffi (1.10.0-x64-mingw32)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.8.5)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
jekyll-redirect-from (0.14.0)
jekyll (~> 3.3)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-sitemap (1.2.0)
jekyll (~> 3.3)
jekyll-toc (0.9.1)
nokogiri (~> 1.8)
jekyll-watch (2.1.2)
listen (~> 3.0)
kramdown (1.17.0)
liquid (4.0.1)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
mini_portile2 (2.4.0)
nokogiri (1.10.1)
mini_portile2 (~> 2.4.0)
nokogiri (1.10.1-x64-mingw32)
mini_portile2 (~> 2.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.0.3)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (3.3.0)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.7.3)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
wdm (0.1.1)
PLATFORMS
ruby
x64-mingw32
DEPENDENCIES
jekyll (~> 3.8.5)
jekyll-redirect-from (~> 0.14.0)
jekyll-sitemap (~> 1.2.0)
jekyll-toc (~> 0.9.1)
wdm (~> 0.1.1)
BUNDLED WITH
1.17.3

View file

@ -1,7 +1,7 @@
The MIT License (MIT)
Copyright (c) 2011-2019 Twitter, Inc.
Copyright (c) 2011-2019 The Bootstrap Authors
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

View file

@ -1,6 +1,6 @@
<p align="center">
<a href="https://getbootstrap.com/">
<img src="https://getbootstrap.com/docs/4.3/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width="72" height="72">
<img src="https://getbootstrap.com/docs/4.5/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width="72" height="72">
</a>
</p>
@ -9,12 +9,12 @@
<p align="center">
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
<br>
<a href="https://getbootstrap.com/docs/4.3/"><strong>Explore Bootstrap docs »</strong></a>
<a href="https://getbootstrap.com/docs/4.5/"><strong>Explore Bootstrap docs »</strong></a>
<br>
<br>
<a href="https://github.com/twbs/bootstrap/issues/new?template=bug.md">Report bug</a>
<a href="https://github.com/twbs/bootstrap/issues/new?template=bug_report.md">Report bug</a>
·
<a href="https://github.com/twbs/bootstrap/issues/new?template=feature.md&labels=feature">Request feature</a>
<a href="https://github.com/twbs/bootstrap/issues/new?template=feature_request.md">Request feature</a>
·
<a href="https://themes.getbootstrap.com/">Themes</a>
·
@ -41,33 +41,33 @@
Several quick start options are available:
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.3.1.zip)
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.5.3.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@4.3.1`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.3.1`
- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@4.5.3`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.5.3`
- 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/4.3/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
Read the [Getting started page](https://getbootstrap.com/docs/4.5/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/travis/twbs/bootstrap/v4-dev.svg)](https://travis-ci.org/twbs/bootstrap)
[![npm version](https://img.shields.io/npm/v/bootstrap.svg)](https://www.npmjs.com/package/bootstrap)
[![Gem version](https://img.shields.io/gem/v/bootstrap.svg)](https://rubygems.org/gems/bootstrap)
[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue.svg)](https://atmospherejs.com/twbs/bootstrap)
[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap.svg)](https://packagist.org/packages/twbs/bootstrap)
[![NuGet](https://img.shields.io/nuget/vpre/bootstrap.svg)](https://www.nuget.org/packages/bootstrap/absoluteLatest)
[![peerDependencies Status](https://img.shields.io/david/peer/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap?type=peer)
[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap?type=dev)
[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/v4-dev.svg)](https://coveralls.io/github/twbs/bootstrap?branch=v4-dev)
[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/css/bootstrap.min.css?compression=gzip&label=CSS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/css/bootstrap.min.css)
[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js?compression=gzip&label=JS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/js/bootstrap.min.js)
[![Build Status](https://github.com/twbs/bootstrap/workflows/JS%20Tests/badge.svg?branch=v4-dev)](https://github.com/twbs/bootstrap/actions?query=workflow%3AJS+Tests+branch%3Av4-dev)
[![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/v4-dev)](https://coveralls.io/github/twbs/bootstrap?branch=v4-dev)
[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/v4-dev/dist/css/bootstrap.min.css)
[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/v4-dev/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://opencollective.com/bootstrap/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/bootstrap/sponsors/badge.svg)](#sponsors)
[![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
@ -106,43 +106,38 @@ We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified
## Bugs and feature requests
Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/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).
Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.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 [Jekyll](https://jekyllrb.com/) and publicly hosted on GitHub Pages at <https://getbootstrap.com/>. The docs may also be run locally.
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 <https://getbootstrap.com/>. 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/docs/4.3/assets/js/src/search.js` file.
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 through the [tooling setup](https://getbootstrap.com/docs/4.3/getting-started/build-tools/#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
2. Run `npm install` to install Node.js dependencies.
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. Run `npm start` to compile CSS and JavaScript files, generate our docs, and watch for changes.
4. Open `http://localhost:9001` in your browser, and voilà.
4. Open `http://localhost:9001/` in your browser, and voilà.
Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/).
Learn more about using Hugo by reading its [documentation](https://gohugo.io/documentation/).
### Documentation for previous releases
- For v2.3.2: <https://getbootstrap.com/2.3.2/>
- For v3.3.x: <https://getbootstrap.com/docs/3.3/>
- For v3.4.0: <https://getbootstrap.com/docs/3.4/>
- For v4.0.x: <https://getbootstrap.com/docs/4.0/>
- For v4.1.x: <https://getbootstrap.com/docs/4.1/>
- For v4.2.x: <https://getbootstrap.com/docs/4.2/>
You can find all our previous releases docs on <https://getbootstrap.com/docs/versions/>.
[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/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/v4-dev/.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/master/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).
Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/v4-dev/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/master/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.
Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/v4-dev/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.
## Community
@ -186,13 +181,6 @@ See [the Releases section of our GitHub project](https://github.com/twbs/bootstr
Thanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers!
## Backers
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)]
[![Bakers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers)
## 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)]
@ -209,6 +197,13 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
[![](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-2019 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/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/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/).

7
SECURITY.md Normal file
View file

@ -0,0 +1,7 @@
# Reporting Security Issues
The Bootstrap team and community take security issues in Bootstrap seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
To report a security issue, email [security@getbootstrap.com](mailto:security@getbootstrap.com) and include the word "SECURITY" in the subject line.
We'll endeavor to respond quickly, and will keep you updated throughout the process.

View file

@ -1,68 +0,0 @@
# Dependencies
markdown: kramdown
highlighter: rouge
kramdown:
auto_ids: true
# Permalinks
permalink: pretty
# Server
source: "site"
destination: ./_gh_pages
host: "localhost"
port: 9001
baseurl: ""
url: "https://getbootstrap.com"
encoding: UTF-8
exclude:
- docs/4.3/assets/scss/
plugins:
- jekyll-redirect-from
- jekyll-sitemap
- jekyll-toc
# Social
title: Bootstrap
description: "The most popular HTML, CSS, and JS library in the world."
twitter: getbootstrap
authors: "Mark Otto, Jacob Thornton, and Bootstrap contributors"
social_image_path: /docs/4.3/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.3/assets/brand/bootstrap-social-logo.png
# Custom variables
current_version: 4.3.1
current_ruby_version: 4.3.1
docs_version: 4.3
repo: "https://github.com/twbs/bootstrap"
slack: "https://bootstrap-slack.herokuapp.com"
opencollective: "https://opencollective.com/bootstrap"
blog: "https://blog.getbootstrap.com"
expo: "https://expo.getbootstrap.com"
themes: "https://themes.getbootstrap.com"
download:
source: "https://github.com/twbs/bootstrap/archive/v4.3.1.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.3.1/bootstrap-4.3.1-dist.zip"
cdn:
# See https://www.srihash.org for info on how to generate the hashes
css: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
css_hash: "sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
js: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
js_hash: "sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
js_bundle: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o"
jquery: "https://code.jquery.com/jquery-3.3.1.slim.min.js"
jquery_hash: "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
popper: "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
popper_hash: "sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
toc:
min_level: 2
max_level: 4
no_toc_section_class:
- "bd-callout"
- "bd-example"

View file

@ -8,13 +8,7 @@
},
"extends": "../.eslintrc.json",
"rules": {
"consistent-return": "off",
"func-style": "off",
"no-console": "off",
"no-magic-numbers": "off",
"no-process-env": "off",
"no-process-exit": "off",
"no-sync": "off",
"spaced-comment": "off"
"strict": "error"
}
}

View file

@ -7,7 +7,7 @@ function getBanner(pluginFilename) {
return `/*!
* Bootstrap${pluginFilename ? ` ${pluginFilename}` : ''} v${pkg.version} (${pkg.homepage})
* Copyright 2011-${year} ${pkg.author}
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/`
}

View file

@ -1,28 +1,26 @@
#!/usr/bin/env node
/*!
* Script to build our plugins to use them separately.
* Copyright 2019 The Bootstrap Authors
* Copyright 2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Copyright 2020-2021 The Bootstrap Authors
* Copyright 2020-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
const path = require('path')
const rollup = require('rollup')
const babel = require('rollup-plugin-babel')
const { babel } = require('@rollup/plugin-babel')
const banner = require('./banner.js')
const TEST = process.env.NODE_ENV === 'test'
const plugins = [
babel({
exclude: 'node_modules/**', // Only transpile our source code
externalHelpersWhitelist: [ // Include only required helpers
'defineProperties',
'createClass',
'inheritsLoose',
'defineProperty',
'objectSpread'
]
// Only transpile our source code
exclude: 'node_modules/**',
// Include the helpers in each file, at most one copy of each
babelHelpers: 'bundled'
})
]
const bsPlugins = {
@ -41,7 +39,7 @@ const bsPlugins = {
}
const rootPath = TEST ? '../js/coverage/dist/' : '../js/dist/'
function build(plugin) {
const build = async plugin => {
console.log(`Building ${plugin} plugin...`)
const external = ['jquery', 'popper.js']
@ -63,13 +61,13 @@ function build(plugin) {
}
const pluginFilename = `${plugin.toLowerCase()}.js`
rollup.rollup({
const bundle = await rollup.rollup({
input: bsPlugins[plugin],
plugins,
external
}).then((bundle) => {
bundle.write({
})
await bundle.write({
banner: banner(pluginFilename),
format: 'umd',
name: plugin,
@ -77,9 +75,18 @@ function build(plugin) {
globals,
file: path.resolve(__dirname, `${rootPath}${pluginFilename}`)
})
.then(() => console.log(`Building ${plugin} plugin... Done!`))
.catch((err) => console.error(`${plugin}: ${err}`))
})
console.log(`Building ${plugin} plugin... Done!`)
}
Object.keys(bsPlugins).forEach((plugin) => build(plugin))
const main = async () => {
try {
await Promise.all(Object.keys(bsPlugins).map(plugin => build(plugin)))
} catch (error) {
console.error(error)
process.exit(1)
}
}
main()

View file

@ -2,9 +2,9 @@
/*!
* Script to update version number references in the project.
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
@ -17,11 +17,11 @@ sh.config.fatal = true
// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
function regExpQuote(string) {
return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
return string.replace(/[$()*+.?[\\\]^{|}-]/g, '\\$&')
}
function regExpQuoteReplacement(string) {
return string.replace(/[$]/g, '$$')
return string.replace(/\$/g, '$$')
}
const DRY_RUN = false
@ -30,18 +30,21 @@ function walkAsync(directory, excludedDirectories, fileCallback, errback) {
if (excludedDirectories.has(path.parse(directory).base)) {
return
}
fs.readdir(directory, (err, names) => {
if (err) {
errback(err)
return
}
names.forEach((name) => {
names.forEach(name => {
const filepath = path.join(directory, name)
fs.lstat(filepath, (err, stats) => {
if (err) {
process.nextTick(errback, err)
return
}
if (stats.isDirectory()) {
process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
} else if (stats.isFile()) {
@ -55,18 +58,19 @@ function walkAsync(directory, excludedDirectories, fileCallback, errback) {
function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
original = new RegExp(regExpQuote(original), 'g')
replacement = regExpQuoteReplacement(replacement)
const updateFile = DRY_RUN ? (filepath) => {
const updateFile = DRY_RUN ? filepath => {
if (allowedExtensions.has(path.parse(filepath).ext)) {
console.log(`FILE: ${filepath}`)
} else {
console.log(`EXCLUDED:${filepath}`)
}
} : (filepath) => {
} : filepath => {
if (allowedExtensions.has(path.parse(filepath).ext)) {
sh.sed('-i', original, replacement, filepath)
}
}
walkAsync(directory, excludedDirectories, updateFile, (err) => {
walkAsync(directory, excludedDirectories, updateFile, err => {
console.error('ERROR while traversing directory!:')
console.error(err)
process.exit(1)
@ -79,10 +83,12 @@ function main(args) {
console.error('Got arguments:', args)
process.exit(1)
}
const oldVersion = args[0]
const newVersion = args[1]
const EXCLUDED_DIRS = new Set([
'.git',
'_gh_pages',
'node_modules',
'vendor'
])

View file

@ -5,9 +5,9 @@
* Remember to use the same vendor files as the CDN ones,
* otherwise the hashes won't match!
*
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
@ -21,11 +21,11 @@ const pkg = require('../package.json')
sh.config.fatal = true
const configFile = path.join(__dirname, '../_config.yml')
const configFile = path.join(__dirname, '../config.yml')
// Array of objects which holds the files to generate SRI hashes for.
// `file` is the path from the root folder
// `configPropertyName` is the _config.yml variable's name of the file
// `configPropertyName` is the config.yml variable's name of the file
const files = [
{
file: 'dist/css/bootstrap.min.css',
@ -40,7 +40,7 @@ const files = [
configPropertyName: 'js_bundle_hash'
},
{
file: `site/docs/${pkg.version_short}/assets/js/vendor/jquery-slim.min.js`,
file: `site/static/docs/${pkg.version_short}/assets/js/vendor/jquery.slim.min.js`,
configPropertyName: 'jquery_hash'
},
{
@ -49,7 +49,7 @@ const files = [
}
]
files.forEach((file) => {
files.forEach(file => {
fs.readFile(file.file, 'utf8', (err, data) => {
if (err) {
throw err
@ -61,6 +61,6 @@ files.forEach((file) => {
console.log(`${file.configPropertyName}: ${integrity}`)
sh.sed('-i', new RegExp(`(\\s${file.configPropertyName}:\\s+"|')(\\S+)("|')`), `$1${integrity}$3`, configFile)
sh.sed('-i', new RegExp(`^(\\s+${file.configPropertyName}:\\s+["'])\\S*(["'])`), `$1${integrity}$2`, configFile)
})
})

View file

@ -1,7 +1,10 @@
'use strict'
module.exports = (ctx) => ({
map: ctx.file.dirname.includes('examples') ? false : {
module.exports = ctx => {
return {
map: ctx.file.dirname.includes('examples') ?
false :
{
inline: false,
annotation: true,
sourcesContent: true
@ -11,4 +14,5 @@ module.exports = (ctx) => ({
cascade: false
}
}
})
}
}

View file

@ -1,8 +1,8 @@
'use strict'
const path = require('path')
const babel = require('rollup-plugin-babel')
const resolve = require('rollup-plugin-node-resolve')
const { babel } = require('@rollup/plugin-babel')
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const banner = require('./banner.js')
const BUNDLE = process.env.BUNDLE === 'true'
@ -11,14 +11,10 @@ let fileDest = 'bootstrap.js'
const external = ['jquery', 'popper.js']
const plugins = [
babel({
exclude: 'node_modules/**', // Only transpile our source code
externalHelpersWhitelist: [ // Include only required helpers
'defineProperties',
'createClass',
'inheritsLoose',
'defineProperty',
'objectSpread'
]
// Only transpile our source code
exclude: 'node_modules/**',
// Include the helpers in the bundle, at most one copy of each
babelHelpers: 'bundled'
})
]
const globals = {
@ -31,11 +27,11 @@ if (BUNDLE) {
// Remove last entry in external array to bundle Popper
external.pop()
delete globals['popper.js']
plugins.push(resolve())
plugins.push(nodeResolve())
}
module.exports = {
input: path.resolve(__dirname, '../js/src/index.js'),
input: path.resolve(__dirname, '../js/index.js'),
output: {
banner,
file: path.resolve(__dirname, `../dist/js/${fileDest}`),

View file

@ -1,4 +1,7 @@
#!/usr/bin/env bash
set -e
#
# Usage
# ---------------
@ -18,35 +21,35 @@ end=$'\e[0m'
current_version=$(node -p "require('./package.json').version")
if [[ $# -lt 1 ]]; then
printf "\n%s⚠ Shipping aborted. You must specify a version.\n%s" $red $end
printf "\n%s⚠ Shipping aborted. You must specify a version.\n%s" "$red" "$end"
exit 1
fi
# Pulling latest changes, just to be sure
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sPulling latest changes...%s" $magenta $end
printf "\n%s=======================================================\n\n%s" $magenta $end
printf "\n%s=======================================================%s" "$magenta" "$end"
printf "\n%sPulling latest changes...%s" "$magenta" "$end"
printf "\n%s=======================================================\n\n%s" "$magenta" "$end"
git pull origin v4-dev
# Update version number
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sUpdating version number...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
printf "\n%s=======================================================%s" "$magenta" "$end"
printf "\n%sUpdating version number...%s" "$magenta" "$end"
printf "\n%s=======================================================\n%s" "$magenta" "$end"
npm run release-version "$current_version" "$1"
# Build release
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sBuilding release...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
printf "\n%s=======================================================%s" "$magenta" "$end"
printf "\n%sBuilding release...%s" "$magenta" "$end"
printf "\n%s=======================================================\n%s" "$magenta" "$end"
npm run release
# Copy the contents of the built docs site over to `bs-docs` repo
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sCopy it over...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
printf "\n%s=======================================================%s" "$magenta" "$end"
printf "\n%sCopy it over...%s" "$magenta" "$end"
printf "\n%s=======================================================\n%s" "$magenta" "$end"
cp -rf _gh_pages/. ../bs-docs/
printf "\nDone!\n"
printf "\n%s=======================================================%s" $green $end
printf "\n%sSuccess, $1 is ready to review and publish.%s" $green $end
printf "\n%s=======================================================\n\n%s" $green $end
printf "\n%s=======================================================%s" "$green" "$end"
printf "\n%sSuccess, $1 is ready to review and publish.%s" "$green" "$end"
printf "\n%s=======================================================\n\n%s" "$green" "$end"

View file

@ -35,6 +35,9 @@ plugins:
- minifyStyles: true
- moveElemsAttrsToGroup: true
- moveGroupAttrsToElems: true
- removeAttrs:
attrs:
- "data-name"
- removeComments: true
- removeDesc: true
- removeDoctype: true

View file

@ -2,9 +2,9 @@
/*!
* Script to run vnu-jar if Java is available.
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
@ -18,7 +18,7 @@ childProcess.exec('java -version', (error, stdout, stderr) => {
return
}
const is32bitJava = !stderr.match(/64-Bit/)
const is32bitJava = !/64-Bit/.test(stderr)
// vnu-jar accepts multiple ignores joined with a `|`.
// Also note that the ignores are regular expressions.
@ -36,9 +36,7 @@ childProcess.exec('java -version', (error, stdout, stderr) => {
'The “time” input type is not supported in all browsers.*',
// IE11 doesn't recognise <main> / give the element an implicit "main" landmark.
// Explicit role="main" is redundant for other modern browsers, but still valid.
'The “main” role is unnecessary for element “main”.',
// Ignore the wrong lanuage code warnings for now; they happen randomly.
'This document appears to be written in.*'
'The “main” role is unnecessary for element “main”.'
].join('|')
const args = [
@ -46,6 +44,8 @@ childProcess.exec('java -version', (error, stdout, stderr) => {
vnu,
'--asciiquotes',
'--skip-non-html',
// Ignore the language code warnings
'--no-langdetect',
'--Werror',
`--filterpattern "${ignores}"`,
'_gh_pages/',

63
build/zip-examples.js Normal file
View file

@ -0,0 +1,63 @@
#!/usr/bin/env node
/*!
* Script to create the built examples zip archive;
* requires the `zip` command to be present!
* Copyright 2020-2021 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
'use strict'
const path = require('path')
const sh = require('shelljs')
const {
version, version_short: versionShort
} = require('../package.json')
const folderName = `bootstrap-${version}-examples`
sh.config.fatal = true
if (!sh.test('-d', '_gh_pages')) {
throw new Error('The "_gh_pages" folder does not exist, did you forget building the docs?')
}
// switch to the root dir
sh.cd(path.join(__dirname, '..'))
// remove any previously created folder with the same name
sh.rm('-rf', folderName)
// create any folders so that `cp` works
sh.mkdir('-p', folderName)
sh.mkdir('-p', `${folderName}/assets/brand/`)
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/examples/*`, folderName)
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/dist/`, `${folderName}/assets/`)
// also copy the two brand images we use in the examples
sh.cp('-f', [
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-outline.svg`,
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-solid.svg`
], `${folderName}/assets/brand/`)
sh.rm(`${folderName}/index.html`)
// get all examples' HTML files
sh.find(`${folderName}/**/*.html`).forEach(file => {
const fileContents = sh.cat(file)
.toString()
.replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../')
.replace(/"..\/dist\//g, '"../assets/dist/')
.replace(/(<link href="\.\.\/.*) integrity=".*>/g, '$1>')
.replace(/(<script src="\.\.\/.*) integrity=".*>/g, '$1></script>')
.replace(/( +)<!-- favicons(.|\n)+<style>/i, ' <style>')
new sh.ShellString(fileContents).to(file)
})
// create the zip file
sh.exec(`zip -r9 "${folderName}.zip" "${folderName}"`, {
fatal: true
})
// remove the folder we created
sh.rm('-rf', folderName)

79
config.yml Normal file
View file

@ -0,0 +1,79 @@
languageCode: "en"
title: "Bootstrap"
baseURL: "https://getbootstrap.com"
enableInlineShortcodes: true
markup:
goldmark:
renderer:
unsafe: true
highlight:
noClasses: false
tableOfContents:
startLevel: 2
endLevel: 6
buildDrafts: true
buildFuture: true
enableRobotsTXT: true
metaDataFormat: "yaml"
disableKinds: ["404", "taxonomy", "taxonomyTerm", "RSS"]
publishDir: "_gh_pages"
module:
mounts:
- source: dist
target: static/docs/4.5/dist
- source: site/assets
target: assets
- source: site/content
target: content
- source: site/data
target: data
- source: site/layouts
target: layouts
- source: site/static
target: static
- source: site/static/docs/4.5/assets/img/favicons/apple-touch-icon.png
target: static/apple-touch-icon.png
- source: site/static/docs/4.5/assets/img/favicons/favicon.ico
target: static/favicon.ico
params:
description: "The most popular HTML, CSS, and JS library in the world."
authors: "Mark Otto, Jacob Thornton, and Bootstrap contributors"
social_image_path: /docs/4.5/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.5/assets/brand/bootstrap-social-logo.png
current_version: "4.5.3"
current_ruby_version: "4.5.3"
docs_version: "4.5"
github_org: "https://github.com/twbs"
repo: "https://github.com/twbs/bootstrap"
twitter: "getbootstrap"
slack: "https://bootstrap-slack.herokuapp.com/"
opencollective: "https://opencollective.com/bootstrap"
blog: "https://blog.getbootstrap.com/"
expo: "https://expo.getbootstrap.com/"
themes: "https://themes.getbootstrap.com/"
icons: "https://icons.getbootstrap.com/"
download:
source: "https://github.com/twbs/bootstrap/archive/v4.5.3.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.5.3/bootstrap-4.5.3-dist.zip"
dist_examples: "https://github.com/twbs/bootstrap/releases/download/v4.5.3/bootstrap-4.5.3-examples.zip"
cdn:
# See https://www.srihash.org for info on how to generate the hashes
css: "https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css"
css_hash: "sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2"
js: "https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js"
js_hash: "sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s"
js_bundle: "https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx"
jquery: "https://code.jquery.com/jquery-3.5.1.slim.min.js"
jquery_hash: "sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
popper: "https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
popper_hash: "sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN"

View file

@ -1,8 +1,8 @@
/*!
* Bootstrap Grid v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap Grid v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
html {
box-sizing: border-box;
@ -15,7 +15,12 @@ html {
box-sizing: inherit;
}
.container {
.container,
.container-fluid,
.container-sm,
.container-md,
.container-lg,
.container-xl {
width: 100%;
padding-right: 15px;
padding-left: 15px;
@ -24,37 +29,29 @@ html {
}
@media (min-width: 576px) {
.container {
.container, .container-sm {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container {
.container, .container-sm, .container-md {
max-width: 720px;
}
}
@media (min-width: 992px) {
.container {
.container, .container-sm, .container-md, .container-lg {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container {
.container, .container-sm, .container-md, .container-lg, .container-xl {
max-width: 1140px;
}
}
.container-fluid {
width: 100%;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
.row {
display: -ms-flexbox;
display: flex;
@ -95,6 +92,42 @@ html {
max-width: 100%;
}
.row-cols-1 > * {
-ms-flex: 0 0 100%;
flex: 0 0 100%;
max-width: 100%;
}
.row-cols-2 > * {
-ms-flex: 0 0 50%;
flex: 0 0 50%;
max-width: 50%;
}
.row-cols-3 > * {
-ms-flex: 0 0 33.333333%;
flex: 0 0 33.333333%;
max-width: 33.333333%;
}
.row-cols-4 > * {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
max-width: 25%;
}
.row-cols-5 > * {
-ms-flex: 0 0 20%;
flex: 0 0 20%;
max-width: 20%;
}
.row-cols-6 > * {
-ms-flex: 0 0 16.666667%;
flex: 0 0 16.666667%;
max-width: 16.666667%;
}
.col-auto {
-ms-flex: 0 0 auto;
flex: 0 0 auto;
@ -301,6 +334,36 @@ html {
flex-grow: 1;
max-width: 100%;
}
.row-cols-sm-1 > * {
-ms-flex: 0 0 100%;
flex: 0 0 100%;
max-width: 100%;
}
.row-cols-sm-2 > * {
-ms-flex: 0 0 50%;
flex: 0 0 50%;
max-width: 50%;
}
.row-cols-sm-3 > * {
-ms-flex: 0 0 33.333333%;
flex: 0 0 33.333333%;
max-width: 33.333333%;
}
.row-cols-sm-4 > * {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
max-width: 25%;
}
.row-cols-sm-5 > * {
-ms-flex: 0 0 20%;
flex: 0 0 20%;
max-width: 20%;
}
.row-cols-sm-6 > * {
-ms-flex: 0 0 16.666667%;
flex: 0 0 16.666667%;
max-width: 16.666667%;
}
.col-sm-auto {
-ms-flex: 0 0 auto;
flex: 0 0 auto;
@ -473,6 +536,36 @@ html {
flex-grow: 1;
max-width: 100%;
}
.row-cols-md-1 > * {
-ms-flex: 0 0 100%;
flex: 0 0 100%;
max-width: 100%;
}
.row-cols-md-2 > * {
-ms-flex: 0 0 50%;
flex: 0 0 50%;
max-width: 50%;
}
.row-cols-md-3 > * {
-ms-flex: 0 0 33.333333%;
flex: 0 0 33.333333%;
max-width: 33.333333%;
}
.row-cols-md-4 > * {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
max-width: 25%;
}
.row-cols-md-5 > * {
-ms-flex: 0 0 20%;
flex: 0 0 20%;
max-width: 20%;
}
.row-cols-md-6 > * {
-ms-flex: 0 0 16.666667%;
flex: 0 0 16.666667%;
max-width: 16.666667%;
}
.col-md-auto {
-ms-flex: 0 0 auto;
flex: 0 0 auto;
@ -645,6 +738,36 @@ html {
flex-grow: 1;
max-width: 100%;
}
.row-cols-lg-1 > * {
-ms-flex: 0 0 100%;
flex: 0 0 100%;
max-width: 100%;
}
.row-cols-lg-2 > * {
-ms-flex: 0 0 50%;
flex: 0 0 50%;
max-width: 50%;
}
.row-cols-lg-3 > * {
-ms-flex: 0 0 33.333333%;
flex: 0 0 33.333333%;
max-width: 33.333333%;
}
.row-cols-lg-4 > * {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
max-width: 25%;
}
.row-cols-lg-5 > * {
-ms-flex: 0 0 20%;
flex: 0 0 20%;
max-width: 20%;
}
.row-cols-lg-6 > * {
-ms-flex: 0 0 16.666667%;
flex: 0 0 16.666667%;
max-width: 16.666667%;
}
.col-lg-auto {
-ms-flex: 0 0 auto;
flex: 0 0 auto;
@ -817,6 +940,36 @@ html {
flex-grow: 1;
max-width: 100%;
}
.row-cols-xl-1 > * {
-ms-flex: 0 0 100%;
flex: 0 0 100%;
max-width: 100%;
}
.row-cols-xl-2 > * {
-ms-flex: 0 0 50%;
flex: 0 0 50%;
max-width: 50%;
}
.row-cols-xl-3 > * {
-ms-flex: 0 0 33.333333%;
flex: 0 0 33.333333%;
max-width: 33.333333%;
}
.row-cols-xl-4 > * {
-ms-flex: 0 0 25%;
flex: 0 0 25%;
max-width: 25%;
}
.row-cols-xl-5 > * {
-ms-flex: 0 0 20%;
flex: 0 0 20%;
max-width: 20%;
}
.row-cols-xl-6 > * {
-ms-flex: 0 0 16.666667%;
flex: 0 0 16.666667%;
max-width: 16.666667%;
}
.col-xl-auto {
-ms-flex: 0 0 auto;
flex: 0 0 auto;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,8 +1,8 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap Reboot v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
@ -33,7 +33,7 @@ body {
background-color: #fff;
}
[tabindex="-1"]:focus {
[tabindex="-1"]:focus:not(:focus-visible) {
outline: 0 !important;
}
@ -133,20 +133,16 @@ a:hover {
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
a:not([href]):not([class]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
@ -159,6 +155,7 @@ pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
-ms-overflow-style: scrollbar;
}
figure {
@ -189,6 +186,7 @@ caption {
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
label {
@ -226,6 +224,10 @@ select {
text-transform: none;
}
[role="button"] {
cursor: pointer;
}
select {
word-wrap: normal;
}
@ -258,13 +260,6 @@ input[type="checkbox"] {
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;

File diff suppressed because one or more lines are too long

View file

@ -1,8 +1,8 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap Reboot v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

94
js/dist/alert.js vendored
View file

@ -1,33 +1,22 @@
/*!
* Bootstrap alert.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap alert.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Alert = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Alert = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -35,34 +24,25 @@
*/
var NAME = 'alert';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var Selector = {
DISMISS: '[data-dismiss="alert"]'
};
var Event = {
CLOSE: "close" + EVENT_KEY,
CLOSED: "closed" + EVENT_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
ALERT: 'alert',
FADE: 'fade',
SHOW: 'show'
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var SELECTOR_DISMISS = '[data-dismiss="alert"]';
var EVENT_CLOSE = "close" + EVENT_KEY;
var EVENT_CLOSED = "closed" + EVENT_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_ALERT = 'alert';
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Alert =
/*#__PURE__*/
function () {
var Alert = /*#__PURE__*/function () {
function Alert(element) {
this._element = element;
} // Getters
@ -88,13 +68,13 @@
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
this._element = null;
} // Private
;
_proto._getRootElement = function _getRootElement(element) {
var selector = Util.getSelectorFromElement(element);
var selector = Util__default['default'].getSelectorFromElement(element);
var parent = false;
if (selector) {
@ -102,43 +82,43 @@
}
if (!parent) {
parent = $(element).closest("." + ClassName.ALERT)[0];
parent = $__default['default'](element).closest("." + CLASS_NAME_ALERT)[0];
}
return parent;
};
_proto._triggerCloseEvent = function _triggerCloseEvent(element) {
var closeEvent = $.Event(Event.CLOSE);
$(element).trigger(closeEvent);
var closeEvent = $__default['default'].Event(EVENT_CLOSE);
$__default['default'](element).trigger(closeEvent);
return closeEvent;
};
_proto._removeElement = function _removeElement(element) {
var _this = this;
$(element).removeClass(ClassName.SHOW);
$__default['default'](element).removeClass(CLASS_NAME_SHOW);
if (!$(element).hasClass(ClassName.FADE)) {
if (!$__default['default'](element).hasClass(CLASS_NAME_FADE)) {
this._destroyElement(element);
return;
}
var transitionDuration = Util.getTransitionDurationFromElement(element);
$(element).one(Util.TRANSITION_END, function (event) {
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(element);
$__default['default'](element).one(Util__default['default'].TRANSITION_END, function (event) {
return _this._destroyElement(element, event);
}).emulateTransitionEnd(transitionDuration);
};
_proto._destroyElement = function _destroyElement(element) {
$(element).detach().trigger(Event.CLOSED).remove();
$__default['default'](element).detach().trigger(EVENT_CLOSED).remove();
} // Static
;
Alert._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var $element = $(this);
var $element = $__default['default'](this);
var data = $element.data(DATA_KEY);
if (!data) {
@ -178,22 +158,22 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Alert._jQueryInterface;
$.fn[NAME].Constructor = Alert;
$__default['default'].fn[NAME] = Alert._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Alert;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Alert._jQueryInterface;
};
return Alert;
}));
})));
//# sourceMappingURL=alert.js.map

File diff suppressed because one or more lines are too long

174
js/dist/button.js vendored
View file

@ -1,32 +1,21 @@
/*!
* Bootstrap button.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap button.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
typeof define === 'function' && define.amd ? define(['jquery'], factory) :
(global = global || self, global.Button = factory(global.jQuery));
}(this, function ($) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Button = factory(global.jQuery));
}(this, (function ($) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -34,39 +23,34 @@
*/
var NAME = 'button';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.button';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var ClassName = {
ACTIVE: 'active',
BUTTON: 'btn',
FOCUS: 'focus'
};
var Selector = {
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
DATA_TOGGLE: '[data-toggle="buttons"]',
INPUT: 'input:not([type="hidden"])',
ACTIVE: '.active',
BUTTON: '.btn'
};
var Event = {
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY)
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var CLASS_NAME_ACTIVE = 'active';
var CLASS_NAME_BUTTON = 'btn';
var CLASS_NAME_FOCUS = 'focus';
var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]';
var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]';
var SELECTOR_DATA_TOGGLE = '[data-toggle="button"]';
var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn';
var SELECTOR_INPUT = 'input:not([type="hidden"])';
var SELECTOR_ACTIVE = '.active';
var SELECTOR_BUTTON = '.btn';
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY);
var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Button =
/*#__PURE__*/
function () {
var Button = /*#__PURE__*/function () {
function Button(element) {
this._element = element;
this.shouldAvoidTriggerChange = false;
} // Getters
@ -76,31 +60,33 @@
_proto.toggle = function toggle() {
var triggerChangeEvent = true;
var addAriaPressed = true;
var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
var rootElement = $__default['default'](this._element).closest(SELECTOR_DATA_TOGGLES)[0];
if (rootElement) {
var input = this._element.querySelector(Selector.INPUT);
var input = this._element.querySelector(SELECTOR_INPUT);
if (input) {
if (input.type === 'radio') {
if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) {
if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
triggerChangeEvent = false;
} else {
var activeElement = rootElement.querySelector(Selector.ACTIVE);
var activeElement = rootElement.querySelector(SELECTOR_ACTIVE);
if (activeElement) {
$(activeElement).removeClass(ClassName.ACTIVE);
$__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE);
}
}
}
if (triggerChangeEvent) {
if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
return;
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
if (input.type === 'checkbox' || input.type === 'radio') {
input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE);
}
input.checked = !this._element.classList.contains(ClassName.ACTIVE);
$(input).trigger('change');
if (!this.shouldAvoidTriggerChange) {
$__default['default'](input).trigger('change');
}
}
input.focus();
@ -108,30 +94,35 @@
}
}
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
if (addAriaPressed) {
this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));
this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE));
}
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE);
$__default['default'](this._element).toggleClass(CLASS_NAME_ACTIVE);
}
}
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
this._element = null;
} // Static
;
Button._jQueryInterface = function _jQueryInterface(config) {
Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var $element = $__default['default'](this);
var data = $element.data(DATA_KEY);
if (!data) {
data = new Button(this);
$(this).data(DATA_KEY, data);
$element.data(DATA_KEY, data);
}
data.shouldAvoidTriggerChange = avoidTriggerChange;
if (config === 'toggle') {
data[config]();
}
@ -154,18 +145,61 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
event.preventDefault();
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
var button = event.target;
var initialButton = button;
if (!$(button).hasClass(ClassName.BUTTON)) {
button = $(button).closest(Selector.BUTTON);
if (!$__default['default'](button).hasClass(CLASS_NAME_BUTTON)) {
button = $__default['default'](button).closest(SELECTOR_BUTTON)[0];
}
Button._jQueryInterface.call($(button), 'toggle');
}).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
var button = $(event.target).closest(Selector.BUTTON)[0];
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
event.preventDefault(); // work around Firefox bug #1540995
} else {
var inputBtn = button.querySelector(SELECTOR_INPUT);
if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
event.preventDefault(); // work around Firefox bug #1540995
return;
}
if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
Button._jQueryInterface.call($__default['default'](button), 'toggle', initialButton.tagName === 'INPUT');
}
}
}).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
var button = $__default['default'](event.target).closest(SELECTOR_BUTTON)[0];
$__default['default'](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));
});
$__default['default'](window).on(EVENT_LOAD_DATA_API, function () {
// ensure correct active class is set to match the controls' actual values/states
// find all checkboxes/readio buttons inside data-toggle groups
var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));
for (var i = 0, len = buttons.length; i < len; i++) {
var button = buttons[i];
var input = button.querySelector(SELECTOR_INPUT);
if (input.checked || input.hasAttribute('checked')) {
button.classList.add(CLASS_NAME_ACTIVE);
} else {
button.classList.remove(CLASS_NAME_ACTIVE);
}
} // find all button toggles
buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
var _button = buttons[_i];
if (_button.getAttribute('aria-pressed') === 'true') {
_button.classList.add(CLASS_NAME_ACTIVE);
} else {
_button.classList.remove(CLASS_NAME_ACTIVE);
}
}
});
/**
* ------------------------------------------------------------------------
@ -173,15 +207,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Button._jQueryInterface;
$.fn[NAME].Constructor = Button;
$__default['default'].fn[NAME] = Button._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Button;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Button._jQueryInterface;
};
return Button;
}));
})));
//# sourceMappingURL=button.js.map

File diff suppressed because one or more lines are too long

309
js/dist/carousel.js vendored
View file

@ -1,67 +1,24 @@
/*!
* Bootstrap carousel.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap carousel.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Carousel = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Carousel = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -69,11 +26,11 @@
*/
var NAME = 'carousel';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
@ -97,62 +54,50 @@
wrap: 'boolean',
touch: 'boolean'
};
var Direction = {
NEXT: 'next',
PREV: 'prev',
LEFT: 'left',
RIGHT: 'right'
};
var Event = {
SLIDE: "slide" + EVENT_KEY,
SLID: "slid" + EVENT_KEY,
KEYDOWN: "keydown" + EVENT_KEY,
MOUSEENTER: "mouseenter" + EVENT_KEY,
MOUSELEAVE: "mouseleave" + EVENT_KEY,
TOUCHSTART: "touchstart" + EVENT_KEY,
TOUCHMOVE: "touchmove" + EVENT_KEY,
TOUCHEND: "touchend" + EVENT_KEY,
POINTERDOWN: "pointerdown" + EVENT_KEY,
POINTERUP: "pointerup" + EVENT_KEY,
DRAG_START: "dragstart" + EVENT_KEY,
LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
CAROUSEL: 'carousel',
ACTIVE: 'active',
SLIDE: 'slide',
RIGHT: 'carousel-item-right',
LEFT: 'carousel-item-left',
NEXT: 'carousel-item-next',
PREV: 'carousel-item-prev',
ITEM: 'carousel-item',
POINTER_EVENT: 'pointer-event'
};
var Selector = {
ACTIVE: '.active',
ACTIVE_ITEM: '.active.carousel-item',
ITEM: '.carousel-item',
ITEM_IMG: '.carousel-item img',
NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
INDICATORS: '.carousel-indicators',
DATA_SLIDE: '[data-slide], [data-slide-to]',
DATA_RIDE: '[data-ride="carousel"]'
};
var DIRECTION_NEXT = 'next';
var DIRECTION_PREV = 'prev';
var DIRECTION_LEFT = 'left';
var DIRECTION_RIGHT = 'right';
var EVENT_SLIDE = "slide" + EVENT_KEY;
var EVENT_SLID = "slid" + EVENT_KEY;
var EVENT_KEYDOWN = "keydown" + EVENT_KEY;
var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY;
var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY;
var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY;
var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY;
var EVENT_TOUCHEND = "touchend" + EVENT_KEY;
var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY;
var EVENT_POINTERUP = "pointerup" + EVENT_KEY;
var EVENT_DRAG_START = "dragstart" + EVENT_KEY;
var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_CAROUSEL = 'carousel';
var CLASS_NAME_ACTIVE = 'active';
var CLASS_NAME_SLIDE = 'slide';
var CLASS_NAME_RIGHT = 'carousel-item-right';
var CLASS_NAME_LEFT = 'carousel-item-left';
var CLASS_NAME_NEXT = 'carousel-item-next';
var CLASS_NAME_PREV = 'carousel-item-prev';
var CLASS_NAME_POINTER_EVENT = 'pointer-event';
var SELECTOR_ACTIVE = '.active';
var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
var SELECTOR_ITEM = '.carousel-item';
var SELECTOR_ITEM_IMG = '.carousel-item img';
var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
var SELECTOR_INDICATORS = '.carousel-indicators';
var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';
var SELECTOR_DATA_RIDE = '[data-ride="carousel"]';
var PointerType = {
TOUCH: 'touch',
PEN: 'pen'
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Carousel =
/*#__PURE__*/
function () {
var Carousel = /*#__PURE__*/function () {
function Carousel(element, config) {
this._items = null;
this._interval = null;
@ -164,7 +109,7 @@
this.touchDeltaX = 0;
this._config = this._getConfig(config);
this._element = element;
this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);
this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);
this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
@ -177,21 +122,22 @@
// Public
_proto.next = function next() {
if (!this._isSliding) {
this._slide(Direction.NEXT);
this._slide(DIRECTION_NEXT);
}
};
_proto.nextWhenVisible = function nextWhenVisible() {
// Don't call next when the page isn't visible
var $element = $__default['default'](this._element); // Don't call next when the page isn't visible
// or the carousel or its parent isn't visible
if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {
this.next();
}
};
_proto.prev = function prev() {
if (!this._isSliding) {
this._slide(Direction.PREV);
this._slide(DIRECTION_PREV);
}
};
@ -200,8 +146,8 @@
this._isPaused = true;
}
if (this._element.querySelector(Selector.NEXT_PREV)) {
Util.triggerTransitionEnd(this._element);
if (this._element.querySelector(SELECTOR_NEXT_PREV)) {
Util__default['default'].triggerTransitionEnd(this._element);
this.cycle(true);
}
@ -227,7 +173,7 @@
_proto.to = function to(index) {
var _this = this;
this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);
var activeIndex = this._getItemIndex(this._activeElement);
@ -236,7 +182,7 @@
}
if (this._isSliding) {
$(this._element).one(Event.SLID, function () {
$__default['default'](this._element).one(EVENT_SLID, function () {
return _this.to(index);
});
return;
@ -248,14 +194,14 @@
return;
}
var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;
this._slide(direction, this._items[index]);
};
_proto.dispose = function dispose() {
$(this._element).off(EVENT_KEY);
$.removeData(this._element, DATA_KEY);
$__default['default'](this._element).off(EVENT_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
this._items = null;
this._config = null;
this._element = null;
@ -268,8 +214,8 @@
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
Util.typeCheckConfig(NAME, config, DefaultType);
config = _extends({}, Default, config);
Util__default['default'].typeCheckConfig(NAME, config, DefaultType);
return config;
};
@ -280,7 +226,8 @@
return;
}
var direction = absDeltax / this.touchDeltaX; // swipe left
var direction = absDeltax / this.touchDeltaX;
this.touchDeltaX = 0; // swipe left
if (direction > 0) {
this.prev();
@ -296,15 +243,15 @@
var _this2 = this;
if (this._config.keyboard) {
$(this._element).on(Event.KEYDOWN, function (event) {
$__default['default'](this._element).on(EVENT_KEYDOWN, function (event) {
return _this2._keydown(event);
});
}
if (this._config.pause === 'hover') {
$(this._element).on(Event.MOUSEENTER, function (event) {
$__default['default'](this._element).on(EVENT_MOUSEENTER, function (event) {
return _this2.pause(event);
}).on(Event.MOUSELEAVE, function (event) {
}).on(EVENT_MOUSELEAVE, function (event) {
return _this2.cycle(event);
});
}
@ -365,27 +312,27 @@
}
};
$(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, function (e) {
$__default['default'](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {
return e.preventDefault();
});
if (this._pointerEvent) {
$(this._element).on(Event.POINTERDOWN, function (event) {
$__default['default'](this._element).on(EVENT_POINTERDOWN, function (event) {
return start(event);
});
$(this._element).on(Event.POINTERUP, function (event) {
$__default['default'](this._element).on(EVENT_POINTERUP, function (event) {
return end(event);
});
this._element.classList.add(ClassName.POINTER_EVENT);
this._element.classList.add(CLASS_NAME_POINTER_EVENT);
} else {
$(this._element).on(Event.TOUCHSTART, function (event) {
$__default['default'](this._element).on(EVENT_TOUCHSTART, function (event) {
return start(event);
});
$(this._element).on(Event.TOUCHMOVE, function (event) {
$__default['default'](this._element).on(EVENT_TOUCHMOVE, function (event) {
return move(event);
});
$(this._element).on(Event.TOUCHEND, function (event) {
$__default['default'](this._element).on(EVENT_TOUCHEND, function (event) {
return end(event);
});
}
@ -406,19 +353,17 @@
event.preventDefault();
this.next();
break;
default:
}
};
_proto._getItemIndex = function _getItemIndex(element) {
this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : [];
this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];
return this._items.indexOf(element);
};
_proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
var isNextDirection = direction === Direction.NEXT;
var isPrevDirection = direction === Direction.PREV;
var isNextDirection = direction === DIRECTION_NEXT;
var isPrevDirection = direction === DIRECTION_PREV;
var activeIndex = this._getItemIndex(activeElement);
@ -429,7 +374,7 @@
return activeElement;
}
var delta = direction === Direction.PREV ? -1 : 1;
var delta = direction === DIRECTION_PREV ? -1 : 1;
var itemIndex = (activeIndex + delta) % this._items.length;
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
};
@ -437,27 +382,27 @@
_proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
var targetIndex = this._getItemIndex(relatedTarget);
var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM));
var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));
var slideEvent = $.Event(Event.SLIDE, {
var slideEvent = $__default['default'].Event(EVENT_SLIDE, {
relatedTarget: relatedTarget,
direction: eventDirectionName,
from: fromIndex,
to: targetIndex
});
$(this._element).trigger(slideEvent);
$__default['default'](this._element).trigger(slideEvent);
return slideEvent;
};
_proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
if (this._indicatorsElement) {
var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE));
$(indicators).removeClass(ClassName.ACTIVE);
var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE));
$__default['default'](indicators).removeClass(CLASS_NAME_ACTIVE);
var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
if (nextIndicator) {
$(nextIndicator).addClass(ClassName.ACTIVE);
$__default['default'](nextIndicator).addClass(CLASS_NAME_ACTIVE);
}
}
};
@ -465,7 +410,7 @@
_proto._slide = function _slide(direction, element) {
var _this4 = this;
var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);
var activeElementIndex = this._getItemIndex(activeElement);
@ -478,17 +423,17 @@
var orderClassName;
var eventDirectionName;
if (direction === Direction.NEXT) {
directionalClassName = ClassName.LEFT;
orderClassName = ClassName.NEXT;
eventDirectionName = Direction.LEFT;
if (direction === DIRECTION_NEXT) {
directionalClassName = CLASS_NAME_LEFT;
orderClassName = CLASS_NAME_NEXT;
eventDirectionName = DIRECTION_LEFT;
} else {
directionalClassName = ClassName.RIGHT;
orderClassName = ClassName.PREV;
eventDirectionName = Direction.RIGHT;
directionalClassName = CLASS_NAME_RIGHT;
orderClassName = CLASS_NAME_PREV;
eventDirectionName = DIRECTION_RIGHT;
}
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
if (nextElement && $__default['default'](nextElement).hasClass(CLASS_NAME_ACTIVE)) {
this._isSliding = false;
return;
}
@ -512,18 +457,18 @@
this._setActiveIndicatorElement(nextElement);
var slidEvent = $.Event(Event.SLID, {
var slidEvent = $__default['default'].Event(EVENT_SLID, {
relatedTarget: nextElement,
direction: eventDirectionName,
from: activeElementIndex,
to: nextElementIndex
});
if ($(this._element).hasClass(ClassName.SLIDE)) {
$(nextElement).addClass(orderClassName);
Util.reflow(nextElement);
$(activeElement).addClass(directionalClassName);
$(nextElement).addClass(directionalClassName);
if ($__default['default'](this._element).hasClass(CLASS_NAME_SLIDE)) {
$__default['default'](nextElement).addClass(orderClassName);
Util__default['default'].reflow(nextElement);
$__default['default'](activeElement).addClass(directionalClassName);
$__default['default'](nextElement).addClass(directionalClassName);
var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
if (nextElementInterval) {
@ -533,20 +478,20 @@
this._config.interval = this._config.defaultInterval || this._config.interval;
}
var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
$(activeElement).one(Util.TRANSITION_END, function () {
$(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE);
$(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(activeElement);
$__default['default'](activeElement).one(Util__default['default'].TRANSITION_END, function () {
$__default['default'](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE);
$__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE + " " + orderClassName + " " + directionalClassName);
_this4._isSliding = false;
setTimeout(function () {
return $(_this4._element).trigger(slidEvent);
return $__default['default'](_this4._element).trigger(slidEvent);
}, 0);
}).emulateTransitionEnd(transitionDuration);
} else {
$(activeElement).removeClass(ClassName.ACTIVE);
$(nextElement).addClass(ClassName.ACTIVE);
$__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE);
$__default['default'](nextElement).addClass(CLASS_NAME_ACTIVE);
this._isSliding = false;
$(this._element).trigger(slidEvent);
$__default['default'](this._element).trigger(slidEvent);
}
if (isCycling) {
@ -557,19 +502,19 @@
Carousel._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var data = $__default['default'](this).data(DATA_KEY);
var _config = _objectSpread({}, Default, $(this).data());
var _config = _extends({}, Default, $__default['default'](this).data());
if (typeof config === 'object') {
_config = _objectSpread({}, _config, config);
_config = _extends({}, _config, config);
}
var action = typeof config === 'string' ? config : _config.slide;
if (!data) {
data = new Carousel(this, _config);
$(this).data(DATA_KEY, data);
$__default['default'](this).data(DATA_KEY, data);
}
if (typeof config === 'number') {
@ -588,19 +533,19 @@
};
Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
var selector = Util.getSelectorFromElement(this);
var selector = Util__default['default'].getSelectorFromElement(this);
if (!selector) {
return;
}
var target = $(selector)[0];
var target = $__default['default'](selector)[0];
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
if (!target || !$__default['default'](target).hasClass(CLASS_NAME_CAROUSEL)) {
return;
}
var config = _objectSpread({}, $(target).data(), $(this).data());
var config = _extends({}, $__default['default'](target).data(), $__default['default'](this).data());
var slideIndex = this.getAttribute('data-slide-to');
@ -608,10 +553,10 @@
config.interval = false;
}
Carousel._jQueryInterface.call($(target), config);
Carousel._jQueryInterface.call($__default['default'](target), config);
if (slideIndex) {
$(target).data(DATA_KEY).to(slideIndex);
$__default['default'](target).data(DATA_KEY).to(slideIndex);
}
event.preventDefault();
@ -638,12 +583,12 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
$(window).on(Event.LOAD_DATA_API, function () {
var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE));
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);
$__default['default'](window).on(EVENT_LOAD_DATA_API, function () {
var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));
for (var i = 0, len = carousels.length; i < len; i++) {
var $carousel = $(carousels[i]);
var $carousel = $__default['default'](carousels[i]);
Carousel._jQueryInterface.call($carousel, $carousel.data());
}
@ -654,15 +599,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Carousel._jQueryInterface;
$.fn[NAME].Constructor = Carousel;
$__default['default'].fn[NAME] = Carousel._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Carousel;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Carousel._jQueryInterface;
};
return Carousel;
}));
})));
//# sourceMappingURL=carousel.js.map

File diff suppressed because one or more lines are too long

216
js/dist/collapse.js vendored
View file

@ -1,67 +1,24 @@
/*!
* Bootstrap collapse.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap collapse.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Collapse = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -69,11 +26,11 @@
*/
var NAME = 'collapse';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var Default = {
toggle: true,
parent: ''
@ -82,47 +39,36 @@
toggle: 'boolean',
parent: '(string|element)'
};
var Event = {
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY,
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
SHOW: 'show',
COLLAPSE: 'collapse',
COLLAPSING: 'collapsing',
COLLAPSED: 'collapsed'
};
var Dimension = {
WIDTH: 'width',
HEIGHT: 'height'
};
var Selector = {
ACTIVES: '.show, .collapsing',
DATA_TOGGLE: '[data-toggle="collapse"]'
var EVENT_SHOW = "show" + EVENT_KEY;
var EVENT_SHOWN = "shown" + EVENT_KEY;
var EVENT_HIDE = "hide" + EVENT_KEY;
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_SHOW = 'show';
var CLASS_NAME_COLLAPSE = 'collapse';
var CLASS_NAME_COLLAPSING = 'collapsing';
var CLASS_NAME_COLLAPSED = 'collapsed';
var DIMENSION_WIDTH = 'width';
var DIMENSION_HEIGHT = 'height';
var SELECTOR_ACTIVES = '.show, .collapsing';
var SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Collapse =
/*#__PURE__*/
function () {
var Collapse = /*#__PURE__*/function () {
function Collapse(element, config) {
this._isTransitioning = false;
this._element = element;
this._config = this._getConfig(config);
this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
for (var i = 0, len = toggleList.length; i < len; i++) {
var elem = toggleList[i];
var selector = Util.getSelectorFromElement(elem);
var selector = Util__default['default'].getSelectorFromElement(elem);
var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
return foundElem === element;
});
@ -150,7 +96,7 @@
// Public
_proto.toggle = function toggle() {
if ($(this._element).hasClass(ClassName.SHOW)) {
if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
this.hide();
} else {
this.show();
@ -160,7 +106,7 @@
_proto.show = function show() {
var _this = this;
if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
if (this._isTransitioning || $__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
return;
}
@ -168,12 +114,12 @@
var activesData;
if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {
if (typeof _this._config.parent === 'string') {
return elem.getAttribute('data-parent') === _this._config.parent;
}
return elem.classList.contains(ClassName.COLLAPSE);
return elem.classList.contains(CLASS_NAME_COLLAPSE);
});
if (actives.length === 0) {
@ -182,64 +128,64 @@
}
if (actives) {
activesData = $(actives).not(this._selector).data(DATA_KEY);
activesData = $__default['default'](actives).not(this._selector).data(DATA_KEY);
if (activesData && activesData._isTransitioning) {
return;
}
}
var startEvent = $.Event(Event.SHOW);
$(this._element).trigger(startEvent);
var startEvent = $__default['default'].Event(EVENT_SHOW);
$__default['default'](this._element).trigger(startEvent);
if (startEvent.isDefaultPrevented()) {
return;
}
if (actives) {
Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
Collapse._jQueryInterface.call($__default['default'](actives).not(this._selector), 'hide');
if (!activesData) {
$(actives).data(DATA_KEY, null);
$__default['default'](actives).data(DATA_KEY, null);
}
}
var dimension = this._getDimension();
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
$__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);
this._element.style[dimension] = 0;
if (this._triggerArray.length) {
$(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
$__default['default'](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);
}
this.setTransitioning(true);
var complete = function complete() {
$(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
$__default['default'](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW);
_this._element.style[dimension] = '';
_this.setTransitioning(false);
$(_this._element).trigger(Event.SHOWN);
$__default['default'](_this._element).trigger(EVENT_SHOWN);
};
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
var scrollSize = "scroll" + capitalizedDimension;
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
this._element.style[dimension] = this._element[scrollSize] + "px";
};
_proto.hide = function hide() {
var _this2 = this;
if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
if (this._isTransitioning || !$__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
return;
}
var startEvent = $.Event(Event.HIDE);
$(this._element).trigger(startEvent);
var startEvent = $__default['default'].Event(EVENT_HIDE);
$__default['default'](this._element).trigger(startEvent);
if (startEvent.isDefaultPrevented()) {
return;
@ -248,20 +194,20 @@
var dimension = this._getDimension();
this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
Util.reflow(this._element);
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
Util__default['default'].reflow(this._element);
$__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW);
var triggerArrayLength = this._triggerArray.length;
if (triggerArrayLength > 0) {
for (var i = 0; i < triggerArrayLength; i++) {
var trigger = this._triggerArray[i];
var selector = Util.getSelectorFromElement(trigger);
var selector = Util__default['default'].getSelectorFromElement(trigger);
if (selector !== null) {
var $elem = $([].slice.call(document.querySelectorAll(selector)));
var $elem = $__default['default']([].slice.call(document.querySelectorAll(selector)));
if (!$elem.hasClass(ClassName.SHOW)) {
$(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
if (!$elem.hasClass(CLASS_NAME_SHOW)) {
$__default['default'](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);
}
}
}
@ -272,12 +218,12 @@
var complete = function complete() {
_this2.setTransitioning(false);
$(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
$__default['default'](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN);
};
this._element.style[dimension] = '';
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
};
_proto.setTransitioning = function setTransitioning(isTransitioning) {
@ -285,7 +231,7 @@
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
this._config = null;
this._parent = null;
this._element = null;
@ -295,16 +241,16 @@
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
config = _extends({}, Default, config);
config.toggle = Boolean(config.toggle); // Coerce string values
Util.typeCheckConfig(NAME, config, DefaultType);
Util__default['default'].typeCheckConfig(NAME, config, DefaultType);
return config;
};
_proto._getDimension = function _getDimension() {
var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH);
return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;
};
_proto._getParent = function _getParent() {
@ -312,7 +258,7 @@
var parent;
if (Util.isElement(this._config.parent)) {
if (Util__default['default'].isElement(this._config.parent)) {
parent = this._config.parent; // It's a jQuery object
if (typeof this._config.parent.jquery !== 'undefined') {
@ -324,40 +270,40 @@
var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
var children = [].slice.call(parent.querySelectorAll(selector));
$(children).each(function (i, element) {
$__default['default'](children).each(function (i, element) {
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
});
return parent;
};
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
var isOpen = $(element).hasClass(ClassName.SHOW);
var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW);
if (triggerArray.length) {
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
$__default['default'](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
}
} // Static
;
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
var selector = Util.getSelectorFromElement(element);
var selector = Util__default['default'].getSelectorFromElement(element);
return selector ? document.querySelector(selector) : null;
};
Collapse._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var $this = $(this);
var data = $this.data(DATA_KEY);
var $element = $__default['default'](this);
var data = $element.data(DATA_KEY);
var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
var _config = _extends({}, Default, $element.data(), typeof config === 'object' && config ? config : {});
if (!data && _config.toggle && /show|hide/.test(config)) {
if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
_config.toggle = false;
}
if (!data) {
data = new Collapse(this, _config);
$this.data(DATA_KEY, data);
$element.data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -391,17 +337,17 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if (event.currentTarget.tagName === 'A') {
event.preventDefault();
}
var $trigger = $(this);
var selector = Util.getSelectorFromElement(this);
var $trigger = $__default['default'](this);
var selector = Util__default['default'].getSelectorFromElement(this);
var selectors = [].slice.call(document.querySelectorAll(selector));
$(selectors).each(function () {
var $target = $(this);
$__default['default'](selectors).each(function () {
var $target = $__default['default'](this);
var data = $target.data(DATA_KEY);
var config = data ? 'toggle' : $trigger.data();
@ -414,15 +360,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Collapse._jQueryInterface;
$.fn[NAME].Constructor = Collapse;
$__default['default'].fn[NAME] = Collapse._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Collapse;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Collapse._jQueryInterface;
};
return Collapse;
}));
})));
//# sourceMappingURL=collapse.js.map

File diff suppressed because one or more lines are too long

351
js/dist/dropdown.js vendored
View file

@ -1,68 +1,25 @@
/*!
* Bootstrap dropdown.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap dropdown.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
(global = global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
}(this, function ($, Popper, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
}(this, (function ($, Popper, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -70,11 +27,11 @@
*/
var NAME = 'dropdown';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
@ -88,67 +45,55 @@
var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY,
CLICK: "click" + EVENT_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
DISABLED: 'disabled',
SHOW: 'show',
DROPUP: 'dropup',
DROPRIGHT: 'dropright',
DROPLEFT: 'dropleft',
MENURIGHT: 'dropdown-menu-right',
MENULEFT: 'dropdown-menu-left',
POSITION_STATIC: 'position-static'
};
var Selector = {
DATA_TOGGLE: '[data-toggle="dropdown"]',
FORM_CHILD: '.dropdown form',
MENU: '.dropdown-menu',
NAVBAR_NAV: '.navbar-nav',
VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
};
var AttachmentMap = {
TOP: 'top-start',
TOPEND: 'top-end',
BOTTOM: 'bottom-start',
BOTTOMEND: 'bottom-end',
RIGHT: 'right-start',
RIGHTEND: 'right-end',
LEFT: 'left-start',
LEFTEND: 'left-end'
};
var EVENT_HIDE = "hide" + EVENT_KEY;
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
var EVENT_SHOW = "show" + EVENT_KEY;
var EVENT_SHOWN = "shown" + EVENT_KEY;
var EVENT_CLICK = "click" + EVENT_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_DISABLED = 'disabled';
var CLASS_NAME_SHOW = 'show';
var CLASS_NAME_DROPUP = 'dropup';
var CLASS_NAME_DROPRIGHT = 'dropright';
var CLASS_NAME_DROPLEFT = 'dropleft';
var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
var CLASS_NAME_POSITION_STATIC = 'position-static';
var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
var SELECTOR_FORM_CHILD = '.dropdown form';
var SELECTOR_MENU = '.dropdown-menu';
var SELECTOR_NAVBAR_NAV = '.navbar-nav';
var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
var PLACEMENT_TOP = 'top-start';
var PLACEMENT_TOPEND = 'top-end';
var PLACEMENT_BOTTOM = 'bottom-start';
var PLACEMENT_BOTTOMEND = 'bottom-end';
var PLACEMENT_RIGHT = 'right-start';
var PLACEMENT_LEFT = 'left-start';
var Default = {
offset: 0,
flip: true,
boundary: 'scrollParent',
reference: 'toggle',
display: 'dynamic'
display: 'dynamic',
popperConfig: null
};
var DefaultType = {
offset: '(number|string|function)',
flip: 'boolean',
boundary: '(string|element)',
reference: '(string|element)',
display: 'string'
display: 'string',
popperConfig: '(null|object)'
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Dropdown =
/*#__PURE__*/
function () {
var Dropdown = /*#__PURE__*/function () {
function Dropdown(element, config) {
this._element = element;
this._popper = null;
@ -164,13 +109,11 @@
// Public
_proto.toggle = function toggle() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
return;
}
var parent = Dropdown._getParentFromElement(this._element);
var isActive = $(this._menu).hasClass(ClassName.SHOW);
var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW);
Dropdown._clearMenus();
@ -178,23 +121,38 @@
return;
}
this.show(true);
};
_proto.show = function show(usePopper) {
if (usePopper === void 0) {
usePopper = false;
}
if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW)) {
return;
}
var relatedTarget = {
relatedTarget: this._element
};
var showEvent = $.Event(Event.SHOW, relatedTarget);
$(parent).trigger(showEvent);
var showEvent = $__default['default'].Event(EVENT_SHOW, relatedTarget);
var parent = Dropdown._getParentFromElement(this._element);
$__default['default'](parent).trigger(showEvent);
if (showEvent.isDefaultPrevented()) {
return;
} // Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
if (!this._inNavbar && usePopper) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
if (typeof Popper__default['default'] === 'undefined') {
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
}
@ -202,7 +160,7 @@
if (this._config.reference === 'parent') {
referenceElement = parent;
} else if (Util.isElement(this._config.reference)) {
} else if (Util__default['default'].isElement(this._config.reference)) {
referenceElement = this._config.reference; // Check if it's jQuery element
if (typeof this._config.reference.jquery !== 'undefined') {
@ -214,75 +172,57 @@
if (this._config.boundary !== 'scrollParent') {
$(parent).addClass(ClassName.POSITION_STATIC);
$__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC);
}
this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
} // 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).length === 0) {
$(document.body).children().on('mouseover', null, $.noop);
if ('ontouchstart' in document.documentElement && $__default['default'](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
$__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop);
}
this._element.focus();
this._element.setAttribute('aria-expanded', true);
$(this._menu).toggleClass(ClassName.SHOW);
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
};
_proto.show = function show() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
return;
}
var relatedTarget = {
relatedTarget: this._element
};
var showEvent = $.Event(Event.SHOW, relatedTarget);
var parent = Dropdown._getParentFromElement(this._element);
$(parent).trigger(showEvent);
if (showEvent.isDefaultPrevented()) {
return;
}
$(this._menu).toggleClass(ClassName.SHOW);
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
$__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW);
$__default['default'](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_SHOWN, relatedTarget));
};
_proto.hide = function hide() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW)) {
return;
}
var relatedTarget = {
relatedTarget: this._element
};
var hideEvent = $.Event(Event.HIDE, relatedTarget);
var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
var parent = Dropdown._getParentFromElement(this._element);
$(parent).trigger(hideEvent);
$__default['default'](parent).trigger(hideEvent);
if (hideEvent.isDefaultPrevented()) {
return;
}
$(this._menu).toggleClass(ClassName.SHOW);
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
if (this._popper) {
this._popper.destroy();
}
$__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW);
$__default['default'](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_HIDDEN, relatedTarget));
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._element).off(EVENT_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
$__default['default'](this._element).off(EVENT_KEY);
this._element = null;
this._menu = null;
@ -305,7 +245,7 @@
_proto._addEventListeners = function _addEventListeners() {
var _this = this;
$(this._element).on(Event.CLICK, function (event) {
$__default['default'](this._element).on(EVENT_CLICK, function (event) {
event.preventDefault();
event.stopPropagation();
@ -314,8 +254,8 @@
};
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
config = _extends({}, this.constructor.Default, $__default['default'](this._element).data(), config);
Util__default['default'].typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config;
};
@ -324,7 +264,7 @@
var parent = Dropdown._getParentFromElement(this._element);
if (parent) {
this._menu = parent.querySelector(Selector.MENU);
this._menu = parent.querySelector(SELECTOR_MENU);
}
}
@ -332,28 +272,24 @@
};
_proto._getPlacement = function _getPlacement() {
var $parentDropdown = $(this._element.parentNode);
var placement = AttachmentMap.BOTTOM; // Handle dropup
var $parentDropdown = $__default['default'](this._element.parentNode);
var placement = PLACEMENT_BOTTOM; // Handle dropup
if ($parentDropdown.hasClass(ClassName.DROPUP)) {
placement = AttachmentMap.TOP;
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND;
}
} else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
placement = AttachmentMap.RIGHT;
} else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
placement = AttachmentMap.LEFT;
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND;
if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
placement = $__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
placement = PLACEMENT_RIGHT;
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
placement = PLACEMENT_LEFT;
} else if ($__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
placement = PLACEMENT_BOTTOMEND;
}
return placement;
};
_proto._detectNavbar = function _detectNavbar() {
return $(this._element).closest('.navbar').length > 0;
return $__default['default'](this._element).closest('.navbar').length > 0;
};
_proto._getOffset = function _getOffset() {
@ -363,7 +299,7 @@
if (typeof this._config.offset === 'function') {
offset.fn = function (data) {
data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
return data;
};
} else {
@ -384,9 +320,8 @@
preventOverflow: {
boundariesElement: this._config.boundary
}
} // Disable Popper.js if we have a static display
};
}
}; // Disable Popper.js if we have a static display
if (this._config.display === 'static') {
popperConfig.modifiers.applyStyle = {
@ -394,19 +329,19 @@
};
}
return popperConfig;
return _extends({}, popperConfig, this._config.popperConfig);
} // Static
;
Dropdown._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var data = $__default['default'](this).data(DATA_KEY);
var _config = typeof config === 'object' ? config : null;
if (!data) {
data = new Dropdown(this, _config);
$(this).data(DATA_KEY, data);
$__default['default'](this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -424,12 +359,12 @@
return;
}
var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
for (var i = 0, len = toggles.length; i < len; i++) {
var parent = Dropdown._getParentFromElement(toggles[i]);
var context = $(toggles[i]).data(DATA_KEY);
var context = $__default['default'](toggles[i]).data(DATA_KEY);
var relatedTarget = {
relatedTarget: toggles[i]
};
@ -444,16 +379,16 @@
var dropdownMenu = context._menu;
if (!$(parent).hasClass(ClassName.SHOW)) {
if (!$__default['default'](parent).hasClass(CLASS_NAME_SHOW)) {
continue;
}
if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default['default'].contains(parent, event.target)) {
continue;
}
var hideEvent = $.Event(Event.HIDE, relatedTarget);
$(parent).trigger(hideEvent);
var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
$__default['default'](parent).trigger(hideEvent);
if (hideEvent.isDefaultPrevented()) {
continue;
@ -462,18 +397,23 @@
if ('ontouchstart' in document.documentElement) {
$(document.body).children().off('mouseover', null, $.noop);
$__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
}
toggles[i].setAttribute('aria-expanded', 'false');
$(dropdownMenu).removeClass(ClassName.SHOW);
$(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
if (context._popper) {
context._popper.destroy();
}
$__default['default'](dropdownMenu).removeClass(CLASS_NAME_SHOW);
$__default['default'](parent).removeClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_HIDDEN, relatedTarget));
}
};
Dropdown._getParentFromElement = function _getParentFromElement(element) {
var parent;
var selector = Util.getSelectorFromElement(element);
var selector = Util__default['default'].getSelectorFromElement(element);
if (selector) {
parent = document.querySelector(selector);
@ -491,32 +431,37 @@
// - 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.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default['default'](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
return;
}
if (this.disabled || $__default['default'](this).hasClass(CLASS_NAME_DISABLED)) {
return;
}
var parent = Dropdown._getParentFromElement(this);
var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW);
if (!isActive && event.which === ESCAPE_KEYCODE) {
return;
}
event.preventDefault();
event.stopPropagation();
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
return;
}
var parent = Dropdown._getParentFromElement(this);
var isActive = $(parent).hasClass(ClassName.SHOW);
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) {
if (event.which === ESCAPE_KEYCODE) {
var toggle = parent.querySelector(Selector.DATA_TOGGLE);
$(toggle).trigger('focus');
$__default['default'](parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus');
}
$(this).trigger('click');
$__default['default'](this).trigger('click');
return;
}
var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
return $__default['default'](item).is(':visible');
});
if (items.length === 0) {
return;
@ -567,12 +512,12 @@
*/
$(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
$__default['default'](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault();
event.stopPropagation();
Dropdown._jQueryInterface.call($(this), 'toggle');
}).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
Dropdown._jQueryInterface.call($__default['default'](this), 'toggle');
}).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
e.stopPropagation();
});
/**
@ -581,15 +526,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Dropdown._jQueryInterface;
$.fn[NAME].Constructor = Dropdown;
$__default['default'].fn[NAME] = Dropdown._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Dropdown;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Dropdown._jQueryInterface;
};
return Dropdown;
}));
})));
//# sourceMappingURL=dropdown.js.map

File diff suppressed because one or more lines are too long

3
js/dist/index.js vendored
View file

@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): index.js
* Bootstrap (v4.5.3): index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@ -20,4 +20,3 @@
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
}
})($);
//# sourceMappingURL=index.js.map

View file

@ -1 +0,0 @@
{"version":3,"sources":["../src/index.js"],"names":["$","TypeError","version","fn","jquery","split","minMajor","ltMajor","minMinor","minPatch","maxMajor","Error"],"mappings":"AAaA;;;;;;AAOA,CAAC,UAACA,CAAD,EAAO;AACN,MAAI,OAAOA,CAAP,KAAa,WAAjB,EAA8B;AAC5B,UAAM,IAAIC,SAAJ,CAAc,kGAAd,CAAN;AACD;;AAED,MAAMC,UAAUF,EAAEG,EAAF,CAAKC,MAAL,CAAYC,KAAZ,CAAkB,GAAlB,EAAuB,CAAvB,EAA0BA,KAA1B,CAAgC,GAAhC,CAAhB;AACA,MAAMC,WAAW,CAAjB;AACA,MAAMC,UAAU,CAAhB;AACA,MAAMC,WAAW,CAAjB;AACA,MAAMC,WAAW,CAAjB;AACA,MAAMC,WAAW,CAAjB;;AAEA,MAAIR,QAAQ,CAAR,IAAaK,OAAb,IAAwBL,QAAQ,CAAR,IAAaM,QAArC,IAAiDN,QAAQ,CAAR,MAAeI,QAAf,IAA2BJ,QAAQ,CAAR,MAAeM,QAA1C,IAAsDN,QAAQ,CAAR,IAAaO,QAApH,IAAgIP,QAAQ,CAAR,KAAcQ,QAAlJ,EAA4J;AAC1J,UAAM,IAAIC,KAAJ,CAAU,8EAAV,CAAN;AACD;AACF,CAfD,EAeGX,CAfH","sourcesContent":["import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport Modal from './modal'\nimport Popover from './popover'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.1.2): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(($) => {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n})($)\n\nexport {\n Util,\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Popover,\n Scrollspy,\n Tab,\n Tooltip\n}\n"],"file":"index.js"}

408
js/dist/modal.js vendored
View file

@ -1,67 +1,24 @@
/*!
* Bootstrap modal.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap modal.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Modal = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -69,11 +26,11 @@
*/
var NAME = 'modal';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
var Default = {
@ -88,49 +45,42 @@
focus: 'boolean',
show: 'boolean'
};
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY,
FOCUSIN: "focusin" + EVENT_KEY,
RESIZE: "resize" + EVENT_KEY,
CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
SCROLLABLE: 'modal-dialog-scrollable',
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
BACKDROP: 'modal-backdrop',
OPEN: 'modal-open',
FADE: 'fade',
SHOW: 'show'
};
var Selector = {
DIALOG: '.modal-dialog',
MODAL_BODY: '.modal-body',
DATA_TOGGLE: '[data-toggle="modal"]',
DATA_DISMISS: '[data-dismiss="modal"]',
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
STICKY_CONTENT: '.sticky-top'
var EVENT_HIDE = "hide" + EVENT_KEY;
var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY;
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
var EVENT_SHOW = "show" + EVENT_KEY;
var EVENT_SHOWN = "shown" + EVENT_KEY;
var EVENT_FOCUSIN = "focusin" + EVENT_KEY;
var EVENT_RESIZE = "resize" + EVENT_KEY;
var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY;
var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY;
var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY;
var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';
var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';
var CLASS_NAME_BACKDROP = 'modal-backdrop';
var CLASS_NAME_OPEN = 'modal-open';
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show';
var CLASS_NAME_STATIC = 'modal-static';
var SELECTOR_DIALOG = '.modal-dialog';
var SELECTOR_MODAL_BODY = '.modal-body';
var SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]';
var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]';
var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
var SELECTOR_STICKY_CONTENT = '.sticky-top';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Modal =
/*#__PURE__*/
function () {
var Modal = /*#__PURE__*/function () {
function Modal(element, config) {
this._config = this._getConfig(config);
this._element = element;
this._dialog = element.querySelector(Selector.DIALOG);
this._dialog = element.querySelector(SELECTOR_DIALOG);
this._backdrop = null;
this._isShown = false;
this._isBodyOverflowing = false;
@ -154,14 +104,14 @@
return;
}
if ($(this._element).hasClass(ClassName.FADE)) {
if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE)) {
this._isTransitioning = true;
}
var showEvent = $.Event(Event.SHOW, {
var showEvent = $__default['default'].Event(EVENT_SHOW, {
relatedTarget: relatedTarget
});
$(this._element).trigger(showEvent);
$__default['default'](this._element).trigger(showEvent);
if (this._isShown || showEvent.isDefaultPrevented()) {
return;
@ -179,12 +129,12 @@
this._setResizeEvent();
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
$__default['default'](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) {
return _this.hide(event);
});
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this._element)) {
$__default['default'](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {
$__default['default'](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {
if ($__default['default'](event.target).is(_this._element)) {
_this._ignoreBackdropClick = true;
}
});
@ -206,15 +156,15 @@
return;
}
var hideEvent = $.Event(Event.HIDE);
$(this._element).trigger(hideEvent);
var hideEvent = $__default['default'].Event(EVENT_HIDE);
$__default['default'](this._element).trigger(hideEvent);
if (!this._isShown || hideEvent.isDefaultPrevented()) {
return;
}
this._isShown = false;
var transition = $(this._element).hasClass(ClassName.FADE);
var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE);
if (transition) {
this._isTransitioning = true;
@ -224,14 +174,14 @@
this._setResizeEvent();
$(document).off(Event.FOCUSIN);
$(this._element).removeClass(ClassName.SHOW);
$(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
$__default['default'](document).off(EVENT_FOCUSIN);
$__default['default'](this._element).removeClass(CLASS_NAME_SHOW);
$__default['default'](this._element).off(EVENT_CLICK_DISMISS);
$__default['default'](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);
if (transition) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, function (event) {
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, function (event) {
return _this2._hideModal(event);
}).emulateTransitionEnd(transitionDuration);
} else {
@ -241,16 +191,16 @@
_proto.dispose = function dispose() {
[window, this._element, this._dialog].forEach(function (htmlElement) {
return $(htmlElement).off(EVENT_KEY);
return $__default['default'](htmlElement).off(EVENT_KEY);
});
/**
* `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
* `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
* It will remove `EVENT_CLICK_DATA_API` event that should remain
*/
$(document).off(Event.FOCUSIN);
$.removeData(this._element, DATA_KEY);
$__default['default'](document).off(EVENT_FOCUSIN);
$__default['default'].removeData(this._element, DATA_KEY);
this._config = null;
this._element = null;
this._dialog = null;
@ -268,15 +218,53 @@
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
Util.typeCheckConfig(NAME, config, DefaultType);
config = _extends({}, Default, config);
Util__default['default'].typeCheckConfig(NAME, config, DefaultType);
return config;
};
_proto._showElement = function _showElement(relatedTarget) {
_proto._triggerBackdropTransition = function _triggerBackdropTransition() {
var _this3 = this;
var transition = $(this._element).hasClass(ClassName.FADE);
if (this._config.backdrop === 'static') {
var hideEventPrevented = $__default['default'].Event(EVENT_HIDE_PREVENTED);
$__default['default'](this._element).trigger(hideEventPrevented);
if (hideEventPrevented.isDefaultPrevented()) {
return;
}
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
if (!isModalOverflowing) {
this._element.style.overflowY = 'hidden';
}
this._element.classList.add(CLASS_NAME_STATIC);
var modalTransitionDuration = Util__default['default'].getTransitionDurationFromElement(this._dialog);
$__default['default'](this._element).off(Util__default['default'].TRANSITION_END);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, function () {
_this3._element.classList.remove(CLASS_NAME_STATIC);
if (!isModalOverflowing) {
$__default['default'](_this3._element).one(Util__default['default'].TRANSITION_END, function () {
_this3._element.style.overflowY = '';
}).emulateTransitionEnd(_this3._element, modalTransitionDuration);
}
}).emulateTransitionEnd(modalTransitionDuration);
this._element.focus();
} else {
this.hide();
}
};
_proto._showElement = function _showElement(relatedTarget) {
var _this4 = this;
var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE);
var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
// Don't move modal's DOM position
@ -289,84 +277,88 @@
this._element.setAttribute('aria-modal', true);
if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
this._element.setAttribute('role', 'dialog');
if ($__default['default'](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {
modalBody.scrollTop = 0;
} else {
this._element.scrollTop = 0;
}
if (transition) {
Util.reflow(this._element);
Util__default['default'].reflow(this._element);
}
$(this._element).addClass(ClassName.SHOW);
$__default['default'](this._element).addClass(CLASS_NAME_SHOW);
if (this._config.focus) {
this._enforceFocus();
}
var shownEvent = $.Event(Event.SHOWN, {
var shownEvent = $__default['default'].Event(EVENT_SHOWN, {
relatedTarget: relatedTarget
});
var transitionComplete = function transitionComplete() {
if (_this3._config.focus) {
_this3._element.focus();
if (_this4._config.focus) {
_this4._element.focus();
}
_this3._isTransitioning = false;
$(_this3._element).trigger(shownEvent);
_this4._isTransitioning = false;
$__default['default'](_this4._element).trigger(shownEvent);
};
if (transition) {
var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._dialog);
$__default['default'](this._dialog).one(Util__default['default'].TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
} else {
transitionComplete();
}
};
_proto._enforceFocus = function _enforceFocus() {
var _this4 = this;
var _this5 = this;
$(document).off(Event.FOCUSIN) // Guard against infinite focus loop
.on(Event.FOCUSIN, function (event) {
if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
_this4._element.focus();
$__default['default'](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop
.on(EVENT_FOCUSIN, function (event) {
if (document !== event.target && _this5._element !== event.target && $__default['default'](_this5._element).has(event.target).length === 0) {
_this5._element.focus();
}
});
};
_proto._setEscapeEvent = function _setEscapeEvent() {
var _this5 = this;
var _this6 = this;
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) {
if (this._isShown) {
$__default['default'](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {
if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
event.preventDefault();
_this5.hide();
_this6.hide();
} else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
_this6._triggerBackdropTransition();
}
});
} else if (!this._isShown) {
$(this._element).off(Event.KEYDOWN_DISMISS);
$__default['default'](this._element).off(EVENT_KEYDOWN_DISMISS);
}
};
_proto._setResizeEvent = function _setResizeEvent() {
var _this6 = this;
var _this7 = this;
if (this._isShown) {
$(window).on(Event.RESIZE, function (event) {
return _this6.handleUpdate(event);
$__default['default'](window).on(EVENT_RESIZE, function (event) {
return _this7.handleUpdate(event);
});
} else {
$(window).off(Event.RESIZE);
$__default['default'](window).off(EVENT_RESIZE);
}
};
_proto._hideModal = function _hideModal() {
var _this7 = this;
var _this8 = this;
this._element.style.display = 'none';
@ -374,43 +366,45 @@
this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role');
this._isTransitioning = false;
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
$__default['default'](document.body).removeClass(CLASS_NAME_OPEN);
_this7._resetAdjustments();
_this8._resetAdjustments();
_this7._resetScrollbar();
_this8._resetScrollbar();
$(_this7._element).trigger(Event.HIDDEN);
$__default['default'](_this8._element).trigger(EVENT_HIDDEN);
});
};
_proto._removeBackdrop = function _removeBackdrop() {
if (this._backdrop) {
$(this._backdrop).remove();
$__default['default'](this._backdrop).remove();
this._backdrop = null;
}
};
_proto._showBackdrop = function _showBackdrop(callback) {
var _this8 = this;
var _this9 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
var animate = $__default['default'](this._element).hasClass(CLASS_NAME_FADE) ? CLASS_NAME_FADE : '';
if (this._isShown && this._config.backdrop) {
this._backdrop = document.createElement('div');
this._backdrop.className = ClassName.BACKDROP;
this._backdrop.className = CLASS_NAME_BACKDROP;
if (animate) {
this._backdrop.classList.add(animate);
}
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this8._ignoreBackdropClick) {
_this8._ignoreBackdropClick = false;
$__default['default'](this._backdrop).appendTo(document.body);
$__default['default'](this._element).on(EVENT_CLICK_DISMISS, function (event) {
if (_this9._ignoreBackdropClick) {
_this9._ignoreBackdropClick = false;
return;
}
@ -418,18 +412,14 @@
return;
}
if (_this8._config.backdrop === 'static') {
_this8._element.focus();
} else {
_this8.hide();
}
_this9._triggerBackdropTransition();
});
if (animate) {
Util.reflow(this._backdrop);
Util__default['default'].reflow(this._backdrop);
}
$(this._backdrop).addClass(ClassName.SHOW);
$__default['default'](this._backdrop).addClass(CLASS_NAME_SHOW);
if (!callback) {
return;
@ -440,23 +430,23 @@
return;
}
var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
var backdropTransitionDuration = Util__default['default'].getTransitionDurationFromElement(this._backdrop);
$__default['default'](this._backdrop).one(Util__default['default'].TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
} else if (!this._isShown && this._backdrop) {
$(this._backdrop).removeClass(ClassName.SHOW);
$__default['default'](this._backdrop).removeClass(CLASS_NAME_SHOW);
var callbackRemove = function callbackRemove() {
_this8._removeBackdrop();
_this9._removeBackdrop();
if (callback) {
callback();
}
};
if ($(this._element).hasClass(ClassName.FADE)) {
var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE)) {
var _backdropTransitionDuration = Util__default['default'].getTransitionDurationFromElement(this._backdrop);
$(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
$__default['default'](this._backdrop).one(Util__default['default'].TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
} else {
callbackRemove();
}
@ -488,66 +478,66 @@
_proto._checkScrollbar = function _checkScrollbar() {
var rect = document.body.getBoundingClientRect();
this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
this._scrollbarWidth = this._getScrollbarWidth();
};
_proto._setScrollbar = function _setScrollbar() {
var _this9 = this;
var _this10 = this;
if (this._isBodyOverflowing) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding
$(fixedContent).each(function (index, element) {
$__default['default'](fixedContent).each(function (index, element) {
var actualPadding = element.style.paddingRight;
var calculatedPadding = $(element).css('padding-right');
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
var calculatedPadding = $__default['default'](element).css('padding-right');
$__default['default'](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
}); // Adjust sticky content margin
$(stickyContent).each(function (index, element) {
$__default['default'](stickyContent).each(function (index, element) {
var actualMargin = element.style.marginRight;
var calculatedMargin = $(element).css('margin-right');
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
var calculatedMargin = $__default['default'](element).css('margin-right');
$__default['default'](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
}); // Adjust body padding
var actualPadding = document.body.style.paddingRight;
var calculatedPadding = $(document.body).css('padding-right');
$(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
var calculatedPadding = $__default['default'](document.body).css('padding-right');
$__default['default'](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
}
$(document.body).addClass(ClassName.OPEN);
$__default['default'](document.body).addClass(CLASS_NAME_OPEN);
};
_proto._resetScrollbar = function _resetScrollbar() {
// Restore fixed content padding
var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
$(fixedContent).each(function (index, element) {
var padding = $(element).data('padding-right');
$(element).removeData('padding-right');
var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
$__default['default'](fixedContent).each(function (index, element) {
var padding = $__default['default'](element).data('padding-right');
$__default['default'](element).removeData('padding-right');
element.style.paddingRight = padding ? padding : '';
}); // Restore sticky content
var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
$(elements).each(function (index, element) {
var margin = $(element).data('margin-right');
var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT));
$__default['default'](elements).each(function (index, element) {
var margin = $__default['default'](element).data('margin-right');
if (typeof margin !== 'undefined') {
$(element).css('margin-right', margin).removeData('margin-right');
$__default['default'](element).css('margin-right', margin).removeData('margin-right');
}
}); // Restore body padding
var padding = $(document.body).data('padding-right');
$(document.body).removeData('padding-right');
var padding = $__default['default'](document.body).data('padding-right');
$__default['default'](document.body).removeData('padding-right');
document.body.style.paddingRight = padding ? padding : '';
};
_proto._getScrollbarWidth = function _getScrollbarWidth() {
// thx d.walsh
var scrollDiv = document.createElement('div');
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
document.body.appendChild(scrollDiv);
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
@ -557,13 +547,13 @@
Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var data = $__default['default'](this).data(DATA_KEY);
var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {});
var _config = _extends({}, Default, $__default['default'](this).data(), typeof config === 'object' && config ? config : {});
if (!data) {
data = new Modal(this, _config);
$(this).data(DATA_KEY, data);
$__default['default'](this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -599,36 +589,36 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this10 = this;
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
var _this11 = this;
var target;
var selector = Util.getSelectorFromElement(this);
var selector = Util__default['default'].getSelectorFromElement(this);
if (selector) {
target = document.querySelector(selector);
}
var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
var config = $__default['default'](target).data(DATA_KEY) ? 'toggle' : _extends({}, $__default['default'](target).data(), $__default['default'](this).data());
if (this.tagName === 'A' || this.tagName === 'AREA') {
event.preventDefault();
}
var $target = $(target).one(Event.SHOW, function (showEvent) {
var $target = $__default['default'](target).one(EVENT_SHOW, function (showEvent) {
if (showEvent.isDefaultPrevented()) {
// Only register focus restorer if modal will actually get shown
return;
}
$target.one(Event.HIDDEN, function () {
if ($(_this10).is(':visible')) {
_this10.focus();
$target.one(EVENT_HIDDEN, function () {
if ($__default['default'](_this11).is(':visible')) {
_this11.focus();
}
});
});
Modal._jQueryInterface.call($(target), config, this);
Modal._jQueryInterface.call($__default['default'](target), config, this);
});
/**
* ------------------------------------------------------------------------
@ -636,15 +626,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Modal._jQueryInterface;
$.fn[NAME].Constructor = Modal;
$__default['default'].fn[NAME] = Modal._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Modal;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Modal._jQueryInterface;
};
return Modal;
}));
})));
//# sourceMappingURL=modal.js.map

File diff suppressed because one or more lines are too long

128
js/dist/popover.js vendored
View file

@ -1,73 +1,26 @@
/*!
* Bootstrap popover.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap popover.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./tooltip.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './tooltip.js'], factory) :
(global = global || self, global.Popover = factory(global.jQuery, global.Tooltip));
}(this, function ($, Tooltip) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.jQuery, global.Tooltip));
}(this, (function ($, Tooltip) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Tooltip = Tooltip && Tooltip.hasOwnProperty('default') ? Tooltip['default'] : Tooltip;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
subClass.__proto__ = superClass;
}
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
/**
* ------------------------------------------------------------------------
* Constants
@ -75,32 +28,28 @@
*/
var NAME = 'popover';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var CLASS_PREFIX = 'bs-popover';
var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
var Default = _objectSpread({}, Tooltip.Default, {
var Default = _extends({}, Tooltip__default['default'].Default, {
placement: 'right',
trigger: 'click',
content: '',
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
});
var DefaultType = _objectSpread({}, Tooltip.DefaultType, {
var DefaultType = _extends({}, Tooltip__default['default'].DefaultType, {
content: '(string|element|function)'
});
var ClassName = {
FADE: 'fade',
SHOW: 'show'
};
var Selector = {
TITLE: '.popover-header',
CONTENT: '.popover-body'
};
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show';
var SELECTOR_TITLE = '.popover-header';
var SELECTOR_CONTENT = '.popover-body';
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
@ -112,17 +61,14 @@
FOCUSOUT: "focusout" + EVENT_KEY,
MOUSEENTER: "mouseenter" + EVENT_KEY,
MOUSELEAVE: "mouseleave" + EVENT_KEY
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Popover =
/*#__PURE__*/
function (_Tooltip) {
var Popover = /*#__PURE__*/function (_Tooltip) {
_inheritsLoose(Popover, _Tooltip);
function Popover() {
@ -137,18 +83,18 @@
};
_proto.addAttachmentClass = function addAttachmentClass(attachment) {
$(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
$__default['default'](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
};
_proto.getTipElement = function getTipElement() {
this.tip = this.tip || $(this.config.template)[0];
this.tip = this.tip || $__default['default'](this.config.template)[0];
return this.tip;
};
_proto.setContent = function setContent() {
var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
var $tip = $__default['default'](this.getTipElement()); // We use append for html objects to maintain js events
this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle());
var content = this._getContent();
@ -156,8 +102,8 @@
content = content.call(this.element);
}
this.setElementContent($tip.find(Selector.CONTENT), content);
$tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
this.setElementContent($tip.find(SELECTOR_CONTENT), content);
$tip.removeClass(CLASS_NAME_FADE + " " + CLASS_NAME_SHOW);
} // Private
;
@ -166,7 +112,7 @@
};
_proto._cleanTipClass = function _cleanTipClass() {
var $tip = $(this.getTipElement());
var $tip = $__default['default'](this.getTipElement());
var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
if (tabClass !== null && tabClass.length > 0) {
@ -177,7 +123,7 @@
Popover._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var data = $__default['default'](this).data(DATA_KEY);
var _config = typeof config === 'object' ? config : null;
@ -187,7 +133,7 @@
if (!data) {
data = new Popover(this, _config);
$(this).data(DATA_KEY, data);
$__default['default'](this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -239,7 +185,7 @@
}]);
return Popover;
}(Tooltip);
}(Tooltip__default['default']);
/**
* ------------------------------------------------------------------------
* jQuery
@ -247,15 +193,15 @@
*/
$.fn[NAME] = Popover._jQueryInterface;
$.fn[NAME].Constructor = Popover;
$__default['default'].fn[NAME] = Popover._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Popover;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Popover._jQueryInterface;
};
return Popover;
}));
})));
//# sourceMappingURL=popover.js.map

File diff suppressed because one or more lines are too long

186
js/dist/scrollspy.js vendored
View file

@ -1,67 +1,24 @@
/*!
* Bootstrap scrollspy.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap scrollspy.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.ScrollSpy = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ScrollSpy = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -69,11 +26,11 @@
*/
var NAME = 'scrollspy';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var Default = {
offset: 10,
method: 'auto',
@ -84,53 +41,40 @@
method: 'string',
target: '(string|element)'
};
var Event = {
ACTIVATE: "activate" + EVENT_KEY,
SCROLL: "scroll" + EVENT_KEY,
LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
DROPDOWN_ITEM: 'dropdown-item',
DROPDOWN_MENU: 'dropdown-menu',
ACTIVE: 'active'
};
var Selector = {
DATA_SPY: '[data-spy="scroll"]',
ACTIVE: '.active',
NAV_LIST_GROUP: '.nav, .list-group',
NAV_LINKS: '.nav-link',
NAV_ITEMS: '.nav-item',
LIST_ITEMS: '.list-group-item',
DROPDOWN: '.dropdown',
DROPDOWN_ITEMS: '.dropdown-item',
DROPDOWN_TOGGLE: '.dropdown-toggle'
};
var OffsetMethod = {
OFFSET: 'offset',
POSITION: 'position'
var EVENT_ACTIVATE = "activate" + EVENT_KEY;
var EVENT_SCROLL = "scroll" + EVENT_KEY;
var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
var CLASS_NAME_ACTIVE = 'active';
var SELECTOR_DATA_SPY = '[data-spy="scroll"]';
var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
var SELECTOR_NAV_LINKS = '.nav-link';
var SELECTOR_NAV_ITEMS = '.nav-item';
var SELECTOR_LIST_ITEMS = '.list-group-item';
var SELECTOR_DROPDOWN = '.dropdown';
var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';
var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
var METHOD_OFFSET = 'offset';
var METHOD_POSITION = 'position';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var ScrollSpy =
/*#__PURE__*/
function () {
var ScrollSpy = /*#__PURE__*/function () {
function ScrollSpy(element, config) {
var _this = this;
this._element = element;
this._scrollElement = element.tagName === 'BODY' ? window : element;
this._config = this._getConfig(config);
this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS);
this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS);
this._offsets = [];
this._targets = [];
this._activeTarget = null;
this._scrollHeight = 0;
$(this._scrollElement).on(Event.SCROLL, function (event) {
$__default['default'](this._scrollElement).on(EVENT_SCROLL, function (event) {
return _this._process(event);
});
this.refresh();
@ -145,16 +89,16 @@
_proto.refresh = function refresh() {
var _this2 = this;
var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
this._offsets = [];
this._targets = [];
this._scrollHeight = this._getScrollHeight();
var targets = [].slice.call(document.querySelectorAll(this._selector));
targets.map(function (element) {
var target;
var targetSelector = Util.getSelectorFromElement(element);
var targetSelector = Util__default['default'].getSelectorFromElement(element);
if (targetSelector) {
target = document.querySelector(targetSelector);
@ -165,7 +109,7 @@
if (targetBCR.width || targetBCR.height) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
return [$__default['default'](target)[offsetMethod]().top + offsetBase, targetSelector];
}
}
@ -182,8 +126,8 @@
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._scrollElement).off(EVENT_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
$__default['default'](this._scrollElement).off(EVENT_KEY);
this._element = null;
this._scrollElement = null;
this._config = null;
@ -196,20 +140,20 @@
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
config = _extends({}, Default, typeof config === 'object' && config ? config : {});
if (typeof config.target !== 'string') {
var id = $(config.target).attr('id');
if (typeof config.target !== 'string' && Util__default['default'].isElement(config.target)) {
var id = $__default['default'](config.target).attr('id');
if (!id) {
id = Util.getUID(NAME);
$(config.target).attr('id', id);
id = Util__default['default'].getUID(NAME);
$__default['default'](config.target).attr('id', id);
}
config.target = "#" + id;
}
Util.typeCheckConfig(NAME, config, DefaultType);
Util__default['default'].typeCheckConfig(NAME, config, DefaultType);
return config;
};
@ -254,9 +198,7 @@
return;
}
var offsetLength = this._offsets.length;
for (var i = offsetLength; i--;) {
for (var i = this._offsets.length; i--;) {
var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
if (isActiveTarget) {
@ -274,44 +216,44 @@
return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
});
var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
var $link = $__default['default']([].slice.call(document.querySelectorAll(queries.join(','))));
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
$link.addClass(ClassName.ACTIVE);
if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {
$link.closest(SELECTOR_DROPDOWN).find(SELECTOR_DROPDOWN_TOGGLE).addClass(CLASS_NAME_ACTIVE);
$link.addClass(CLASS_NAME_ACTIVE);
} else {
// Set triggered link as active
$link.addClass(ClassName.ACTIVE); // Set triggered links parents as active
$link.addClass(CLASS_NAME_ACTIVE); // Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
$link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item
$link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_LINKS + ", " + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE); // Handle special case when .nav-link is inside .nav-item
$link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
$link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE);
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
$__default['default'](this._scrollElement).trigger(EVENT_ACTIVATE, {
relatedTarget: target
});
};
_proto._clear = function _clear() {
[].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
return node.classList.contains(ClassName.ACTIVE);
return node.classList.contains(CLASS_NAME_ACTIVE);
}).forEach(function (node) {
return node.classList.remove(ClassName.ACTIVE);
return node.classList.remove(CLASS_NAME_ACTIVE);
});
} // Static
;
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var data = $__default['default'](this).data(DATA_KEY);
var _config = typeof config === 'object' && config;
if (!data) {
data = new ScrollSpy(this, _config);
$(this).data(DATA_KEY, data);
$__default['default'](this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -345,12 +287,12 @@
*/
$(window).on(Event.LOAD_DATA_API, function () {
var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));
$__default['default'](window).on(EVENT_LOAD_DATA_API, function () {
var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY));
var scrollSpysLength = scrollSpys.length;
for (var i = scrollSpysLength; i--;) {
var $spy = $(scrollSpys[i]);
var $spy = $__default['default'](scrollSpys[i]);
ScrollSpy._jQueryInterface.call($spy, $spy.data());
}
@ -361,15 +303,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = ScrollSpy._jQueryInterface;
$.fn[NAME].Constructor = ScrollSpy;
$__default['default'].fn[NAME] = ScrollSpy._jQueryInterface;
$__default['default'].fn[NAME].Constructor = ScrollSpy;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return ScrollSpy._jQueryInterface;
};
return ScrollSpy;
}));
})));
//# sourceMappingURL=scrollspy.js.map

File diff suppressed because one or more lines are too long

154
js/dist/tab.js vendored
View file

@ -1,33 +1,22 @@
/*!
* Bootstrap tab.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap tab.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Tab = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -35,44 +24,35 @@
*/
var NAME = 'tab';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME];
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
DROPDOWN_MENU: 'dropdown-menu',
ACTIVE: 'active',
DISABLED: 'disabled',
FADE: 'fade',
SHOW: 'show'
};
var Selector = {
DROPDOWN: '.dropdown',
NAV_LIST_GROUP: '.nav, .list-group',
ACTIVE: '.active',
ACTIVE_UL: '> li > .active',
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE: '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var EVENT_HIDE = "hide" + EVENT_KEY;
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
var EVENT_SHOW = "show" + EVENT_KEY;
var EVENT_SHOWN = "shown" + EVENT_KEY;
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
var CLASS_NAME_ACTIVE = 'active';
var CLASS_NAME_DISABLED = 'disabled';
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show';
var SELECTOR_DROPDOWN = '.dropdown';
var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
var SELECTOR_ACTIVE = '.active';
var SELECTOR_ACTIVE_UL = '> li > .active';
var SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]';
var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Tab =
/*#__PURE__*/
function () {
var Tab = /*#__PURE__*/function () {
function Tab(element) {
this._element = element;
} // Getters
@ -84,33 +64,33 @@
_proto.show = function show() {
var _this = this;
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default['default'](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
return;
}
var target;
var previous;
var listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0];
var selector = Util.getSelectorFromElement(this._element);
var listElement = $__default['default'](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0];
var selector = Util__default['default'].getSelectorFromElement(this._element);
if (listElement) {
var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
previous = $.makeArray($(listElement).find(itemSelector));
var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
previous = $__default['default'].makeArray($__default['default'](listElement).find(itemSelector));
previous = previous[previous.length - 1];
}
var hideEvent = $.Event(Event.HIDE, {
var hideEvent = $__default['default'].Event(EVENT_HIDE, {
relatedTarget: this._element
});
var showEvent = $.Event(Event.SHOW, {
var showEvent = $__default['default'].Event(EVENT_SHOW, {
relatedTarget: previous
});
if (previous) {
$(previous).trigger(hideEvent);
$__default['default'](previous).trigger(hideEvent);
}
$(this._element).trigger(showEvent);
$__default['default'](this._element).trigger(showEvent);
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
return;
@ -123,14 +103,14 @@
this._activate(this._element, listElement);
var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, {
var hiddenEvent = $__default['default'].Event(EVENT_HIDDEN, {
relatedTarget: _this._element
});
var shownEvent = $.Event(Event.SHOWN, {
var shownEvent = $__default['default'].Event(EVENT_SHOWN, {
relatedTarget: previous
});
$(previous).trigger(hiddenEvent);
$(_this._element).trigger(shownEvent);
$__default['default'](previous).trigger(hiddenEvent);
$__default['default'](_this._element).trigger(shownEvent);
};
if (target) {
@ -141,7 +121,7 @@
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$__default['default'].removeData(this._element, DATA_KEY);
this._element = null;
} // Private
;
@ -149,17 +129,17 @@
_proto._activate = function _activate(element, container, callback) {
var _this2 = this;
var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector.ACTIVE_UL) : $(container).children(Selector.ACTIVE);
var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default['default'](container).find(SELECTOR_ACTIVE_UL) : $__default['default'](container).children(SELECTOR_ACTIVE);
var active = activeElements[0];
var isTransitioning = callback && active && $(active).hasClass(ClassName.FADE);
var isTransitioning = callback && active && $__default['default'](active).hasClass(CLASS_NAME_FADE);
var complete = function complete() {
return _this2._transitionComplete(element, active, callback);
};
if (active && isTransitioning) {
var transitionDuration = Util.getTransitionDurationFromElement(active);
$(active).removeClass(ClassName.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(active);
$__default['default'](active).removeClass(CLASS_NAME_SHOW).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
@ -167,11 +147,11 @@
_proto._transitionComplete = function _transitionComplete(element, active, callback) {
if (active) {
$(active).removeClass(ClassName.ACTIVE);
var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
$__default['default'](active).removeClass(CLASS_NAME_ACTIVE);
var dropdownChild = $__default['default'](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE);
$__default['default'](dropdownChild).removeClass(CLASS_NAME_ACTIVE);
}
if (active.getAttribute('role') === 'tab') {
@ -179,24 +159,24 @@
}
}
$(element).addClass(ClassName.ACTIVE);
$__default['default'](element).addClass(CLASS_NAME_ACTIVE);
if (element.getAttribute('role') === 'tab') {
element.setAttribute('aria-selected', true);
}
Util.reflow(element);
Util__default['default'].reflow(element);
if (element.classList.contains(ClassName.FADE)) {
element.classList.add(ClassName.SHOW);
if (element.classList.contains(CLASS_NAME_FADE)) {
element.classList.add(CLASS_NAME_SHOW);
}
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
if (element.parentNode && $__default['default'](element.parentNode).hasClass(CLASS_NAME_DROPDOWN_MENU)) {
var dropdownElement = $__default['default'](element).closest(SELECTOR_DROPDOWN)[0];
if (dropdownElement) {
var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE));
$(dropdownToggleList).addClass(ClassName.ACTIVE);
var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE));
$__default['default'](dropdownToggleList).addClass(CLASS_NAME_ACTIVE);
}
element.setAttribute('aria-expanded', true);
@ -210,7 +190,7 @@
Tab._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var $this = $(this);
var $this = $__default['default'](this);
var data = $this.data(DATA_KEY);
if (!data) {
@ -244,10 +224,10 @@
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault();
Tab._jQueryInterface.call($(this), 'show');
Tab._jQueryInterface.call($__default['default'](this), 'show');
});
/**
* ------------------------------------------------------------------------
@ -255,15 +235,15 @@
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Tab._jQueryInterface;
$.fn[NAME].Constructor = Tab;
$__default['default'].fn[NAME] = Tab._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Tab;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Tab._jQueryInterface;
};
return Tab;
}));
})));
//# sourceMappingURL=tab.js.map

2
js/dist/tab.js.map vendored

File diff suppressed because one or more lines are too long

198
js/dist/toast.js vendored
View file

@ -1,67 +1,24 @@
/*!
* Bootstrap toast.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap toast.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
(global = global || self, global.Toast = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Toast = factory(global.jQuery, global.Util));
}(this, (function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -69,23 +26,19 @@
*/
var NAME = 'toast';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.toast';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var Event = {
CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY
};
var ClassName = {
FADE: 'fade',
HIDE: 'hide',
SHOW: 'show',
SHOWING: 'showing'
};
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY;
var EVENT_HIDE = "hide" + EVENT_KEY;
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
var EVENT_SHOW = "show" + EVENT_KEY;
var EVENT_SHOWN = "shown" + EVENT_KEY;
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_HIDE = 'hide';
var CLASS_NAME_SHOW = 'show';
var CLASS_NAME_SHOWING = 'showing';
var DefaultType = {
animation: 'boolean',
autohide: 'boolean',
@ -96,19 +49,14 @@
autohide: true,
delay: 500
};
var Selector = {
DATA_DISMISS: '[data-dismiss="toast"]'
var SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Toast =
/*#__PURE__*/
function () {
var Toast = /*#__PURE__*/function () {
function Toast(element, config) {
this._element = element;
this._config = this._getConfig(config);
@ -124,106 +72,118 @@
_proto.show = function show() {
var _this = this;
$(this._element).trigger(Event.SHOW);
var showEvent = $__default['default'].Event(EVENT_SHOW);
$__default['default'](this._element).trigger(showEvent);
if (showEvent.isDefaultPrevented()) {
return;
}
this._clearTimeout();
if (this._config.animation) {
this._element.classList.add(ClassName.FADE);
this._element.classList.add(CLASS_NAME_FADE);
}
var complete = function complete() {
_this._element.classList.remove(ClassName.SHOWING);
_this._element.classList.remove(CLASS_NAME_SHOWING);
_this._element.classList.add(ClassName.SHOW);
_this._element.classList.add(CLASS_NAME_SHOW);
$(_this._element).trigger(Event.SHOWN);
$__default['default'](_this._element).trigger(EVENT_SHOWN);
if (_this._config.autohide) {
_this._timeout = setTimeout(function () {
_this.hide();
}, _this._config.delay);
}
};
this._element.classList.remove(ClassName.HIDE);
this._element.classList.remove(CLASS_NAME_HIDE);
this._element.classList.add(ClassName.SHOWING);
Util__default['default'].reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOWING);
if (this._config.animation) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
};
_proto.hide = function hide(withoutTimeout) {
var _this2 = this;
if (!this._element.classList.contains(ClassName.SHOW)) {
_proto.hide = function hide() {
if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
return;
}
$(this._element).trigger(Event.HIDE);
var hideEvent = $__default['default'].Event(EVENT_HIDE);
$__default['default'](this._element).trigger(hideEvent);
if (withoutTimeout) {
this._close();
} else {
this._timeout = setTimeout(function () {
_this2._close();
}, this._config.delay);
if (hideEvent.isDefaultPrevented()) {
return;
}
this._close();
};
_proto.dispose = function dispose() {
clearTimeout(this._timeout);
this._timeout = null;
this._clearTimeout();
if (this._element.classList.contains(ClassName.SHOW)) {
this._element.classList.remove(ClassName.SHOW);
if (this._element.classList.contains(CLASS_NAME_SHOW)) {
this._element.classList.remove(CLASS_NAME_SHOW);
}
$(this._element).off(Event.CLICK_DISMISS);
$.removeData(this._element, DATA_KEY);
$__default['default'](this._element).off(EVENT_CLICK_DISMISS);
$__default['default'].removeData(this._element, DATA_KEY);
this._element = null;
this._config = null;
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, $(this._element).data(), typeof config === 'object' && config ? config : {});
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
config = _extends({}, Default, $__default['default'](this._element).data(), typeof config === 'object' && config ? config : {});
Util__default['default'].typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config;
};
_proto._setListeners = function _setListeners() {
var _this3 = this;
var _this2 = this;
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function () {
return _this3.hide(true);
$__default['default'](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function () {
return _this2.hide();
});
};
_proto._close = function _close() {
var _this4 = this;
var _this3 = this;
var complete = function complete() {
_this4._element.classList.add(ClassName.HIDE);
_this3._element.classList.add(CLASS_NAME_HIDE);
$(_this4._element).trigger(Event.HIDDEN);
$__default['default'](_this3._element).trigger(EVENT_HIDDEN);
};
this._element.classList.remove(ClassName.SHOW);
this._element.classList.remove(CLASS_NAME_SHOW);
if (this._config.animation) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
};
_proto._clearTimeout = function _clearTimeout() {
clearTimeout(this._timeout);
this._timeout = null;
} // Static
;
Toast._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var $element = $(this);
var $element = $__default['default'](this);
var data = $element.data(DATA_KEY);
var _config = typeof config === 'object' && config;
@ -269,15 +229,15 @@
*/
$.fn[NAME] = Toast._jQueryInterface;
$.fn[NAME].Constructor = Toast;
$__default['default'].fn[NAME] = Toast._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Toast;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Toast._jQueryInterface;
};
return Toast;
}));
})));
//# sourceMappingURL=toast.js.map

File diff suppressed because one or more lines are too long

375
js/dist/tooltip.js vendored
View file

@ -1,72 +1,24 @@
/*!
* Bootstrap tooltip.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap tooltip.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
(global = global || self, global.Tooltip = factory(global.jQuery, global.Popper, global.Util));
}(this, function ($, Popper, Util) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.jQuery, global.Popper, global.Util));
}(this, (function ($, Popper, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
@ -90,7 +42,7 @@
h5: [],
h6: [],
i: [],
img: ['src', 'alt', 'title', 'width', 'height'],
img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
@ -103,21 +55,21 @@
strong: [],
u: [],
ul: []
};
/**
* A pattern that recognizes a commonly useful subset of URLs that are safe.
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
};
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi;
/**
* A pattern that matches safe data URLs. Only matches image, video and audio types.
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
function allowedAttribute(attr, allowedAttributeList) {
var attrName = attr.nodeName.toLowerCase();
@ -134,7 +86,7 @@
return attrRegex instanceof RegExp;
}); // Check if a regular expression validates the attribute.
for (var i = 0, l = regExp.length; i < l; i++) {
for (var i = 0, len = regExp.length; i < len; i++) {
if (attrName.match(regExp[i])) {
return true;
}
@ -176,7 +128,7 @@
};
for (var i = 0, len = elements.length; i < len; i++) {
var _ret = _loop(i, len);
var _ret = _loop(i);
if (_ret === "continue") continue;
}
@ -184,6 +136,11 @@
return createdDocument.body.innerHTML;
}
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ------------------------------------------------------------------------
* Constants
@ -191,10 +148,10 @@
*/
var NAME = 'tooltip';
var VERSION = '4.3.1';
var VERSION = '4.5.3';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
var CLASS_PREFIX = 'bs-tooltip';
var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
@ -213,7 +170,8 @@
boundary: '(string|element)',
sanitize: 'boolean',
sanitizeFn: '(null|function)',
whiteList: 'object'
whiteList: 'object',
popperConfig: '(null|object)'
};
var AttachmentMap = {
AUTO: 'auto',
@ -237,12 +195,11 @@
boundary: 'scrollParent',
sanitize: true,
sanitizeFn: null,
whiteList: DefaultWhitelist
};
var HoverState = {
SHOW: 'show',
OUT: 'out'
whiteList: DefaultWhitelist,
popperConfig: null
};
var HOVER_STATE_SHOW = 'show';
var HOVER_STATE_OUT = 'out';
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
@ -255,37 +212,23 @@
MOUSEENTER: "mouseenter" + EVENT_KEY,
MOUSELEAVE: "mouseleave" + EVENT_KEY
};
var ClassName = {
FADE: 'fade',
SHOW: 'show'
};
var Selector = {
TOOLTIP: '.tooltip',
TOOLTIP_INNER: '.tooltip-inner',
ARROW: '.arrow'
};
var Trigger = {
HOVER: 'hover',
FOCUS: 'focus',
CLICK: 'click',
MANUAL: 'manual'
var CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show';
var SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
var SELECTOR_ARROW = '.arrow';
var TRIGGER_HOVER = 'hover';
var TRIGGER_FOCUS = 'focus';
var TRIGGER_CLICK = 'click';
var TRIGGER_MANUAL = 'manual';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Tooltip =
/*#__PURE__*/
function () {
var Tooltip = /*#__PURE__*/function () {
function Tooltip(element, config) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
if (typeof Popper__default['default'] === 'undefined') {
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
} // private
@ -326,11 +269,11 @@
if (event) {
var dataKey = this.constructor.DATA_KEY;
var context = $(event.currentTarget).data(dataKey);
var context = $__default['default'](event.currentTarget).data(dataKey);
if (!context) {
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
$(event.currentTarget).data(dataKey, context);
$__default['default'](event.currentTarget).data(dataKey, context);
}
context._activeTrigger.click = !context._activeTrigger.click;
@ -341,7 +284,7 @@
context._leave(null, context);
}
} else {
if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
if ($__default['default'](this.getTipElement()).hasClass(CLASS_NAME_SHOW)) {
this._leave(null, this);
return;
@ -353,12 +296,12 @@
_proto.dispose = function dispose() {
clearTimeout(this._timeout);
$.removeData(this.element, this.constructor.DATA_KEY);
$(this.element).off(this.constructor.EVENT_KEY);
$(this.element).closest('.modal').off('hide.bs.modal');
$__default['default'].removeData(this.element, this.constructor.DATA_KEY);
$__default['default'](this.element).off(this.constructor.EVENT_KEY);
$__default['default'](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
if (this.tip) {
$(this.tip).remove();
$__default['default'](this.tip).remove();
}
this._isEnabled = null;
@ -366,7 +309,7 @@
this._hoverState = null;
this._activeTrigger = null;
if (this._popper !== null) {
if (this._popper) {
this._popper.destroy();
}
@ -379,29 +322,29 @@
_proto.show = function show() {
var _this = this;
if ($(this.element).css('display') === 'none') {
if ($__default['default'](this.element).css('display') === 'none') {
throw new Error('Please use show on visible elements');
}
var showEvent = $.Event(this.constructor.Event.SHOW);
var showEvent = $__default['default'].Event(this.constructor.Event.SHOW);
if (this.isWithContent() && this._isEnabled) {
$(this.element).trigger(showEvent);
var shadowRoot = Util.findShadowRoot(this.element);
var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
$__default['default'](this.element).trigger(showEvent);
var shadowRoot = Util__default['default'].findShadowRoot(this.element);
var isInTheDom = $__default['default'].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
if (showEvent.isDefaultPrevented() || !isInTheDom) {
return;
}
var tip = this.getTipElement();
var tipId = Util.getUID(this.constructor.NAME);
var tipId = Util__default['default'].getUID(this.constructor.NAME);
tip.setAttribute('id', tipId);
this.element.setAttribute('aria-describedby', tipId);
this.setContent();
if (this.config.animation) {
$(tip).addClass(ClassName.FADE);
$__default['default'](tip).addClass(CLASS_NAME_FADE);
}
var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
@ -412,43 +355,21 @@
var container = this._getContainer();
$(tip).data(this.constructor.DATA_KEY, this);
$__default['default'](tip).data(this.constructor.DATA_KEY, this);
if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
$(tip).appendTo(container);
if (!$__default['default'].contains(this.element.ownerDocument.documentElement, this.tip)) {
$__default['default'](tip).appendTo(container);
}
$(this.element).trigger(this.constructor.Event.INSERTED);
this._popper = new Popper(this.element, tip, {
placement: attachment,
modifiers: {
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: Selector.ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: function onCreate(data) {
if (data.originalPlacement !== data.placement) {
_this._handlePopperPlacementChange(data);
}
},
onUpdate: function onUpdate(data) {
return _this._handlePopperPlacementChange(data);
}
});
$(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
$__default['default'](this.element).trigger(this.constructor.Event.INSERTED);
this._popper = new Popper__default['default'](this.element, tip, this._getPopperConfig(attachment));
$__default['default'](tip).addClass(CLASS_NAME_SHOW); // 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) {
$(document.body).children().on('mouseover', null, $.noop);
$__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop);
}
var complete = function complete() {
@ -458,16 +379,16 @@
var prevHoverState = _this._hoverState;
_this._hoverState = null;
$(_this.element).trigger(_this.constructor.Event.SHOWN);
$__default['default'](_this.element).trigger(_this.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) {
if (prevHoverState === HOVER_STATE_OUT) {
_this._leave(null, _this);
}
};
if ($(this.tip).hasClass(ClassName.FADE)) {
var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE)) {
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this.tip);
$__default['default'](this.tip).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
@ -478,10 +399,10 @@
var _this2 = this;
var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE);
var hideEvent = $__default['default'].Event(this.constructor.Event.HIDE);
var complete = function complete() {
if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip);
}
@ -489,7 +410,7 @@
_this2.element.removeAttribute('aria-describedby');
$(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
$__default['default'](_this2.element).trigger(_this2.constructor.Event.HIDDEN);
if (_this2._popper !== null) {
_this2._popper.destroy();
@ -500,26 +421,26 @@
}
};
$(this.element).trigger(hideEvent);
$__default['default'](this.element).trigger(hideEvent);
if (hideEvent.isDefaultPrevented()) {
return;
}
$(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
$__default['default'](tip).removeClass(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
if ('ontouchstart' in document.documentElement) {
$(document.body).children().off('mouseover', null, $.noop);
$__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
}
this._activeTrigger[Trigger.CLICK] = false;
this._activeTrigger[Trigger.FOCUS] = false;
this._activeTrigger[Trigger.HOVER] = false;
this._activeTrigger[TRIGGER_CLICK] = false;
this._activeTrigger[TRIGGER_FOCUS] = false;
this._activeTrigger[TRIGGER_HOVER] = false;
if ($(this.tip).hasClass(ClassName.FADE)) {
var transitionDuration = Util.getTransitionDurationFromElement(tip);
$(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE)) {
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(tip);
$__default['default'](tip).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
@ -539,29 +460,29 @@
};
_proto.addAttachmentClass = function addAttachmentClass(attachment) {
$(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
$__default['default'](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
};
_proto.getTipElement = function getTipElement() {
this.tip = this.tip || $(this.config.template)[0];
this.tip = this.tip || $__default['default'](this.config.template)[0];
return this.tip;
};
_proto.setContent = function setContent() {
var tip = this.getTipElement();
this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle());
$(tip).removeClass(ClassName.FADE + " " + ClassName.SHOW);
this.setElementContent($__default['default'](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());
$__default['default'](tip).removeClass(CLASS_NAME_FADE + " " + CLASS_NAME_SHOW);
};
_proto.setElementContent = function setElementContent($element, content) {
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
// Content is a DOM node or a jQuery
if (this.config.html) {
if (!$(content).parent().is($element)) {
if (!$__default['default'](content).parent().is($element)) {
$element.empty().append(content);
}
} else {
$element.text($(content).text());
$element.text($__default['default'](content).text());
}
return;
@ -589,14 +510,43 @@
} // Private
;
_proto._getOffset = function _getOffset() {
_proto._getPopperConfig = function _getPopperConfig(attachment) {
var _this3 = this;
var defaultBsConfig = {
placement: attachment,
modifiers: {
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: SELECTOR_ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: function onCreate(data) {
if (data.originalPlacement !== data.placement) {
_this3._handlePopperPlacementChange(data);
}
},
onUpdate: function onUpdate(data) {
return _this3._handlePopperPlacementChange(data);
}
};
return _extends({}, defaultBsConfig, this.config.popperConfig);
};
_proto._getOffset = function _getOffset() {
var _this4 = this;
var offset = {};
if (typeof this.config.offset === 'function') {
offset.fn = function (data) {
data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element) || {});
return data;
};
} else {
@ -611,11 +561,11 @@
return document.body;
}
if (Util.isElement(this.config.container)) {
return $(this.config.container);
if (Util__default['default'].isElement(this.config.container)) {
return $__default['default'](this.config.container);
}
return $(document).find(this.config.container);
return $__default['default'](document).find(this.config.container);
};
_proto._getAttachment = function _getAttachment(placement) {
@ -623,32 +573,35 @@
};
_proto._setListeners = function _setListeners() {
var _this4 = this;
var _this5 = this;
var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) {
if (trigger === 'click') {
$(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
return _this4.toggle(event);
$__default['default'](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
return _this5.toggle(event);
});
} else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
$(_this4.element).on(eventIn, _this4.config.selector, function (event) {
return _this4._enter(event);
}).on(eventOut, _this4.config.selector, function (event) {
return _this4._leave(event);
} else if (trigger !== TRIGGER_MANUAL) {
var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
$__default['default'](_this5.element).on(eventIn, _this5.config.selector, function (event) {
return _this5._enter(event);
}).on(eventOut, _this5.config.selector, function (event) {
return _this5._leave(event);
});
}
});
$(this.element).closest('.modal').on('hide.bs.modal', function () {
if (_this4.element) {
_this4.hide();
}
});
this._hideModalHandler = function () {
if (_this5.element) {
_this5.hide();
}
};
$__default['default'](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
if (this.config.selector) {
this.config = _objectSpread({}, this.config, {
this.config = _extends({}, this.config, {
trigger: 'manual',
selector: ''
});
@ -668,24 +621,24 @@
_proto._enter = function _enter(event, context) {
var dataKey = this.constructor.DATA_KEY;
context = context || $(event.currentTarget).data(dataKey);
context = context || $__default['default'](event.currentTarget).data(dataKey);
if (!context) {
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
$(event.currentTarget).data(dataKey, context);
$__default['default'](event.currentTarget).data(dataKey, context);
}
if (event) {
context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
}
if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
context._hoverState = HoverState.SHOW;
if ($__default['default'](context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {
context._hoverState = HOVER_STATE_SHOW;
return;
}
clearTimeout(context._timeout);
context._hoverState = HoverState.SHOW;
context._hoverState = HOVER_STATE_SHOW;
if (!context.config.delay || !context.config.delay.show) {
context.show();
@ -693,7 +646,7 @@
}
context._timeout = setTimeout(function () {
if (context._hoverState === HoverState.SHOW) {
if (context._hoverState === HOVER_STATE_SHOW) {
context.show();
}
}, context.config.delay.show);
@ -701,15 +654,15 @@
_proto._leave = function _leave(event, context) {
var dataKey = this.constructor.DATA_KEY;
context = context || $(event.currentTarget).data(dataKey);
context = context || $__default['default'](event.currentTarget).data(dataKey);
if (!context) {
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
$(event.currentTarget).data(dataKey, context);
$__default['default'](event.currentTarget).data(dataKey, context);
}
if (event) {
context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;
}
if (context._isWithActiveTrigger()) {
@ -717,7 +670,7 @@
}
clearTimeout(context._timeout);
context._hoverState = HoverState.OUT;
context._hoverState = HOVER_STATE_OUT;
if (!context.config.delay || !context.config.delay.hide) {
context.hide();
@ -725,7 +678,7 @@
}
context._timeout = setTimeout(function () {
if (context._hoverState === HoverState.OUT) {
if (context._hoverState === HOVER_STATE_OUT) {
context.hide();
}
}, context.config.delay.hide);
@ -742,13 +695,13 @@
};
_proto._getConfig = function _getConfig(config) {
var dataAttributes = $(this.element).data();
var dataAttributes = $__default['default'](this.element).data();
Object.keys(dataAttributes).forEach(function (dataAttr) {
if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
delete dataAttributes[dataAttr];
}
});
config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
if (typeof config.delay === 'number') {
config.delay = {
@ -765,7 +718,7 @@
config.content = config.content.toString();
}
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
Util__default['default'].typeCheckConfig(NAME, config, this.constructor.DefaultType);
if (config.sanitize) {
config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
@ -789,7 +742,7 @@
};
_proto._cleanTipClass = function _cleanTipClass() {
var $tip = $(this.getTipElement());
var $tip = $__default['default'](this.getTipElement());
var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
if (tabClass !== null && tabClass.length) {
@ -798,8 +751,7 @@
};
_proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
var popperInstance = popperData.instance;
this.tip = popperInstance.popper;
this.tip = popperData.instance.popper;
this._cleanTipClass();
@ -814,7 +766,7 @@
return;
}
$(tip).removeClass(ClassName.FADE);
$__default['default'](tip).removeClass(CLASS_NAME_FADE);
this.config.animation = false;
this.hide();
this.show();
@ -824,7 +776,8 @@
Tooltip._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var $element = $__default['default'](this);
var data = $element.data(DATA_KEY);
var _config = typeof config === 'object' && config;
@ -834,7 +787,7 @@
if (!data) {
data = new Tooltip(this, _config);
$(this).data(DATA_KEY, data);
$element.data(DATA_KEY, data);
}
if (typeof config === 'string') {
@ -893,15 +846,15 @@
*/
$.fn[NAME] = Tooltip._jQueryInterface;
$.fn[NAME].Constructor = Tooltip;
$__default['default'].fn[NAME] = Tooltip._jQueryInterface;
$__default['default'].fn[NAME].Constructor = Tooltip;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
$__default['default'].fn[NAME].noConflict = function () {
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
return Tooltip._jQueryInterface;
};
return Tooltip;
}));
})));
//# sourceMappingURL=tooltip.js.map

File diff suppressed because one or more lines are too long

61
js/dist/util.js vendored
View file

@ -1,20 +1,22 @@
/*!
* Bootstrap util.js v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap util.js v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
typeof define === 'function' && define.amd ? define(['jquery'], factory) :
(global = global || self, global.Util = factory(global.jQuery));
}(this, function ($) { 'use strict';
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Util = factory(global.jQuery));
}(this, (function ($) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/**
@ -28,6 +30,10 @@
var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
function toType(obj) {
if (obj === null || typeof obj === 'undefined') {
return "" + obj;
}
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
}
@ -36,11 +42,11 @@
bindType: TRANSITION_END,
delegateType: TRANSITION_END,
handle: function handle(event) {
if ($(event.target).is(this)) {
if ($__default['default'](event.target).is(this)) {
return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
}
return undefined; // eslint-disable-line no-undefined
return undefined;
}
};
}
@ -49,7 +55,7 @@
var _this = this;
var called = false;
$(this).one(Util.TRANSITION_END, function () {
$__default['default'](this).one(Util.TRANSITION_END, function () {
called = true;
});
setTimeout(function () {
@ -61,8 +67,8 @@
}
function setTransitionEndSupport() {
$.fn.emulateTransitionEnd = transitionEndEmulator;
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
$__default['default'].fn.emulateTransitionEnd = transitionEndEmulator;
$__default['default'].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
}
/**
* --------------------------------------------------------------------------
@ -75,7 +81,6 @@
TRANSITION_END: 'bsTransitionEnd',
getUID: function getUID(prefix) {
do {
// eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
} while (document.getElementById(prefix));
@ -91,7 +96,7 @@
try {
return document.querySelector(selector) ? selector : null;
} catch (err) {
} catch (_) {
return null;
}
},
@ -101,8 +106,8 @@
} // Get transition-duration of the element
var transitionDuration = $(element).css('transition-duration');
var transitionDelay = $(element).css('transition-delay');
var transitionDuration = $__default['default'](element).css('transition-duration');
var transitionDelay = $__default['default'](element).css('transition-delay');
var floatTransitionDuration = parseFloat(transitionDuration);
var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
@ -119,9 +124,8 @@
return element.offsetHeight;
},
triggerTransitionEnd: function triggerTransitionEnd(element) {
$(element).trigger(TRANSITION_END);
$__default['default'](element).trigger(TRANSITION_END);
},
// TODO: Remove in v5
supportsTransitionEnd: function supportsTransitionEnd() {
return Boolean(TRANSITION_END);
},
@ -162,11 +166,28 @@
}
return Util.findShadowRoot(element.parentNode);
},
jQueryDetection: function jQueryDetection() {
if (typeof $__default['default'] === 'undefined') {
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
}
var version = $__default['default'].fn.jquery.split(' ')[0].split('.');
var minMajor = 1;
var ltMajor = 2;
var minMinor = 9;
var minPatch = 1;
var maxMajor = 4;
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
}
}
};
Util.jQueryDetection();
setTransitionEndSupport();
return Util;
}));
})));
//# sourceMappingURL=util.js.map

2
js/dist/util.js.map vendored

File diff suppressed because one or more lines are too long

34
js/index.js Normal file
View file

@ -0,0 +1,34 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.5.3): index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
import Alert from './src/alert'
import Button from './src/button'
import Carousel from './src/carousel'
import Collapse from './src/collapse'
import Dropdown from './src/dropdown'
import Modal from './src/modal'
import Popover from './src/popover'
import Scrollspy from './src/scrollspy'
import Tab from './src/tab'
import Toast from './src/toast'
import Tooltip from './src/tooltip'
import Util from './src/util'
export {
Util,
Alert,
Button,
Carousel,
Collapse,
Dropdown,
Modal,
Popover,
Scrollspy,
Tab,
Toast,
Tooltip
}

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,27 +15,21 @@ import Util from './util'
*/
const NAME = 'alert'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Selector = {
DISMISS : '[data-dismiss="alert"]'
}
const SELECTOR_DISMISS = '[data-dismiss="alert"]'
const Event = {
CLOSE : `close${EVENT_KEY}`,
CLOSED : `closed${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
const EVENT_CLOSE = `close${EVENT_KEY}`
const EVENT_CLOSED = `closed${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const ClassName = {
ALERT : 'alert',
FADE : 'fade',
SHOW : 'show'
}
const CLASS_NAME_ALERT = 'alert'
const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show'
/**
* ------------------------------------------------------------------------
@ -87,38 +81,40 @@ class Alert {
}
if (!parent) {
parent = $(element).closest(`.${ClassName.ALERT}`)[0]
parent = $(element).closest(`.${CLASS_NAME_ALERT}`)[0]
}
return parent
}
_triggerCloseEvent(element) {
const closeEvent = $.Event(Event.CLOSE)
const closeEvent = $.Event(EVENT_CLOSE)
$(element).trigger(closeEvent)
return closeEvent
}
_removeElement(element) {
$(element).removeClass(ClassName.SHOW)
const $element = $(element)
if (!$(element).hasClass(ClassName.FADE)) {
$element.removeClass(CLASS_NAME_SHOW)
if (!$element.hasClass(CLASS_NAME_FADE)) {
this._destroyElement(element)
return
}
const transitionDuration = Util.getTransitionDurationFromElement(element)
$(element)
.one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
$element
.one(Util.TRANSITION_END, event => this._destroyElement(element, event))
.emulateTransitionEnd(transitionDuration)
}
_destroyElement(element) {
$(element)
.detach()
.trigger(Event.CLOSED)
.trigger(EVENT_CLOSED)
.remove()
}
@ -158,8 +154,8 @@ class Alert {
*/
$(document).on(
Event.CLICK_DATA_API,
Selector.DISMISS,
EVENT_CLICK_DATA_API,
SELECTOR_DISMISS,
Alert._handleDismiss(new Alert())
)

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -14,31 +14,28 @@ import $ from 'jquery'
*/
const NAME = 'button'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const ClassName = {
ACTIVE : 'active',
BUTTON : 'btn',
FOCUS : 'focus'
}
const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_BUTTON = 'btn'
const CLASS_NAME_FOCUS = 'focus'
const Selector = {
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
DATA_TOGGLE : '[data-toggle="buttons"]',
INPUT : 'input:not([type="hidden"])',
ACTIVE : '.active',
BUTTON : '.btn'
}
const SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'
const SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'
const SELECTOR_DATA_TOGGLE = '[data-toggle="button"]'
const SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'
const SELECTOR_INPUT = 'input:not([type="hidden"])'
const SELECTOR_ACTIVE = '.active'
const SELECTOR_BUTTON = '.btn'
const Event = {
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +
`blur${EVENT_KEY}${DATA_API_KEY}`
}
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
/**
* ------------------------------------------------------------------------
@ -49,6 +46,7 @@ const Event = {
class Button {
constructor(element) {
this._element = element
this.shouldAvoidTriggerChange = false
}
// Getters
@ -62,50 +60,48 @@ class Button {
toggle() {
let triggerChangeEvent = true
let addAriaPressed = true
const rootElement = $(this._element).closest(
Selector.DATA_TOGGLE
)[0]
const rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]
if (rootElement) {
const input = this._element.querySelector(Selector.INPUT)
const input = this._element.querySelector(SELECTOR_INPUT)
if (input) {
if (input.type === 'radio') {
if (input.checked &&
this._element.classList.contains(ClassName.ACTIVE)) {
if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
triggerChangeEvent = false
} else {
const activeElement = rootElement.querySelector(Selector.ACTIVE)
const activeElement = rootElement.querySelector(SELECTOR_ACTIVE)
if (activeElement) {
$(activeElement).removeClass(ClassName.ACTIVE)
$(activeElement).removeClass(CLASS_NAME_ACTIVE)
}
}
}
if (triggerChangeEvent) {
if (input.hasAttribute('disabled') ||
rootElement.hasAttribute('disabled') ||
input.classList.contains('disabled') ||
rootElement.classList.contains('disabled')) {
return
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
if (input.type === 'checkbox' || input.type === 'radio') {
input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)
}
input.checked = !this._element.classList.contains(ClassName.ACTIVE)
if (!this.shouldAvoidTriggerChange) {
$(input).trigger('change')
}
}
input.focus()
addAriaPressed = false
}
}
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
if (addAriaPressed) {
this._element.setAttribute('aria-pressed',
!this._element.classList.contains(ClassName.ACTIVE))
this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))
}
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE)
$(this._element).toggleClass(CLASS_NAME_ACTIVE)
}
}
}
@ -116,15 +112,18 @@ class Button {
// Static
static _jQueryInterface(config) {
static _jQueryInterface(config, avoidTriggerChange) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const $element = $(this)
let data = $element.data(DATA_KEY)
if (!data) {
data = new Button(this)
$(this).data(DATA_KEY, data)
$element.data(DATA_KEY, data)
}
data.shouldAvoidTriggerChange = avoidTriggerChange
if (config === 'toggle') {
data[config]()
}
@ -139,20 +138,59 @@ class Button {
*/
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
event.preventDefault()
.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
let button = event.target
const initialButton = button
if (!$(button).hasClass(ClassName.BUTTON)) {
button = $(button).closest(Selector.BUTTON)
if (!$(button).hasClass(CLASS_NAME_BUTTON)) {
button = $(button).closest(SELECTOR_BUTTON)[0]
}
Button._jQueryInterface.call($(button), 'toggle')
if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
event.preventDefault() // work around Firefox bug #1540995
} else {
const inputBtn = button.querySelector(SELECTOR_INPUT)
if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
event.preventDefault() // work around Firefox bug #1540995
return
}
if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')
}
}
})
.on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
const button = $(event.target).closest(Selector.BUTTON)[0]
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
.on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
const button = $(event.target).closest(SELECTOR_BUTTON)[0]
$(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))
})
$(window).on(EVENT_LOAD_DATA_API, () => {
// ensure correct active class is set to match the controls' actual values/states
// find all checkboxes/readio buttons inside data-toggle groups
let buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS))
for (let i = 0, len = buttons.length; i < len; i++) {
const button = buttons[i]
const input = button.querySelector(SELECTOR_INPUT)
if (input.checked || input.hasAttribute('checked')) {
button.classList.add(CLASS_NAME_ACTIVE)
} else {
button.classList.remove(CLASS_NAME_ACTIVE)
}
}
// find all button toggles
buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))
for (let i = 0, len = buttons.length; i < len; i++) {
const button = buttons[i]
if (button.getAttribute('aria-pressed') === 'true') {
button.classList.add(CLASS_NAME_ACTIVE)
} else {
button.classList.remove(CLASS_NAME_ACTIVE)
}
}
})
/**

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'carousel'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.carousel'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@ -43,51 +43,42 @@ const DefaultType = {
touch: 'boolean'
}
const Direction = {
NEXT : 'next',
PREV : 'prev',
LEFT : 'left',
RIGHT : 'right'
}
const DIRECTION_NEXT = 'next'
const DIRECTION_PREV = 'prev'
const DIRECTION_LEFT = 'left'
const DIRECTION_RIGHT = 'right'
const Event = {
SLIDE : `slide${EVENT_KEY}`,
SLID : `slid${EVENT_KEY}`,
KEYDOWN : `keydown${EVENT_KEY}`,
MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}`,
TOUCHSTART : `touchstart${EVENT_KEY}`,
TOUCHMOVE : `touchmove${EVENT_KEY}`,
TOUCHEND : `touchend${EVENT_KEY}`,
POINTERDOWN : `pointerdown${EVENT_KEY}`,
POINTERUP : `pointerup${EVENT_KEY}`,
DRAG_START : `dragstart${EVENT_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
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 ClassName = {
CAROUSEL : 'carousel',
ACTIVE : 'active',
SLIDE : 'slide',
RIGHT : 'carousel-item-right',
LEFT : 'carousel-item-left',
NEXT : 'carousel-item-next',
PREV : 'carousel-item-prev',
ITEM : 'carousel-item',
POINTER_EVENT : 'pointer-event'
}
const CLASS_NAME_CAROUSEL = 'carousel'
const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_SLIDE = 'slide'
const CLASS_NAME_RIGHT = 'carousel-item-right'
const CLASS_NAME_LEFT = 'carousel-item-left'
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',
ACTIVE_ITEM : '.active.carousel-item',
ITEM : '.carousel-item',
ITEM_IMG : '.carousel-item img',
NEXT_PREV : '.carousel-item-next, .carousel-item-prev',
INDICATORS : '.carousel-indicators',
DATA_SLIDE : '[data-slide], [data-slide-to]',
DATA_RIDE : '[data-ride="carousel"]'
}
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_DATA_SLIDE = '[data-slide], [data-slide-to]'
const SELECTOR_DATA_RIDE = '[data-ride="carousel"]'
const PointerType = {
TOUCH: 'touch',
@ -112,7 +103,7 @@ class Carousel {
this._config = this._getConfig(config)
this._element = element
this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)
this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)
this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)
@ -133,22 +124,23 @@ class Carousel {
next() {
if (!this._isSliding) {
this._slide(Direction.NEXT)
this._slide(DIRECTION_NEXT)
}
}
nextWhenVisible() {
const $element = $(this._element)
// Don't call next when the page isn't visible
// or the carousel or its parent isn't visible
if (!document.hidden &&
($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {
($element.is(':visible') && $element.css('visibility') !== 'hidden')) {
this.next()
}
}
prev() {
if (!this._isSliding) {
this._slide(Direction.PREV)
this._slide(DIRECTION_PREV)
}
}
@ -157,7 +149,7 @@ class Carousel {
this._isPaused = true
}
if (this._element.querySelector(Selector.NEXT_PREV)) {
if (this._element.querySelector(SELECTOR_NEXT_PREV)) {
Util.triggerTransitionEnd(this._element)
this.cycle(true)
}
@ -177,6 +169,8 @@ class Carousel {
}
if (this._config.interval && !this._isPaused) {
this._updateInterval()
this._interval = setInterval(
(document.visibilityState ? this.nextWhenVisible : this.next).bind(this),
this._config.interval
@ -185,7 +179,7 @@ class Carousel {
}
to(index) {
this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)
this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)
const activeIndex = this._getItemIndex(this._activeElement)
@ -194,7 +188,7 @@ class Carousel {
}
if (this._isSliding) {
$(this._element).one(Event.SLID, () => this.to(index))
$(this._element).one(EVENT_SLID, () => this.to(index))
return
}
@ -204,9 +198,9 @@ class Carousel {
return
}
const direction = index > activeIndex
? Direction.NEXT
: Direction.PREV
const direction = index > activeIndex ?
DIRECTION_NEXT :
DIRECTION_PREV
this._slide(direction, this._items[index])
}
@ -245,6 +239,8 @@ class Carousel {
const direction = absDeltax / this.touchDeltaX
this.touchDeltaX = 0
// swipe left
if (direction > 0) {
this.prev()
@ -257,15 +253,16 @@ class Carousel {
}
_addEventListeners() {
const $element = $(this._element)
if (this._config.keyboard) {
$(this._element)
.on(Event.KEYDOWN, (event) => this._keydown(event))
$element.on(EVENT_KEYDOWN, event => this._keydown(event))
}
if (this._config.pause === 'hover') {
$(this._element)
.on(Event.MOUSEENTER, (event) => this.pause(event))
.on(Event.MOUSELEAVE, (event) => this.cycle(event))
$element
.on(EVENT_MOUSEENTER, event => this.pause(event))
.on(EVENT_MOUSELEAVE, event => this.cycle(event))
}
if (this._config.touch) {
@ -278,7 +275,7 @@ class Carousel {
return
}
const start = (event) => {
const start = event => {
if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
this.touchStartX = event.originalEvent.clientX
} else if (!this._pointerEvent) {
@ -286,7 +283,7 @@ class Carousel {
}
}
const move = (event) => {
const move = event => {
// ensure swiping with one touch and not pinching
if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
this.touchDeltaX = 0
@ -295,7 +292,7 @@ class Carousel {
}
}
const end = (event) => {
const end = event => {
if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
this.touchDeltaX = event.originalEvent.clientX - this.touchStartX
}
@ -314,20 +311,23 @@ class Carousel {
if (this.touchTimeout) {
clearTimeout(this.touchTimeout)
}
this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
}
}
$(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())
$(this._element.querySelectorAll(SELECTOR_ITEM_IMG))
.on(EVENT_DRAG_START, e => e.preventDefault())
if (this._pointerEvent) {
$(this._element).on(Event.POINTERDOWN, (event) => start(event))
$(this._element).on(Event.POINTERUP, (event) => end(event))
$(this._element).on(EVENT_POINTERDOWN, event => start(event))
$(this._element).on(EVENT_POINTERUP, event => end(event))
this._element.classList.add(ClassName.POINTER_EVENT)
this._element.classList.add(CLASS_NAME_POINTER_EVENT)
} else {
$(this._element).on(Event.TOUCHSTART, (event) => start(event))
$(this._element).on(Event.TOUCHMOVE, (event) => move(event))
$(this._element).on(Event.TOUCHEND, (event) => end(event))
$(this._element).on(EVENT_TOUCHSTART, event => start(event))
$(this._element).on(EVENT_TOUCHMOVE, event => move(event))
$(this._element).on(EVENT_TOUCHEND, event => end(event))
}
}
@ -350,15 +350,15 @@ class Carousel {
}
_getItemIndex(element) {
this._items = element && element.parentNode
? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))
: []
this._items = element && element.parentNode ?
[].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :
[]
return this._items.indexOf(element)
}
_getItemByDirection(direction, activeElement) {
const isNextDirection = direction === Direction.NEXT
const isPrevDirection = direction === Direction.PREV
const isNextDirection = direction === DIRECTION_NEXT
const isPrevDirection = direction === DIRECTION_PREV
const activeIndex = this._getItemIndex(activeElement)
const lastItemIndex = this._items.length - 1
const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
@ -368,17 +368,17 @@ class Carousel {
return activeElement
}
const delta = direction === Direction.PREV ? -1 : 1
const delta = direction === DIRECTION_PREV ? -1 : 1
const itemIndex = (activeIndex + delta) % this._items.length
return itemIndex === -1
? this._items[this._items.length - 1] : this._items[itemIndex]
return itemIndex === -1 ?
this._items[this._items.length - 1] : this._items[itemIndex]
}
_triggerSlideEvent(relatedTarget, eventDirectionName) {
const targetIndex = this._getItemIndex(relatedTarget)
const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))
const slideEvent = $.Event(Event.SLIDE, {
const fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM))
const slideEvent = $.Event(EVENT_SLIDE, {
relatedTarget,
direction: eventDirectionName,
from: fromIndex,
@ -392,22 +392,38 @@ class Carousel {
_setActiveIndicatorElement(element) {
if (this._indicatorsElement) {
const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))
$(indicators)
.removeClass(ClassName.ACTIVE)
const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE))
$(indicators).removeClass(CLASS_NAME_ACTIVE)
const nextIndicator = this._indicatorsElement.children[
this._getItemIndex(element)
]
if (nextIndicator) {
$(nextIndicator).addClass(ClassName.ACTIVE)
$(nextIndicator).addClass(CLASS_NAME_ACTIVE)
}
}
}
_updateInterval() {
const element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM)
if (!element) {
return
}
const elementInterval = parseInt(element.getAttribute('data-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(direction, element) {
const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)
const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)
const activeElementIndex = this._getItemIndex(activeElement)
const nextElement = element || activeElement &&
this._getItemByDirection(direction, activeElement)
@ -418,17 +434,17 @@ class Carousel {
let orderClassName
let eventDirectionName
if (direction === Direction.NEXT) {
directionalClassName = ClassName.LEFT
orderClassName = ClassName.NEXT
eventDirectionName = Direction.LEFT
if (direction === DIRECTION_NEXT) {
directionalClassName = CLASS_NAME_LEFT
orderClassName = CLASS_NAME_NEXT
eventDirectionName = DIRECTION_LEFT
} else {
directionalClassName = ClassName.RIGHT
orderClassName = ClassName.PREV
eventDirectionName = Direction.RIGHT
directionalClassName = CLASS_NAME_RIGHT
orderClassName = CLASS_NAME_PREV
eventDirectionName = DIRECTION_RIGHT
}
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
if (nextElement && $(nextElement).hasClass(CLASS_NAME_ACTIVE)) {
this._isSliding = false
return
}
@ -450,15 +466,16 @@ class Carousel {
}
this._setActiveIndicatorElement(nextElement)
this._activeElement = nextElement
const slidEvent = $.Event(Event.SLID, {
const slidEvent = $.Event(EVENT_SLID, {
relatedTarget: nextElement,
direction: eventDirectionName,
from: activeElementIndex,
to: nextElementIndex
})
if ($(this._element).hasClass(ClassName.SLIDE)) {
if ($(this._element).hasClass(CLASS_NAME_SLIDE)) {
$(nextElement).addClass(orderClassName)
Util.reflow(nextElement)
@ -466,23 +483,15 @@ class Carousel {
$(activeElement).addClass(directionalClassName)
$(nextElement).addClass(directionalClassName)
const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)
if (nextElementInterval) {
this._config.defaultInterval = this._config.defaultInterval || this._config.interval
this._config.interval = nextElementInterval
} else {
this._config.interval = this._config.defaultInterval || this._config.interval
}
const transitionDuration = Util.getTransitionDurationFromElement(activeElement)
$(activeElement)
.one(Util.TRANSITION_END, () => {
$(nextElement)
.removeClass(`${directionalClassName} ${orderClassName}`)
.addClass(ClassName.ACTIVE)
.addClass(CLASS_NAME_ACTIVE)
$(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)
$(activeElement).removeClass(`${CLASS_NAME_ACTIVE} ${orderClassName} ${directionalClassName}`)
this._isSliding = false
@ -490,8 +499,8 @@ class Carousel {
})
.emulateTransitionEnd(transitionDuration)
} else {
$(activeElement).removeClass(ClassName.ACTIVE)
$(nextElement).addClass(ClassName.ACTIVE)
$(activeElement).removeClass(CLASS_NAME_ACTIVE)
$(nextElement).addClass(CLASS_NAME_ACTIVE)
this._isSliding = false
$(this._element).trigger(slidEvent)
@ -532,6 +541,7 @@ class Carousel {
if (typeof data[action] === 'undefined') {
throw new TypeError(`No method named "${action}"`)
}
data[action]()
} else if (_config.interval && _config.ride) {
data.pause()
@ -549,7 +559,7 @@ class Carousel {
const target = $(selector)[0]
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
if (!target || !$(target).hasClass(CLASS_NAME_CAROUSEL)) {
return
}
@ -579,11 +589,10 @@ class Carousel {
* ------------------------------------------------------------------------
*/
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler)
$(window).on(Event.LOAD_DATA_API, () => {
const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))
$(window).on(EVENT_LOAD_DATA_API, () => {
const carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE))
for (let i = 0, len = carousels.length; i < len; i++) {
const $carousel = $(carousels[i])
Carousel._jQueryInterface.call($carousel, $carousel.data())

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'collapse'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@ -31,30 +31,22 @@ const DefaultType = {
parent: '(string|element)'
}
const Event = {
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
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 ClassName = {
SHOW : 'show',
COLLAPSE : 'collapse',
COLLAPSING : 'collapsing',
COLLAPSED : 'collapsed'
}
const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_COLLAPSE = 'collapse'
const CLASS_NAME_COLLAPSING = 'collapsing'
const CLASS_NAME_COLLAPSED = 'collapsed'
const Dimension = {
WIDTH : 'width',
HEIGHT : 'height'
}
const DIMENSION_WIDTH = 'width'
const DIMENSION_HEIGHT = 'height'
const Selector = {
ACTIVES : '.show, .collapsing',
DATA_TOGGLE : '[data-toggle="collapse"]'
}
const SELECTOR_ACTIVES = '.show, .collapsing'
const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]'
/**
* ------------------------------------------------------------------------
@ -72,12 +64,12 @@ class Collapse {
`[data-toggle="collapse"][data-target="#${element.id}"]`
))
const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
const toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))
for (let i = 0, len = toggleList.length; i < len; i++) {
const elem = toggleList[i]
const selector = Util.getSelectorFromElement(elem)
const filterElement = [].slice.call(document.querySelectorAll(selector))
.filter((foundElem) => foundElem === element)
.filter(foundElem => foundElem === element)
if (selector !== null && filterElement.length > 0) {
this._selector = selector
@ -109,7 +101,7 @@ class Collapse {
// Public
toggle() {
if ($(this._element).hasClass(ClassName.SHOW)) {
if ($(this._element).hasClass(CLASS_NAME_SHOW)) {
this.hide()
} else {
this.show()
@ -118,7 +110,7 @@ class Collapse {
show() {
if (this._isTransitioning ||
$(this._element).hasClass(ClassName.SHOW)) {
$(this._element).hasClass(CLASS_NAME_SHOW)) {
return
}
@ -126,13 +118,13 @@ class Collapse {
let activesData
if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))
.filter((elem) => {
actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))
.filter(elem => {
if (typeof this._config.parent === 'string') {
return elem.getAttribute('data-parent') === this._config.parent
}
return elem.classList.contains(ClassName.COLLAPSE)
return elem.classList.contains(CLASS_NAME_COLLAPSE)
})
if (actives.length === 0) {
@ -147,7 +139,7 @@ class Collapse {
}
}
const startEvent = $.Event(Event.SHOW)
const startEvent = $.Event(EVENT_SHOW)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
@ -163,14 +155,14 @@ class Collapse {
const dimension = this._getDimension()
$(this._element)
.removeClass(ClassName.COLLAPSE)
.addClass(ClassName.COLLAPSING)
.removeClass(CLASS_NAME_COLLAPSE)
.addClass(CLASS_NAME_COLLAPSING)
this._element.style[dimension] = 0
if (this._triggerArray.length) {
$(this._triggerArray)
.removeClass(ClassName.COLLAPSED)
.removeClass(CLASS_NAME_COLLAPSED)
.attr('aria-expanded', true)
}
@ -178,15 +170,14 @@ class Collapse {
const complete = () => {
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.addClass(ClassName.SHOW)
.removeClass(CLASS_NAME_COLLAPSING)
.addClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)
this._element.style[dimension] = ''
this.setTransitioning(false)
$(this._element).trigger(Event.SHOWN)
$(this._element).trigger(EVENT_SHOWN)
}
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
@ -202,11 +193,11 @@ class Collapse {
hide() {
if (this._isTransitioning ||
!$(this._element).hasClass(ClassName.SHOW)) {
!$(this._element).hasClass(CLASS_NAME_SHOW)) {
return
}
const startEvent = $.Event(Event.HIDE)
const startEvent = $.Event(EVENT_HIDE)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
@ -219,9 +210,8 @@ class Collapse {
Util.reflow(this._element)
$(this._element)
.addClass(ClassName.COLLAPSING)
.removeClass(ClassName.COLLAPSE)
.removeClass(ClassName.SHOW)
.addClass(CLASS_NAME_COLLAPSING)
.removeClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)
const triggerArrayLength = this._triggerArray.length
if (triggerArrayLength > 0) {
@ -231,8 +221,8 @@ class Collapse {
if (selector !== null) {
const $elem = $([].slice.call(document.querySelectorAll(selector)))
if (!$elem.hasClass(ClassName.SHOW)) {
$(trigger).addClass(ClassName.COLLAPSED)
if (!$elem.hasClass(CLASS_NAME_SHOW)) {
$(trigger).addClass(CLASS_NAME_COLLAPSED)
.attr('aria-expanded', false)
}
}
@ -244,9 +234,9 @@ class Collapse {
const complete = () => {
this.setTransitioning(false)
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.trigger(Event.HIDDEN)
.removeClass(CLASS_NAME_COLLAPSING)
.addClass(CLASS_NAME_COLLAPSE)
.trigger(EVENT_HIDDEN)
}
this._element.style[dimension] = ''
@ -284,8 +274,8 @@ class Collapse {
}
_getDimension() {
const hasWidth = $(this._element).hasClass(Dimension.WIDTH)
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
const hasWidth = $(this._element).hasClass(DIMENSION_WIDTH)
return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT
}
_getParent() {
@ -302,10 +292,9 @@ class Collapse {
parent = document.querySelector(this._config.parent)
}
const selector =
`[data-toggle="collapse"][data-parent="${this._config.parent}"]`
const selector = `[data-toggle="collapse"][data-parent="${this._config.parent}"]`
const children = [].slice.call(parent.querySelectorAll(selector))
$(children).each((i, element) => {
this._addAriaAndCollapsedClass(
Collapse._getTargetFromElement(element),
@ -317,11 +306,11 @@ class Collapse {
}
_addAriaAndCollapsedClass(element, triggerArray) {
const isOpen = $(element).hasClass(ClassName.SHOW)
const isOpen = $(element).hasClass(CLASS_NAME_SHOW)
if (triggerArray.length) {
$(triggerArray)
.toggleClass(ClassName.COLLAPSED, !isOpen)
.toggleClass(CLASS_NAME_COLLAPSED, !isOpen)
.attr('aria-expanded', isOpen)
}
}
@ -335,27 +324,28 @@ class Collapse {
static _jQueryInterface(config) {
return this.each(function () {
const $this = $(this)
let data = $this.data(DATA_KEY)
const $element = $(this)
let data = $element.data(DATA_KEY)
const _config = {
...Default,
...$this.data(),
...typeof config === 'object' && config ? config : {}
...$element.data(),
...(typeof config === 'object' && config ? config : {})
}
if (!data && _config.toggle && /show|hide/.test(config)) {
if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
_config.toggle = false
}
if (!data) {
data = new Collapse(this, _config)
$this.data(DATA_KEY, data)
$element.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
@ -368,7 +358,7 @@ class Collapse {
* ------------------------------------------------------------------------
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if (event.currentTarget.tagName === 'A') {
event.preventDefault()

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -16,7 +16,7 @@ import Util from './util'
*/
const NAME = 'dropdown'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@ -29,53 +29,43 @@ const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow
const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,
KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_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 ClassName = {
DISABLED : 'disabled',
SHOW : 'show',
DROPUP : 'dropup',
DROPRIGHT : 'dropright',
DROPLEFT : 'dropleft',
MENURIGHT : 'dropdown-menu-right',
MENULEFT : 'dropdown-menu-left',
POSITION_STATIC : 'position-static'
}
const CLASS_NAME_DISABLED = 'disabled'
const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_DROPUP = 'dropup'
const CLASS_NAME_DROPRIGHT = 'dropright'
const CLASS_NAME_DROPLEFT = 'dropleft'
const CLASS_NAME_MENURIGHT = 'dropdown-menu-right'
const CLASS_NAME_POSITION_STATIC = 'position-static'
const Selector = {
DATA_TOGGLE : '[data-toggle="dropdown"]',
FORM_CHILD : '.dropdown form',
MENU : '.dropdown-menu',
NAVBAR_NAV : '.navbar-nav',
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
}
const SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]'
const SELECTOR_FORM_CHILD = '.dropdown form'
const SELECTOR_MENU = '.dropdown-menu'
const SELECTOR_NAVBAR_NAV = '.navbar-nav'
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
const AttachmentMap = {
TOP : 'top-start',
TOPEND : 'top-end',
BOTTOM : 'bottom-start',
BOTTOMEND : 'bottom-end',
RIGHT : 'right-start',
RIGHTEND : 'right-end',
LEFT : 'left-start',
LEFTEND : 'left-end'
}
const PLACEMENT_TOP = 'top-start'
const PLACEMENT_TOPEND = 'top-end'
const PLACEMENT_BOTTOM = 'bottom-start'
const PLACEMENT_BOTTOMEND = 'bottom-end'
const PLACEMENT_RIGHT = 'right-start'
const PLACEMENT_LEFT = 'left-start'
const Default = {
offset: 0,
flip: true,
boundary: 'scrollParent',
reference: 'toggle',
display : 'dynamic'
display: 'dynamic',
popperConfig: null
}
const DefaultType = {
@ -83,7 +73,8 @@ const DefaultType = {
flip: 'boolean',
boundary: '(string|element)',
reference: '(string|element)',
display : 'string'
display: 'string',
popperConfig: '(null|object)'
}
/**
@ -120,12 +111,11 @@ class Dropdown {
// Public
toggle() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)) {
return
}
const parent = Dropdown._getParentFromElement(this._element)
const isActive = $(this._menu).hasClass(ClassName.SHOW)
const isActive = $(this._menu).hasClass(CLASS_NAME_SHOW)
Dropdown._clearMenus()
@ -133,10 +123,19 @@ class Dropdown {
return
}
this.show(true)
}
show(usePopper = false) {
if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)) {
return
}
const relatedTarget = {
relatedTarget: this._element
}
const showEvent = $.Event(Event.SHOW, relatedTarget)
const showEvent = $.Event(EVENT_SHOW, relatedTarget)
const parent = Dropdown._getParentFromElement(this._element)
$(parent).trigger(showEvent)
@ -144,14 +143,14 @@ class Dropdown {
return
}
// Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
// Totally disable Popper for Dropdowns in Navbar
if (!this._inNavbar && usePopper) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)')
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)')
}
let referenceElement = this._element
@ -171,8 +170,9 @@ class Dropdown {
// to allow the menu to "escape" the scroll parent's boundaries
// https://github.com/twbs/bootstrap/issues/24251
if (this._config.boundary !== 'scrollParent') {
$(parent).addClass(ClassName.POSITION_STATIC)
$(parent).addClass(CLASS_NAME_POSITION_STATIC)
}
this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())
}
@ -181,51 +181,28 @@ class Dropdown {
// 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).length === 0) {
$(parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
$(document.body).children().on('mouseover', null, $.noop)
}
this._element.focus()
this._element.setAttribute('aria-expanded', true)
$(this._menu).toggleClass(ClassName.SHOW)
$(this._menu).toggleClass(CLASS_NAME_SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.SHOWN, relatedTarget))
}
show() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
return
}
const relatedTarget = {
relatedTarget: this._element
}
const showEvent = $.Event(Event.SHOW, relatedTarget)
const parent = Dropdown._getParentFromElement(this._element)
$(parent).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
}
$(this._menu).toggleClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.SHOWN, relatedTarget))
.toggleClass(CLASS_NAME_SHOW)
.trigger($.Event(EVENT_SHOWN, relatedTarget))
}
hide() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)) {
return
}
const relatedTarget = {
relatedTarget: this._element
}
const hideEvent = $.Event(Event.HIDE, relatedTarget)
const hideEvent = $.Event(EVENT_HIDE, relatedTarget)
const parent = Dropdown._getParentFromElement(this._element)
$(parent).trigger(hideEvent)
@ -234,10 +211,14 @@ class Dropdown {
return
}
$(this._menu).toggleClass(ClassName.SHOW)
if (this._popper) {
this._popper.destroy()
}
$(this._menu).toggleClass(CLASS_NAME_SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
.toggleClass(CLASS_NAME_SHOW)
.trigger($.Event(EVENT_HIDDEN, relatedTarget))
}
dispose() {
@ -261,7 +242,7 @@ class Dropdown {
// Private
_addEventListeners() {
$(this._element).on(Event.CLICK, (event) => {
$(this._element).on(EVENT_CLICK, event => {
event.preventDefault()
event.stopPropagation()
this.toggle()
@ -289,29 +270,30 @@ class Dropdown {
const parent = Dropdown._getParentFromElement(this._element)
if (parent) {
this._menu = parent.querySelector(Selector.MENU)
this._menu = parent.querySelector(SELECTOR_MENU)
}
}
return this._menu
}
_getPlacement() {
const $parentDropdown = $(this._element.parentNode)
let placement = AttachmentMap.BOTTOM
let placement = PLACEMENT_BOTTOM
// Handle dropup
if ($parentDropdown.hasClass(ClassName.DROPUP)) {
placement = AttachmentMap.TOP
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND
}
} else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
placement = AttachmentMap.RIGHT
} else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
placement = AttachmentMap.LEFT
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND
if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?
PLACEMENT_TOPEND :
PLACEMENT_TOP
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
placement = PLACEMENT_RIGHT
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
placement = PLACEMENT_LEFT
} else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
placement = PLACEMENT_BOTTOMEND
}
return placement
}
@ -323,10 +305,10 @@ class Dropdown {
const offset = {}
if (typeof this._config.offset === 'function') {
offset.fn = (data) => {
offset.fn = data => {
data.offsets = {
...data.offsets,
...this._config.offset(data.offsets, this._element) || {}
...(this._config.offset(data.offsets, this._element) || {})
}
return data
@ -352,14 +334,17 @@ class Dropdown {
}
}
// Disable Popper.js if we have a static display
// Disable Popper if we have a static display
if (this._config.display === 'static') {
popperConfig.modifiers.applyStyle = {
enabled: false
}
}
return popperConfig
return {
...popperConfig,
...this._config.popperConfig
}
}
// Static
@ -378,6 +363,7 @@ class Dropdown {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
@ -389,7 +375,7 @@ class Dropdown {
return
}
const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
const toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))
for (let i = 0, len = toggles.length; i < len; i++) {
const parent = Dropdown._getParentFromElement(toggles[i])
@ -407,7 +393,7 @@ class Dropdown {
}
const dropdownMenu = context._menu
if (!$(parent).hasClass(ClassName.SHOW)) {
if (!$(parent).hasClass(CLASS_NAME_SHOW)) {
continue
}
@ -417,7 +403,7 @@ class Dropdown {
continue
}
const hideEvent = $.Event(Event.HIDE, relatedTarget)
const hideEvent = $.Event(EVENT_HIDE, relatedTarget)
$(parent).trigger(hideEvent)
if (hideEvent.isDefaultPrevented()) {
continue
@ -431,10 +417,14 @@ class Dropdown {
toggles[i].setAttribute('aria-expanded', 'false')
$(dropdownMenu).removeClass(ClassName.SHOW)
if (context._popper) {
context._popper.destroy()
}
$(dropdownMenu).removeClass(CLASS_NAME_SHOW)
$(parent)
.removeClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
.removeClass(CLASS_NAME_SHOW)
.trigger($.Event(EVENT_HIDDEN, relatedTarget))
}
}
@ -458,34 +448,38 @@ class Dropdown {
// - 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.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
if (/input|textarea/i.test(event.target.tagName) ?
event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
(event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||
$(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
$(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
return
}
if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {
return
}
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(CLASS_NAME_SHOW)
if (!isActive && event.which === ESCAPE_KEYCODE) {
return
}
event.preventDefault()
event.stopPropagation()
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
return
}
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(ClassName.SHOW)
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
const toggle = parent.querySelector(Selector.DATA_TOGGLE)
$(toggle).trigger('focus')
$(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')
}
$(this).trigger('click')
return
}
const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))
const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))
.filter(item => $(item).is(':visible'))
if (items.length === 0) {
return
@ -516,15 +510,15 @@ class Dropdown {
*/
$(document)
.on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)
.on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
.on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler)
.on(`${EVENT_CLICK_DATA_API} ${EVENT_KEYUP_DATA_API}`, Dropdown._clearMenus)
.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault()
event.stopPropagation()
Dropdown._jQueryInterface.call($(this), 'toggle')
})
.on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
.on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {
e.stopPropagation()
})
@ -541,5 +535,4 @@ $.fn[NAME].noConflict = () => {
return Dropdown._jQueryInterface
}
export default Dropdown

View file

@ -1,52 +0,0 @@
import $ from 'jquery'
import Alert from './alert'
import Button from './button'
import Carousel from './carousel'
import Collapse from './collapse'
import Dropdown from './dropdown'
import Modal from './modal'
import Popover from './popover'
import Scrollspy from './scrollspy'
import Tab from './tab'
import Toast from './toast'
import Tooltip from './tooltip'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
(() => {
if (typeof $ === 'undefined') {
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
}
const version = $.fn.jquery.split(' ')[0].split('.')
const minMajor = 1
const ltMajor = 2
const minMinor = 9
const minPatch = 1
const maxMajor = 4
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
}
})()
export {
Util,
Alert,
Button,
Carousel,
Collapse,
Dropdown,
Modal,
Popover,
Scrollspy,
Tab,
Toast,
Tooltip
}

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'modal'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.modal'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@ -36,37 +36,33 @@ const DefaultType = {
show: 'boolean'
}
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
FOCUSIN : `focusin${EVENT_KEY}`,
RESIZE : `resize${EVENT_KEY}`,
CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,
MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,
MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
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 ClassName = {
SCROLLABLE : 'modal-dialog-scrollable',
SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
BACKDROP : 'modal-backdrop',
OPEN : 'modal-open',
FADE : 'fade',
SHOW : 'show'
}
const CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'
const CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'
const CLASS_NAME_BACKDROP = 'modal-backdrop'
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',
MODAL_BODY : '.modal-body',
DATA_TOGGLE : '[data-toggle="modal"]',
DATA_DISMISS : '[data-dismiss="modal"]',
FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
STICKY_CONTENT : '.sticky-top'
}
const SELECTOR_DIALOG = '.modal-dialog'
const SELECTOR_MODAL_BODY = '.modal-body'
const SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]'
const SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
const SELECTOR_STICKY_CONTENT = '.sticky-top'
/**
* ------------------------------------------------------------------------
@ -78,7 +74,7 @@ class Modal {
constructor(element, config) {
this._config = this._getConfig(config)
this._element = element
this._dialog = element.querySelector(Selector.DIALOG)
this._dialog = element.querySelector(SELECTOR_DIALOG)
this._backdrop = null
this._isShown = false
this._isBodyOverflowing = false
@ -108,15 +104,17 @@ class Modal {
return
}
if ($(this._element).hasClass(ClassName.FADE)) {
const $element = $(this._element)
if ($element.hasClass(CLASS_NAME_FADE)) {
this._isTransitioning = true
}
const showEvent = $.Event(Event.SHOW, {
const showEvent = $.Event(EVENT_SHOW, {
relatedTarget
})
$(this._element).trigger(showEvent)
$element.trigger(showEvent)
if (this._isShown || showEvent.isDefaultPrevented()) {
return
@ -132,14 +130,10 @@ class Modal {
this._setEscapeEvent()
this._setResizeEvent()
$(this._element).on(
Event.CLICK_DISMISS,
Selector.DATA_DISMISS,
(event) => this.hide(event)
)
$element.on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event))
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
$(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
$(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {
$element.one(EVENT_MOUSEUP_DISMISS, event => {
if ($(event.target).is(this._element)) {
this._ignoreBackdropClick = true
}
@ -158,16 +152,17 @@ class Modal {
return
}
const hideEvent = $.Event(Event.HIDE)
const hideEvent = $.Event(EVENT_HIDE)
const $element = $(this._element)
$(this._element).trigger(hideEvent)
$element.trigger(hideEvent)
if (!this._isShown || hideEvent.isDefaultPrevented()) {
return
}
this._isShown = false
const transition = $(this._element).hasClass(ClassName.FADE)
const transition = $element.hasClass(CLASS_NAME_FADE)
if (transition) {
this._isTransitioning = true
@ -176,19 +171,18 @@ class Modal {
this._setEscapeEvent()
this._setResizeEvent()
$(document).off(Event.FOCUSIN)
$(document).off(EVENT_FOCUSIN)
$(this._element).removeClass(ClassName.SHOW)
$(this._element).off(Event.CLICK_DISMISS)
$(this._dialog).off(Event.MOUSEDOWN_DISMISS)
$element.removeClass(CLASS_NAME_SHOW)
$element.off(EVENT_CLICK_DISMISS)
$(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)
if (transition) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, (event) => this._hideModal(event))
$element
.one(Util.TRANSITION_END, event => this._hideModal(event))
.emulateTransitionEnd(transitionDuration)
} else {
this._hideModal()
@ -197,14 +191,14 @@ class Modal {
dispose() {
[window, this._element, this._dialog]
.forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))
.forEach(htmlElement => $(htmlElement).off(EVENT_KEY))
/**
* `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
* `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
* It will remove `EVENT_CLICK_DATA_API` event that should remain
*/
$(document).off(Event.FOCUSIN)
$(document).off(EVENT_FOCUSIN)
$.removeData(this._element, DATA_KEY)
@ -234,11 +228,47 @@ class Modal {
return config
}
_showElement(relatedTarget) {
const transition = $(this._element).hasClass(ClassName.FADE)
_isElementOverflowing() {
return this._element.scrollHeight > document.documentElement.clientHeight
}
if (!this._element.parentNode ||
this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
_triggerBackdropTransition() {
const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)
const $element = $(this._element)
$element.trigger(hideEventPrevented)
if (hideEventPrevented.isDefaultPrevented()) {
return
}
if (!this._isElementOverflowing()) {
this._element.style.overflowY = 'hidden'
}
this._element.classList.add(CLASS_NAME_STATIC)
const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)
$element.off(Util.TRANSITION_END)
$element.one(Util.TRANSITION_END, () => {
this._element.classList.remove(CLASS_NAME_STATIC)
if (!this._isElementOverflowing()) {
$element.one(Util.TRANSITION_END, () => {
this._element.style.overflowY = ''
})
.emulateTransitionEnd(this._element, modalTransitionDuration)
}
})
.emulateTransitionEnd(modalTransitionDuration)
this._element.focus()
}
_showElement(relatedTarget) {
const $element = $(this._element)
const transition = $element.hasClass(CLASS_NAME_FADE)
const modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
// Don't move modal's DOM position
document.body.appendChild(this._element)
}
@ -246,9 +276,10 @@ class Modal {
this._element.style.display = 'block'
this._element.removeAttribute('aria-hidden')
this._element.setAttribute('aria-modal', true)
this._element.setAttribute('role', 'dialog')
if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0
if ($(this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {
modalBody.scrollTop = 0
} else {
this._element.scrollTop = 0
}
@ -257,13 +288,13 @@ class Modal {
Util.reflow(this._element)
}
$(this._element).addClass(ClassName.SHOW)
$element.addClass(CLASS_NAME_SHOW)
if (this._config.focus) {
this._enforceFocus()
}
const shownEvent = $.Event(Event.SHOWN, {
const shownEvent = $.Event(EVENT_SHOWN, {
relatedTarget
})
@ -271,8 +302,9 @@ class Modal {
if (this._config.focus) {
this._element.focus()
}
this._isTransitioning = false
$(this._element).trigger(shownEvent)
$element.trigger(shownEvent)
}
if (transition) {
@ -288,8 +320,8 @@ class Modal {
_enforceFocus() {
$(document)
.off(Event.FOCUSIN) // Guard against infinite focus loop
.on(Event.FOCUSIN, (event) => {
.off(EVENT_FOCUSIN) // Guard against infinite focus loop
.on(EVENT_FOCUSIN, event => {
if (document !== event.target &&
this._element !== event.target &&
$(this._element).has(event.target).length === 0) {
@ -299,23 +331,29 @@ class Modal {
}
_setEscapeEvent() {
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
if (event.which === ESCAPE_KEYCODE) {
const $element = $(this._element)
if (this._isShown) {
$element.on(EVENT_KEYDOWN_DISMISS, event => {
if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {
event.preventDefault()
this.hide()
} else if (!this._config.keyboard && event.which === ESCAPE_KEYCODE) {
this._triggerBackdropTransition()
}
})
} else if (!this._isShown) {
$(this._element).off(Event.KEYDOWN_DISMISS)
$element.off(EVENT_KEYDOWN_DISMISS)
}
}
_setResizeEvent() {
const $window = $(window)
if (this._isShown) {
$(window).on(Event.RESIZE, (event) => this.handleUpdate(event))
$window.on(EVENT_RESIZE, event => this.handleUpdate(event))
} else {
$(window).off(Event.RESIZE)
$window.off(EVENT_RESIZE)
}
}
@ -323,12 +361,13 @@ class Modal {
this._element.style.display = 'none'
this._element.setAttribute('aria-hidden', true)
this._element.removeAttribute('aria-modal')
this._element.removeAttribute('role')
this._isTransitioning = false
this._showBackdrop(() => {
$(document.body).removeClass(ClassName.OPEN)
$(document.body).removeClass(CLASS_NAME_OPEN)
this._resetAdjustments()
this._resetScrollbar()
$(this._element).trigger(Event.HIDDEN)
$(this._element).trigger(EVENT_HIDDEN)
})
}
@ -340,12 +379,12 @@ class Modal {
}
_showBackdrop(callback) {
const animate = $(this._element).hasClass(ClassName.FADE)
? ClassName.FADE : ''
const $element = $(this._element)
const animate = $element.hasClass(CLASS_NAME_FADE) ? CLASS_NAME_FADE : ''
if (this._isShown && this._config.backdrop) {
this._backdrop = document.createElement('div')
this._backdrop.className = ClassName.BACKDROP
this._backdrop.className = CLASS_NAME_BACKDROP
if (animate) {
this._backdrop.classList.add(animate)
@ -353,16 +392,18 @@ class Modal {
$(this._backdrop).appendTo(document.body)
$(this._element).on(Event.CLICK_DISMISS, (event) => {
$element.on(EVENT_CLICK_DISMISS, event => {
if (this._ignoreBackdropClick) {
this._ignoreBackdropClick = false
return
}
if (event.target !== event.currentTarget) {
return
}
if (this._config.backdrop === 'static') {
this._element.focus()
this._triggerBackdropTransition()
} else {
this.hide()
}
@ -372,7 +413,7 @@ class Modal {
Util.reflow(this._backdrop)
}
$(this._backdrop).addClass(ClassName.SHOW)
$(this._backdrop).addClass(CLASS_NAME_SHOW)
if (!callback) {
return
@ -389,7 +430,7 @@ class Modal {
.one(Util.TRANSITION_END, callback)
.emulateTransitionEnd(backdropTransitionDuration)
} else if (!this._isShown && this._backdrop) {
$(this._backdrop).removeClass(ClassName.SHOW)
$(this._backdrop).removeClass(CLASS_NAME_SHOW)
const callbackRemove = () => {
this._removeBackdrop()
@ -398,7 +439,7 @@ class Modal {
}
}
if ($(this._element).hasClass(ClassName.FADE)) {
if ($element.hasClass(CLASS_NAME_FADE)) {
const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)
$(this._backdrop)
@ -418,14 +459,11 @@ class Modal {
// ----------------------------------------------------------------------
_adjustDialog() {
const isModalOverflowing =
this._element.scrollHeight > document.documentElement.clientHeight
if (!this._isBodyOverflowing && isModalOverflowing) {
if (!this._isBodyOverflowing && this._isElementOverflowing()) {
this._element.style.paddingLeft = `${this._scrollbarWidth}px`
}
if (this._isBodyOverflowing && !isModalOverflowing) {
if (this._isBodyOverflowing && !this._isElementOverflowing()) {
this._element.style.paddingRight = `${this._scrollbarWidth}px`
}
}
@ -437,7 +475,7 @@ class Modal {
_checkScrollbar() {
const rect = document.body.getBoundingClientRect()
this._isBodyOverflowing = rect.left + rect.right < window.innerWidth
this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth
this._scrollbarWidth = this._getScrollbarWidth()
}
@ -445,23 +483,25 @@ class Modal {
if (this._isBodyOverflowing) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))
const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))
const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))
const stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT))
// Adjust fixed content padding
$(fixedContent).each((index, element) => {
const $element = $(element)
const actualPadding = element.style.paddingRight
const calculatedPadding = $(element).css('padding-right')
$(element)
$element
.data('padding-right', actualPadding)
.css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)
})
// Adjust sticky content margin
$(stickyContent).each((index, element) => {
const $element = $(element)
const actualMargin = element.style.marginRight
const calculatedMargin = $(element).css('margin-right')
$(element)
const calculatedMargin = $element.css('margin-right')
$element
.data('margin-right', actualMargin)
.css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)
})
@ -474,12 +514,12 @@ class Modal {
.css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)
}
$(document.body).addClass(ClassName.OPEN)
$(document.body).addClass(CLASS_NAME_OPEN)
}
_resetScrollbar() {
// Restore fixed content padding
const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))
const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))
$(fixedContent).each((index, element) => {
const padding = $(element).data('padding-right')
$(element).removeData('padding-right')
@ -487,7 +527,7 @@ class Modal {
})
// Restore sticky content
const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))
const elements = [].slice.call(document.querySelectorAll(`${SELECTOR_STICKY_CONTENT}`))
$(elements).each((index, element) => {
const margin = $(element).data('margin-right')
if (typeof margin !== 'undefined') {
@ -503,7 +543,7 @@ class Modal {
_getScrollbarWidth() { // thx d.walsh
const scrollDiv = document.createElement('div')
scrollDiv.className = ClassName.SCROLLBAR_MEASURER
scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER
document.body.appendChild(scrollDiv)
const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth
document.body.removeChild(scrollDiv)
@ -518,7 +558,7 @@ class Modal {
const _config = {
...Default,
...$(this).data(),
...typeof config === 'object' && config ? config : {}
...(typeof config === 'object' && config ? config : {})
}
if (!data) {
@ -530,6 +570,7 @@ class Modal {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config](relatedTarget)
} else if (_config.show) {
data.show(relatedTarget)
@ -544,7 +585,7 @@ class Modal {
* ------------------------------------------------------------------------
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
let target
const selector = Util.getSelectorFromElement(this)
@ -552,8 +593,8 @@ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
target = document.querySelector(selector)
}
const config = $(target).data(DATA_KEY)
? 'toggle' : {
const config = $(target).data(DATA_KEY) ?
'toggle' : {
...$(target).data(),
...$(this).data()
}
@ -562,13 +603,13 @@ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault()
}
const $target = $(target).one(Event.SHOW, (showEvent) => {
const $target = $(target).one(EVENT_SHOW, showEvent => {
if (showEvent.isDefaultPrevented()) {
// Only register focus restorer if modal will actually get shown
return
}
$target.one(Event.HIDDEN, () => {
$target.one(EVENT_HIDDEN, () => {
if ($(this).is(':visible')) {
this.focus()
}

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,7 +15,7 @@ import Tooltip from './tooltip'
*/
const NAME = 'popover'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
@ -38,15 +38,11 @@ const DefaultType = {
content: '(string|element|function)'
}
const ClassName = {
FADE : 'fade',
SHOW : 'show'
}
const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show'
const Selector = {
TITLE : '.popover-header',
CONTENT : '.popover-body'
}
const SELECTOR_TITLE = '.popover-header'
const SELECTOR_CONTENT = '.popover-body'
const Event = {
HIDE: `hide${EVENT_KEY}`,
@ -117,14 +113,15 @@ class Popover extends Tooltip {
const $tip = $(this.getTipElement())
// We use append for html objects to maintain js events
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle())
let content = this._getContent()
if (typeof content === 'function') {
content = content.call(this.element)
}
this.setElementContent($tip.find(Selector.CONTENT), content)
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
this.setElementContent($tip.find(SELECTOR_CONTENT), content)
$tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)
}
// Private
@ -162,6 +159,7 @@ class Popover extends Tooltip {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'scrollspy'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@ -33,34 +33,24 @@ const DefaultType = {
target: '(string|element)'
}
const Event = {
ACTIVATE : `activate${EVENT_KEY}`,
SCROLL : `scroll${EVENT_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
}
const EVENT_ACTIVATE = `activate${EVENT_KEY}`
const EVENT_SCROLL = `scroll${EVENT_KEY}`
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
const ClassName = {
DROPDOWN_ITEM : 'dropdown-item',
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active'
}
const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
const CLASS_NAME_ACTIVE = 'active'
const Selector = {
DATA_SPY : '[data-spy="scroll"]',
ACTIVE : '.active',
NAV_LIST_GROUP : '.nav, .list-group',
NAV_LINKS : '.nav-link',
NAV_ITEMS : '.nav-item',
LIST_ITEMS : '.list-group-item',
DROPDOWN : '.dropdown',
DROPDOWN_ITEMS : '.dropdown-item',
DROPDOWN_TOGGLE : '.dropdown-toggle'
}
const SELECTOR_DATA_SPY = '[data-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_ITEMS = '.dropdown-item'
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
const OffsetMethod = {
OFFSET : 'offset',
POSITION : 'position'
}
const METHOD_OFFSET = 'offset'
const METHOD_POSITION = 'position'
/**
* ------------------------------------------------------------------------
@ -73,15 +63,15 @@ class ScrollSpy {
this._element = element
this._scrollElement = element.tagName === 'BODY' ? window : element
this._config = this._getConfig(config)
this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +
`${this._config.target} ${Selector.LIST_ITEMS},` +
`${this._config.target} ${Selector.DROPDOWN_ITEMS}`
this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +
`${this._config.target} ${SELECTOR_LIST_ITEMS},` +
`${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`
this._offsets = []
this._targets = []
this._activeTarget = null
this._scrollHeight = 0
$(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
$(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))
this.refresh()
this._process()
@ -100,14 +90,14 @@ class ScrollSpy {
// Public
refresh() {
const autoMethod = this._scrollElement === this._scrollElement.window
? OffsetMethod.OFFSET : OffsetMethod.POSITION
const autoMethod = this._scrollElement === this._scrollElement.window ?
METHOD_OFFSET : METHOD_POSITION
const offsetMethod = this._config.method === 'auto'
? autoMethod : this._config.method
const offsetMethod = this._config.method === 'auto' ?
autoMethod : this._config.method
const offsetBase = offsetMethod === OffsetMethod.POSITION
? this._getScrollTop() : 0
const offsetBase = offsetMethod === METHOD_POSITION ?
this._getScrollTop() : 0
this._offsets = []
this._targets = []
@ -117,7 +107,7 @@ class ScrollSpy {
const targets = [].slice.call(document.querySelectorAll(this._selector))
targets
.map((element) => {
.map(element => {
let target
const targetSelector = Util.getSelectorFromElement(element)
@ -135,11 +125,12 @@ class ScrollSpy {
]
}
}
return null
})
.filter((item) => item)
.filter(item => item)
.sort((a, b) => a[0] - b[0])
.forEach((item) => {
.forEach(item => {
this._offsets.push(item[0])
this._targets.push(item[1])
})
@ -164,15 +155,16 @@ class ScrollSpy {
_getConfig(config) {
config = {
...Default,
...typeof config === 'object' && config ? config : {}
...(typeof config === 'object' && config ? config : {})
}
if (typeof config.target !== 'string') {
if (typeof config.target !== 'string' && Util.isElement(config.target)) {
let id = $(config.target).attr('id')
if (!id) {
id = Util.getUID(NAME)
$(config.target).attr('id', id)
}
config.target = `#${id}`
}
@ -182,8 +174,8 @@ class ScrollSpy {
}
_getScrollTop() {
return this._scrollElement === window
? this._scrollElement.pageYOffset : this._scrollElement.scrollTop
return this._scrollElement === window ?
this._scrollElement.pageYOffset : this._scrollElement.scrollTop
}
_getScrollHeight() {
@ -194,16 +186,14 @@ class ScrollSpy {
}
_getOffsetHeight() {
return this._scrollElement === window
? window.innerHeight : this._scrollElement.getBoundingClientRect().height
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()
const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()
if (this._scrollHeight !== scrollHeight) {
this.refresh()
@ -215,6 +205,7 @@ class ScrollSpy {
if (this._activeTarget !== target) {
this._activate(target)
}
return
}
@ -224,8 +215,7 @@ class ScrollSpy {
return
}
const offsetLength = this._offsets.length
for (let i = offsetLength; i--;) {
for (let i = this._offsets.length; i--;) {
const isActiveTarget = this._activeTarget !== this._targets[i] &&
scrollTop >= this._offsets[i] &&
(typeof this._offsets[i + 1] === 'undefined' ||
@ -244,32 +234,39 @@ class ScrollSpy {
const queries = this._selector
.split(',')
.map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
.map(selector => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
$link.addClass(ClassName.ACTIVE)
if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {
$link.closest(SELECTOR_DROPDOWN)
.find(SELECTOR_DROPDOWN_TOGGLE)
.addClass(CLASS_NAME_ACTIVE)
$link.addClass(CLASS_NAME_ACTIVE)
} else {
// Set triggered link as active
$link.addClass(ClassName.ACTIVE)
$link.addClass(CLASS_NAME_ACTIVE)
// Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
$link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)
$link.parents(SELECTOR_NAV_LIST_GROUP)
.prev(`${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)
.addClass(CLASS_NAME_ACTIVE)
// Handle special case when .nav-link is inside .nav-item
$link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
$link.parents(SELECTOR_NAV_LIST_GROUP)
.prev(SELECTOR_NAV_ITEMS)
.children(SELECTOR_NAV_LINKS)
.addClass(CLASS_NAME_ACTIVE)
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
$(this._scrollElement).trigger(EVENT_ACTIVATE, {
relatedTarget: target
})
}
_clear() {
[].slice.call(document.querySelectorAll(this._selector))
.filter((node) => node.classList.contains(ClassName.ACTIVE))
.forEach((node) => node.classList.remove(ClassName.ACTIVE))
.filter(node => node.classList.contains(CLASS_NAME_ACTIVE))
.forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))
}
// Static
@ -288,6 +285,7 @@ class ScrollSpy {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
@ -300,8 +298,8 @@ class ScrollSpy {
* ------------------------------------------------------------------------
*/
$(window).on(Event.LOAD_DATA_API, () => {
const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))
$(window).on(EVENT_LOAD_DATA_API, () => {
const scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY))
const scrollSpysLength = scrollSpys.length
for (let i = scrollSpysLength; i--;) {

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,37 +15,31 @@ import Util from './util'
*/
const NAME = 'tab'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_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_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const ClassName = {
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active',
DISABLED : 'disabled',
FADE : 'fade',
SHOW : 'show'
}
const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'
const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_DISABLED = 'disabled'
const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show'
const Selector = {
DROPDOWN : '.dropdown',
NAV_LIST_GROUP : '.nav, .list-group',
ACTIVE : '.active',
ACTIVE_UL : '> li > .active',
DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE : '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
}
const SELECTOR_DROPDOWN = '.dropdown'
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
const SELECTOR_ACTIVE = '.active'
const SELECTOR_ACTIVE_UL = '> li > .active'
const SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
const SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'
/**
* ------------------------------------------------------------------------
@ -69,27 +63,27 @@ class Tab {
show() {
if (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
$(this._element).hasClass(ClassName.ACTIVE) ||
$(this._element).hasClass(ClassName.DISABLED)) {
$(this._element).hasClass(CLASS_NAME_ACTIVE) ||
$(this._element).hasClass(CLASS_NAME_DISABLED)) {
return
}
let target
let previous
const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]
const listElement = $(this._element).closest(SELECTOR_NAV_LIST_GROUP)[0]
const selector = Util.getSelectorFromElement(this._element)
if (listElement) {
const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE
const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE
previous = $.makeArray($(listElement).find(itemSelector))
previous = previous[previous.length - 1]
}
const hideEvent = $.Event(Event.HIDE, {
const hideEvent = $.Event(EVENT_HIDE, {
relatedTarget: this._element
})
const showEvent = $.Event(Event.SHOW, {
const showEvent = $.Event(EVENT_SHOW, {
relatedTarget: previous
})
@ -114,11 +108,11 @@ class Tab {
)
const complete = () => {
const hiddenEvent = $.Event(Event.HIDDEN, {
const hiddenEvent = $.Event(EVENT_HIDDEN, {
relatedTarget: this._element
})
const shownEvent = $.Event(Event.SHOWN, {
const shownEvent = $.Event(EVENT_SHOWN, {
relatedTarget: previous
})
@ -141,12 +135,12 @@ class Tab {
// Private
_activate(element, container, callback) {
const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')
? $(container).find(Selector.ACTIVE_UL)
: $(container).children(Selector.ACTIVE)
const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?
$(container).find(SELECTOR_ACTIVE_UL) :
$(container).children(SELECTOR_ACTIVE)
const active = activeElements[0]
const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))
const isTransitioning = callback && (active && $(active).hasClass(CLASS_NAME_FADE))
const complete = () => this._transitionComplete(
element,
active,
@ -157,7 +151,7 @@ class Tab {
const transitionDuration = Util.getTransitionDurationFromElement(active)
$(active)
.removeClass(ClassName.SHOW)
.removeClass(CLASS_NAME_SHOW)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
} else {
@ -167,14 +161,14 @@ class Tab {
_transitionComplete(element, active, callback) {
if (active) {
$(active).removeClass(ClassName.ACTIVE)
$(active).removeClass(CLASS_NAME_ACTIVE)
const dropdownChild = $(active.parentNode).find(
Selector.DROPDOWN_ACTIVE_CHILD
SELECTOR_DROPDOWN_ACTIVE_CHILD
)[0]
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE)
$(dropdownChild).removeClass(CLASS_NAME_ACTIVE)
}
if (active.getAttribute('role') === 'tab') {
@ -182,24 +176,24 @@ class Tab {
}
}
$(element).addClass(ClassName.ACTIVE)
$(element).addClass(CLASS_NAME_ACTIVE)
if (element.getAttribute('role') === 'tab') {
element.setAttribute('aria-selected', true)
}
Util.reflow(element)
if (element.classList.contains(ClassName.FADE)) {
element.classList.add(ClassName.SHOW)
if (element.classList.contains(CLASS_NAME_FADE)) {
element.classList.add(CLASS_NAME_SHOW)
}
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
if (element.parentNode && $(element.parentNode).hasClass(CLASS_NAME_DROPDOWN_MENU)) {
const dropdownElement = $(element).closest(SELECTOR_DROPDOWN)[0]
if (dropdownElement) {
const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))
const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE))
$(dropdownToggleList).addClass(ClassName.ACTIVE)
$(dropdownToggleList).addClass(CLASS_NAME_ACTIVE)
}
element.setAttribute('aria-expanded', true)
@ -226,6 +220,7 @@ class Tab {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
@ -239,7 +234,7 @@ class Tab {
*/
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault()
Tab._jQueryInterface.call($(this), 'show')
})

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -15,25 +15,21 @@ import Util from './util'
*/
const NAME = 'toast'
const VERSION = '4.3.1'
const VERSION = '4.5.3'
const DATA_KEY = 'bs.toast'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Event = {
CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`
}
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_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 ClassName = {
FADE : 'fade',
HIDE : 'hide',
SHOW : 'show',
SHOWING : 'showing'
}
const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_HIDE = 'hide'
const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_SHOWING = 'showing'
const DefaultType = {
animation: 'boolean',
@ -47,9 +43,7 @@ const Default = {
delay: 500
}
const Selector = {
DATA_DISMISS : '[data-dismiss="toast"]'
}
const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
/**
* ------------------------------------------------------------------------
@ -82,25 +76,35 @@ class Toast {
// Public
show() {
$(this._element).trigger(Event.SHOW)
const showEvent = $.Event(EVENT_SHOW)
$(this._element).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
}
this._clearTimeout()
if (this._config.animation) {
this._element.classList.add(ClassName.FADE)
this._element.classList.add(CLASS_NAME_FADE)
}
const complete = () => {
this._element.classList.remove(ClassName.SHOWING)
this._element.classList.add(ClassName.SHOW)
this._element.classList.remove(CLASS_NAME_SHOWING)
this._element.classList.add(CLASS_NAME_SHOW)
$(this._element).trigger(Event.SHOWN)
$(this._element).trigger(EVENT_SHOWN)
if (this._config.autohide) {
this._timeout = setTimeout(() => {
this.hide()
}, this._config.delay)
}
}
this._element.classList.remove(ClassName.HIDE)
this._element.classList.add(ClassName.SHOWING)
this._element.classList.remove(CLASS_NAME_HIDE)
Util.reflow(this._element)
this._element.classList.add(CLASS_NAME_SHOWING)
if (this._config.animation) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
@ -112,31 +116,29 @@ class Toast {
}
}
hide(withoutTimeout) {
if (!this._element.classList.contains(ClassName.SHOW)) {
hide() {
if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
return
}
$(this._element).trigger(Event.HIDE)
const hideEvent = $.Event(EVENT_HIDE)
if (withoutTimeout) {
this._close()
} else {
this._timeout = setTimeout(() => {
this._close()
}, this._config.delay)
$(this._element).trigger(hideEvent)
if (hideEvent.isDefaultPrevented()) {
return
}
this._close()
}
dispose() {
clearTimeout(this._timeout)
this._timeout = null
this._clearTimeout()
if (this._element.classList.contains(ClassName.SHOW)) {
this._element.classList.remove(ClassName.SHOW)
if (this._element.classList.contains(CLASS_NAME_SHOW)) {
this._element.classList.remove(CLASS_NAME_SHOW)
}
$(this._element).off(Event.CLICK_DISMISS)
$(this._element).off(EVENT_CLICK_DISMISS)
$.removeData(this._element, DATA_KEY)
this._element = null
@ -149,7 +151,7 @@ class Toast {
config = {
...Default,
...$(this._element).data(),
...typeof config === 'object' && config ? config : {}
...(typeof config === 'object' && config ? config : {})
}
Util.typeCheckConfig(
@ -162,20 +164,16 @@ class Toast {
}
_setListeners() {
$(this._element).on(
Event.CLICK_DISMISS,
Selector.DATA_DISMISS,
() => this.hide(true)
)
$(this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide())
}
_close() {
const complete = () => {
this._element.classList.add(ClassName.HIDE)
$(this._element).trigger(Event.HIDDEN)
this._element.classList.add(CLASS_NAME_HIDE)
$(this._element).trigger(EVENT_HIDDEN)
}
this._element.classList.remove(ClassName.SHOW)
this._element.classList.remove(CLASS_NAME_SHOW)
if (this._config.animation) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
@ -187,6 +185,11 @@ class Toast {
}
}
_clearTimeout() {
clearTimeout(this._timeout)
this._timeout = null
}
// Static
static _jQueryInterface(config) {

View file

@ -1,7 +1,7 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.1): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Bootstrap (v4.5.3): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@ -37,7 +37,7 @@ export const DefaultWhitelist = {
h5: [],
h6: [],
i: [],
img: ['src', 'alt', 'title', 'width', 'height'],
img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
@ -57,14 +57,14 @@ export const DefaultWhitelist = {
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi
/**
* A pattern that matches safe data URLs. Only matches image, video and audio types.
*
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/
const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i
function allowedAttribute(attr, allowedAttributeList) {
const attrName = attr.nodeName.toLowerCase()
@ -77,10 +77,10 @@ function allowedAttribute(attr, allowedAttributeList) {
return true
}
const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)
const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)
// Check if a regular expression validates the attribute.
for (let i = 0, l = regExp.length; i < l; i++) {
for (let i = 0, len = regExp.length; i < len; i++) {
if (attrName.match(regExp[i])) {
return true
}
@ -116,7 +116,7 @@ export function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
const attributeList = [].slice.call(el.attributes)
const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
attributeList.forEach((attr) => {
attributeList.forEach(attr => {
if (!allowedAttribute(attr, whitelistedAttributes)) {
el.removeAttribute(attr.nodeName)
}

Some files were not shown because too many files have changed in this diff Show more