Compare commits

...

649 Commits

Author SHA1 Message Date
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
XhmikosR d50ed9a2bd Update README.md 2018-12-21 09:03:29 -08:00
Martijn Cuppens 680f40c7cb Add 4.1 to previous releases 2018-12-21 09:03:29 -08:00
XhmikosR c5bd6a11f6 Update webpack.md 2018-12-21 09:03:29 -08:00
XhmikosR 140abf4c3d Remove unneeded redirects. 2018-12-21 09:03:29 -08:00
XhmikosR 1bded2ffcd Update docs-navbar.html 2018-12-21 09:03:29 -08:00
Mark Otto eda851ee76 Prep for v4.2.0 release
- Move 4.1 docs to 4.2
- Update versions everywhere to 4.1.3 with release script
- Manually bump the shorthand version in package.json
- Add 4.2 to the versions docs page
- Update some redirects
- Fix tests asset URLs
- Bump Nuget and more
2018-12-21 09:03:29 -08:00
Florian Lacreuse 2c0cd7d2ed Remove dead link entry for translations. (#27891) 2018-12-21 17:54:40 +02:00
jess 12c4d3c248 README.md: Add Open Collective (#27864) 2018-12-18 01:23:48 +02: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
XhmikosR 1960a52889 List v3.4.0 in versions page. (#27860) 2018-12-16 20:05:29 +02:00
XhmikosR 07b4b5907b Revert "Remove now unnecessary shrink-to-fit viewport directive (#27818)" (#27855)
This reverts commit af484dc12c.
2018-12-16 16:39:48 +02:00
Florian Lacreuse 8ee2065d16 Update grid doc for consistent use of container. (#27776) 2018-12-16 14:55:46 +02:00
Martijn Cuppens dac464a5b8 Use theme-color function for colors (#27848) 2018-12-16 01:59:16 +02:00
Mark Otto ee72e7838d dist 2018-12-16 01:33:05 +02: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 ffd3402a92 Link to v3.4 docs (#27842) 2018-12-15 08:49:00 +02:00
Patrick H. Lauke af484dc12c Remove now unnecessary shrink-to-fit viewport directive (#27818)
`shrink-to-fit=no` is not needed anymore - Apple removed the need for it from iOS9.3 onwards

See https://www.scottohara.me/blog/2018/12/11/shrink-to-fit.html and https://github.com/h5bp/html5-boilerplate/issues/2102
2018-12-15 01:05:49 +00:00
ChrissBott b5b4f83cdb Fix typo in "Hiding elements" section (#27843) 2018-12-14 17:07:44 +00:00
Martijn Cuppens 502b6c8ed6 Remove redundant brackets (#27768) 2018-12-14 17:54:44 +01:00
Florian Lacreuse 1dc42a3373 Add missing parameter to grid mixins. (#27841) 2018-12-14 18:30:12 +02:00
Gijs Boddeus 26c5595164 Custom switch form control gutter fix (#27837) 2018-12-14 16:22:19 +02:00
Gijs Boddeus c618f67187 Actual gutter definition (#27797) 2018-12-14 03:04:10 +02:00
Johann-S af60644d2f integration test to be sure bootstrap can be bundled 2018-12-14 02:08:18 +02:00
XhmikosR db31ee1ea2 Remove the unused gcp-key.json.enc file. 2018-12-14 00:54:20 +02:00
XhmikosR a074cb66d7 Make use of the package.json version_short property more. 2018-12-14 00:34:38 +02:00
Patrick H. Lauke c031584bcd SVG accessibility fixes (#27826)
* SVG accessibility fixes

- add `focusable="false"` to all SVGs, to stop IE from including the `<svg>` in its default focus cycle
- completely hide decorative SVGs using `aria-hidden="true"`
- add `role="img"` to meaningful/"content" SVGs, ensure they have an appropriate `<title>` and/or `aria-label`
- simplify placeholder default title

* Simplify usage of placeholder.svg in the docs

- in most cases, no need for separate/redundant text and title (now that we make text itself part of the alternative text explicitly)
- no need (expect in rare cirumstances) to describe the placeholder image (unless the look of the image is important/the actual content, as is the case with the image thumbnail class)

* Simplify example.html rewriting of <svg> to <img> code sample

- as the `alt` for the placeholder isn't really important, just add an ellipsis instead (otherwise, to be correct, we'd have to construct the whole "title+text" construct like we do now in the
placeholder.svg itself

* Change svgo configuration to retain role attribute and add/force focusable=false

- regarding `focusable=false`, see https://github.com/svg/svgo/issues/1011 (which would be the "proper" SVGO fix) and the (hacky) solution https://github.com/svg/svgo/pull/817
2018-12-13 13:09:47 +00:00
Patrick H. Lauke 375d137561 Docs: add note about the grays being "cool" (#27824) 2018-12-12 21:55:20 +02:00
Patrick H. Lauke f3fc973dd9 Remove now unnecessary -ms-viewport and -ms-overflow-style directives (#27789)
Edge/Mobile appears to have moved support for `-ms-viewport` behind a flag at some point, instead supporting meta viewport directives.
Removing this altogether also fixes issues in IE11 on high-dpi displays - see https://github.com/twbs/bootstrap/issues/21780
2018-12-12 21:24:47 +02:00
Gijs Boddeus 180a06eeb7 Add switch custom form control (#23004) 2018-12-12 15:28:25 +02:00
Martijn Cuppens dbadf24bb3 Fix margin above toast when previous toast is hidden (#27820) 2018-12-12 14:23:10 +01:00
unaccomplished 0a55c7a8f6 Update Scrollspy doc to include missing method options (#27754) 2018-12-11 10:27:04 +02:00
XhmikosR 3100a3a95e Update bs-custom-file-input to v1.3.1. 2018-12-10 17:19:30 +02:00
XhmikosR 60eeef5ddc Update clipboard.js to v2.0.4. 2018-12-10 17:19:30 +02:00
XhmikosR 10d4e7f43d Update glyphicons URL. 2018-12-10 12:27:27 +02:00
Johann-S 1f4d7903db fix fade animation for toast 2018-12-10 10:38:11 +01:00
Mike Vastola fc15c4c4ce Change button checkbox/radios to ignore hidden input fields (#27802) 2018-12-10 10:40:08 +02:00
XhmikosR 385ce1c961 Update devDependencies. (#27806) 2018-12-10 10:34:30 +02:00
Patrick H. Lauke c70b043a76 Remove nonsensical boolean check (#27787)
...as it always evaluates to true
2018-12-06 13:30:12 +02:00
Johann-S fa03289d13 avoid console call in our unit tests (#27790) 2018-12-06 10:51:35 +02:00
XhmikosR 947f749e23 Update devDependencies. (#27764) 2018-12-06 08:34:35 +02:00
Gijs Rogé 3fbbe1bd35 Replaced fixed 'bolder' font weight value in reboot with variable. (#27782)
The default font weight value for <strong> <br> in reboot was
set by a fixed value we now use the variable $font-weight-bolder
to let users override this value.
2018-12-06 08:21:18 +02:00
Patrick H. Lauke 903e242650 Make disabled link in card examples non-focusable and add aria-disabled (#27788) 2018-12-06 08:16:22 +02:00
Patrick H. Lauke 6c00dd08bc Add aria-modal to modals (#27780)
Dynamically set/remove `aria-modal="true"` when a modal is shown/hidden
2018-12-05 20:58:09 +02:00
Jacob Müller 8fb6e84fa0 Make form grid gutter width configurable (#27766) 2018-12-05 17:15:24 +02:00
Johann-S b16127fc10 Allow Tooltips/Popovers to work in shadow DOM 2018-12-05 16:02:59 +01:00
Shohei Yoshida 850d99bb13 Add quotes according to the stylelint rule (#27771) 2018-12-05 12:40:59 +01:00
Johann-S 37f74c7070 fix regression about using element for tooltip container option 2018-12-05 10:57:02 +01: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
acidrums4 1a171b80ab Remove double 'the' in comment (#27767) 2018-12-04 20:14:23 +01:00
Shohei Yoshida e9ec5e7392 spinners: use .sr-only instead of text-hide technique (#27736) 2018-12-04 08:02:49 +02:00
XhmikosR a2d0e78b44 Update contents.md 2018-11-29 10:59:06 +02:00
XhmikosR 8d81226a8e Remove no_toc_section. 2018-11-28 21:09:50 +02:00
XhmikosR 24eb9a75e9 Revert "Use h5 for callouts so that they are not included in ToC."
This reverts commit 11da160114.

This is no longer needed with jekyll-toc 0.9.1.
2018-11-28 21:09:50 +02:00
toshimaru 0b96d62fb3 Configure multiple no_toc_section classes 2018-11-28 21:09:50 +02:00
XhmikosR 698ccb4923 Update jekyll-toc to v0.9.1. 2018-11-28 21:09:50 +02:00
XhmikosR 8bfabdd1dc .eslintignore: Remove unneeded entry. 2018-11-28 14:33:29 +02:00
XhmikosR 7492c12089 Remove unneeded ESLint config file.
We have /site/.eslintrc.json that covers this.
2018-11-28 14:33:29 +02:00
XhmikosR 05dfae3146 Revert "build/*.js: set sourceType to module."
This reverts commit b442ce3130.
2018-11-28 14:33:29 +02:00
XhmikosR 11da160114 Use h5 for callouts so that they are not included in ToC.
Callouts are already excluded from ToC, but due to a limitation in jekyll-toc they are still being included.

We should revisit this if the bug is fixed later.
2018-11-27 16:01:07 +02:00
XhmikosR cb2b21bb88 Inline bootstrap-stack.svg.
It's pretty small compressed; a little less than 1 KB with gzip.
2018-11-27 15:37:24 +02:00
XhmikosR 89876a5559 Use an SVG for the stack image.
Image by @mdo.
2018-11-27 15:37:24 +02:00
XhmikosR b4f7b34b1e Move examples images in assets/img/examples/ folder. 2018-11-27 15:37:24 +02:00
XhmikosR 4ad19f6f52 Use srcset for examples too. 2018-11-27 15:37:24 +02:00
XhmikosR d5279bf18c homepage: use srcset.
This should reduce the amount of bytes for non-2x displays.
2018-11-27 15:37:24 +02:00
Christian Oliff fcfa436a31 Update migration page to indicate the info can be used for 4.1.x as well as 4.0.x 2018-11-26 22:46:09 +02:00
XhmikosR 7b274d358b Update package-lock.json. 2018-11-26 22:22:05 +02:00
Christian Oliff 7a907ae09e Change OS X to macOS in Sass comments (#27729)
It's been macOS for 3 years now and we use just 'macOS' elsewhere in the Bootstrap documentation.
https://en.wikipedia.org/wiki/MacOS
2018-11-26 14:57:33 +00:00
Johann-S 32ab52ba2e Add test to make sure we enforce focus on modal (#27723) 2018-11-25 18:20:55 +02:00
XhmikosR 72bd3f5930 ship.sh: add missing period. 2018-11-25 14:50:32 +02:00
ysds 9f08f7dea6 Grow button width to the parent button group (#27717) 2018-11-25 12:05:31 +01:00
XhmikosR 5c336d0247 Dist 2018-11-25 11:46:37 +02:00
XhmikosR fdc5c1f49a Update devDependencies. 2018-11-25 11:46:37 +02:00
m5o c9157be574 prevent text selection for floating labels example (#27719)
* prevent text selection for floating labels
  * expand the click target by no selecting the label text
* use `pointer-events: none;` instead of `user-select`
  * thx @MartijnCuppens
2018-11-24 13:25:18 +01:00
Martijn Cuppens 28a972ac9f Add opacity transition 2018-11-23 15:28:39 +02:00
XhmikosR 0c60257114 Revert "Replace anchor.js with jekyll-anchor-headings."
This reverts commit b04f97f60b.
2018-11-23 15:28:39 +02:00
ysds 0140552322 Fix body scrolling issue when modal open (#27698) 2018-11-23 13:41:42 +01:00
Pixelastic 3e25bf403a Update DocSearch.js to latest version
The latest (2.6.2) docsearch.js version now displays results as standard `<a href>` links, allowing users to `ctrl`-click on them to trigger default browser behavior of opening in a new tab.

To maintain backward compatibility, this behavior has only been enabled to users that didn't define their own `handleSelected` method.

This PR updates your `docsearch()` code to take advantage of the new `<a href>` template, by removing your custom `handleSelected` and moving its behavior to the `transformData` call. Namely, what you wanted to avoid was jumping to the first `<h1>` of the pages, which would prevent users from seeing the header. This PR checks if the suggestion targets the `#content` anchor (meaning it goes to this first `<h1>`) and remove it.

Behavior should be the same, but at least now you can enjoy the `ctrl`-click :)
2018-11-22 17:38:27 +02:00
XhmikosR 8a7ed6047b Update devDependencies. 2018-11-22 11:15:21 +02:00
ysds b6e616a70f Fixed a fixed height issue of input-group size option (#27687) 2018-11-22 10:29:33 +02:00
Roy Klutman e7e43edf65 Add border-radius to dropdown items (#27703) 2018-11-22 00:24:13 +02:00
m5o 31d6d03c47 Placeholders: use our gray colors (#27701)
Previously we were using the old holder.js colors.
2018-11-21 20:59:21 +02:00
Martijn Cuppens 58943c0257 Sass precision documentation (#27705) 2018-11-21 20:51:47 +02:00
XhmikosR 73a98d9738 reboot: Fix mailto address (#27700) 2018-11-21 15:24:38 +02:00
XhmikosR 487bd521e3 docs: fix path to assets. (#27696) 2018-11-21 15:11:31 +02:00
Martijn Cuppens c628921465 Use wrapping span instead of div (#27695) 2018-11-20 21:53:10 +02:00
XhmikosR 749c8230c7 docs-sidebar.html: remove commented out code.
Leftover from old times.
2018-11-20 21:31:28 +02:00
XhmikosR d9717d1945 Reindent. 2018-11-20 21:31:28 +02:00
XhmikosR 2b9af5e38c Remove holder.js. 2018-11-20 21:31:28 +02:00
XhmikosR 369f03fbc5 Use the new include in examples too. 2018-11-20 21:31:28 +02:00
m5o 6163533d84 Fix placeholder image replacement. 2018-11-20 21:31:28 +02:00
XhmikosR 2ac3db8384 Tweak placeholder.svg.
* always include the title
* make it possible to skip adding the title by passing `title=' '`
* remove viewBox since we don't need it
2018-11-20 21:31:28 +02:00
Martijn Cuppens 072b5ab7fd Replace holder.js with SVGs. 2018-11-20 21:31:28 +02:00
XhmikosR b04f97f60b Replace anchor.js with jekyll-anchor-headings.
This allows us to generate the anchor links on build time.

https://github.com/allejo/jekyll-anchor-headings
2018-11-20 11:47:10 +02:00
XhmikosR 8470c5f78c Remove sudo from Travis config. (#27693)
https://blog.travis-ci.com/2018-11-19-required-linux-infrastructure-migration
2018-11-20 11:36:37 +02:00
Tieson Trowbridge ab183384ee Allows both OL and UL lists for tab buttons 2018-11-20 09:58:04 +01:00
ysds 7c8cd0f272 Add documentation about .text-decoration-none (#27686) 2018-11-20 09:08:34 +02:00
ysds 1fe56358e7 Add documentation about viewport sizing utilities (#27688) 2018-11-19 18:44:08 +01:00
ysds 38ca58bf3c Add documentation about .font-weight-bolder/lighter (#27678) 2018-11-18 10:15:49 +02:00
Martijn Cuppens 3f422bfc88 Prevent text decoration skip inc and reorder comments (#27673) 2018-11-18 10:09:41 +02:00
Martijn Cuppens 12ae122eda Spinners cleanup 2018-11-17 20:34:58 -08:00
ysds 5042b3c93d Support custom-select sizing in input-group (#27677) 2018-11-17 14:10:38 +02:00
Christian Oliff 4734a926e9 Enforce lowercase class name in .stylelintrc (#27668) 2018-11-17 14:01:16 +02:00
Martijn Cuppens 75526bf2d0 Inherit card header color (#27681) 2018-11-17 10:16:16 +01:00
XhmikosR 53d279b934 Update devDependencies and gems. 2018-11-16 08:59:37 +02:00
Iurii Kucherov f83f4ae124 Update autoprefixer link to .browserslistrc file (#27675) 2018-11-16 08:44:52 +02:00
XhmikosR ea4db3f89d Use fancy apostrophe in HTML files.
For Markdown files, this isn't needed because the Markdown converter takes care of this.
2018-11-15 15:55:21 +02:00
Johann-S 9201a80510 some cleaning and changes for readability 2018-11-14 10:54:50 +01:00
Martijn Cuppens fab1dea927 Keep input group & form label font size in sync with form control font size (#27663) 2018-11-13 21:11:59 +01:00
XhmikosR fceee8d093 Dist 2018-11-13 08:47:32 +02:00
Mark Otto 220baef0d9 Clean up some docs for toasts
- Add headings to examples section
- Clarify styles and customization options in examples
- Add dismiss buttons to all toasts
- Missing period added for consistency
- Update roles, tweak text
2018-11-13 08:47:32 +02:00
Mark Otto ab40a2b919 Nest the .toast.show and use display: block; as inherit causes broken styles 2018-11-13 08:47:32 +02:00
Laussel LOïc dc07e8dca8 Update toast documentation following pull #27155
Also remove close button everywhere just let it when autohide is set to false
2018-11-13 08:47:32 +02:00
Johann-S 557d5ac74d Remove the show delay for our toast plugin 2018-11-13 08:47:32 +02:00
Laussel Loïc 4cac833447 Implement data-dismiss="toast" to allow user to interact itself with the component (#27155) 2018-11-13 08:47:32 +02:00
Johann-S 2f81ab007c Fix toast documentation page. 2018-11-13 08:47:32 +02:00
Johann-S 16cf76ff1a Create toast JS plugin, add unit tests. 2018-11-13 08:47:32 +02:00
Mark Otto d0652a1be9 Add new toasts component 2018-11-13 08:47:32 +02:00
Martijn Cuppens 696c4078d1 Customize browse text of the custom file input with HTML (#27651) 2018-11-13 08:30:17 +02:00
XhmikosR dafb498f75 Spinners: show all color variants. 2018-11-13 08:21:57 +02:00
XhmikosR 5afc708961 Bump bootstrap.min.css bundle size. 2018-11-13 08:21:57 +02:00
XhmikosR e9d67982ae spinners: use the animation shorthand property. 2018-11-13 08:21:57 +02:00
Mark Otto 52a86cc671 Add Bootstrap's very first spinners omfg it's actually happening 2018-11-13 08:21:57 +02:00
XhmikosR f3bd8602df Jekyll: Add wdm gem for Windows. (#27658) 2018-11-12 21:23:53 +02:00
Christian Oliff 75e6253b0a Update clipboard.js to v2.0.3 (#27657) 2018-11-12 18:46:21 +02:00
XhmikosR 110c7f4cc0 Replace data-src with src="..." in docs. (#27649) 2018-11-11 14:45:48 +02:00
Patrick H. Lauke e6a356a3ae Minor/Docs: tweak accordion example heading level (#27620) 2018-11-11 09:12:29 +00:00
Martijn Cuppens 976efcd5ee Allow to add more embed responsive ratios (#25894) 2018-11-11 11:04:04 +02:00
XhmikosR 9836a411e8 Redirect /extend/ to /extend/approach/. 2018-11-11 10:59:43 +02:00
Martijn Cuppens 6cb6e6510c Remove custom properties from examples so that they work in IE (#27634) 2018-11-11 10:52:06 +02:00
jvitela 731f95bded Fix modal positioning on Android.
When the address bar is hidden, sometimes the visual position of the controls is out of sync with its logical position.
2018-11-11 10:44:26 +02:00
XhmikosR bbe2b2349d Dashboard example: update 3rd-party libs and use the same CDN. 2018-11-09 15:02:42 +02:00
XhmikosR 807c1b6d06 Add an examples layout.
Reduces duplication and makes maintenance easier.
2018-11-09 15:02:42 +02:00
XhmikosR e1b5b4f989 Move analytics to an include file. 2018-11-09 15:02:42 +02:00
XhmikosR a933f076f4 Move stylesheets to an include. 2018-11-09 15:02:42 +02:00
Johann-S 1fdc7819cd use bsCustomFileInput in our docs (#27631) 2018-11-08 17:22:45 +02:00
sts-ryan-holton 2df2cdd33d Wrap checkboxes in .form-group (#27624) 2018-11-07 21:54:40 +01:00
ysds 8de915eded Docs: Improve accessibility of disabled link example (#27614)
Add `tabindex="-1"` and `aria-disabled="true"` to disabled link
2018-11-06 10:47:59 +02:00
Johann-S e5d9e0a06c display chrome version on travis 2018-11-05 22:29:25 +02:00
XhmikosR 195404b106 Travis: Add back chrome addon (#27610) 2018-11-05 22:29:25 +02:00
XhmikosR ea697555d5 Travis: exit pipeline if test fails. 2018-11-05 21:35:59 +02:00
Martijn Cuppens 6e10ac276e Increase readability card columns docs (#27609) 2018-11-05 21:08:13 +02:00
sts-ryan-holton 89eef046ef Add new .rounded-pill utility (#27339) 2018-11-05 19:19:00 +02:00
XhmikosR 5c03f23f85 Reorganize npm scripts. 2018-11-05 19:06:39 +02:00
Martijn Cuppens b33d0d3790 Prevent white line in Firefox (regression) (#27594) 2018-11-05 18:56:41 +02:00
XhmikosR e3abb8e4dd Remove htmllint. (#27603)
We use the official HTML validator for HTML validation, and we don't really use any of the htmllint features.
2018-11-05 18:42:05 +02:00
LittleHuba aa098991bf Add Noto Sans to the font stack (#27596)
Fixes #27595
2018-11-05 08:22:40 +02:00
okazou cb5c80124a Add japanese to translations (#27599) 2018-11-05 08:15:04 +02:00
Arvind S 042042a48a Made the disabled state for nav more obvious. (#27382) 2018-11-04 22:17:14 +02:00
ysds 4a1090ac48 Ligthen/Darken Button focus shadow color 2018-11-04 20:58:00 +02:00
XhmikosR e0eb39f519 Update README.md (#27588)
* remove jobs link
* specify a link in the BrowserStack image
2018-11-04 20:49:31 +02:00
XhmikosR 15fa1566cd Update devDependencies and gems. 2018-11-04 16:02:35 +02:00
Martijn Cuppens b67c6fb435 Use a badge for .text-wrap example 2018-11-04 15:55:17 +02:00
XhmikosR 366bc88523 Add text-wrap example. 2018-11-04 15:55:17 +02:00
Andrew cbc859ad8d Add .text-wrap class.
this is the opposite of `.text-nowrap`, and a forces elements to wrap onto new lines.

One use case for this is extra long button text. Bootstrap buttons by default do no wrap, so this class could be used to override that behavior.
2018-11-04 15:55:17 +02:00
XhmikosR 497766a3a6 Travis: stop using a separate stage for Browser tests.
This should be faster.
2018-11-04 15:40:09 +02:00
XhmikosR ca47a21b70 broken-link-checker: force follow links.
After 3256a2c, blc honored robots.txt thus it didn't crawl anything.
Ignore robots.txt to work around the issue.
2018-11-04 15:32:59 +02:00
patrickhlauke c46a0c7e88 Replace touch-action: none with pan-y, remove preventDefault from touch event handling 2018-11-04 14:40:19 +02:00
XhmikosR 9cc237d0ba scss/_custom-forms.scss: fix typo in comment. 2018-11-04 12:17:56 +02:00
ysds ea8f6c6ff3 Button group refactoring and fixes (#25395) 2018-11-04 08:50:21 +02:00
XhmikosR d27509688d Jekyll: switch to localhost
`0.0.0.0` has issues on Windows.
2018-11-04 08:33:30 +02:00
Vincent Langlet 793b83fda8 Avoid null value (#27570) 2018-11-04 08:18:56 +02:00
Martijn Cuppens 38e9e2b82c Add TODO 2018-11-04 08:13:31 +02:00
Varunram a31468cf84 Resolve #26226: Sync with normalize 8.0.0
diff credits: @client9
2018-11-04 08:13:31 +02:00
XhmikosR eeea8b5ed3 docs: remove false info from v3 suggestion. 2018-11-03 21:59:11 +02:00
Patrick H. Lauke 8b20bce873 Add Sass variable for prefers-reduced-motion, add callout to affected components (#27581)
* Tweak the accessibility/reduced motion text

include mention of carousel slides, remove the (now inaccurate, as Firefox 63 includes it too) mention that support is limited to Safari/macOS

xref https://github.com/twbs/bootstrap/issues/27525

* Add new callout for reduced motion

* Add variable to control prefers-reduced-motion media query support

* Add callout about prefers-reduced-motion to all components currently using animation which are affected
2018-11-03 19:23:26 +01:00
Johann-S f7a4b39767 handle detached tooltip when we try to hide a modal 2018-11-02 13:39:58 +01:00
XhmikosR e0d1f3f18b Remove the obsolete tooltip-viewport example and redirect it. 2018-11-02 12:55:28 +02:00
XhmikosR 3256a2c231 robots.txt: disallow crawling when not in production. (#27559) 2018-11-02 12:41:57 +02:00
Sebastian Hädrich 4b15ec9cad Make meaning of tooltip's selector option clearer (#27573) 2018-11-01 15:05:02 +02:00
ysds 2ffa1bff6e Fix empty custom-control-label alignment issue (#27566) 2018-10-31 09:49:52 +02:00
Martijn Cuppens 96b49d7833 Fix Edge bounce and restore original transition easing (#27279) 2018-10-31 09:45:39 +02:00
Johann-S f20e46e2da Add @MartijnCuppens to our core team ! 🎉 (#27562) 2018-10-30 19:47:25 +02:00
ysds eb5d0b49dc Prevent hover/click on disabled .close links. 2018-10-30 18:25:14 +01:00
Martijn Cuppens 273861f145 IE10 homepage fix 2018-10-30 18:16:19 +02:00
Johann-S cebdfb9090 fix dispose modal unit test 2018-10-30 16:59:24 +01:00
Andrew Luca bd2851938a test(Modal): check if modal is disposed 2018-10-30 16:28:32 +01:00
Andrew Luca 65dc8c9070 refactor(Modal): add _isTransitioning default value
Having variables initialised from start `_isTransitioning` is better.
Would be better to add an eslint rule to check for undeclared variables use.
Reordered enter checks for `show` and `hide` by priority.
2018-10-30 16:28:32 +01:00
XhmikosR 2b21657cd4 Remove trailing space. 2018-10-30 15:44:41 +02:00
XhmikosR 40e560aa12 docs: remove Webpack version reference. 2018-10-30 15:44:41 +02:00
XhmikosR 02df7cd0d2 Fix util tests on IE 10 (#27556) 2018-10-30 15:29:04 +02:00
Matheus Rocha Vieira 77ff5e8e42 download page: add Yarn (#27544) 2018-10-30 11:27:13 +02:00
Martijn Cuppens e0fa9a812c #27502: Prevent active state border change 2018-10-30 09:06:25 +02:00
Martijn Cuppens 5aed968750 Prevent the background to be shown when transitioning 2018-10-30 08:57:02 +02:00
XhmikosR 5e6b53a7c0 Update Travis CI config.
Only run `coveralls` and `check-broken-links` tasks when we run the Test phase.
2018-10-29 16:04:22 +02:00
Johann-S 2868f07240 update our coverage required for branches and functions 2018-10-29 14:49:29 +01:00
Johann-S 91f8077ed5 add unit tests for our carousel 2018-10-29 14:49:29 +01:00
XhmikosR bb0d6bf178 Update devDependencies and gems. 2018-10-29 15:40:20 +02:00
Johann-S 2c2d04aba5 add unit test to test tabs can be removed without throwing error 2018-10-29 14:01:03 +01:00
dercodercom a282c22fc7 Update tab.js
I'm using Tab.js with remove function and get an error "TypeError: container is undefined [more info]", with this check the error is fixed.
2018-10-29 14:01:03 +01:00
Martijn Cuppens fff9e17d7e Delete sache.json (#27530) 2018-10-29 13:35:26 +02:00
Martijn Cuppens 45610a0f39 fix tab fade out (#27533) 2018-10-29 09:54:45 +01:00
Johann-S ffc8d507c7 calculate modal transition duration based on modal-dialog element 2018-10-28 23:59:17 +02:00
Ng Yik Phang 47ef0a877e Improve pagination's documentation accessibility.
- Remove `.sr-only` span for previous/next page, there is already`aria-label`
- Add `aria-disabled="true"` and `aria-current="page"`
2018-10-23 06:21:57 +03:00
ItaloBC 557f3fe100 Added Viewport Height & Width helpers
This allows the user to make a container (ideally) to use viewport height and width and allow better vertical/horizontal alignments of elements.
2018-10-23 06:04:08 +03:00
Martijn Cuppens 1c91f48251 Variable darken percentage for emphasized links 2018-10-23 05:58:19 +03:00
Caíque de Castro Soares da Silva ff40e00323 Fix readonly-plain-text with button addon (#25871)
Fixes #25870
2018-10-23 05:53:38 +03:00
Mitko Georgiev ee1daf090a Easy merging of new grid breakpoints and containers (#26714)
This change follows exactly what was done for the `$grays`, `$colors`, and `$theme-colors` lists in #23260. This allows for easy addition of new breakpoints or grid containers also.
2018-10-23 05:48:44 +03:00
Martijn Cuppens dd539094ea Custom select validation padding fix and additional custom select feedback icon variables 2018-10-23 05:43:59 +03:00
Martijn Cuppens d0b7eb1111 Cleanup stylelint comments 2018-10-23 00:21:33 +03:00
XhmikosR 807e8fe4a2 Further ToC fixes. 2018-10-22 21:57:25 +03:00
XhmikosR 0c56f054a5 Remove unneeded check.
Leftover from after 43c20b9.
2018-10-22 09:24:36 +03:00
XhmikosR d48f03b050 Use the example shortcode in more places.
Now that we don't have the ToC issue with the examples' headers in ToC, we can safely do this.no_toc_section_class
2018-10-22 09:24:36 +03:00
Martijn Cuppens 00860f02d4 Disallow transition property (use mixin instead) 2018-10-21 22:46:20 +03:00
Johan Beckers 09aca3fb9a Unitless breakpoints
If I want to customise the breakpoints using `em`, I get compatibility errors.

It is good practice to set breakpoints in `em` instead of `px` when users use browser scaling.
See https://zellwk.com/blog/media-query-units/#concluding-the-experiments for more information why someone would like to do this. Only Safari users can get annoyed: https://adamwathan.me/dont-use-em-for-media-queries/

In any case, using a unitless number at line 42 would be very convenient.
2018-10-21 21:31:28 +03:00
XhmikosR 9ed0b318b9 Update devDependencies and gems. 2018-10-21 19:11:20 +03:00
Nicolay Hvidsten 345f26a667 Change erroneous documentation for .flex-fill (#27265)
The current documentation for .flex-fill indicated that the flex
items would have equal widths, regardless of content. This update
ensures that the documentation reflects the fact that the width
of the flex items depends on their actual content.
2018-10-21 18:54:09 +03:00
Andrew Luca 1f1308ba22 test(Modal): reuse _getScrollbarWidth in tests 2018-10-21 17:45:02 +02:00
XhmikosR ff9b195da7 Revert "Simplify .gitattributes."
This reverts commit 1c78f703e0.

Unfortunately some Linux distros use an ancient git version and this change requires git >= 2.10.
2018-10-21 18:33:28 +03:00
Martijn Cuppens 44ddabad4b Simplify theme color usage (#27378) 2018-10-21 17:39:23 +03:00
XhmikosR 0a3755b30a Fix typo in the Popper.js checks. (#27488) 2018-10-21 11:51:20 +03:00
Andrew Pucci d13ae1fc1a Card header color theming (#26573)
Define new variable for card header color
2018-10-21 11:05:54 +03:00
ysds becb6ce346 Add dropdown responsive alignment (#26255) 2018-10-21 11:01:22 +03:00
ysds 6bae9ef786 Example dashboard: Responsive padding-top of the main content (#26332) 2018-10-21 10:56:53 +03:00
Martijn Cuppens 49ca910667 Improve Grid examples. (#26808)
Removes the grid.css file of the grid example and makes use of utility classes
2018-10-21 10:52:13 +03:00
Andrey 3075432584 feature/yiq function, add parameters, with default values. (#26917) 2018-10-21 10:33:53 +03:00
Martijn Cuppens e2014e8ed7 Custom checkboxes and radios retheming (#27064) 2018-10-21 10:25:07 +03:00
Martijn Cuppens c9a43b027a Re-add carousel control transition (#27277) 2018-10-21 10:13:35 +03:00
Doug Puchalski 59f1802e98 Outline button variant hover mixin (#27289)
The outline button variant mixin should use the hover mixin, as does the non-outline version.
2018-10-21 10:09:08 +03:00
midzer 50d866da24 optimize data URIs (#27284) 2018-10-21 10:03:17 +03:00
Martijn Cuppens 2a28c7d9fd Carousel fade cleanup (#27278) 2018-10-21 09:55:43 +03:00
Roy Klutman fccdda5448 Fix for double border on cards in an accordion (#27133) 2018-10-21 09:49:05 +03:00
XhmikosR bc2a98522d webpack page: Remove precss reference 2018-10-20 23:07:48 +03:00
719media 2c1a743cc9 Update _custom-forms.scss (#27276)
user-select has no effect on before/after pseudo elements
2018-10-20 22:35:56 +03:00
andresgalante 86822d93d6 changes the variables for input font size 2018-10-20 22:29:24 +03:00
Ian Walter 871a51a548 Fix #26372: disabled btn hover issue (#27407)
When gradients are enabled there is still a hover state on disabled
buttons since the hover rules apply to background-image and disabled
rules apply to background-color. This applies the logic already present
in dropdowns to buttons. This fix was originally proposed by @ysds.
2018-10-20 22:12:33 +03:00
semenyakNik c5eb6043d8 Custom select inconsistent padding (#27415) 2018-10-20 22:00:48 +03:00
Martijn Cuppens 7190c38e4c Remove redundant width and height properties 2018-10-20 21:46:53 +03:00
XhmikosR 700f74cebd Make use of jekyll-toc's no_toc_section class.
Requires jekyll-toc v0.8.0.
2018-10-20 21:39:53 +03:00
XhmikosR 79db264910 package.json: add version_short and use it in the npm scripts. 2018-10-20 21:17:50 +03:00
XhmikosR 242f19897d Clean up docs Sass code.
* remove unused rules
* use Sass nesting in more places
* use the core mixins in more places
* use the color variables more
2018-10-20 21:08:37 +03:00
XhmikosR d08607c080 Unregister Service Worker. 2018-10-20 16:00:28 +03:00
Mark Otto 5bf37eba53 Remove service worker 2018-10-20 16:00:28 +03:00
Johann-S b1dc6b324c avoid drag img 2018-10-20 15:32:09 +03:00
patrickhlauke 8883ccb205 Set touch-action to "none"
Firefox currently seems extremely fickle - with `pan-y` if fires pointercancel as soon as a touch strays even a pixel or so vertically.
While `touch-action: pan-y` would be ideal (allowing users to scroll the page even when their finger started the scroll on the carousel), this prevents a swipe that isn't perfectly/only horizontal to be recognised by Firefox.
2018-10-20 15:32:09 +03:00
patrickhlauke 9164f77269 Refactor (and correct) start/move/end functions
in particular, no need to use originEvent, and preventDefault() only needed for touch events
2018-10-20 15:32:09 +03:00
patrickhlauke 39ae077837 Remove unnecessary pointer event listeners
these may also be the cause of weird behavior in Chrome/Surface, where scrolling vertically triggers slide advance
2018-10-20 15:32:09 +03:00
patrickhlauke 6be7293a85 Abandon swipe altogether if more than one touch detected 2018-10-20 15:32:09 +03:00
patrickhlauke 7b8f01d839 Use correct touch-action values
- my fault, my original advice of using `touch-action: pan-x` is exactly the value we *don't* want to have the browser handle...
2018-10-20 15:32:09 +03:00
Johann-S 735c374e9c use pointer events if available 2018-10-20 15:32:09 +03:00
Johann-S c08652cfe8 swipe left/right without hammerjs 2018-10-20 15:32:09 +03:00
Johann-S caefd70463 Add touch support in our carousel with HammerJS. 2018-10-20 15:32:09 +03:00
Christian Oliff bf57389647 Add query string to the start_url to track how often app is launched
Useful suggestion from Google in the Web App Manifest documentation.
https://developers.google.com/web/fundamentals/web-app-manifest/#start-url
2018-10-20 14:58:37 +03:00
galczo5 6cbcd03efb Add show and hide methods to dropdown (#27370) 2018-10-20 14:27:51 +03:00
Andres Galante 5088f02730 Add font weight options for form controls and custom select (#27343) 2018-10-20 11:50:20 +03:00
Bastien a86aef0ae0 table: Add border color relative to theme for accessibility (#25755) 2018-10-20 11:21:31 +03:00
XhmikosR 282b77ee9c docs search: take into account the current URL. 2018-10-19 22:09:50 +03:00
Catalin Zalog a16ffc7ba1 feat: keep contrast on .table-dark
In case we set `$body-bg` to a dark color, we have to keep table contrast relevant.
2018-10-19 13:01:38 +03:00
namiltd 1231e1d6bc Fix size of modal dialogs at different widths (#27094) 2018-10-19 12:56:46 +03:00
Roy Klutman 5a1588ed33 Fix double border on list-group (#27126) 2018-10-19 12:01:36 +03:00
chocolateboy ef32979222 Fix doc typo 2018-10-19 11:36:18 +03:00
XhmikosR 5d834e0510 Travis: stop installing chrome (#27468)
It seems it works without it.
2018-10-18 11:56:55 +03:00
XhmikosR 43bf268248 Rename docs production script to production and use JEKYLL_ENV. (#27410) 2018-10-18 10:45:49 +03:00
XhmikosR 99e0e30402 Move lint scripts outside of the main scripts.
This allows us to run `npm run dist` without tests.
2018-10-18 10:05:19 +03:00
XhmikosR f6a39e39c8 npm release-zip: remove the folder before zipping. 2018-10-18 10:05:19 +03:00
Martijn Cuppens a6669b478b Fix btn focus color (#27178) 2018-10-17 23:21:33 +03:00
Helmut Granda ef27179c18 Delete callout-info-content-iamge-overlay-overflow.md
Deleting external file since it is not needed, the copy of this file will be added directly to card.md.
2018-10-17 23:15:01 +03:00
Helmut Granda 34c7b07f7f Adding call out note directly to the page.
Instead of using an external source since this is only a one time note it is safe to be placed within the document itself.
2018-10-17 23:15:01 +03:00
Helmut Granda 42006e7b17 Adds a note about the limitations on content being larger than the image.
In the event that the content is larger than the image, the content will continue to be displayed outside the image itself. There are some workarounds but they apply only to browsers that support this option and IE11 is not one of them.
2018-10-17 23:15:01 +03:00
Martijn Cuppens 832a90d9d3 Move media from layout to components 2018-10-17 22:45:54 +03:00
XhmikosR 1c78f703e0 Simplify .gitattributes. 2018-10-17 12:23:01 +03:00
Mark Otto 8cf0fe2ee0 Add a CODEOWNERS file (#27271) 2018-10-15 16:17:42 +03:00
XhmikosR 29f849879b Move docs .eslintrc in site/. 2018-10-15 16:03:16 +03:00
XhmikosR 18ff70c248 Update devDependencies and gems. 2018-10-15 14:52:22 +03:00
XhmikosR 3574af5231 Include css-copy in the css script. 2018-10-15 14:31:42 +03:00
Martijn Cuppens ad60a58043 Rename everything to skippy and center skippy (#27420) 2018-10-15 14:19:41 +03:00
XhmikosR 43c20b912e Combine examples and simple layouts. 2018-10-15 12:54:51 +03:00
XhmikosR 7d6a0aa24d Tighten stylelint config. (#27336)
Also improve its formatting.
2018-10-15 12:24:53 +03:00
Martijn Cuppens fc77c5540e Change h1 to h2 2018-10-15 09:53:11 +03:00
XhmikosR 6c7ec73b16 Reduce indentation. 2018-10-14 22:00:58 +03:00
XhmikosR 70aec100e4 Travis: add --clean in bundle install command. 2018-10-14 17:05:04 +03:00
XhmikosR bcbf3f2ec6 build/generate-sri.js: add popperjs. 2018-10-14 08:17:40 +03:00
XhmikosR f9dea7624b Move periods outside of links. 2018-10-14 08:17:40 +03:00
XhmikosR ea575bc1a7 js/tests/visual: fix popper script.
Broken after 787441d.
2018-10-14 08:17:40 +03:00
XhmikosR 7749b91130 Fix a few links.
* fix `/versions/` link
* add missing trailing slashes
* fix a couple of redirects
2018-10-14 08:17:40 +03:00
XhmikosR d2c6e237e4 Remove the unused jobs Jekyll variable. 2018-10-14 08:17:40 +03:00
XhmikosR 7d8b26980f Update popper.js in docs. 2018-10-14 08:17:40 +03:00
XhmikosR 449979decf docs: fix bundle SRI hash.
Also, remove popper.js from this script since it's not present in the repo.
2018-10-14 08:17:40 +03:00
XhmikosR 339311ddb5 Fix invalid selectors in tests and examples. 2018-10-14 08:17:40 +03:00
XhmikosR 4ce091b87f Add a release npm script. 2018-10-14 07:51:40 +03:00
XhmikosR 3fcddfa42e Remove sri-toolbox dependency.
We can achieve the same very easily.
2018-10-14 07:41:45 +03:00
XhmikosR b2b933c181 Update Travis config.
* remove `dist: trusty` since it's the default
* disable email notifications
2018-10-13 13:55:49 +03:00
m5o 0e5813bfd4 update holder.js image dimensions for sizing example
* update holder.js image dimensions for sizing example
  * use `100%` instead of `100%`
  * 📝 https://github.com/imsky/holder#fluid-placeholders
2018-10-13 00:10:05 +03:00
m5o 74393bffc9 refine deprecated holder.js color syntax
* refine deprecated holder.js color syntax
  * remove `#55595c:#373a3c`
* harmonize with all other holder.js examples
2018-10-11 23:49:08 +03:00
XhmikosR f59c2d946c Update devDependencies and gems. 2018-10-07 08:20:24 +03:00
XhmikosR 9d63deb954 Rename script. 2018-10-07 08:20:24 +03:00
Mark Otto 29bd5e3218 Add overflow-auto and overflow-hidden utilities 2018-10-06 17:55:55 -07:00
Spencer Davies 23015571b9 fix - small grammar error
"given move to" -> "given the move to"
2018-10-06 11:39:09 +03:00
Tanmay Gupta cd880619d4 updated README (#27349) 2018-10-02 23:38:46 +03:00
XhmikosR 19f70f9d4c Tweak build/build-plugins.js. 2018-09-26 17:04:33 +03:00
Johann-S 7c7a1706c3 remove useless iife 2018-09-26 15:03:38 +02:00
XhmikosR 02c4444f6c Remove unneeded path.resolve. 2018-09-26 15:53:44 +03:00
XhmikosR 59197765f4 Include the plugin's filename in the license header. 2018-09-26 15:53:44 +03:00
Helmut Granda ebc220754b Add license headers in js/dist files
By implementing the same approach of rollup.config.js
and replicate it in build-plugins.js, individual plugins
will display license headers.
2018-09-26 15:53:44 +03:00
Howard Cox d7f79b06dc Prevent pointer events on disabled list-group-item 2018-09-26 07:20:46 +03:00
Howard Cox 44b3f77852 Prevent pointer-events on disabled anchor dropdown-item
Fixes #26695
2018-09-26 07:20:46 +03:00
XhmikosR 0350858edf Fix examples after the recent JS changes.
`https://example.com` isn't a valid selector.
2018-09-25 17:45:06 +03:00
Florian Lacreuse 46893e23a3 Add explanation about accordion wrapper. 2018-09-25 11:41:35 +03:00
XhmikosR 252e538985 Make release-zip include the root folder.
Also, now it should work cross-platform assuming `zip` is present.
2018-09-20 12:54:34 +03:00
719media e1b7404bb8 Update forms.md
fix duplicate id attribute
2018-09-20 09:31:02 +03:00
Mark Otto 4dc5671d1b Remove flex utilities from .list-group-item's as they're display: block; meaning the utilities have no affect. Closes #27162. 2018-09-18 22:14:45 -07:00
Mark Otto 55655b2781 dist 2018-09-18 21:42:38 -07:00
Mark Otto 2f611c657b Merge branch 'v4-dev' of https://github.com/twbs/bootstrap into v4-dev 2018-09-18 21:35:56 -07:00
Mark Otto f6244654a6 dist 2018-09-18 21:35:40 -07:00
Martijn Cuppens 7bd1bc2431 Allow multiple ways of padding declaration for modal header (#26976)
* #26967: Allow multiple ways of padding declaration for modal header
* #26976: split vertical and horizontal modal padding
2018-09-18 21:33:31 -07:00
Mark Otto 0bec1c8897 Add new variables for form feedback tooltips (#26959)
Fixes #26886
2018-09-18 21:27:02 -07:00
XhmikosR f9142bdd62 docs: switch to font-weight 600. (#27226)
Segoe UI doesn't have font-weight: 500 making things not looking as expected.
2018-09-18 18:31:51 -07:00
Johann-S 75f83da539 use bsCustomFileInput in our documentation (#27264) 2018-09-18 16:52:10 +03:00
Mark Otto c8fd9ddd97 Consistently re-use input variables 2018-09-18 16:29:46 +03:00
Christopher Morrissey ea0faadde5 feature(carousel): carousel-item interval (#26667)
adds the ability to assign data-interval to an individual carousel-item
2018-09-18 15:55:48 +03:00
Martijn Cuppens e604958641 Variable .btn and .form-control font sizes (#26908) 2018-09-18 15:35:25 +03:00
ysds 18ae915f54 Bring the focused button in input group to the front (#26910) 2018-09-18 15:29:02 +03:00
Mark Otto 029f92c5e5 Document input group wrapping behavior and override via utility class
Fixes #25409
2018-09-18 14:51:34 +03:00
Nabil Kadimi 876e320364 Switch to .btn-secondary for the search button so that it's accessible (#27255) 2018-09-18 13:10:02 +03:00
Mark Otto 7c88c46517 Clarify docs for custom form structure
Fixes #25440
2018-09-18 13:03:44 +03:00
XhmikosR 787441d4bf docs: use the bundle dist file. 2018-09-18 12:50:18 +03:00
Mark Otto 5543229950 dist 2018-09-17 12:36:49 -07:00
Mark Otto 9e24d68112 Merge branch 'v4-dev' of https://github.com/twbs/bootstrap into v4-dev 2018-09-17 12:34:41 -07:00
Mark Otto b68ea572da dist 2018-09-17 12:34:34 -07:00
XhmikosR 47107d4647 Switch to find-unused-sass-variables for finding unused Sass variables. 2018-09-17 19:34:15 +03:00
Martijn Cuppens bf4dab72df #27220: cleanup .btn-link hover/focus properties (#27250) 2018-09-17 09:34:34 -03:00
Mark Otto 301a22b164 Update copy 2018-09-17 09:06:12 +03:00
XhmikosR 0d869a1063 Remove background-colors example and show only the code.
This is to avoid confusion.
2018-09-17 09:06:12 +03:00
Catalin Zalog 928ebd8925 _variables.scss comments/spacing consistency (#27247)
* style: `_variables.scss` comments consistency

* style: `_variables.scss` spacing consistency
2018-09-16 14:32:11 -07:00
Nabil Kadimi ed48d9a440 Typo (#27248) 2018-09-16 19:02:30 +01:00
XhmikosR 8bfecc7dc6 Update svgo.yml. 2018-09-16 18:06:24 +03:00
Mark Otto c3d93b34ba Simplify HTML and CSS
- Remove iframes
- Turn into larger click areas
- Drop entire team.scss file for components and utilities
2018-09-16 02:04:32 +03:00
XhmikosR 4e8c9ba1da browsers-devices.md: Use Jekyll variable. 2018-09-16 02:04:32 +03:00
XhmikosR 685db4d64f Restore team page. 2018-09-16 02:04:32 +03:00
XhmikosR fe873a3310 Travis CI: Actually don't install npm@5 at all. 2018-09-16 01:52:14 +03:00
XhmikosR 3d17e3a93a Travis: Don't install npm@5 when the current npm is newer. 2018-09-16 01:52:14 +03:00
Johann-S 8cd485fcc8 speed up browser tests 2018-09-15 08:50:13 +03:00
XhmikosR 0b97d1b0c4 Use https in more places and fix a few redirects. 2018-09-14 18:27:55 +03:00
XhmikosR c6f7276729 Update popper.min.js to v1.14.4. 2018-09-14 18:07:50 +03:00
XhmikosR bcb4e7be98 Update anchor.min.js to v4.1.1. 2018-09-14 18:07:50 +03:00
Martijn Cuppens 7a01f3c41b Selector improvement (#27219) 2018-09-14 09:31:48 -03:00
Johann-S a689120fd2 throw error when folks try to use a bad selector 2018-09-13 22:13:36 +02:00
Johann-S 9efed82522 refactor karma config in one file 2018-09-13 21:59:37 +02:00
Johann-S c543f360c9 do not use coverage files on browserstack 2018-09-13 21:59:37 +02:00
Andres Galante ed3c611949 creates variables for navbar brand colors #27187 2018-09-13 17:51:14 +03:00
Johann-S 6e2a823a44 collapse children with no data-parent 2018-09-10 21:10:00 +02:00
Herst de75bd0a4f Remove certain Chromium entries from Wall of Bugs 2018-09-10 09:52:13 +03:00
XhmikosR 83006463c9 Update devDependencies. 2018-09-09 19:05:03 +03:00
Herst 7b9c8e8eb3 Added type="button" to <button>s without any type (#27174)
(again)

https://github.com/twbs/bootlint/wiki/W007
2018-09-03 16:55:04 +01:00
Roman O fad49e710e Ignore percentage values for compare in maps 2018-09-02 16:43:54 -07:00
Martijn Cuppens 97eea3b2bf Set .btn base color 2018-09-02 16:28:42 -07:00
Martijn Cuppens 3ef2db1e85 Move transparent background to .btn and remove background-image 2018-09-02 16:28:42 -07:00
Martijn Cuppens 19afb12b65 Set max-width to 100%
Fixes #27114
2018-09-02 16:26:53 -07:00
Martijn Cuppens 9f53e06e46 Remove -webkit-text-decoration-skip 2018-09-02 16:26:18 -07:00
Martijn Cuppens e3c0b3d3af #27112: fix border focus border color 2018-09-02 16:25:55 -07:00
ysds d1de8737aa Move CSS of hover underline to base from color variants 2018-09-02 16:25:21 -07:00
Mark Otto 97801a7a2d Add new docs Versions page. 2018-09-02 13:57:25 -07:00
Johann-S a3e45d8ced add information about valid selectors (#27137) 2018-08-31 21:00:29 +02:00
Johann-S 54d86e6249 move away from sauce labs to browserstack 2018-08-30 22:17:15 +02:00
XhmikosR 2f5f8ef755 build-plugins.js: Remove redundant space 2018-08-29 15:51:21 +03:00
XhmikosR b5ad6129a2 Update devDependencies. 2018-08-28 21:48:38 +03:00
ysds 5266669d34 Remove extra line break 2018-08-28 02:22:46 +03:00
Martijn Cuppens 0e8831505a Simpler carousel indicators css (#26996) 2018-08-26 14:53:36 +03:00
acj b652932f0c Remove redundant space from blockquote footer prefix 2018-08-26 14:48:51 +03:00
acj cd28869a2f Move blockquote footer font size to variables
Blockquote footer font size is currently hardcoded to 80%, implying (in a comment) that this would result in the default font size. However, since the blockquote font size itself is variable, this is not necessarily true, and 80% of anything actually results in an arbitrary font size.

80% as a default is still fine.
2018-08-26 14:48:51 +03:00
XhmikosR 00398e31c7 Remove _layouts/redirect.html.
This isn't needed, because it's not supposed to be seen normally, with JavaScript enabled.
2018-08-25 23:41:17 +03:00
m5o 7f9e70202e add text-reset to text utilities (#26866) 2018-08-25 19:31:52 +03:00
Mark Otto 3a02f21b33 Specify new height for inputs in floating label example after v4.1.3's addition of a fixed height property on .form-control 2018-08-25 19:02:15 +03:00
Mark Otto df3993a600 Round corners on modal footer
Matches the method used for the modal header. Fixes #26955.
2018-08-25 18:49:09 +03:00
Martijn Cuppens 8073e10fb3 #23389: Add breadbrumb in docs search results 2018-08-25 15:04:53 +03:00
XhmikosR da717b03e6 Update devDependencies and gems. 2018-08-20 10:49:49 +03:00
Patrick H. Lauke 061a696855 Minor: missing dot before classname in explanatory text 2018-08-19 22:21:20 -07:00
Yannick Warnier 17008fb8f8 Fix section numbering in scrollspy doc example 2018-08-19 11:21:38 -07:00
Greg Tyler 5fb7c903b3 Use mr utility class throughout media object docs 2018-08-19 11:18:59 -07:00
Rowan-James Tran 24bdadf9d3 Remove nowrap from .btn 2018-08-19 11:17:10 -07:00
Martijn Cuppens 4def76c34e #26975: remove grid columns min height 2018-08-19 11:13:18 -07:00
Mark Otto c0fd91788e dist 2018-08-18 20:22:08 -07:00
Johann-S ab7ce480f2 Recommend a plugin to animate custom file input (#27088) 2018-08-18 16:57:07 +03:00
XhmikosR 5fed73d409 Update deps. 2018-08-13 19:20:17 +03:00
XhmikosR 107a8da550 Update bundlesize limits. 2018-08-13 10:10:52 +03:00
Martijn Cuppens bf7d4aef81 Change if statement 2018-08-13 10:10:52 +03:00
Martijn Cuppens 57661dff6d Tweak modal transform (#27005) 2018-08-13 10:00:53 +03:00
Johann-S c0b40745e0 add babel plugin proposal object rest spread to our dev deps 2018-08-12 23:34:25 +02:00
XhmikosR c81bae06f5 Add missing trailing slash in Edge tracker links. 2018-08-12 23:42:01 +03:00
XhmikosR e8e8df9cba Revert "Remove Chinese translation since it 404s."
This reverts commit 8bb35313b1.

This is no longer needed.
2018-08-12 23:42:01 +03:00
XhmikosR 34199be5ec Revert "broken link checker: check external links too."
This reverts commit 9e5ec00d50.

Unfortunately, we are getting too many timeouts.
2018-08-12 23:42:01 +03:00
XhmikosR b442ce3130 build/*.js: set sourceType to module. 2018-08-12 22:22:12 +03:00
XhmikosR acd19de6a9 Use ES6 arrow function. 2018-08-12 22:22:12 +03:00
XhmikosR 8bb35313b1 Remove Chinese translation since it 404s. 2018-08-12 21:15:55 +03:00
XhmikosR 63909069c4 docs/4.1/components/forms.md: fix useiconic link. 2018-08-12 21:15:55 +03:00
XhmikosR 9e5ec00d50 broken link checker: check external links too.
It's slower, but since it runs only on Travis, we better be safe.
2018-08-12 21:15:55 +03:00
XhmikosR 208f22c8d7 Run all css tasks in dist script. 2018-08-12 21:15:55 +03:00
XhmikosR b5af1c6eaf Fix paths. 2018-08-12 21:15:55 +03:00
XhmikosR 4317d4fb2d Update devDependencies and gems.
Also, enforce LF in clean-css.
2018-08-12 20:52:35 +03:00
Johann-S eab9da5beb fix(util): use querySelector for ids 2018-08-12 17:01:01 +02:00
Johann-S 6b92321f6a fix(util): use getElementById when it's possible 2018-08-07 18:49:02 +02:00
XhmikosR ae53690ab4 Commit our svgo config. 2018-08-02 19:17:18 +03:00
jarstelfox 198091d635 Fix dispose causing popover title to change
see: https://github.com/twbs/bootstrap/issues/26847
in v4, destroy was replaced by dispose
2018-08-02 13:51:08 +02:00
Jonathan 854da5a7c1 Hyphenate client-side/server-side (#27016) 2018-08-02 11:13:19 +01:00
Mitchell Grice c5bb4dc5d1 Fix #26990 broken external example 2018-08-02 11:38:21 +02:00
Martijn Cuppens b8cd49015a Use Iconic github page instead of site
The SSL certificate of the useiconic.com is expired
2018-08-02 12:28:45 +03:00
XhmikosR 81f1249e9c Update package.json
Fix paths to docs.
2018-08-02 09:25:06 +02:00
XhmikosR 5570f1c161 package.json: be more explicit with the files we include. 2018-08-02 09:40:02 +03:00
Mark Otto 0b5a8d9c98 Merge branch 'form-validation-icons' into v4-dev 2018-07-29 14:18:09 -07:00
Martijn Cuppens 774724a7b6 #26972: fix responsive highlight width 2018-07-29 14:13:28 -07:00
XhmikosR c73b4a705e Update devDependencies and gems. 2018-07-29 14:07:38 -07:00
Robert 70ad98d34d Fix custom-select font size/padding (#26585)
fixes #26476
2018-07-29 14:04:35 -07:00
Mark Otto 6233ea378d dist 2018-07-29 13:02:42 -07:00
Mark Otto f803fb9903 Add margin utils to the grid for fully functional grid control (#26957)
* Add margin utils to the grid for fully functional grid control

* bump the max filesize
2018-07-28 21:34:27 -07:00
lgdean e53ab71d4b fix typo: seperator -> separator (#26982) 2018-07-27 19:34:30 -07:00
XhmikosR a194abbb5a Update browsers-devices.md 2018-07-26 06:41:29 +03:00
Martijn Cuppens 4f926671e9 Carousel indicators transition (#26902) 2018-07-24 21:15:05 -07:00
ysds bbee41431d Fix custom range height (#26898)
Fixes #26897
2018-07-24 17:56:03 -07:00
ysds ab53ccc2cc Flexbox based sticky footer example (#26674)
* Flexbox based sticky footer

* Update guide message

* Use utility classes instead of custom CSS
2018-07-24 17:40:55 -07:00
Martijn Cuppens d80635c1cd Custom input range disabled styling (#26540) 2018-07-24 17:39:15 -07:00
Mark Otto ba25e38b4a Merge branch 'garhbod-patch-1' into v4-dev 2018-07-24 17:26:29 -07:00
Mark Otto fb2de04374 Merge branch 'v4-dev' into malkomich-v4-dev 2018-07-24 17:25:12 -07:00
Stefan Wrobel e3b98c51da Add .text-decoration-none utility class (#25933)
ref: https://github.com/twbs/bootstrap/pull/23881#issuecomment-337789596
2018-07-24 17:24:20 -07:00
Andrew c8a4d9dd74 add 'lighter' and 'bolder' font weight classes (#26580)
* add 'lighter' and 'bolder' font weight classes

these are 2 special values for font weight, that will give their content a font-weight value of 100 more or less than their inherited font-weight.

probably doesn't fully fulfill this issue, https://github.com/twbs/bootstrap/issues/23969, but it's a start

* Update .stylelintrc

* add 'lighter' and 'bolder' variables per @mdo 's request.
2018-07-24 17:23:17 -07:00
Mark Otto 3b55873438 Ship v4.1.3 2018-07-24 08:54:34 -07:00
Mark Otto 72447ad497 dist 2018-07-23 17:51:14 -07:00
Johann-S d18045210c fix(tests): visual plugins tests 2018-07-23 17:29:53 -07:00
Martijn Cuppens c74a32703a Allow background images for active buttons 2018-07-20 19:25:01 -05:00
Mark Otto f87d5eab69 Clarify to close #26329 2018-07-20 19:11:23 -05:00
Mohammad Younes 6cca02f163 fix .modal-dialog-centered on IE10/11 2018-07-20 19:04:23 -05:00
Joshua David c04d60b88f Fix modal overflow style nesting (#26742)
Nest `.modal` styling directly under `.modal-open`
to avoid issues when bootstrap is nested.
2018-07-20 18:55:16 -05:00
Mark Otto 23e4d48e65 Merge branch 'document-tooltip-flickering' of https://github.com/simPod/bootstrap into simPod-document-tooltip-flickering 2018-07-20 18:34:57 -05:00
Martijn Cuppens 6f52b2eafa #26912: fix custom file input z-index 2018-07-20 18:31:47 -05:00
ysds c45e5594b7 Fix property order 2018-07-20 18:28:09 -05:00
ysds 900775483f Remove :not(:root) from the workaround for SVG overflow bug
* `svg:not(:root)` specificity is very high (https://github.com/necolas/normalize.css/issues/718)
* Bootstrap do not support SVG documents (See #26878)
2018-07-20 18:28:09 -05:00
ysds d7acc977ef Lower the specificity of vertical-align of SVG 2018-07-20 18:28:09 -05:00
Mark Otto 3cfa06004e Add Noto Color Emoji to font stack
Fixes #26227
2018-07-20 18:24:14 -05:00
Mark Otto bdb6723a45 Clarify custom select styles
Fixes #26281
2018-07-20 18:23:42 -05:00
Mark Otto 4693672cff Update validation tooltips to use tooltip vars (#26887)
Updates the properties and values for which we have existing variables to match our tooltips. Come 4.2, we'll create new tooltips for these.
2018-07-20 18:21:40 -05:00
Mark Otto 28b9bc068f Improve responsive table docs
- Splits the examples with code snippets
- Adds note about possible broken visuals

Closes #25813
2018-07-20 18:18:48 -05:00
Johann-S eb81c39f2c feat(plugins): allow to import separate plugins 2018-07-19 19:59:45 +02:00
XhmikosR 6cf8700fd9 Move the browserslist config to a separate file. 2018-07-16 21:34:53 +03:00
Mark Otto 6d84d491d1 Merge branch 'v4-dev' of https://github.com/Varunram/bootstrap into Varunram-v4-dev 2018-07-15 22:46:37 -07:00
Mark Otto a4b2e39178 More wordsmithing 2018-07-15 22:27:36 -07:00
Mark Otto 233378ade9 dist 2018-07-15 14:16:35 -07:00
Lefteris Psitopoulos 9bfd400527 #25842 Remove max-width from table class 2018-07-15 14:06:33 -07:00
Mark Otto f426a67394 Form control heights (#26820)
* Redo input height on .form-control

- Use the already present -height variables on .form-control
- Consolidate the select size and multiple overrides into the .form-control base class instead of sm/lg modifiers
- Remove the Sass extends from input groups since it picks up too many selectors

* Prevent height on textareas
2018-07-15 14:00:23 -07:00
ysds 48c723b60f Fix custom range thumb style (#26385)
* Fix focus box shadow of custom ranges

* Put `:focus` selector right after `.custom-range`
* Remove unnecessary `outline: none`

* Fix box-shadow issues in IE/Edge

* Better align

* Fix thumb vertical positions in IE/Edge

* Fix incorrect formula of thumb vertical positions in Webkit

* Fix an incorrect comment

* Fix incorrect box-shadow-width
2018-07-14 21:31:20 -07:00
Andrew Luca 0fd40837e8 Fix custom-forms heights and position (#25602)
Now `.custom-control` will have height equal to `$font-size-base`
Fix custom checkbox and radio top position (we can't subtract rem from unit)
`$line-height-base - $custom-control-indicator-size` is not valid
Because `$line-height-base` is a unitless variable and `$custom-control-indicator-size`
is a unit (rem) variable
2018-07-14 21:29:19 -07:00
Mark Otto 2d8422f5f5 fixes #26579 2018-07-14 21:10:45 -07:00
Mark Otto 52813f4bc8 Update cursor on floating labels example (#26826) 2018-07-14 15:14:29 -07:00
Mark Otto 2eb456b5d8 Merge branch 'examples-cleanup' of https://github.com/MartijnCuppens/bootstrap into MartijnCuppens-examples-cleanup 2018-07-14 14:07:14 -07:00
Mark Otto 9928311bd9 Merge branch 'box-shadow_issue_26377' of https://github.com/parammittal16/bootstrap into parammittal16-box-shadow_issue_26377 2018-07-14 14:04:39 -07:00
Mark Otto a5d48323a2 Update issue templates 2018-07-13 09:31:55 -07:00
Mark Otto b2c4ce5273 Update issue template 2018-07-13 09:30:58 -07:00
Simon Podlipsky da56d918ac Reword 2018-07-12 17:31:20 +03:00
XhmikosR e9ec13e974 Update tooltips.md 2018-07-10 23:26:30 +03:00
Simon Podlipsky 591725e838 Document tooltip flickering in combination with some overflow settings 2018-07-10 14:54:45 +03:00
Mark Otto 5495a19b5a disable to fix ci 2018-07-08 18:43:40 -07:00
Mark Otto b0b28c81e5 add grid docs mention 2018-07-08 18:18:13 -07:00
Mark Otto 7e96979cea fix comment placement, remove unecessary prop wrapper 2018-07-08 17:29:01 -07:00
Mark Otto 0153f7d8cd add docs 2018-07-08 17:28:37 -07:00
Mark Otto f6b4945f1e Merge branch 'patch-1' of https://github.com/garhbod/bootstrap into garhbod-patch-1 2018-07-08 16:46:44 -07:00
Mark Otto 8d8d3ef82a Restore feedback icons on validated form fields
- Only applies to textual inputs and textareas with `.form-control` and selects with `.custom-select`
- Wrap the feedback icons in a Sass variable option, $enable-validation-icons, so folks who theme can disable
- Update docs to summarize styles, mention the icons, include a textarea demo, and add mention of the Sass variable option to the Theming section
2018-07-08 15:31:18 -07:00
Mark Otto c6abb8ca84 class 2018-07-07 20:21:01 -07:00
Mark Otto 17a25b72c8 add table of classes 2018-07-07 20:15:48 -07:00
Mark Otto cc41a5e64f fix docs heading 2018-07-07 19:47:21 -07:00
parammittal16 e77d64b372 Replace shadow with shadow-sm 2018-07-08 06:08:14 +05:30
Mark Otto 5ad1049622 Merge branch 'v4-dev' of https://github.com/malkomich/bootstrap into malkomich-v4-dev 2018-07-07 16:16:43 -07:00
Martijn Cuppens 6f8d322f74 Remove .border-bottom & .border-top classes from examples 2018-07-05 22:42:01 +02:00
Ryan Worth a2920149f4 Negative Margins classes for custom col gutters
Feature request #26681
2018-06-07 16:39:58 +10:00
parammittal16 8cc6220161 Fix unused box-shadow class 2018-05-12 00:18:37 +05:30
parammittal16 afcbd65afb Fix box-shadow class with built in utility 2018-05-12 00:16:28 +05:30
Varunram 87065772b1 Fix #25813 by adding extra columns to table 2018-03-12 13:38:09 +05:30
Juan Carlos González Cabrero a8b00ddc12 Reduce the width to prevent the modal fills the screen width 2017-01-28 18:26:55 +01:00
Juan Carlos González Cabrero 95dffb3279 Add new extra large size for modal containers 2017-01-28 18:26:55 +01:00
479 changed files with 28305 additions and 22399 deletions
+2 -3
View File
@@ -10,9 +10,8 @@ module.exports = {
]
],
plugins: [
process.env.PLUGINS && 'transform-es2015-modules-strip',
'@babel/proposal-object-rest-spread'
].filter(Boolean),
'@babel/plugin-proposal-object-rest-spread'
],
env: {
test: {
plugins: [ 'istanbul' ]
+13
View File
@@ -0,0 +1,13 @@
# https://github.com/browserslist/browserslist#readme
>= 1%
last 1 major version
not dead
Chrome >= 45
Firefox >= 38
Edge >= 12
Explorer >= 10
iOS >= 9
Safari >= 9
Android >= 4.4
Opera >= 30
+1
View File
@@ -2,4 +2,5 @@
**/dist/
**/vendor/
/_gh_pages/
/js/coverage/
/package.js
+1 -1
View File
@@ -5,7 +5,7 @@
"browser": true,
"es6": true
},
"extends": ["eslint:recommended", "plugin:compat/recommended"],
"extends": ["eslint:recommended"],
"rules": {
// Possible Errors
"no-await-in-loop": "error",
+3
View File
@@ -0,0 +1,3 @@
*.js @twbs/js-review
*.css @twbs/css-review
*.scss @twbs/css-review
+17
View File
@@ -0,0 +1,17 @@
---
name: Bug report
about: Tell us about a bug you may have identified in Bootstrap.
---
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
- [Validate](https://html5.validator.nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems
- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
Bug reports must include:
- Operating system and version (Windows, macOS, Android, iOS, Win10 Mobile)
- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
- [Reduced test case](https://css-tricks.com/reduced-test-cases/) and suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
+15
View File
@@ -0,0 +1,15 @@
---
name: Feature request
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)
Feature requests must include:
- As much detail as possible for what we should add and why it's important to Bootstrap
- Relevant links to prior art, screenshots, or live demos whenever possible
+9 -14
View File
@@ -1,13 +1,12 @@
# Ignore docs files
_gh_pages
_site
site/docs/4.1/dist/
/_gh_pages/
/site/.jekyll-metadata
/site/docs/**/dist/
# Ignore ruby files
.ruby-version
.bundle
vendor/cache
vendor/bundle
# Ignore ruby/bundler files
/.bundle/
/vendor/
/.ruby-version
# Numerous always-ignore extensions
*.diff
@@ -39,10 +38,6 @@ Thumbs.db
.komodotools
*.komodoproject
# Jekyll metadata and extra config file for `github` script
docs/.jekyll-metadata
twbsconfig.yml
# Folders to ignore
node_modules
js/coverage
/js/coverage/
/node_modules/
+5 -264
View File
@@ -1,274 +1,15 @@
{
"extends": ["stylelint-config-standard", "stylelint-config-recommended-scss"],
"plugins": [
"stylelint-order"
"extends": [
"stylelint-config-twbs-bootstrap/scss"
],
"rules": {
"at-rule-empty-line-before": null,
"at-rule-name-space-after": "always",
"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",
"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-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",
"media-feature-name-no-unknown": [true, {
"ignoreMediaFeatureNames": ["prefers-reduced-motion"]
}],
"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"
],
"property-no-vendor-prefix": true,
"rule-empty-line-before": null,
"scss/dollar-variable-default": [true, { "ignore": "local" }],
"selector-attribute-quotes": "always",
"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,
"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
"transition"
]
}
}
+9 -17
View File
@@ -1,5 +1,3 @@
sudo: required
dist: trusty
addons:
chrome: stable
language: node_js
@@ -8,26 +6,20 @@ git:
node_js:
- "6"
- "8"
before_install:
- if [[ `npm -v` != 5* ]]; then npm install -g npm@5; fi
install:
- bundle install --deployment --jobs=3 --retry=3
- bundle install --deployment --jobs=3 --retry=3 --clean
- npm install
before_script:
- google-chrome-stable --product-version
script:
- npm test
- if [ "$TRAVIS_NODE_VERSION" = "8" ]; then npm run check-broken-links; fi
- 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
stages:
- test
- name: browser
if: type = push
jobs:
include:
- stage: browser
node_js: 8
script: if ! git log --format=%B --no-merges -n 1 | grep '\[skip browser\]'; then npm test && npm run js-test-cloud; fi
- if [[ "$TRAVIS_NODE_VERSION" = "8" ]]; then npm run coveralls; fi
cache:
directories:
- node_modules
- vendor/bundle
notifications:
email: false
+3 -2
View File
@@ -1,8 +1,9 @@
source 'https://rubygems.org'
group :development, :test do
gem 'jekyll', '~> 3.8.3'
gem 'jekyll', '~> 3.8.5'
gem 'jekyll-redirect-from', '~> 0.14.0'
gem 'jekyll-sitemap', '~> 1.2.0'
gem 'jekyll-toc', '~> 0.6.0'
gem 'jekyll-toc', '~> 0.9.1'
gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform?
end
+25 -23
View File
@@ -1,22 +1,22 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.5.2)
addressable (2.6.0)
public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
concurrent-ruby (1.0.5)
concurrent-ruby (1.1.4)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
eventmachine (1.2.7-x64-mingw32)
ffi (1.9.25)
ffi (1.9.25-x64-mingw32)
ffi (1.10.0)
ffi (1.10.0-x64-mingw32)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.8.3)
jekyll (3.8.5)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
@@ -35,46 +35,48 @@ GEM
sass (~> 3.4)
jekyll-sitemap (1.2.0)
jekyll (~> 3.3)
jekyll-toc (0.6.0)
nokogiri (~> 1.7)
jekyll-watch (2.0.0)
jekyll-toc (0.9.1)
nokogiri (~> 1.8)
jekyll-watch (2.1.2)
listen (~> 3.0)
kramdown (1.17.0)
liquid (4.0.0)
liquid (4.0.1)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
mini_portile2 (2.3.0)
nokogiri (1.8.4)
mini_portile2 (~> 2.3.0)
nokogiri (1.8.4-x64-mingw32)
mini_portile2 (~> 2.3.0)
pathutil (0.16.1)
mini_portile2 (2.4.0)
nokogiri (1.10.1)
mini_portile2 (~> 2.4.0)
nokogiri (1.10.1-x64-mingw32)
mini_portile2 (~> 2.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (3.0.2)
public_suffix (3.0.3)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rouge (3.1.1)
rb-inotify (0.10.0)
ffi (~> 1.0)
rouge (3.3.0)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.5.6)
sass (3.7.3)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
wdm (0.1.1)
PLATFORMS
ruby
x64-mingw32
DEPENDENCIES
jekyll (~> 3.8.3)
jekyll (~> 3.8.5)
jekyll-redirect-from (~> 0.14.0)
jekyll-sitemap (~> 1.2.0)
jekyll-toc (~> 0.6.0)
jekyll-toc (~> 0.9.1)
wdm (~> 0.1.1)
BUNDLED WITH
1.16.2
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
+72 -35
View File
@@ -1,29 +1,26 @@
<p align="center">
<a href="https://getbootstrap.com/">
<img src="https://getbootstrap.com/docs/4.1/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width=72 height=72>
<img src="https://getbootstrap.com/docs/4.3/assets/brand/bootstrap-solid.svg" alt="Bootstrap logo" width="72" height="72">
</a>
<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.1/"><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://jobs.getbootstrap.com/">Jobs</a>
·
<a href="https://blog.getbootstrap.com/">Blog</a>
</p>
</p>
<br>
<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.3/"><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>
## Table of contents
@@ -36,20 +33,23 @@
- [Community](#community)
- [Versioning](#versioning)
- [Creators](#creators)
- [Thanks](#thanks)
- [Copyright and license](#copyright-and-license)
## Quick start
Several quick start options are available:
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.1.2.zip)
- [Download the latest release.](https://github.com/twbs/bootstrap/archive/v4.3.0.zip)
- Clone the repo: `git clone https://github.com/twbs/bootstrap.git`
- Install with [npm](https://www.npmjs.com/): `npm install bootstrap`
- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@4.1.2`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.1.2`
- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@4.3.0`
- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:4.3.0`
- Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass`
Read the [Getting started page](https://getbootstrap.com/docs/4.1/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
Read the [Getting started page](https://getbootstrap.com/docs/4.3/getting-started/introduction/) for information on the framework contents, templates and examples, and more.
## Status
@@ -63,16 +63,18 @@ Read the [Getting started page](https://getbootstrap.com/docs/4.1/getting-starte
[![peerDependencies Status](https://img.shields.io/david/peer/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap?type=peer)
[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap?type=dev)
[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/v4-dev.svg)](https://coveralls.io/github/twbs/bootstrap?branch=v4-dev)
[![CSS gzip size](http://img.badgesize.io/twbs/bootstrap/v4-dev/dist/css/bootstrap.min.css?compression=gzip&label=CSS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/css/bootstrap.min.css)
[![JS gzip size](http://img.badgesize.io/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js?compression=gzip&label=JS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/js/bootstrap.min.js)
[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/css/bootstrap.min.css?compression=gzip&label=CSS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/css/bootstrap.min.css)
[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/v4-dev/dist/js/bootstrap.min.js?compression=gzip&label=JS+gzip+size)](https://github.com/twbs/bootstrap/tree/v4-dev/dist/js/bootstrap.min.js)
[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)](https://www.browserstack.com/automate/public-build/SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)
[![Backers on Open Collective](https://opencollective.com/bootstrap/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/bootstrap/sponsors/badge.svg)](#sponsors)
[![Sauce Labs Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap)
## What's included
Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:
```
```text
bootstrap/
└── dist/
├── css/
@@ -99,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
@@ -111,22 +113,25 @@ 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.1/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.3/assets/js/src/search.js` file.
### Running documentation locally
1. Run through the [tooling setup](https://getbootstrap.com/docs/4.1/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.3/getting-started/build-tools/#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
2. Run `npm install` to install Node.js dependencies.
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à.
Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/home/).
Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/).
### Documentation for previous releases
- For v2.3.2: <https://getbootstrap.com/2.3.2/>
- For v3.3.x: <https://getbootstrap.com/docs/3.3/>
- For v3.4.0: <https://getbootstrap.com/docs/3.4/>
- For v4.0.x: <https://getbootstrap.com/docs/4.0/>
- For v4.1.x: <https://getbootstrap.com/docs/4.1/>
- For v4.2.x: <https://getbootstrap.com/docs/4.2/>
[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.
@@ -154,7 +159,7 @@ Get updates on Bootstrap's development and chat with the project maintainers and
## Versioning
For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible.
For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we adhere to those rules whenever possible.
See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com/) contain summaries of the most noteworthy changes made in each release.
@@ -172,6 +177,38 @@ See [the Releases section of our GitHub project](https://github.com/twbs/bootstr
- <https://github.com/fat>
## Thanks
<a href="https://www.browserstack.com/">
<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!
## Backers
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)]
[![Bakers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers)
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bootstrap#sponsor)]
[![](https://opencollective.com/bootstrap/sponsor/0/avatar.svg)](https://opencollective.com/bootstrap/sponsor/0/website)
[![](https://opencollective.com/bootstrap/sponsor/1/avatar.svg)](https://opencollective.com/bootstrap/sponsor/1/website)
[![](https://opencollective.com/bootstrap/sponsor/2/avatar.svg)](https://opencollective.com/bootstrap/sponsor/2/website)
[![](https://opencollective.com/bootstrap/sponsor/3/avatar.svg)](https://opencollective.com/bootstrap/sponsor/3/website)
[![](https://opencollective.com/bootstrap/sponsor/4/avatar.svg)](https://opencollective.com/bootstrap/sponsor/4/website)
[![](https://opencollective.com/bootstrap/sponsor/5/avatar.svg)](https://opencollective.com/bootstrap/sponsor/5/website)
[![](https://opencollective.com/bootstrap/sponsor/6/avatar.svg)](https://opencollective.com/bootstrap/sponsor/6/website)
[![](https://opencollective.com/bootstrap/sponsor/7/avatar.svg)](https://opencollective.com/bootstrap/sponsor/7/website)
[![](https://opencollective.com/bootstrap/sponsor/8/avatar.svg)](https://opencollective.com/bootstrap/sponsor/8/website)
[![](https://opencollective.com/bootstrap/sponsor/9/avatar.svg)](https://opencollective.com/bootstrap/sponsor/9/website)
## 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://github.com/twbs/bootstrap/blob/master/docs/LICENSE).
+21 -16
View File
@@ -11,13 +11,13 @@ permalink: pretty
# Server
source: "site"
destination: ./_gh_pages
host: 0.0.0.0
host: "localhost"
port: 9001
baseurl: ""
url: "https://getbootstrap.com"
encoding: UTF-8
exclude:
- docs/4.1/assets/scss/
- docs/4.3/assets/scss/
plugins:
- jekyll-redirect-from
@@ -29,35 +29,40 @@ 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.1/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.1/assets/brand/bootstrap-social-logo.png
social_image_path: /docs/4.3/assets/brand/bootstrap-social.png
social_logo_path: /docs/4.3/assets/brand/bootstrap-social-logo.png
# Custom variables
current_version: 4.1.2
current_ruby_version: 4.1.2
docs_version: 4.1
current_version: 4.3.0
current_ruby_version: 4.3.0
docs_version: 4.3
repo: "https://github.com/twbs/bootstrap"
slack: "https://bootstrap-slack.herokuapp.com"
opencollective: "https://opencollective.com/bootstrap"
blog: "https://blog.getbootstrap.com"
expo: "https://expo.getbootstrap.com"
jobs: "https://jobs.getbootstrap.com"
themes: "https://themes.getbootstrap.com"
download:
source: "https://github.com/twbs/bootstrap/archive/v4.1.2.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.1.2/bootstrap-4.1.2-dist.zip"
source: "https://github.com/twbs/bootstrap/archive/v4.3.0.zip"
dist: "https://github.com/twbs/bootstrap/releases/download/v4.3.0/bootstrap-4.3.0-dist.zip"
cdn:
# See https://www.srihash.org for info on how to generate the hashes
css: "https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"
css_hash: "sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B"
js: "https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js"
js_hash: "sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em"
css: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.0/css/bootstrap.min.css"
css_hash: "sha384-PDle/QlgIONtM1aqA2Qemk5gPOE7wFq8+Em+G/hmo5Iq0CCmYZLv3fVRDJ4MMwEA"
js: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.0/js/bootstrap.min.js"
js_hash: "sha384-7aThvCh9TypR7fIc2HV4O/nFMVCBwyIUKL8XCtKE+8xgCgl/PQGuFsvShjr74PBp"
js_bundle: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.0/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-VoPFvGr9GxhDT3n8vqqZ46twP5lgex+raTCfICQy73NLhN7ZqSfCtfSn4mLA2EFA"
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.3/umd/popper.min.js"
popper_hash: "sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
popper: "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
popper_hash: "sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
toc:
min_level: 2
max_level: 4
no_toc_section_class:
- "bd-callout"
- "bd-example"
-44
View File
@@ -1,44 +0,0 @@
{
"attr-bans": ["align", "background", "bgcolor", "border", "frameborder", "longdesc", "marginwidth", "marginheight", "scrolling"],
"attr-name-style": false,
"attr-no-dup": true,
"attr-no-unsafe-char": true,
"attr-quote-style": "double",
"attr-req-value": true,
"attr-validate": false,
"class-no-dup": true,
"class-style": "none",
"doctype-first": true,
"doctype-html5": true,
"fig-req-figcaption": false,
"focusable-tabindex-style": true,
"head-req-title": true,
"head-valid-content-model": false,
"href-style": false,
"html-req-lang": true,
"html-valid-content-model": false,
"id-class-ignore-regex": "(onclick|content|[a-z]+([A-Z][a-z])+)",
"id-class-no-ad": true,
"id-class-style": false,
"id-no-dup": true,
"img-req-alt": "allownull",
"img-req-src": false,
"indent-style": "spaces",
"indent-width": 2,
"input-radio-req-name": false,
"input-req-label": false,
"label-req-for": true,
"lang-style": "case",
"line-no-trailing-whitespace": false,
"line-end-style": "lf",
"spec-char-escape": false,
"table-req-header": false,
"tag-bans": ["b", "i"],
"tag-close": true,
"tag-name-lowercase": true,
"tag-name-match": true,
"tag-self-close": false,
"text-ignore-regex": false,
"title-max-len": 70,
"title-no-dup": true
}
+14
View File
@@ -0,0 +1,14 @@
'use strict'
const pkg = require('../package.json')
const year = new Date().getFullYear()
function getBanner(pluginFilename) {
return `/*!
* Bootstrap${pluginFilename ? ` ${pluginFilename}` : ''} v${pkg.version} (${pkg.homepage})
* Copyright 2011-${year} ${pkg.author}
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/`
}
module.exports = getBanner
+85
View File
@@ -0,0 +1,85 @@
/*!
* Script to build our plugins to use them separately.
* Copyright 2019 The Bootstrap Authors
* Copyright 2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
'use strict'
const path = require('path')
const rollup = require('rollup')
const babel = require('rollup-plugin-babel')
const banner = require('./banner.js')
const TEST = process.env.NODE_ENV === 'test'
const plugins = [
babel({
exclude: 'node_modules/**', // Only transpile our source code
externalHelpersWhitelist: [ // Include only required helpers
'defineProperties',
'createClass',
'inheritsLoose',
'defineProperty',
'objectSpread'
]
})
]
const bsPlugins = {
Alert: path.resolve(__dirname, '../js/src/alert.js'),
Button: path.resolve(__dirname, '../js/src/button.js'),
Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
Dropdown: path.resolve(__dirname, '../js/src/dropdown.js'),
Modal: path.resolve(__dirname, '../js/src/modal.js'),
Popover: path.resolve(__dirname, '../js/src/popover.js'),
ScrollSpy: path.resolve(__dirname, '../js/src/scrollspy.js'),
Tab: path.resolve(__dirname, '../js/src/tab.js'),
Toast: path.resolve(__dirname, '../js/src/toast.js'),
Tooltip: path.resolve(__dirname, '../js/src/tooltip.js'),
Util: path.resolve(__dirname, '../js/src/util.js')
}
const rootPath = TEST ? '../js/coverage/dist/' : '../js/dist/'
function build(plugin) {
console.log(`Building ${plugin} plugin...`)
const external = ['jquery', 'popper.js']
const globals = {
jquery: 'jQuery', // Ensure we use jQuery which is always available even in noConflict mode
'popper.js': 'Popper'
}
// Do not bundle Util in plugins
if (plugin !== 'Util') {
external.push(bsPlugins.Util)
globals[bsPlugins.Util] = 'Util'
}
// Do not bundle Tooltip in Popover
if (plugin === 'Popover') {
external.push(bsPlugins.Tooltip)
globals[bsPlugins.Tooltip] = 'Tooltip'
}
const pluginFilename = `${plugin.toLowerCase()}.js`
rollup.rollup({
input: bsPlugins[plugin],
plugins,
external
}).then((bundle) => {
bundle.write({
banner: banner(pluginFilename),
format: 'umd',
name: plugin,
sourcemap: true,
globals,
file: path.resolve(__dirname, `${rootPath}${pluginFilename}`)
})
.then(() => console.log(`Building ${plugin} plugin... Done!`))
.catch((err) => console.error(`${plugin}: ${err}`))
})
}
Object.keys(bsPlugins).forEach((plugin) => build(plugin))
+2 -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)
*/
Binary file not shown.
+14 -8
View File
@@ -5,18 +5,20 @@
* 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)
*/
'use strict'
const crypto = require('crypto')
const fs = require('fs')
const path = require('path')
const sriToolbox = require('sri-toolbox')
const sh = require('shelljs')
const pkg = require('../package.json')
sh.config.fatal = true
const configFile = path.join(__dirname, '../_config.yml')
@@ -34,11 +36,15 @@ const files = [
configPropertyName: 'js_hash'
},
{
file: 'site/docs/4.1/assets/js/vendor/jquery-slim.min.js',
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: 'site/docs/4.1/assets/js/vendor/popper.min.js',
file: 'node_modules/popper.js/dist/umd/popper.min.js',
configPropertyName: 'popper_hash'
}
]
@@ -49,9 +55,9 @@ files.forEach((file) => {
throw err
}
const integrity = sriToolbox.generate({
algorithms: ['sha384']
}, data)
const algo = 'sha384'
const hash = crypto.createHash(algo).update(data, 'utf8').digest('base64')
const integrity = `${algo}-${hash}`
console.log(`${file.configPropertyName}: ${integrity}`)
-82
View File
@@ -1,82 +0,0 @@
#!/usr/bin/env node
/*!
* Script to find unused Sass variables.
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
'use strict'
const fs = require('fs')
const path = require('path')
const glob = require('glob')
// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
function regExpQuote(str) {
return str.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
}
let globalSuccess = true
function findUnusedVars(dir) {
if (!(fs.existsSync(dir) && fs.statSync(dir).isDirectory())) {
console.log(`"${dir}": Not a valid directory!`)
process.exit(1)
}
console.log(`Finding unused variables in "${dir}"...`)
// A variable to handle success/failure message in this function
let unusedVarsFound = false
// Array of all Sass files' content
const sassFiles = glob.sync(path.join(dir, '**/*.scss'))
// String of all Sass files' content
let sassFilesString = ''
sassFiles.forEach((file) => {
sassFilesString += fs.readFileSync(file, 'utf8')
})
// Array of all Sass variables
const variables = sassFilesString.match(/(^\$[a-zA-Z0-9_-]+[^:])/gm)
console.log(`Found ${variables.length} total variables.`)
// Loop through each variable
variables.forEach((variable) => {
const re = new RegExp(regExpQuote(variable), 'g')
const count = (sassFilesString.match(re) || []).length
if (count === 1) {
console.log(`Variable "${variable}" is not being used.`)
unusedVarsFound = true
globalSuccess = false
}
})
if (unusedVarsFound === false) {
console.log(`No unused variables found in "${dir}".`)
}
}
function main(args) {
if (args.length < 1) {
console.log('Wrong arguments!')
console.log('Usage: lint-vars.js folder [, folder2...]')
process.exit(1)
}
args.forEach((arg) => {
findUnusedVars(arg)
})
if (globalSuccess === false) {
process.exit(1)
}
}
// The first and second args are: path/to/node script.js
main(process.argv.slice(2))
+2 -7
View File
@@ -3,10 +3,9 @@
const path = require('path')
const babel = require('rollup-plugin-babel')
const resolve = require('rollup-plugin-node-resolve')
const banner = require('./banner.js')
const pkg = require(path.resolve(__dirname, '../package.json'))
const BUNDLE = process.env.BUNDLE === 'true'
const year = new Date().getFullYear()
let fileDest = 'bootstrap.js'
const external = ['jquery', 'popper.js']
@@ -38,11 +37,7 @@ if (BUNDLE) {
module.exports = {
input: path.resolve(__dirname, '../js/src/index.js'),
output: {
banner: `/*!
* Bootstrap v${pkg.version} (${pkg.homepage})
* Copyright 2011-${year} ${pkg.author}
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/`,
banner,
file: path.resolve(__dirname, `../dist/js/${fileDest}`),
format: 'umd',
globals,
-65
View File
@@ -1,65 +0,0 @@
[
{
"browserName": "safari",
"platform": "OS X 10.11",
"version": "latest"
},
{
"browserName": "chrome",
"platform": "OS X 10.11",
"version": "latest"
},
{
"browserName": "firefox",
"platform": "OS X 10.11",
"version": "latest"
},
{
"browserName": "MicrosoftEdge",
"platform": "Windows 10",
"version": "latest"
},
{
"browserName": "internet explorer",
"version": "11",
"platform": "Windows 8.1"
},
{
"browserName": "internet explorer",
"version": "10",
"platform": "Windows 8"
},
{
"browserName": "chrome",
"platform": "Windows 10",
"version": "latest"
},
{
"browserName": "firefox",
"platform": "Windows 10",
"version": "latest"
},
{
"browserName": "iphone",
"deviceName": "iPhone Simulator",
"platformName": "OS X 10.11",
"version": "9.3"
},
{
"browserName": "chrome",
"platform": "Linux",
"version": "latest"
},
{
"browserName": "firefox",
"platform": "Linux",
"version": "latest"
},
{
"platform": "Linux",
"browserName": "android",
"deviceName": "Android Emulator",
"version": "latest",
"deviceType": "phone"
}
]
-116
View File
@@ -1,116 +0,0 @@
/*!
* Script to run our Sauce Labs tests.
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*
Docs: https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
Mac Opera is not currently supported by Sauce Labs
Win Opera 15+ is not currently supported by Sauce Labs
iOS Chrome is not currently supported by Sauce Labs
*/
'use strict'
const path = require('path')
const JSUnitSaucelabs = require('jsunitsaucelabs')
const jsUnitSaucelabs = new JSUnitSaucelabs({
username: process.env.SAUCE_USERNAME,
password: process.env.SAUCE_ACCESS_KEY,
build: process.env.TRAVIS_JOB_ID
})
const testURL = 'http://localhost:3000/js/tests/index.html?hidepassed'
const browsersFile = require(path.resolve(__dirname, './sauce_browsers.json'))
const errorMessages = [
'Test exceeded maximum duration',
'Test exceeded maximum duration after 180 seconds'
]
let jobsDone = 0
let jobsSucceeded = 0
const waitingCallback = (error, body, id) => {
if (error) {
console.error(error)
process.exit(1)
}
if (typeof body !== 'undefined') {
if (!body.completed) {
setTimeout(() => {
jsUnitSaucelabs.getStatus(id, (error, body) => {
waitingCallback(error, body, id)
})
}, 2000)
} else {
const test = body['js tests'][0]
const platform = test.platform.join(', ')
let passed = false
let errorStr = false
if (test.result !== null) {
if (typeof test.result === 'string' && errorMessages.includes(test.result)) {
errorStr = test.result
} else {
passed = test.result.total === test.result.passed
}
}
console.log(`Tested ${testURL}`)
console.log(`Platform: ${platform}`)
console.log(`Passed: ${passed}`)
console.log(`URL: ${test.url}\n`)
if (errorStr) {
console.error(`${platform}: ${errorStr}`)
}
if (passed) {
jobsSucceeded++
}
jobsDone++
// Exit
if (jobsDone === browsersFile.length - 1) {
jsUnitSaucelabs.stop()
if (jobsDone > jobsSucceeded) {
const failedTests = jobsDone - jobsSucceeded
throw new Error(`${failedTests} test${failedTests > 1 ? 's' : ''} failed.`)
}
console.log('All tests passed')
process.exit(0)
}
}
}
}
jsUnitSaucelabs.on('tunnelCreated', () => {
browsersFile.forEach((tmpBrowser) => {
const browsersPlatform = typeof tmpBrowser.platform === 'undefined' ? tmpBrowser.platformName : tmpBrowser.platform
const browsersArray = [browsersPlatform, tmpBrowser.browserName, tmpBrowser.version]
jsUnitSaucelabs.start([browsersArray], testURL, 'qunit', (error, success) => {
if (typeof success !== 'undefined') {
const taskIds = success['js tests']
if (!taskIds || taskIds.length === 0) {
throw new Error('Error starting tests through Sauce Labs API')
}
taskIds.forEach((id) => {
jsUnitSaucelabs.getStatus(id, (error, body) => {
waitingCallback(error, body, id)
})
})
} else {
console.error(error)
}
})
})
})
jsUnitSaucelabs.initTunnel()
+3 -21
View File
@@ -34,29 +34,11 @@ printf "\n%sUpdating version number...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
npm run release-version "$current_version" "$1"
# Compile latest CSS and JS
# Build release
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sCompile latest CSS and JS...%s" $magenta $end
printf "\n%sBuilding release...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
npm run dist
# Generate the SRI hashes
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sGenerate the SRI hashes...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
npm run release-sri
# Compress the dist files
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sCompressing the dist files...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
npm run release-zip
# Compile the docs
printf "\n%s=======================================================%s" $magenta $end
printf "\n%sCompile hosted documentation...%s" $magenta $end
printf "\n%s=======================================================\n%s" $magenta $end
npm run docs-github
npm run release
# Copy the contents of the built docs site over to `bs-docs` repo
printf "\n%s=======================================================%s" $magenta $end
+57
View File
@@ -0,0 +1,57 @@
# Usage:
# install svgo globally: `npm i -g svgo`
# svgo --config=build/svgo.yml --input=foo.svg
# https://github.com/svg/svgo/blob/master/docs/how-it-works/en.md
# replace default config
multipass: true
#full: true
# https://github.com/svg/svgo/blob/master/lib/svgo/js2svg.js#L6 for more config options
js2svg:
pretty: true
indent: 2
plugins:
# remove this with IE 11 is no longer supported
- addAttributesToSVGElement:
attributes:
- focusable: false
- cleanupAttrs: true
- cleanupEnableBackground: true
- cleanupIDs: true
- cleanupListOfValues: true
- cleanupNumericValues: true
- collapseGroups: true
- convertColors: true
- convertPathData: true
- convertShapeToPath: true
- convertStyleToAttrs: true
- convertTransform: true
- inlineStyles: true
- mergePaths: true
- minifyStyles: true
- moveElemsAttrsToGroup: true
- moveGroupAttrsToElems: true
- removeComments: true
- removeDesc: true
- removeDoctype: true
- removeEditorsNSData: true
- removeEmptyAttrs: true
- removeEmptyContainers: true
- removeEmptyText: true
- removeHiddenElems: true
- removeMetadata: true
- removeNonInheritableGroupAttrs: true
- removeTitle: false
- removeUnknownsAndDefaults:
keepRoleAttr: true
- removeUnusedNS: true
- removeUselessDefs: true
- removeUselessStrokeAndFill: true
- removeViewBox: false
- removeXMLNS: false
- removeXMLProcInst: true
- sortAttrs: true
+2 -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)
*/
@@ -27,9 +27,6 @@ childProcess.exec('java -version', (error, stdout, stderr) => {
// Firefox's non-standard autocomplete behavior - see https://bugzilla.mozilla.org/show_bug.cgi?id=654072
'Attribute “autocomplete” is only allowed when the input type is.*',
'Attribute “autocomplete” not allowed on element “button” at this point.',
// We use holder.js with `data-src` and no `src` to avoid 404 errors;
// we could work around this, but I'm not sure it's worth it.
'Element “img” is missing required attribute “src”.',
// Markup used in Components → Forms → Layout → Form grid → Horizontal form is currently invalid,
// but used this way due to lack of support for flexbox layout on <fieldset> element in most browsers
'Element “legend” not allowed as child of element “div” in this context.*',
-8
View File
@@ -1,8 +0,0 @@
{
"globDirectory": "./",
"globPatterns": [
"_gh_pages/**/*.{html,css,js,json,png,svg}"
],
"swSrc": "./site/sw.js",
"swDest": "./_gh_pages/sw.js"
}
-58
View File
@@ -1,58 +0,0 @@
/*!
* Script to generate our docs service worker.
* Copyright 2017-2018 The Bootstrap Authors
* Copyright 2017-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
'use strict'
const fs = require('fs')
const path = require('path')
const swBuild = require('workbox-build')
const config = require('./workbox.config.json')
const buildPrefix = '_gh_pages/'
const workboxSWSrcPath = require.resolve('workbox-sw')
const wbFileName = path.basename(workboxSWSrcPath)
const workboxSWDestPath = `${buildPrefix}docs/4.1/assets/js/vendor/${wbFileName}`
const workboxSWSrcMapPath = `${workboxSWSrcPath}.map`
const workboxSWDestMapPath = `${workboxSWDestPath}.map`
fs.createReadStream(workboxSWSrcPath).pipe(fs.createWriteStream(workboxSWDestPath))
fs.createReadStream(workboxSWSrcMapPath).pipe(fs.createWriteStream(workboxSWDestMapPath))
const updateUrl = (manifestEntries) => {
const manifest = manifestEntries.map((entry) => {
if (entry.url.startsWith(buildPrefix)) {
const regex = new RegExp(buildPrefix, 'g')
entry.url = entry.url.replace(regex, '')
}
return entry
})
return {
manifest,
warnings: []
}
}
config.manifestTransforms = [updateUrl]
swBuild.injectManifest(config).then(({
count,
size
}) => {
const wbSwRegex = /{fileName}/g
fs.readFile(config.swDest, 'utf8', (err, data) => {
if (err) {
throw err
}
const swFileContents = data.replace(wbSwRegex, wbFileName)
fs.writeFile(config.swDest, swFileContents, () => {
console.log(`Pre-cache Manifest generated. Pre-cached ${count} files, totalling ${size} bytes.`)
})
})
}).catch((error) => {
console.error(`Something went wrong: ${error}`)
})
+1820 -13
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
File diff suppressed because one or more lines are too long
+19 -19
View File
@@ -1,7 +1,7 @@
/*!
* Bootstrap Reboot v4.1.2 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Bootstrap Reboot v4.3.0 (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)
*/
@@ -15,22 +15,16 @@ html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
@-ms-viewport {
width: device-width;
}
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, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
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;
@@ -66,6 +60,8 @@ abbr[data-original-title] {
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
@@ -101,10 +97,6 @@ blockquote {
margin: 0 0 1rem;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: bolder;
@@ -134,7 +126,6 @@ a {
color: #007bff;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
@@ -168,7 +159,6 @@ pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
-ms-overflow-style: scrollbar;
}
figure {
@@ -180,7 +170,7 @@ img {
border-style: none;
}
svg:not(:root) {
svg {
overflow: hidden;
vertical-align: middle;
}
@@ -236,13 +226,24 @@ select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
html [type="button"],
[type="button"],
[type="reset"],
[type="submit"] {
-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,
@@ -302,7 +303,6 @@ progress {
-webkit-appearance: none;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
+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.1.2 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Bootstrap Reboot v4.3.0 (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%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}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,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";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}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}dfn{font-style:italic}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;-webkit-text-decoration-skip:objects}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;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){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=reset],[type=submit],button,html [type=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-cancel-button,[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{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */
File diff suppressed because one or more lines are too long
+1539 -524
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
+4112 -3707
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
+4049 -3705
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
+37 -16
View File
@@ -1,21 +1,41 @@
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
/*!
* Bootstrap alert.js v4.3.0 (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 = global || self, global.Alert = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Alert = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'alert';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -70,8 +90,8 @@ var Alert = function ($) {
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Private
} // Private
;
_proto._getRootElement = function _getRootElement(element) {
var selector = Util.getSelectorFromElement(element);
@@ -113,8 +133,8 @@ var Alert = function ($) {
_proto._destroyElement = function _destroyElement(element) {
$(element).detach().trigger(Event.CLOSED).remove();
}; // Static
} // Static
;
Alert._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -174,5 +194,6 @@ var Alert = function ($) {
};
return Alert;
}($);
//# sourceMappingURL=alert.js.map
}));
//# sourceMappingURL=alert.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+35 -15
View File
@@ -1,21 +1,40 @@
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
/*!
* Bootstrap button.js v4.3.0 (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 = global || self, global.Button = factory(global.jQuery));
}(this, function ($) { 'use strict';
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Button = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'button';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.button';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -28,7 +47,7 @@ var Button = function ($) {
var Selector = {
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
DATA_TOGGLE: '[data-toggle="buttons"]',
INPUT: 'input',
INPUT: 'input:not([type="hidden"])',
ACTIVE: '.active',
BUTTON: '.btn'
};
@@ -101,8 +120,8 @@ var Button = function ($) {
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Static
} // Static
;
Button._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -163,5 +182,6 @@ var Button = function ($) {
};
return Button;
}($);
//# sourceMappingURL=button.js.map
}));
//# sourceMappingURL=button.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+193 -36
View File
@@ -1,25 +1,75 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap carousel.js v4.3.0 (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 = global || self, global.Carousel = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Carousel = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'carousel';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -30,19 +80,22 @@ var Carousel = function ($) {
var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
var SWIPE_THRESHOLD = 40;
var Default = {
interval: 5000,
keyboard: true,
slide: false,
pause: 'hover',
wrap: true
wrap: true,
touch: true
};
var DefaultType = {
interval: '(number|boolean)',
keyboard: 'boolean',
slide: '(boolean|string)',
pause: '(string|boolean)',
wrap: 'boolean'
wrap: 'boolean',
touch: 'boolean'
};
var Direction = {
NEXT: 'next',
@@ -56,7 +109,12 @@ var Carousel = function ($) {
KEYDOWN: "keydown" + EVENT_KEY,
MOUSEENTER: "mouseenter" + EVENT_KEY,
MOUSELEAVE: "mouseleave" + EVENT_KEY,
TOUCHSTART: "touchstart" + EVENT_KEY,
TOUCHMOVE: "touchmove" + EVENT_KEY,
TOUCHEND: "touchend" + EVENT_KEY,
POINTERDOWN: "pointerdown" + EVENT_KEY,
POINTERUP: "pointerup" + EVENT_KEY,
DRAG_START: "dragstart" + EVENT_KEY,
LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY,
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
};
@@ -68,16 +126,22 @@ var Carousel = function ($) {
LEFT: 'carousel-item-left',
NEXT: 'carousel-item-next',
PREV: 'carousel-item-prev',
ITEM: 'carousel-item'
ITEM: 'carousel-item',
POINTER_EVENT: 'pointer-event'
};
var Selector = {
ACTIVE: '.active',
ACTIVE_ITEM: '.active.carousel-item',
ITEM: '.carousel-item',
ITEM_IMG: '.carousel-item img',
NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
INDICATORS: '.carousel-indicators',
DATA_SLIDE: '[data-slide], [data-slide-to]',
DATA_RIDE: '[data-ride="carousel"]'
};
var PointerType = {
TOUCH: 'touch',
PEN: 'pen'
/**
* ------------------------------------------------------------------------
* Class Definition
@@ -96,9 +160,13 @@ var Carousel = function ($) {
this._isPaused = false;
this._isSliding = false;
this.touchTimeout = null;
this.touchStartX = 0;
this.touchDeltaX = 0;
this._config = this._getConfig(config);
this._element = $(element)[0];
this._element = element;
this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);
this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
this._addEventListeners();
} // Getters
@@ -196,8 +264,8 @@ var Carousel = function ($) {
this._isSliding = null;
this._activeElement = null;
this._indicatorsElement = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
@@ -205,6 +273,25 @@ var Carousel = function ($) {
return config;
};
_proto._handleSwipe = function _handleSwipe() {
var absDeltax = Math.abs(this.touchDeltaX);
if (absDeltax <= SWIPE_THRESHOLD) {
return;
}
var direction = absDeltax / this.touchDeltaX; // swipe left
if (direction > 0) {
this.prev();
} // swipe right
if (direction < 0) {
this.next();
}
};
_proto._addEventListeners = function _addEventListeners() {
var _this2 = this;
@@ -220,8 +307,45 @@ var Carousel = function ($) {
}).on(Event.MOUSELEAVE, function (event) {
return _this2.cycle(event);
});
}
if ('ontouchstart' in document.documentElement) {
if (this._config.touch) {
this._addTouchEventListeners();
}
};
_proto._addTouchEventListeners = function _addTouchEventListeners() {
var _this3 = this;
if (!this._touchSupported) {
return;
}
var start = function start(event) {
if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
_this3.touchStartX = event.originalEvent.clientX;
} else if (!_this3._pointerEvent) {
_this3.touchStartX = event.originalEvent.touches[0].clientX;
}
};
var move = function move(event) {
// ensure swiping with one touch and not pinching
if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
_this3.touchDeltaX = 0;
} else {
_this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
}
};
var end = function end(event) {
if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
_this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
}
_this3._handleSwipe();
if (_this3._config.pause === 'hover') {
// If it's a touch-enabled device, mouseenter/leave are fired as
// part of the mouse compatibility events on first tap - the carousel
// would stop cycling until user tapped out of it;
@@ -229,18 +353,41 @@ var Carousel = function ($) {
// (as if it's the second time we tap on it, mouseenter compat event
// is NOT fired) and after a timeout (to allow for mouse compatibility
// events to fire) we explicitly restart cycling
$(this._element).on(Event.TOUCHEND, function () {
_this2.pause();
_this3.pause();
if (_this2.touchTimeout) {
clearTimeout(_this2.touchTimeout);
}
if (_this3.touchTimeout) {
clearTimeout(_this3.touchTimeout);
}
_this2.touchTimeout = setTimeout(function (event) {
return _this2.cycle(event);
}, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);
});
_this3.touchTimeout = setTimeout(function (event) {
return _this3.cycle(event);
}, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
}
};
$(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, function (e) {
return e.preventDefault();
});
if (this._pointerEvent) {
$(this._element).on(Event.POINTERDOWN, function (event) {
return start(event);
});
$(this._element).on(Event.POINTERUP, function (event) {
return end(event);
});
this._element.classList.add(ClassName.POINTER_EVENT);
} else {
$(this._element).on(Event.TOUCHSTART, function (event) {
return start(event);
});
$(this._element).on(Event.TOUCHMOVE, function (event) {
return move(event);
});
$(this._element).on(Event.TOUCHEND, function (event) {
return end(event);
});
}
};
@@ -316,7 +463,7 @@ var Carousel = function ($) {
};
_proto._slide = function _slide(direction, element) {
var _this3 = this;
var _this4 = this;
var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
@@ -377,13 +524,22 @@ var Carousel = function ($) {
Util.reflow(nextElement);
$(activeElement).addClass(directionalClassName);
$(nextElement).addClass(directionalClassName);
var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
if (nextElementInterval) {
this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
this._config.interval = nextElementInterval;
} else {
this._config.interval = this._config.defaultInterval || this._config.interval;
}
var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
$(activeElement).one(Util.TRANSITION_END, function () {
$(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE);
$(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName);
_this3._isSliding = false;
_this4._isSliding = false;
setTimeout(function () {
return $(_this3._element).trigger(slidEvent);
return $(_this4._element).trigger(slidEvent);
}, 0);
}).emulateTransitionEnd(transitionDuration);
} else {
@@ -396,8 +552,8 @@ var Carousel = function ($) {
if (isCycling) {
this.cycle();
}
}; // Static
} // Static
;
Carousel._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -424,7 +580,7 @@ var Carousel = function ($) {
}
data[action]();
} else if (_config.interval) {
} else if (_config.interval && _config.ride) {
data.pause();
data.cycle();
}
@@ -507,5 +663,6 @@ var Carousel = function ($) {
};
return Carousel;
}($);
//# sourceMappingURL=carousel.js.map
}));
//# sourceMappingURL=carousel.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+79 -26
View File
@@ -1,25 +1,75 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap collapse.js v4.3.0 (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 = global || self, global.Collapse = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Collapse = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'collapse';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -67,7 +117,7 @@ var Collapse = function ($) {
this._isTransitioning = false;
this._element = element;
this._config = this._getConfig(config);
this._triggerArray = $.makeArray(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
for (var i = 0, len = toggleList.length; i < len; i++) {
@@ -119,7 +169,11 @@ var Collapse = function ($) {
if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
return elem.getAttribute('data-parent') === _this._config.parent;
if (typeof _this._config.parent === 'string') {
return elem.getAttribute('data-parent') === _this._config.parent;
}
return elem.classList.contains(ClassName.COLLAPSE);
});
if (actives.length === 0) {
@@ -237,8 +291,8 @@ var Collapse = function ($) {
this._element = null;
this._triggerArray = null;
this._isTransitioning = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
@@ -256,7 +310,7 @@ var Collapse = function ($) {
_proto._getParent = function _getParent() {
var _this3 = this;
var parent = null;
var parent;
if (Util.isElement(this._config.parent)) {
parent = this._config.parent; // It's a jQuery object
@@ -277,15 +331,13 @@ var Collapse = function ($) {
};
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
if (element) {
var isOpen = $(element).hasClass(ClassName.SHOW);
var isOpen = $(element).hasClass(ClassName.SHOW);
if (triggerArray.length) {
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
}
if (triggerArray.length) {
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
}
}; // Static
} // Static
;
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
var selector = Util.getSelectorFromElement(element);
@@ -371,5 +423,6 @@ var Collapse = function ($) {
};
return Collapse;
}($);
//# sourceMappingURL=collapse.js.map
}));
//# sourceMappingURL=collapse.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+128 -28
View File
@@ -1,25 +1,76 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap dropdown.js v4.3.0 (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 = global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
}(this, function ($, Popper, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Dropdown = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'dropdown';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -144,7 +195,7 @@ var Dropdown = function ($) {
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
}
var referenceElement = this._element;
@@ -185,6 +236,50 @@ var Dropdown = function ($) {
$(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;
}
var relatedTarget = {
relatedTarget: this._element
};
var hideEvent = $.Event(Event.HIDE, relatedTarget);
var parent = Dropdown._getParentFromElement(this._element);
$(parent).trigger(hideEvent);
if (hideEvent.isDefaultPrevented()) {
return;
}
$(this._menu).toggleClass(ClassName.SHOW);
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
};
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._element).off(EVENT_KEY);
@@ -204,8 +299,8 @@ var Dropdown = function ($) {
if (this._popper !== null) {
this._popper.scheduleUpdate();
}
}; // Private
} // Private
;
_proto._addEventListeners = function _addEventListeners() {
var _this = this;
@@ -261,24 +356,28 @@ var Dropdown = function ($) {
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 = _objectSpread({}, 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
},
@@ -296,8 +395,8 @@ var Dropdown = function ($) {
}
return popperConfig;
}; // Static
} // Static
;
Dropdown._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -381,8 +480,8 @@ var Dropdown = function ($) {
}
return parent || element.parentNode;
}; // eslint-disable-next-line complexity
} // eslint-disable-next-line complexity
;
Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
// If not input/textarea:
@@ -407,7 +506,7 @@ var Dropdown = function ($) {
var isActive = $(parent).hasClass(ClassName.SHOW);
if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
var toggle = parent.querySelector(Selector.DATA_TOGGLE);
$(toggle).trigger('focus');
@@ -491,5 +590,6 @@ var Dropdown = function ($) {
};
return Dropdown;
}($, Popper);
//# sourceMappingURL=dropdown.js.map
}));
//# sourceMappingURL=dropdown.js.map
+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.1.2): index.js
* Bootstrap (v4.3.0): index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
+99 -27
View File
@@ -1,25 +1,75 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap modal.js v4.3.0 (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 = global || self, global.Modal = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Modal = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'modal';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -52,6 +102,7 @@ var Modal = function ($) {
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',
@@ -60,6 +111,7 @@ var Modal = function ($) {
};
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',
@@ -83,6 +135,7 @@ var Modal = function ($) {
this._isShown = false;
this._isBodyOverflowing = false;
this._ignoreBackdropClick = false;
this._isTransitioning = false;
this._scrollbarWidth = 0;
} // Getters
@@ -97,7 +150,7 @@ var Modal = function ($) {
_proto.show = function show(relatedTarget) {
var _this = this;
if (this._isTransitioning || this._isShown) {
if (this._isShown || this._isTransitioning) {
return;
}
@@ -122,8 +175,6 @@ var Modal = function ($) {
this._adjustDialog();
$(document.body).addClass(ClassName.OPEN);
this._setEscapeEvent();
this._setResizeEvent();
@@ -151,7 +202,7 @@ var Modal = function ($) {
event.preventDefault();
}
if (this._isTransitioning || !this._isShown) {
if (!this._isShown || this._isTransitioning) {
return;
}
@@ -189,8 +240,17 @@ var Modal = function ($) {
};
_proto.dispose = function dispose() {
[window, this._element, this._dialog].forEach(function (htmlElement) {
return $(htmlElement).off(EVENT_KEY);
});
/**
* `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
* Do not move `document` in `htmlElements` array
* It will remove `Event.CLICK_DATA_API` event that should remain
*/
$(document).off(Event.FOCUSIN);
$.removeData(this._element, DATA_KEY);
$(window, document, this._element, this._backdrop).off(EVENT_KEY);
this._config = null;
this._element = null;
this._dialog = null;
@@ -198,13 +258,14 @@ var Modal = function ($) {
this._isShown = null;
this._isBodyOverflowing = null;
this._ignoreBackdropClick = null;
this._isTransitioning = null;
this._scrollbarWidth = null;
};
_proto.handleUpdate = function handleUpdate() {
this._adjustDialog();
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, config);
@@ -226,7 +287,13 @@ var Modal = function ($) {
this._element.removeAttribute('aria-hidden');
this._element.scrollTop = 0;
this._element.setAttribute('aria-modal', true);
if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
} else {
this._element.scrollTop = 0;
}
if (transition) {
Util.reflow(this._element);
@@ -252,7 +319,7 @@ var Modal = function ($) {
};
if (transition) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
} else {
transitionComplete();
@@ -305,6 +372,8 @@ var Modal = function ($) {
this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal');
this._isTransitioning = false;
this._showBackdrop(function () {
@@ -394,11 +463,11 @@ var Modal = function ($) {
} 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;
@@ -448,6 +517,8 @@ var Modal = function ($) {
var calculatedPadding = $(document.body).css('padding-right');
$(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
}
$(document.body).addClass(ClassName.OPEN);
};
_proto._resetScrollbar = function _resetScrollbar() {
@@ -481,8 +552,8 @@ var Modal = function ($) {
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 () {
@@ -574,5 +645,6 @@ var Modal = function ($) {
};
return Modal;
}($);
//# sourceMappingURL=modal.js.map
}));
//# sourceMappingURL=modal.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+75 -20
View File
@@ -1,27 +1,81 @@
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
/*!
* Bootstrap popover.js v4.3.0 (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 = global || self, global.Popover = factory(global.jQuery, global.Tooltip));
}(this, function ($, Tooltip) { 'use strict';
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Tooltip = Tooltip && Tooltip.hasOwnProperty('default') ? Tooltip['default'] : Tooltip;
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
subClass.__proto__ = superClass;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Popover = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'popover';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -104,8 +158,8 @@ var Popover = function ($) {
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;
@@ -118,8 +172,8 @@ var Popover = function ($) {
if (tabClass !== null && tabClass.length > 0) {
$tip.removeClass(tabClass.join(''));
}
}; // Static
} // Static
;
Popover._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -127,7 +181,7 @@ var Popover = function ($) {
var _config = typeof config === 'object' ? config : null;
if (!data && /destroy|hide/.test(config)) {
if (!data && /dispose|hide/.test(config)) {
return;
}
@@ -202,5 +256,6 @@ var Popover = function ($) {
};
return Popover;
}($);
//# sourceMappingURL=popover.js.map
}));
//# sourceMappingURL=popover.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+77 -25
View File
@@ -1,25 +1,75 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap scrollspy.js v4.3.0 (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 = global || self, global.ScrollSpy = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var ScrollSpy = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'scrollspy';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -142,8 +192,8 @@ var ScrollSpy = function ($) {
this._targets = null;
this._activeTarget = null;
this._scrollHeight = null;
}; // Private
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
@@ -220,12 +270,10 @@ var ScrollSpy = function ($) {
this._clear();
var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style
queries = queries.map(function (selector) {
return selector + "[data-target=\"" + target + "\"]," + (selector + "[href=\"" + target + "\"]");
var queries = this._selector.split(',').map(function (selector) {
return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
});
var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
@@ -247,10 +295,13 @@ var ScrollSpy = function ($) {
};
_proto._clear = function _clear() {
var nodes = [].slice.call(document.querySelectorAll(this._selector));
$(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
}; // Static
[].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
return node.classList.contains(ClassName.ACTIVE);
}).forEach(function (node) {
return node.classList.remove(ClassName.ACTIVE);
});
} // Static
;
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -319,5 +370,6 @@ var ScrollSpy = function ($) {
};
return ScrollSpy;
}($);
//# sourceMappingURL=scrollspy.js.map
}));
//# sourceMappingURL=scrollspy.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+45 -28
View File
@@ -1,21 +1,41 @@
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
/*!
* Bootstrap tab.js v4.3.0 (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 = global || self, global.Tab = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Tab = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'tab';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = "." + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -74,7 +94,7 @@ var Tab = function ($) {
var selector = Util.getSelectorFromElement(this._element);
if (listElement) {
var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
previous = $.makeArray($(listElement).find(itemSelector));
previous = previous[previous.length - 1];
}
@@ -123,20 +143,13 @@ var Tab = function ($) {
_proto.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}; // Private
} // Private
;
_proto._activate = function _activate(element, container, callback) {
var _this2 = this;
var activeElements;
if (container.nodeName === 'UL') {
activeElements = $(container).find(Selector.ACTIVE_UL);
} else {
activeElements = $(container).children(Selector.ACTIVE);
}
var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector.ACTIVE_UL) : $(container).children(Selector.ACTIVE);
var active = activeElements[0];
var isTransitioning = callback && active && $(active).hasClass(ClassName.FADE);
@@ -146,7 +159,7 @@ var Tab = function ($) {
if (active && isTransitioning) {
var transitionDuration = Util.getTransitionDurationFromElement(active);
$(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
$(active).removeClass(ClassName.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
@@ -154,7 +167,7 @@ var Tab = function ($) {
_proto._transitionComplete = function _transitionComplete(element, active, callback) {
if (active) {
$(active).removeClass(ClassName.SHOW + " " + ClassName.ACTIVE);
$(active).removeClass(ClassName.ACTIVE);
var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
if (dropdownChild) {
@@ -173,7 +186,10 @@ var Tab = function ($) {
}
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];
@@ -189,8 +205,8 @@ var Tab = function ($) {
if (callback) {
callback();
}
}; // Static
} // Static
;
Tab._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -248,5 +264,6 @@ var Tab = function ($) {
};
return Tab;
}($);
//# sourceMappingURL=tab.js.map
}));
//# sourceMappingURL=tab.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+283
View File
@@ -0,0 +1,283 @@
/*!
* Bootstrap toast.js v4.3.0 (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 = global || self, global.Toast = factory(global.jQuery, global.Util));
}(this, function ($, Util) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'toast';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.toast';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var Event = {
CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
HIDE: "hide" + EVENT_KEY,
HIDDEN: "hidden" + EVENT_KEY,
SHOW: "show" + EVENT_KEY,
SHOWN: "shown" + EVENT_KEY
};
var ClassName = {
FADE: 'fade',
HIDE: 'hide',
SHOW: 'show',
SHOWING: 'showing'
};
var DefaultType = {
animation: 'boolean',
autohide: 'boolean',
delay: 'number'
};
var Default = {
animation: true,
autohide: true,
delay: 500
};
var Selector = {
DATA_DISMISS: '[data-dismiss="toast"]'
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
};
var Toast =
/*#__PURE__*/
function () {
function Toast(element, config) {
this._element = element;
this._config = this._getConfig(config);
this._timeout = null;
this._setListeners();
} // Getters
var _proto = Toast.prototype;
// Public
_proto.show = function show() {
var _this = this;
$(this._element).trigger(Event.SHOW);
if (this._config.animation) {
this._element.classList.add(ClassName.FADE);
}
var complete = function complete() {
_this._element.classList.remove(ClassName.SHOWING);
_this._element.classList.add(ClassName.SHOW);
$(_this._element).trigger(Event.SHOWN);
if (_this._config.autohide) {
_this.hide();
}
};
this._element.classList.remove(ClassName.HIDE);
this._element.classList.add(ClassName.SHOWING);
if (this._config.animation) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
};
_proto.hide = function hide(withoutTimeout) {
var _this2 = this;
if (!this._element.classList.contains(ClassName.SHOW)) {
return;
}
$(this._element).trigger(Event.HIDE);
if (withoutTimeout) {
this._close();
} else {
this._timeout = setTimeout(function () {
_this2._close();
}, this._config.delay);
}
};
_proto.dispose = function dispose() {
clearTimeout(this._timeout);
this._timeout = null;
if (this._element.classList.contains(ClassName.SHOW)) {
this._element.classList.remove(ClassName.SHOW);
}
$(this._element).off(Event.CLICK_DISMISS);
$.removeData(this._element, DATA_KEY);
this._element = null;
this._config = null;
} // Private
;
_proto._getConfig = function _getConfig(config) {
config = _objectSpread({}, Default, $(this._element).data(), typeof config === 'object' && config ? config : {});
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config;
};
_proto._setListeners = function _setListeners() {
var _this3 = this;
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function () {
return _this3.hide(true);
});
};
_proto._close = function _close() {
var _this4 = this;
var complete = function complete() {
_this4._element.classList.add(ClassName.HIDE);
$(_this4._element).trigger(Event.HIDDEN);
};
this._element.classList.remove(ClassName.SHOW);
if (this._config.animation) {
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
} else {
complete();
}
} // Static
;
Toast._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var $element = $(this);
var data = $element.data(DATA_KEY);
var _config = typeof config === 'object' && config;
if (!data) {
data = new Toast(this, _config);
$element.data(DATA_KEY, data);
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError("No method named \"" + config + "\"");
}
data[config](this);
}
});
};
_createClass(Toast, null, [{
key: "VERSION",
get: function get() {
return VERSION;
}
}, {
key: "DefaultType",
get: function get() {
return DefaultType;
}
}, {
key: "Default",
get: function get() {
return Default;
}
}]);
return Toast;
}();
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Toast._jQueryInterface;
$.fn[NAME].Constructor = Toast;
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT;
return Toast._jQueryInterface;
};
return Toast;
}));
//# sourceMappingURL=toast.js.map
+1
View File
File diff suppressed because one or more lines are too long
+123 -40
View File
@@ -1,25 +1,76 @@
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
/*!
* Bootstrap tooltip.js v4.3.0 (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 = global || self, global.Tooltip = factory(global.jQuery, global.Popper, global.Util));
}(this, function ($, Popper, Util) { 'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Tooltip = function ($) {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'tooltip';
var VERSION = '4.1.2';
var VERSION = '4.3.0';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = "." + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -34,7 +85,7 @@ var Tooltip = function ($) {
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)'
@@ -107,7 +158,7 @@ var Tooltip = function ($) {
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
} // private
@@ -208,7 +259,8 @@ var Tooltip = function ($) {
if (this.isWithContent() && this._isEnabled) {
$(this.element).trigger(showEvent);
var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
var shadowRoot = Util.findShadowRoot(this.element);
var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
if (showEvent.isDefaultPrevented() || !isInTheDom) {
return;
@@ -229,7 +281,9 @@ var Tooltip = function ($) {
var attachment = this._getAttachment(placement);
this.addAttachmentClass(attachment);
var container = this.config.container === false ? document.body : $(document).find(this.config.container);
var container = this._getContainer();
$(tip).data(this.constructor.DATA_KEY, this);
if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
@@ -240,9 +294,7 @@ var Tooltip = function ($) {
this._popper = new Popper(this.element, tip, {
placement: attachment,
modifiers: {
offset: {
offset: this.config.offset
},
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
@@ -259,7 +311,7 @@ var Tooltip = function ($) {
}
},
onUpdate: function onUpdate(data) {
_this._handlePopperPlacementChange(data);
return _this._handlePopperPlacementChange(data);
}
});
$(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
@@ -351,8 +403,8 @@ var Tooltip = function ($) {
if (this._popper !== null) {
this._popper.scheduleUpdate();
}
}; // Protected
} // Protected
;
_proto.isWithContent = function isWithContent() {
return Boolean(this.getTitle());
@@ -398,35 +450,65 @@ var Tooltip = function ($) {
}
return title;
}; // Private
} // Private
;
_proto._getOffset = function _getOffset() {
var _this3 = this;
var offset = {};
if (typeof this.config.offset === 'function') {
offset.fn = function (data) {
data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
return data;
};
} else {
offset.offset = this.config.offset;
}
return offset;
};
_proto._getContainer = function _getContainer() {
if (this.config.container === false) {
return document.body;
}
if (Util.isElement(this.config.container)) {
return $(this.config.container);
}
return $(document).find(this.config.container);
};
_proto._getAttachment = function _getAttachment(placement) {
return AttachmentMap[placement.toUpperCase()];
};
_proto._setListeners = function _setListeners() {
var _this3 = this;
var _this4 = 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);
$(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
return _this4.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 ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
$(_this4.element).on(eventIn, _this4.config.selector, function (event) {
return _this4._enter(event);
}).on(eventOut, _this4.config.selector, function (event) {
return _this4._leave(event);
});
}
$(_this3.element).closest('.modal').on('hide.bs.modal', function () {
return _this3.hide();
});
});
$(this.element).closest('.modal').on('hide.bs.modal', function () {
if (_this4.element) {
_this4.hide();
}
});
if (this.config.selector) {
@@ -590,8 +672,8 @@ var Tooltip = function ($) {
this.hide();
this.show();
this.config.animation = initConfigAnimation;
}; // Static
} // Static
;
Tooltip._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
@@ -673,5 +755,6 @@ var Tooltip = function ($) {
};
return Tooltip;
}($, Popper);
//# sourceMappingURL=tooltip.js.map
}));
//# sourceMappingURL=tooltip.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+54 -13
View File
@@ -1,15 +1,28 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
var Util = function ($) {
/*!
* Bootstrap util.js v4.3.0 (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 = global || self, global.Util = factory(global.jQuery));
}(this, function ($) { 'use strict';
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.0): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
/**
* ------------------------------------------------------------------------
* Private TransitionEnd Helpers
* ------------------------------------------------------------------------
*/
var TRANSITION_END = 'transitionend';
var MAX_UID = 1000000;
var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
@@ -72,7 +85,8 @@ var Util = function ($) {
var selector = element.getAttribute('data-target');
if (!selector || selector === '#') {
selector = element.getAttribute('href') || '';
var hrefAttr = element.getAttribute('href');
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
}
try {
@@ -88,15 +102,18 @@ var Util = function ($) {
var transitionDuration = $(element).css('transition-duration');
var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found
var transitionDelay = $(element).css('transition-delay');
var floatTransitionDuration = parseFloat(transitionDuration);
var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration) {
if (!floatTransitionDuration && !floatTransitionDelay) {
return 0;
} // If multiple durations are defined, take the first
transitionDuration = transitionDuration.split(',')[0];
return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;
transitionDelay = transitionDelay.split(',')[0];
return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
},
reflow: function reflow(element) {
return element.offsetHeight;
@@ -123,9 +140,33 @@ var Util = function ($) {
}
}
}
},
findShadowRoot: function findShadowRoot(element) {
if (!document.documentElement.attachShadow) {
return null;
} // Can find the shadow root otherwise it'll return the document
if (typeof element.getRootNode === 'function') {
var root = element.getRootNode();
return root instanceof ShadowRoot ? root : null;
}
if (element instanceof ShadowRoot) {
return element;
} // when we don't find a shadow root
if (!element.parentNode) {
return null;
}
return Util.findShadowRoot(element.parentNode);
}
};
setTransitionEndSupport();
return Util;
}($);
//# sourceMappingURL=util.js.map
}));
//# sourceMappingURL=util.js.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+156 -160
View File
@@ -1,183 +1,179 @@
import $ from 'jquery'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): alert.js
* Bootstrap (v4.3.0): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Alert = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
import Util from './util'
const NAME = 'alert'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Selector = {
DISMISS : '[data-dismiss="alert"]'
const NAME = 'alert'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Selector = {
DISMISS : '[data-dismiss="alert"]'
}
const Event = {
CLOSE : `close${EVENT_KEY}`,
CLOSED : `closed${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
const ClassName = {
ALERT : 'alert',
FADE : 'fade',
SHOW : 'show'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Alert {
constructor(element) {
this._element = element
}
const Event = {
CLOSE : `close${EVENT_KEY}`,
CLOSED : `closed${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
// Getters
static get VERSION() {
return VERSION
}
const ClassName = {
ALERT : 'alert',
FADE : 'fade',
SHOW : 'show'
// Public
close(element) {
let rootElement = this._element
if (element) {
rootElement = this._getRootElement(element)
}
const customEvent = this._triggerCloseEvent(rootElement)
if (customEvent.isDefaultPrevented()) {
return
}
this._removeElement(rootElement)
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Alert {
constructor(element) {
this._element = element
}
// Getters
static get VERSION() {
return VERSION
}
// Public
close(element) {
let rootElement = this._element
if (element) {
rootElement = this._getRootElement(element)
}
const customEvent = this._triggerCloseEvent(rootElement)
if (customEvent.isDefaultPrevented()) {
return
}
this._removeElement(rootElement)
}
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
// Private
_getRootElement(element) {
const selector = Util.getSelectorFromElement(element)
let parent = false
if (selector) {
parent = document.querySelector(selector)
}
if (!parent) {
parent = $(element).closest(`.${ClassName.ALERT}`)[0]
}
return parent
}
_triggerCloseEvent(element) {
const closeEvent = $.Event(Event.CLOSE)
$(element).trigger(closeEvent)
return closeEvent
}
_removeElement(element) {
$(element).removeClass(ClassName.SHOW)
if (!$(element).hasClass(ClassName.FADE)) {
this._destroyElement(element)
return
}
const transitionDuration = Util.getTransitionDurationFromElement(element)
$(element)
.one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
.emulateTransitionEnd(transitionDuration)
}
_destroyElement(element) {
$(element)
.detach()
.trigger(Event.CLOSED)
.remove()
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
const $element = $(this)
let data = $element.data(DATA_KEY)
if (!data) {
data = new Alert(this)
$element.data(DATA_KEY, data)
}
if (config === 'close') {
data[config](this)
}
})
}
static _handleDismiss(alertInstance) {
return function (event) {
if (event) {
event.preventDefault()
}
alertInstance.close(this)
}
}
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
// Private
$(document).on(
Event.CLICK_DATA_API,
Selector.DISMISS,
Alert._handleDismiss(new Alert())
)
_getRootElement(element) {
const selector = Util.getSelectorFromElement(element)
let parent = false
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
if (selector) {
parent = document.querySelector(selector)
}
$.fn[NAME] = Alert._jQueryInterface
$.fn[NAME].Constructor = Alert
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Alert._jQueryInterface
if (!parent) {
parent = $(element).closest(`.${ClassName.ALERT}`)[0]
}
return parent
}
return Alert
})($)
_triggerCloseEvent(element) {
const closeEvent = $.Event(Event.CLOSE)
$(element).trigger(closeEvent)
return closeEvent
}
_removeElement(element) {
$(element).removeClass(ClassName.SHOW)
if (!$(element).hasClass(ClassName.FADE)) {
this._destroyElement(element)
return
}
const transitionDuration = Util.getTransitionDurationFromElement(element)
$(element)
.one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
.emulateTransitionEnd(transitionDuration)
}
_destroyElement(element) {
$(element)
.detach()
.trigger(Event.CLOSED)
.remove()
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
const $element = $(this)
let data = $element.data(DATA_KEY)
if (!data) {
data = new Alert(this)
$element.data(DATA_KEY, data)
}
if (config === 'close') {
data[config](this)
}
})
}
static _handleDismiss(alertInstance) {
return function (event) {
if (event) {
event.preventDefault()
}
alertInstance.close(this)
}
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(document).on(
Event.CLICK_DATA_API,
Selector.DISMISS,
Alert._handleDismiss(new Alert())
)
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Alert._jQueryInterface
$.fn[NAME].Constructor = Alert
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Alert._jQueryInterface
}
export default Alert
+137 -141
View File
@@ -1,175 +1,171 @@
import $ from 'jquery'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): button.js
* Bootstrap (v4.3.0): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Button = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
const NAME = 'button'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const ClassName = {
ACTIVE : 'active',
BUTTON : 'btn',
FOCUS : 'focus'
const NAME = 'button'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const ClassName = {
ACTIVE : 'active',
BUTTON : 'btn',
FOCUS : 'focus'
}
const Selector = {
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
DATA_TOGGLE : '[data-toggle="buttons"]',
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}`
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Button {
constructor(element) {
this._element = element
}
const Selector = {
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
DATA_TOGGLE : '[data-toggle="buttons"]',
INPUT : 'input',
ACTIVE : '.active',
BUTTON : '.btn'
// Getters
static get VERSION() {
return VERSION
}
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}`
}
// Public
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
toggle() {
let triggerChangeEvent = true
let addAriaPressed = true
const rootElement = $(this._element).closest(
Selector.DATA_TOGGLE
)[0]
class Button {
constructor(element) {
this._element = element
}
if (rootElement) {
const input = this._element.querySelector(Selector.INPUT)
// Getters
if (input) {
if (input.type === 'radio') {
if (input.checked &&
this._element.classList.contains(ClassName.ACTIVE)) {
triggerChangeEvent = false
} else {
const activeElement = rootElement.querySelector(Selector.ACTIVE)
static get VERSION() {
return VERSION
}
// Public
toggle() {
let triggerChangeEvent = true
let addAriaPressed = true
const rootElement = $(this._element).closest(
Selector.DATA_TOGGLE
)[0]
if (rootElement) {
const input = this._element.querySelector(Selector.INPUT)
if (input) {
if (input.type === 'radio') {
if (input.checked &&
this._element.classList.contains(ClassName.ACTIVE)) {
triggerChangeEvent = false
} else {
const activeElement = rootElement.querySelector(Selector.ACTIVE)
if (activeElement) {
$(activeElement).removeClass(ClassName.ACTIVE)
}
if (activeElement) {
$(activeElement).removeClass(ClassName.ACTIVE)
}
}
}
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')
if (triggerChangeEvent) {
if (input.hasAttribute('disabled') ||
rootElement.hasAttribute('disabled') ||
input.classList.contains('disabled') ||
rootElement.classList.contains('disabled')) {
return
}
input.focus()
addAriaPressed = false
input.checked = !this._element.classList.contains(ClassName.ACTIVE)
$(input).trigger('change')
}
}
if (addAriaPressed) {
this._element.setAttribute('aria-pressed',
!this._element.classList.contains(ClassName.ACTIVE))
}
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE)
input.focus()
addAriaPressed = false
}
}
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
if (addAriaPressed) {
this._element.setAttribute('aria-pressed',
!this._element.classList.contains(ClassName.ACTIVE))
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
if (!data) {
data = new Button(this)
$(this).data(DATA_KEY, data)
}
if (config === 'toggle') {
data[config]()
}
})
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE)
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(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._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))
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Button._jQueryInterface
$.fn[NAME].Constructor = Button
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Button._jQueryInterface
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
return Button
})($)
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
if (!data) {
data = new Button(this)
$(this).data(DATA_KEY, data)
}
if (config === 'toggle') {
data[config]()
}
})
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(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._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))
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Button._jQueryInterface
$.fn[NAME].Constructor = Button
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Button._jQueryInterface
}
export default Button
+526 -440
View File
File diff suppressed because it is too large Load Diff
+343 -339
View File
@@ -1,398 +1,402 @@
import $ from 'jquery'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): collapse.js
* Bootstrap (v4.3.0): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Collapse = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
import Util from './util'
const NAME = 'collapse'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Default = {
toggle : true,
parent : ''
}
const NAME = 'collapse'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const DefaultType = {
toggle : 'boolean',
parent : '(string|element)'
}
const Default = {
toggle : true,
parent : ''
}
const Event = {
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
const DefaultType = {
toggle : 'boolean',
parent : '(string|element)'
}
const ClassName = {
SHOW : 'show',
COLLAPSE : 'collapse',
COLLAPSING : 'collapsing',
COLLAPSED : 'collapsed'
}
const Event = {
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
const Dimension = {
WIDTH : 'width',
HEIGHT : 'height'
}
const ClassName = {
SHOW : 'show',
COLLAPSE : 'collapse',
COLLAPSING : 'collapsing',
COLLAPSED : 'collapsed'
}
const Selector = {
ACTIVES : '.show, .collapsing',
DATA_TOGGLE : '[data-toggle="collapse"]'
}
const Dimension = {
WIDTH : 'width',
HEIGHT : 'height'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
const Selector = {
ACTIVES : '.show, .collapsing',
DATA_TOGGLE : '[data-toggle="collapse"]'
}
class Collapse {
constructor(element, config) {
this._isTransitioning = false
this._element = element
this._config = this._getConfig(config)
this._triggerArray = $.makeArray(document.querySelectorAll(
`[data-toggle="collapse"][href="#${element.id}"],` +
`[data-toggle="collapse"][data-target="#${element.id}"]`
))
const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
for (let i = 0, len = toggleList.length; i < len; i++) {
const elem = toggleList[i]
const selector = Util.getSelectorFromElement(elem)
const filterElement = [].slice.call(document.querySelectorAll(selector))
.filter((foundElem) => foundElem === element)
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
if (selector !== null && filterElement.length > 0) {
this._selector = selector
this._triggerArray.push(elem)
}
}
class Collapse {
constructor(element, config) {
this._isTransitioning = false
this._element = element
this._config = this._getConfig(config)
this._triggerArray = [].slice.call(document.querySelectorAll(
`[data-toggle="collapse"][href="#${element.id}"],` +
`[data-toggle="collapse"][data-target="#${element.id}"]`
))
this._parent = this._config.parent ? this._getParent() : null
const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
for (let i = 0, len = toggleList.length; i < len; i++) {
const elem = toggleList[i]
const selector = Util.getSelectorFromElement(elem)
const filterElement = [].slice.call(document.querySelectorAll(selector))
.filter((foundElem) => foundElem === element)
if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._element, this._triggerArray)
}
if (this._config.toggle) {
this.toggle()
if (selector !== null && filterElement.length > 0) {
this._selector = selector
this._triggerArray.push(elem)
}
}
// Getters
this._parent = this._config.parent ? this._getParent() : null
static get VERSION() {
return VERSION
if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._element, this._triggerArray)
}
static get Default() {
return Default
if (this._config.toggle) {
this.toggle()
}
}
// Getters
static get VERSION() {
return VERSION
}
static get Default() {
return Default
}
// Public
toggle() {
if ($(this._element).hasClass(ClassName.SHOW)) {
this.hide()
} else {
this.show()
}
}
show() {
if (this._isTransitioning ||
$(this._element).hasClass(ClassName.SHOW)) {
return
}
// Public
let actives
let activesData
toggle() {
if ($(this._element).hasClass(ClassName.SHOW)) {
this.hide()
} else {
this.show()
}
}
show() {
if (this._isTransitioning ||
$(this._element).hasClass(ClassName.SHOW)) {
return
}
let actives
let activesData
if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))
.filter((elem) => elem.getAttribute('data-parent') === this._config.parent)
if (actives.length === 0) {
actives = null
}
}
if (actives) {
activesData = $(actives).not(this._selector).data(DATA_KEY)
if (activesData && activesData._isTransitioning) {
return
}
}
const startEvent = $.Event(Event.SHOW)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
}
if (actives) {
Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')
if (!activesData) {
$(actives).data(DATA_KEY, null)
}
}
const dimension = this._getDimension()
$(this._element)
.removeClass(ClassName.COLLAPSE)
.addClass(ClassName.COLLAPSING)
this._element.style[dimension] = 0
if (this._triggerArray.length) {
$(this._triggerArray)
.removeClass(ClassName.COLLAPSED)
.attr('aria-expanded', true)
}
this.setTransitioning(true)
const complete = () => {
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.addClass(ClassName.SHOW)
this._element.style[dimension] = ''
this.setTransitioning(false)
$(this._element).trigger(Event.SHOWN)
}
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
const scrollSize = `scroll${capitalizedDimension}`
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
this._element.style[dimension] = `${this._element[scrollSize]}px`
}
hide() {
if (this._isTransitioning ||
!$(this._element).hasClass(ClassName.SHOW)) {
return
}
const startEvent = $.Event(Event.HIDE)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
}
const dimension = this._getDimension()
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
Util.reflow(this._element)
$(this._element)
.addClass(ClassName.COLLAPSING)
.removeClass(ClassName.COLLAPSE)
.removeClass(ClassName.SHOW)
const triggerArrayLength = this._triggerArray.length
if (triggerArrayLength > 0) {
for (let i = 0; i < triggerArrayLength; i++) {
const trigger = this._triggerArray[i]
const selector = Util.getSelectorFromElement(trigger)
if (selector !== null) {
const $elem = $([].slice.call(document.querySelectorAll(selector)))
if (!$elem.hasClass(ClassName.SHOW)) {
$(trigger).addClass(ClassName.COLLAPSED)
.attr('aria-expanded', false)
}
if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))
.filter((elem) => {
if (typeof this._config.parent === 'string') {
return elem.getAttribute('data-parent') === this._config.parent
}
}
}
this.setTransitioning(true)
return elem.classList.contains(ClassName.COLLAPSE)
})
const complete = () => {
this.setTransitioning(false)
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.trigger(Event.HIDDEN)
if (actives.length === 0) {
actives = null
}
}
if (actives) {
activesData = $(actives).not(this._selector).data(DATA_KEY)
if (activesData && activesData._isTransitioning) {
return
}
}
const startEvent = $.Event(Event.SHOW)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
}
if (actives) {
Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')
if (!activesData) {
$(actives).data(DATA_KEY, null)
}
}
const dimension = this._getDimension()
$(this._element)
.removeClass(ClassName.COLLAPSE)
.addClass(ClassName.COLLAPSING)
this._element.style[dimension] = 0
if (this._triggerArray.length) {
$(this._triggerArray)
.removeClass(ClassName.COLLAPSED)
.attr('aria-expanded', true)
}
this.setTransitioning(true)
const complete = () => {
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.addClass(ClassName.SHOW)
this._element.style[dimension] = ''
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
this.setTransitioning(false)
$(this._element).trigger(Event.SHOWN)
}
setTransitioning(isTransitioning) {
this._isTransitioning = isTransitioning
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
const scrollSize = `scroll${capitalizedDimension}`
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
this._element.style[dimension] = `${this._element[scrollSize]}px`
}
hide() {
if (this._isTransitioning ||
!$(this._element).hasClass(ClassName.SHOW)) {
return
}
dispose() {
$.removeData(this._element, DATA_KEY)
this._config = null
this._parent = null
this._element = null
this._triggerArray = null
this._isTransitioning = null
const startEvent = $.Event(Event.HIDE)
$(this._element).trigger(startEvent)
if (startEvent.isDefaultPrevented()) {
return
}
// Private
const dimension = this._getDimension()
_getConfig(config) {
config = {
...Default,
...config
}
config.toggle = Boolean(config.toggle) // Coerce string values
Util.typeCheckConfig(NAME, config, DefaultType)
return config
}
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
_getDimension() {
const hasWidth = $(this._element).hasClass(Dimension.WIDTH)
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
}
Util.reflow(this._element)
_getParent() {
let parent = null
if (Util.isElement(this._config.parent)) {
parent = this._config.parent
$(this._element)
.addClass(ClassName.COLLAPSING)
.removeClass(ClassName.COLLAPSE)
.removeClass(ClassName.SHOW)
// It's a jQuery object
if (typeof this._config.parent.jquery !== 'undefined') {
parent = this._config.parent[0]
}
} else {
parent = document.querySelector(this._config.parent)
}
const triggerArrayLength = this._triggerArray.length
if (triggerArrayLength > 0) {
for (let i = 0; i < triggerArrayLength; i++) {
const trigger = this._triggerArray[i]
const selector = Util.getSelectorFromElement(trigger)
const selector =
`[data-toggle="collapse"][data-parent="${this._config.parent}"]`
const children = [].slice.call(parent.querySelectorAll(selector))
$(children).each((i, element) => {
this._addAriaAndCollapsedClass(
Collapse._getTargetFromElement(element),
[element]
)
})
return parent
}
_addAriaAndCollapsedClass(element, triggerArray) {
if (element) {
const isOpen = $(element).hasClass(ClassName.SHOW)
if (triggerArray.length) {
$(triggerArray)
.toggleClass(ClassName.COLLAPSED, !isOpen)
.attr('aria-expanded', isOpen)
}
}
}
// Static
static _getTargetFromElement(element) {
const selector = Util.getSelectorFromElement(element)
return selector ? document.querySelector(selector) : null
}
static _jQueryInterface(config) {
return this.each(function () {
const $this = $(this)
let data = $this.data(DATA_KEY)
const _config = {
...Default,
...$this.data(),
...typeof config === 'object' && config ? config : {}
}
if (!data && _config.toggle && /show|hide/.test(config)) {
_config.toggle = false
}
if (!data) {
data = new Collapse(this, _config)
$this.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
if (selector !== null) {
const $elem = $([].slice.call(document.querySelectorAll(selector)))
if (!$elem.hasClass(ClassName.SHOW)) {
$(trigger).addClass(ClassName.COLLAPSED)
.attr('aria-expanded', false)
}
data[config]()
}
})
}
}
this.setTransitioning(true)
const complete = () => {
this.setTransitioning(false)
$(this._element)
.removeClass(ClassName.COLLAPSING)
.addClass(ClassName.COLLAPSE)
.trigger(Event.HIDDEN)
}
this._element.style[dimension] = ''
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
setTransitioning(isTransitioning) {
this._isTransitioning = isTransitioning
}
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if (event.currentTarget.tagName === 'A') {
event.preventDefault()
dispose() {
$.removeData(this._element, DATA_KEY)
this._config = null
this._parent = null
this._element = null
this._triggerArray = null
this._isTransitioning = null
}
// Private
_getConfig(config) {
config = {
...Default,
...config
}
config.toggle = Boolean(config.toggle) // Coerce string values
Util.typeCheckConfig(NAME, config, DefaultType)
return config
}
_getDimension() {
const hasWidth = $(this._element).hasClass(Dimension.WIDTH)
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
}
_getParent() {
let parent
if (Util.isElement(this._config.parent)) {
parent = this._config.parent
// It's a jQuery object
if (typeof this._config.parent.jquery !== 'undefined') {
parent = this._config.parent[0]
}
} else {
parent = document.querySelector(this._config.parent)
}
const $trigger = $(this)
const selector = Util.getSelectorFromElement(this)
const selectors = [].slice.call(document.querySelectorAll(selector))
$(selectors).each(function () {
const $target = $(this)
const data = $target.data(DATA_KEY)
const config = data ? 'toggle' : $trigger.data()
Collapse._jQueryInterface.call($target, config)
const selector =
`[data-toggle="collapse"][data-parent="${this._config.parent}"]`
const children = [].slice.call(parent.querySelectorAll(selector))
$(children).each((i, element) => {
this._addAriaAndCollapsedClass(
Collapse._getTargetFromElement(element),
[element]
)
})
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Collapse._jQueryInterface
$.fn[NAME].Constructor = Collapse
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Collapse._jQueryInterface
return parent
}
return Collapse
})($)
_addAriaAndCollapsedClass(element, triggerArray) {
const isOpen = $(element).hasClass(ClassName.SHOW)
if (triggerArray.length) {
$(triggerArray)
.toggleClass(ClassName.COLLAPSED, !isOpen)
.attr('aria-expanded', isOpen)
}
}
// Static
static _getTargetFromElement(element) {
const selector = Util.getSelectorFromElement(element)
return selector ? document.querySelector(selector) : null
}
static _jQueryInterface(config) {
return this.each(function () {
const $this = $(this)
let data = $this.data(DATA_KEY)
const _config = {
...Default,
...$this.data(),
...typeof config === 'object' && config ? config : {}
}
if (!data && _config.toggle && /show|hide/.test(config)) {
_config.toggle = false
}
if (!data) {
data = new Collapse(this, _config)
$this.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if (event.currentTarget.tagName === 'A') {
event.preventDefault()
}
const $trigger = $(this)
const selector = Util.getSelectorFromElement(this)
const selectors = [].slice.call(document.querySelectorAll(selector))
$(selectors).each(function () {
const $target = $(this)
const data = $target.data(DATA_KEY)
const config = data ? 'toggle' : $trigger.data()
Collapse._jQueryInterface.call($target, config)
})
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Collapse._jQueryInterface
$.fn[NAME].Constructor = Collapse
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Collapse._jQueryInterface
}
export default Collapse
+496 -445
View File
@@ -1,494 +1,545 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.0): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
import $ from 'jquery'
import Popper from 'popper.js'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Dropdown = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const NAME = 'dropdown'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key
const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
const NAME = 'dropdown'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key
const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,
KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`
}
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,
KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`
const ClassName = {
DISABLED : 'disabled',
SHOW : 'show',
DROPUP : 'dropup',
DROPRIGHT : 'dropright',
DROPLEFT : 'dropleft',
MENURIGHT : 'dropdown-menu-right',
MENULEFT : 'dropdown-menu-left',
POSITION_STATIC : 'position-static'
}
const Selector = {
DATA_TOGGLE : '[data-toggle="dropdown"]',
FORM_CHILD : '.dropdown form',
MENU : '.dropdown-menu',
NAVBAR_NAV : '.navbar-nav',
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
}
const AttachmentMap = {
TOP : 'top-start',
TOPEND : 'top-end',
BOTTOM : 'bottom-start',
BOTTOMEND : 'bottom-end',
RIGHT : 'right-start',
RIGHTEND : 'right-end',
LEFT : 'left-start',
LEFTEND : 'left-end'
}
const Default = {
offset : 0,
flip : true,
boundary : 'scrollParent',
reference : 'toggle',
display : 'dynamic'
}
const DefaultType = {
offset : '(number|string|function)',
flip : 'boolean',
boundary : '(string|element)',
reference : '(string|element)',
display : 'string'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Dropdown {
constructor(element, config) {
this._element = element
this._popper = null
this._config = this._getConfig(config)
this._menu = this._getMenuElement()
this._inNavbar = this._detectNavbar()
this._addEventListeners()
}
const ClassName = {
DISABLED : 'disabled',
SHOW : 'show',
DROPUP : 'dropup',
DROPRIGHT : 'dropright',
DROPLEFT : 'dropleft',
MENURIGHT : 'dropdown-menu-right',
MENULEFT : 'dropdown-menu-left',
POSITION_STATIC : 'position-static'
// Getters
static get VERSION() {
return VERSION
}
const Selector = {
DATA_TOGGLE : '[data-toggle="dropdown"]',
FORM_CHILD : '.dropdown form',
MENU : '.dropdown-menu',
NAVBAR_NAV : '.navbar-nav',
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
static get Default() {
return Default
}
const AttachmentMap = {
TOP : 'top-start',
TOPEND : 'top-end',
BOTTOM : 'bottom-start',
BOTTOMEND : 'bottom-end',
RIGHT : 'right-start',
RIGHTEND : 'right-end',
LEFT : 'left-start',
LEFTEND : 'left-end'
static get DefaultType() {
return DefaultType
}
const Default = {
offset : 0,
flip : true,
boundary : 'scrollParent',
reference : 'toggle',
display : 'dynamic'
}
// Public
const DefaultType = {
offset : '(number|string|function)',
flip : 'boolean',
boundary : '(string|element)',
reference : '(string|element)',
display : 'string'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Dropdown {
constructor(element, config) {
this._element = element
this._popper = null
this._config = this._getConfig(config)
this._menu = this._getMenuElement()
this._inNavbar = this._detectNavbar()
this._addEventListeners()
toggle() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
return
}
// Getters
const parent = Dropdown._getParentFromElement(this._element)
const isActive = $(this._menu).hasClass(ClassName.SHOW)
static get VERSION() {
return VERSION
Dropdown._clearMenus()
if (isActive) {
return
}
static get Default() {
return Default
const relatedTarget = {
relatedTarget: this._element
}
const showEvent = $.Event(Event.SHOW, relatedTarget)
$(parent).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
}
static get DefaultType() {
return DefaultType
}
// Public
toggle() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
return
// Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)')
}
const parent = Dropdown._getParentFromElement(this._element)
const isActive = $(this._menu).hasClass(ClassName.SHOW)
let referenceElement = this._element
Dropdown._clearMenus()
if (this._config.reference === 'parent') {
referenceElement = parent
} else if (Util.isElement(this._config.reference)) {
referenceElement = this._config.reference
if (isActive) {
return
// Check if it's jQuery element
if (typeof this._config.reference.jquery !== 'undefined') {
referenceElement = this._config.reference[0]
}
}
// If boundary is not `scrollParent`, then set position to `static`
// to allow the menu to "escape" the scroll parent's boundaries
// https://github.com/twbs/bootstrap/issues/24251
if (this._config.boundary !== 'scrollParent') {
$(parent).addClass(ClassName.POSITION_STATIC)
}
this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())
}
// If this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ('ontouchstart' in document.documentElement &&
$(parent).closest(Selector.NAVBAR_NAV).length === 0) {
$(document.body).children().on('mouseover', null, $.noop)
}
this._element.focus()
this._element.setAttribute('aria-expanded', true)
$(this._menu).toggleClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.SHOWN, relatedTarget))
}
show() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
return
}
const relatedTarget = {
relatedTarget: this._element
}
const showEvent = $.Event(Event.SHOW, relatedTarget)
const parent = Dropdown._getParentFromElement(this._element)
$(parent).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
}
$(this._menu).toggleClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.SHOWN, relatedTarget))
}
hide() {
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
return
}
const relatedTarget = {
relatedTarget: this._element
}
const hideEvent = $.Event(Event.HIDE, relatedTarget)
const parent = Dropdown._getParentFromElement(this._element)
$(parent).trigger(hideEvent)
if (hideEvent.isDefaultPrevented()) {
return
}
$(this._menu).toggleClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
}
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._element).off(EVENT_KEY)
this._element = null
this._menu = null
if (this._popper !== null) {
this._popper.destroy()
this._popper = null
}
}
update() {
this._inNavbar = this._detectNavbar()
if (this._popper !== null) {
this._popper.scheduleUpdate()
}
}
// Private
_addEventListeners() {
$(this._element).on(Event.CLICK, (event) => {
event.preventDefault()
event.stopPropagation()
this.toggle()
})
}
_getConfig(config) {
config = {
...this.constructor.Default,
...$(this._element).data(),
...config
}
Util.typeCheckConfig(
NAME,
config,
this.constructor.DefaultType
)
return config
}
_getMenuElement() {
if (!this._menu) {
const parent = Dropdown._getParentFromElement(this._element)
if (parent) {
this._menu = parent.querySelector(Selector.MENU)
}
}
return this._menu
}
_getPlacement() {
const $parentDropdown = $(this._element.parentNode)
let placement = AttachmentMap.BOTTOM
// Handle dropup
if ($parentDropdown.hasClass(ClassName.DROPUP)) {
placement = AttachmentMap.TOP
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND
}
} else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
placement = AttachmentMap.RIGHT
} else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
placement = AttachmentMap.LEFT
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND
}
return placement
}
_detectNavbar() {
return $(this._element).closest('.navbar').length > 0
}
_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
}
_getPopperConfig() {
const popperConfig = {
placement: this._getPlacement(),
modifiers: {
offset: this._getOffset(),
flip: {
enabled: this._config.flip
},
preventOverflow: {
boundariesElement: this._config.boundary
}
}
}
// Disable Popper.js if we have a static display
if (this._config.display === 'static') {
popperConfig.modifiers.applyStyle = {
enabled: false
}
}
return popperConfig
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' ? config : null
if (!data) {
data = new Dropdown(this, _config)
$(this).data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
}
static _clearMenus(event) {
if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||
event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
return
}
const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
for (let i = 0, len = toggles.length; i < len; i++) {
const parent = Dropdown._getParentFromElement(toggles[i])
const context = $(toggles[i]).data(DATA_KEY)
const relatedTarget = {
relatedTarget: this._element
}
const showEvent = $.Event(Event.SHOW, relatedTarget)
$(parent).trigger(showEvent)
if (showEvent.isDefaultPrevented()) {
return
relatedTarget: toggles[i]
}
// Disable totally Popper.js for Dropdown in Navbar
if (!this._inNavbar) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)')
}
let referenceElement = this._element
if (this._config.reference === 'parent') {
referenceElement = parent
} else if (Util.isElement(this._config.reference)) {
referenceElement = this._config.reference
// Check if it's jQuery element
if (typeof this._config.reference.jquery !== 'undefined') {
referenceElement = this._config.reference[0]
}
}
// If boundary is not `scrollParent`, then set position to `static`
// to allow the menu to "escape" the scroll parent's boundaries
// https://github.com/twbs/bootstrap/issues/24251
if (this._config.boundary !== 'scrollParent') {
$(parent).addClass(ClassName.POSITION_STATIC)
}
this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())
if (event && event.type === 'click') {
relatedTarget.clickEvent = event
}
// If this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ('ontouchstart' in document.documentElement &&
$(parent).closest(Selector.NAVBAR_NAV).length === 0) {
$(document.body).children().on('mouseover', null, $.noop)
if (!context) {
continue
}
this._element.focus()
this._element.setAttribute('aria-expanded', true)
const dropdownMenu = context._menu
if (!$(parent).hasClass(ClassName.SHOW)) {
continue
}
$(this._menu).toggleClass(ClassName.SHOW)
if (event && (event.type === 'click' &&
/input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&
$.contains(parent, event.target)) {
continue
}
const hideEvent = $.Event(Event.HIDE, relatedTarget)
$(parent).trigger(hideEvent)
if (hideEvent.isDefaultPrevented()) {
continue
}
// If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
if ('ontouchstart' in document.documentElement) {
$(document.body).children().off('mouseover', null, $.noop)
}
toggles[i].setAttribute('aria-expanded', 'false')
$(dropdownMenu).removeClass(ClassName.SHOW)
$(parent)
.toggleClass(ClassName.SHOW)
.trigger($.Event(Event.SHOWN, relatedTarget))
}
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._element).off(EVENT_KEY)
this._element = null
this._menu = null
if (this._popper !== null) {
this._popper.destroy()
this._popper = null
}
}
update() {
this._inNavbar = this._detectNavbar()
if (this._popper !== null) {
this._popper.scheduleUpdate()
}
}
// Private
_addEventListeners() {
$(this._element).on(Event.CLICK, (event) => {
event.preventDefault()
event.stopPropagation()
this.toggle()
})
}
_getConfig(config) {
config = {
...this.constructor.Default,
...$(this._element).data(),
...config
}
Util.typeCheckConfig(
NAME,
config,
this.constructor.DefaultType
)
return config
}
_getMenuElement() {
if (!this._menu) {
const parent = Dropdown._getParentFromElement(this._element)
if (parent) {
this._menu = parent.querySelector(Selector.MENU)
}
}
return this._menu
}
_getPlacement() {
const $parentDropdown = $(this._element.parentNode)
let placement = AttachmentMap.BOTTOM
// Handle dropup
if ($parentDropdown.hasClass(ClassName.DROPUP)) {
placement = AttachmentMap.TOP
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND
}
} else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
placement = AttachmentMap.RIGHT
} else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
placement = AttachmentMap.LEFT
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND
}
return placement
}
_detectNavbar() {
return $(this._element).closest('.navbar').length > 0
}
_getPopperConfig() {
const offsetConf = {}
if (typeof this._config.offset === 'function') {
offsetConf.fn = (data) => {
data.offsets = {
...data.offsets,
...this._config.offset(data.offsets) || {}
}
return data
}
} else {
offsetConf.offset = this._config.offset
}
const popperConfig = {
placement: this._getPlacement(),
modifiers: {
offset: offsetConf,
flip: {
enabled: this._config.flip
},
preventOverflow: {
boundariesElement: this._config.boundary
}
}
}
// Disable Popper.js if we have a static display
if (this._config.display === 'static') {
popperConfig.modifiers.applyStyle = {
enabled: false
}
}
return popperConfig
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' ? config : null
if (!data) {
data = new Dropdown(this, _config)
$(this).data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
}
static _clearMenus(event) {
if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||
event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
return
}
const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))
for (let i = 0, len = toggles.length; i < len; i++) {
const parent = Dropdown._getParentFromElement(toggles[i])
const context = $(toggles[i]).data(DATA_KEY)
const relatedTarget = {
relatedTarget: toggles[i]
}
if (event && event.type === 'click') {
relatedTarget.clickEvent = event
}
if (!context) {
continue
}
const dropdownMenu = context._menu
if (!$(parent).hasClass(ClassName.SHOW)) {
continue
}
if (event && (event.type === 'click' &&
/input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&
$.contains(parent, event.target)) {
continue
}
const hideEvent = $.Event(Event.HIDE, relatedTarget)
$(parent).trigger(hideEvent)
if (hideEvent.isDefaultPrevented()) {
continue
}
// If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
if ('ontouchstart' in document.documentElement) {
$(document.body).children().off('mouseover', null, $.noop)
}
toggles[i].setAttribute('aria-expanded', 'false')
$(dropdownMenu).removeClass(ClassName.SHOW)
$(parent)
.removeClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
}
}
static _getParentFromElement(element) {
let parent
const selector = Util.getSelectorFromElement(element)
if (selector) {
parent = document.querySelector(selector)
}
return parent || element.parentNode
}
// eslint-disable-next-line complexity
static _dataApiKeydownHandler(event) {
// If not input/textarea:
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
// If input/textarea:
// - If space key => not a dropdown command
// - If key is other than escape
// - If key is not up or down => not a dropdown command
// - If trigger inside the menu => not a dropdown command
if (/input|textarea/i.test(event.target.tagName)
? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
(event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||
$(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
return
}
event.preventDefault()
event.stopPropagation()
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
return
}
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(ClassName.SHOW)
if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) ||
isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
const toggle = parent.querySelector(Selector.DATA_TOGGLE)
$(toggle).trigger('focus')
}
$(this).trigger('click')
return
}
const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))
if (items.length === 0) {
return
}
let index = items.indexOf(event.target)
if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up
index--
}
if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down
index++
}
if (index < 0) {
index = 0
}
items[index].focus()
.removeClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
static _getParentFromElement(element) {
let parent
const selector = Util.getSelectorFromElement(element)
$(document)
.on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)
.on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault()
event.stopPropagation()
Dropdown._jQueryInterface.call($(this), 'toggle')
})
.on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
e.stopPropagation()
})
if (selector) {
parent = document.querySelector(selector)
}
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Dropdown._jQueryInterface
$.fn[NAME].Constructor = Dropdown
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Dropdown._jQueryInterface
return parent || element.parentNode
}
return Dropdown
})($, Popper)
// eslint-disable-next-line complexity
static _dataApiKeydownHandler(event) {
// If not input/textarea:
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
// If input/textarea:
// - If space key => not a dropdown command
// - If key is other than escape
// - If key is not up or down => not a dropdown command
// - If trigger inside the menu => not a dropdown command
if (/input|textarea/i.test(event.target.tagName)
? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
(event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||
$(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
return
}
event.preventDefault()
event.stopPropagation()
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
return
}
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(ClassName.SHOW)
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
const toggle = parent.querySelector(Selector.DATA_TOGGLE)
$(toggle).trigger('focus')
}
$(this).trigger('click')
return
}
const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))
if (items.length === 0) {
return
}
let index = items.indexOf(event.target)
if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up
index--
}
if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down
index++
}
if (index < 0) {
index = 0
}
items[index].focus()
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(document)
.on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)
.on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault()
event.stopPropagation()
Dropdown._jQueryInterface.call($(this), 'toggle')
})
.on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
e.stopPropagation()
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Dropdown._jQueryInterface
$.fn[NAME].Constructor = Dropdown
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Dropdown._jQueryInterface
}
export default Dropdown
+5 -3
View File
@@ -8,17 +8,18 @@ import Modal from './modal'
import Popover from './popover'
import Scrollspy from './scrollspy'
import Tab from './tab'
import Toast from './toast'
import Tooltip from './tooltip'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): index.js
* Bootstrap (v4.3.0): 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.')
}
@@ -33,7 +34,7 @@ import Util from './util'
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,
@@ -46,5 +47,6 @@ export {
Popover,
Scrollspy,
Tab,
Toast,
Tooltip
}
+559 -544
View File
File diff suppressed because it is too large Load Diff
+148 -152
View File
@@ -1,188 +1,184 @@
import $ from 'jquery'
import Tooltip from './tooltip'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): popover.js
* Bootstrap (v4.3.0): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Popover = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
import Tooltip from './tooltip'
const NAME = 'popover'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-popover'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Default = {
...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>'
const NAME = 'popover'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-popover'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const Default = {
...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>'
}
const DefaultType = {
...Tooltip.DefaultType,
content : '(string|element|function)'
}
const ClassName = {
FADE : 'fade',
SHOW : 'show'
}
const Selector = {
TITLE : '.popover-header',
CONTENT : '.popover-body'
}
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
INSERTED : `inserted${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
FOCUSIN : `focusin${EVENT_KEY}`,
FOCUSOUT : `focusout${EVENT_KEY}`,
MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}`
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Popover extends Tooltip {
// Getters
static get VERSION() {
return VERSION
}
const DefaultType = {
...Tooltip.DefaultType,
content : '(string|element|function)'
static get Default() {
return Default
}
const ClassName = {
FADE : 'fade',
SHOW : 'show'
static get NAME() {
return NAME
}
const Selector = {
TITLE : '.popover-header',
CONTENT : '.popover-body'
static get DATA_KEY() {
return DATA_KEY
}
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
INSERTED : `inserted${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
FOCUSIN : `focusin${EVENT_KEY}`,
FOCUSOUT : `focusout${EVENT_KEY}`,
MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}`
static get Event() {
return Event
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
static get EVENT_KEY() {
return EVENT_KEY
}
class Popover extends Tooltip {
// Getters
static get DefaultType() {
return DefaultType
}
static get VERSION() {
return VERSION
// Overrides
isWithContent() {
return this.getTitle() || this._getContent()
}
addAttachmentClass(attachment) {
$(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
}
getTipElement() {
this.tip = this.tip || $(this.config.template)[0]
return this.tip
}
setContent() {
const $tip = $(this.getTipElement())
// We use append for html objects to maintain js events
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
let content = this._getContent()
if (typeof content === 'function') {
content = content.call(this.element)
}
this.setElementContent($tip.find(Selector.CONTENT), content)
static get Default() {
return Default
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
}
// Private
_getContent() {
return this.element.getAttribute('data-content') ||
this.config.content
}
_cleanTipClass() {
const $tip = $(this.getTipElement())
const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
if (tabClass !== null && tabClass.length > 0) {
$tip.removeClass(tabClass.join(''))
}
}
static get NAME() {
return NAME
}
// Static
static get DATA_KEY() {
return DATA_KEY
}
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' ? config : null
static get Event() {
return Event
}
static get EVENT_KEY() {
return EVENT_KEY
}
static get DefaultType() {
return DefaultType
}
// Overrides
isWithContent() {
return this.getTitle() || this._getContent()
}
addAttachmentClass(attachment) {
$(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
}
getTipElement() {
this.tip = this.tip || $(this.config.template)[0]
return this.tip
}
setContent() {
const $tip = $(this.getTipElement())
// We use append for html objects to maintain js events
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
let content = this._getContent()
if (typeof content === 'function') {
content = content.call(this.element)
if (!data && /dispose|hide/.test(config)) {
return
}
this.setElementContent($tip.find(Selector.CONTENT), content)
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
}
// Private
_getContent() {
return this.element.getAttribute('data-content') ||
this.config.content
}
_cleanTipClass() {
const $tip = $(this.getTipElement())
const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
if (tabClass !== null && tabClass.length > 0) {
$tip.removeClass(tabClass.join(''))
if (!data) {
data = new Popover(this, _config)
$(this).data(DATA_KEY, data)
}
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' ? config : null
if (!data && /destroy|hide/.test(config)) {
return
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
if (!data) {
data = new Popover(this, _config)
$(this).data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
}
data[config]()
}
})
}
}
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Popover._jQueryInterface
$.fn[NAME].Constructor = Popover
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Popover._jQueryInterface
}
return Popover
})($)
$.fn[NAME] = Popover._jQueryInterface
$.fn[NAME].Constructor = Popover
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Popover._jQueryInterface
}
export default Popover
+281 -287
View File
@@ -1,332 +1,326 @@
import $ from 'jquery'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): scrollspy.js
* Bootstrap (v4.3.0): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const ScrollSpy = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
import Util from './util'
const NAME = 'scrollspy'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Default = {
offset : 10,
method : 'auto',
target : ''
const NAME = 'scrollspy'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Default = {
offset : 10,
method : 'auto',
target : ''
}
const DefaultType = {
offset : 'number',
method : 'string',
target : '(string|element)'
}
const Event = {
ACTIVATE : `activate${EVENT_KEY}`,
SCROLL : `scroll${EVENT_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
}
const ClassName = {
DROPDOWN_ITEM : 'dropdown-item',
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active'
}
const Selector = {
DATA_SPY : '[data-spy="scroll"]',
ACTIVE : '.active',
NAV_LIST_GROUP : '.nav, .list-group',
NAV_LINKS : '.nav-link',
NAV_ITEMS : '.nav-item',
LIST_ITEMS : '.list-group-item',
DROPDOWN : '.dropdown',
DROPDOWN_ITEMS : '.dropdown-item',
DROPDOWN_TOGGLE : '.dropdown-toggle'
}
const OffsetMethod = {
OFFSET : 'offset',
POSITION : 'position'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class ScrollSpy {
constructor(element, config) {
this._element = element
this._scrollElement = element.tagName === 'BODY' ? window : element
this._config = this._getConfig(config)
this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +
`${this._config.target} ${Selector.LIST_ITEMS},` +
`${this._config.target} ${Selector.DROPDOWN_ITEMS}`
this._offsets = []
this._targets = []
this._activeTarget = null
this._scrollHeight = 0
$(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
this.refresh()
this._process()
}
const DefaultType = {
offset : 'number',
method : 'string',
target : '(string|element)'
// Getters
static get VERSION() {
return VERSION
}
const Event = {
ACTIVATE : `activate${EVENT_KEY}`,
SCROLL : `scroll${EVENT_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
static get Default() {
return Default
}
const ClassName = {
DROPDOWN_ITEM : 'dropdown-item',
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active'
// Public
refresh() {
const autoMethod = this._scrollElement === this._scrollElement.window
? OffsetMethod.OFFSET : OffsetMethod.POSITION
const offsetMethod = this._config.method === 'auto'
? autoMethod : this._config.method
const offsetBase = offsetMethod === OffsetMethod.POSITION
? this._getScrollTop() : 0
this._offsets = []
this._targets = []
this._scrollHeight = this._getScrollHeight()
const targets = [].slice.call(document.querySelectorAll(this._selector))
targets
.map((element) => {
let target
const targetSelector = Util.getSelectorFromElement(element)
if (targetSelector) {
target = document.querySelector(targetSelector)
}
if (target) {
const targetBCR = target.getBoundingClientRect()
if (targetBCR.width || targetBCR.height) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [
$(target)[offsetMethod]().top + offsetBase,
targetSelector
]
}
}
return null
})
.filter((item) => item)
.sort((a, b) => a[0] - b[0])
.forEach((item) => {
this._offsets.push(item[0])
this._targets.push(item[1])
})
}
const Selector = {
DATA_SPY : '[data-spy="scroll"]',
ACTIVE : '.active',
NAV_LIST_GROUP : '.nav, .list-group',
NAV_LINKS : '.nav-link',
NAV_ITEMS : '.nav-item',
LIST_ITEMS : '.list-group-item',
DROPDOWN : '.dropdown',
DROPDOWN_ITEMS : '.dropdown-item',
DROPDOWN_TOGGLE : '.dropdown-toggle'
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._scrollElement).off(EVENT_KEY)
this._element = null
this._scrollElement = null
this._config = null
this._selector = null
this._offsets = null
this._targets = null
this._activeTarget = null
this._scrollHeight = null
}
const OffsetMethod = {
OFFSET : 'offset',
POSITION : 'position'
// Private
_getConfig(config) {
config = {
...Default,
...typeof config === 'object' && config ? config : {}
}
if (typeof config.target !== 'string') {
let id = $(config.target).attr('id')
if (!id) {
id = Util.getUID(NAME)
$(config.target).attr('id', id)
}
config.target = `#${id}`
}
Util.typeCheckConfig(NAME, config, DefaultType)
return config
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
_getScrollTop() {
return this._scrollElement === window
? this._scrollElement.pageYOffset : this._scrollElement.scrollTop
}
class ScrollSpy {
constructor(element, config) {
this._element = element
this._scrollElement = element.tagName === 'BODY' ? window : element
this._config = this._getConfig(config)
this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +
`${this._config.target} ${Selector.LIST_ITEMS},` +
`${this._config.target} ${Selector.DROPDOWN_ITEMS}`
this._offsets = []
this._targets = []
this._activeTarget = null
this._scrollHeight = 0
_getScrollHeight() {
return this._scrollElement.scrollHeight || Math.max(
document.body.scrollHeight,
document.documentElement.scrollHeight
)
}
$(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
_getOffsetHeight() {
return this._scrollElement === window
? window.innerHeight : this._scrollElement.getBoundingClientRect().height
}
_process() {
const scrollTop = this._getScrollTop() + this._config.offset
const scrollHeight = this._getScrollHeight()
const maxScroll = this._config.offset +
scrollHeight -
this._getOffsetHeight()
if (this._scrollHeight !== scrollHeight) {
this.refresh()
this._process()
}
// Getters
if (scrollTop >= maxScroll) {
const target = this._targets[this._targets.length - 1]
static get VERSION() {
return VERSION
}
static get Default() {
return Default
}
// Public
refresh() {
const autoMethod = this._scrollElement === this._scrollElement.window
? OffsetMethod.OFFSET : OffsetMethod.POSITION
const offsetMethod = this._config.method === 'auto'
? autoMethod : this._config.method
const offsetBase = offsetMethod === OffsetMethod.POSITION
? this._getScrollTop() : 0
this._offsets = []
this._targets = []
this._scrollHeight = this._getScrollHeight()
const targets = [].slice.call(document.querySelectorAll(this._selector))
targets
.map((element) => {
let target
const targetSelector = Util.getSelectorFromElement(element)
if (targetSelector) {
target = document.querySelector(targetSelector)
}
if (target) {
const targetBCR = target.getBoundingClientRect()
if (targetBCR.width || targetBCR.height) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [
$(target)[offsetMethod]().top + offsetBase,
targetSelector
]
}
}
return null
})
.filter((item) => item)
.sort((a, b) => a[0] - b[0])
.forEach((item) => {
this._offsets.push(item[0])
this._targets.push(item[1])
})
}
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._scrollElement).off(EVENT_KEY)
this._element = null
this._scrollElement = null
this._config = null
this._selector = null
this._offsets = null
this._targets = null
this._activeTarget = null
this._scrollHeight = null
}
// Private
_getConfig(config) {
config = {
...Default,
...typeof config === 'object' && config ? config : {}
if (this._activeTarget !== target) {
this._activate(target)
}
if (typeof config.target !== 'string') {
let id = $(config.target).attr('id')
if (!id) {
id = Util.getUID(NAME)
$(config.target).attr('id', id)
}
config.target = `#${id}`
}
Util.typeCheckConfig(NAME, config, DefaultType)
return config
return
}
_getScrollTop() {
return this._scrollElement === window
? this._scrollElement.pageYOffset : this._scrollElement.scrollTop
}
_getScrollHeight() {
return this._scrollElement.scrollHeight || Math.max(
document.body.scrollHeight,
document.documentElement.scrollHeight
)
}
_getOffsetHeight() {
return this._scrollElement === window
? window.innerHeight : this._scrollElement.getBoundingClientRect().height
}
_process() {
const scrollTop = this._getScrollTop() + this._config.offset
const scrollHeight = this._getScrollHeight()
const maxScroll = this._config.offset +
scrollHeight -
this._getOffsetHeight()
if (this._scrollHeight !== scrollHeight) {
this.refresh()
}
if (scrollTop >= maxScroll) {
const target = this._targets[this._targets.length - 1]
if (this._activeTarget !== target) {
this._activate(target)
}
return
}
if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
this._activeTarget = null
this._clear()
return
}
const offsetLength = this._offsets.length
for (let i = offsetLength; i--;) {
const isActiveTarget = this._activeTarget !== this._targets[i] &&
scrollTop >= this._offsets[i] &&
(typeof this._offsets[i + 1] === 'undefined' ||
scrollTop < this._offsets[i + 1])
if (isActiveTarget) {
this._activate(this._targets[i])
}
}
}
_activate(target) {
this._activeTarget = target
if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
this._activeTarget = null
this._clear()
return
}
let queries = this._selector.split(',')
// eslint-disable-next-line arrow-body-style
queries = queries.map((selector) => {
return `${selector}[data-target="${target}"],` +
`${selector}[href="${target}"]`
})
const offsetLength = this._offsets.length
for (let i = offsetLength; i--;) {
const isActiveTarget = this._activeTarget !== this._targets[i] &&
scrollTop >= this._offsets[i] &&
(typeof this._offsets[i + 1] === 'undefined' ||
scrollTop < this._offsets[i + 1])
const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
if (isActiveTarget) {
this._activate(this._targets[i])
}
}
}
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
$link.addClass(ClassName.ACTIVE)
} else {
// Set triggered link as active
$link.addClass(ClassName.ACTIVE)
// Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
$link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)
// Handle special case when .nav-link is inside .nav-item
$link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
_activate(target) {
this._activeTarget = target
this._clear()
const queries = this._selector
.split(',')
.map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
$link.addClass(ClassName.ACTIVE)
} else {
// Set triggered link as active
$link.addClass(ClassName.ACTIVE)
// Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
$link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)
// Handle special case when .nav-link is inside .nav-item
$link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
relatedTarget: target
})
}
_clear() {
[].slice.call(document.querySelectorAll(this._selector))
.filter((node) => node.classList.contains(ClassName.ACTIVE))
.forEach((node) => node.classList.remove(ClassName.ACTIVE))
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' && config
if (!data) {
data = new ScrollSpy(this, _config)
$(this).data(DATA_KEY, data)
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
relatedTarget: target
})
}
_clear() {
const nodes = [].slice.call(document.querySelectorAll(this._selector))
$(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
const _config = typeof config === 'object' && config
if (!data) {
data = new ScrollSpy(this, _config)
$(this).data(DATA_KEY, data)
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
}
data[config]()
}
})
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(window).on(Event.LOAD_DATA_API, () => {
const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))
$(window).on(Event.LOAD_DATA_API, () => {
const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))
const scrollSpysLength = scrollSpys.length
const scrollSpysLength = scrollSpys.length
for (let i = scrollSpysLength; i--;) {
const $spy = $(scrollSpys[i])
ScrollSpy._jQueryInterface.call($spy, $spy.data())
}
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = ScrollSpy._jQueryInterface
$.fn[NAME].Constructor = ScrollSpy
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return ScrollSpy._jQueryInterface
for (let i = scrollSpysLength; i--;) {
const $spy = $(scrollSpys[i])
ScrollSpy._jQueryInterface.call($spy, $spy.data())
}
})
return ScrollSpy
})($)
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = ScrollSpy._jQueryInterface
$.fn[NAME].Constructor = ScrollSpy
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return ScrollSpy._jQueryInterface
}
export default ScrollSpy
+221 -225
View File
@@ -1,264 +1,260 @@
import $ from 'jquery'
import Util from './util'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): tab.js
* Bootstrap (v4.3.0): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Tab = (($) => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
import Util from './util'
const NAME = 'tab'
const VERSION = '4.1.2'
const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
const NAME = 'tab'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Event = {
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
}
const ClassName = {
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active',
DISABLED : 'disabled',
FADE : 'fade',
SHOW : 'show'
}
const Selector = {
DROPDOWN : '.dropdown',
NAV_LIST_GROUP : '.nav, .list-group',
ACTIVE : '.active',
ACTIVE_UL : '> li > .active',
DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE : '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Tab {
constructor(element) {
this._element = element
}
const ClassName = {
DROPDOWN_MENU : 'dropdown-menu',
ACTIVE : 'active',
DISABLED : 'disabled',
FADE : 'fade',
SHOW : 'show'
// Getters
static get VERSION() {
return VERSION
}
const Selector = {
DROPDOWN : '.dropdown',
NAV_LIST_GROUP : '.nav, .list-group',
ACTIVE : '.active',
ACTIVE_UL : '> li > .active',
DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE : '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'
}
// Public
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Tab {
constructor(element) {
this._element = element
show() {
if (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
$(this._element).hasClass(ClassName.ACTIVE) ||
$(this._element).hasClass(ClassName.DISABLED)) {
return
}
// Getters
let target
let previous
const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]
const selector = Util.getSelectorFromElement(this._element)
static get VERSION() {
return VERSION
if (listElement) {
const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE
previous = $.makeArray($(listElement).find(itemSelector))
previous = previous[previous.length - 1]
}
// Public
const hideEvent = $.Event(Event.HIDE, {
relatedTarget: this._element
})
show() {
if (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
$(this._element).hasClass(ClassName.ACTIVE) ||
$(this._element).hasClass(ClassName.DISABLED)) {
return
}
const showEvent = $.Event(Event.SHOW, {
relatedTarget: previous
})
let target
let previous
const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]
const selector = Util.getSelectorFromElement(this._element)
if (previous) {
$(previous).trigger(hideEvent)
}
if (listElement) {
const itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE
previous = $.makeArray($(listElement).find(itemSelector))
previous = previous[previous.length - 1]
}
$(this._element).trigger(showEvent)
const hideEvent = $.Event(Event.HIDE, {
if (showEvent.isDefaultPrevented() ||
hideEvent.isDefaultPrevented()) {
return
}
if (selector) {
target = document.querySelector(selector)
}
this._activate(
this._element,
listElement
)
const complete = () => {
const hiddenEvent = $.Event(Event.HIDDEN, {
relatedTarget: this._element
})
const showEvent = $.Event(Event.SHOW, {
const shownEvent = $.Event(Event.SHOWN, {
relatedTarget: previous
})
if (previous) {
$(previous).trigger(hideEvent)
}
$(this._element).trigger(showEvent)
if (showEvent.isDefaultPrevented() ||
hideEvent.isDefaultPrevented()) {
return
}
if (selector) {
target = document.querySelector(selector)
}
this._activate(
this._element,
listElement
)
const complete = () => {
const hiddenEvent = $.Event(Event.HIDDEN, {
relatedTarget: this._element
})
const shownEvent = $.Event(Event.SHOWN, {
relatedTarget: previous
})
$(previous).trigger(hiddenEvent)
$(this._element).trigger(shownEvent)
}
if (target) {
this._activate(target, target.parentNode, complete)
} else {
complete()
}
$(previous).trigger(hiddenEvent)
$(this._element).trigger(shownEvent)
}
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
// Private
_activate(element, container, callback) {
let activeElements
if (container.nodeName === 'UL') {
activeElements = $(container).find(Selector.ACTIVE_UL)
} else {
activeElements = $(container).children(Selector.ACTIVE)
}
const active = activeElements[0]
const isTransitioning = callback &&
(active && $(active).hasClass(ClassName.FADE))
const complete = () => this._transitionComplete(
element,
active,
callback
)
if (active && isTransitioning) {
const transitionDuration = Util.getTransitionDurationFromElement(active)
$(active)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
} else {
complete()
}
}
_transitionComplete(element, active, callback) {
if (active) {
$(active).removeClass(`${ClassName.SHOW} ${ClassName.ACTIVE}`)
const dropdownChild = $(active.parentNode).find(
Selector.DROPDOWN_ACTIVE_CHILD
)[0]
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE)
}
if (active.getAttribute('role') === 'tab') {
active.setAttribute('aria-selected', false)
}
}
$(element).addClass(ClassName.ACTIVE)
if (element.getAttribute('role') === 'tab') {
element.setAttribute('aria-selected', true)
}
Util.reflow(element)
$(element).addClass(ClassName.SHOW)
if (element.parentNode &&
$(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
if (dropdownElement) {
const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))
$(dropdownToggleList).addClass(ClassName.ACTIVE)
}
element.setAttribute('aria-expanded', true)
}
if (callback) {
callback()
}
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
const $this = $(this)
let data = $this.data(DATA_KEY)
if (!data) {
data = new Tab(this)
$this.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
if (target) {
this._activate(target, target.parentNode, complete)
} else {
complete()
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault()
Tab._jQueryInterface.call($(this), 'show')
// Private
_activate(element, container, callback) {
const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')
? $(container).find(Selector.ACTIVE_UL)
: $(container).children(Selector.ACTIVE)
const active = activeElements[0]
const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))
const complete = () => this._transitionComplete(
element,
active,
callback
)
if (active && isTransitioning) {
const transitionDuration = Util.getTransitionDurationFromElement(active)
$(active)
.removeClass(ClassName.SHOW)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
} else {
complete()
}
}
_transitionComplete(element, active, callback) {
if (active) {
$(active).removeClass(ClassName.ACTIVE)
const dropdownChild = $(active.parentNode).find(
Selector.DROPDOWN_ACTIVE_CHILD
)[0]
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE)
}
if (active.getAttribute('role') === 'tab') {
active.setAttribute('aria-selected', false)
}
}
$(element).addClass(ClassName.ACTIVE)
if (element.getAttribute('role') === 'tab') {
element.setAttribute('aria-selected', true)
}
Util.reflow(element)
if (element.classList.contains(ClassName.FADE)) {
element.classList.add(ClassName.SHOW)
}
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
if (dropdownElement) {
const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))
$(dropdownToggleList).addClass(ClassName.ACTIVE)
}
element.setAttribute('aria-expanded', true)
}
if (callback) {
callback()
}
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
const $this = $(this)
let data = $this.data(DATA_KEY)
if (!data) {
data = new Tab(this)
$this.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config]()
}
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Tab._jQueryInterface
$.fn[NAME].Constructor = Tab
$.fn[NAME].noConflict = function () {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Tab._jQueryInterface
}
}
return Tab
})($)
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
$(document)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault()
Tab._jQueryInterface.call($(this), 'show')
})
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Tab._jQueryInterface
$.fn[NAME].Constructor = Tab
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Tab._jQueryInterface
}
export default Tab
+227
View File
@@ -0,0 +1,227 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.3.0): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
import $ from 'jquery'
import Util from './util'
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const NAME = 'toast'
const VERSION = '4.3.0'
const DATA_KEY = 'bs.toast'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const Event = {
CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
HIDE : `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`
}
const ClassName = {
FADE : 'fade',
HIDE : 'hide',
SHOW : 'show',
SHOWING : 'showing'
}
const DefaultType = {
animation : 'boolean',
autohide : 'boolean',
delay : 'number'
}
const Default = {
animation : true,
autohide : true,
delay : 500
}
const Selector = {
DATA_DISMISS : '[data-dismiss="toast"]'
}
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Toast {
constructor(element, config) {
this._element = element
this._config = this._getConfig(config)
this._timeout = null
this._setListeners()
}
// Getters
static get VERSION() {
return VERSION
}
static get DefaultType() {
return DefaultType
}
static get Default() {
return Default
}
// Public
show() {
$(this._element).trigger(Event.SHOW)
if (this._config.animation) {
this._element.classList.add(ClassName.FADE)
}
const complete = () => {
this._element.classList.remove(ClassName.SHOWING)
this._element.classList.add(ClassName.SHOW)
$(this._element).trigger(Event.SHOWN)
if (this._config.autohide) {
this.hide()
}
}
this._element.classList.remove(ClassName.HIDE)
this._element.classList.add(ClassName.SHOWING)
if (this._config.animation) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
} else {
complete()
}
}
hide(withoutTimeout) {
if (!this._element.classList.contains(ClassName.SHOW)) {
return
}
$(this._element).trigger(Event.HIDE)
if (withoutTimeout) {
this._close()
} else {
this._timeout = setTimeout(() => {
this._close()
}, this._config.delay)
}
}
dispose() {
clearTimeout(this._timeout)
this._timeout = null
if (this._element.classList.contains(ClassName.SHOW)) {
this._element.classList.remove(ClassName.SHOW)
}
$(this._element).off(Event.CLICK_DISMISS)
$.removeData(this._element, DATA_KEY)
this._element = null
this._config = null
}
// Private
_getConfig(config) {
config = {
...Default,
...$(this._element).data(),
...typeof config === 'object' && config ? config : {}
}
Util.typeCheckConfig(
NAME,
config,
this.constructor.DefaultType
)
return config
}
_setListeners() {
$(this._element).on(
Event.CLICK_DISMISS,
Selector.DATA_DISMISS,
() => this.hide(true)
)
}
_close() {
const complete = () => {
this._element.classList.add(ClassName.HIDE)
$(this._element).trigger(Event.HIDDEN)
}
this._element.classList.remove(ClassName.SHOW)
if (this._config.animation) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, complete)
.emulateTransitionEnd(transitionDuration)
} else {
complete()
}
}
// Static
static _jQueryInterface(config) {
return this.each(function () {
const $element = $(this)
let data = $element.data(DATA_KEY)
const _config = typeof config === 'object' && config
if (!data) {
data = new Toast(this, _config)
$element.data(DATA_KEY, data)
}
if (typeof config === 'string') {
if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`)
}
data[config](this)
}
})
}
}
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
$.fn[NAME] = Toast._jQueryInterface
$.fn[NAME].Constructor = Toast
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Toast._jQueryInterface
}
export default Toast
+628 -601
View File
File diff suppressed because it is too large Load Diff
+136 -111
View File
@@ -1,152 +1,177 @@
import $ from 'jquery'
/**
* --------------------------------------------------------------------------
* Bootstrap (v4.1.2): util.js
* Bootstrap (v4.3.0): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
const Util = (($) => {
/**
* ------------------------------------------------------------------------
* Private TransitionEnd Helpers
* ------------------------------------------------------------------------
*/
import $ from 'jquery'
const TRANSITION_END = 'transitionend'
const MAX_UID = 1000000
const MILLISECONDS_MULTIPLIER = 1000
/**
* ------------------------------------------------------------------------
* Private TransitionEnd Helpers
* ------------------------------------------------------------------------
*/
// Shoutout AngusCroll (https://goo.gl/pxwQGp)
function toType(obj) {
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase()
}
const TRANSITION_END = 'transitionend'
const MAX_UID = 1000000
const MILLISECONDS_MULTIPLIER = 1000
function getSpecialTransitionEndEvent() {
return {
bindType: TRANSITION_END,
delegateType: TRANSITION_END,
handle(event) {
if ($(event.target).is(this)) {
return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
}
return undefined // eslint-disable-line no-undefined
// Shoutout AngusCroll (https://goo.gl/pxwQGp)
function toType(obj) {
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase()
}
function getSpecialTransitionEndEvent() {
return {
bindType: TRANSITION_END,
delegateType: TRANSITION_END,
handle(event) {
if ($(event.target).is(this)) {
return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
}
return undefined // eslint-disable-line no-undefined
}
}
}
function transitionEndEmulator(duration) {
let called = false
function transitionEndEmulator(duration) {
let called = false
$(this).one(Util.TRANSITION_END, () => {
called = true
})
$(this).one(Util.TRANSITION_END, () => {
called = true
})
setTimeout(() => {
if (!called) {
Util.triggerTransitionEnd(this)
}
}, duration)
setTimeout(() => {
if (!called) {
Util.triggerTransitionEnd(this)
}
}, duration)
return this
}
return this
}
function setTransitionEndSupport() {
$.fn.emulateTransitionEnd = transitionEndEmulator
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
}
function setTransitionEndSupport() {
$.fn.emulateTransitionEnd = transitionEndEmulator
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
}
/**
* --------------------------------------------------------------------------
* Public Util Api
* --------------------------------------------------------------------------
*/
/**
* --------------------------------------------------------------------------
* Public Util Api
* --------------------------------------------------------------------------
*/
const Util = {
const Util = {
TRANSITION_END: 'bsTransitionEnd',
TRANSITION_END: 'bsTransitionEnd',
getUID(prefix) {
do {
// eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
} while (document.getElementById(prefix))
return prefix
},
getUID(prefix) {
do {
// eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
} while (document.getElementById(prefix))
return prefix
},
getSelectorFromElement(element) {
let selector = element.getAttribute('data-target')
if (!selector || selector === '#') {
selector = element.getAttribute('href') || ''
}
getSelectorFromElement(element) {
let selector = element.getAttribute('data-target')
try {
return document.querySelector(selector) ? selector : null
} catch (err) {
return null
}
},
if (!selector || selector === '#') {
const hrefAttr = element.getAttribute('href')
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''
}
getTransitionDurationFromElement(element) {
if (!element) {
return 0
}
try {
return document.querySelector(selector) ? selector : null
} catch (err) {
return null
}
},
// Get transition-duration of the element
let transitionDuration = $(element).css('transition-duration')
const floatTransitionDuration = parseFloat(transitionDuration)
getTransitionDurationFromElement(element) {
if (!element) {
return 0
}
// Return 0 if element or transition duration is not found
if (!floatTransitionDuration) {
return 0
}
// Get transition-duration of the element
let transitionDuration = $(element).css('transition-duration')
let transitionDelay = $(element).css('transition-delay')
// If multiple durations are defined, take the first
transitionDuration = transitionDuration.split(',')[0]
const floatTransitionDuration = parseFloat(transitionDuration)
const floatTransitionDelay = parseFloat(transitionDelay)
return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER
},
// Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) {
return 0
}
reflow(element) {
return element.offsetHeight
},
// If multiple durations are defined, take the first
transitionDuration = transitionDuration.split(',')[0]
transitionDelay = transitionDelay.split(',')[0]
triggerTransitionEnd(element) {
$(element).trigger(TRANSITION_END)
},
return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER
},
// TODO: Remove in v5
supportsTransitionEnd() {
return Boolean(TRANSITION_END)
},
reflow(element) {
return element.offsetHeight
},
isElement(obj) {
return (obj[0] || obj).nodeType
},
triggerTransitionEnd(element) {
$(element).trigger(TRANSITION_END)
},
typeCheckConfig(componentName, config, configTypes) {
for (const property in configTypes) {
if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
const expectedTypes = configTypes[property]
const value = config[property]
const valueType = value && Util.isElement(value)
? 'element' : toType(value)
// TODO: Remove in v5
supportsTransitionEnd() {
return Boolean(TRANSITION_END)
},
if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error(
`${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".`)
}
isElement(obj) {
return (obj[0] || obj).nodeType
},
typeCheckConfig(componentName, config, configTypes) {
for (const property in configTypes) {
if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
const expectedTypes = configTypes[property]
const value = config[property]
const valueType = value && Util.isElement(value)
? 'element' : toType(value)
if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error(
`${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".`)
}
}
}
},
findShadowRoot(element) {
if (!document.documentElement.attachShadow) {
return null
}
// Can find the shadow root otherwise it'll return the document
if (typeof element.getRootNode === 'function') {
const root = element.getRootNode()
return root instanceof ShadowRoot ? root : null
}
if (element instanceof ShadowRoot) {
return element
}
// when we don't find a shadow root
if (!element.parentNode) {
return null
}
return Util.findShadowRoot(element.parentNode)
}
}
setTransitionEndSupport()
return Util
})($)
setTransitionEndSupport()
export default Util
+1 -1
View File
@@ -1,6 +1,6 @@
## How does Bootstrap's test suite work?
Bootstrap uses [QUnit](https://qunitjs.com/) and [Sinon](http://sinonjs.org/). Each plugin has a file dedicated to its tests in `unit/<plugin-name>.js`.
Bootstrap uses [QUnit](https://qunitjs.com/) and [Sinon](https://sinonjs.org/). Each plugin has a file dedicated to its tests in `unit/<plugin-name>.js`.
* `unit/` contains the unit test files for each Bootstrap plugin.
* `vendor/` contains third-party testing-related code (QUnit, jQuery and Sinon).
+82
View File
@@ -0,0 +1,82 @@
/* eslint-env node */
/* eslint-disable camelcase */
const browsers = {
safariMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'High Sierra',
browser: 'Safari',
browser_version: 'latest'
},
chromeMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'High Sierra',
browser : 'Chrome',
browser_version : 'latest'
},
firefoxMac: {
base: 'BrowserStack',
os: 'OS X',
os_version: 'High Sierra',
browser: 'Firefox',
browser_version: 'latest'
},
edgeWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Edge',
browser_version: 'latest'
},
ie11Win10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'IE',
browser_version: '11.0'
},
chromeWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Chrome',
browser_version: 'latest'
},
firefoxWin10: {
base: 'BrowserStack',
os: 'Windows',
os_version: '10',
browser: 'Firefox',
browser_version: 'latest'
},
ie10Win8: {
base: 'BrowserStack',
os: 'Windows',
os_version: '8',
browser: 'IE',
browser_version: '10.0'
},
iphoneX: {
base: 'BrowserStack',
os: 'ios',
os_version: '11.0',
device: 'iPhone X',
real_mobile: true
},
pixel2: {
base: 'BrowserStack',
os: 'android',
os_version: '8.0',
device: 'Google Pixel 2',
real_mobile: true
}
}
const browsersKeys = Object.keys(browsers)
module.exports = {
browsers,
browsersKeys
}
+7 -14
View File
@@ -6,20 +6,8 @@
<title>Bootstrap Plugin Test Suite</title>
<!-- jQuery -->
<script>
(function () {
var path = '../../site/docs/4.1/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="../../site/docs/4.1/assets/js/vendor/popper.min.js"></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 -->
<link rel="stylesheet" href="../../node_modules/qunit/qunit/qunit.css" media="screen">
@@ -28,6 +16,9 @@
<!-- Sinon -->
<script src="../../node_modules/sinon/pkg/sinon-no-sourcemaps.js"></script>
<!-- Hammer simulator -->
<script src="../../node_modules/hammer-simulator/index.js"></script>
<script>
// Disable jQuery event aliases to ensure we don't accidentally use any of them
[
@@ -117,6 +108,7 @@
<script src="../dist/tab.js"></script>
<script src="../dist/tooltip.js"></script>
<script src="../dist/popover.js"></script>
<script src="../dist/toast.js"></script>
<!-- Unit Tests -->
<script src="unit/alert.js"></script>
@@ -130,6 +122,7 @@
<script src="unit/tooltip.js"></script>
<script src="unit/popover.js"></script>
<script src="unit/util.js"></script>
<script src="unit/toast.js"></script>
</head>
<body>
<div id="qunit-container">
+8
View File
@@ -0,0 +1,8 @@
import 'popper.js'
import $ from 'jquery'
import bootstrap from '../../../dist/js/bootstrap'
$(() => {
$('#resultUID').text(bootstrap.Util.getUID('bs'))
$('[data-toggle="tooltip"]').tooltip()
})
+66
View File
@@ -0,0 +1,66 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../../../dist/css/bootstrap.min.css">
<title>Hello, world!</title>
</head>
<body>
<div class="container">
<h1>Hello, world!</h1>
<div class="col-12">
<div class="mt-5 mb-3">
<span>Util.getUID: </span>
<span id="resultUID"></span>
</div>
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top" title="Tooltip on top">
Tooltip on top
</button>
<div id="carouselExampleCaptions" class="carousel slide mt-2" data-ride="carousel">
<ol class="carousel-indicators">
<li data-target="#carouselExampleCaptions" data-slide-to="0"></li>
<li data-target="#carouselExampleCaptions" data-slide-to="1" class="active"></li>
<li data-target="#carouselExampleCaptions" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item">
<img class="d-block w-100" data-src="holder.js/800x400?auto=yes&amp;bg=777&amp;fg=555&amp;text=First slide" alt="First slide [800x400]" src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_167a6f826cb%20text%20%7B%20fill%3A%23555%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_167a6f826cb%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22285.921875%22%20y%3D%22217.7%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E" data-holder-rendered="true">
<div class="carousel-caption d-none d-md-block">
<h5>First slide label</h5>
<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>
</div>
</div>
<div class="carousel-item active">
<img class="d-block w-100" data-src="holder.js/800x400?auto=yes&amp;bg=666&amp;fg=444&amp;text=Second slide" alt="Second slide [800x400]" src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_167a6f826ce%20text%20%7B%20fill%3A%23444%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_167a6f826ce%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23666%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22247.3203125%22%20y%3D%22217.7%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E" data-holder-rendered="true">
<div class="carousel-caption d-none d-md-block">
<h5>Second slide label</h5>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</div>
<div class="carousel-item">
<img class="d-block w-100" data-src="holder.js/800x400?auto=yes&amp;bg=555&amp;fg=333&amp;text=Third slide" alt="Third slide [800x400]" src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_167a6f826cf%20text%20%7B%20fill%3A%23333%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_167a6f826cf%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23555%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22277%22%20y%3D%22217.7%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E" data-holder-rendered="true">
<div class="carousel-caption d-none d-md-block">
<h5>Third slide label</h5>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleCaptions" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleCaptions" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
</div>
<script src="../../coverage/bundle.js"></script>
</body>
</html>
+20
View File
@@ -0,0 +1,20 @@
/* eslint-env node */
const resolve = require('rollup-plugin-node-resolve')
const commonjs = require('rollup-plugin-commonjs')
const babel = require('rollup-plugin-babel')
module.exports = {
input: 'js/tests/integration/bundle.js',
output: {
file: 'js/coverage/bundle.js',
format: 'iife'
},
plugins: [
resolve(),
commonjs(),
babel({
exclude: 'node_modules/**'
})
]
}
-53
View File
@@ -1,53 +0,0 @@
/* eslint-env node */
/* eslint no-process-env: 0 */
module.exports = (config) => {
const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'site/docs/4.1/assets/js/vendor/jquery-slim.min.js'
config.set({
basePath: '../..',
frameworks: ['qunit', 'sinon', 'detectBrowsers'],
plugins: [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-qunit',
'karma-sinon',
'karma-detect-browsers'
],
// list of files / patterns to load in the browser
files: [
jqueryFile,
'site/docs/4.1/assets/js/vendor/popper.min.js',
'dist/js/bootstrap.js',
'js/tests/unit/*.js'
],
reporters: ['dots'],
port: 9876,
colors: true,
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_ERROR || config.LOG_WARN,
autoWatch: false,
customLaunchers: {
FirefoxHeadless: {
base: 'Firefox',
flags: ['-headless']
}
},
singleRun: true,
concurrency: Infinity,
detectBrowsers: {
usePhantomJS: false,
postDetection(availableBrowser) {
if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
return ['ChromeHeadless']
}
if (availableBrowser.includes('Firefox')) {
return ['FirefoxHeadless']
}
throw new Error('Please install Firefox or Chrome')
}
}
})
}
+133 -66
View File
@@ -1,76 +1,143 @@
/* eslint-env node */
/* eslint no-process-env: 0 */
const path = require('path')
const jsCoveragePath = path.resolve(__dirname, '../coverage')
const ip = require('ip')
const {
browsers,
browsersKeys
} = require('./browsers')
module.exports = (config) => {
const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'site/docs/4.1/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'
config.set({
basePath: '../..',
frameworks: ['qunit', 'sinon', 'detectBrowsers'],
plugins: [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-qunit',
'karma-sinon',
'karma-detect-browsers',
'karma-coverage-istanbul-reporter'
],
// list of files / patterns to load in the browser
files: [
jqueryFile,
'site/docs/4.1/assets/js/vendor/popper.min.js',
'js/coverage/dist/util.js',
'js/coverage/dist/tooltip.js',
'js/coverage/dist/!(util|index|tooltip).js', // include all of our js/dist files except util.js, index.js and tooltip.js
'js/tests/unit/*.js'
],
reporters: ['dots', 'coverage-istanbul'],
port: 9876,
colors: true,
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_ERROR || config.LOG_WARN,
autoWatch: false,
customLaunchers: {
FirefoxHeadless: {
base: 'Firefox',
flags: ['-headless']
}
},
singleRun: true,
concurrency: Infinity,
detectBrowsers: {
usePhantomJS: false,
postDetection(availableBrowser) {
if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
return ['ChromeHeadless']
}
const frameworks = [
'qunit',
'sinon'
]
if (availableBrowser.includes('Firefox')) {
return ['FirefoxHeadless']
}
const plugins = [
'karma-qunit',
'karma-sinon'
]
throw new Error('Please install Firefox or Chrome')
}
},
coverageIstanbulReporter: {
dir: jsCoveragePath,
reports: ['lcov', 'text-summary'],
thresholds: {
emitWarning: false,
global: {
statements: 90,
branches: 84,
functions: 87,
lines: 90
}
}
},
client: {
qunit: {
showUI: true
const reporters = ['dots']
const detectBrowsers = {
usePhantomJS: false,
postDetection(availableBrowser) {
if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
return ['ChromeHeadless']
}
if (availableBrowser.includes('Firefox')) {
return ['FirefoxHeadless']
}
throw new Error('Please install Firefox or Chrome')
}
}
const customLaunchers = {
FirefoxHeadless: {
base: 'Firefox',
flags: ['-headless']
}
}
let files = [
'node_modules/popper.js/dist/umd/popper.min.js',
'node_modules/hammer-simulator/index.js'
]
const conf = {
basePath: '../..',
port: 9876,
colors: true,
autoWatch: false,
singleRun: true,
concurrency: Infinity,
client: {
qunit: {
showUI: true
}
}
}
if (bundle) {
frameworks.push('detectBrowsers')
plugins.push(
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-detect-browsers'
)
conf.customLaunchers = customLaunchers
conf.detectBrowsers = detectBrowsers
files = files.concat([
jqueryFile,
'dist/js/bootstrap.js'
])
} else if (browserStack) {
conf.hostname = ip.address()
conf.browserStack = {
username: process.env.BROWSER_STACK_USERNAME,
accessKey: process.env.BROWSER_STACK_ACCESS_KEY,
build: `bootstrap-${new Date().toISOString()}`,
project: 'Bootstrap',
retryLimit: 2
}
plugins.push('karma-browserstack-launcher')
conf.customLaunchers = browsers
conf.browsers = browsersKeys
reporters.push('BrowserStack')
files = files.concat([
'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
])
} else {
frameworks.push('detectBrowsers')
plugins.push(
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-detect-browsers',
'karma-coverage-istanbul-reporter'
)
files = files.concat([
jqueryFile,
'js/coverage/dist/util.js',
'js/coverage/dist/tooltip.js',
'js/coverage/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
])
reporters.push('coverage-istanbul')
conf.customLaunchers = customLaunchers
conf.detectBrowsers = detectBrowsers
conf.coverageIstanbulReporter = {
dir: path.resolve(__dirname, '../coverage/'),
reports: ['lcov', 'text-summary'],
thresholds: {
emitWarning: false,
global: {
statements: 90,
branches: 86,
functions: 89,
lines: 90
}
}
})
}
}
files.push('js/tests/unit/*.js')
conf.frameworks = frameworks
conf.plugins = plugins
conf.reporters = reporters
conf.files = files
module.exports = (karmaConfig) => {
// possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
karmaConfig.set(conf)
}
+5 -2
View File
@@ -9,7 +9,10 @@
"sinon": false,
"Util": false,
"Alert": false,
"Button": false
"Button": false,
"Carousel": false,
"Simulator": false,
"Toast": false
},
"parserOptions": {
"ecmaVersion": 5,
@@ -17,7 +20,7 @@
},
"extends": "../../../.eslintrc.json",
"rules": {
"no-console": "off",
"no-console": "error",
// Best Practices
"consistent-return": "off",
"no-magic-numbers": "off",
+23
View File
@@ -139,6 +139,29 @@ $(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">' +
+391 -2
View File
@@ -1,6 +1,26 @@
$(function () {
'use strict'
window.Carousel = typeof bootstrap !== 'undefined' ? bootstrap.Carousel : Carousel
var originWinPointerEvent = window.PointerEvent
window.MSPointerEvent = null
var supportPointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)
function clearPointerEvents() {
window.PointerEvent = null
}
function restorePointerEvents() {
window.PointerEvent = originWinPointerEvent
}
var stylesCarousel = [
'<style>',
' .carousel.pointer-event { -ms-touch-action: none; touch-action: none; }',
'</style>'
].join('')
QUnit.module('carousel plugin')
QUnit.test('should be defined on jQuery object', function (assert) {
@@ -25,6 +45,20 @@ $(function () {
assert.strictEqual(typeof $.fn.carousel, 'undefined', 'carousel was set back to undefined (orig value)')
})
QUnit.test('should return version', function (assert) {
assert.expect(1)
assert.strictEqual(typeof Carousel.VERSION, 'string')
})
QUnit.test('should return default parameters', function (assert) {
assert.expect(1)
var defaultConfig = Carousel.Default
assert.strictEqual(defaultConfig.touch, true)
})
QUnit.test('should throw explicit error on undefined method', function (assert) {
assert.expect(1)
var $el = $('<div/>')
@@ -445,6 +479,54 @@ $(function () {
$carousel.remove()
})
QUnit.test('should set interval from data attribute on individual carousel-item', function (assert) {
assert.expect(2)
var templateHTML = '<div id="myCarousel" class="carousel slide" data-interval="1814">' +
'<div class="carousel-inner">' +
'<div class="carousel-item active" data-interval="2814">' +
'<img alt="">' +
'<div class="carousel-caption">' +
'<h4>First Thumbnail label</h4>' +
'<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec ' +
'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ' +
'ultricies vehicula ut id elit.</p>' +
'</div>' +
'</div>' +
'<div class="carousel-item" data-interval="3814">' +
'<img alt="">' +
'<div class="carousel-caption">' +
'<h4>Second Thumbnail label</h4>' +
'<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec ' +
'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ' +
'ultricies vehicula ut id elit.</p>' +
'</div>' +
'</div>' +
'<div class="carousel-item">' +
'<img alt="">' +
'<div class="carousel-caption">' +
'<h4>Third Thumbnail label</h4>' +
'<p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec ' +
'id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ' +
'ultricies vehicula ut id elit.</p>' +
'</div>' +
'</div>' +
'</div>' +
'<a class="left carousel-control" href="#myCarousel" data-slide="prev">&lsaquo;</a>' +
'<a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a>' +
'</div>'
var $carousel = $(templateHTML)
$carousel.appendTo('body')
$carousel.bootstrapCarousel(1)
assert.strictEqual($carousel.data('bs.carousel')._config.interval, 3814)
$carousel.remove()
$carousel.appendTo('body')
$carousel.bootstrapCarousel(2)
assert.strictEqual($carousel.data('bs.carousel')._config.interval, 1814, 'reverts to default interval if no data-interval is set')
$carousel.remove()
})
QUnit.test('should skip over non-items when using item indices', function (assert) {
assert.expect(2)
var templateHTML = '<div id="myCarousel" class="carousel" data-interval="1814">' +
@@ -866,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;">' +
@@ -903,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;">' +
@@ -941,4 +1023,311 @@ $(function () {
}, 80)
}, 80)
})
QUnit.test('should allow swiperight and call prev with pointer events', function (assert) {
if (!supportPointerEvent) {
assert.expect(0)
return
}
document.documentElement.ontouchstart = $.noop
Simulator.setType('pointer')
assert.expect(3)
var $styles = $(stylesCarousel).appendTo('head')
var done = assert.async()
var carouselHTML =
'<div class="carousel" data-interval="false">' +
' <div class="carousel-inner">' +
' <div id="item" class="carousel-item">' +
' <img alt="">' +
' </div>' +
' <div class="carousel-item active">' +
' <img alt="">' +
' </div>' +
' </div>' +
'</div>'
var $carousel = $(carouselHTML).appendTo('#qunit-fixture')
var $item = $('#item')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, 'prev')
$carousel.one('slid.bs.carousel', function () {
assert.ok(true, 'slid event fired')
assert.ok($item.hasClass('active'))
assert.ok(spy.called)
$styles.remove()
delete document.documentElement.ontouchstart
done()
})
Simulator.gestures.swipe($carousel[0], {
deltaX: 300,
deltaY: 0
})
})
QUnit.test('should allow swiperight and call prev with touch events', function (assert) {
Simulator.setType('touch')
clearPointerEvents()
assert.expect(3)
var done = assert.async()
document.documentElement.ontouchstart = $.noop
var carouselHTML =
'<div class="carousel" data-interval="false">' +
' <div class="carousel-inner">' +
' <div id="item" class="carousel-item">' +
' <img alt="">' +
' </div>' +
' <div class="carousel-item active">' +
' <img alt="">' +
' </div>' +
' </div>' +
'</div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
var $item = $('#item')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, 'prev')
$carousel.one('slid.bs.carousel', function () {
assert.ok(true, 'slid event fired')
assert.ok($item.hasClass('active'))
assert.ok(spy.called)
delete document.documentElement.ontouchstart
restorePointerEvents()
done()
})
Simulator.gestures.swipe($carousel[0], {
deltaX: 300,
deltaY: 0
})
})
QUnit.test('should allow swipeleft and call next with pointer events', function (assert) {
if (!supportPointerEvent) {
assert.expect(0)
return
}
document.documentElement.ontouchstart = $.noop
assert.expect(3)
Simulator.setType('pointer')
var $styles = $(stylesCarousel).appendTo('head')
var done = assert.async()
var carouselHTML =
'<div class="carousel" data-interval="false">' +
' <div class="carousel-inner">' +
' <div id="item" class="carousel-item active">' +
' <img alt="">' +
' </div>' +
' <div class="carousel-item">' +
' <img alt="">' +
' </div>' +
' </div>' +
'</div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
var $item = $('#item')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, 'next')
$carousel.one('slid.bs.carousel', function () {
assert.ok(true, 'slid event fired')
assert.ok(!$item.hasClass('active'))
assert.ok(spy.called)
$styles.remove()
delete document.documentElement.ontouchstart
done()
})
Simulator.gestures.swipe($carousel[0], {
pos: [300, 10],
deltaX: -300,
deltaY: 0
})
})
QUnit.test('should allow swipeleft and call next with touch events', function (assert) {
assert.expect(3)
clearPointerEvents()
Simulator.setType('touch')
document.documentElement.ontouchstart = $.noop
var done = assert.async()
var carouselHTML =
'<div class="carousel" data-interval="false">' +
' <div class="carousel-inner">' +
' <div id="item" class="carousel-item active">' +
' <img alt="">' +
' </div>' +
' <div class="carousel-item">' +
' <img alt="">' +
' </div>' +
' </div>' +
'</div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
var $item = $('#item')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, 'next')
$carousel.one('slid.bs.carousel', function () {
assert.ok(true, 'slid event fired')
assert.ok(!$item.hasClass('active'))
assert.ok(spy.called)
restorePointerEvents()
delete document.documentElement.ontouchstart
done()
})
Simulator.gestures.swipe($carousel[0], {
pos: [300, 10],
deltaX: -300,
deltaY: 0
})
})
QUnit.test('should not allow pinch with touch events', function (assert) {
assert.expect(0)
clearPointerEvents()
Simulator.setType('touch')
var done = assert.async()
document.documentElement.ontouchstart = $.noop
var carouselHTML = '<div class="carousel" data-interval="false"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
Simulator.gestures.swipe($carousel[0], {
pos: [300, 10],
deltaX: -300,
deltaY: 0,
touches: 2
}, function () {
restorePointerEvents()
delete document.documentElement.ontouchstart
done()
})
})
QUnit.test('should not call _slide if the carousel is sliding', function (assert) {
assert.expect(1)
var carouselHTML = '<div class="carousel" data-interval="false"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, '_slide')
carousel._isSliding = true
carousel.next()
assert.strictEqual(spy.called, false)
})
QUnit.test('should call next when the page is visible', function (assert) {
assert.expect(1)
var carouselHTML = '<div class="carousel" data-interval="false"></div>'
var $carousel = $(carouselHTML)
$carousel.appendTo('#qunit-fixture')
$carousel.bootstrapCarousel()
var carousel = $carousel.data('bs.carousel')
var spy = sinon.spy(carousel, 'next')
var sandbox = sinon.createSandbox()
sandbox.replaceGetter(document, 'hidden', function () {
return false
})
sandbox.stub($carousel, 'is').returns(true)
sandbox.stub($carousel, 'css').returns('block')
carousel.nextWhenVisible()
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()
})
})
+34
View File
@@ -855,4 +855,38 @@ $(function () {
assert.ok(false, 'collapse not created')
}
})
QUnit.test('should find collapse children if they have collapse class too not only data-parent', function (assert) {
assert.expect(2)
var done = assert.async()
var html =
'<div class="my-collapse">' +
' <div class="item">' +
' <a data-toggle="collapse" href="#">Toggle item 1</a>' +
' <div id="collapse1" class="collapse show">Lorem ipsum 1</div>' +
' </div>' +
' <div class="item">' +
' <a id="triggerCollapse2" data-toggle="collapse" href="#">Toggle item 2</a>' +
' <div id="collapse2" class="collapse">Lorem ipsum 2</div>' +
' </div>' +
'</div>'
$(html).appendTo('#qunit-fixture')
var $parent = $('.my-collapse')
var $collapse2 = $('#collapse2')
$parent.find('.collapse').bootstrapCollapse({
parent: $parent,
toggle: false
})
$collapse2.on('shown.bs.collapse', function () {
assert.ok($collapse2.hasClass('show'))
assert.ok(!$('#collapse1').hasClass('show'))
done()
})
$collapse2.bootstrapCollapse('toggle')
})
})

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