bootstrap 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bootstrap might be problematic. Click here for more details.

Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +14 -0
  3. data/.gitignore +19 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +7 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE +21 -0
  8. data/README.md +143 -0
  9. data/Rakefile +75 -0
  10. data/assets/javascripts/bootstrap-sprockets.js +11 -0
  11. data/assets/javascripts/bootstrap.js +3560 -0
  12. data/assets/javascripts/bootstrap.min.js +220 -0
  13. data/assets/javascripts/bootstrap/alert.js +192 -0
  14. data/assets/javascripts/bootstrap/button.js +172 -0
  15. data/assets/javascripts/bootstrap/carousel.js +478 -0
  16. data/assets/javascripts/bootstrap/collapse.js +364 -0
  17. data/assets/javascripts/bootstrap/dropdown.js +293 -0
  18. data/assets/javascripts/bootstrap/modal.js +536 -0
  19. data/assets/javascripts/bootstrap/popover.js +201 -0
  20. data/assets/javascripts/bootstrap/scrollspy.js +320 -0
  21. data/assets/javascripts/bootstrap/tab.js +263 -0
  22. data/assets/javascripts/bootstrap/tooltip.js +619 -0
  23. data/assets/javascripts/bootstrap/util.js +157 -0
  24. data/assets/stylesheets/_bootstrap-flex.scss +8 -0
  25. data/assets/stylesheets/_bootstrap-grid.scss +62 -0
  26. data/assets/stylesheets/_bootstrap-reboot.scss +10 -0
  27. data/assets/stylesheets/_bootstrap.scss +55 -0
  28. data/assets/stylesheets/bootstrap/_alert.scss +65 -0
  29. data/assets/stylesheets/bootstrap/_animation.scss +27 -0
  30. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -0
  31. data/assets/stylesheets/bootstrap/_button-group.scss +224 -0
  32. data/assets/stylesheets/bootstrap/_buttons.scss +174 -0
  33. data/assets/stylesheets/bootstrap/_card.scss +293 -0
  34. data/assets/stylesheets/bootstrap/_carousel.scss +252 -0
  35. data/assets/stylesheets/bootstrap/_close.scss +28 -0
  36. data/assets/stylesheets/bootstrap/_code.scss +58 -0
  37. data/assets/stylesheets/bootstrap/_custom-forms.scss +225 -0
  38. data/assets/stylesheets/bootstrap/_dropdown.scss +191 -0
  39. data/assets/stylesheets/bootstrap/_forms.scss +454 -0
  40. data/assets/stylesheets/bootstrap/_grid.scss +76 -0
  41. data/assets/stylesheets/bootstrap/_images.scss +28 -0
  42. data/assets/stylesheets/bootstrap/_input-group.scss +181 -0
  43. data/assets/stylesheets/bootstrap/_jumbotron.scss +22 -0
  44. data/assets/stylesheets/bootstrap/_labels.scss +75 -0
  45. data/assets/stylesheets/bootstrap/_list-group.scss +128 -0
  46. data/assets/stylesheets/bootstrap/_media.scss +90 -0
  47. data/assets/stylesheets/bootstrap/_mixins.scss +54 -0
  48. data/assets/stylesheets/bootstrap/_modal.scss +146 -0
  49. data/assets/stylesheets/bootstrap/_nav.scss +155 -0
  50. data/assets/stylesheets/bootstrap/_navbar.scss +230 -0
  51. data/assets/stylesheets/bootstrap/_normalize.scss +428 -0
  52. data/assets/stylesheets/bootstrap/_pager.scss +57 -0
  53. data/assets/stylesheets/bootstrap/_pagination.scss +82 -0
  54. data/assets/stylesheets/bootstrap/_popover.scss +140 -0
  55. data/assets/stylesheets/bootstrap/_print.scss +88 -0
  56. data/assets/stylesheets/bootstrap/_progress.scss +156 -0
  57. data/assets/stylesheets/bootstrap/_reboot.scss +298 -0
  58. data/assets/stylesheets/bootstrap/_responsive-embed.scss +38 -0
  59. data/assets/stylesheets/bootstrap/_tables.scss +193 -0
  60. data/assets/stylesheets/bootstrap/_tooltip.scss +85 -0
  61. data/assets/stylesheets/bootstrap/_type.scss +192 -0
  62. data/assets/stylesheets/bootstrap/_utilities-responsive.scss +49 -0
  63. data/assets/stylesheets/bootstrap/_utilities-spacing.scss +78 -0
  64. data/assets/stylesheets/bootstrap/_utilities.scss +117 -0
  65. data/assets/stylesheets/bootstrap/_variables.scss +632 -0
  66. data/assets/stylesheets/bootstrap/mixins/_alert.scss +14 -0
  67. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +13 -0
  68. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +35 -0
  69. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +76 -0
  70. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +100 -0
  71. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  72. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +7 -0
  73. data/assets/stylesheets/bootstrap/mixins/_forms.scss +89 -0
  74. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +43 -0
  75. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +44 -0
  76. data/assets/stylesheets/bootstrap/mixins/_grid.scss +75 -0
  77. data/assets/stylesheets/bootstrap/mixins/_hover.scss +59 -0
  78. data/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
  79. data/assets/stylesheets/bootstrap/mixins/_label.scss +11 -0
  80. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +30 -0
  81. data/assets/stylesheets/bootstrap/mixins/_lists.scss +7 -0
  82. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  83. data/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +9 -0
  84. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +24 -0
  85. data/assets/stylesheets/bootstrap/mixins/_progress.scss +18 -0
  86. data/assets/stylesheets/bootstrap/mixins/_pulls.scss +6 -0
  87. data/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  88. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +18 -0
  89. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  90. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +32 -0
  91. data/assets/stylesheets/bootstrap/mixins/_size.scss +6 -0
  92. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  93. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +30 -0
  94. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +12 -0
  95. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +8 -0
  96. data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +8 -0
  97. data/bootstrap.gemspec +36 -0
  98. data/lib/bootstrap.rb +76 -0
  99. data/lib/bootstrap/engine.rb +11 -0
  100. data/lib/bootstrap/version.rb +4 -0
  101. data/tasks/updater.rb +67 -0
  102. data/tasks/updater/js.rb +37 -0
  103. data/tasks/updater/logger.rb +57 -0
  104. data/tasks/updater/network.rb +101 -0
  105. data/tasks/updater/scss.rb +34 -0
  106. data/templates/project/_bootstrap-variables.scss +633 -0
  107. data/templates/project/manifest.rb +18 -0
  108. data/templates/project/styles.scss +10 -0
  109. data/test/compass_test.rb +9 -0
  110. data/test/dummy_rails/README.rdoc +3 -0
  111. data/test/dummy_rails/Rakefile +6 -0
  112. data/test/dummy_rails/app/assets/images/.keep +0 -0
  113. data/test/dummy_rails/app/assets/javascripts/application.js +7 -0
  114. data/test/dummy_rails/app/assets/stylesheets/application.sass +1 -0
  115. data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
  116. data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
  117. data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
  118. data/test/dummy_rails/app/views/layouts/application.html.erb +14 -0
  119. data/test/dummy_rails/app/views/pages/root.html.slim +58 -0
  120. data/test/dummy_rails/config.ru +4 -0
  121. data/test/dummy_rails/config/application.rb +34 -0
  122. data/test/dummy_rails/config/boot.rb +5 -0
  123. data/test/dummy_rails/config/environment.rb +5 -0
  124. data/test/dummy_rails/config/environments/development.rb +23 -0
  125. data/test/dummy_rails/config/environments/production.rb +82 -0
  126. data/test/dummy_rails/config/environments/test.rb +38 -0
  127. data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  128. data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
  129. data/test/dummy_rails/config/initializers/inflections.rb +16 -0
  130. data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
  131. data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
  132. data/test/dummy_rails/config/initializers/session_store.rb +3 -0
  133. data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  134. data/test/dummy_rails/config/locales/en.yml +3 -0
  135. data/test/dummy_rails/config/locales/es.yml +3 -0
  136. data/test/dummy_rails/config/routes.rb +3 -0
  137. data/test/dummy_rails/log/.keep +0 -0
  138. data/test/gemfiles/rails_4_2.gemfile +11 -0
  139. data/test/gemfiles/rails_head.gemfile +19 -0
  140. data/test/rails_test.rb +19 -0
  141. data/test/support/dummy_rails_integration.rb +22 -0
  142. data/test/support/reporting.rb +27 -0
  143. data/test/test_helper.rb +35 -0
  144. data/test/test_helper_rails.rb +6 -0
  145. metadata +433 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0c448810fa921af9e7e509f791dc77664b17ee86
4
+ data.tar.gz: bece1f8aa0cef97043a6567f9c12684b38d08fae
5
+ SHA512:
6
+ metadata.gz: 8685bf01a214f5b4b5c5e20a8e420443c090e68af14065aad1bedb422e98627dee125413a8a7ea55fcbab6d5f3bc7d59055e188661b050c54dea8248713458a5
7
+ data.tar.gz: 786c4fc85d922af8852927694daaace46cfe58944492dbd293ea5eedc207713a5d167d4d8f3a959bc22f71d7e0d37107e528eed1fec16948ecacd55e188e73e5
data/.gitattributes ADDED
@@ -0,0 +1,14 @@
1
+ .* text eol=lf
2
+ Gemfile text eol=lf
3
+ LICENSE text eol=lf
4
+ Rakefile text eol=lf
5
+ *.gemfile text eol=lf
6
+ *.gemspec text eol=lf
7
+ *.html.erb text eol=lf
8
+ *.html.slim text eol=lf
9
+ *.js text eol=lf
10
+ *.rb text eol=lf
11
+ *.ru text eol=lf
12
+ *.sass text eol=lf
13
+ *.scss text eol=lf
14
+ *.yml text eol=lf
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ .sass-cache
3
+ bootstrap.css
4
+ bootstrap-responsive.css
5
+ Gemfile.lock
6
+ *.gemfile.lock
7
+ .rvmrc
8
+ .rbenv-version
9
+
10
+ # Ignore bundler config
11
+ /.bundle
12
+ /vendor/cache
13
+ /vendor/bundle
14
+ tmp/
15
+ test/screenshots/
16
+ test/dummy_rails/log/*.log
17
+ test/dummy_rails/public/assets/
18
+ .DS_Store
19
+ node_modules
data/.travis.yml ADDED
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 2.2.3
5
+ gemfile:
6
+ - test/gemfiles/rails_4_2.gemfile
7
+ - test/gemfiles/rails_head.gemfile
8
+ cache: bundler
9
+ bundler_args: --path ../../vendor/bundle --without debug
10
+ notifications:
11
+ slack: heybb:3n88HHilXn76ji9vV4gL819Y
12
+ env:
13
+ global:
14
+ - VERBOSE=1
15
+ script:
16
+ bundle exec rake
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ The changelog is tracked here but also in [the Releases section of the GitHub project](https://github.com/twbs/bootstrap-rubygem/releases).
4
+ The changelog only includes changes specific to the RubyGem.
5
+
6
+ The Bootstrap framework changes can be found in [the Releases section of twbs/bootstrap](https://github.com/twbs/bootstrap/releases).
7
+ Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release of Bootstrap.
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ source 'https://rails-assets.org' do
7
+ gem 'rails-assets-tether', '>= 1.1.0'
8
+ end
9
+ end
10
+
11
+ group :debug do
12
+ gem 'byebug', platforms: [:mri_21, :mri_22], require: false
13
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013-2015 Twitter, Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,143 @@
1
+ # Bootstrap Ruby Gem [![Build Status](https://travis-ci.org/twbs/bootstrap-rubygem.svg?branch=master)](https://travis-ci.org/twbs/bootstrap-rubygem)
2
+
3
+ [Bootstrap 4][bootstrap-home] ruby gem for Ruby on Rails (Sprockets) and Compass.
4
+
5
+ For Sass versions of Bootstrap 3 and 2 see [bootstrap-sass](https://github.com/twbs/bootstrap-sass) instead.
6
+
7
+ ## Installation
8
+
9
+ Please see the appropriate guide for your environment of choice:
10
+
11
+ * [Ruby on Rails 4+](#a-ruby-on-rails) or other Sprockets environment.
12
+ * [Compass](#b-compass-without-rails) not on Rails.
13
+
14
+
15
+ ### a. Ruby on Rails
16
+
17
+ Add `bootstrap` to your Gemfile:
18
+
19
+ ```ruby
20
+ gem 'bootstrap', '~> 4.0.0.alpha1'
21
+ ```
22
+
23
+ Ensure that `sprockets-rails` is at least v2.3.2.
24
+
25
+ `bundle install` and restart your server to make the files available through the pipeline.
26
+
27
+ Import Bootstrap styles in `app/assets/stylesheets/application.scss`:
28
+
29
+ ```scss
30
+ // Custom bootstrap variables must be set or import before bootstrap itself.
31
+ @import "bootstrap";
32
+ ```
33
+
34
+ Make sure the file has `.scss` extension (or `.sass` for Sass syntax). If you have just generated a new Rails app,
35
+ it may come with a `.css` file instead. If this file exists, it will be served instead of Sass, so rename it:
36
+
37
+ ```console
38
+ $ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
39
+ ```
40
+
41
+ Then, remove all the `*= require` and `*= require_tree` statements from the Sass file. Instead, use `@import` to import Sass files.
42
+
43
+ Do not use `*= require` in Sass or your other stylesheets will not be able to access the Bootstrap mixins and variables.
44
+
45
+ Require Bootstrap Javascripts in `app/assets/javascripts/application.js`:
46
+
47
+ ```js
48
+ //= require jquery
49
+ //= require bootstrap-sprockets
50
+ ```
51
+
52
+ While `bootstrap-sprockets` provides individual Bootstrap components for ease of debugging, you may alternatively require the concatenated `bootstrap` for faster compilation:
53
+
54
+ ```js
55
+ //= require jquery
56
+ //= require bootstrap
57
+ ```
58
+
59
+ Tooltips and popovers depend on [tether][tether] for positioning.
60
+ If you use them, add tether to the Gemfile:
61
+
62
+ ```ruby
63
+ source 'https://rails-assets.org' do
64
+ gem 'rails-assets-tether', '>= 1.1.0'
65
+ end
66
+ ```
67
+
68
+ Then, run `bundle`, restart the server, and require tether before bootstrap but after jQuery:
69
+
70
+ ```js
71
+ //= require jquery
72
+ //= require tether
73
+ //= require bootstrap-sprockets
74
+ ```
75
+
76
+ ### b. Compass without Rails
77
+
78
+ Install the gem:
79
+
80
+ ```console
81
+ $ gem install bootstrap -v 4.0.0.alpha1
82
+ ```
83
+
84
+ **If you have an existing Compass project:**
85
+
86
+ 1. Require `bootstrap` in `config.rb`:
87
+
88
+ ```ruby
89
+ require 'bootstrap'
90
+ ```
91
+
92
+ 2. Install Bootstrap with:
93
+
94
+ ```console
95
+ $ bundle exec compass install bootstrap
96
+ ```
97
+
98
+ **If you are creating a new Compass project, you can generate it with bootstrap support:**
99
+
100
+ ```console
101
+ $ bundle exec compass create my-new-project -r bootstrap --using bootstrap
102
+ ```
103
+
104
+ or, alternatively, if you're not using a Gemfile for your dependencies:
105
+
106
+ ```console
107
+ $ compass create my-new-project -r bootstrap --using bootstrap
108
+ ```
109
+
110
+ This will create a new Compass project with the following files in it:
111
+
112
+ * [styles.scss](/templates/project/styles.scss) - main project Sass file, imports Bootstrap and variables.
113
+ * [_bootstrap-variables.scss](/templates/project/_bootstrap-variables.scss) - all of Bootstrap variables, override them here.
114
+
115
+ Some bootstrap mixins may conflict with the Compass ones.
116
+ If this happens, change the import order so that Compass mixins are loaded later.
117
+
118
+ ## Configuration
119
+
120
+ ### Sass: Autoprefixer
121
+
122
+ Bootstrap requires the use of [Autoprefixer][autoprefixer].
123
+ [Autoprefixer][autoprefixer] adds vendor prefixes to CSS rules using values from [Can I Use](http://caniuse.com/).
124
+
125
+ If you are using bootstrap with Rails, autoprefixer is set up for you automatically.
126
+ Otherwise, please consult the [Autoprefixer documentation][autoprefixer].
127
+
128
+ ### Sass: Individual components
129
+
130
+ By default all of Bootstrap is imported.
131
+
132
+ You can also import components explicitly. To start with a full list of modules copy
133
+ [`_bootstrap.scss`](assets/stylesheets/_bootstrap.scss) file into your assets as `_bootstrap-custom.scss`.
134
+ Then comment out components you do not want from `_bootstrap-custom`.
135
+ In the application Sass file, replace `@import 'bootstrap'` with:
136
+
137
+ ```scss
138
+ @import 'bootstrap-custom';
139
+ ```
140
+
141
+ [bootstrap-home]: http://v4-alpha.getbootstrap.com/
142
+ [autoprefixer]: https://github.com/ai/autoprefixer
143
+ [tether]: http://github.hubspot.com/tether/
data/Rakefile ADDED
@@ -0,0 +1,75 @@
1
+ lib_path = File.join(File.dirname(__FILE__), 'lib')
2
+ $:.unshift(lib_path) unless $:.include?(lib_path)
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ t.verbose = true
9
+ end
10
+
11
+ desc 'Test all Gemfiles from test/*.gemfile'
12
+ task :test_all_gemfiles do
13
+ require 'term/ansicolor'
14
+ require 'pty'
15
+ require 'shellwords'
16
+ cmd = 'bundle install --quiet && bundle exec rake --trace'
17
+ statuses = Dir.glob('./test/gemfiles/*{[!.lock]}').map do |gemfile|
18
+ env = {'BUNDLE_GEMFILE' => gemfile}
19
+ cmd_with_env = " (#{env.map { |k, v| "export #{k}=#{Shellwords.escape v}" } * ' '}; #{cmd})"
20
+ $stderr.puts Term::ANSIColor.cyan("Testing\n#{cmd_with_env}")
21
+ PTY.spawn(env, cmd) do |r, _w, pid|
22
+ begin
23
+ r.each_line { |l| puts l }
24
+ rescue Errno::EIO
25
+ # Errno:EIO error means that the process has finished giving output.
26
+ ensure
27
+ ::Process.wait pid
28
+ end
29
+ end
30
+ [$? && $?.exitstatus == 0, cmd_with_env]
31
+ end
32
+ failed_cmds = statuses.reject(&:first).map { |(_status, cmd_with_env)| cmd_with_env }
33
+ if failed_cmds.empty?
34
+ $stderr.puts Term::ANSIColor.green('Tests pass with all gemfiles')
35
+ else
36
+ $stderr.puts Term::ANSIColor.red("Failing (#{failed_cmds.size} / #{statuses.size})\n#{failed_cmds * "\n"}")
37
+ exit 1
38
+ end
39
+ end
40
+
41
+ desc 'Dumps output to a CSS file for testing'
42
+ task :debug do
43
+ require 'sass'
44
+ require './lib/bootstrap'
45
+ require 'term/ansicolor'
46
+ require 'autoprefixer-rails'
47
+ path = Bootstrap.stylesheets_path
48
+ %w(_bootstrap _bootstrap-flex _bootstrap-reboot _bootstrap-grid).each do |file|
49
+ engine = Sass::Engine.for_file("#{path}/#{file}.scss", syntax: :scss, load_paths: [path])
50
+ out = File.join('tmp', "#{file[1..-1]}.css")
51
+ css = engine.render
52
+ css = AutoprefixerRails.process(css)
53
+ File.write(out, css)
54
+ $stderr.puts Term::ANSIColor.green "Compiled #{out}"
55
+ end
56
+ end
57
+
58
+ desc 'Update bootstrap from upstream'
59
+ task :update, :branch do |t, args|
60
+ require './tasks/updater'
61
+ Updater.new(branch: args[:branch]).update_bootstrap
62
+ end
63
+
64
+ desc 'Start a dummy Rails app server'
65
+ task :rails_server do
66
+ require 'rack'
67
+ require 'term/ansicolor'
68
+ port = ENV['PORT'] || 9292
69
+ puts %Q(Starting on #{Term::ANSIColor.cyan "http://localhost:#{port}"})
70
+ Rack::Server.start(
71
+ config: 'test/dummy_rails/config.ru',
72
+ Port: port)
73
+ end
74
+
75
+ task default: :test
@@ -0,0 +1,11 @@
1
+ //= require ./bootstrap/util
2
+ //= require ./bootstrap/alert
3
+ //= require ./bootstrap/button
4
+ //= require ./bootstrap/carousel
5
+ //= require ./bootstrap/collapse
6
+ //= require ./bootstrap/dropdown
7
+ //= require ./bootstrap/modal
8
+ //= require ./bootstrap/scrollspy
9
+ //= require ./bootstrap/tab
10
+ //= require ./bootstrap/tooltip
11
+ //= require ./bootstrap/popover
@@ -0,0 +1,3560 @@
1
+ /*!
2
+ * Bootstrap v4.0.0-alpha (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ if (typeof jQuery === 'undefined') {
8
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
9
+ }
10
+
11
+ +function ($) {
12
+ var version = $.fn.jquery.split(' ')[0].split('.')
13
+ if (version[0] !== '2') {
14
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 2.x.x')
15
+ }
16
+ }(jQuery);
17
+
18
+
19
+ +function ($) {
20
+
21
+ /**
22
+ * --------------------------------------------------------------------------
23
+ * Bootstrap (v4.0.0): util.js
24
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
25
+ * --------------------------------------------------------------------------
26
+ */
27
+
28
+ 'use strict';
29
+
30
+ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
31
+
32
+ var _createClass = (function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
33
+
34
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
35
+
36
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
37
+
38
+ var Util = (function ($) {
39
+
40
+ /**
41
+ * ------------------------------------------------------------------------
42
+ * Private TransitionEnd Helpers
43
+ * ------------------------------------------------------------------------
44
+ */
45
+
46
+ var transition = false;
47
+
48
+ var TransitionEndEvent = {
49
+ WebkitTransition: 'webkitTransitionEnd',
50
+ MozTransition: 'transitionend',
51
+ OTransition: 'oTransitionEnd otransitionend',
52
+ transition: 'transitionend'
53
+ };
54
+
55
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
56
+ function toType(obj) {
57
+ return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
58
+ }
59
+
60
+ function isElement(obj) {
61
+ return (obj[0] || obj).nodeType;
62
+ }
63
+
64
+ function getSpecialTransitionEndEvent() {
65
+ return {
66
+ bindType: transition.end,
67
+ delegateType: transition.end,
68
+ handle: function handle(event) {
69
+ if ($(event.target).is(this)) {
70
+ return event.handleObj.handler.apply(this, arguments);
71
+ }
72
+ }
73
+ };
74
+ }
75
+
76
+ function transitionEndTest() {
77
+ if (window.QUnit) {
78
+ return false;
79
+ }
80
+
81
+ var el = document.createElement('bootstrap');
82
+
83
+ for (var _name in TransitionEndEvent) {
84
+ if (el.style[_name] !== undefined) {
85
+ return { end: TransitionEndEvent[_name] };
86
+ }
87
+ }
88
+
89
+ return false;
90
+ }
91
+
92
+ function transitionEndEmulator(duration) {
93
+ var _this = this;
94
+
95
+ var called = false;
96
+
97
+ $(this).one(Util.TRANSITION_END, function () {
98
+ called = true;
99
+ });
100
+
101
+ setTimeout(function () {
102
+ if (!called) {
103
+ Util.triggerTransitionEnd(_this);
104
+ }
105
+ }, duration);
106
+
107
+ return this;
108
+ }
109
+
110
+ function setTransitionEndSupport() {
111
+ transition = transitionEndTest();
112
+
113
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
114
+
115
+ if (Util.supportsTransitionEnd()) {
116
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * --------------------------------------------------------------------------
122
+ * Public Util Api
123
+ * --------------------------------------------------------------------------
124
+ */
125
+
126
+ var Util = {
127
+
128
+ TRANSITION_END: 'bsTransitionEnd',
129
+
130
+ getUID: function getUID(prefix) {
131
+ do {
132
+ prefix += ~ ~(Math.random() * 1000000);
133
+ } while (document.getElementById(prefix));
134
+ return prefix;
135
+ },
136
+
137
+ getSelectorFromElement: function getSelectorFromElement(element) {
138
+ var selector = element.getAttribute('data-target');
139
+
140
+ if (!selector) {
141
+ selector = element.getAttribute('href') || '';
142
+ selector = /^#[a-z]/i.test(selector) ? selector : null;
143
+ }
144
+
145
+ return selector;
146
+ },
147
+
148
+ reflow: function reflow(element) {
149
+ new Function('bs', 'return bs')(element.offsetHeight);
150
+ },
151
+
152
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
153
+ $(element).trigger(transition.end);
154
+ },
155
+
156
+ supportsTransitionEnd: function supportsTransitionEnd() {
157
+ return Boolean(transition);
158
+ },
159
+
160
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
161
+ for (var property in configTypes) {
162
+ if (configTypes.hasOwnProperty(property)) {
163
+ var expectedTypes = configTypes[property];
164
+ var value = config[property];
165
+ var valueType = undefined;
166
+
167
+ if (value && isElement(value)) {
168
+ valueType = 'element';
169
+ } else {
170
+ valueType = toType(value);
171
+ }
172
+
173
+ if (!new RegExp(expectedTypes).test(valueType)) {
174
+ throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
175
+ }
176
+ }
177
+ }
178
+ }
179
+ };
180
+
181
+ setTransitionEndSupport();
182
+
183
+ return Util;
184
+ })(jQuery);
185
+
186
+ /**
187
+ * --------------------------------------------------------------------------
188
+ * Bootstrap (v4.0.0): alert.js
189
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
190
+ * --------------------------------------------------------------------------
191
+ */
192
+
193
+ var Alert = (function ($) {
194
+
195
+ /**
196
+ * ------------------------------------------------------------------------
197
+ * Constants
198
+ * ------------------------------------------------------------------------
199
+ */
200
+
201
+ var NAME = 'alert';
202
+ var VERSION = '4.0.0';
203
+ var DATA_KEY = 'bs.alert';
204
+ var EVENT_KEY = '.' + DATA_KEY;
205
+ var DATA_API_KEY = '.data-api';
206
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
207
+ var TRANSITION_DURATION = 150;
208
+
209
+ var Selector = {
210
+ DISMISS: '[data-dismiss="alert"]'
211
+ };
212
+
213
+ var Event = {
214
+ CLOSE: 'close' + EVENT_KEY,
215
+ CLOSED: 'closed' + EVENT_KEY,
216
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
217
+ };
218
+
219
+ var ClassName = {
220
+ ALERT: 'alert',
221
+ FADE: 'fade',
222
+ IN: 'in'
223
+ };
224
+
225
+ /**
226
+ * ------------------------------------------------------------------------
227
+ * Class Definition
228
+ * ------------------------------------------------------------------------
229
+ */
230
+
231
+ var Alert = (function () {
232
+ function Alert(element) {
233
+ _classCallCheck(this, Alert);
234
+
235
+ this._element = element;
236
+ }
237
+
238
+ /**
239
+ * ------------------------------------------------------------------------
240
+ * Data Api implementation
241
+ * ------------------------------------------------------------------------
242
+ */
243
+
244
+ // getters
245
+
246
+ _createClass(Alert, [{
247
+ key: 'close',
248
+
249
+ // public
250
+
251
+ value: function close(element) {
252
+ element = element || this._element;
253
+
254
+ var rootElement = this._getRootElement(element);
255
+ var customEvent = this._triggerCloseEvent(rootElement);
256
+
257
+ if (customEvent.isDefaultPrevented()) {
258
+ return;
259
+ }
260
+
261
+ this._removeElement(rootElement);
262
+ }
263
+ }, {
264
+ key: 'dispose',
265
+ value: function dispose() {
266
+ $.removeData(this._element, DATA_KEY);
267
+ this._element = null;
268
+ }
269
+
270
+ // private
271
+
272
+ }, {
273
+ key: '_getRootElement',
274
+ value: function _getRootElement(element) {
275
+ var selector = Util.getSelectorFromElement(element);
276
+ var parent = false;
277
+
278
+ if (selector) {
279
+ parent = $(selector)[0];
280
+ }
281
+
282
+ if (!parent) {
283
+ parent = $(element).closest('.' + ClassName.ALERT)[0];
284
+ }
285
+
286
+ return parent;
287
+ }
288
+ }, {
289
+ key: '_triggerCloseEvent',
290
+ value: function _triggerCloseEvent(element) {
291
+ var closeEvent = $.Event(Event.CLOSE);
292
+
293
+ $(element).trigger(closeEvent);
294
+ return closeEvent;
295
+ }
296
+ }, {
297
+ key: '_removeElement',
298
+ value: function _removeElement(element) {
299
+ $(element).removeClass(ClassName.IN);
300
+
301
+ if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
302
+ this._destroyElement(element);
303
+ return;
304
+ }
305
+
306
+ $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
307
+ }
308
+ }, {
309
+ key: '_destroyElement',
310
+ value: function _destroyElement(element) {
311
+ $(element).detach().trigger(Event.CLOSED).remove();
312
+ }
313
+
314
+ // static
315
+
316
+ }], [{
317
+ key: '_jQueryInterface',
318
+ value: function _jQueryInterface(config) {
319
+ return this.each(function () {
320
+ var $element = $(this);
321
+ var data = $element.data(DATA_KEY);
322
+
323
+ if (!data) {
324
+ data = new Alert(this);
325
+ $element.data(DATA_KEY, data);
326
+ }
327
+
328
+ if (config === 'close') {
329
+ data[config](this);
330
+ }
331
+ });
332
+ }
333
+ }, {
334
+ key: '_handleDismiss',
335
+ value: function _handleDismiss(alertInstance) {
336
+ return function (event) {
337
+ if (event) {
338
+ event.preventDefault();
339
+ }
340
+
341
+ alertInstance.close(this);
342
+ };
343
+ }
344
+ }, {
345
+ key: 'VERSION',
346
+ get: function get() {
347
+ return VERSION;
348
+ }
349
+ }]);
350
+
351
+ return Alert;
352
+ })();
353
+
354
+ $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
355
+
356
+ /**
357
+ * ------------------------------------------------------------------------
358
+ * jQuery
359
+ * ------------------------------------------------------------------------
360
+ */
361
+
362
+ $.fn[NAME] = Alert._jQueryInterface;
363
+ $.fn[NAME].Constructor = Alert;
364
+ $.fn[NAME].noConflict = function () {
365
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
366
+ return Alert._jQueryInterface;
367
+ };
368
+
369
+ return Alert;
370
+ })(jQuery);
371
+
372
+ /**
373
+ * --------------------------------------------------------------------------
374
+ * Bootstrap (v4.0.0): button.js
375
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
376
+ * --------------------------------------------------------------------------
377
+ */
378
+
379
+ var Button = (function ($) {
380
+
381
+ /**
382
+ * ------------------------------------------------------------------------
383
+ * Constants
384
+ * ------------------------------------------------------------------------
385
+ */
386
+
387
+ var NAME = 'button';
388
+ var VERSION = '4.0.0';
389
+ var DATA_KEY = 'bs.button';
390
+ var EVENT_KEY = '.' + DATA_KEY;
391
+ var DATA_API_KEY = '.data-api';
392
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
393
+
394
+ var ClassName = {
395
+ ACTIVE: 'active',
396
+ BUTTON: 'btn',
397
+ FOCUS: 'focus'
398
+ };
399
+
400
+ var Selector = {
401
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
402
+ DATA_TOGGLE: '[data-toggle="buttons"]',
403
+ INPUT: 'input',
404
+ ACTIVE: '.active',
405
+ BUTTON: '.btn'
406
+ };
407
+
408
+ var Event = {
409
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
410
+ FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
411
+ };
412
+
413
+ /**
414
+ * ------------------------------------------------------------------------
415
+ * Class Definition
416
+ * ------------------------------------------------------------------------
417
+ */
418
+
419
+ var Button = (function () {
420
+ function Button(element) {
421
+ _classCallCheck(this, Button);
422
+
423
+ this._element = element;
424
+ }
425
+
426
+ /**
427
+ * ------------------------------------------------------------------------
428
+ * Data Api implementation
429
+ * ------------------------------------------------------------------------
430
+ */
431
+
432
+ // getters
433
+
434
+ _createClass(Button, [{
435
+ key: 'toggle',
436
+
437
+ // public
438
+
439
+ value: function toggle() {
440
+ var triggerChangeEvent = true;
441
+ var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
442
+
443
+ if (rootElement) {
444
+ var input = $(this._element).find(Selector.INPUT)[0];
445
+
446
+ if (input) {
447
+ if (input.type === 'radio') {
448
+ if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
449
+ triggerChangeEvent = false;
450
+ } else {
451
+ var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
452
+
453
+ if (activeElement) {
454
+ $(activeElement).removeClass(ClassName.ACTIVE);
455
+ }
456
+ }
457
+ }
458
+
459
+ if (triggerChangeEvent) {
460
+ input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
461
+ $(this._element).trigger('change');
462
+ }
463
+ }
464
+ } else {
465
+ this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
466
+ }
467
+
468
+ if (triggerChangeEvent) {
469
+ $(this._element).toggleClass(ClassName.ACTIVE);
470
+ }
471
+ }
472
+ }, {
473
+ key: 'dispose',
474
+ value: function dispose() {
475
+ $.removeData(this._element, DATA_KEY);
476
+ this._element = null;
477
+ }
478
+
479
+ // static
480
+
481
+ }], [{
482
+ key: '_jQueryInterface',
483
+ value: function _jQueryInterface(config) {
484
+ return this.each(function () {
485
+ var data = $(this).data(DATA_KEY);
486
+
487
+ if (!data) {
488
+ data = new Button(this);
489
+ $(this).data(DATA_KEY, data);
490
+ }
491
+
492
+ if (config === 'toggle') {
493
+ data[config]();
494
+ }
495
+ });
496
+ }
497
+ }, {
498
+ key: 'VERSION',
499
+ get: function get() {
500
+ return VERSION;
501
+ }
502
+ }]);
503
+
504
+ return Button;
505
+ })();
506
+
507
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
508
+ event.preventDefault();
509
+
510
+ var button = event.target;
511
+
512
+ if (!$(button).hasClass(ClassName.BUTTON)) {
513
+ button = $(button).closest(Selector.BUTTON);
514
+ }
515
+
516
+ Button._jQueryInterface.call($(button), 'toggle');
517
+ }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
518
+ var button = $(event.target).closest(Selector.BUTTON)[0];
519
+ $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
520
+ });
521
+
522
+ /**
523
+ * ------------------------------------------------------------------------
524
+ * jQuery
525
+ * ------------------------------------------------------------------------
526
+ */
527
+
528
+ $.fn[NAME] = Button._jQueryInterface;
529
+ $.fn[NAME].Constructor = Button;
530
+ $.fn[NAME].noConflict = function () {
531
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
532
+ return Button._jQueryInterface;
533
+ };
534
+
535
+ return Button;
536
+ })(jQuery);
537
+
538
+ /**
539
+ * --------------------------------------------------------------------------
540
+ * Bootstrap (v4.0.0): carousel.js
541
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
542
+ * --------------------------------------------------------------------------
543
+ */
544
+
545
+ var Carousel = (function ($) {
546
+
547
+ /**
548
+ * ------------------------------------------------------------------------
549
+ * Constants
550
+ * ------------------------------------------------------------------------
551
+ */
552
+
553
+ var NAME = 'carousel';
554
+ var VERSION = '4.0.0';
555
+ var DATA_KEY = 'bs.carousel';
556
+ var EVENT_KEY = '.' + DATA_KEY;
557
+ var DATA_API_KEY = '.data-api';
558
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
559
+ var TRANSITION_DURATION = 600;
560
+
561
+ var Default = {
562
+ interval: 5000,
563
+ keyboard: true,
564
+ slide: false,
565
+ pause: 'hover',
566
+ wrap: true
567
+ };
568
+
569
+ var DefaultType = {
570
+ interval: '(number|boolean)',
571
+ keyboard: 'boolean',
572
+ slide: '(boolean|string)',
573
+ pause: '(string|boolean)',
574
+ wrap: 'boolean'
575
+ };
576
+
577
+ var Direction = {
578
+ NEXT: 'next',
579
+ PREVIOUS: 'prev'
580
+ };
581
+
582
+ var Event = {
583
+ SLIDE: 'slide' + EVENT_KEY,
584
+ SLID: 'slid' + EVENT_KEY,
585
+ KEYDOWN: 'keydown' + EVENT_KEY,
586
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
587
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY,
588
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
589
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
590
+ };
591
+
592
+ var ClassName = {
593
+ CAROUSEL: 'carousel',
594
+ ACTIVE: 'active',
595
+ SLIDE: 'slide',
596
+ RIGHT: 'right',
597
+ LEFT: 'left',
598
+ ITEM: 'carousel-item'
599
+ };
600
+
601
+ var Selector = {
602
+ ACTIVE: '.active',
603
+ ACTIVE_ITEM: '.active.carousel-item',
604
+ ITEM: '.carousel-item',
605
+ NEXT_PREV: '.next, .prev',
606
+ INDICATORS: '.carousel-indicators',
607
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
608
+ DATA_RIDE: '[data-ride="carousel"]'
609
+ };
610
+
611
+ /**
612
+ * ------------------------------------------------------------------------
613
+ * Class Definition
614
+ * ------------------------------------------------------------------------
615
+ */
616
+
617
+ var Carousel = (function () {
618
+ function Carousel(element, config) {
619
+ _classCallCheck(this, Carousel);
620
+
621
+ this._items = null;
622
+ this._interval = null;
623
+ this._activeElement = null;
624
+
625
+ this._isPaused = false;
626
+ this._isSliding = false;
627
+
628
+ this._config = this._getConfig(config);
629
+ this._element = $(element)[0];
630
+ this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
631
+
632
+ this._addEventListeners();
633
+ }
634
+
635
+ /**
636
+ * ------------------------------------------------------------------------
637
+ * Data Api implementation
638
+ * ------------------------------------------------------------------------
639
+ */
640
+
641
+ // getters
642
+
643
+ _createClass(Carousel, [{
644
+ key: 'next',
645
+
646
+ // public
647
+
648
+ value: function next() {
649
+ if (!this._isSliding) {
650
+ this._slide(Direction.NEXT);
651
+ }
652
+ }
653
+ }, {
654
+ key: 'nextWhenVisible',
655
+ value: function nextWhenVisible() {
656
+ // Don't call next when the page isn't visible
657
+ if (!document.hidden) {
658
+ this.next();
659
+ }
660
+ }
661
+ }, {
662
+ key: 'prev',
663
+ value: function prev() {
664
+ if (!this._isSliding) {
665
+ this._slide(Direction.PREVIOUS);
666
+ }
667
+ }
668
+ }, {
669
+ key: 'pause',
670
+ value: function pause(event) {
671
+ if (!event) {
672
+ this._isPaused = true;
673
+ }
674
+
675
+ if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
676
+ Util.triggerTransitionEnd(this._element);
677
+ this.cycle(true);
678
+ }
679
+
680
+ clearInterval(this._interval);
681
+ this._interval = null;
682
+ }
683
+ }, {
684
+ key: 'cycle',
685
+ value: function cycle(event) {
686
+ if (!event) {
687
+ this._isPaused = false;
688
+ }
689
+
690
+ if (this._interval) {
691
+ clearInterval(this._interval);
692
+ this._interval = null;
693
+ }
694
+
695
+ if (this._config.interval && !this._isPaused) {
696
+ this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
697
+ }
698
+ }
699
+ }, {
700
+ key: 'to',
701
+ value: function to(index) {
702
+ var _this2 = this;
703
+
704
+ this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
705
+
706
+ var activeIndex = this._getItemIndex(this._activeElement);
707
+
708
+ if (index > this._items.length - 1 || index < 0) {
709
+ return;
710
+ }
711
+
712
+ if (this._isSliding) {
713
+ $(this._element).one(Event.SLID, function () {
714
+ return _this2.to(index);
715
+ });
716
+ return;
717
+ }
718
+
719
+ if (activeIndex === index) {
720
+ this.pause();
721
+ this.cycle();
722
+ return;
723
+ }
724
+
725
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;
726
+
727
+ this._slide(direction, this._items[index]);
728
+ }
729
+ }, {
730
+ key: 'dispose',
731
+ value: function dispose() {
732
+ $(this._element).off(EVENT_KEY);
733
+ $.removeData(this._element, DATA_KEY);
734
+
735
+ this._items = null;
736
+ this._config = null;
737
+ this._element = null;
738
+ this._interval = null;
739
+ this._isPaused = null;
740
+ this._isSliding = null;
741
+ this._activeElement = null;
742
+ this._indicatorsElement = null;
743
+ }
744
+
745
+ // private
746
+
747
+ }, {
748
+ key: '_getConfig',
749
+ value: function _getConfig(config) {
750
+ config = $.extend({}, Default, config);
751
+ Util.typeCheckConfig(NAME, config, DefaultType);
752
+ return config;
753
+ }
754
+ }, {
755
+ key: '_addEventListeners',
756
+ value: function _addEventListeners() {
757
+ if (this._config.keyboard) {
758
+ $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
759
+ }
760
+
761
+ if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
762
+ $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
763
+ }
764
+ }
765
+ }, {
766
+ key: '_keydown',
767
+ value: function _keydown(event) {
768
+ event.preventDefault();
769
+
770
+ if (/input|textarea/i.test(event.target.tagName)) {
771
+ return;
772
+ }
773
+
774
+ switch (event.which) {
775
+ case 37:
776
+ this.prev();break;
777
+ case 39:
778
+ this.next();break;
779
+ default:
780
+ return;
781
+ }
782
+ }
783
+ }, {
784
+ key: '_getItemIndex',
785
+ value: function _getItemIndex(element) {
786
+ this._items = $.makeArray($(element).parent().find(Selector.ITEM));
787
+ return this._items.indexOf(element);
788
+ }
789
+ }, {
790
+ key: '_getItemByDirection',
791
+ value: function _getItemByDirection(direction, activeElement) {
792
+ var isNextDirection = direction === Direction.NEXT;
793
+ var isPrevDirection = direction === Direction.PREVIOUS;
794
+ var activeIndex = this._getItemIndex(activeElement);
795
+ var lastItemIndex = this._items.length - 1;
796
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
797
+
798
+ if (isGoingToWrap && !this._config.wrap) {
799
+ return activeElement;
800
+ }
801
+
802
+ var delta = direction === Direction.PREVIOUS ? -1 : 1;
803
+ var itemIndex = (activeIndex + delta) % this._items.length;
804
+
805
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
806
+ }
807
+ }, {
808
+ key: '_triggerSlideEvent',
809
+ value: function _triggerSlideEvent(relatedTarget, directionalClassname) {
810
+ var slideEvent = $.Event(Event.SLIDE, {
811
+ relatedTarget: relatedTarget,
812
+ direction: directionalClassname
813
+ });
814
+
815
+ $(this._element).trigger(slideEvent);
816
+
817
+ return slideEvent;
818
+ }
819
+ }, {
820
+ key: '_setActiveIndicatorElement',
821
+ value: function _setActiveIndicatorElement(element) {
822
+ if (this._indicatorsElement) {
823
+ $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
824
+
825
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
826
+
827
+ if (nextIndicator) {
828
+ $(nextIndicator).addClass(ClassName.ACTIVE);
829
+ }
830
+ }
831
+ }
832
+ }, {
833
+ key: '_slide',
834
+ value: function _slide(direction, element) {
835
+ var _this3 = this;
836
+
837
+ var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
838
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
839
+
840
+ var isCycling = Boolean(this._interval);
841
+
842
+ var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;
843
+
844
+ if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
845
+ this._isSliding = false;
846
+ return;
847
+ }
848
+
849
+ var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
850
+ if (slideEvent.isDefaultPrevented()) {
851
+ return;
852
+ }
853
+
854
+ if (!activeElement || !nextElement) {
855
+ // some weirdness is happening, so we bail
856
+ return;
857
+ }
858
+
859
+ this._isSliding = true;
860
+
861
+ if (isCycling) {
862
+ this.pause();
863
+ }
864
+
865
+ this._setActiveIndicatorElement(nextElement);
866
+
867
+ var slidEvent = $.Event(Event.SLID, {
868
+ relatedTarget: nextElement,
869
+ direction: directionalClassName
870
+ });
871
+
872
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
873
+
874
+ $(nextElement).addClass(direction);
875
+
876
+ Util.reflow(nextElement);
877
+
878
+ $(activeElement).addClass(directionalClassName);
879
+ $(nextElement).addClass(directionalClassName);
880
+
881
+ $(activeElement).one(Util.TRANSITION_END, function () {
882
+ $(nextElement).removeClass(directionalClassName).removeClass(direction);
883
+
884
+ $(nextElement).addClass(ClassName.ACTIVE);
885
+
886
+ $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
887
+
888
+ _this3._isSliding = false;
889
+
890
+ setTimeout(function () {
891
+ return $(_this3._element).trigger(slidEvent);
892
+ }, 0);
893
+ }).emulateTransitionEnd(TRANSITION_DURATION);
894
+ } else {
895
+ $(activeElement).removeClass(ClassName.ACTIVE);
896
+ $(nextElement).addClass(ClassName.ACTIVE);
897
+
898
+ this._isSliding = false;
899
+ $(this._element).trigger(slidEvent);
900
+ }
901
+
902
+ if (isCycling) {
903
+ this.cycle();
904
+ }
905
+ }
906
+
907
+ // static
908
+
909
+ }], [{
910
+ key: '_jQueryInterface',
911
+ value: function _jQueryInterface(config) {
912
+ return this.each(function () {
913
+ var data = $(this).data(DATA_KEY);
914
+ var _config = $.extend({}, Default, $(this).data());
915
+
916
+ if (typeof config === 'object') {
917
+ $.extend(_config, config);
918
+ }
919
+
920
+ var action = typeof config === 'string' ? config : _config.slide;
921
+
922
+ if (!data) {
923
+ data = new Carousel(this, _config);
924
+ $(this).data(DATA_KEY, data);
925
+ }
926
+
927
+ if (typeof config === 'number') {
928
+ data.to(config);
929
+ } else if (typeof action === 'string') {
930
+ if (data[action] === undefined) {
931
+ throw new Error('No method named "' + action + '"');
932
+ }
933
+ data[action]();
934
+ } else if (_config.interval) {
935
+ data.pause();
936
+ data.cycle();
937
+ }
938
+ });
939
+ }
940
+ }, {
941
+ key: '_dataApiClickHandler',
942
+ value: function _dataApiClickHandler(event) {
943
+ var selector = Util.getSelectorFromElement(this);
944
+
945
+ if (!selector) {
946
+ return;
947
+ }
948
+
949
+ var target = $(selector)[0];
950
+
951
+ if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
952
+ return;
953
+ }
954
+
955
+ var config = $.extend({}, $(target).data(), $(this).data());
956
+ var slideIndex = this.getAttribute('data-slide-to');
957
+
958
+ if (slideIndex) {
959
+ config.interval = false;
960
+ }
961
+
962
+ Carousel._jQueryInterface.call($(target), config);
963
+
964
+ if (slideIndex) {
965
+ $(target).data(DATA_KEY).to(slideIndex);
966
+ }
967
+
968
+ event.preventDefault();
969
+ }
970
+ }, {
971
+ key: 'VERSION',
972
+ get: function get() {
973
+ return VERSION;
974
+ }
975
+ }, {
976
+ key: 'Default',
977
+ get: function get() {
978
+ return Default;
979
+ }
980
+ }]);
981
+
982
+ return Carousel;
983
+ })();
984
+
985
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
986
+
987
+ $(window).on(Event.LOAD_DATA_API, function () {
988
+ $(Selector.DATA_RIDE).each(function () {
989
+ var $carousel = $(this);
990
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
991
+ });
992
+ });
993
+
994
+ /**
995
+ * ------------------------------------------------------------------------
996
+ * jQuery
997
+ * ------------------------------------------------------------------------
998
+ */
999
+
1000
+ $.fn[NAME] = Carousel._jQueryInterface;
1001
+ $.fn[NAME].Constructor = Carousel;
1002
+ $.fn[NAME].noConflict = function () {
1003
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
1004
+ return Carousel._jQueryInterface;
1005
+ };
1006
+
1007
+ return Carousel;
1008
+ })(jQuery);
1009
+
1010
+ /**
1011
+ * --------------------------------------------------------------------------
1012
+ * Bootstrap (v4.0.0): collapse.js
1013
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1014
+ * --------------------------------------------------------------------------
1015
+ */
1016
+
1017
+ var Collapse = (function ($) {
1018
+
1019
+ /**
1020
+ * ------------------------------------------------------------------------
1021
+ * Constants
1022
+ * ------------------------------------------------------------------------
1023
+ */
1024
+
1025
+ var NAME = 'collapse';
1026
+ var VERSION = '4.0.0';
1027
+ var DATA_KEY = 'bs.collapse';
1028
+ var EVENT_KEY = '.' + DATA_KEY;
1029
+ var DATA_API_KEY = '.data-api';
1030
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
1031
+ var TRANSITION_DURATION = 600;
1032
+
1033
+ var Default = {
1034
+ toggle: true,
1035
+ parent: ''
1036
+ };
1037
+
1038
+ var DefaultType = {
1039
+ toggle: 'boolean',
1040
+ parent: 'string'
1041
+ };
1042
+
1043
+ var Event = {
1044
+ SHOW: 'show' + EVENT_KEY,
1045
+ SHOWN: 'shown' + EVENT_KEY,
1046
+ HIDE: 'hide' + EVENT_KEY,
1047
+ HIDDEN: 'hidden' + EVENT_KEY,
1048
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
1049
+ };
1050
+
1051
+ var ClassName = {
1052
+ IN: 'in',
1053
+ COLLAPSE: 'collapse',
1054
+ COLLAPSING: 'collapsing',
1055
+ COLLAPSED: 'collapsed'
1056
+ };
1057
+
1058
+ var Dimension = {
1059
+ WIDTH: 'width',
1060
+ HEIGHT: 'height'
1061
+ };
1062
+
1063
+ var Selector = {
1064
+ ACTIVES: '.panel > .in, .panel > .collapsing',
1065
+ DATA_TOGGLE: '[data-toggle="collapse"]'
1066
+ };
1067
+
1068
+ /**
1069
+ * ------------------------------------------------------------------------
1070
+ * Class Definition
1071
+ * ------------------------------------------------------------------------
1072
+ */
1073
+
1074
+ var Collapse = (function () {
1075
+ function Collapse(element, config) {
1076
+ _classCallCheck(this, Collapse);
1077
+
1078
+ this._isTransitioning = false;
1079
+ this._element = element;
1080
+ this._config = this._getConfig(config);
1081
+ this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
1082
+
1083
+ this._parent = this._config.parent ? this._getParent() : null;
1084
+
1085
+ if (!this._config.parent) {
1086
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
1087
+ }
1088
+
1089
+ if (this._config.toggle) {
1090
+ this.toggle();
1091
+ }
1092
+ }
1093
+
1094
+ /**
1095
+ * ------------------------------------------------------------------------
1096
+ * Data Api implementation
1097
+ * ------------------------------------------------------------------------
1098
+ */
1099
+
1100
+ // getters
1101
+
1102
+ _createClass(Collapse, [{
1103
+ key: 'toggle',
1104
+
1105
+ // public
1106
+
1107
+ value: function toggle() {
1108
+ if ($(this._element).hasClass(ClassName.IN)) {
1109
+ this.hide();
1110
+ } else {
1111
+ this.show();
1112
+ }
1113
+ }
1114
+ }, {
1115
+ key: 'show',
1116
+ value: function show() {
1117
+ var _this4 = this;
1118
+
1119
+ if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
1120
+ return;
1121
+ }
1122
+
1123
+ var actives = undefined;
1124
+ var activesData = undefined;
1125
+
1126
+ if (this._parent) {
1127
+ actives = $.makeArray($(Selector.ACTIVES));
1128
+ if (!actives.length) {
1129
+ actives = null;
1130
+ }
1131
+ }
1132
+
1133
+ if (actives) {
1134
+ activesData = $(actives).data(DATA_KEY);
1135
+ if (activesData && activesData._isTransitioning) {
1136
+ return;
1137
+ }
1138
+ }
1139
+
1140
+ var startEvent = $.Event(Event.SHOW);
1141
+ $(this._element).trigger(startEvent);
1142
+ if (startEvent.isDefaultPrevented()) {
1143
+ return;
1144
+ }
1145
+
1146
+ if (actives) {
1147
+ Collapse._jQueryInterface.call($(actives), 'hide');
1148
+ if (!activesData) {
1149
+ $(actives).data(DATA_KEY, null);
1150
+ }
1151
+ }
1152
+
1153
+ var dimension = this._getDimension();
1154
+
1155
+ $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
1156
+
1157
+ this._element.style[dimension] = 0;
1158
+ this._element.setAttribute('aria-expanded', true);
1159
+
1160
+ if (this._triggerArray.length) {
1161
+ $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
1162
+ }
1163
+
1164
+ this.setTransitioning(true);
1165
+
1166
+ var complete = function complete() {
1167
+ $(_this4._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
1168
+
1169
+ _this4._element.style[dimension] = '';
1170
+
1171
+ _this4.setTransitioning(false);
1172
+
1173
+ $(_this4._element).trigger(Event.SHOWN);
1174
+ };
1175
+
1176
+ if (!Util.supportsTransitionEnd()) {
1177
+ complete();
1178
+ return;
1179
+ }
1180
+
1181
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1182
+ var scrollSize = 'scroll' + capitalizedDimension;
1183
+
1184
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
1185
+
1186
+ this._element.style[dimension] = this._element[scrollSize] + 'px';
1187
+ }
1188
+ }, {
1189
+ key: 'hide',
1190
+ value: function hide() {
1191
+ var _this5 = this;
1192
+
1193
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
1194
+ return;
1195
+ }
1196
+
1197
+ var startEvent = $.Event(Event.HIDE);
1198
+ $(this._element).trigger(startEvent);
1199
+ if (startEvent.isDefaultPrevented()) {
1200
+ return;
1201
+ }
1202
+
1203
+ var dimension = this._getDimension();
1204
+ var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
1205
+
1206
+ this._element.style[dimension] = this._element[offsetDimension] + 'px';
1207
+
1208
+ Util.reflow(this._element);
1209
+
1210
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
1211
+
1212
+ this._element.setAttribute('aria-expanded', false);
1213
+
1214
+ if (this._triggerArray.length) {
1215
+ $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
1216
+ }
1217
+
1218
+ this.setTransitioning(true);
1219
+
1220
+ var complete = function complete() {
1221
+ _this5.setTransitioning(false);
1222
+ $(_this5._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
1223
+ };
1224
+
1225
+ this._element.style[dimension] = 0;
1226
+
1227
+ if (!Util.supportsTransitionEnd()) {
1228
+ complete();
1229
+ return;
1230
+ }
1231
+
1232
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
1233
+ }
1234
+ }, {
1235
+ key: 'setTransitioning',
1236
+ value: function setTransitioning(isTransitioning) {
1237
+ this._isTransitioning = isTransitioning;
1238
+ }
1239
+ }, {
1240
+ key: 'dispose',
1241
+ value: function dispose() {
1242
+ $.removeData(this._element, DATA_KEY);
1243
+
1244
+ this._config = null;
1245
+ this._parent = null;
1246
+ this._element = null;
1247
+ this._triggerArray = null;
1248
+ this._isTransitioning = null;
1249
+ }
1250
+
1251
+ // private
1252
+
1253
+ }, {
1254
+ key: '_getConfig',
1255
+ value: function _getConfig(config) {
1256
+ config = $.extend({}, Default, config);
1257
+ config.toggle = Boolean(config.toggle); // coerce string values
1258
+ Util.typeCheckConfig(NAME, config, DefaultType);
1259
+ return config;
1260
+ }
1261
+ }, {
1262
+ key: '_getDimension',
1263
+ value: function _getDimension() {
1264
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
1265
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
1266
+ }
1267
+ }, {
1268
+ key: '_getParent',
1269
+ value: function _getParent() {
1270
+ var _this6 = this;
1271
+
1272
+ var parent = $(this._config.parent)[0];
1273
+ var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
1274
+
1275
+ $(parent).find(selector).each(function (i, element) {
1276
+ _this6._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
1277
+ });
1278
+
1279
+ return parent;
1280
+ }
1281
+ }, {
1282
+ key: '_addAriaAndCollapsedClass',
1283
+ value: function _addAriaAndCollapsedClass(element, triggerArray) {
1284
+ if (element) {
1285
+ var isOpen = $(element).hasClass(ClassName.IN);
1286
+ element.setAttribute('aria-expanded', isOpen);
1287
+
1288
+ if (triggerArray.length) {
1289
+ $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
1290
+ }
1291
+ }
1292
+ }
1293
+
1294
+ // static
1295
+
1296
+ }], [{
1297
+ key: '_getTargetFromElement',
1298
+ value: function _getTargetFromElement(element) {
1299
+ var selector = Util.getSelectorFromElement(element);
1300
+ return selector ? $(selector)[0] : null;
1301
+ }
1302
+ }, {
1303
+ key: '_jQueryInterface',
1304
+ value: function _jQueryInterface(config) {
1305
+ return this.each(function () {
1306
+ var $this = $(this);
1307
+ var data = $this.data(DATA_KEY);
1308
+ var _config = $.extend({}, Default, $this.data(), typeof config === 'object' && config);
1309
+
1310
+ if (!data && _config.toggle && /show|hide/.test(config)) {
1311
+ _config.toggle = false;
1312
+ }
1313
+
1314
+ if (!data) {
1315
+ data = new Collapse(this, _config);
1316
+ $this.data(DATA_KEY, data);
1317
+ }
1318
+
1319
+ if (typeof config === 'string') {
1320
+ if (data[config] === undefined) {
1321
+ throw new Error('No method named "' + config + '"');
1322
+ }
1323
+ data[config]();
1324
+ }
1325
+ });
1326
+ }
1327
+ }, {
1328
+ key: 'VERSION',
1329
+ get: function get() {
1330
+ return VERSION;
1331
+ }
1332
+ }, {
1333
+ key: 'Default',
1334
+ get: function get() {
1335
+ return Default;
1336
+ }
1337
+ }]);
1338
+
1339
+ return Collapse;
1340
+ })();
1341
+
1342
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
1343
+ event.preventDefault();
1344
+
1345
+ var target = Collapse._getTargetFromElement(this);
1346
+ var data = $(target).data(DATA_KEY);
1347
+ var config = data ? 'toggle' : $(this).data();
1348
+
1349
+ Collapse._jQueryInterface.call($(target), config);
1350
+ });
1351
+
1352
+ /**
1353
+ * ------------------------------------------------------------------------
1354
+ * jQuery
1355
+ * ------------------------------------------------------------------------
1356
+ */
1357
+
1358
+ $.fn[NAME] = Collapse._jQueryInterface;
1359
+ $.fn[NAME].Constructor = Collapse;
1360
+ $.fn[NAME].noConflict = function () {
1361
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
1362
+ return Collapse._jQueryInterface;
1363
+ };
1364
+
1365
+ return Collapse;
1366
+ })(jQuery);
1367
+
1368
+ /**
1369
+ * --------------------------------------------------------------------------
1370
+ * Bootstrap (v4.0.0): dropdown.js
1371
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1372
+ * --------------------------------------------------------------------------
1373
+ */
1374
+
1375
+ var Dropdown = (function ($) {
1376
+
1377
+ /**
1378
+ * ------------------------------------------------------------------------
1379
+ * Constants
1380
+ * ------------------------------------------------------------------------
1381
+ */
1382
+
1383
+ var NAME = 'dropdown';
1384
+ var VERSION = '4.0.0';
1385
+ var DATA_KEY = 'bs.dropdown';
1386
+ var EVENT_KEY = '.' + DATA_KEY;
1387
+ var DATA_API_KEY = '.data-api';
1388
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
1389
+
1390
+ var Event = {
1391
+ HIDE: 'hide' + EVENT_KEY,
1392
+ HIDDEN: 'hidden' + EVENT_KEY,
1393
+ SHOW: 'show' + EVENT_KEY,
1394
+ SHOWN: 'shown' + EVENT_KEY,
1395
+ CLICK: 'click' + EVENT_KEY,
1396
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
1397
+ KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
1398
+ };
1399
+
1400
+ var ClassName = {
1401
+ BACKDROP: 'dropdown-backdrop',
1402
+ DISABLED: 'disabled',
1403
+ OPEN: 'open'
1404
+ };
1405
+
1406
+ var Selector = {
1407
+ BACKDROP: '.dropdown-backdrop',
1408
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
1409
+ FORM_CHILD: '.dropdown form',
1410
+ ROLE_MENU: '[role="menu"]',
1411
+ ROLE_LISTBOX: '[role="listbox"]',
1412
+ NAVBAR_NAV: '.navbar-nav',
1413
+ VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
1414
+ };
1415
+
1416
+ /**
1417
+ * ------------------------------------------------------------------------
1418
+ * Class Definition
1419
+ * ------------------------------------------------------------------------
1420
+ */
1421
+
1422
+ var Dropdown = (function () {
1423
+ function Dropdown(element) {
1424
+ _classCallCheck(this, Dropdown);
1425
+
1426
+ this._element = element;
1427
+
1428
+ this._addEventListeners();
1429
+ }
1430
+
1431
+ /**
1432
+ * ------------------------------------------------------------------------
1433
+ * Data Api implementation
1434
+ * ------------------------------------------------------------------------
1435
+ */
1436
+
1437
+ // getters
1438
+
1439
+ _createClass(Dropdown, [{
1440
+ key: 'toggle',
1441
+
1442
+ // public
1443
+
1444
+ value: function toggle() {
1445
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
1446
+ return false;
1447
+ }
1448
+
1449
+ var parent = Dropdown._getParentFromElement(this);
1450
+ var isActive = $(parent).hasClass(ClassName.OPEN);
1451
+
1452
+ Dropdown._clearMenus();
1453
+
1454
+ if (isActive) {
1455
+ return false;
1456
+ }
1457
+
1458
+ if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
1459
+
1460
+ // if mobile we use a backdrop because click events don't delegate
1461
+ var dropdown = document.createElement('div');
1462
+ dropdown.className = ClassName.BACKDROP;
1463
+ $(dropdown).insertBefore(this);
1464
+ $(dropdown).on('click', Dropdown._clearMenus);
1465
+ }
1466
+
1467
+ var relatedTarget = { relatedTarget: this };
1468
+ var showEvent = $.Event(Event.SHOW, relatedTarget);
1469
+
1470
+ $(parent).trigger(showEvent);
1471
+
1472
+ if (showEvent.isDefaultPrevented()) {
1473
+ return false;
1474
+ }
1475
+
1476
+ this.focus();
1477
+ this.setAttribute('aria-expanded', 'true');
1478
+
1479
+ $(parent).toggleClass(ClassName.OPEN);
1480
+ $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
1481
+
1482
+ return false;
1483
+ }
1484
+ }, {
1485
+ key: 'dispose',
1486
+ value: function dispose() {
1487
+ $.removeData(this._element, DATA_KEY);
1488
+ $(this._element).off(EVENT_KEY);
1489
+ this._element = null;
1490
+ }
1491
+
1492
+ // private
1493
+
1494
+ }, {
1495
+ key: '_addEventListeners',
1496
+ value: function _addEventListeners() {
1497
+ $(this._element).on(Event.CLICK, this.toggle);
1498
+ }
1499
+
1500
+ // static
1501
+
1502
+ }], [{
1503
+ key: '_jQueryInterface',
1504
+ value: function _jQueryInterface(config) {
1505
+ return this.each(function () {
1506
+ var data = $(this).data(DATA_KEY);
1507
+
1508
+ if (!data) {
1509
+ $(this).data(DATA_KEY, data = new Dropdown(this));
1510
+ }
1511
+
1512
+ if (typeof config === 'string') {
1513
+ if (data[config] === undefined) {
1514
+ throw new Error('No method named "' + config + '"');
1515
+ }
1516
+ data[config].call(this);
1517
+ }
1518
+ });
1519
+ }
1520
+ }, {
1521
+ key: '_clearMenus',
1522
+ value: function _clearMenus(event) {
1523
+ if (event && event.which === 3) {
1524
+ return;
1525
+ }
1526
+
1527
+ var backdrop = $(Selector.BACKDROP)[0];
1528
+ if (backdrop) {
1529
+ backdrop.parentNode.removeChild(backdrop);
1530
+ }
1531
+
1532
+ var toggles = $.makeArray($(Selector.DATA_TOGGLE));
1533
+
1534
+ for (var i = 0; i < toggles.length; i++) {
1535
+ var _parent = Dropdown._getParentFromElement(toggles[i]);
1536
+ var relatedTarget = { relatedTarget: toggles[i] };
1537
+
1538
+ if (!$(_parent).hasClass(ClassName.OPEN)) {
1539
+ continue;
1540
+ }
1541
+
1542
+ if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(_parent, event.target)) {
1543
+ continue;
1544
+ }
1545
+
1546
+ var hideEvent = $.Event(Event.HIDE, relatedTarget);
1547
+ $(_parent).trigger(hideEvent);
1548
+ if (hideEvent.isDefaultPrevented()) {
1549
+ continue;
1550
+ }
1551
+
1552
+ toggles[i].setAttribute('aria-expanded', 'false');
1553
+
1554
+ $(_parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
1555
+ }
1556
+ }
1557
+ }, {
1558
+ key: '_getParentFromElement',
1559
+ value: function _getParentFromElement(element) {
1560
+ var parent = undefined;
1561
+ var selector = Util.getSelectorFromElement(element);
1562
+
1563
+ if (selector) {
1564
+ parent = $(selector)[0];
1565
+ }
1566
+
1567
+ return parent || element.parentNode;
1568
+ }
1569
+ }, {
1570
+ key: '_dataApiKeydownHandler',
1571
+ value: function _dataApiKeydownHandler(event) {
1572
+ if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
1573
+ return;
1574
+ }
1575
+
1576
+ event.preventDefault();
1577
+ event.stopPropagation();
1578
+
1579
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
1580
+ return;
1581
+ }
1582
+
1583
+ var parent = Dropdown._getParentFromElement(this);
1584
+ var isActive = $(parent).hasClass(ClassName.OPEN);
1585
+
1586
+ if (!isActive && event.which !== 27 || isActive && event.which === 27) {
1587
+
1588
+ if (event.which === 27) {
1589
+ var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
1590
+ $(toggle).trigger('focus');
1591
+ }
1592
+
1593
+ $(this).trigger('click');
1594
+ return;
1595
+ }
1596
+
1597
+ var items = $.makeArray($(Selector.VISIBLE_ITEMS));
1598
+
1599
+ items = items.filter(function (item) {
1600
+ return item.offsetWidth || item.offsetHeight;
1601
+ });
1602
+
1603
+ if (!items.length) {
1604
+ return;
1605
+ }
1606
+
1607
+ var index = items.indexOf(event.target);
1608
+
1609
+ if (event.which === 38 && index > 0) {
1610
+ // up
1611
+ index--;
1612
+ }
1613
+
1614
+ if (event.which === 40 && index < items.length - 1) {
1615
+ // down
1616
+ index++;
1617
+ }
1618
+
1619
+ if (! ~index) {
1620
+ index = 0;
1621
+ }
1622
+
1623
+ items[index].focus();
1624
+ }
1625
+ }, {
1626
+ key: 'VERSION',
1627
+ get: function get() {
1628
+ return VERSION;
1629
+ }
1630
+ }]);
1631
+
1632
+ return Dropdown;
1633
+ })();
1634
+
1635
+ $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
1636
+ e.stopPropagation();
1637
+ });
1638
+
1639
+ /**
1640
+ * ------------------------------------------------------------------------
1641
+ * jQuery
1642
+ * ------------------------------------------------------------------------
1643
+ */
1644
+
1645
+ $.fn[NAME] = Dropdown._jQueryInterface;
1646
+ $.fn[NAME].Constructor = Dropdown;
1647
+ $.fn[NAME].noConflict = function () {
1648
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
1649
+ return Dropdown._jQueryInterface;
1650
+ };
1651
+
1652
+ return Dropdown;
1653
+ })(jQuery);
1654
+
1655
+ /**
1656
+ * --------------------------------------------------------------------------
1657
+ * Bootstrap (v4.0.0): modal.js
1658
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1659
+ * --------------------------------------------------------------------------
1660
+ */
1661
+
1662
+ var Modal = (function ($) {
1663
+
1664
+ /**
1665
+ * ------------------------------------------------------------------------
1666
+ * Constants
1667
+ * ------------------------------------------------------------------------
1668
+ */
1669
+
1670
+ var NAME = 'modal';
1671
+ var VERSION = '4.0.0';
1672
+ var DATA_KEY = 'bs.modal';
1673
+ var EVENT_KEY = '.' + DATA_KEY;
1674
+ var DATA_API_KEY = '.data-api';
1675
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
1676
+ var TRANSITION_DURATION = 300;
1677
+ var BACKDROP_TRANSITION_DURATION = 150;
1678
+
1679
+ var Default = {
1680
+ backdrop: true,
1681
+ keyboard: true,
1682
+ focus: true,
1683
+ show: true
1684
+ };
1685
+
1686
+ var DefaultType = {
1687
+ backdrop: '(boolean|string)',
1688
+ keyboard: 'boolean',
1689
+ focus: 'boolean',
1690
+ show: 'boolean'
1691
+ };
1692
+
1693
+ var Event = {
1694
+ HIDE: 'hide' + EVENT_KEY,
1695
+ HIDDEN: 'hidden' + EVENT_KEY,
1696
+ SHOW: 'show' + EVENT_KEY,
1697
+ SHOWN: 'shown' + EVENT_KEY,
1698
+ FOCUSIN: 'focusin' + EVENT_KEY,
1699
+ RESIZE: 'resize' + EVENT_KEY,
1700
+ CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
1701
+ KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
1702
+ MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
1703
+ MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
1704
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
1705
+ };
1706
+
1707
+ var ClassName = {
1708
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
1709
+ BACKDROP: 'modal-backdrop',
1710
+ OPEN: 'modal-open',
1711
+ FADE: 'fade',
1712
+ IN: 'in'
1713
+ };
1714
+
1715
+ var Selector = {
1716
+ DIALOG: '.modal-dialog',
1717
+ DATA_TOGGLE: '[data-toggle="modal"]',
1718
+ DATA_DISMISS: '[data-dismiss="modal"]',
1719
+ FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
1720
+ };
1721
+
1722
+ /**
1723
+ * ------------------------------------------------------------------------
1724
+ * Class Definition
1725
+ * ------------------------------------------------------------------------
1726
+ */
1727
+
1728
+ var Modal = (function () {
1729
+ function Modal(element, config) {
1730
+ _classCallCheck(this, Modal);
1731
+
1732
+ this._config = this._getConfig(config);
1733
+ this._element = element;
1734
+ this._dialog = $(element).find(Selector.DIALOG)[0];
1735
+ this._backdrop = null;
1736
+ this._isShown = false;
1737
+ this._isBodyOverflowing = false;
1738
+ this._ignoreBackdropClick = false;
1739
+ this._originalBodyPadding = 0;
1740
+ this._scrollbarWidth = 0;
1741
+ }
1742
+
1743
+ /**
1744
+ * ------------------------------------------------------------------------
1745
+ * Data Api implementation
1746
+ * ------------------------------------------------------------------------
1747
+ */
1748
+
1749
+ // getters
1750
+
1751
+ _createClass(Modal, [{
1752
+ key: 'toggle',
1753
+
1754
+ // public
1755
+
1756
+ value: function toggle(relatedTarget) {
1757
+ return this._isShown ? this.hide() : this.show(relatedTarget);
1758
+ }
1759
+ }, {
1760
+ key: 'show',
1761
+ value: function show(relatedTarget) {
1762
+ var _this7 = this;
1763
+
1764
+ var showEvent = $.Event(Event.SHOW, {
1765
+ relatedTarget: relatedTarget
1766
+ });
1767
+
1768
+ $(this._element).trigger(showEvent);
1769
+
1770
+ if (this._isShown || showEvent.isDefaultPrevented()) {
1771
+ return;
1772
+ }
1773
+
1774
+ this._isShown = true;
1775
+
1776
+ this._checkScrollbar();
1777
+ this._setScrollbar();
1778
+
1779
+ $(document.body).addClass(ClassName.OPEN);
1780
+
1781
+ this._setEscapeEvent();
1782
+ this._setResizeEvent();
1783
+
1784
+ $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
1785
+
1786
+ $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
1787
+ $(_this7._element).one(Event.MOUSEUP_DISMISS, function (event) {
1788
+ if ($(event.target).is(_this7._element)) {
1789
+ that._ignoreBackdropClick = true;
1790
+ }
1791
+ });
1792
+ });
1793
+
1794
+ this._showBackdrop($.proxy(this._showElement, this, relatedTarget));
1795
+ }
1796
+ }, {
1797
+ key: 'hide',
1798
+ value: function hide(event) {
1799
+ if (event) {
1800
+ event.preventDefault();
1801
+ }
1802
+
1803
+ var hideEvent = $.Event(Event.HIDE);
1804
+
1805
+ $(this._element).trigger(hideEvent);
1806
+
1807
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
1808
+ return;
1809
+ }
1810
+
1811
+ this._isShown = false;
1812
+
1813
+ this._setEscapeEvent();
1814
+ this._setResizeEvent();
1815
+
1816
+ $(document).off(Event.FOCUSIN);
1817
+
1818
+ $(this._element).removeClass(ClassName.IN);
1819
+
1820
+ $(this._element).off(Event.CLICK_DISMISS);
1821
+ $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
1822
+
1823
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
1824
+
1825
+ $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);
1826
+ } else {
1827
+ this._hideModal();
1828
+ }
1829
+ }
1830
+ }, {
1831
+ key: 'dispose',
1832
+ value: function dispose() {
1833
+ $.removeData(this._element, DATA_KEY);
1834
+
1835
+ $(window).off(EVENT_KEY);
1836
+ $(document).off(EVENT_KEY);
1837
+ $(this._element).off(EVENT_KEY);
1838
+ $(this._backdrop).off(EVENT_KEY);
1839
+
1840
+ this._config = null;
1841
+ this._element = null;
1842
+ this._dialog = null;
1843
+ this._backdrop = null;
1844
+ this._isShown = null;
1845
+ this._isBodyOverflowing = null;
1846
+ this._ignoreBackdropClick = null;
1847
+ this._originalBodyPadding = null;
1848
+ this._scrollbarWidth = null;
1849
+ }
1850
+
1851
+ // private
1852
+
1853
+ }, {
1854
+ key: '_getConfig',
1855
+ value: function _getConfig(config) {
1856
+ config = $.extend({}, Default, config);
1857
+ Util.typeCheckConfig(NAME, config, DefaultType);
1858
+ return config;
1859
+ }
1860
+ }, {
1861
+ key: '_showElement',
1862
+ value: function _showElement(relatedTarget) {
1863
+ var _this8 = this;
1864
+
1865
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
1866
+
1867
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
1868
+ // don't move modals dom position
1869
+ document.body.appendChild(this._element);
1870
+ }
1871
+
1872
+ this._element.style.display = 'block';
1873
+ this._element.scrollTop = 0;
1874
+
1875
+ if (transition) {
1876
+ Util.reflow(this._element);
1877
+ }
1878
+
1879
+ $(this._element).addClass(ClassName.IN);
1880
+
1881
+ if (this._config.focus) {
1882
+ this._enforceFocus();
1883
+ }
1884
+
1885
+ var shownEvent = $.Event(Event.SHOWN, {
1886
+ relatedTarget: relatedTarget
1887
+ });
1888
+
1889
+ var transitionComplete = function transitionComplete() {
1890
+ if (_this8._config.focus) {
1891
+ _this8._element.focus();
1892
+ }
1893
+ $(_this8._element).trigger(shownEvent);
1894
+ };
1895
+
1896
+ if (transition) {
1897
+ $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
1898
+ } else {
1899
+ transitionComplete();
1900
+ }
1901
+ }
1902
+ }, {
1903
+ key: '_enforceFocus',
1904
+ value: function _enforceFocus() {
1905
+ var _this9 = this;
1906
+
1907
+ $(document).off(Event.FOCUSIN) // guard against infinite focus loop
1908
+ .on(Event.FOCUSIN, function (event) {
1909
+ if (_this9._element !== event.target && !$(_this9._element).has(event.target).length) {
1910
+ _this9._element.focus();
1911
+ }
1912
+ });
1913
+ }
1914
+ }, {
1915
+ key: '_setEscapeEvent',
1916
+ value: function _setEscapeEvent() {
1917
+ var _this10 = this;
1918
+
1919
+ if (this._isShown && this._config.keyboard) {
1920
+ $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
1921
+ if (event.which === 27) {
1922
+ _this10.hide();
1923
+ }
1924
+ });
1925
+ } else if (!this._isShown) {
1926
+ $(this._element).off(Event.KEYDOWN_DISMISS);
1927
+ }
1928
+ }
1929
+ }, {
1930
+ key: '_setResizeEvent',
1931
+ value: function _setResizeEvent() {
1932
+ if (this._isShown) {
1933
+ $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));
1934
+ } else {
1935
+ $(window).off(Event.RESIZE);
1936
+ }
1937
+ }
1938
+ }, {
1939
+ key: '_hideModal',
1940
+ value: function _hideModal() {
1941
+ var _this11 = this;
1942
+
1943
+ this._element.style.display = 'none';
1944
+ this._showBackdrop(function () {
1945
+ $(document.body).removeClass(ClassName.OPEN);
1946
+ _this11._resetAdjustments();
1947
+ _this11._resetScrollbar();
1948
+ $(_this11._element).trigger(Event.HIDDEN);
1949
+ });
1950
+ }
1951
+ }, {
1952
+ key: '_removeBackdrop',
1953
+ value: function _removeBackdrop() {
1954
+ if (this._backdrop) {
1955
+ $(this._backdrop).remove();
1956
+ this._backdrop = null;
1957
+ }
1958
+ }
1959
+ }, {
1960
+ key: '_showBackdrop',
1961
+ value: function _showBackdrop(callback) {
1962
+ var _this12 = this;
1963
+
1964
+ var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
1965
+
1966
+ if (this._isShown && this._config.backdrop) {
1967
+ var doAnimate = Util.supportsTransitionEnd() && animate;
1968
+
1969
+ this._backdrop = document.createElement('div');
1970
+ this._backdrop.className = ClassName.BACKDROP;
1971
+
1972
+ if (animate) {
1973
+ $(this._backdrop).addClass(animate);
1974
+ }
1975
+
1976
+ $(this._backdrop).appendTo(document.body);
1977
+
1978
+ $(this._element).on(Event.CLICK_DISMISS, function (event) {
1979
+ if (_this12._ignoreBackdropClick) {
1980
+ _this12._ignoreBackdropClick = false;
1981
+ return;
1982
+ }
1983
+ if (event.target !== event.currentTarget) {
1984
+ return;
1985
+ }
1986
+ if (_this12._config.backdrop === 'static') {
1987
+ _this12._element.focus();
1988
+ } else {
1989
+ _this12.hide();
1990
+ }
1991
+ });
1992
+
1993
+ if (doAnimate) {
1994
+ Util.reflow(this._backdrop);
1995
+ }
1996
+
1997
+ $(this._backdrop).addClass(ClassName.IN);
1998
+
1999
+ if (!callback) {
2000
+ return;
2001
+ }
2002
+
2003
+ if (!doAnimate) {
2004
+ callback();
2005
+ return;
2006
+ }
2007
+
2008
+ $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
2009
+ } else if (!this._isShown && this._backdrop) {
2010
+ $(this._backdrop).removeClass(ClassName.IN);
2011
+
2012
+ var callbackRemove = function callbackRemove() {
2013
+ _this12._removeBackdrop();
2014
+ if (callback) {
2015
+ callback();
2016
+ }
2017
+ };
2018
+
2019
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
2020
+ $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
2021
+ } else {
2022
+ callbackRemove();
2023
+ }
2024
+ } else if (callback) {
2025
+ callback();
2026
+ }
2027
+ }
2028
+
2029
+ // ----------------------------------------------------------------------
2030
+ // the following methods are used to handle overflowing modals
2031
+ // todo (fat): these should probably be refactored out of modal.js
2032
+ // ----------------------------------------------------------------------
2033
+
2034
+ }, {
2035
+ key: '_handleUpdate',
2036
+ value: function _handleUpdate() {
2037
+ this._adjustDialog();
2038
+ }
2039
+ }, {
2040
+ key: '_adjustDialog',
2041
+ value: function _adjustDialog() {
2042
+ var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
2043
+
2044
+ if (!this._isBodyOverflowing && isModalOverflowing) {
2045
+ this._element.style.paddingLeft = this._scrollbarWidth + 'px';
2046
+ }
2047
+
2048
+ if (this._isBodyOverflowing && !isModalOverflowing) {
2049
+ this._element.style.paddingRight = this._scrollbarWidth + 'px~';
2050
+ }
2051
+ }
2052
+ }, {
2053
+ key: '_resetAdjustments',
2054
+ value: function _resetAdjustments() {
2055
+ this._element.style.paddingLeft = '';
2056
+ this._element.style.paddingRight = '';
2057
+ }
2058
+ }, {
2059
+ key: '_checkScrollbar',
2060
+ value: function _checkScrollbar() {
2061
+ var fullWindowWidth = window.innerWidth;
2062
+ if (!fullWindowWidth) {
2063
+ // workaround for missing window.innerWidth in IE8
2064
+ var documentElementRect = document.documentElement.getBoundingClientRect();
2065
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
2066
+ }
2067
+ this._isBodyOverflowing = document.body.clientWidth < fullWindowWidth;
2068
+ this._scrollbarWidth = this._getScrollbarWidth();
2069
+ }
2070
+ }, {
2071
+ key: '_setScrollbar',
2072
+ value: function _setScrollbar() {
2073
+ var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
2074
+
2075
+ this._originalBodyPadding = document.body.style.paddingRight || '';
2076
+
2077
+ if (this._isBodyOverflowing) {
2078
+ document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
2079
+ }
2080
+ }
2081
+ }, {
2082
+ key: '_resetScrollbar',
2083
+ value: function _resetScrollbar() {
2084
+ document.body.style.paddingRight = this._originalBodyPadding;
2085
+ }
2086
+ }, {
2087
+ key: '_getScrollbarWidth',
2088
+ value: function _getScrollbarWidth() {
2089
+ // thx d.walsh
2090
+ var scrollDiv = document.createElement('div');
2091
+ scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
2092
+ document.body.appendChild(scrollDiv);
2093
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
2094
+ document.body.removeChild(scrollDiv);
2095
+ return scrollbarWidth;
2096
+ }
2097
+
2098
+ // static
2099
+
2100
+ }], [{
2101
+ key: '_jQueryInterface',
2102
+ value: function _jQueryInterface(config, relatedTarget) {
2103
+ return this.each(function () {
2104
+ var data = $(this).data(DATA_KEY);
2105
+ var _config = $.extend({}, Modal.Default, $(this).data(), typeof config === 'object' && config);
2106
+
2107
+ if (!data) {
2108
+ data = new Modal(this, _config);
2109
+ $(this).data(DATA_KEY, data);
2110
+ }
2111
+
2112
+ if (typeof config === 'string') {
2113
+ if (data[config] === undefined) {
2114
+ throw new Error('No method named "' + config + '"');
2115
+ }
2116
+ data[config](relatedTarget);
2117
+ } else if (_config.show) {
2118
+ data.show(relatedTarget);
2119
+ }
2120
+ });
2121
+ }
2122
+ }, {
2123
+ key: 'VERSION',
2124
+ get: function get() {
2125
+ return VERSION;
2126
+ }
2127
+ }, {
2128
+ key: 'Default',
2129
+ get: function get() {
2130
+ return Default;
2131
+ }
2132
+ }]);
2133
+
2134
+ return Modal;
2135
+ })();
2136
+
2137
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
2138
+ var _this13 = this;
2139
+
2140
+ var target = undefined;
2141
+ var selector = Util.getSelectorFromElement(this);
2142
+
2143
+ if (selector) {
2144
+ target = $(selector)[0];
2145
+ }
2146
+
2147
+ var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
2148
+
2149
+ if (this.tagName === 'A') {
2150
+ event.preventDefault();
2151
+ }
2152
+
2153
+ var $target = $(target).one(Event.SHOW, function (showEvent) {
2154
+ if (showEvent.isDefaultPrevented()) {
2155
+ // only register focus restorer if modal will actually get shown
2156
+ return;
2157
+ }
2158
+
2159
+ $target.one(Event.HIDDEN, function () {
2160
+ if ($(_this13).is(':visible')) {
2161
+ _this13.focus();
2162
+ }
2163
+ });
2164
+ });
2165
+
2166
+ Modal._jQueryInterface.call($(target), config, this);
2167
+ });
2168
+
2169
+ /**
2170
+ * ------------------------------------------------------------------------
2171
+ * jQuery
2172
+ * ------------------------------------------------------------------------
2173
+ */
2174
+
2175
+ $.fn[NAME] = Modal._jQueryInterface;
2176
+ $.fn[NAME].Constructor = Modal;
2177
+ $.fn[NAME].noConflict = function () {
2178
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
2179
+ return Modal._jQueryInterface;
2180
+ };
2181
+
2182
+ return Modal;
2183
+ })(jQuery);
2184
+
2185
+ /**
2186
+ * --------------------------------------------------------------------------
2187
+ * Bootstrap (v4.0.0): scrollspy.js
2188
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2189
+ * --------------------------------------------------------------------------
2190
+ */
2191
+
2192
+ var ScrollSpy = (function ($) {
2193
+
2194
+ /**
2195
+ * ------------------------------------------------------------------------
2196
+ * Constants
2197
+ * ------------------------------------------------------------------------
2198
+ */
2199
+
2200
+ var NAME = 'scrollspy';
2201
+ var VERSION = '4.0.0';
2202
+ var DATA_KEY = 'bs.scrollspy';
2203
+ var EVENT_KEY = '.' + DATA_KEY;
2204
+ var DATA_API_KEY = '.data-api';
2205
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
2206
+
2207
+ var Default = {
2208
+ offset: 10,
2209
+ method: 'auto',
2210
+ target: ''
2211
+ };
2212
+
2213
+ var DefaultType = {
2214
+ offset: 'number',
2215
+ method: 'string',
2216
+ target: '(string|element)'
2217
+ };
2218
+
2219
+ var Event = {
2220
+ ACTIVATE: 'activate' + EVENT_KEY,
2221
+ SCROLL: 'scroll' + EVENT_KEY,
2222
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
2223
+ };
2224
+
2225
+ var ClassName = {
2226
+ DROPDOWN_ITEM: 'dropdown-item',
2227
+ DROPDOWN_MENU: 'dropdown-menu',
2228
+ NAV_LINK: 'nav-link',
2229
+ NAV: 'nav',
2230
+ ACTIVE: 'active'
2231
+ };
2232
+
2233
+ var Selector = {
2234
+ DATA_SPY: '[data-spy="scroll"]',
2235
+ ACTIVE: '.active',
2236
+ LIST_ITEM: '.list-item',
2237
+ LI: 'li',
2238
+ LI_DROPDOWN: 'li.dropdown',
2239
+ NAV_LINKS: '.nav-link',
2240
+ DROPDOWN: '.dropdown',
2241
+ DROPDOWN_ITEMS: '.dropdown-item',
2242
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
2243
+ };
2244
+
2245
+ var OffsetMethod = {
2246
+ OFFSET: 'offset',
2247
+ POSITION: 'position'
2248
+ };
2249
+
2250
+ /**
2251
+ * ------------------------------------------------------------------------
2252
+ * Class Definition
2253
+ * ------------------------------------------------------------------------
2254
+ */
2255
+
2256
+ var ScrollSpy = (function () {
2257
+ function ScrollSpy(element, config) {
2258
+ _classCallCheck(this, ScrollSpy);
2259
+
2260
+ this._element = element;
2261
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
2262
+ this._config = this._getConfig(config);
2263
+ this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
2264
+ this._offsets = [];
2265
+ this._targets = [];
2266
+ this._activeTarget = null;
2267
+ this._scrollHeight = 0;
2268
+
2269
+ $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));
2270
+
2271
+ this.refresh();
2272
+ this._process();
2273
+ }
2274
+
2275
+ /**
2276
+ * ------------------------------------------------------------------------
2277
+ * Data Api implementation
2278
+ * ------------------------------------------------------------------------
2279
+ */
2280
+
2281
+ // getters
2282
+
2283
+ _createClass(ScrollSpy, [{
2284
+ key: 'refresh',
2285
+
2286
+ // public
2287
+
2288
+ value: function refresh() {
2289
+ var _this14 = this;
2290
+
2291
+ var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
2292
+
2293
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
2294
+
2295
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
2296
+
2297
+ this._offsets = [];
2298
+ this._targets = [];
2299
+
2300
+ this._scrollHeight = this._getScrollHeight();
2301
+
2302
+ var targets = $.makeArray($(this._selector));
2303
+
2304
+ targets.map(function (element) {
2305
+ var target = undefined;
2306
+ var targetSelector = Util.getSelectorFromElement(element);
2307
+
2308
+ if (targetSelector) {
2309
+ target = $(targetSelector)[0];
2310
+ }
2311
+
2312
+ if (target && (target.offsetWidth || target.offsetHeight)) {
2313
+ // todo (fat): remove sketch reliance on jQuery position/offset
2314
+ return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
2315
+ }
2316
+ }).filter(function (item) {
2317
+ return item;
2318
+ }).sort(function (a, b) {
2319
+ return a[0] - b[0];
2320
+ }).forEach(function (item) {
2321
+ _this14._offsets.push(item[0]);
2322
+ _this14._targets.push(item[1]);
2323
+ });
2324
+ }
2325
+ }, {
2326
+ key: 'dispose',
2327
+ value: function dispose() {
2328
+ $.removeData(this._element, DATA_KEY);
2329
+ $(this._scrollElement).off(EVENT_KEY);
2330
+
2331
+ this._element = null;
2332
+ this._scrollElement = null;
2333
+ this._config = null;
2334
+ this._selector = null;
2335
+ this._offsets = null;
2336
+ this._targets = null;
2337
+ this._activeTarget = null;
2338
+ this._scrollHeight = null;
2339
+ }
2340
+
2341
+ // private
2342
+
2343
+ }, {
2344
+ key: '_getConfig',
2345
+ value: function _getConfig(config) {
2346
+ config = $.extend({}, Default, config);
2347
+
2348
+ if (typeof config.target !== 'string') {
2349
+ var id = $(config.target).attr('id');
2350
+ if (!id) {
2351
+ id = Util.getUID(NAME);
2352
+ $(config.target).attr('id', id);
2353
+ }
2354
+ config.target = '#' + id;
2355
+ }
2356
+
2357
+ Util.typeCheckConfig(NAME, config, DefaultType);
2358
+
2359
+ return config;
2360
+ }
2361
+ }, {
2362
+ key: '_getScrollTop',
2363
+ value: function _getScrollTop() {
2364
+ return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;
2365
+ }
2366
+ }, {
2367
+ key: '_getScrollHeight',
2368
+ value: function _getScrollHeight() {
2369
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
2370
+ }
2371
+ }, {
2372
+ key: '_process',
2373
+ value: function _process() {
2374
+ var scrollTop = this._getScrollTop() + this._config.offset;
2375
+ var scrollHeight = this._getScrollHeight();
2376
+ var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;
2377
+
2378
+ if (this._scrollHeight !== scrollHeight) {
2379
+ this.refresh();
2380
+ }
2381
+
2382
+ if (scrollTop >= maxScroll) {
2383
+ var target = this._targets[this._targets.length - 1];
2384
+
2385
+ if (this._activeTarget !== target) {
2386
+ this._activate(target);
2387
+ }
2388
+ }
2389
+
2390
+ if (this._activeTarget && scrollTop < this._offsets[0]) {
2391
+ this._activeTarget = null;
2392
+ this._clear();
2393
+ return;
2394
+ }
2395
+
2396
+ for (var i = this._offsets.length; i--;) {
2397
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
2398
+
2399
+ if (isActiveTarget) {
2400
+ this._activate(this._targets[i]);
2401
+ }
2402
+ }
2403
+ }
2404
+ }, {
2405
+ key: '_activate',
2406
+ value: function _activate(target) {
2407
+ this._activeTarget = target;
2408
+
2409
+ this._clear();
2410
+
2411
+ var queries = this._selector.split(',');
2412
+ queries = queries.map(function (selector) {
2413
+ return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
2414
+ });
2415
+
2416
+ var $link = $(queries.join(','));
2417
+
2418
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
2419
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
2420
+ $link.addClass(ClassName.ACTIVE);
2421
+ } else {
2422
+ // todo (fat) this is kinda sus…
2423
+ // recursively add actives to tested nav-links
2424
+ $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
2425
+ }
2426
+
2427
+ $(this._scrollElement).trigger(Event.ACTIVATE, {
2428
+ relatedTarget: target
2429
+ });
2430
+ }
2431
+ }, {
2432
+ key: '_clear',
2433
+ value: function _clear() {
2434
+ $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
2435
+ }
2436
+
2437
+ // static
2438
+
2439
+ }], [{
2440
+ key: '_jQueryInterface',
2441
+ value: function _jQueryInterface(config) {
2442
+ return this.each(function () {
2443
+ var data = $(this).data(DATA_KEY);
2444
+ var _config = typeof config === 'object' && config || null;
2445
+
2446
+ if (!data) {
2447
+ data = new ScrollSpy(this, _config);
2448
+ $(this).data(DATA_KEY, data);
2449
+ }
2450
+
2451
+ if (typeof config === 'string') {
2452
+ if (data[config] === undefined) {
2453
+ throw new Error('No method named "' + config + '"');
2454
+ }
2455
+ data[config]();
2456
+ }
2457
+ });
2458
+ }
2459
+ }, {
2460
+ key: 'VERSION',
2461
+ get: function get() {
2462
+ return VERSION;
2463
+ }
2464
+ }, {
2465
+ key: 'Default',
2466
+ get: function get() {
2467
+ return Default;
2468
+ }
2469
+ }]);
2470
+
2471
+ return ScrollSpy;
2472
+ })();
2473
+
2474
+ $(window).on(Event.LOAD_DATA_API, function () {
2475
+ var scrollSpys = $.makeArray($(Selector.DATA_SPY));
2476
+
2477
+ for (var i = scrollSpys.length; i--;) {
2478
+ var $spy = $(scrollSpys[i]);
2479
+ ScrollSpy._jQueryInterface.call($spy, $spy.data());
2480
+ }
2481
+ });
2482
+
2483
+ /**
2484
+ * ------------------------------------------------------------------------
2485
+ * jQuery
2486
+ * ------------------------------------------------------------------------
2487
+ */
2488
+
2489
+ $.fn[NAME] = ScrollSpy._jQueryInterface;
2490
+ $.fn[NAME].Constructor = ScrollSpy;
2491
+ $.fn[NAME].noConflict = function () {
2492
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
2493
+ return ScrollSpy._jQueryInterface;
2494
+ };
2495
+
2496
+ return ScrollSpy;
2497
+ })(jQuery);
2498
+
2499
+ /**
2500
+ * --------------------------------------------------------------------------
2501
+ * Bootstrap (v4.0.0): tab.js
2502
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2503
+ * --------------------------------------------------------------------------
2504
+ */
2505
+
2506
+ var Tab = (function ($) {
2507
+
2508
+ /**
2509
+ * ------------------------------------------------------------------------
2510
+ * Constants
2511
+ * ------------------------------------------------------------------------
2512
+ */
2513
+
2514
+ var NAME = 'tab';
2515
+ var VERSION = '4.0.0';
2516
+ var DATA_KEY = 'bs.tab';
2517
+ var EVENT_KEY = '.' + DATA_KEY;
2518
+ var DATA_API_KEY = '.data-api';
2519
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
2520
+ var TRANSITION_DURATION = 150;
2521
+
2522
+ var Event = {
2523
+ HIDE: 'hide' + EVENT_KEY,
2524
+ HIDDEN: 'hidden' + EVENT_KEY,
2525
+ SHOW: 'show' + EVENT_KEY,
2526
+ SHOWN: 'shown' + EVENT_KEY,
2527
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
2528
+ };
2529
+
2530
+ var ClassName = {
2531
+ DROPDOWN_MENU: 'dropdown-menu',
2532
+ ACTIVE: 'active',
2533
+ FADE: 'fade',
2534
+ IN: 'in'
2535
+ };
2536
+
2537
+ var Selector = {
2538
+ A: 'a',
2539
+ LI: 'li',
2540
+ DROPDOWN: '.dropdown',
2541
+ UL: 'ul:not(.dropdown-menu)',
2542
+ FADE_CHILD: '> .nav-item .fade, > .fade',
2543
+ ACTIVE: '.active',
2544
+ ACTIVE_CHILD: '> .nav-item > .active, > .active',
2545
+ DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"]',
2546
+ DROPDOWN_TOGGLE: '.dropdown-toggle',
2547
+ DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
2548
+ };
2549
+
2550
+ /**
2551
+ * ------------------------------------------------------------------------
2552
+ * Class Definition
2553
+ * ------------------------------------------------------------------------
2554
+ */
2555
+
2556
+ var Tab = (function () {
2557
+ function Tab(element) {
2558
+ _classCallCheck(this, Tab);
2559
+
2560
+ this._element = element;
2561
+ }
2562
+
2563
+ /**
2564
+ * ------------------------------------------------------------------------
2565
+ * Data Api implementation
2566
+ * ------------------------------------------------------------------------
2567
+ */
2568
+
2569
+ // getters
2570
+
2571
+ _createClass(Tab, [{
2572
+ key: 'show',
2573
+
2574
+ // public
2575
+
2576
+ value: function show() {
2577
+ var _this15 = this;
2578
+
2579
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {
2580
+ return;
2581
+ }
2582
+
2583
+ var target = undefined;
2584
+ var previous = undefined;
2585
+ var ulElement = $(this._element).closest(Selector.UL)[0];
2586
+ var selector = Util.getSelectorFromElement(this._element);
2587
+
2588
+ if (ulElement) {
2589
+ previous = $.makeArray($(ulElement).find(Selector.ACTIVE));
2590
+ previous = previous[previous.length - 1];
2591
+ }
2592
+
2593
+ var hideEvent = $.Event(Event.HIDE, {
2594
+ relatedTarget: this._element
2595
+ });
2596
+
2597
+ var showEvent = $.Event(Event.SHOW, {
2598
+ relatedTarget: previous
2599
+ });
2600
+
2601
+ if (previous) {
2602
+ $(previous).trigger(hideEvent);
2603
+ }
2604
+
2605
+ $(this._element).trigger(showEvent);
2606
+
2607
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
2608
+ return;
2609
+ }
2610
+
2611
+ if (selector) {
2612
+ target = $(selector)[0];
2613
+ }
2614
+
2615
+ this._activate(this._element, ulElement);
2616
+
2617
+ var complete = function complete() {
2618
+ var hiddenEvent = $.Event(Event.HIDDEN, {
2619
+ relatedTarget: _this15._element
2620
+ });
2621
+
2622
+ var shownEvent = $.Event(Event.SHOWN, {
2623
+ relatedTarget: previous
2624
+ });
2625
+
2626
+ $(previous).trigger(hiddenEvent);
2627
+ $(_this15._element).trigger(shownEvent);
2628
+ };
2629
+
2630
+ if (target) {
2631
+ this._activate(target, target.parentNode, complete);
2632
+ } else {
2633
+ complete();
2634
+ }
2635
+ }
2636
+ }, {
2637
+ key: 'dispose',
2638
+ value: function dispose() {
2639
+ $.removeClass(this._element, DATA_KEY);
2640
+ this._element = null;
2641
+ }
2642
+
2643
+ // private
2644
+
2645
+ }, {
2646
+ key: '_activate',
2647
+ value: function _activate(element, container, callback) {
2648
+ var active = $(container).find(Selector.ACTIVE_CHILD)[0];
2649
+ var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
2650
+
2651
+ var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);
2652
+
2653
+ if (active && isTransitioning) {
2654
+ $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
2655
+ } else {
2656
+ complete();
2657
+ }
2658
+
2659
+ if (active) {
2660
+ $(active).removeClass(ClassName.IN);
2661
+ }
2662
+ }
2663
+ }, {
2664
+ key: '_transitionComplete',
2665
+ value: function _transitionComplete(element, active, isTransitioning, callback) {
2666
+ if (active) {
2667
+ $(active).removeClass(ClassName.ACTIVE);
2668
+
2669
+ var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
2670
+
2671
+ if (dropdownChild) {
2672
+ $(dropdownChild).removeClass(ClassName.ACTIVE);
2673
+ }
2674
+
2675
+ active.setAttribute('aria-expanded', false);
2676
+ }
2677
+
2678
+ $(element).addClass(ClassName.ACTIVE);
2679
+ element.setAttribute('aria-expanded', true);
2680
+
2681
+ if (isTransitioning) {
2682
+ Util.reflow(element);
2683
+ $(element).addClass(ClassName.IN);
2684
+ } else {
2685
+ $(element).removeClass(ClassName.FADE);
2686
+ }
2687
+
2688
+ if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
2689
+
2690
+ var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
2691
+ if (dropdownElement) {
2692
+ $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
2693
+ }
2694
+
2695
+ element.setAttribute('aria-expanded', true);
2696
+ }
2697
+
2698
+ if (callback) {
2699
+ callback();
2700
+ }
2701
+ }
2702
+
2703
+ // static
2704
+
2705
+ }], [{
2706
+ key: '_jQueryInterface',
2707
+ value: function _jQueryInterface(config) {
2708
+ return this.each(function () {
2709
+ var $this = $(this);
2710
+ var data = $this.data(DATA_KEY);
2711
+
2712
+ if (!data) {
2713
+ data = data = new Tab(this);
2714
+ $this.data(DATA_KEY, data);
2715
+ }
2716
+
2717
+ if (typeof config === 'string') {
2718
+ if (data[config] === undefined) {
2719
+ throw new Error('No method named "' + config + '"');
2720
+ }
2721
+ data[config]();
2722
+ }
2723
+ });
2724
+ }
2725
+ }, {
2726
+ key: 'VERSION',
2727
+ get: function get() {
2728
+ return VERSION;
2729
+ }
2730
+ }]);
2731
+
2732
+ return Tab;
2733
+ })();
2734
+
2735
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
2736
+ event.preventDefault();
2737
+ Tab._jQueryInterface.call($(this), 'show');
2738
+ });
2739
+
2740
+ /**
2741
+ * ------------------------------------------------------------------------
2742
+ * jQuery
2743
+ * ------------------------------------------------------------------------
2744
+ */
2745
+
2746
+ $.fn[NAME] = Tab._jQueryInterface;
2747
+ $.fn[NAME].Constructor = Tab;
2748
+ $.fn[NAME].noConflict = function () {
2749
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
2750
+ return Tab._jQueryInterface;
2751
+ };
2752
+
2753
+ return Tab;
2754
+ })(jQuery);
2755
+
2756
+ /**
2757
+ * --------------------------------------------------------------------------
2758
+ * Bootstrap (v4.0.0): tooltip.js
2759
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2760
+ * --------------------------------------------------------------------------
2761
+ */
2762
+
2763
+ var Tooltip = (function ($) {
2764
+
2765
+ /**
2766
+ * ------------------------------------------------------------------------
2767
+ * Constants
2768
+ * ------------------------------------------------------------------------
2769
+ */
2770
+
2771
+ var NAME = 'tooltip';
2772
+ var VERSION = '4.0.0';
2773
+ var DATA_KEY = 'bs.tooltip';
2774
+ var EVENT_KEY = '.' + DATA_KEY;
2775
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
2776
+ var TRANSITION_DURATION = 150;
2777
+ var CLASS_PREFIX = 'bs-tether';
2778
+
2779
+ var Default = {
2780
+ animation: true,
2781
+ template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>',
2782
+ trigger: 'hover focus',
2783
+ title: '',
2784
+ delay: 0,
2785
+ html: false,
2786
+ selector: false,
2787
+ placement: 'top',
2788
+ offset: '0 0',
2789
+ constraints: []
2790
+ };
2791
+
2792
+ var DefaultType = {
2793
+ animation: 'boolean',
2794
+ template: 'string',
2795
+ title: '(string|element|function)',
2796
+ trigger: 'string',
2797
+ delay: '(number|object)',
2798
+ html: 'boolean',
2799
+ selector: '(string|boolean)',
2800
+ placement: '(string|function)',
2801
+ offset: 'string',
2802
+ constraints: 'array'
2803
+ };
2804
+
2805
+ var AttachmentMap = {
2806
+ TOP: 'bottom center',
2807
+ RIGHT: 'middle left',
2808
+ BOTTOM: 'top center',
2809
+ LEFT: 'middle right'
2810
+ };
2811
+
2812
+ var HoverState = {
2813
+ IN: 'in',
2814
+ OUT: 'out'
2815
+ };
2816
+
2817
+ var Event = {
2818
+ HIDE: 'hide' + EVENT_KEY,
2819
+ HIDDEN: 'hidden' + EVENT_KEY,
2820
+ SHOW: 'show' + EVENT_KEY,
2821
+ SHOWN: 'shown' + EVENT_KEY,
2822
+ INSERTED: 'inserted' + EVENT_KEY,
2823
+ CLICK: 'click' + EVENT_KEY,
2824
+ FOCUSIN: 'focusin' + EVENT_KEY,
2825
+ FOCUSOUT: 'focusout' + EVENT_KEY,
2826
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
2827
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
2828
+ };
2829
+
2830
+ var ClassName = {
2831
+ FADE: 'fade',
2832
+ IN: 'in'
2833
+ };
2834
+
2835
+ var Selector = {
2836
+ TOOLTIP: '.tooltip',
2837
+ TOOLTIP_INNER: '.tooltip-inner'
2838
+ };
2839
+
2840
+ var TetherClass = {
2841
+ element: false,
2842
+ enabled: false
2843
+ };
2844
+
2845
+ var Trigger = {
2846
+ HOVER: 'hover',
2847
+ FOCUS: 'focus',
2848
+ CLICK: 'click',
2849
+ MANUAL: 'manual'
2850
+ };
2851
+
2852
+ /**
2853
+ * ------------------------------------------------------------------------
2854
+ * Class Definition
2855
+ * ------------------------------------------------------------------------
2856
+ */
2857
+
2858
+ var Tooltip = (function () {
2859
+ function Tooltip(element, config) {
2860
+ _classCallCheck(this, Tooltip);
2861
+
2862
+ // private
2863
+ this._isEnabled = true;
2864
+ this._timeout = 0;
2865
+ this._hoverState = '';
2866
+ this._activeTrigger = {};
2867
+ this._tether = null;
2868
+
2869
+ // protected
2870
+ this.element = element;
2871
+ this.config = this._getConfig(config);
2872
+ this.tip = null;
2873
+
2874
+ this._setListeners();
2875
+ }
2876
+
2877
+ /**
2878
+ * ------------------------------------------------------------------------
2879
+ * jQuery
2880
+ * ------------------------------------------------------------------------
2881
+ */
2882
+
2883
+ // getters
2884
+
2885
+ _createClass(Tooltip, [{
2886
+ key: 'enable',
2887
+
2888
+ // public
2889
+
2890
+ value: function enable() {
2891
+ this._isEnabled = true;
2892
+ }
2893
+ }, {
2894
+ key: 'disable',
2895
+ value: function disable() {
2896
+ this._isEnabled = false;
2897
+ }
2898
+ }, {
2899
+ key: 'toggleEnabled',
2900
+ value: function toggleEnabled() {
2901
+ this._isEnabled = !this._isEnabled;
2902
+ }
2903
+ }, {
2904
+ key: 'toggle',
2905
+ value: function toggle(event) {
2906
+ if (event) {
2907
+ var dataKey = this.constructor.DATA_KEY;
2908
+ var context = $(event.currentTarget).data(dataKey);
2909
+
2910
+ if (!context) {
2911
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
2912
+ $(event.currentTarget).data(dataKey, context);
2913
+ }
2914
+
2915
+ context._activeTrigger.click = !context._activeTrigger.click;
2916
+
2917
+ if (context._isWithActiveTrigger()) {
2918
+ context._enter(null, context);
2919
+ } else {
2920
+ context._leave(null, context);
2921
+ }
2922
+ } else {
2923
+
2924
+ if ($(this.getTipElement()).hasClass(ClassName.IN)) {
2925
+ this._leave(null, this);
2926
+ return;
2927
+ }
2928
+
2929
+ this._enter(null, this);
2930
+ }
2931
+ }
2932
+ }, {
2933
+ key: 'dispose',
2934
+ value: function dispose() {
2935
+ clearTimeout(this._timeout);
2936
+
2937
+ this.cleanupTether();
2938
+
2939
+ $.removeData(this.element, this.constructor.DATA_KEY);
2940
+
2941
+ $(this.element).off(this.constructor.EVENT_KEY);
2942
+
2943
+ if (this.tip) {
2944
+ $(this.tip).remove();
2945
+ }
2946
+
2947
+ this._isEnabled = null;
2948
+ this._timeout = null;
2949
+ this._hoverState = null;
2950
+ this._activeTrigger = null;
2951
+ this._tether = null;
2952
+
2953
+ this.element = null;
2954
+ this.config = null;
2955
+ this.tip = null;
2956
+ }
2957
+ }, {
2958
+ key: 'show',
2959
+ value: function show() {
2960
+ var _this16 = this;
2961
+
2962
+ var showEvent = $.Event(this.constructor.Event.SHOW);
2963
+
2964
+ if (this.isWithContent() && this._isEnabled) {
2965
+ $(this.element).trigger(showEvent);
2966
+
2967
+ var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
2968
+
2969
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
2970
+ return;
2971
+ }
2972
+
2973
+ var tip = this.getTipElement();
2974
+ var tipId = Util.getUID(this.constructor.NAME);
2975
+
2976
+ tip.setAttribute('id', tipId);
2977
+ this.element.setAttribute('aria-describedby', tipId);
2978
+
2979
+ this.setContent();
2980
+
2981
+ if (this.config.animation) {
2982
+ $(tip).addClass(ClassName.FADE);
2983
+ }
2984
+
2985
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
2986
+
2987
+ var attachment = this._getAttachment(placement);
2988
+
2989
+ $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);
2990
+
2991
+ $(this.element).trigger(this.constructor.Event.INSERTED);
2992
+
2993
+ this._tether = new Tether({
2994
+ attachment: attachment,
2995
+ element: tip,
2996
+ target: this.element,
2997
+ classes: TetherClass,
2998
+ classPrefix: CLASS_PREFIX,
2999
+ offset: this.config.offset,
3000
+ constraints: this.config.constraints
3001
+ });
3002
+
3003
+ Util.reflow(tip);
3004
+ this._tether.position();
3005
+
3006
+ $(tip).addClass(ClassName.IN);
3007
+
3008
+ var complete = function complete() {
3009
+ var prevHoverState = _this16._hoverState;
3010
+ _this16._hoverState = null;
3011
+
3012
+ $(_this16.element).trigger(_this16.constructor.Event.SHOWN);
3013
+
3014
+ if (prevHoverState === HoverState.OUT) {
3015
+ _this16._leave(null, _this16);
3016
+ }
3017
+ };
3018
+
3019
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
3020
+ $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
3021
+ return;
3022
+ }
3023
+
3024
+ complete();
3025
+ }
3026
+ }
3027
+ }, {
3028
+ key: 'hide',
3029
+ value: function hide(callback) {
3030
+ var _this17 = this;
3031
+
3032
+ var tip = this.getTipElement();
3033
+ var hideEvent = $.Event(this.constructor.Event.HIDE);
3034
+ var complete = function complete() {
3035
+ if (_this17._hoverState !== HoverState.IN && tip.parentNode) {
3036
+ tip.parentNode.removeChild(tip);
3037
+ }
3038
+
3039
+ _this17.element.removeAttribute('aria-describedby');
3040
+ $(_this17.element).trigger(_this17.constructor.Event.HIDDEN);
3041
+ _this17.cleanupTether();
3042
+
3043
+ if (callback) {
3044
+ callback();
3045
+ }
3046
+ };
3047
+
3048
+ $(this.element).trigger(hideEvent);
3049
+
3050
+ if (hideEvent.isDefaultPrevented()) {
3051
+ return;
3052
+ }
3053
+
3054
+ $(tip).removeClass(ClassName.IN);
3055
+
3056
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
3057
+
3058
+ $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
3059
+ } else {
3060
+ complete();
3061
+ }
3062
+
3063
+ this._hoverState = '';
3064
+ }
3065
+
3066
+ // protected
3067
+
3068
+ }, {
3069
+ key: 'isWithContent',
3070
+ value: function isWithContent() {
3071
+ return Boolean(this.getTitle());
3072
+ }
3073
+ }, {
3074
+ key: 'getTipElement',
3075
+ value: function getTipElement() {
3076
+ return this.tip = this.tip || $(this.config.template)[0];
3077
+ }
3078
+ }, {
3079
+ key: 'setContent',
3080
+ value: function setContent() {
3081
+ var $tip = $(this.getTipElement());
3082
+
3083
+ this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
3084
+
3085
+ $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
3086
+
3087
+ this.cleanupTether();
3088
+ }
3089
+ }, {
3090
+ key: 'setElementContent',
3091
+ value: function setElementContent($element, content) {
3092
+ var html = this.config.html;
3093
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
3094
+ // content is a DOM node or a jQuery
3095
+ if (html) {
3096
+ if (!$(content).parent().is($element)) {
3097
+ $element.empty().append(content);
3098
+ }
3099
+ } else {
3100
+ $element.text($(content).text());
3101
+ }
3102
+ } else {
3103
+ $element[html ? 'html' : 'text'](content);
3104
+ }
3105
+ }
3106
+ }, {
3107
+ key: 'getTitle',
3108
+ value: function getTitle() {
3109
+ var title = this.element.getAttribute('data-original-title');
3110
+
3111
+ if (!title) {
3112
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
3113
+ }
3114
+
3115
+ return title;
3116
+ }
3117
+ }, {
3118
+ key: 'cleanupTether',
3119
+ value: function cleanupTether() {
3120
+ if (this._tether) {
3121
+ this._tether.destroy();
3122
+
3123
+ // clean up after tether's junk classes
3124
+ // remove after they fix issue
3125
+ // (https://github.com/HubSpot/tether/issues/36)
3126
+ $(this.element).removeClass(this._removeTetherClasses);
3127
+ $(this.tip).removeClass(this._removeTetherClasses);
3128
+ }
3129
+ }
3130
+
3131
+ // private
3132
+
3133
+ }, {
3134
+ key: '_getAttachment',
3135
+ value: function _getAttachment(placement) {
3136
+ return AttachmentMap[placement.toUpperCase()];
3137
+ }
3138
+ }, {
3139
+ key: '_setListeners',
3140
+ value: function _setListeners() {
3141
+ var _this18 = this;
3142
+
3143
+ var triggers = this.config.trigger.split(' ');
3144
+
3145
+ triggers.forEach(function (trigger) {
3146
+ if (trigger === 'click') {
3147
+ $(_this18.element).on(_this18.constructor.Event.CLICK, _this18.config.selector, $.proxy(_this18.toggle, _this18));
3148
+ } else if (trigger !== Trigger.MANUAL) {
3149
+ var eventIn = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSEENTER : _this18.constructor.Event.FOCUSIN;
3150
+ var eventOut = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSELEAVE : _this18.constructor.Event.FOCUSOUT;
3151
+
3152
+ $(_this18.element).on(eventIn, _this18.config.selector, $.proxy(_this18._enter, _this18)).on(eventOut, _this18.config.selector, $.proxy(_this18._leave, _this18));
3153
+ }
3154
+ });
3155
+
3156
+ if (this.config.selector) {
3157
+ this.config = $.extend({}, this.config, {
3158
+ trigger: 'manual',
3159
+ selector: ''
3160
+ });
3161
+ } else {
3162
+ this._fixTitle();
3163
+ }
3164
+ }
3165
+ }, {
3166
+ key: '_removeTetherClasses',
3167
+ value: function _removeTetherClasses(i, css) {
3168
+ return ((css.baseVal || css).match(new RegExp('(^|\\s)' + CLASS_PREFIX + '-\\S+', 'g')) || []).join(' ');
3169
+ }
3170
+ }, {
3171
+ key: '_fixTitle',
3172
+ value: function _fixTitle() {
3173
+ var titleType = typeof this.element.getAttribute('data-original-title');
3174
+ if (this.element.getAttribute('title') || titleType !== 'string') {
3175
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
3176
+ this.element.setAttribute('title', '');
3177
+ }
3178
+ }
3179
+ }, {
3180
+ key: '_enter',
3181
+ value: function _enter(event, context) {
3182
+ var dataKey = this.constructor.DATA_KEY;
3183
+
3184
+ context = context || $(event.currentTarget).data(dataKey);
3185
+
3186
+ if (!context) {
3187
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
3188
+ $(event.currentTarget).data(dataKey, context);
3189
+ }
3190
+
3191
+ if (event) {
3192
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
3193
+ }
3194
+
3195
+ if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {
3196
+ context._hoverState = HoverState.IN;
3197
+ return;
3198
+ }
3199
+
3200
+ clearTimeout(context._timeout);
3201
+
3202
+ context._hoverState = HoverState.IN;
3203
+
3204
+ if (!context.config.delay || !context.config.delay.show) {
3205
+ context.show();
3206
+ return;
3207
+ }
3208
+
3209
+ context._timeout = setTimeout(function () {
3210
+ if (context._hoverState === HoverState.IN) {
3211
+ context.show();
3212
+ }
3213
+ }, context.config.delay.show);
3214
+ }
3215
+ }, {
3216
+ key: '_leave',
3217
+ value: function _leave(event, context) {
3218
+ var dataKey = this.constructor.DATA_KEY;
3219
+
3220
+ context = context || $(event.currentTarget).data(dataKey);
3221
+
3222
+ if (!context) {
3223
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
3224
+ $(event.currentTarget).data(dataKey, context);
3225
+ }
3226
+
3227
+ if (event) {
3228
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
3229
+ }
3230
+
3231
+ if (context._isWithActiveTrigger()) {
3232
+ return;
3233
+ }
3234
+
3235
+ clearTimeout(context._timeout);
3236
+
3237
+ context._hoverState = HoverState.OUT;
3238
+
3239
+ if (!context.config.delay || !context.config.delay.hide) {
3240
+ context.hide();
3241
+ return;
3242
+ }
3243
+
3244
+ context._timeout = setTimeout(function () {
3245
+ if (context._hoverState === HoverState.OUT) {
3246
+ context.hide();
3247
+ }
3248
+ }, context.config.delay.hide);
3249
+ }
3250
+ }, {
3251
+ key: '_isWithActiveTrigger',
3252
+ value: function _isWithActiveTrigger() {
3253
+ for (var trigger in this._activeTrigger) {
3254
+ if (this._activeTrigger[trigger]) {
3255
+ return true;
3256
+ }
3257
+ }
3258
+
3259
+ return false;
3260
+ }
3261
+ }, {
3262
+ key: '_getConfig',
3263
+ value: function _getConfig(config) {
3264
+ config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
3265
+
3266
+ if (config.delay && typeof config.delay === 'number') {
3267
+ config.delay = {
3268
+ show: config.delay,
3269
+ hide: config.delay
3270
+ };
3271
+ }
3272
+
3273
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
3274
+
3275
+ return config;
3276
+ }
3277
+ }, {
3278
+ key: '_getDelegateConfig',
3279
+ value: function _getDelegateConfig() {
3280
+ var config = {};
3281
+
3282
+ if (this.config) {
3283
+ for (var key in this.config) {
3284
+ if (this.constructor.Default[key] !== this.config[key]) {
3285
+ config[key] = this.config[key];
3286
+ }
3287
+ }
3288
+ }
3289
+
3290
+ return config;
3291
+ }
3292
+
3293
+ // static
3294
+
3295
+ }], [{
3296
+ key: '_jQueryInterface',
3297
+ value: function _jQueryInterface(config) {
3298
+ return this.each(function () {
3299
+ var data = $(this).data(DATA_KEY);
3300
+ var _config = typeof config === 'object' ? config : null;
3301
+
3302
+ if (!data && /destroy|hide/.test(config)) {
3303
+ return;
3304
+ }
3305
+
3306
+ if (!data) {
3307
+ data = new Tooltip(this, _config);
3308
+ $(this).data(DATA_KEY, data);
3309
+ }
3310
+
3311
+ if (typeof config === 'string') {
3312
+ if (data[config] === undefined) {
3313
+ throw new Error('No method named "' + config + '"');
3314
+ }
3315
+ data[config]();
3316
+ }
3317
+ });
3318
+ }
3319
+ }, {
3320
+ key: 'VERSION',
3321
+ get: function get() {
3322
+ return VERSION;
3323
+ }
3324
+ }, {
3325
+ key: 'Default',
3326
+ get: function get() {
3327
+ return Default;
3328
+ }
3329
+ }, {
3330
+ key: 'NAME',
3331
+ get: function get() {
3332
+ return NAME;
3333
+ }
3334
+ }, {
3335
+ key: 'DATA_KEY',
3336
+ get: function get() {
3337
+ return DATA_KEY;
3338
+ }
3339
+ }, {
3340
+ key: 'Event',
3341
+ get: function get() {
3342
+ return Event;
3343
+ }
3344
+ }, {
3345
+ key: 'EVENT_KEY',
3346
+ get: function get() {
3347
+ return EVENT_KEY;
3348
+ }
3349
+ }, {
3350
+ key: 'DefaultType',
3351
+ get: function get() {
3352
+ return DefaultType;
3353
+ }
3354
+ }]);
3355
+
3356
+ return Tooltip;
3357
+ })();
3358
+
3359
+ $.fn[NAME] = Tooltip._jQueryInterface;
3360
+ $.fn[NAME].Constructor = Tooltip;
3361
+ $.fn[NAME].noConflict = function () {
3362
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
3363
+ return Tooltip._jQueryInterface;
3364
+ };
3365
+
3366
+ return Tooltip;
3367
+ })(jQuery);
3368
+
3369
+ /**
3370
+ * --------------------------------------------------------------------------
3371
+ * Bootstrap (v4.0.0): popover.js
3372
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3373
+ * --------------------------------------------------------------------------
3374
+ */
3375
+
3376
+ var Popover = (function ($) {
3377
+
3378
+ /**
3379
+ * ------------------------------------------------------------------------
3380
+ * Constants
3381
+ * ------------------------------------------------------------------------
3382
+ */
3383
+
3384
+ var NAME = 'popover';
3385
+ var VERSION = '4.0.0';
3386
+ var DATA_KEY = 'bs.popover';
3387
+ var EVENT_KEY = '.' + DATA_KEY;
3388
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
3389
+
3390
+ var Default = $.extend({}, Tooltip.Default, {
3391
+ placement: 'right',
3392
+ trigger: 'click',
3393
+ content: '',
3394
+ template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
3395
+ });
3396
+
3397
+ var DefaultType = $.extend({}, Tooltip.DefaultType, {
3398
+ content: '(string|element|function)'
3399
+ });
3400
+
3401
+ var ClassName = {
3402
+ FADE: 'fade',
3403
+ IN: 'in'
3404
+ };
3405
+
3406
+ var Selector = {
3407
+ TITLE: '.popover-title',
3408
+ CONTENT: '.popover-content',
3409
+ ARROW: '.popover-arrow'
3410
+ };
3411
+
3412
+ var Event = {
3413
+ HIDE: 'hide' + EVENT_KEY,
3414
+ HIDDEN: 'hidden' + EVENT_KEY,
3415
+ SHOW: 'show' + EVENT_KEY,
3416
+ SHOWN: 'shown' + EVENT_KEY,
3417
+ INSERTED: 'inserted' + EVENT_KEY,
3418
+ CLICK: 'click' + EVENT_KEY,
3419
+ FOCUSIN: 'focusin' + EVENT_KEY,
3420
+ FOCUSOUT: 'focusout' + EVENT_KEY,
3421
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
3422
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
3423
+ };
3424
+
3425
+ /**
3426
+ * ------------------------------------------------------------------------
3427
+ * Class Definition
3428
+ * ------------------------------------------------------------------------
3429
+ */
3430
+
3431
+ var Popover = (function (_Tooltip) {
3432
+ _inherits(Popover, _Tooltip);
3433
+
3434
+ function Popover() {
3435
+ _classCallCheck(this, Popover);
3436
+
3437
+ _get(Object.getPrototypeOf(Popover.prototype), 'constructor', this).apply(this, arguments);
3438
+ }
3439
+
3440
+ /**
3441
+ * ------------------------------------------------------------------------
3442
+ * jQuery
3443
+ * ------------------------------------------------------------------------
3444
+ */
3445
+
3446
+ _createClass(Popover, [{
3447
+ key: 'isWithContent',
3448
+
3449
+ // overrides
3450
+
3451
+ value: function isWithContent() {
3452
+ return this.getTitle() || this._getContent();
3453
+ }
3454
+ }, {
3455
+ key: 'getTipElement',
3456
+ value: function getTipElement() {
3457
+ return this.tip = this.tip || $(this.config.template)[0];
3458
+ }
3459
+ }, {
3460
+ key: 'setContent',
3461
+ value: function setContent() {
3462
+ var $tip = $(this.getTipElement());
3463
+
3464
+ // we use append for html objects to maintain js events
3465
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
3466
+ this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
3467
+
3468
+ $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
3469
+
3470
+ this.cleanupTether();
3471
+ }
3472
+
3473
+ // private
3474
+
3475
+ }, {
3476
+ key: '_getContent',
3477
+ value: function _getContent() {
3478
+ return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
3479
+ }
3480
+
3481
+ // static
3482
+
3483
+ }], [{
3484
+ key: '_jQueryInterface',
3485
+ value: function _jQueryInterface(config) {
3486
+ return this.each(function () {
3487
+ var data = $(this).data(DATA_KEY);
3488
+ var _config = typeof config === 'object' ? config : null;
3489
+
3490
+ if (!data && /destroy|hide/.test(config)) {
3491
+ return;
3492
+ }
3493
+
3494
+ if (!data) {
3495
+ data = new Popover(this, _config);
3496
+ $(this).data(DATA_KEY, data);
3497
+ }
3498
+
3499
+ if (typeof config === 'string') {
3500
+ if (data[config] === undefined) {
3501
+ throw new Error('No method named "' + config + '"');
3502
+ }
3503
+ data[config]();
3504
+ }
3505
+ });
3506
+ }
3507
+ }, {
3508
+ key: 'VERSION',
3509
+
3510
+ // getters
3511
+
3512
+ get: function get() {
3513
+ return VERSION;
3514
+ }
3515
+ }, {
3516
+ key: 'Default',
3517
+ get: function get() {
3518
+ return Default;
3519
+ }
3520
+ }, {
3521
+ key: 'NAME',
3522
+ get: function get() {
3523
+ return NAME;
3524
+ }
3525
+ }, {
3526
+ key: 'DATA_KEY',
3527
+ get: function get() {
3528
+ return DATA_KEY;
3529
+ }
3530
+ }, {
3531
+ key: 'Event',
3532
+ get: function get() {
3533
+ return Event;
3534
+ }
3535
+ }, {
3536
+ key: 'EVENT_KEY',
3537
+ get: function get() {
3538
+ return EVENT_KEY;
3539
+ }
3540
+ }, {
3541
+ key: 'DefaultType',
3542
+ get: function get() {
3543
+ return DefaultType;
3544
+ }
3545
+ }]);
3546
+
3547
+ return Popover;
3548
+ })(Tooltip);
3549
+
3550
+ $.fn[NAME] = Popover._jQueryInterface;
3551
+ $.fn[NAME].Constructor = Popover;
3552
+ $.fn[NAME].noConflict = function () {
3553
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
3554
+ return Popover._jQueryInterface;
3555
+ };
3556
+
3557
+ return Popover;
3558
+ })(jQuery);
3559
+
3560
+ }(jQuery);