Compare commits

...

411 Commits

Author SHA1 Message Date
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
XhmikosR 8fa0d30101 Release v4.3.1. (#28252) 2019-02-13 18:01:40 +02:00
XhmikosR dae20da750 Remove unneeded glob. (#28249)
Typo from 10b97f6.
2019-02-13 15:21:04 +02:00
XhmikosR 10b97f6ed9 Fix npm package contents 2019-02-13 08:32:15 +02:00
Johann-S 7bc4d2e0bc Add sanitize template option for tooltip/popover plugins. 2019-02-13 08:32:15 +02:00
Martijn Cuppens bf2515ae68 Update RFS to v8.0.1 (#28245)
Remove warning if RFS is included more than once.
2019-02-12 22:49:12 +01:00
Martijn Cuppens 45ced606f4 Update font size (#28232) 2019-02-12 09:38:42 +02:00
Mark Otto 1ded0d6a4e Release v4.3.0 (#28228)
* Prep for v4.3.0

* More updates for v4.3.0.

* rerun to build docs source map
2019-02-11 11:15:34 -08:00
XhmikosR 3aa0770b71 docs snippets: a few more minor tweaks (#28225)
* Remove extra comma.

* Use curly braces in snippet.
2019-02-11 11:34:02 +02:00
XhmikosR adf16da25e toasts.md: Remove useless divs.
Instead pass the class to the example include.
2019-02-11 08:54:17 +02:00
XhmikosR 2bfe581eeb Remove stray parameter from capture. 2019-02-11 08:54:17 +02:00
XhmikosR bbf8b768ef Cosmetic changes in snippets. 2019-02-11 08:54:17 +02:00
XhmikosR 7a9a8db7b1 docs: remove -ms-overflow-style: -ms-autohiding-scrollbar (#28220)
Similar to #28153
2019-02-10 22:13:13 +02:00
XhmikosR 24253b18e1 migration.md: use https. (#28221) 2019-02-10 22:05:16 +02:00
Martijn Cuppens 545f3fa921 Prevent text selection in placeholder images (#28218) 2019-02-09 14:21:41 +02:00
XhmikosR 94acdee691 Revert "Silence mkdir. (#28184)" (#28209)
This reverts commit 6ea000d2bc.

Unfortunately, it doesn't seem to work.
2019-02-09 13:20:02 +02:00
XhmikosR 6c7dcc6882 placeholder.svg: Partially revert the changes from c0e42cb. (#28216)
It broke the example include.
2019-02-09 13:10:29 +02:00
XhmikosR 1145365f6d Reword footer text. 2019-02-08 22:51:45 +02:00
XhmikosR bd328bf217 Use the site.repo variable. 2019-02-08 22:51:45 +02:00
XhmikosR a920429089 Change footer link to point to the docs team page 2019-02-08 22:51:45 +02:00
XhmikosR c56b10c147 Offcanvas example: transition the transform (#28203)
This is more efficient than transitioning the `left` property.
2019-02-08 18:08:40 +02:00
XhmikosR 52e6ce4512 Update devDependencies. (#28175) 2019-02-08 09:39:03 +02:00
Shohei Yoshida 93dec4c67c Fix scrollable modal snippet 2019-02-07 21:33:25 -08:00
Martijn Cuppens 51375abca5 Responsive font size implementation (#23816) 2019-02-07 23:32:05 +01:00
Shohei Yoshida d250567ce0 Remove -ms-autohiding-scrollbar to prevent overlapping the table content (#28153) 2019-02-07 19:52:23 +02:00
Martijn Cuppens 8b41cb1368 Optional btn & input font sizes (#28068) 2019-02-07 19:47:24 +02:00
Martijn Cuppens 2ee8ecedf4 Deprecate img-retina() mixin (#28072) 2019-02-07 19:33:57 +02:00
Martijn Cuppens bcfb7ed159 Deprecate invisible() mixin (#28066) 2019-02-07 19:19:00 +02:00
XhmikosR c0e42cb89e Optimize and normalize SVGs. (#28200)
Mostly be consistent with the attributes' order and improve compression when possible.
2019-02-07 15:01:25 +02:00
XhmikosR 00df9177fc Make ToC's entries' color darker.
The previous was too light.
2019-02-07 11:53:47 +02:00
XhmikosR 3473b77527 Remove unused selector. 2019-02-07 11:53:47 +02:00
XhmikosR f663a86810 approach.md: Remove stray comma. 2019-02-07 11:53:47 +02:00
XhmikosR 30ddcafb2d Rename Screenreaders to "Screen readers".
No redirect is added because the next version will be a minor version bump.
2019-02-07 11:53:47 +02:00
XhmikosR f0eb29cd5e Remove ToC from pages when we don't have (m)any headers. 2019-02-07 11:53:47 +02:00
Zachary Welch b647dd0565 Add map-name param to _assert-starts-at-zero (#24986)
* Add map-name param to _assert-starts-at-zero

* Set default value for backwards compatibility
2019-02-07 10:19:38 +01:00
João Lucas eb1313d213 Create border-top-left-radius and border-bottom-right-radius mixins (#28100)
* Create border-top-left-radius mixin
* Create border-bottom-right-radius mixin
2019-02-07 09:02:05 +01:00
Martijn Cuppens 311d6dab68 Deprecate size mixin (#28067) 2019-02-07 08:21:47 +01:00
Martijn Cuppens 8f4f201424 Fix .nav-justified example (#28193) 2019-02-06 23:44:44 +02:00
Bardi Harborow b5fb4f7d6b Add text-decoration to .btn-link. (#28169) 2019-02-06 22:33:03 +01:00
Patrick H. Lauke b4cb48d9f3 Remove outdated reference to not-allowed cursor (#28188)
as this styling was removed back in https://github.com/twbs/bootstrap/commit/7056f702408a97f01cb32bc6075d88ec27cdcf52
2019-02-06 17:12:11 +02:00
Johann-S b54ddfda83 fix modal test to be sure we call getTransitionDurationFromElement 2019-02-06 15:01:13 +01:00
Johann-S 3c49467224 allow to override default toast options (#28186) 2019-02-06 15:19:04 +02:00
Martijn Cuppens 58470c0ac5 Fix text break in Firefox (#28063) 2019-02-06 12:38:13 +02:00
XhmikosR 6ea000d2bc Silence mkdir. (#28184)
This can fail if run in parallel.
2019-02-06 12:22:49 +02:00
Johann-S 11880109fc fix tabs, apply show class only when fade class is present (#28183) 2019-02-06 11:12:02 +01:00
XhmikosR 8217499640 carousel.md: Highlight the whole example for consistency. 2019-02-06 11:47:31 +02:00
XhmikosR c1ea5ac49a docs license header: split sentence in period. 2019-02-06 11:47:31 +02:00
XhmikosR 1131705f14 Add missing trailing slash. 2019-02-06 11:47:31 +02:00
Jason Golieb e44d0475e0 Move dropdown offset function logic into private function. (#28138) 2019-02-05 10:31:18 +02:00
XhmikosR 1139f62ca2 Adjust bundlesize limits. 2019-02-05 10:24:49 +02:00
Jason Golieb 8f6cffde97 Move offset function logic to a private function. 2019-02-05 10:24:49 +02:00
Jason Golieb 88a34aacbe Add support for tooltip offset option to be a function. 2019-02-05 10:24:49 +02:00
XhmikosR 1accd37aa0 examples: remove JS from blog and sticky footer. (#28173)
They don't use it.
2019-02-04 23:42:23 +02:00
Martijn Cuppens d4e782efab Fix dropdown radius if $dropdown-padding-y is not 0 (#28127) 2019-02-03 23:07:16 +02:00
Ryan Worth 1275e35336 Fix negative margin example (#28140)
Negative margin example wasn't displaying correctly due to border and background styling being applied directly to the `.col` element. Made a child element and applied the styling to it
2019-02-03 22:58:54 +02:00
Martijn Cuppens cbaf0c3f7c Change logo size (#28163) 2019-02-03 17:52:36 +02:00
XhmikosR f134d4ba01 components: redirect to the alerts page (#28147) 2019-01-30 21:52:42 +02:00
XhmikosR a60c595dc1 image-replacement.md: use three dots. 2019-01-29 17:21:11 +02:00
XhmikosR be5d3de1d6 Add missing trailing slash. 2019-01-29 17:21:11 +02:00
XhmikosR a93c71832b generate-sri.js: move object. 2019-01-29 17:21:11 +02:00
XhmikosR ffe05d3a9c analytics.html: use double quotes in src attribute. 2019-01-29 17:21:11 +02:00
XhmikosR 2adefeb055 build-tools.md: npm is written lowercase. 2019-01-29 17:21:11 +02:00
XhmikosR 4bec752345 migration.md: remove stray /. 2019-01-29 17:21:11 +02:00
Shohei Yoshida e65dccfc95 Fix custom select caret issue on IE (#28112) 2019-01-25 21:09:21 +01:00
Shohei Yoshida 0f8f84329b Fix validated custom select bg color (#28119) 2019-01-25 20:44:52 +01:00
Martijn Cuppens 6466a0461a Deprecate float mixins (#28104) 2019-01-24 22:51:36 +02:00
Martijn Cuppens 2749bf34de Add !important to .text-monospace utility class (#28064) 2019-01-24 22:42:42 +02:00
XhmikosR 3723613875 Update devDependencies and gems. (#28094) 2019-01-24 21:25:49 +02:00
Martijn Cuppens dfba588d0d Add default value for $ignore-warning (#28103) 2019-01-23 05:59:15 +02:00
Martijn Cuppens 5c56e9adff Add deprecate() mixin (#28092) 2019-01-22 20:55:23 +01:00
XhmikosR f7e8445f72 Add canonical URL. (#28093) 2019-01-21 14:59:51 +02:00
XhmikosR cf25028640 Fix approach redirect. (#28095) 2019-01-21 14:49:55 +02:00
Martijn Cuppens 59d040fcbb Make component colors configurable (#28035) 2019-01-20 23:38:29 +02:00
Shohei Yoshida de0bb1e052 Scrollable modal (#27769) 2019-01-20 23:28:16 +02:00
Martijn Cuppens 41f85b64bf Add ref to reason why min-width: 0; is added (#28061) 2019-01-20 23:23:05 +02:00
Johann-S 842da1ddc3 use absolute path to output lcov file for coveralls (#28075) 2019-01-17 11:06:43 +01:00
XhmikosR 3aeda9942d tests: use jQuery from node_modules. (#28059) 2019-01-15 18:01:40 +02:00
XhmikosR 0828b88563 Fix js-main script. (#28057) 2019-01-15 17:30:21 +02:00
Martijn Cuppens f1f740be09 Make progress animation respect $enable-transitions and prefers-reduced-motion media query
Make progress animation respect `$enable-transitions` and `prefers-reduced-motion` media query
2019-01-15 00:51:11 +00:00
Laussel Loïc 8eb8b8d3da Examples: add tabindex="-1" and aria-disabled="true" on disabled links 2019-01-14 23:29:51 +00:00
XhmikosR e2a6f297c0 Clean up .gitignore. (#28050) 2019-01-14 21:08:24 +02:00
Johann-S d51ee0dcf1 Fix Carousel's touch option to not add touch listeners when set to false (#28046) 2019-01-14 18:53:54 +02:00
Martijn Cuppens 3d350c3b34 Remove map-merge (#28033) 2019-01-13 16:35:00 -08:00
Martijn Cuppens d546cb8374 Cleanup popover arrows (#28008) 2019-01-13 16:29:37 -08:00
Martijn Cuppens 70f50f3079 Sync dropdown font size to base font size 2019-01-13 16:27:40 -08:00
Martijn Cuppens e57cdee6bc Sync dropdown font size with btn font size 2019-01-13 16:27:40 -08:00
Martijn Cuppens fd98e77cac Remove background from nested tables 2019-01-13 16:26:56 -08:00
Martijn Cuppens 93272f45f3 Add some margin below the buttons 2019-01-13 16:24:36 -08:00
Martijn Cuppens d09bd2e629 Fix background size y 2019-01-13 16:24:01 -08:00
Martijn Cuppens e2ac792bc7 Minify background property 2019-01-13 16:24:01 -08:00
Martijn Cuppens 50492b8840 Combine background properties into one 2019-01-13 16:23:32 -08:00
Martijn Cuppens 8db577bd51 Prevent useless property rendering 2019-01-13 16:22:25 -08:00
Martijn Cuppens 4b839b1c87 Don't render a background by default 2019-01-13 16:21:57 -08:00
Martijn Cuppens 5adcfe97f0 Prevent rendering of color property by default 2019-01-13 16:21:16 -08:00
Martijn Cuppens cd4964f345 Change comment heading title to Typography (#28032) 2019-01-14 01:59:51 +02:00
Martijn Cuppens b3226c1ccc Align toast variables (#28041) 2019-01-14 01:51:53 +02:00
Justin 8f5abf0ab0 Add new rounded sizes classes (#28011)
* update border-radius mixins

Add $enable-rounded as a keyword argument to border-raidus mixins

* Update rounded classes

- use border-radius mixins to repleace !important
- use true for $enable-rounded for rounded classes
- Add `.rounded-sm` and `.rounded-sm`  #27934

* update borders docs

* Revert touch of dist files

* Revert change of border-radius mixins

* use !important in border-radius utilies classes

* update border radius classes keep only rounded-lg and rounded-sm
2019-01-13 11:49:25 -08:00
Martijn Cuppens fd4d426e51 Change default custom select styles (#28027) 2019-01-13 09:52:46 +02:00
Martijn Cuppens e077ddbc6c Prevent wrapping if caret is included (#28029) 2019-01-13 09:43:52 +02:00
Mark Otto deea117293 Add form-validation-states Sass map (#27999) 2019-01-11 21:16:50 +02:00
Miha Eržen fd9dc1a0ca Fix input-height-inner wrongly calculated (#28018)
In a scenario where `$input-line-height` or `$input-font-size` are different than `$input-btn-line-height` and `$input-btn-font-size` the final `$input-height-inner` was wrongly calculated.
2019-01-11 14:22:14 +02:00
XhmikosR 746a057f0c Update devDependencies. (#28016) 2019-01-10 15:56:54 +02:00
XhmikosR ff4c35f566 Tighten bundlesize limits. (#28012) 2019-01-10 09:03:16 +02:00
Mark Otto 39b76861a7 npm run test to build dist files 2019-01-08 21:23:50 +02:00
XhmikosR 0e5d387f04 Examples: use {{ site.time | date: "%Y" }}.
Since they are being build, no point in hardcoding the year.
2019-01-08 21:23:50 +02:00
XhmikosR f11f56558b Bump copyright year to 2019. 2019-01-08 21:23:50 +02:00
wojtask9 46f34fd131 remove redundant loop from list-group-horizontal (#28005) 2019-01-08 20:18:36 +02:00
wojtask9 5dcf7cd3b7 box-shadow mixin fix (#28004) 2019-01-08 19:42:28 +02:00
Shohei Yoshida dc436427e9 Move z-index to .list-group-item-action and remove redundant text-decoration: none (#27996) 2019-01-08 06:59:49 +02:00
Martijn Cuppens 48fe2c23d3 Space fixes (#27997) 2019-01-08 06:46:29 +02:00
XhmikosR b23241480a Enable cache for stylelint. 2019-01-07 19:15:06 +02:00
XhmikosR 1213d06b2f Enable cache for ESLint. 2019-01-07 19:15:06 +02:00
XhmikosR cdece35bde Update devDependencies and gems. (#27981) 2019-01-07 18:57:52 +02:00
Martijn Cuppens 68062cfe60 Allow configuration of caret spacing and vertical alignment (#27994) 2019-01-07 18:28:21 +02:00
Martijn Cuppens 2b96e9adf1 remove screen from media query (#27985) 2019-01-07 18:18:43 +02:00
文翼 87cd64e3bf docs: use the twitter Jekyll variable everywhere (#27990) 2019-01-07 18:09:34 +02:00
Martijn Cuppens 8305114ab3 Blog example IE fix & minor tweaks (#27933) 2019-01-07 03:21:53 +02:00
Shohei Yoshida 92cc5a70d3 Fix incorrect responsive alignment of dropdown menu (#27873) 2019-01-07 03:12:51 +02:00
Vishnuprasad Venugopal ea9129c8ae fix border issue for nested card inside accordions (#27881) 2019-01-07 03:06:37 +02:00
Mark Otto e6b1eefc73 Add horizontal list group modifier (#27970)
Alternate take to #27683 that builds the modifier class based on min-width, such that list groups are stacked until the class's breakpoint is reached. This is less verbose, matches our primary responsive approach, and prevents an extra class. Unfortunately, I believe supporting flush list groups is too much code here, so I've skipped that and made a note in the docs.

Also added examples generate from our breakpoints data file with a protip for how to do equal width items.
2019-01-07 03:01:36 +02:00
wojtask9 42bed436e8 take account 'none' for box-shadow (#27972) 2019-01-07 02:52:39 +02:00
Martijn Cuppens cbc8a7273a Sync custom select focus state with custom control focus state 2019-01-07 02:48:04 +02:00
XhmikosR 849067d763 README.md: fix redirect. 2019-01-06 17:22:51 +02:00
XhmikosR d1067d7c35 Switch to our Stylelint config. (#27974) 2019-01-05 20:59:44 +02:00
XhmikosR f21b5f9e98 Remove unneeded stylelint disables. 2019-01-05 20:50:07 +02:00
XhmikosR fcb034828f stylelint: no need to specify syntax.
This speeds things up a bit because we don't spawn a new instance.
2019-01-05 20:02:00 +02:00
Martijn Cuppens 75ec03c2ab Run linters in parallel
This should speed up things a bit
2019-01-05 20:02:00 +02:00
XhmikosR 47610b0f8b Update postcss-cli to v6.1.1. 2019-01-05 00:36:31 +02:00
Mark Otto 1488a83b13 latest changes 2019-01-04 08:29:45 -08:00
Johann-S 89a73f100e carousel should not cycle when there is no data-ride on init (#27968) 2019-01-04 18:15:01 +02:00
XhmikosR d4b5b4b78c Update devDependencies and gems. 2019-01-04 14:22:23 +02:00
Mark Otto b478234cba Add note to the summary of important changes 2019-01-04 11:53:32 +02:00
Martijn Cuppens e1b990fb90 Move hand cursor for buttons to reboot 2019-01-04 11:53:32 +02:00
Martijn Cuppens 83dc45b31b Prevent select word wrap in Safari (#27932) 2019-01-04 11:40:10 +02:00
Florian Lacreuse c71b291cd9 Remove unnecessary brackets for consistency (#27966) 2019-01-03 20:59:18 +02:00
sabruss 6813653bb1 Fix Typo on docs (#27962) 2019-01-02 18:33:52 +02:00
XhmikosR bec34acbbe Add a few more redirects. 2018-12-31 02:20:08 +02:00
Martijn Cuppens e7336e7d7f Remove wrapping paragraph in readme (#27948) 2018-12-29 18:40:56 +02:00
Martijn Cuppens c0dfda964f Configurable display utility classes (#27917) 2018-12-29 04:54:58 +02:00
Martijn Cuppens 952374654c Fix custom select font sizes (#27929) 2018-12-29 04:44:35 +02:00
Martijn Cuppens 8eef162c44 Match input font size for .input-group-text (#27941) 2018-12-28 23:18:10 +02:00
XhmikosR ee09d96628 reboot: Fix comment (#27937) 2018-12-28 00:48:51 +02:00
Martijn Cuppens 8bf823e22d Fix form-feedback-icon-invalid color (#27935) 2018-12-27 23:05:29 +02:00
XhmikosR 501e8c0837 toasts: mention that positioning is manual. (#27931) 2018-12-27 21:41:14 +02:00
XhmikosR dc17c924e8 stretched-link.md: fix typo (#27918) 2018-12-24 16:34:30 +02:00
Martijn Cuppens 4a5217c4c7 Add Open Collective to header (#27916) 2018-12-23 22:24:25 +02:00
Mark Otto e4fe18e426 Add horizontal card example (#27906) 2018-12-23 15:00:51 +02:00
Johann-S 3bd9fb3649 getSelectorFromElement return null on bad selectors (#27912) 2018-12-23 14:30:35 +02:00
XhmikosR 7d5cb2df3a versions: sort from newer to older. (#27898) 2018-12-23 14:12:13 +02:00
XhmikosR 3c88ed7069 Fix 4:3 embed (#27910) 2018-12-23 13:58:58 +02:00
Martijn Cuppens 81e35985b8 Simplify card group css (#27901) 2018-12-23 09:19:07 +02:00
Martijn Cuppens 39b14c9806 Blacklist border-radius property (use mixin instead) (#27900) 2018-12-23 09:11:11 +02:00
Mark Otto 6a5a1b073d move to 4.2 2018-12-22 22:20:26 -08:00
XhmikosR de7a38250b Merge branch 'v4-dev' into stretched-link 2018-12-23 00:30:55 +02:00
XhmikosR 46f86df0bb bootstrap-stack.svg: remove unneeded space. 2018-12-22 23:54:21 +02:00
XhmikosR 3bdb363495 Remove obsolete redirects in examples. (#27897) 2018-12-22 22:07:37 +02:00
XhmikosR 74987d9591 Add two new meta tags for Algolia (#27902) 2018-12-22 21:58:06 +02:00
XhmikosR 74a2d93517 Merge branch 'v4-dev' into stretched-link 2018-12-22 18:32:28 +02:00
Jesse Mandel dee3ab427c Update nuspec and build script (#27894)
Update nuspec and build script to support `<license />` instead of the deprecated `<licenseUrl />`
2018-12-22 17:09:51 +02:00
Mark Otto f0e5cc3f41 Add a notes about multiple links/targets, remove multiple link example 2018-12-21 21:10:40 -08:00
XhmikosR 2dda0a22e4 Update devDependencies and gems. 2018-12-21 21:07:48 -08:00
Mark Otto 15be9d3277 Add variable for dropdown-divider-margin-y (#27857)
* Add variable for dropdown-divider-margin-y

For us to reassign the nav-divider-margin-y variable here, we have to rearrange some of the variables.

Fixes #26660.

* bump bundlesize
2018-12-21 20:59:40 -08:00
Mark Otto a8b0fabf0a Merge branch 'table-dark-colors' into v4-dev 2018-12-21 15:36:09 -08:00
Mark Otto d51b408d0f Merge branch 'text-break-util' into v4-dev 2018-12-21 15:35:55 -08:00
Mark Otto 2162cb1806 dist 2018-12-21 15:35:15 -08:00
Mark Otto fca7531897 Merge branch 'table-dark-colors' into v4-dev 2018-12-21 14:49:11 -08:00
Mark Otto cdcfd3b1e8 Merge branch 'text-break-util' into v4-dev 2018-12-21 14:47:52 -08:00
ysds 27d691c64c Prevent unnecessary css when $emphasized-link-hover-darken-percentage is 0 or 0% 2018-12-21 14:46:20 -08:00
Martijn Cuppens 20f49143fc Sync modal header & footer border colors with $border-color 2018-12-21 13:56:44 -08:00
Martijn Cuppens 8bc118acce Sync $table-border-color with $border-color 2018-12-21 13:56:11 -08:00
Shohei Yoshida cda3301d08 Use border-radius() mixin for toast 2018-12-21 13:55:44 -08:00
Martijn Cuppens fc841b0ceb #27135: themed link focus state & selector improvement (#27136) 2018-12-21 13:55:05 -08:00
Sam Tape 9d3930b6dd Apply arrow styles to direct descendants of bootstrap popover classes
With the current styles, it is not possible to nest a popover inside of
another popover if they have different placements because the arrow
styles of the parent popover will conflict with the arrow styles of the
child popover.
2018-12-21 13:54:29 -08:00
Mark Otto f6abb4976f Prevent checks from shrinking in inline forms (#27870)
Fixes #25336
2018-12-21 13:52:02 -08:00
Mark Otto 2e1d0fed00 Add table-hover-color variables (#27850)
* Add table-hover-color variables
Fixes #26465

* Put $table-color to use outside _variables.scss
2018-12-21 13:51:38 -08:00
Mark Otto 1449d041c8 Merge branch 'validation-support-list' into v4-dev 2018-12-21 13:48:53 -08:00
Mark Otto d9712b7bcd Merge branch 'table-hover-colors' into v4-dev 2018-12-21 13:48:44 -08:00
Mark Otto 3b843c37c1 Merge branch 'grid-vertical-alignment-ie-warning' into v4-dev 2018-12-21 13:48:19 -08:00
Mark Otto 9e4e94747b Bump to v4.2.1 (#27892) 2018-12-21 10:55:28 -08:00
Mark Otto f7bf353cdc Add docs for .text-break 2018-12-17 09:58:18 -08:00
Martijn Cuppens 353c8b4376 Update scss/utilities/_text.scss
Co-Authored-By: mdo <otto@github.com>
2018-12-17 09:48:06 -08:00
XhmikosR 901761a34b Merge branch 'v4-dev' into table-dark-colors 2018-12-17 00:20:56 +02:00
Mark Otto 540537c481 Add new .text-break utility for applying word-break: break-word 2018-12-16 13:23:33 -08:00
Mark Otto 4ad7ba7b23 List out what's supported in validation styles
Fixes #27169
2018-12-15 14:25:40 -08:00
Mark Otto 3b42a9ec5b Add table-hover-color variables
Fixes #26465
2018-12-15 14:01:09 -08:00
Mark Otto 9d05cc25cb Fixes #26468: Mention min-height issue in IE10/11 for flexbox vertical alignment 2018-12-15 13:51:20 -08:00
Mark Otto 236c7803cb Update site/docs/4.1/utilities/stretched-link.md
Co-Authored-By: MartijnCuppens <martijn.cuppens@gmail.com>
2018-12-15 20:18:55 +01:00
Mark Otto 470145bdca Update site/docs/4.1/utilities/stretched-link.md
Co-Authored-By: MartijnCuppens <martijn.cuppens@gmail.com>
2018-12-15 20:17:45 +01:00
Mark Otto 210d49ec05 Update site/docs/4.1/utilities/stretched-link.md
Co-Authored-By: MartijnCuppens <martijn.cuppens@gmail.com>
2018-12-15 20:15:03 +01:00
Mark Otto abd5a5e4bd Copy change
Co-Authored-By: MartijnCuppens <martijn.cuppens@gmail.com>
2018-12-15 20:14:42 +01:00
Mark Otto 35caac013c Copy change
Co-Authored-By: MartijnCuppens <martijn.cuppens@gmail.com>
2018-12-15 20:14:05 +01:00
Mark Otto f50f6e0355 Match .table-dark background-color to the -dark variable 2018-12-15 10:15:52 -08:00
XhmikosR e184c11618 Merge branch 'v4-dev' into stretched-link 2018-12-05 11:38:55 +02:00
Martijn Cuppens 3007d4b435 Stretched link 2018-12-04 21:22:12 +01:00
425 changed files with 10131 additions and 6585 deletions
+2
View File
@@ -2,3 +2,5 @@
**/dist/
**/vendor/
/_gh_pages/
/js/coverage/
/package.js
+1
View File
@@ -29,6 +29,7 @@
"guard-for-in": "error",
"no-alert": "error",
"no-caller": "error",
"no-console": "error",
"no-div-regex": "error",
"no-else-return": "error",
"no-empty-function": "error",
+11 -15
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,8 +58,7 @@ 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
@@ -109,10 +109,6 @@ When feasible, we aim to report such upstream bugs to the relevant browser vendo
| 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.
## Feature requests
@@ -140,11 +136,11 @@ project (indentation, accurate comments, etc.) and any other requirements
**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.
and/or [`/bootstrap/js/src/`](https://github.com/twbs/bootstrap/tree/master/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/docs/` directory of the `master` branch](https://github.com/twbs/bootstrap/tree/master/site/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.
@@ -199,9 +195,9 @@ included in the project:
with a clear title and description against the `master` 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 +205,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,7 +213,7 @@ 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.
@@ -237,7 +233,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.
+1 -1
View File
@@ -2,7 +2,7 @@ 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)
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/.github/CONTRIBUTING.md)
Bug reports must include:
+1 -1
View File
@@ -8,7 +8,7 @@ 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)
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/.github/CONTRIBUTING.md)
Bug reports must include:
+1 -1
View File
@@ -1,7 +1,7 @@
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/master/.github/CONTRIBUTING.md)
Feature requests must include:
+1 -1
View File
@@ -7,7 +7,7 @@ about: Suggest an idea for a new feature in Bootstrap.
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/master/.github/CONTRIBUTING.md)
Feature requests must include:
+76
View File
@@ -0,0 +1,76 @@
name: Tests
on: [push, pull_request]
env:
CI: true
jobs:
run:
name: Node ${{ matrix.node }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [6, 8, 12]
steps:
- name: Clone repository
uses: actions/checkout@v1
with:
fetch-depth: 3
- name: Set Node.js version
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
- name: Set up Ruby 2.4
uses: actions/setup-ruby@v1
with:
ruby-version: 2.4.x
- name: Disable gem docs
run: 'echo "gem: --no-document" > ~/.gemrc'
- name: Set up Bundler
run: gem install bundler -v "~> 1.17"
- run: ruby --version
- run: gem --version
- run: bundle --version
- run: node --version
- run: npm --version
- run: java -version
- name: Install npm dependencies
run: npm install
- name: Install bundler dependencies
run: bundle install --deployment --jobs=3 --retry=3 --clean
- name: Run tests
run: npm test
- name: Run bundlesize
run: npm run bundlesize
if: matrix.node == 8
env:
BUNDLESIZE_GITHUB_TOKEN: "${{ secrets.BUNDLESIZE_GITHUB_TOKEN }}"
- name: Run BrowserStack tests
run: npm run js-test-cloud
if: matrix.node == 8 && github.repository == 'twbs/bootstrap' && github.event_name == 'push'
env:
BROWSER_STACK_ACCESS_KEY: "${{ secrets.BROWSER_STACK_ACCESS_KEY }}"
BROWSER_STACK_USERNAME: "${{ secrets.BROWSER_STACK_USERNAME }}"
- name: Run Link Checker
run: npm run check-broken-links
if: matrix.node == 8
- name: Run Coveralls
uses: coverallsapp/github-action@master
if: matrix.node == 8
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
path-to-lcov: "./js/coverage/lcov.info"
+11 -13
View File
@@ -1,13 +1,14 @@
# Ignore docs files
_gh_pages
_site
site/docs/**/dist/
/_gh_pages/
/site/.jekyll-metadata
/site/docs/**/dist/
# Hugo folders
/resources/
# Ignore ruby files
.ruby-version
.bundle
vendor/cache
vendor/bundle
# Ignore ruby/bundler files
/.bundle/
/vendor/
/.ruby-version
# Numerous always-ignore extensions
*.diff
@@ -39,9 +40,6 @@ Thumbs.db
.komodotools
*.komodoproject
# Jekyll metadata
docs/.jekyll-metadata
# Folders to ignore
node_modules
js/coverage
/js/coverage/
/node_modules/
+4 -309
View File
@@ -1,321 +1,16 @@
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss"
],
"plugins": [
"stylelint-order"
"stylelint-config-twbs-bootstrap/scss"
],
"rules": {
"at-rule-empty-line-before": null,
"at-rule-name-space-after": "always",
"at-rule-no-unknown": null,
"at-rule-no-vendor-prefix": true,
"at-rule-semicolon-space-before": "never",
"block-closing-brace-empty-line-before": null,
"block-closing-brace-newline-after": null,
"block-opening-brace-space-before": null,
"color-named": "never",
"declaration-block-semicolon-newline-after": "always-multi-line",
"declaration-block-semicolon-newline-before": "never-multi-line",
"declaration-block-semicolon-space-after": "always-single-line",
"declaration-empty-line-before": null,
"declaration-no-important": true,
"font-family-name-quotes": "always-where-recommended",
"font-weight-notation": [
"numeric",
{
"ignore": [
"relative"
]
}
],
"function-url-no-scheme-relative": true,
"function-url-quotes": "always",
"length-zero-no-unit": true,
"max-empty-lines": 2,
"max-line-length": null,
"media-feature-name-no-unknown": [
true,
{
"ignoreMediaFeatureNames": [
"prefers-reduced-motion"
]
}
],
"media-feature-name-no-vendor-prefix": true,
"media-feature-parentheses-space-inside": "never",
"media-feature-range-operator-space-after": "always",
"media-feature-range-operator-space-before": "never",
"no-descending-specificity": null,
"no-duplicate-selectors": true,
"number-leading-zero": "never",
"order/properties-order": [
"position",
"top",
"right",
"bottom",
"left",
"z-index",
"box-sizing",
"display",
"flex",
"flex-align",
"flex-basis",
"flex-direction",
"flex-wrap",
"flex-flow",
"flex-shrink",
"flex-grow",
"flex-order",
"flex-pack",
"align-content",
"align-items",
"align-self",
"justify-content",
"order",
"float",
"width",
"min-width",
"max-width",
"height",
"min-height",
"max-height",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"overflow",
"overflow-x",
"overflow-y",
"-webkit-overflow-scrolling",
"-ms-overflow-x",
"-ms-overflow-y",
"-ms-overflow-style",
"columns",
"column-count",
"column-fill",
"column-gap",
"column-rule",
"column-rule-width",
"column-rule-style",
"column-rule-color",
"column-span",
"column-width",
"orphans",
"widows",
"clip",
"clear",
"font",
"font-family",
"font-size",
"font-style",
"font-weight",
"font-variant",
"font-size-adjust",
"font-stretch",
"font-effect",
"font-emphasize",
"font-emphasize-position",
"font-emphasize-style",
"font-smooth",
"src",
"hyphens",
"line-height",
"color",
"text-align",
"text-align-last",
"text-emphasis",
"text-emphasis-color",
"text-emphasis-style",
"text-emphasis-position",
"text-decoration",
"text-indent",
"text-justify",
"text-outline",
"-ms-text-overflow",
"text-overflow",
"text-overflow-ellipsis",
"text-overflow-mode",
"text-shadow",
"text-transform",
"text-wrap",
"-webkit-text-size-adjust",
"-ms-text-size-adjust",
"letter-spacing",
"-ms-word-break",
"word-break",
"word-spacing",
"-ms-word-wrap",
"word-wrap",
"overflow-wrap",
"tab-size",
"white-space",
"vertical-align",
"direction",
"unicode-bidi",
"list-style",
"list-style-position",
"list-style-type",
"list-style-image",
"pointer-events",
"-ms-touch-action",
"touch-action",
"cursor",
"visibility",
"zoom",
"table-layout",
"empty-cells",
"caption-side",
"border-spacing",
"border-collapse",
"content",
"quotes",
"counter-reset",
"counter-increment",
"resize",
"user-select",
"nav-index",
"nav-up",
"nav-right",
"nav-down",
"nav-left",
"background",
"background-color",
"background-image",
"filter",
"background-repeat",
"background-attachment",
"background-position",
"background-position-x",
"background-position-y",
"background-clip",
"background-origin",
"background-size",
"border",
"border-color",
"border-style",
"border-width",
"border-top",
"border-top-color",
"border-top-style",
"border-top-width",
"border-right",
"border-right-color",
"border-right-style",
"border-right-width",
"border-bottom",
"border-bottom-color",
"border-bottom-style",
"border-bottom-width",
"border-left",
"border-left-color",
"border-left-style",
"border-left-width",
"property-blacklist": [
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"border-image",
"border-image-source",
"border-image-slice",
"border-image-width",
"border-image-outset",
"border-image-repeat",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"box-shadow",
"opacity",
"-ms-interpolation-mode",
"page-break-after",
"page-break-before",
"page-break-inside",
"transition",
"transition-delay",
"transition-timing-function",
"transition-duration",
"transition-property",
"transform",
"transform-origin",
"perspective",
"appearance",
"animation",
"animation-name",
"animation-duration",
"animation-play-state",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-fill-mode",
"fill",
"stroke"
"transition"
],
"property-blacklist": ["transition"],
"property-no-vendor-prefix": true,
"rule-empty-line-before": null,
"scss/at-function-named-arguments": "never",
"scss/at-function-parentheses-space-before": "never",
"scss/at-import-no-partial-leading-underscore": true,
"scss/at-mixin-argumentless-call-parentheses": null,
"scss/at-mixin-named-arguments": null,
"scss/at-mixin-parentheses-space-before": "never",
"scss/at-rule-no-unknown": true,
"scss/dollar-variable-colon-space-after": "at-least-one-space",
"scss/dollar-variable-colon-space-before": "never",
"scss/dollar-variable-default": [
true,
{
"ignore": "local"
}
],
"scss/dollar-variable-no-missing-interpolation": true,
"scss/media-feature-value-dollar-variable": null,
"scss/no-duplicate-dollar-variables": [
null,
{
"ignoreInsideAtRules": [
"if",
"mixin"
]
}
],
"scss/operator-no-newline-after": true,
"scss/operator-no-newline-before": true,
"scss/operator-no-unspaced": true,
"selector-attribute-quotes": "always",
"selector-class-pattern": "^[a-z][a-z0-9\\-]*[a-z0-9]$",
"selector-list-comma-newline-after": "always",
"selector-list-comma-newline-before": "never-multi-line",
"selector-list-comma-space-after": "always-single-line",
"selector-list-comma-space-before": "never-single-line",
"selector-max-attribute": 2,
"selector-max-class": 4,
"selector-max-combinators": 4,
"selector-max-compound-selectors": 4,
"selector-max-empty-lines": 1,
"selector-max-id": 0,
"selector-max-specificity": null,
"selector-max-type": 2,
"selector-max-universal": 1,
"selector-no-qualifying-type": true,
"selector-no-vendor-prefix": true,
"shorthand-property-no-redundant-values": true,
"string-quotes": "double",
"value-keyword-case": "lower",
"value-list-comma-newline-after": "never-multi-line",
"value-list-comma-newline-before": "never-multi-line",
"value-list-comma-space-after": "always",
"value-no-vendor-prefix": true
"function-blacklist": ["calc"]
}
}
-25
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
+4 -4
View File
@@ -1,9 +1,9 @@
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 'jekyll', '~> 3.8.6'
gem 'jekyll-redirect-from', '~> 0.15.0'
gem 'jekyll-sitemap', '~> 1.4.0'
gem 'jekyll-toc', '~> 0.11.0'
gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform?
end
+33 -35
View File
@@ -1,22 +1,22 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
concurrent-ruby (1.1.3)
concurrent-ruby (1.1.5)
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.9.25)
ffi (1.9.25-x64-mingw32)
ffi (1.11.3)
ffi (1.11.3-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)
jekyll (3.8.6)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
@@ -29,38 +29,36 @@ GEM
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
jekyll-redirect-from (0.14.0)
jekyll (~> 3.3)
jekyll-redirect-from (0.15.0)
jekyll (>= 3.3, < 5.0)
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)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-toc (0.11.0)
nokogiri (~> 1.9)
jekyll-watch (2.2.1)
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)
liquid (4.0.3)
listen (3.2.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6)
mini_portile2 (2.3.0)
nokogiri (1.8.5)
mini_portile2 (~> 2.3.0)
nokogiri (1.8.5-x64-mingw32)
mini_portile2 (~> 2.3.0)
mini_portile2 (2.4.0)
nokogiri (1.10.5)
mini_portile2 (~> 2.4.0)
nokogiri (1.10.5-x64-mingw32)
mini_portile2 (~> 2.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.0.3)
public_suffix (4.0.1)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rouge (3.3.0)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.7.2)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (3.13.0)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
@@ -72,11 +70,11 @@ PLATFORMS
x64-mingw32
DEPENDENCIES
jekyll (~> 3.8.5)
jekyll-redirect-from (~> 0.14.0)
jekyll-sitemap (~> 1.2.0)
jekyll-toc (~> 0.9.1)
jekyll (~> 3.8.6)
jekyll-redirect-from (~> 0.15.0)
jekyll-sitemap (~> 1.4.0)
jekyll-toc (~> 0.11.0)
wdm (~> 0.1.1)
BUNDLED WITH
1.17.1
1.17.3
+2 -2
View File
@@ -1,7 +1,7 @@
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Copyright (c) 2011-2019 Twitter, Inc.
Copyright (c) 2011-2019 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
+27 -31
View File
@@ -1,24 +1,24 @@
<p align="center">
<a href="https://getbootstrap.com/">
<img src="https://getbootstrap.com/docs/4.2/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width=72 height=72>
<img src="https://getbootstrap.com/docs/4.4/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width="72" height="72">
</a>
</p>
<h3 align="center">Bootstrap</h3>
<h3 align="center">Bootstrap</h3>
<p align="center">
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
<br>
<a href="https://getbootstrap.com/docs/4.2/"><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=feature.md&labels=feature">Request feature</a>
·
<a href="https://themes.getbootstrap.com/">Themes</a>
·
<a href="https://blog.getbootstrap.com/">Blog</a>
</p>
<p align="center">
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
<br>
<a href="https://getbootstrap.com/docs/4.4/"><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=feature.md&labels=feature">Request feature</a>
·
<a href="https://themes.getbootstrap.com/">Themes</a>
·
<a href="https://blog.getbootstrap.com/">Blog</a>
</p>
@@ -41,20 +41,20 @@
Several quick start options are available:
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.2.0.zip)
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.4.1.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.2.0`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.2.0`
- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@4.4.1`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.4.1`
- 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.2/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
Read the [Getting started page](https://getbootstrap.com/docs/4.4/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)
[![Build Status](https://github.com/twbs/bootstrap/workflows/Tests/badge.svg)](https://github.com/twbs/bootstrap/actions?workflow=Tests)
[![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)
@@ -101,7 +101,7 @@ bootstrap/
└── bootstrap.min.js.map
```
We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [source maps](https://developers.google.com/web/tools/chrome-devtools/debug/readability/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/), but not [jQuery](https://jquery.com/).
We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [source maps](https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/), but not [jQuery](https://jquery.com/).
## Bugs and feature requests
@@ -113,11 +113,11 @@ Have a bug or a feature request? Please first read the [issue guidelines](https:
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.
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.2/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/docs/4.4/assets/js/src/search.js` file.
### Running documentation locally
1. Run through the [tooling setup](https://getbootstrap.com/docs/4.2/getting-started/build-tools/#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
1. Run through the [tooling setup](https://getbootstrap.com/docs/4.4/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.
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à.
@@ -126,11 +126,7 @@ Learn more about using Jekyll by reading its [documentation](https://jekyllrb.co
### 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/>
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.
@@ -179,7 +175,7 @@ See [the Releases section of our GitHub project](https://github.com/twbs/bootstr
## Thanks
<a href="https://www.browserstack.com/">
<img src="https://live.browserstack.com/images/opensource/browserstack-logo.svg" alt="BrowserStack Logo" width="490" height="106">
<img src="https://live.browserstack.com/images/opensource/browserstack-logo.svg" alt="BrowserStack Logo" width="192" height="42">
</a>
Thanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers!
@@ -210,4 +206,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
## Copyright and license
Code and documentation copyright 2011-2018 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-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://creativecommons.org/licenses/by/3.0/).
+7
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.
+20 -18
View File
@@ -17,7 +17,7 @@ baseurl: ""
url: "https://getbootstrap.com"
encoding: UTF-8
exclude:
- docs/4.2/assets/scss/
- docs/4.4/assets/scss/
plugins:
- jekyll-redirect-from
@@ -29,35 +29,37 @@ 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.2/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.2/assets/brand/bootstrap-social-logo.png
social_image_path: /docs/4.4/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.4/assets/brand/bootstrap-social-logo.png
# Custom variables
current_version: 4.2.0
current_ruby_version: 4.2.0
docs_version: 4.2
current_version: 4.4.1
current_ruby_version: 4.4.1
docs_version: 4.4
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"
icons: "https://icons.getbootstrap.com"
download:
source: "https://github.com/twbs/bootstrap/archive/v4.2.0.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.2.0/bootstrap-4.2.0-dist.zip"
source: "https://github.com/twbs/bootstrap/archive/v4.4.1.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.4.1/bootstrap-4.4.1-dist.zip"
cdn:
# See https://www.srihash.org for info on how to generate the hashes
css: "https://stackpath.bootstrapcdn.com/bootstrap/4.2.0/css/bootstrap.min.css"
css_hash: "sha384-SlJL6LojdN8eNCOoIfK7KJ7SgRFeYBDu8tB1uxELbSAv+RVgD12pZmOcxTUTPXIg"
js: "https://stackpath.bootstrapcdn.com/bootstrap/4.2.0/js/bootstrap.min.js"
js_hash: "sha384-1AHwFvFDF+iQPDBasw2LKa8PdkI8aYv2ad2o197DHC8qr4LuwSe44JY1THkowrqg"
js_bundle: "https://stackpath.bootstrapcdn.com/bootstrap/4.2.0/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-DzxYXig+LjvgMPAmuesvYZSTCE+bYqgfCLpnqxglyMvZGL5gNcalAK2mVo9klgWS"
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.6/umd/popper.min.js"
popper_hash: "sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut"
css: "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
css_hash: "sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
js: "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"
js_hash: "sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
js_bundle: "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-6khuMg9gaYr5AxOqhkVIODVIvm9ynTT5J4V1cfthmT+emCG6yVmEZsRHdxlotUnm"
jquery: "https://code.jquery.com/jquery-3.4.1.slim.min.js"
jquery_hash: "sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
popper: "https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
popper_hash: "sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
toc:
min_level: 2
+3 -3
View File
@@ -1,7 +1,7 @@
/*!
* Script to build our plugins to use them separately.
* Copyright 2018 The Bootstrap Authors
* Copyright 2018 Twitter, Inc.
* Copyright 2019 The Bootstrap Authors
* Copyright 2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@@ -21,7 +21,7 @@ const plugins = [
'createClass',
'inheritsLoose',
'defineProperty',
'objectSpread'
'objectSpread2'
]
})
]
+4 -2
View File
@@ -2,8 +2,8 @@
/*!
* Script to update version number references in the project.
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@@ -83,6 +83,7 @@ function main(args) {
const newVersion = args[1]
const EXCLUDED_DIRS = new Set([
'.git',
'_gh_pages',
'node_modules',
'vendor'
])
@@ -94,6 +95,7 @@ function main(args) {
'.js',
'.json',
'.md',
'.nuspec',
'.scss',
'.txt',
'.yml'
+6 -6
View File
@@ -5,8 +5,8 @@
* Remember to use the same vendor files as the CDN ones,
* otherwise the hashes won't match!
*
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@@ -35,14 +35,14 @@ const files = [
file: 'dist/js/bootstrap.min.js',
configPropertyName: 'js_hash'
},
{
file: `site/docs/${pkg.version_short}/assets/js/vendor/jquery-slim.min.js`,
configPropertyName: 'jquery_hash'
},
{
file: 'dist/js/bootstrap.bundle.min.js',
configPropertyName: 'js_bundle_hash'
},
{
file: `site/docs/${pkg.version_short}/assets/js/vendor/jquery.slim.min.js`,
configPropertyName: 'jquery_hash'
},
{
file: 'node_modules/popper.js/dist/umd/popper.min.js',
configPropertyName: 'popper_hash'
+1 -1
View File
@@ -17,7 +17,7 @@ const plugins = [
'createClass',
'inheritsLoose',
'defineProperty',
'objectSpread'
'objectSpread2'
]
})
]
+3
View File
@@ -35,6 +35,9 @@ plugins:
- minifyStyles: true
- moveElemsAttrsToGroup: true
- moveGroupAttrsToElems: true
- removeAttrs:
attrs:
- "data-name"
- removeComments: true
- removeDesc: true
- removeDoctype: true
+5 -5
View File
@@ -2,8 +2,8 @@
/*!
* Script to run vnu-jar if Java is available.
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Copyright 2017-2019 The Bootstrap Authors
* Copyright 2017-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@@ -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/',
+44
View File
@@ -0,0 +1,44 @@
{
"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.25 kB"
},
{
"path": "./dist/css/bootstrap.min.css",
"maxSize": "23.25 kB"
},
{
"path": "./dist/js/bootstrap.bundle.js",
"maxSize": "47.50 kB"
},
{
"path": "./dist/js/bootstrap.bundle.min.js",
"maxSize": "22.25 kB"
},
{
"path": "./dist/js/bootstrap.js",
"maxSize": "25 kB"
},
{
"path": "./dist/js/bootstrap.min.js",
"maxSize": "15.5 kB"
}
]
}
+184 -4
View File
@@ -1,7 +1,7 @@
/*!
* Bootstrap Grid v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Bootstrap Grid v4.4.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)
*/
html {
@@ -47,7 +47,7 @@ html {
}
}
.container-fluid {
.container-fluid, .container-sm, .container-md, .container-lg, .container-xl {
width: 100%;
padding-right: 15px;
padding-left: 15px;
@@ -55,6 +55,30 @@ html {
margin-left: auto;
}
@media (min-width: 576px) {
.container, .container-sm {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container, .container-sm, .container-md {
max-width: 720px;
}
}
@media (min-width: 992px) {
.container, .container-sm, .container-md, .container-lg {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container, .container-sm, .container-md, .container-lg, .container-xl {
max-width: 1140px;
}
}
.row {
display: -ms-flexbox;
display: flex;
@@ -95,6 +119,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 +361,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 +563,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 +765,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 +967,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;
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+18 -10
View File
@@ -1,7 +1,7 @@
/*!
* Bootstrap Reboot v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Bootstrap Reboot v4.4.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)
* 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;
}
@@ -60,6 +60,7 @@ abbr[data-original-title] {
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
@@ -132,20 +133,16 @@ a:hover {
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
a:not([href]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
a:not([href]):hover {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
@@ -225,6 +222,10 @@ select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
[type="button"],
[type="reset"],
@@ -232,6 +233,13 @@ button,
-webkit-appearance: button;
}
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -1,8 +1,8 @@
/*!
* Bootstrap Reboot v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Bootstrap Reboot v4.4.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)
* 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;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}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[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]){color:inherit;text-decoration:none}a:not([href]):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}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}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */
File diff suppressed because one or more lines are too long
+721 -384
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+686 -370
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+619 -347
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+14 -15
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap alert.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap alert.js v4.4.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)
*/
(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.Alert = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -35,7 +35,7 @@
*/
var NAME = 'alert';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -52,13 +52,12 @@
ALERT: 'alert',
FADE: 'fade',
SHOW: 'show'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Alert =
/*#__PURE__*/
@@ -90,8 +89,8 @@
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Private
} // Private
;
_proto._getRootElement = function _getRootElement(element) {
var selector = Util.getSelectorFromElement(element);
@@ -133,8 +132,8 @@
_proto._destroyElement = function _destroyElement(element) {
$(element).detach().trigger(Event.CLOSED).remove();
}; // Static
} // Static
;
Alert._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
+1 -1
View File
File diff suppressed because one or more lines are too long
+74 -27
View File
@@ -1,12 +1,12 @@
/*!
* Bootstrap button.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap button.js v4.4.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)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
typeof define === 'function' && define.amd ? define(['jquery'], factory) :
(global.Button = factory(global.jQuery));
(global = global || self, global.Button = factory(global.jQuery));
}(this, (function ($) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
@@ -34,7 +34,7 @@
*/
var NAME = 'button';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.button';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -46,21 +46,23 @@
};
var Selector = {
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
DATA_TOGGLE: '[data-toggle="buttons"]',
DATA_TOGGLES: '[data-toggle="buttons"]',
DATA_TOGGLE: '[data-toggle="button"]',
DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
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)
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY),
LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Button =
/*#__PURE__*/
@@ -76,7 +78,7 @@
_proto.toggle = function toggle() {
var triggerChangeEvent = true;
var addAriaPressed = true;
var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
var rootElement = $(this._element).closest(Selector.DATA_TOGGLES)[0];
if (rootElement) {
var input = this._element.querySelector(Selector.INPUT);
@@ -92,13 +94,16 @@
$(activeElement).removeClass(ClassName.ACTIVE);
}
}
} else if (input.type === 'checkbox') {
if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName.ACTIVE)) {
triggerChangeEvent = false;
}
} else {
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
triggerChangeEvent = false;
}
if (triggerChangeEvent) {
if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
return;
}
input.checked = !this._element.classList.contains(ClassName.ACTIVE);
$(input).trigger('change');
}
@@ -108,20 +113,22 @@
}
}
if (addAriaPressed) {
this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));
}
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
if (addAriaPressed) {
this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));
}
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE);
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE);
}
}
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Static
} // Static
;
Button._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -155,18 +162,58 @@
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
event.preventDefault();
var button = event.target;
if (!$(button).hasClass(ClassName.BUTTON)) {
button = $(button).closest(Selector.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 {
var inputBtn = button.querySelector(Selector.INPUT);
if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
event.preventDefault(); // work around Firefox bug #1540995
return;
}
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));
});
$(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(ClassName.ACTIVE);
} else {
button.classList.remove(ClassName.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(ClassName.ACTIVE);
} else {
_button.classList.remove(ClassName.ACTIVE);
}
}
});
/**
* ------------------------------------------------------------------------
* jQuery
+1 -1
View File
File diff suppressed because one or more lines are too long
+49 -34
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap carousel.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap carousel.js v4.4.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)
*/
(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.Carousel = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -69,7 +84,7 @@
*/
var NAME = 'carousel';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -142,13 +157,12 @@
var PointerType = {
TOUCH: 'touch',
PEN: 'pen'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Carousel =
/*#__PURE__*/
@@ -264,11 +278,11 @@
this._isSliding = null;
this._activeElement = null;
this._indicatorsElement = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
config = _objectSpread2({}, Default, {}, config);
Util.typeCheckConfig(NAME, config, DefaultType);
return config;
};
@@ -280,7 +294,8 @@
return;
}
var direction = absDeltax / this.touchDeltaX; // swipe left
var direction = absDeltax / this.touchDeltaX;
this.touchDeltaX = 0; // swipe left
if (direction > 0) {
this.prev();
@@ -309,7 +324,9 @@
});
}
this._addTouchEventListeners();
if (this._config.touch) {
this._addTouchEventListeners();
}
};
_proto._addTouchEventListeners = function _addTouchEventListeners() {
@@ -404,8 +421,6 @@
event.preventDefault();
this.next();
break;
default:
}
};
@@ -550,17 +565,17 @@
if (isCycling) {
this.cycle();
}
}; // Static
} // Static
;
Carousel._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var _config = _objectSpread({}, Default, $(this).data());
var _config = _objectSpread2({}, Default, {}, $(this).data());
if (typeof config === 'object') {
_config = _objectSpread({}, _config, config);
_config = _objectSpread2({}, _config, {}, config);
}
var action = typeof config === 'string' ? config : _config.slide;
@@ -578,7 +593,7 @@
}
data[action]();
} else if (_config.interval) {
} else if (_config.interval && _config.ride) {
data.pause();
data.cycle();
}
@@ -598,7 +613,7 @@
return;
}
var config = _objectSpread({}, $(target).data(), $(this).data());
var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
var slideIndex = this.getAttribute('data-slide-to');
+1 -1
View File
File diff suppressed because one or more lines are too long
+41 -27
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap collapse.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap collapse.js v4.4.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)
*/
(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.Collapse = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -69,7 +84,7 @@
*/
var NAME = 'collapse';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -102,13 +117,12 @@
var Selector = {
ACTIVES: '.show, .collapsing',
DATA_TOGGLE: '[data-toggle="collapse"]'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Collapse =
/*#__PURE__*/
@@ -291,11 +305,11 @@
this._element = null;
this._triggerArray = null;
this._isTransitioning = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
config = _objectSpread2({}, Default, {}, config);
config.toggle = Boolean(config.toggle); // Coerce string values
Util.typeCheckConfig(NAME, config, DefaultType);
@@ -336,8 +350,8 @@
if (triggerArray.length) {
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
}
}; // Static
} // Static
;
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
var selector = Util.getSelectorFromElement(element);
@@ -349,7 +363,7 @@
var $this = $(this);
var data = $this.data(DATA_KEY);
var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
var _config = _objectSpread2({}, Default, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
if (!data && _config.toggle && /show|hide/.test(config)) {
_config.toggle = false;
+1 -1
View File
File diff suppressed because one or more lines are too long
+91 -66
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap dropdown.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap dropdown.js v4.4.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)
*/
(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.Dropdown = factory(global.jQuery,global.Popper,global.Util));
}(this, (function ($,Popper,Util) { 'use strict';
(global = 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;
@@ -44,20 +44,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -70,7 +85,7 @@
*/
var NAME = 'dropdown';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -130,21 +145,22 @@
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'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
display: 'string',
popperConfig: '(null|object)'
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Dropdown =
/*#__PURE__*/
@@ -168,8 +184,6 @@
return;
}
var parent = Dropdown._getParentFromElement(this._element);
var isActive = $(this._menu).hasClass(ClassName.SHOW);
Dropdown._clearMenus();
@@ -178,10 +192,25 @@
return;
}
this.show(true);
};
_proto.show = function show(usePopper) {
if (usePopper === void 0) {
usePopper = false;
}
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()) {
@@ -189,7 +218,7 @@
} // Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
if (!this._inNavbar && usePopper) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
@@ -236,28 +265,6 @@
$(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));
};
_proto.hide = function hide() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
return;
@@ -276,6 +283,10 @@
return;
}
if (this._popper) {
this._popper.destroy();
}
$(this._menu).toggleClass(ClassName.SHOW);
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
};
@@ -299,8 +310,8 @@
if (this._popper !== null) {
this._popper.scheduleUpdate();
}
}; // Private
} // Private
;
_proto._addEventListeners = function _addEventListeners() {
var _this = this;
@@ -314,7 +325,7 @@
};
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config;
};
@@ -356,33 +367,36 @@
return $(this._element).closest('.navbar').length > 0;
};
_proto._getPopperConfig = function _getPopperConfig() {
_proto._getOffset = function _getOffset() {
var _this2 = this;
var offsetConf = {};
var offset = {};
if (typeof this._config.offset === 'function') {
offsetConf.fn = function (data) {
data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});
offset.fn = function (data) {
data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
return data;
};
} else {
offsetConf.offset = this._config.offset;
offset.offset = this._config.offset;
}
return offset;
};
_proto._getPopperConfig = function _getPopperConfig() {
var popperConfig = {
placement: this._getPlacement(),
modifiers: {
offset: offsetConf,
offset: this._getOffset(),
flip: {
enabled: this._config.flip
},
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 = {
@@ -390,9 +404,9 @@
};
}
return popperConfig;
}; // Static
return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
} // Static
;
Dropdown._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -462,6 +476,11 @@
}
toggles[i].setAttribute('aria-expanded', 'false');
if (context._popper) {
context._popper.destroy();
}
$(dropdownMenu).removeClass(ClassName.SHOW);
$(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
}
@@ -476,8 +495,8 @@
}
return parent || element.parentNode;
}; // eslint-disable-next-line complexity
} // eslint-disable-next-line complexity
;
Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
// If not input/textarea:
@@ -502,6 +521,10 @@
var isActive = $(parent).hasClass(ClassName.SHOW);
if (!isActive && event.which === ESCAPE_KEYCODE) {
return;
}
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
var toggle = parent.querySelector(Selector.DATA_TOGGLE);
@@ -512,7 +535,9 @@
return;
}
var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS)).filter(function (item) {
return $(item).is(':visible');
});
if (items.length === 0) {
return;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): index.js
* Bootstrap (v4.4.0): index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
+106 -65
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap modal.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap modal.js v4.4.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)
*/
(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.Modal = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -69,7 +84,7 @@
*/
var NAME = 'modal';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -90,6 +105,7 @@
};
var Event = {
HIDE: "hide" + EVENT_KEY,
HIDE_PREVENTED: "hidePrevented" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY,
@@ -102,25 +118,27 @@
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'
SHOW: 'show',
STATIC: 'modal-static'
};
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'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Modal =
/*#__PURE__*/
@@ -262,19 +280,44 @@
_proto.handleUpdate = function handleUpdate() {
this._adjustDialog();
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
config = _objectSpread2({}, Default, {}, config);
Util.typeCheckConfig(NAME, config, DefaultType);
return config;
};
_proto._showElement = function _showElement(relatedTarget) {
_proto._triggerBackdropTransition = function _triggerBackdropTransition() {
var _this3 = this;
if (this._config.backdrop === 'static') {
var hideEventPrevented = $.Event(Event.HIDE_PREVENTED);
$(this._element).trigger(hideEventPrevented);
if (hideEventPrevented.defaultPrevented) {
return;
}
this._element.classList.add(ClassName.STATIC);
var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, function () {
_this3._element.classList.remove(ClassName.STATIC);
}).emulateTransitionEnd(modalTransitionDuration);
this._element.focus();
} else {
this.hide();
}
};
_proto._showElement = function _showElement(relatedTarget) {
var _this4 = this;
var transition = $(this._element).hasClass(ClassName.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
@@ -287,7 +330,11 @@
this._element.setAttribute('aria-modal', true);
this._element.scrollTop = 0;
if ($(this._dialog).hasClass(ClassName.SCROLLABLE) && modalBody) {
modalBody.scrollTop = 0;
} else {
this._element.scrollTop = 0;
}
if (transition) {
Util.reflow(this._element);
@@ -304,12 +351,12 @@
});
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;
$(_this4._element).trigger(shownEvent);
};
if (transition) {
@@ -321,25 +368,23 @@
};
_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();
if (document !== event.target && _this5._element !== event.target && $(_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) {
event.preventDefault();
_this5.hide();
_this6._triggerBackdropTransition();
}
});
} else if (!this._isShown) {
@@ -348,11 +393,11 @@
};
_proto._setResizeEvent = function _setResizeEvent() {
var _this6 = this;
var _this7 = this;
if (this._isShown) {
$(window).on(Event.RESIZE, function (event) {
return _this6.handleUpdate(event);
return _this7.handleUpdate(event);
});
} else {
$(window).off(Event.RESIZE);
@@ -360,7 +405,7 @@
};
_proto._hideModal = function _hideModal() {
var _this7 = this;
var _this8 = this;
this._element.style.display = 'none';
@@ -373,11 +418,11 @@
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
_this7._resetAdjustments();
_this8._resetAdjustments();
_this7._resetScrollbar();
_this8._resetScrollbar();
$(_this7._element).trigger(Event.HIDDEN);
$(_this8._element).trigger(Event.HIDDEN);
});
};
@@ -389,7 +434,7 @@
};
_proto._showBackdrop = function _showBackdrop(callback) {
var _this8 = this;
var _this9 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@@ -403,8 +448,8 @@
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this8._ignoreBackdropClick) {
_this8._ignoreBackdropClick = false;
if (_this9._ignoreBackdropClick) {
_this9._ignoreBackdropClick = false;
return;
}
@@ -412,11 +457,7 @@
return;
}
if (_this8._config.backdrop === 'static') {
_this8._element.focus();
} else {
_this8.hide();
}
_this9._triggerBackdropTransition();
});
if (animate) {
@@ -440,7 +481,7 @@
$(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() {
_this8._removeBackdrop();
_this9._removeBackdrop();
if (callback) {
callback();
@@ -457,11 +498,11 @@
} else if (callback) {
callback();
}
}; // ----------------------------------------------------------------------
} // ----------------------------------------------------------------------
// the following methods are used to handle overflowing modals
// todo (fat): these should probably be refactored out of modal.js
// ----------------------------------------------------------------------
;
_proto._adjustDialog = function _adjustDialog() {
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
@@ -487,7 +528,7 @@
};
_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
@@ -498,13 +539,13 @@
$(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");
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
}); // Adjust sticky content margin
$(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");
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
}); // Adjust body padding
var actualPadding = document.body.style.paddingRight;
@@ -546,14 +587,14 @@
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
return scrollbarWidth;
}; // Static
} // Static
;
Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {});
var _config = _objectSpread2({}, Default, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
if (!data) {
data = new Modal(this, _config);
@@ -594,7 +635,7 @@
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this10 = this;
var _this11 = this;
var target;
var selector = Util.getSelectorFromElement(this);
@@ -603,7 +644,7 @@
target = document.querySelector(selector);
}
var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
if (this.tagName === 'A' || this.tagName === 'AREA') {
event.preventDefault();
@@ -616,8 +657,8 @@
}
$target.one(Event.HIDDEN, function () {
if ($(_this10).is(':visible')) {
_this10.focus();
if ($(_this11).is(':visible')) {
_this11.focus();
}
});
});
+1 -1
View File
File diff suppressed because one or more lines are too long
+41 -27
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap popover.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap popover.js v4.4.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)
*/
(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.Popover = factory(global.jQuery,global.Tooltip));
}(this, (function ($,Tooltip) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -75,21 +90,21 @@
*/
var NAME = 'popover';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.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 = _objectSpread2({}, Tooltip.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 = _objectSpread2({}, Tooltip.DefaultType, {
content: '(string|element|function)'
});
@@ -112,13 +127,12 @@
FOCUSOUT: "focusout" + EVENT_KEY,
MOUSEENTER: "mouseenter" + EVENT_KEY,
MOUSELEAVE: "mouseleave" + EVENT_KEY
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Popover =
/*#__PURE__*/
@@ -158,8 +172,8 @@
this.setElementContent($tip.find(Selector.CONTENT), content);
$tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
}; // Private
} // Private
;
_proto._getContent = function _getContent() {
return this.element.getAttribute('data-content') || this.config.content;
@@ -172,8 +186,8 @@
if (tabClass !== null && tabClass.length > 0) {
$tip.removeClass(tabClass.join(''));
}
}; // Static
} // Static
;
Popover._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
+1 -1
View File
File diff suppressed because one or more lines are too long
+40 -26
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap scrollspy.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap scrollspy.js v4.4.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)
*/
(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.ScrollSpy = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -69,7 +84,7 @@
*/
var NAME = 'scrollspy';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -108,13 +123,12 @@
var OffsetMethod = {
OFFSET: 'offset',
POSITION: 'position'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var ScrollSpy =
/*#__PURE__*/
@@ -192,11 +206,11 @@
this._targets = null;
this._activeTarget = null;
this._scrollHeight = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
config = _objectSpread2({}, Default, {}, typeof config === 'object' && config ? config : {});
if (typeof config.target !== 'string') {
var id = $(config.target).attr('id');
@@ -300,8 +314,8 @@
}).forEach(function (node) {
return node.classList.remove(ClassName.ACTIVE);
});
}; // Static
} // Static
;
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
+1 -1
View File
File diff suppressed because one or more lines are too long
+18 -16
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap tab.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap tab.js v4.4.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)
*/
(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.Tab = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -35,7 +35,7 @@
*/
var NAME = 'tab';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -62,13 +62,12 @@
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE: '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Tab =
/*#__PURE__*/
@@ -143,8 +142,8 @@
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Private
} // Private
;
_proto._activate = function _activate(element, container, callback) {
var _this2 = this;
@@ -186,7 +185,10 @@
}
Util.reflow(element);
$(element).addClass(ClassName.SHOW);
if (element.classList.contains(ClassName.FADE)) {
element.classList.add(ClassName.SHOW);
}
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
@@ -202,8 +204,8 @@
if (callback) {
callback();
}
}; // Static
} // Static
;
Tab._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
+1 -1
View File
File diff suppressed because one or more lines are too long
+68 -43
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap toast.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap toast.js v4.4.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)
*/
(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.Toast = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';
(global = 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;
@@ -43,20 +43,35 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
@@ -69,7 +84,7 @@
*/
var NAME = 'toast';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.toast';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -98,13 +113,12 @@
};
var Selector = {
DATA_DISMISS: '[data-dismiss="toast"]'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Toast =
/*#__PURE__*/
@@ -124,7 +138,12 @@
_proto.show = function show() {
var _this = this;
$(this._element).trigger(Event.SHOW);
var showEvent = $.Event(Event.SHOW);
$(this._element).trigger(showEvent);
if (showEvent.isDefaultPrevented()) {
return;
}
if (this._config.animation) {
this._element.classList.add(ClassName.FADE);
@@ -138,12 +157,16 @@
$(_this._element).trigger(Event.SHOWN);
if (_this._config.autohide) {
_this.hide();
_this._timeout = setTimeout(function () {
_this.hide();
}, _this._config.delay);
}
};
this._element.classList.remove(ClassName.HIDE);
Util.reflow(this._element);
this._element.classList.add(ClassName.SHOWING);
if (this._config.animation) {
@@ -154,22 +177,19 @@
}
};
_proto.hide = function hide(withoutTimeout) {
var _this2 = this;
_proto.hide = function hide() {
if (!this._element.classList.contains(ClassName.SHOW)) {
return;
}
$(this._element).trigger(Event.HIDE);
var hideEvent = $.Event(Event.HIDE);
$(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() {
@@ -184,30 +204,30 @@
$.removeData(this._element, DATA_KEY);
this._element = null;
this._config = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, $(this._element).data(), typeof config === 'object' && config ? config : {});
config = _objectSpread2({}, Default, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
Util.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);
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(ClassName.HIDE);
$(_this4._element).trigger(Event.HIDDEN);
$(_this3._element).trigger(Event.HIDDEN);
};
this._element.classList.remove(ClassName.SHOW);
@@ -218,8 +238,8 @@
} else {
complete();
}
}; // Static
} // Static
;
Toast._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -253,6 +273,11 @@
get: function get() {
return DefaultType;
}
}, {
key: "Default",
get: function get() {
return Default;
}
}]);
return Toast;
+1 -1
View File
File diff suppressed because one or more lines are too long
+264 -80
View File
@@ -1,13 +1,13 @@
/*!
* Bootstrap tooltip.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap tooltip.js v4.4.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)
*/
(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.Tooltip = factory(global.jQuery,global.Popper,global.Util));
}(this, (function ($,Popper,Util) { 'use strict';
(global = 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;
@@ -44,25 +44,161 @@
return obj;
}
function _objectSpread(target) {
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(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;
}));
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.4.1): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
var DefaultWhitelist = {
// Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
a: ['target', 'href', 'title', 'rel'],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ['src', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
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;
/**
* 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;
function allowedAttribute(attr, allowedAttributeList) {
var attrName = attr.nodeName.toLowerCase();
if (allowedAttributeList.indexOf(attrName) !== -1) {
if (uriAttrs.indexOf(attrName) !== -1) {
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
}
return true;
}
var regExp = allowedAttributeList.filter(function (attrRegex) {
return attrRegex instanceof RegExp;
}); // Check if a regular expression validates the attribute.
for (var i = 0, l = regExp.length; i < l; i++) {
if (attrName.match(regExp[i])) {
return true;
}
}
return false;
}
function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
if (unsafeHtml.length === 0) {
return unsafeHtml;
}
if (sanitizeFn && typeof sanitizeFn === 'function') {
return sanitizeFn(unsafeHtml);
}
var domParser = new window.DOMParser();
var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
var whitelistKeys = Object.keys(whiteList);
var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
var _loop = function _loop(i, len) {
var el = elements[i];
var elName = el.nodeName.toLowerCase();
if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
el.parentNode.removeChild(el);
return "continue";
}
var attributeList = [].slice.call(el.attributes);
var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
attributeList.forEach(function (attr) {
if (!allowedAttribute(attr, whitelistedAttributes)) {
el.removeAttribute(attr.nodeName);
}
});
};
for (var i = 0, len = elements.length; i < len; i++) {
var _ret = _loop(i);
if (_ret === "continue") continue;
}
return createdDocument.body.innerHTML;
}
/**
* ------------------------------------------------------------------------
* Constants
@@ -70,12 +206,13 @@
*/
var NAME = 'tooltip';
var VERSION = '4.2.0';
var VERSION = '4.4.1';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var CLASS_PREFIX = 'bs-tooltip';
var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
var DefaultType = {
animation: 'boolean',
template: 'string',
@@ -85,10 +222,14 @@
html: 'boolean',
selector: '(string|boolean)',
placement: '(string|function)',
offset: '(number|string)',
offset: '(number|string|function)',
container: '(string|element|boolean)',
fallbackPlacement: '(string|array)',
boundary: '(string|element)'
boundary: '(string|element)',
sanitize: 'boolean',
sanitizeFn: '(null|function)',
whiteList: 'object',
popperConfig: '(null|object)'
};
var AttachmentMap = {
AUTO: 'auto',
@@ -109,7 +250,11 @@
offset: 0,
container: false,
fallbackPlacement: 'flip',
boundary: 'scrollParent'
boundary: 'scrollParent',
sanitize: true,
sanitizeFn: null,
whiteList: DefaultWhitelist,
popperConfig: null
};
var HoverState = {
SHOW: 'show',
@@ -141,22 +286,17 @@
FOCUS: 'focus',
CLICK: 'click',
MANUAL: 'manual'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
var Tooltip =
/*#__PURE__*/
function () {
function Tooltip(element, config) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
} // private
@@ -227,7 +367,7 @@
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');
$(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
if (this.tip) {
$(this.tip).remove();
@@ -238,7 +378,7 @@
this._hoverState = null;
this._activeTrigger = null;
if (this._popper !== null) {
if (this._popper) {
this._popper.destroy();
}
@@ -291,31 +431,7 @@
}
$(this.element).trigger(this.constructor.Event.INSERTED);
this._popper = new Popper(this.element, tip, {
placement: attachment,
modifiers: {
offset: {
offset: this.config.offset
},
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);
}
});
this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
$(tip).addClass(ClassName.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
@@ -405,8 +521,8 @@
if (this._popper !== null) {
this._popper.scheduleUpdate();
}
}; // Protected
} // Protected
;
_proto.isWithContent = function isWithContent() {
return Boolean(this.getTitle());
@@ -428,19 +544,27 @@
};
_proto.setElementContent = function setElementContent($element, content) {
var html = this.config.html;
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
// Content is a DOM node or a jQuery
if (html) {
if (this.config.html) {
if (!$(content).parent().is($element)) {
$element.empty().append(content);
}
} else {
$element.text($(content).text());
}
return;
}
if (this.config.html) {
if (this.config.sanitize) {
content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
}
$element.html(content);
} else {
$element[html ? 'html' : 'text'](content);
$element.text(content);
}
};
@@ -452,8 +576,54 @@
}
return title;
}; // Private
} // Private
;
_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 _objectSpread2({}, 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 = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
return data;
};
} else {
offset.offset = this.config.offset;
}
return offset;
};
_proto._getContainer = function _getContainer() {
if (this.config.container === false) {
@@ -472,32 +642,35 @@
};
_proto._setListeners = function _setListeners() {
var _this3 = this;
var _this5 = this;
var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) {
if (trigger === 'click') {
$(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
return _this3.toggle(event);
$(_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 ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
$(_this3.element).on(eventIn, _this3.config.selector, function (event) {
return _this3._enter(event);
}).on(eventOut, _this3.config.selector, function (event) {
return _this3._leave(event);
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;
$(_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 (_this3.element) {
_this3.hide();
}
});
this._hideModalHandler = function () {
if (_this5.element) {
_this5.hide();
}
};
$(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
if (this.config.selector) {
this.config = _objectSpread({}, this.config, {
this.config = _objectSpread2({}, this.config, {
trigger: 'manual',
selector: ''
});
@@ -591,7 +764,13 @@
};
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, this.constructor.Default, $(this.element).data(), typeof config === 'object' && config ? config : {});
var dataAttributes = $(this.element).data();
Object.keys(dataAttributes).forEach(function (dataAttr) {
if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
delete dataAttributes[dataAttr];
}
});
config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
if (typeof config.delay === 'number') {
config.delay = {
@@ -609,6 +788,11 @@
}
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
if (config.sanitize) {
config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
}
return config;
};
@@ -657,8 +841,8 @@
this.hide();
this.show();
this.config.animation = initConfigAnimation;
}; // Static
} // Static
;
Tooltip._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
+1 -1
View File
File diff suppressed because one or more lines are too long
+26 -5
View File
@@ -1,19 +1,19 @@
/*!
* Bootstrap util.js v4.2.0 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Bootstrap util.js v4.4.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)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
typeof define === 'function' && define.amd ? define(['jquery'], factory) :
(global.Util = factory(global.jQuery));
(global = global || self, global.Util = factory(global.jQuery));
}(this, (function ($) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): util.js
* Bootstrap (v4.4.1): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -89,7 +89,11 @@
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
}
return selector && document.querySelector(selector) ? selector : null;
try {
return document.querySelector(selector) ? selector : null;
} catch (err) {
return null;
}
},
getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
if (!element) {
@@ -158,8 +162,25 @@
}
return Util.findShadowRoot(element.parentNode);
},
jQueryDetection: function jQueryDetection() {
if (typeof $ === 'undefined') {
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
}
var version = $.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;
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): alert.js
* Bootstrap (v4.4.1): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'alert'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
+67 -25
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): button.js
* Bootstrap (v4.4.1): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -14,7 +14,7 @@ import $ from 'jquery'
*/
const NAME = 'button'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@@ -27,17 +27,20 @@ const ClassName = {
}
const Selector = {
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
DATA_TOGGLE : '[data-toggle="buttons"]',
INPUT : 'input:not([type="hidden"])',
ACTIVE : '.active',
BUTTON : '.btn'
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
DATA_TOGGLES : '[data-toggle="buttons"]',
DATA_TOGGLE : '[data-toggle="button"]',
DATA_TOGGLES_BUTTONS : '[data-toggle="buttons"] .btn',
INPUT : 'input:not([type="hidden"])',
ACTIVE : '.active',
BUTTON : '.btn'
}
const 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}`
`blur${EVENT_KEY}${DATA_API_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
}
/**
@@ -63,7 +66,7 @@ class Button {
let triggerChangeEvent = true
let addAriaPressed = true
const rootElement = $(this._element).closest(
Selector.DATA_TOGGLE
Selector.DATA_TOGGLES
)[0]
if (rootElement) {
@@ -81,15 +84,16 @@ class Button {
$(activeElement).removeClass(ClassName.ACTIVE)
}
}
} else if (input.type === 'checkbox') {
if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName.ACTIVE)) {
triggerChangeEvent = false
}
} else {
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
triggerChangeEvent = false
}
if (triggerChangeEvent) {
if (input.hasAttribute('disabled') ||
rootElement.hasAttribute('disabled') ||
input.classList.contains('disabled') ||
rootElement.classList.contains('disabled')) {
return
}
input.checked = !this._element.classList.contains(ClassName.ACTIVE)
$(input).trigger('change')
}
@@ -99,13 +103,15 @@ class Button {
}
}
if (addAriaPressed) {
this._element.setAttribute('aria-pressed',
!this._element.classList.contains(ClassName.ACTIVE))
}
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
if (addAriaPressed) {
this._element.setAttribute('aria-pressed',
!this._element.classList.contains(ClassName.ACTIVE))
}
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE)
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE)
}
}
}
@@ -140,21 +146,57 @@ class Button {
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
event.preventDefault()
let button = event.target
if (!$(button).hasClass(ClassName.BUTTON)) {
button = $(button).closest(Selector.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
}
Button._jQueryInterface.call($(button), 'toggle')
}
})
.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))
})
$(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(ClassName.ACTIVE)
} else {
button.classList.remove(ClassName.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(ClassName.ACTIVE)
} else {
button.classList.remove(ClassName.ACTIVE)
}
}
})
/**
* ------------------------------------------------------------------------
* jQuery
+8 -4
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): carousel.js
* Bootstrap (v4.4.1): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'carousel'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.carousel'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@@ -245,6 +245,8 @@ class Carousel {
const direction = absDeltax / this.touchDeltaX
this.touchDeltaX = 0
// swipe left
if (direction > 0) {
this.prev()
@@ -268,7 +270,9 @@ class Carousel {
.on(Event.MOUSELEAVE, (event) => this.cycle(event))
}
this._addTouchEventListeners()
if (this._config.touch) {
this._addTouchEventListeners()
}
}
_addTouchEventListeners() {
@@ -531,7 +535,7 @@ class Carousel {
throw new TypeError(`No method named "${action}"`)
}
data[action]()
} else if (_config.interval) {
} else if (_config.interval && _config.ride) {
data.pause()
data.cycle()
}
+2 -2
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): collapse.js
* Bootstrap (v4.4.1): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'collapse'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
+54 -44
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): dropdown.js
* Bootstrap (v4.4.1): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -16,7 +16,7 @@ import Util from './util'
*/
const NAME = 'dropdown'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@@ -71,19 +71,21 @@ const AttachmentMap = {
}
const Default = {
offset : 0,
flip : true,
boundary : 'scrollParent',
reference : 'toggle',
display : 'dynamic'
offset : 0,
flip : true,
boundary : 'scrollParent',
reference : 'toggle',
display : 'dynamic',
popperConfig : null
}
const DefaultType = {
offset : '(number|string|function)',
flip : 'boolean',
boundary : '(string|element)',
reference : '(string|element)',
display : 'string'
offset : '(number|string|function)',
flip : 'boolean',
boundary : '(string|element)',
reference : '(string|element)',
display : 'string',
popperConfig : '(null|object)'
}
/**
@@ -124,7 +126,6 @@ class Dropdown {
return
}
const parent = Dropdown._getParentFromElement(this._element)
const isActive = $(this._menu).hasClass(ClassName.SHOW)
Dropdown._clearMenus()
@@ -133,10 +134,19 @@ class Dropdown {
return
}
this.show(true)
}
show(usePopper = false) {
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)
@@ -145,7 +155,7 @@ class Dropdown {
}
// Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
if (!this._inNavbar && usePopper) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
@@ -194,29 +204,6 @@ class Dropdown {
.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))
}
hide() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
return
@@ -234,6 +221,10 @@ class Dropdown {
return
}
if (this._popper) {
this._popper.destroy()
}
$(this._menu).toggleClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
@@ -319,24 +310,30 @@ class Dropdown {
return $(this._element).closest('.navbar').length > 0
}
_getPopperConfig() {
const offsetConf = {}
_getOffset() {
const offset = {}
if (typeof this._config.offset === 'function') {
offsetConf.fn = (data) => {
offset.fn = (data) => {
data.offsets = {
...data.offsets,
...this._config.offset(data.offsets) || {}
...this._config.offset(data.offsets, this._element) || {}
}
return data
}
} else {
offsetConf.offset = this._config.offset
offset.offset = this._config.offset
}
return offset
}
_getPopperConfig() {
const popperConfig = {
placement: this._getPlacement(),
modifiers: {
offset: offsetConf,
offset: this._getOffset(),
flip: {
enabled: this._config.flip
},
@@ -352,7 +349,11 @@ class Dropdown {
enabled: false
}
}
return popperConfig
return {
...popperConfig,
...this._config.popperConfig
}
}
// Static
@@ -424,6 +425,10 @@ class Dropdown {
toggles[i].setAttribute('aria-expanded', 'false')
if (context._popper) {
context._popper.destroy()
}
$(dropdownMenu).removeClass(ClassName.SHOW)
$(parent)
.removeClass(ClassName.SHOW)
@@ -468,6 +473,10 @@ class Dropdown {
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(ClassName.SHOW)
if (!isActive && event.which === ESCAPE_KEYCODE) {
return
}
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
const toggle = parent.querySelector(Selector.DATA_TOGGLE)
@@ -479,6 +488,7 @@ class Dropdown {
}
const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))
.filter((item) => $(item).is(':visible'))
if (items.length === 0) {
return
+1 -19
View File
@@ -1,4 +1,3 @@
import $ from 'jquery'
import Alert from './alert'
import Button from './button'
import Carousel from './carousel'
@@ -14,28 +13,11 @@ import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): index.js
* Bootstrap (v4.4.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,
+40 -11
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): modal.js
* Bootstrap (v4.4.1): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'modal'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.modal'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@@ -38,6 +38,7 @@ const DefaultType = {
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDE_PREVENTED : `hidePrevented${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
@@ -51,15 +52,18 @@ const Event = {
}
const ClassName = {
SCROLLABLE : 'modal-dialog-scrollable',
SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
BACKDROP : 'modal-backdrop',
OPEN : 'modal-open',
FADE : 'fade',
SHOW : 'show'
SHOW : 'show',
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',
@@ -232,8 +236,32 @@ class Modal {
return config
}
_triggerBackdropTransition() {
if (this._config.backdrop === 'static') {
const hideEventPrevented = $.Event(Event.HIDE_PREVENTED)
$(this._element).trigger(hideEventPrevented)
if (hideEventPrevented.defaultPrevented) {
return
}
this._element.classList.add(ClassName.STATIC)
const modalTransitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element).one(Util.TRANSITION_END, () => {
this._element.classList.remove(ClassName.STATIC)
})
.emulateTransitionEnd(modalTransitionDuration)
this._element.focus()
} else {
this.hide()
}
}
_showElement(relatedTarget) {
const transition = $(this._element).hasClass(ClassName.FADE)
const modalBody = this._dialog ? this._dialog.querySelector(Selector.MODAL_BODY) : null
if (!this._element.parentNode ||
this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
@@ -244,7 +272,12 @@ class Modal {
this._element.style.display = 'block'
this._element.removeAttribute('aria-hidden')
this._element.setAttribute('aria-modal', true)
this._element.scrollTop = 0
if ($(this._dialog).hasClass(ClassName.SCROLLABLE) && modalBody) {
modalBody.scrollTop = 0
} else {
this._element.scrollTop = 0
}
if (transition) {
Util.reflow(this._element)
@@ -295,8 +328,7 @@ class Modal {
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
if (event.which === ESCAPE_KEYCODE) {
event.preventDefault()
this.hide()
this._triggerBackdropTransition()
}
})
} else if (!this._isShown) {
@@ -354,11 +386,8 @@ class Modal {
if (event.target !== event.currentTarget) {
return
}
if (this._config.backdrop === 'static') {
this._element.focus()
} else {
this.hide()
}
this._triggerBackdropTransition()
})
if (animate) {
+2 -2
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): popover.js
* Bootstrap (v4.4.1): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Tooltip from './tooltip'
*/
const NAME = 'popover'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
+2 -2
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): scrollspy.js
* Bootstrap (v4.4.1): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'scrollspy'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
+6 -3
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): tab.js
* Bootstrap (v4.4.1): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'tab'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
@@ -188,7 +188,10 @@ class Tab {
}
Util.reflow(element)
$(element).addClass(ClassName.SHOW)
if (element.classList.contains(ClassName.FADE)) {
element.classList.add(ClassName.SHOW)
}
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
+24 -13
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): toast.js
* Bootstrap (v4.4.1): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -15,7 +15,7 @@ import Util from './util'
*/
const NAME = 'toast'
const VERSION = '4.2.0'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.toast'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
@@ -75,10 +75,19 @@ class Toast {
return DefaultType
}
static get Default() {
return Default
}
// Public
show() {
$(this._element).trigger(Event.SHOW)
const showEvent = $.Event(Event.SHOW)
$(this._element).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
}
if (this._config.animation) {
this._element.classList.add(ClassName.FADE)
@@ -91,11 +100,14 @@ class Toast {
$(this._element).trigger(Event.SHOWN)
if (this._config.autohide) {
this.hide()
this._timeout = setTimeout(() => {
this.hide()
}, this._config.delay)
}
}
this._element.classList.remove(ClassName.HIDE)
Util.reflow(this._element)
this._element.classList.add(ClassName.SHOWING)
if (this._config.animation) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
@@ -108,20 +120,19 @@ class Toast {
}
}
hide(withoutTimeout) {
hide() {
if (!this._element.classList.contains(ClassName.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() {
@@ -161,7 +172,7 @@ class Toast {
$(this._element).on(
Event.CLICK_DISMISS,
Selector.DATA_DISMISS,
() => this.hide(true)
() => this.hide()
)
}
+127
View File
@@ -0,0 +1,127 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.4.1): tools/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const uriAttrs = [
'background',
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href'
]
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
export const DefaultWhitelist = {
// Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
a: ['target', 'href', 'title', 'rel'],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ['src', 'alt', 'title', 'width', 'height'],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
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
*/
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
function allowedAttribute(attr, allowedAttributeList) {
const attrName = attr.nodeName.toLowerCase()
if (allowedAttributeList.indexOf(attrName) !== -1) {
if (uriAttrs.indexOf(attrName) !== -1) {
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
}
return true
}
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++) {
if (attrName.match(regExp[i])) {
return true
}
}
return false
}
export function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
if (unsafeHtml.length === 0) {
return unsafeHtml
}
if (sanitizeFn && typeof sanitizeFn === 'function') {
return sanitizeFn(unsafeHtml)
}
const domParser = new window.DOMParser()
const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')
const whitelistKeys = Object.keys(whiteList)
const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))
for (let i = 0, len = elements.length; i < len; i++) {
const el = elements[i]
const elName = el.nodeName.toLowerCase()
if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
el.parentNode.removeChild(el)
continue
}
const attributeList = [].slice.call(el.attributes)
const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
attributeList.forEach((attr) => {
if (!allowedAttribute(attr, whitelistedAttributes)) {
el.removeAttribute(attr.nodeName)
}
})
}
return createdDocument.body.innerHTML
}
+108 -49
View File
@@ -1,10 +1,14 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): tooltip.js
* Bootstrap (v4.4.1): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
import {
DefaultWhitelist,
sanitizeHtml
} from './tools/sanitizer'
import $ from 'jquery'
import Popper from 'popper.js'
import Util from './util'
@@ -15,13 +19,14 @@ import Util from './util'
* ------------------------------------------------------------------------
*/
const NAME = 'tooltip'
const VERSION = '4.2.0'
const DATA_KEY = 'bs.tooltip'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-tooltip'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const NAME = 'tooltip'
const VERSION = '4.4.1'
const DATA_KEY = 'bs.tooltip'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-tooltip'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
const DefaultType = {
animation : 'boolean',
@@ -32,10 +37,14 @@ const DefaultType = {
html : 'boolean',
selector : '(string|boolean)',
placement : '(string|function)',
offset : '(number|string)',
offset : '(number|string|function)',
container : '(string|element|boolean)',
fallbackPlacement : '(string|array)',
boundary : '(string|element)'
boundary : '(string|element)',
sanitize : 'boolean',
sanitizeFn : '(null|function)',
whiteList : 'object',
popperConfig : '(null|object)'
}
const AttachmentMap = {
@@ -60,7 +69,11 @@ const Default = {
offset : 0,
container : false,
fallbackPlacement : 'flip',
boundary : 'scrollParent'
boundary : 'scrollParent',
sanitize : true,
sanitizeFn : null,
whiteList : DefaultWhitelist,
popperConfig : null
}
const HoverState = {
@@ -108,10 +121,6 @@ const Trigger = {
class Tooltip {
constructor(element, config) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)')
}
@@ -215,7 +224,7 @@ class Tooltip {
$.removeData(this.element, this.constructor.DATA_KEY)
$(this.element).off(this.constructor.EVENT_KEY)
$(this.element).closest('.modal').off('hide.bs.modal')
$(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)
if (this.tip) {
$(this.tip).remove()
@@ -225,7 +234,7 @@ class Tooltip {
this._timeout = null
this._hoverState = null
this._activeTrigger = null
if (this._popper !== null) {
if (this._popper) {
this._popper.destroy()
}
@@ -282,29 +291,7 @@ class Tooltip {
$(this.element).trigger(this.constructor.Event.INSERTED)
this._popper = new Popper(this.element, tip, {
placement: attachment,
modifiers: {
offset: {
offset: this.config.offset
},
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: Selector.ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: (data) => {
if (data.originalPlacement !== data.placement) {
this._handlePopperPlacementChange(data)
}
},
onUpdate: (data) => this._handlePopperPlacementChange(data)
})
this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))
$(tip).addClass(ClassName.SHOW)
@@ -421,18 +408,27 @@ class Tooltip {
}
setElementContent($element, content) {
const html = this.config.html
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
// Content is a DOM node or a jQuery
if (html) {
if (this.config.html) {
if (!$(content).parent().is($element)) {
$element.empty().append(content)
}
} else {
$element.text($(content).text())
}
return
}
if (this.config.html) {
if (this.config.sanitize) {
content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)
}
$element.html(content)
} else {
$element[html ? 'html' : 'text'](content)
$element.text(content)
}
}
@@ -450,6 +446,54 @@ class Tooltip {
// Private
_getPopperConfig(attachment) {
const defaultBsConfig = {
placement: attachment,
modifiers: {
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: Selector.ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: (data) => {
if (data.originalPlacement !== data.placement) {
this._handlePopperPlacementChange(data)
}
},
onUpdate: (data) => this._handlePopperPlacementChange(data)
}
return {
...defaultBsConfig,
...this.config.popperConfig
}
}
_getOffset() {
const offset = {}
if (typeof this.config.offset === 'function') {
offset.fn = (data) => {
data.offsets = {
...data.offsets,
...this.config.offset(data.offsets, this.element) || {}
}
return data
}
} else {
offset.offset = this.config.offset
}
return offset
}
_getContainer() {
if (this.config.container === false) {
return document.body
@@ -498,13 +542,15 @@ class Tooltip {
}
})
this._hideModalHandler = () => {
if (this.element) {
this.hide()
}
}
$(this.element).closest('.modal').on(
'hide.bs.modal',
() => {
if (this.element) {
this.hide()
}
}
this._hideModalHandler
)
if (this.config.selector) {
@@ -619,9 +665,18 @@ class Tooltip {
}
_getConfig(config) {
const dataAttributes = $(this.element).data()
Object.keys(dataAttributes)
.forEach((dataAttr) => {
if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
delete dataAttributes[dataAttr]
}
})
config = {
...this.constructor.Default,
...$(this.element).data(),
...dataAttributes,
...typeof config === 'object' && config ? config : {}
}
@@ -646,6 +701,10 @@ class Tooltip {
this.constructor.DefaultType
)
if (config.sanitize) {
config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)
}
return config
}
+24 -2
View File
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.2.0): util.js
* Bootstrap (v4.4.1): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -82,7 +82,11 @@ const Util = {
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''
}
return selector && document.querySelector(selector) ? selector : null
try {
return document.querySelector(selector) ? selector : null
} catch (err) {
return null
}
},
getTransitionDurationFromElement(element) {
@@ -165,9 +169,27 @@ const Util = {
}
return Util.findShadowRoot(element.parentNode)
},
jQueryDetection() {
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')
}
}
}
Util.jQueryDetection()
setTransitionEndSupport()
export default Util
+1 -13
View File
@@ -6,19 +6,7 @@
<title>Bootstrap Plugin Test Suite</title>
<!-- jQuery -->
<script>
(function () {
var path = '../../site/docs/4.2/assets/js/vendor/jquery-slim.min.js'
// get jquery param from the query string.
var jQueryVersion = location.search.match(/[?&]jquery=(.*?)(?=&|$)/)
// If a version was specified, use that version from jQuery CDN
if (jQueryVersion) {
path = 'https://code.jquery.com/jquery-' + jQueryVersion[1] + '.min.js'
}
document.write('<script src="' + path + '"><\/script>')
}())
</script>
<script src="../../node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="../../node_modules/popper.js/dist/umd/popper.min.js"></script>
<!-- QUnit -->
+2 -2
View File
@@ -13,8 +13,8 @@
<body>
<div class="container">
<h1>Hello, world!</h1>
<div class="col-12">
<div class="mt-5 mb-3">
<div class="mt-5">
<div class="mb-3">
<span>Util.getUID: </span>
<span id="resultUID"></span>
</div>
+5 -7
View File
@@ -1,16 +1,14 @@
/* eslint-env node */
/* eslint no-process-env: 0 */
const path = require('path')
const ip = require('ip')
const pkg = require('../../package.json')
const {
browsers,
browsersKeys
} = require('./browsers')
const path = require('path')
const jsCoveragePath = path.resolve(__dirname, '../coverage')
const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : `site/docs/${pkg.version_short}/assets/js/vendor/jquery-slim.min.js`
const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'node_modules/jquery/dist/jquery.slim.min.js'
const bundle = process.env.BUNDLE === 'true'
const browserStack = process.env.BROWSER === 'true'
@@ -29,7 +27,7 @@ const reporters = ['dots']
const detectBrowsers = {
usePhantomJS: false,
postDetection(availableBrowser) {
if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
if (process.env.CI === true || availableBrowser.includes('Chrome')) {
return ['ChromeHeadless']
}
@@ -94,7 +92,7 @@ if (bundle) {
conf.browsers = browsersKeys
reporters.push('BrowserStack')
files = files.concat([
`site/docs/${pkg.version_short}/assets/js/vendor/jquery-slim.min.js`,
'node_modules/jquery/dist/jquery.slim.min.js',
'js/dist/util.js',
'js/dist/tooltip.js',
'js/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
@@ -117,7 +115,7 @@ if (bundle) {
conf.customLaunchers = customLaunchers
conf.detectBrowsers = detectBrowsers
conf.coverageIstanbulReporter = {
dir: jsCoveragePath,
dir: path.resolve(__dirname, '../coverage/'),
reports: ['lcov', 'text-summary'],
thresholds: {
emitWarning: false,
+196 -31
View File
@@ -61,6 +61,22 @@ $(function () {
assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
})
QUnit.test('should not toggle aria-pressed on buttons with disabled class', function (assert) {
assert.expect(2)
var $btn = $('<button class="btn disabled" data-toggle="button" aria-pressed="false">redux</button>')
assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
$btn.bootstrapButton('toggle')
assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is still false')
})
QUnit.test('should not toggle aria-pressed on buttons that are disabled', function (assert) {
assert.expect(2)
var $btn = $('<button class="btn" data-toggle="button" aria-pressed="false" disabled>redux</button>')
assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is false')
$btn.bootstrapButton('toggle')
assert.strictEqual($btn.attr('aria-pressed'), 'false', 'btn aria-pressed state is still false')
})
QUnit.test('should toggle aria-pressed on buttons with container', function (assert) {
assert.expect(1)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
@@ -84,13 +100,73 @@ $(function () {
assert.strictEqual($btn.attr('aria-pressed'), 'true', 'btn aria-pressed state is true')
})
QUnit.test('should assign active class on page load to buttons with aria-pressed="true"', function (assert) {
assert.expect(1)
var done = assert.async()
var $btn = $('<button class="btn" data-toggle="button" aria-pressed="true">mdo</button>')
$btn.appendTo('#qunit-fixture')
$(window).trigger($.Event('load'))
setTimeout(function () {
assert.ok($btn.hasClass('active'), 'button with aria-pressed="true" has been given class active')
done()
}, 5)
})
QUnit.test('should assign active class on page load to button checkbox with checked attribute', function (assert) {
assert.expect(1)
var done = assert.async()
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-primary">' +
'<input type="checkbox" id="radio" checked> Checkbox' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $btn = $group.children().eq(0)
$(window).trigger($.Event('load'))
setTimeout(function () {
assert.ok($btn.hasClass('active'), 'checked checkbox button has been given class active')
done()
}, 5)
})
QUnit.test('should remove active class on page load from buttons without aria-pressed="true"', function (assert) {
assert.expect(1)
var done = assert.async()
var $btn = $('<button class="btn active" data-toggle="button" aria-pressed="false">mdo</button>')
$btn.appendTo('#qunit-fixture')
$(window).trigger($.Event('load'))
setTimeout(function () {
assert.ok(!$btn.hasClass('active'), 'button without aria-pressed="true" has had active class removed')
done()
}, 5)
})
QUnit.test('should remove active class on page load from button checkbox without checked attribute', function (assert) {
assert.expect(1)
var done = assert.async()
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-primary active">' +
'<input type="checkbox" id="radio"> Checkbox' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $btn = $group.children().eq(0)
$(window).trigger($.Event('load'))
setTimeout(function () {
assert.ok(!$btn.hasClass('active'), 'unchecked checkbox button has had active class removed')
done()
}, 5)
})
QUnit.test('should trigger input change event when toggled button has input field', function (assert) {
assert.expect(1)
var done = assert.async()
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-primary">' +
'<input type="radio" id="radio" autocomplete="off">Radio' +
'<input type="radio" id="radio">Radio' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
@@ -139,34 +215,11 @@ $(function () {
assert.ok($btn2.find('input').prop('checked'), 'btn2 is checked')
})
QUnit.test('should only toggle selectable inputs', function (assert) {
assert.expect(6)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-primary active">' +
'<input type="hidden" name="option1" id="option1-default" value="false">' +
'<input type="checkbox" name="option1" id="option1" checked="true"> Option 1' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $btn = $group.children().eq(0)
var $hidden = $btn.find('input#option1-default')
var $cb = $btn.find('input#option1')
assert.ok($btn.hasClass('active'), 'btn has active class')
assert.ok($cb.prop('checked'), 'btn is checked')
assert.ok(!$hidden.prop('checked'), 'hidden is not checked')
$btn.trigger('click')
assert.ok(!$btn.hasClass('active'), 'btn does not have active class')
assert.ok(!$cb.prop('checked'), 'btn is not checked')
assert.ok(!$hidden.prop('checked'), 'hidden is not checked') // should not be changed
})
QUnit.test('should not add aria-pressed on labels for radio/checkbox inputs in a data-toggle="buttons" group', function (assert) {
assert.expect(2)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-primary"><input type="checkbox" autocomplete="off"> Checkbox</label>' +
'<label class="btn btn-primary"><input type="radio" name="options" autocomplete="off"> Radio</label>' +
'<label class="btn btn-primary"><input type="checkbox"> Checkbox</label>' +
'<label class="btn btn-primary"><input type="radio" name="options"> Radio</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
@@ -181,10 +234,10 @@ $(function () {
})
QUnit.test('should handle disabled attribute on non-button elements', function (assert) {
assert.expect(2)
assert.expect(4)
var groupHTML = '<div class="btn-group disabled" data-toggle="buttons" aria-disabled="true" disabled>' +
'<label class="btn btn-danger disabled" aria-disabled="true" disabled>' +
'<input type="checkbox" aria-disabled="true" autocomplete="off" disabled class="disabled"/>' +
'<label class="btn btn-danger disabled">' +
'<input type="checkbox" aria-disabled="true" disabled>' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
@@ -192,9 +245,121 @@ $(function () {
var $btn = $group.children().eq(0)
var $input = $btn.children().eq(0)
$btn.trigger('click')
assert.ok($btn.is(':not(.active)'), 'button is initially not active')
assert.ok(!$input.prop('checked'), 'checkbox is initially not checked')
$btn[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok($btn.is(':not(.active)'), 'button did not become active')
assert.ok(!$input.is(':checked'), 'checkbox did not get checked')
assert.ok(!$input.prop('checked'), 'checkbox did not get checked')
})
QUnit.test('should not set active class if inner hidden checkbox is disabled but author forgot to set disabled class on outer button', function (assert) {
assert.expect(4)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn btn-danger">' +
'<input type="checkbox" disabled>' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $btn = $group.children().eq(0)
var $input = $btn.children().eq(0)
assert.ok($btn.is(':not(.active)'), 'button is initially not active')
assert.ok(!$input.prop('checked'), 'checkbox is initially not checked')
$btn[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok($btn.is(':not(.active)'), 'button did not become active')
assert.ok(!$input.prop('checked'), 'checkbox did not get checked')
})
QUnit.test('should correctly set checked state on input and active class on label when using <label><input></label> structure', function (assert) {
assert.expect(4)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn">' +
'<input type="checkbox">' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $label = $group.children().eq(0)
var $input = $label.children().eq(0)
assert.ok($label.is(':not(.active)'), 'label is initially not active')
assert.ok(!$input.prop('checked'), 'checkbox is initially not checked')
$label[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok($label.is('.active'), 'label is active after click')
assert.ok($input.prop('checked'), 'checkbox is checked after click')
})
QUnit.test('should correctly set checked state on input and active class on the faked button when using <div><input></div> structure', function (assert) {
assert.expect(4)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<div class="btn">' +
'<input type="checkbox" aria-label="Check">' +
'</div>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $btn = $group.children().eq(0)
var $input = $btn.children().eq(0)
assert.ok($btn.is(':not(.active)'), '<div> is initially not active')
assert.ok(!$input.prop('checked'), 'checkbox is initially not checked')
$btn[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok($btn.is('.active'), '<div> is active after click')
assert.ok($input.prop('checked'), 'checkbox is checked after click')
})
QUnit.test('should not do anything if the click was just sent to the outer container with data-toggle', function (assert) {
assert.expect(4)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn">' +
'<input type="checkbox">' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $label = $group.children().eq(0)
var $input = $label.children().eq(0)
assert.ok($label.is(':not(.active)'), 'label is initially not active')
assert.ok(!$input.prop('checked'), 'checkbox is initially not checked')
$group[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok($label.is(':not(.active)'), 'label is not active after click')
assert.ok(!$input.prop('checked'), 'checkbox is not checked after click')
})
QUnit.test('should not try and set checked property on an input of type="hidden"', function (assert) {
assert.expect(2)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn">' +
'<input type="hidden">' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $label = $group.children().eq(0)
var $input = $label.children().eq(0)
assert.ok(!$input.prop('checked'), 'hidden input initially has no checked property')
$label[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok(!$input.prop('checked'), 'hidden input does not have a checked property')
})
QUnit.test('should not try and set checked property on an input that is not a radio button or checkbox', function (assert) {
assert.expect(2)
var groupHTML = '<div class="btn-group" data-toggle="buttons">' +
'<label class="btn">' +
'<input type="text">' +
'</label>' +
'</div>'
var $group = $(groupHTML).appendTo('#qunit-fixture')
var $label = $group.children().eq(0)
var $input = $label.children().eq(0)
assert.ok(!$input.prop('checked'), 'text input initially has no checked property')
$label[0].click() // fire a real click on the DOM node itself, not a click() on the jQuery object that just aliases to trigger('click')
assert.ok(!$input.prop('checked'), 'text input does not have a checked property')
})
QUnit.test('dispose should remove data and the element', function (assert) {
+66 -4
View File
@@ -948,7 +948,7 @@ $(function () {
$textArea.trigger(eventKeyDown)
})
QUnit.test('Should not go to the next item when the carousel is not visible', function (assert) {
QUnit.test('should not go to the next item when the carousel is not visible', function (assert) {
assert.expect(2)
var done = assert.async()
var html = '<div id="myCarousel" class="carousel slide" data-interval="50" style="display: none;">' +
@@ -985,7 +985,7 @@ $(function () {
}, 80)
})
QUnit.test('Should not go to the next item when the parent of the carousel is not visible', function (assert) {
QUnit.test('should not go to the next item when the parent of the carousel is not visible', function (assert) {
assert.expect(2)
var done = assert.async()
var html = '<div id="parent" style="display: none;">' +
@@ -1118,7 +1118,7 @@ $(function () {
}
document.documentElement.ontouchstart = $.noop
assert.expect(3)
assert.expect(4)
Simulator.setType('pointer')
var $styles = $(stylesCarousel).appendTo('head')
@@ -1147,6 +1147,7 @@ $(function () {
assert.ok(true, 'slid event fired')
assert.ok(!$item.hasClass('active'))
assert.ok(spy.called)
assert.strictEqual(carousel.touchDeltaX, 0)
$styles.remove()
delete document.documentElement.ontouchstart
done()
@@ -1160,7 +1161,7 @@ $(function () {
})
QUnit.test('should allow swipeleft and call next with touch events', function (assert) {
assert.expect(3)
assert.expect(4)
clearPointerEvents()
Simulator.setType('touch')
document.documentElement.ontouchstart = $.noop
@@ -1190,6 +1191,7 @@ $(function () {
assert.ok(true, 'slid event fired')
assert.ok(!$item.hasClass('active'))
assert.ok(spy.called)
assert.strictEqual(carousel.touchDeltaX, 0)
restorePointerEvents()
delete document.documentElement.ontouchstart
done()
@@ -1270,4 +1272,64 @@ $(function () {
assert.strictEqual(spy.called, true)
sandbox.restore()
})
QUnit.test('should not cycle when there is no attribute data-ride', function (assert) {
assert.expect(1)
var spy = sinon.spy(Carousel.prototype, 'cycle')
var carouselHTML = '<div class="carousel"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
assert.strictEqual(spy.called, false)
spy.restore()
})
QUnit.test('should cycle when there is data-ride attribute', function (assert) {
assert.expect(1)
var spy = sinon.spy(Carousel.prototype, 'cycle')
var carouselHTML = '<div class="carousel" data-ride="carousel"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
assert.strictEqual(spy.called, true)
spy.restore()
})
QUnit.test('should init carousels with data-ride on load event', function (assert) {
assert.expect(1)
var done = assert.async()
var spy = sinon.spy(Carousel, '_jQueryInterface')
var carouselHTML = '<div class="carousel" data-ride="carousel"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$(window).trigger($.Event('load'))
setTimeout(function () {
assert.strictEqual(spy.called, true)
spy.restore()
done()
}, 5)
})
QUnit.test('should not add touch event listeners when touch option set to false', function (assert) {
assert.expect(1)
var spy = sinon.spy(Carousel.prototype, '_addTouchEventListeners')
var $carousel = $('<div class="carousel" data-ride="carousel" data-touch="false"></div>')
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
assert.strictEqual(spy.called, false)
spy.restore()
})
})
+1 -1
View File
@@ -757,7 +757,7 @@ $(function () {
$trigger3.trigger('click')
})
QUnit.test('should set aria-expanded="true" to triggers targeting shown collaspe and aria-expanded="false" only when all the targeted collapses are shown', function (assert) {
QUnit.test('should set aria-expanded="true" to triggers targeting shown collapse and aria-expanded="false" only when all the targeted collapses are shown', function (assert) {
assert.expect(9)
var done = assert.async()
+266 -1
View File
@@ -67,6 +67,31 @@ $(function () {
$dropdown.trigger($.Event('click'))
})
QUnit.test('should not open dropdown if escape key was pressed on the toggle', function (assert) {
assert.expect(1)
var done = assert.async()
var dropdownHTML = '<div class="tabs">' +
'<div class="dropdown">' +
'<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' +
'<div class="dropdown-menu">' +
'<a class="dropdown-item" href="#">Secondary link</a>' +
'<a class="dropdown-item" href="#">Something else here</a>' +
'<div class="divider"/>' +
'<a class="dropdown-item" href="#">Another link</a>' +
'</div>' +
'</div>' +
'</div>'
$(dropdownHTML).appendTo('#qunit-fixture')
var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
var $button = $('button[data-toggle="dropdown"]')
// Key escape
$button.trigger('focus').trigger($.Event('keydown', {
which: 27
}))
assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is not shown after escape pressed')
done()
})
QUnit.test('should not add class position-static to dropdown if boundary not set', function (assert) {
assert.expect(1)
var done = assert.async()
@@ -751,6 +776,45 @@ $(function () {
$triggerDropdown.trigger($.Event('click'))
})
QUnit.test('should close dropdown and set focus back to toggle when escape is pressed while focused on a dropdown item', function (assert) {
assert.expect(3)
var done = assert.async()
var dropdownHTML = '<div class="tabs">' +
'<div class="dropdown">' +
'<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown">Dropdown</a>' +
'<div class="dropdown-menu">' +
'<a class="dropdown-item" id="item" href="#">Menu item</a>' +
'</div>' +
'</div>'
var $dropdown = $(dropdownHTML)
.appendTo('#qunit-fixture')
.find('[data-toggle="dropdown"]')
.bootstrapDropdown()
var $item = $('#item')
var $toggle = $('#toggle')
$dropdown
.parent('.dropdown')
.on('shown.bs.dropdown', function () {
// Forcibly focus first item
$item[0].focus()
assert.ok($(document.activeElement)[0] === $item[0], 'menu item initial focus set')
// Key escape
$item.trigger('focus').trigger($.Event('keydown', {
which: 27
}))
assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu was closed after escape')
assert.ok($(document.activeElement)[0] === $toggle[0], 'toggle has focus again once menu was closed after escape')
done()
})
$dropdown.trigger($.Event('click'))
})
QUnit.test('should ignore keyboard events for <input>s and <textarea>s within dropdown-menu, except for escape key', function (assert) {
assert.expect(7)
var done = assert.async()
@@ -1208,7 +1272,7 @@ $(function () {
})
QUnit.test('should show dropdown', function (assert) {
assert.expect(2)
assert.expect(3)
var dropdownHTML =
'<div class="dropdown">' +
@@ -1229,6 +1293,7 @@ $(function () {
$dropdown
.parent('.dropdown')
.on('show.bs.dropdown', function () {
assert.ok(dropdown._popper === null)
assert.ok(true, 'show was fired')
})
.on('shown.bs.dropdown', function () {
@@ -1361,4 +1426,204 @@ $(function () {
$dropdown.hide()
assert.ok($dropdown.parent('.dropdown').hasClass('show'))
})
QUnit.test('should create offset modifier correctly when offset option is a function', function (assert) {
assert.expect(2)
var getOffset = function (offsets) {
return offsets
}
var dropdownHTML =
'<div class="dropdown">' +
' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
' <div class="dropdown-menu">' +
' <a class="dropdown-item" href="#">Another link</a>' +
' </div>' +
'</div>'
var $dropdown = $(dropdownHTML)
.appendTo('#qunit-fixture')
.find('[data-toggle="dropdown"]')
.bootstrapDropdown({
offset: getOffset
})
var dropdown = $dropdown.data('bs.dropdown')
var offset = dropdown._getOffset()
assert.ok(typeof offset.offset === 'undefined')
assert.ok(typeof offset.fn === 'function')
})
QUnit.test('should create offset modifier correctly when offset option is not a function', function (assert) {
assert.expect(2)
var dropdownHTML =
'<div class="dropdown">' +
' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
' <div class="dropdown-menu">' +
' <a class="dropdown-item" href="#">Another link</a>' +
' </div>' +
'</div>'
var myOffset = 42
var $dropdown = $(dropdownHTML)
.appendTo('#qunit-fixture')
.find('[data-toggle="dropdown"]')
.bootstrapDropdown({
offset: myOffset
})
var dropdown = $dropdown.data('bs.dropdown')
var offset = dropdown._getOffset()
assert.strictEqual(offset.offset, myOffset)
assert.ok(typeof offset.fn === 'undefined')
})
QUnit.test('should allow to pass config to popper.js with `popperConfig`', function (assert) {
assert.expect(1)
var dropdownHTML =
'<div class="dropdown">' +
' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
' <div class="dropdown-menu">' +
' <a class="dropdown-item" href="#">Another link</a>' +
' </div>' +
'</div>'
var $dropdown = $(dropdownHTML)
.appendTo('#qunit-fixture')
.find('[data-toggle="dropdown"]')
.bootstrapDropdown({
popperConfig: {
placement: 'left'
}
})
var dropdown = $dropdown.data('bs.dropdown')
var popperConfig = dropdown._getPopperConfig()
assert.strictEqual(popperConfig.placement, 'left')
})
QUnit.test('should destroy old popper references on toggle', function (assert) {
assert.expect(3)
var done = assert.async()
var fixtureHtml = [
'<div class="first dropdown">',
' <button href="#" class="firstBtn btn" data-toggle="dropdown" aria-expanded="false">Dropdown</button>',
' <div class="dropdown-menu">',
' <a class="dropdown-item" href="#">Secondary link</a>',
' </div>',
'</div>',
'<div class="second dropdown">',
' <button href="#" class="secondBtn btn" data-toggle="dropdown" aria-expanded="false">Dropdown</button>',
' <div class="dropdown-menu">',
' <a class="dropdown-item" href="#">Secondary link</a>',
' </div>',
'</div>'
].join('')
$(fixtureHtml).appendTo('#qunit-fixture')
var $btnDropdown1 = $('.firstBtn').bootstrapDropdown()
var $btnDropdown2 = $('.secondBtn').bootstrapDropdown()
var $firstDropdownEl = $('.first')
var $secondDropdownEl = $('.second')
var dropdown1 = $btnDropdown1.data('bs.dropdown')
var dropdown2 = $btnDropdown2.data('bs.dropdown')
var spyPopper
$firstDropdownEl.one('shown.bs.dropdown', function () {
assert.strictEqual($firstDropdownEl.hasClass('show'), true)
spyPopper = sinon.spy(dropdown1._popper, 'destroy')
dropdown2.toggle()
})
$secondDropdownEl.one('shown.bs.dropdown', function () {
assert.strictEqual($secondDropdownEl.hasClass('show'), true)
assert.ok(spyPopper.called)
done()
})
dropdown1.toggle()
})
QUnit.test('should hide a dropdown and destroy popper', function (assert) {
assert.expect(1)
var done = assert.async()
var fixtureHtml = [
'<div class="dropdown">',
' <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>',
' <div class="dropdown-menu">',
' <a class="dropdown-item" href="#">Secondary link</a>',
' </div>',
'</div>'
].join('')
$(fixtureHtml).appendTo('#qunit-fixture')
var $dropdownEl = $('.dropdown')
var dropdown = $('[data-toggle="dropdown"]')
.bootstrapDropdown()
.data('bs.dropdown')
var spyPopper
$dropdownEl.one('shown.bs.dropdown', function () {
spyPopper = sinon.spy(dropdown._popper, 'destroy')
dropdown.hide()
})
$dropdownEl.one('hidden.bs.dropdown', function () {
assert.ok(spyPopper.called)
done()
})
dropdown.show(true)
})
QUnit.test('it should skip hidden element when using keyboard navigation', function (assert) {
assert.expect(3)
var done = assert.async()
var fixtureHtml = [
'<style>',
' .d-none {',
' display: none;',
' }',
'</style>',
'<div class="dropdown">',
' <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>',
' <div class="dropdown-menu">',
' <button class="dropdown-item d-none" type="button">Hidden button by class</button>',
' <a class="dropdown-item" href="#sub1" style="display: none">Hidden link</a>',
' <a class="dropdown-item" href="#sub1" style="visibility: hidden">Hidden link</a>',
' <a id="item1" class="dropdown-item" href="#">Another link</a>',
' </div>',
'</div>'
].join('')
$(fixtureHtml).appendTo('#qunit-fixture')
var $dropdownEl = $('.dropdown')
var $dropdown = $('[data-toggle="dropdown"]')
.bootstrapDropdown()
$dropdownEl.one('shown.bs.dropdown', function () {
$dropdown.trigger($.Event('keydown', {
which: 40
}))
assert.strictEqual($(document.activeElement).hasClass('d-none'), false, '.d-none not focused')
assert.strictEqual($(document.activeElement).css('display') === 'none', false, '"display: none" not focused')
assert.strictEqual(document.activeElement.style.visibility === 'hidden', false, '"visibility: hidden" not focused')
done()
})
$dropdown.trigger('click')
})
})
+96 -34
View File
@@ -619,40 +619,37 @@ $(function () {
assert.expect(1)
var done = assert.async()
try {
var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div id=&quot;modal-test&quot;&gt;&lt;div class=&quot;contents&quot;&lt;div&lt;div id=&quot;close&quot; data-dismiss=&quot;modal&quot;/&gt;&lt;/div&gt;&lt;/div&gt;"/>')
.appendTo('#qunit-fixture')
var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div id=&quot;modal-test&quot;&gt;&lt;div class=&quot;contents&quot;&lt;div&lt;div id=&quot;close&quot; data-dismiss=&quot;modal&quot;/&gt;&lt;/div&gt;&lt;/div&gt;"/>')
.appendTo('#qunit-fixture')
$toggleBtn.trigger('click')
} catch (e) {
$toggleBtn.trigger('click')
setTimeout(function () {
assert.strictEqual($('#modal-test').length, 0, 'target has not been parsed and added to the document')
done()
}
}, 0)
})
QUnit.test('should not execute js from target', function (assert) {
assert.expect(0)
var done = assert.async()
try {
// This toggle button contains XSS payload in its data-target
// Note: it uses the onerror handler of an img element to execute the js, because a simple script element does not work here
// a script element works in manual tests though, so here it is likely blocked by the qunit framework
var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div&gt;&lt;image src=&quot;missing.png&quot; onerror=&quot;$(&apos;#qunit-fixture button.control&apos;).trigger(&apos;click&apos;)&quot;&gt;&lt;/div&gt;"/>')
.appendTo('#qunit-fixture')
// The XSS payload above does not have a closure over this function and cannot access the assert object directly
// However, it can send a click event to the following control button, which will then fail the assert
$('<button>')
.addClass('control')
.on('click', function () {
assert.notOk(true, 'XSS payload is not executed as js')
})
.appendTo('#qunit-fixture')
// This toggle button contains XSS payload in its data-target
// Note: it uses the onerror handler of an img element to execute the js, because a simple script element does not work here
// a script element works in manual tests though, so here it is likely blocked by the qunit framework
var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div&gt;&lt;image src=&quot;missing.png&quot; onerror=&quot;$(&apos;#qunit-fixture button.control&apos;).trigger(&apos;click&apos;)&quot;&gt;&lt;/div&gt;"/>')
.appendTo('#qunit-fixture')
// The XSS payload above does not have a closure over this function and cannot access the assert object directly
// However, it can send a click event to the following control button, which will then fail the assert
$('<button>')
.addClass('control')
.on('click', function () {
assert.notOk(true, 'XSS payload is not executed as js')
})
.appendTo('#qunit-fixture')
$toggleBtn.trigger('click')
} catch (e) {
done()
}
$toggleBtn.trigger('click')
setTimeout(done, 500)
})
QUnit.test('should not try to open a modal which is already visible', function (assert) {
@@ -672,7 +669,7 @@ $(function () {
})
QUnit.test('transition duration should be the modal-dialog duration before triggering shown event', function (assert) {
assert.expect(2)
assert.expect(1)
var done = assert.async()
var style = [
'<style>',
@@ -697,22 +694,17 @@ $(function () {
'</div>'
].join('')
var beginTimestamp = 0
var $modal = $(modalHTML).appendTo('#qunit-fixture')
var $modalDialog = $('.modal-dialog')
var transitionDuration = Util.getTransitionDurationFromElement($modalDialog[0])
assert.strictEqual(transitionDuration, 300)
var expectedTransitionDuration = 300
var spy = sinon.spy(Util, 'getTransitionDurationFromElement')
$modal.on('shown.bs.modal', function () {
var diff = Date.now() - beginTimestamp
assert.ok(diff < 400)
assert.ok(spy.returned(expectedTransitionDuration))
$style.remove()
spy.restore()
done()
})
.bootstrapModal('show')
beginTimestamp = Date.now()
})
QUnit.test('should dispose modal', function (assert) {
@@ -793,4 +785,74 @@ $(function () {
})
.bootstrapModal('show')
})
QUnit.test('should scroll to top of the modal body if the modal has .modal-dialog-scrollable class', function (assert) {
assert.expect(2)
var done = assert.async()
var $modal = $([
'<div id="modal-test">',
' <div class="modal-dialog modal-dialog-scrollable">',
' <div class="modal-content">',
' <div class="modal-body" style="height: 100px; overflow-y: auto;">',
' <div style="height: 200px" />',
' </div>',
' </div>',
' </div>',
'</div>'
].join('')).appendTo('#qunit-fixture')
var $modalBody = $('.modal-body')
$modalBody.scrollTop(100)
assert.ok($modalBody.scrollTop() > 95 && $modalBody.scrollTop() <= 100)
$modal.on('shown.bs.modal', function () {
assert.strictEqual($modalBody.scrollTop(), 0, 'modal body scrollTop should be 0 when opened')
done()
})
.bootstrapModal('show')
})
QUnit.test('should set .modal\'s scroll top to 0 if .modal-dialog-scrollable and modal body do not exists', function (assert) {
assert.expect(1)
var done = assert.async()
var $modal = $([
'<div id="modal-test">',
' <div class="modal-dialog modal-dialog-scrollable">',
' <div class="modal-content">',
' </div>',
' </div>',
'</div>'
].join('')).appendTo('#qunit-fixture')
$modal.on('shown.bs.modal', function () {
assert.strictEqual($modal.scrollTop(), 0)
done()
})
.bootstrapModal('show')
})
QUnit.test('should not close modal when clicking outside of modal-content if backdrop = static', function (assert) {
assert.expect(1)
var done = assert.async()
var $modal = $('<div class="modal" data-backdrop="static"><div class="modal-dialog" /></div>').appendTo('#qunit-fixture')
$modal.on('shown.bs.modal', function () {
$modal.trigger('click')
setTimeout(function () {
var modal = $modal.data('bs.modal')
assert.strictEqual(modal._isShown, true)
done()
}, 10)
})
.on('hidden.bs.modal', function () {
assert.strictEqual(true, false, 'should not hide the modal')
})
.bootstrapModal({
backdrop: 'static'
})
})
})
+12 -4
View File
@@ -201,7 +201,9 @@ $(function () {
var done = assert.async()
var testElementIsActiveAfterScroll = function (element, target) {
var deferred = $.Deferred()
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
// add top padding to fix Chrome on Android failures
var paddingTop = 5
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top) + paddingTop
$content.one('scroll', function () {
assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
deferred.resolve()
@@ -245,7 +247,9 @@ $(function () {
var done = assert.async()
var testElementIsActiveAfterScroll = function (element, target) {
var deferred = $.Deferred()
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
// add top padding to fix Chrome on Android failures
var paddingTop = 5
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top) + paddingTop
$content.one('scroll', function () {
assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
deferred.resolve()
@@ -289,7 +293,9 @@ $(function () {
var done = assert.async()
var testElementIsActiveAfterScroll = function (element, target) {
var deferred = $.Deferred()
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
// add top padding to fix Chrome on Android failures
var paddingTop = 5
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top) + paddingTop
$content.one('scroll', function () {
assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
deferred.resolve()
@@ -604,7 +610,9 @@ $(function () {
var testElementIsActiveAfterScroll = function (element, target) {
var deferred = $.Deferred()
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
// add top padding to fix Chrome on Android failures
var paddingTop = 5
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top) + paddingTop
$content.one('scroll', function () {
assert.ok($(element).hasClass('active'), 'target:' + target + ', element: ' + element)
deferred.resolve()
+56
View File
@@ -459,4 +459,60 @@ $(function () {
})
.trigger($.Event('click'))
})
QUnit.test('should not add show class to tab panes if there is no `.fade` class', function (assert) {
assert.expect(1)
var done = assert.async()
var html = [
'<ul class="nav nav-tabs" role="tablist">',
' <li class="nav-item">',
' <a class="nav-link nav-tab" href="#home" role="tab" data-toggle="tab">Home</a>',
' </li>',
' <li class="nav-item">',
' <a id="secondNav" class="nav-link nav-tab" href="#profile" role="tab" data-toggle="tab">Profile</a>',
' </li>',
'</ul>',
'<div class="tab-content">',
' <div role="tabpanel" class="tab-pane" id="home">test 1</div>',
' <div role="tabpanel" class="tab-pane" id="profile">test 2</div>',
'</div>'
].join('')
$(html).appendTo('#qunit-fixture')
$('#secondNav').on('shown.bs.tab', function () {
assert.strictEqual($('.show').length, 0)
done()
})
.trigger($.Event('click'))
})
QUnit.test('should add show class to tab panes if there is a `.fade` class', function (assert) {
assert.expect(1)
var done = assert.async()
var html = [
'<ul class="nav nav-tabs" role="tablist">',
' <li class="nav-item">',
' <a class="nav-link nav-tab" href="#home" role="tab" data-toggle="tab">Home</a>',
' </li>',
' <li class="nav-item">',
' <a id="secondNav" class="nav-link nav-tab" href="#profile" role="tab" data-toggle="tab">Profile</a>',
' </li>',
'</ul>',
'<div class="tab-content">',
' <div role="tabpanel" class="tab-pane fade" id="home">test 1</div>',
' <div role="tabpanel" class="tab-pane fade" id="profile">test 2</div>',
'</div>'
].join('')
$(html).appendTo('#qunit-fixture')
$('#secondNav').on('shown.bs.tab', function () {
assert.strictEqual($('.show').length, 1)
done()
})
.trigger($.Event('click'))
})
})
+91
View File
@@ -236,4 +236,95 @@ $(function () {
})
.bootstrapToast('show')
})
QUnit.test('should expose default setting to allow to override them', function (assert) {
assert.expect(1)
var defaultDelay = 1000
Toast.Default.delay = defaultDelay
var toastHtml =
'<div class="toast" data-autohide="false" data-animation="false">' +
'<button type="button" class="ml-2 mb-1 close" data-dismiss="toast">' +
'close' +
'</button>' +
'</div>'
var $toast = $(toastHtml)
.bootstrapToast()
var toast = $toast.data('bs.toast')
assert.strictEqual(toast._config.delay, defaultDelay)
})
QUnit.test('should not trigger shown if show is prevented', function (assert) {
assert.expect(1)
var done = assert.async()
var toastHtml =
'<div class="toast" data-delay="1" data-autohide="false">' +
'<div class="toast-body">' +
'a simple toast' +
'</div>' +
'</div>'
var $toast = $(toastHtml)
.bootstrapToast()
.appendTo($('#qunit-fixture'))
var shownCalled = false
function assertDone() {
setTimeout(function () {
assert.strictEqual(shownCalled, false)
done()
}, 20)
}
$toast
.on('show.bs.toast', function (event) {
event.preventDefault()
assertDone()
})
.on('shown.bs.toast', function () {
shownCalled = true
})
.bootstrapToast('show')
})
QUnit.test('should not trigger hidden if hide is prevented', function (assert) {
assert.expect(1)
var done = assert.async()
var toastHtml =
'<div class="toast" data-delay="1" data-autohide="false">' +
'<div class="toast-body">' +
'a simple toast' +
'</div>' +
'</div>'
var $toast = $(toastHtml)
.bootstrapToast()
.appendTo($('#qunit-fixture'))
var hiddenCalled = false
function assertDone() {
setTimeout(function () {
assert.strictEqual(hiddenCalled, false)
done()
}, 20)
}
$toast
.on('shown.bs.toast', function () {
$toast.bootstrapToast('hide')
})
.on('hide.bs.toast', function (event) {
event.preventDefault()
assertDone()
})
.on('hidden.bs.toast', function () {
hiddenCalled = true
})
.bootstrapToast('show')
})
})
+214
View File
@@ -1069,4 +1069,218 @@ $(function () {
assert.strictEqual(tooltip._isEnabled, true)
})
QUnit.test('should create offset modifier correctly when offset option is a function', function (assert) {
assert.expect(2)
var getOffset = function (offsets) {
return offsets
}
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
offset: getOffset
})
var tooltip = $trigger.data('bs.tooltip')
var offset = tooltip._getOffset()
assert.ok(typeof offset.offset === 'undefined')
assert.ok(typeof offset.fn === 'function')
})
QUnit.test('should create offset modifier correctly when offset option is not a function', function (assert) {
assert.expect(2)
var myOffset = 42
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
offset: myOffset
})
var tooltip = $trigger.data('bs.tooltip')
var offset = tooltip._getOffset()
assert.strictEqual(offset.offset, myOffset)
assert.ok(typeof offset.fn === 'undefined')
})
QUnit.test('should disable sanitizer', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
sanitize: false
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.sanitize, false)
})
QUnit.test('should sanitize template by removing disallowed tags', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<div>',
' <script>console.log("oups script inserted")</script>',
' <span>Some content</span>',
'</div>'
].join('')
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.template.indexOf('script'), -1)
})
QUnit.test('should sanitize template by removing disallowed attributes', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<div>',
' <img src="x" onError="alert(\'test\')">Some content</img>',
'</div>'
].join('')
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.template.indexOf('onError'), -1)
})
QUnit.test('should sanitize template by removing tags with XSS', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<div>',
' <a href="javascript:alert(7)">Click me</a>',
' <span>Some content</span>',
'</div>'
].join('')
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.template.indexOf('script'), -1)
})
QUnit.test('should allow custom sanitization rules', function (assert) {
assert.expect(2)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<a href="javascript:alert(7)">Click me</a>',
'<span>Some content</span>'
].join(''),
whiteList: {
span: null
}
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.template.indexOf('<a'), -1)
assert.ok(tooltip.config.template.indexOf('span') !== -1)
})
QUnit.test('should allow passing a custom function for sanitization', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<span>Some content</span>'
].join(''),
sanitizeFn: function (input) {
return input
}
})
var tooltip = $trigger.data('bs.tooltip')
assert.ok(tooltip.config.template.indexOf('span') !== -1)
})
QUnit.test('should allow passing aria attributes', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<span aria-pressed="true">Some content</span>'
].join('')
})
var tooltip = $trigger.data('bs.tooltip')
assert.ok(tooltip.config.template.indexOf('aria-pressed') !== -1)
})
QUnit.test('should not sanitize element content', function (assert) {
assert.expect(1)
var $element = $('<div />').appendTo('#qunit-fixture')
var content = '<script>var test = 1;</script>'
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<span aria-pressed="true">Some content</span>'
].join(''),
html: true,
sanitize: false
})
var tooltip = $trigger.data('bs.tooltip')
tooltip.setElementContent($element, content)
assert.strictEqual($element[0].innerHTML, content)
})
QUnit.test('should not take into account sanitize in data attributes', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-sanitize="false" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
template: [
'<span aria-pressed="true">Some content</span>'
].join('')
})
var tooltip = $trigger.data('bs.tooltip')
assert.strictEqual(tooltip.config.sanitize, true)
})
QUnit.test('should allow to pass config to popper.js with `popperConfig`', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
popperConfig: {
placement: 'left'
}
})
var tooltip = $trigger.data('bs.tooltip')
var popperConfig = tooltip._getPopperConfig('top')
assert.strictEqual(popperConfig.placement, 'left')
})
})
+11 -7
View File
@@ -20,17 +20,16 @@ $(function () {
assert.strictEqual(Util.getSelectorFromElement($el2[0]), null)
})
QUnit.test('Util.getSelectorFromElement should throw error when there is a bad selector', function (assert) {
QUnit.test('Util.getSelectorFromElement should return null when there is a bad selector', function (assert) {
assert.expect(2)
var $el = $('<div data-target="#1"></div>').appendTo($('#qunit-fixture'))
try {
assert.ok(true, 'trying to use a bad selector')
Util.getSelectorFromElement($el[0])
} catch (e) {
assert.ok(e instanceof DOMException)
}
assert.strictEqual(Util.getSelectorFromElement($el[0]), null)
var $el2 = $('<a href="/posts"></a>').appendTo($('#qunit-fixture'))
assert.strictEqual(Util.getSelectorFromElement($el2[0]), null)
})
QUnit.test('Util.typeCheckConfig should thrown an error when a bad config is passed', function (assert) {
@@ -161,4 +160,9 @@ $(function () {
sandbox.restore()
}
})
QUnit.test('Util.jQueryDetection should detect jQuery', function (assert) {
assert.expect(0)
Util.jQueryDetection()
})
})
+1 -1
View File
@@ -51,7 +51,7 @@
</div>
</div>
<script src="../../../site/docs/4.2/assets/js/vendor/jquery-slim.min.js"></script>
<script src="../../../node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="../../dist/util.js"></script>
<script src="../../dist/alert.js"></script>
</body>
+8 -8
View File
@@ -10,7 +10,7 @@
<div class="container">
<h1>Button <small>Bootstrap Visual Test</small></h1>
<button type="button" class="btn btn-primary" data-toggle="button" aria-pressed="false" autocomplete="off">
<button type="button" class="btn btn-primary" data-toggle="button" aria-pressed="false">
Single toggle
</button>
@@ -19,13 +19,13 @@
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="checkbox" checked autocomplete="off"> Checkbox 1 (pre-checked)
<input type="checkbox" checked> Checkbox 1 (pre-checked)
</label>
<label class="btn btn-primary">
<input type="checkbox" autocomplete="off"> Checkbox 2
<input type="checkbox"> Checkbox 2
</label>
<label class="btn btn-primary">
<input type="checkbox" autocomplete="off"> Checkbox 3
<input type="checkbox"> Checkbox 3
</label>
</div>
@@ -33,18 +33,18 @@
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="options" id="option1" autocomplete="off" checked> Radio 1 (preselected)
<input type="radio" name="options" id="option1" checked> Radio 1 (preselected)
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option2" autocomplete="off"> Radio 2
<input type="radio" name="options" id="option2"> Radio 2
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option3" autocomplete="off"> Radio 3
<input type="radio" name="options" id="option3"> Radio 3
</label>
</div>
</div>
<script src="../../../site/docs/4.2/assets/js/vendor/jquery-slim.min.js"></script>
<script src="../../../node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="../../dist/util.js"></script>
<script src="../../dist/button.js"></script>
</body>
+1 -1
View File
@@ -45,7 +45,7 @@
</div>
</div>
<script src="../../../site/docs/4.2/assets/js/vendor/jquery-slim.min.js"></script>
<script src="../../../node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="../../dist/util.js"></script>
<script src="../../dist/carousel.js"></script>
<script>
+1 -1
View File
@@ -71,7 +71,7 @@
</div>
</div>
<script src="../../../site/docs/4.2/assets/js/vendor/jquery-slim.min.js"></script>
<script src="../../../node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="../../dist/util.js"></script>
<script src="../../dist/collapse.js"></script>
</body>

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