bootstrap 4.0.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,157 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v4.0.0): util.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ var Util = (function ($) {
11
+
12
+ /**
13
+ * ------------------------------------------------------------------------
14
+ * Private TransitionEnd Helpers
15
+ * ------------------------------------------------------------------------
16
+ */
17
+
18
+ var transition = false;
19
+
20
+ var TransitionEndEvent = {
21
+ WebkitTransition: 'webkitTransitionEnd',
22
+ MozTransition: 'transitionend',
23
+ OTransition: 'oTransitionEnd otransitionend',
24
+ transition: 'transitionend'
25
+ };
26
+
27
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
28
+ function toType(obj) {
29
+ return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
30
+ }
31
+
32
+ function isElement(obj) {
33
+ return (obj[0] || obj).nodeType;
34
+ }
35
+
36
+ function getSpecialTransitionEndEvent() {
37
+ return {
38
+ bindType: transition.end,
39
+ delegateType: transition.end,
40
+ handle: function handle(event) {
41
+ if ($(event.target).is(this)) {
42
+ return event.handleObj.handler.apply(this, arguments);
43
+ }
44
+ }
45
+ };
46
+ }
47
+
48
+ function transitionEndTest() {
49
+ if (window.QUnit) {
50
+ return false;
51
+ }
52
+
53
+ var el = document.createElement('bootstrap');
54
+
55
+ for (var _name in TransitionEndEvent) {
56
+ if (el.style[_name] !== undefined) {
57
+ return { end: TransitionEndEvent[_name] };
58
+ }
59
+ }
60
+
61
+ return false;
62
+ }
63
+
64
+ function transitionEndEmulator(duration) {
65
+ var _this = this;
66
+
67
+ var called = false;
68
+
69
+ $(this).one(Util.TRANSITION_END, function () {
70
+ called = true;
71
+ });
72
+
73
+ setTimeout(function () {
74
+ if (!called) {
75
+ Util.triggerTransitionEnd(_this);
76
+ }
77
+ }, duration);
78
+
79
+ return this;
80
+ }
81
+
82
+ function setTransitionEndSupport() {
83
+ transition = transitionEndTest();
84
+
85
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
86
+
87
+ if (Util.supportsTransitionEnd()) {
88
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
89
+ }
90
+ }
91
+
92
+ /**
93
+ * --------------------------------------------------------------------------
94
+ * Public Util Api
95
+ * --------------------------------------------------------------------------
96
+ */
97
+
98
+ var Util = {
99
+
100
+ TRANSITION_END: 'bsTransitionEnd',
101
+
102
+ getUID: function getUID(prefix) {
103
+ do {
104
+ prefix += ~ ~(Math.random() * 1000000);
105
+ } while (document.getElementById(prefix));
106
+ return prefix;
107
+ },
108
+
109
+ getSelectorFromElement: function getSelectorFromElement(element) {
110
+ var selector = element.getAttribute('data-target');
111
+
112
+ if (!selector) {
113
+ selector = element.getAttribute('href') || '';
114
+ selector = /^#[a-z]/i.test(selector) ? selector : null;
115
+ }
116
+
117
+ return selector;
118
+ },
119
+
120
+ reflow: function reflow(element) {
121
+ new Function('bs', 'return bs')(element.offsetHeight);
122
+ },
123
+
124
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
125
+ $(element).trigger(transition.end);
126
+ },
127
+
128
+ supportsTransitionEnd: function supportsTransitionEnd() {
129
+ return Boolean(transition);
130
+ },
131
+
132
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
133
+ for (var property in configTypes) {
134
+ if (configTypes.hasOwnProperty(property)) {
135
+ var expectedTypes = configTypes[property];
136
+ var value = config[property];
137
+ var valueType = undefined;
138
+
139
+ if (value && isElement(value)) {
140
+ valueType = 'element';
141
+ } else {
142
+ valueType = toType(value);
143
+ }
144
+
145
+ if (!new RegExp(expectedTypes).test(valueType)) {
146
+ throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
147
+ }
148
+ }
149
+ }
150
+ }
151
+ };
152
+
153
+ setTransitionEndSupport();
154
+
155
+ return Util;
156
+ })(jQuery);
157
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1,8 @@
1
+ // Bootstrap with Flexbox enabled
2
+ //
3
+ // Includes all the imports from the standard Bootstrap project, but enables
4
+ // the flexbox variable.
5
+
6
+ $enable-flex: true;
7
+
8
+ @import "bootstrap";
@@ -0,0 +1,62 @@
1
+ // Bootstrap Grid only
2
+ //
3
+ // Includes relevant variables and mixins for the regular (non-flexbox) grid
4
+ // system, as well as the generated predefined classes (e.g., `.col-4-sm`).
5
+
6
+
7
+ //
8
+ // Variables
9
+ //
10
+
11
+
12
+ // Grid breakpoints
13
+ //
14
+ // Define the minimum and maximum dimensions at which your layout will change,
15
+ // adapting to different screen sizes, for use in media queries.
16
+
17
+ $grid-breakpoints: (
18
+ // Extra small screen / phone
19
+ xs: 0,
20
+ // Small screen / phone
21
+ sm: 544px,
22
+ // Medium screen / tablet
23
+ md: 768px,
24
+ // Large screen / desktop
25
+ lg: 992px,
26
+ // Extra large screen / wide desktop
27
+ xl: 1200px
28
+ ) !default;
29
+
30
+
31
+ // Grid containers
32
+ //
33
+ // Define the maximum width of `.container` for different screen sizes.
34
+
35
+ $container-max-widths: (
36
+ sm: 576px,
37
+ md: 720px,
38
+ lg: 940px,
39
+ xl: 1140px
40
+ ) !default;
41
+
42
+
43
+ // Grid columns
44
+ //
45
+ // Set the number of columns and specify the width of the gutters.
46
+
47
+ $grid-columns: 12 !default;
48
+ $grid-gutter-width: 1.875rem !default; // 30px
49
+
50
+
51
+ //
52
+ // Grid mixins
53
+ //
54
+
55
+ @import "bootstrap/variables";
56
+
57
+ @import "bootstrap/mixins/clearfix";
58
+ @import "bootstrap/mixins/breakpoints";
59
+ @import "bootstrap/mixins/grid-framework";
60
+ @import "bootstrap/mixins/grid";
61
+
62
+ @import "bootstrap/grid";
@@ -0,0 +1,10 @@
1
+ // Bootstrap Reboot only
2
+ //
3
+ // Includes only Normalize and our custom Reboot reset.
4
+
5
+ @import "bootstrap/variables";
6
+ @import "bootstrap/mixins/hover";
7
+ @import "bootstrap/mixins/tab-focus";
8
+
9
+ @import "bootstrap/normalize";
10
+ @import "bootstrap/reboot";
@@ -0,0 +1,55 @@
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
+ // Core variables and mixins
8
+ @import "bootstrap/variables";
9
+ @import "bootstrap/mixins";
10
+
11
+ // Reset and dependencies
12
+ @import "bootstrap/normalize";
13
+ @import "bootstrap/print";
14
+
15
+ // Core CSS
16
+ @import "bootstrap/reboot";
17
+ @import "bootstrap/type";
18
+ @import "bootstrap/images";
19
+ @import "bootstrap/code";
20
+ @import "bootstrap/grid";
21
+ @import "bootstrap/tables";
22
+ @import "bootstrap/forms";
23
+ @import "bootstrap/buttons";
24
+
25
+ // Components
26
+ @import "bootstrap/animation";
27
+ @import "bootstrap/dropdown";
28
+ @import "bootstrap/button-group";
29
+ @import "bootstrap/input-group";
30
+ @import "bootstrap/custom-forms";
31
+ @import "bootstrap/nav";
32
+ @import "bootstrap/navbar";
33
+ @import "bootstrap/card";
34
+ @import "bootstrap/breadcrumb";
35
+ @import "bootstrap/pagination";
36
+ @import "bootstrap/pager";
37
+ @import "bootstrap/labels";
38
+ @import "bootstrap/jumbotron";
39
+ @import "bootstrap/alert";
40
+ @import "bootstrap/progress";
41
+ @import "bootstrap/media";
42
+ @import "bootstrap/list-group";
43
+ @import "bootstrap/responsive-embed";
44
+ @import "bootstrap/close";
45
+
46
+ // Components w/ JavaScript
47
+ @import "bootstrap/modal";
48
+ @import "bootstrap/tooltip";
49
+ @import "bootstrap/popover";
50
+ @import "bootstrap/carousel";
51
+
52
+ // Utility classes
53
+ @import "bootstrap/utilities";
54
+ @import "bootstrap/utilities-spacing";
55
+ @import "bootstrap/utilities-responsive";
@@ -0,0 +1,65 @@
1
+ //
2
+ // Base styles
3
+ //
4
+
5
+ .alert {
6
+ padding: $alert-padding;
7
+ margin-bottom: $spacer-y;
8
+ border: 1px solid transparent;
9
+ @include border-radius($alert-border-radius);
10
+
11
+ // Improve alignment and spacing of inner content
12
+ > p,
13
+ > ul {
14
+ margin-bottom: 0;
15
+ }
16
+ > p + p {
17
+ margin-top: 5px;
18
+ }
19
+ }
20
+
21
+ // Headings for larger alerts
22
+ .alert-heading {
23
+ // Specified to prevent conflicts of changing $headings-color
24
+ color: inherit;
25
+ }
26
+
27
+ // Provide class for links that match alerts
28
+ .alert-link {
29
+ font-weight: $alert-link-font-weight;
30
+ }
31
+
32
+
33
+ // Dismissible alerts
34
+ //
35
+ // Expand the right padding and account for the close button's positioning.
36
+
37
+ .alert-dismissible {
38
+ padding-right: ($alert-padding + 20);
39
+
40
+ // Adjust close link position
41
+ .close {
42
+ position: relative;
43
+ top: -2px;
44
+ right: -21px;
45
+ color: inherit;
46
+ }
47
+ }
48
+
49
+
50
+ // Alternate styles
51
+ //
52
+ // Generate contextual modifier classes for colorizing the alert.
53
+
54
+ .alert-success {
55
+ @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
56
+ }
57
+ .alert-info {
58
+ @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
59
+ }
60
+ .alert-warning {
61
+ @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
62
+ }
63
+ .alert-danger {
64
+ @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
65
+ }
@@ -0,0 +1,27 @@
1
+ .fade {
2
+ opacity: 0;
3
+ transition: opacity .15s linear;
4
+
5
+ &.in {
6
+ opacity: 1;
7
+ }
8
+ }
9
+
10
+ .collapse {
11
+ display: none;
12
+
13
+ &.in {
14
+ display: block;
15
+ }
16
+ // tr&.in { display: table-row; }
17
+ // tbody&.in { display: table-row-group; }
18
+ }
19
+
20
+ .collapsing {
21
+ position: relative;
22
+ height: 0;
23
+ overflow: hidden;
24
+ transition-timing-function: ease;
25
+ transition-duration: .35s;
26
+ transition-property: height;
27
+ }
@@ -0,0 +1,23 @@
1
+ .breadcrumb {
2
+ padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
3
+ margin-bottom: $spacer-y;
4
+ list-style: none;
5
+ background-color: $breadcrumb-bg;
6
+ @include border-radius($border-radius);
7
+ @include clearfix;
8
+
9
+ > li {
10
+ float: left;
11
+
12
+ + li::before {
13
+ padding-right: .5rem;
14
+ padding-left: .5rem;
15
+ color: $breadcrumb-divider-color;
16
+ content: "#{$breadcrumb-divider}";
17
+ }
18
+ }
19
+
20
+ > .active {
21
+ color: $breadcrumb-active-color;
22
+ }
23
+ }
@@ -0,0 +1,224 @@
1
+ // Make the div behave like a button
2
+ .btn-group,
3
+ .btn-group-vertical {
4
+ position: relative;
5
+ display: inline-block;
6
+ vertical-align: middle; // match .btn alignment given font-size hack above
7
+
8
+ > .btn {
9
+ position: relative;
10
+ float: left;
11
+
12
+ // Bring the "active" button to the front
13
+ &:focus,
14
+ &:active,
15
+ &.active {
16
+ z-index: 2;
17
+ }
18
+ @include hover {
19
+ z-index: 2;
20
+ }
21
+ }
22
+ }
23
+
24
+ // Prevent double borders when buttons are next to each other
25
+ .btn-group {
26
+ .btn + .btn,
27
+ .btn + .btn-group,
28
+ .btn-group + .btn,
29
+ .btn-group + .btn-group {
30
+ margin-left: -1px;
31
+ }
32
+ }
33
+
34
+ // Optional: Group multiple button groups together for a toolbar
35
+ .btn-toolbar {
36
+ margin-left: -5px; // Offset the first child's margin
37
+ @include clearfix();
38
+
39
+ .btn-group,
40
+ .input-group {
41
+ float: left;
42
+ }
43
+
44
+ > .btn,
45
+ > .btn-group,
46
+ > .input-group {
47
+ margin-left: 5px;
48
+ }
49
+ }
50
+
51
+ .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
52
+ border-radius: 0;
53
+ }
54
+
55
+ // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
56
+ .btn-group > .btn:first-child {
57
+ margin-left: 0;
58
+
59
+ &:not(:last-child):not(.dropdown-toggle) {
60
+ @include border-right-radius(0);
61
+ }
62
+ }
63
+ // Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
64
+ .btn-group > .btn:last-child:not(:first-child),
65
+ .btn-group > .dropdown-toggle:not(:first-child) {
66
+ @include border-left-radius(0);
67
+ }
68
+
69
+ // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
70
+ .btn-group > .btn-group {
71
+ float: left;
72
+ }
73
+ .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
74
+ border-radius: 0;
75
+ }
76
+ .btn-group > .btn-group:first-child:not(:last-child) {
77
+ > .btn:last-child,
78
+ > .dropdown-toggle {
79
+ @include border-right-radius(0);
80
+ }
81
+ }
82
+ .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
83
+ @include border-left-radius(0);
84
+ }
85
+
86
+ // On active and open, don't show outline
87
+ .btn-group .dropdown-toggle:active,
88
+ .btn-group.open .dropdown-toggle {
89
+ outline: 0;
90
+ }
91
+
92
+
93
+ // Sizing
94
+ //
95
+ // Remix the default button sizing classes into new ones for easier manipulation.
96
+
97
+ .btn-group-sm > .btn { @extend .btn-sm; }
98
+ .btn-group-lg > .btn { @extend .btn-lg; }
99
+
100
+
101
+ //
102
+ // Split button dropdowns
103
+ //
104
+
105
+ // Give the line between buttons some depth
106
+ .btn-group > .btn + .dropdown-toggle {
107
+ padding-right: 8px;
108
+ padding-left: 8px;
109
+ }
110
+ .btn-group > .btn-lg + .dropdown-toggle {
111
+ padding-right: 12px;
112
+ padding-left: 12px;
113
+ }
114
+
115
+ // The clickable button for toggling the menu
116
+ // Remove the gradient and set the same inset shadow as the :active state
117
+ .btn-group.open .dropdown-toggle {
118
+ @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
119
+
120
+ // Show no shadow for `.btn-link` since it has no other button styles.
121
+ &.btn-link {
122
+ @include box-shadow(none);
123
+ }
124
+ }
125
+
126
+
127
+ // Reposition the caret
128
+ .btn .caret {
129
+ margin-left: 0;
130
+ }
131
+ // Carets in other button sizes
132
+ .btn-lg .caret {
133
+ border-width: $caret-width-lg $caret-width-lg 0;
134
+ border-bottom-width: 0;
135
+ }
136
+ // Upside down carets for .dropup
137
+ .dropup .btn-lg .caret {
138
+ border-width: 0 $caret-width-lg $caret-width-lg;
139
+ }
140
+
141
+
142
+
143
+ //
144
+ // Vertical button groups
145
+ //
146
+
147
+ .btn-group-vertical {
148
+ > .btn,
149
+ > .btn-group,
150
+ > .btn-group > .btn {
151
+ display: block;
152
+ float: none;
153
+ width: 100%;
154
+ max-width: 100%;
155
+ }
156
+
157
+ // Clear floats so dropdown menus can be properly placed
158
+ > .btn-group {
159
+ @include clearfix();
160
+
161
+ > .btn {
162
+ float: none;
163
+ }
164
+ }
165
+
166
+ > .btn + .btn,
167
+ > .btn + .btn-group,
168
+ > .btn-group + .btn,
169
+ > .btn-group + .btn-group {
170
+ margin-top: -1px;
171
+ margin-left: 0;
172
+ }
173
+ }
174
+
175
+ .btn-group-vertical > .btn {
176
+ &:not(:first-child):not(:last-child) {
177
+ border-radius: 0;
178
+ }
179
+ &:first-child:not(:last-child) {
180
+ border-top-right-radius: $btn-border-radius;
181
+ @include border-bottom-radius(0);
182
+ }
183
+ &:last-child:not(:first-child) {
184
+ border-bottom-left-radius: $btn-border-radius;
185
+ @include border-top-radius(0);
186
+ }
187
+ }
188
+ .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
189
+ border-radius: 0;
190
+ }
191
+ .btn-group-vertical > .btn-group:first-child:not(:last-child) {
192
+ > .btn:last-child,
193
+ > .dropdown-toggle {
194
+ @include border-bottom-radius(0);
195
+ }
196
+ }
197
+ .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
198
+ @include border-top-radius(0);
199
+ }
200
+
201
+
202
+ // Checkbox and radio options
203
+ //
204
+ // In order to support the browser's form validation feedback, powered by the
205
+ // `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
206
+ // `display: none;` or `visibility: hidden;` as that also hides the popover.
207
+ // Simply visually hiding the inputs via `opacity` would leave them clickable in
208
+ // certain cases which is prevented by using `clip` and `pointer-events`.
209
+ // This way, we ensure a DOM element is visible to position the popover from.
210
+ //
211
+ // See https://github.com/twbs/bootstrap/pull/12794 and
212
+ // https://github.com/twbs/bootstrap/pull/14559 for more information.
213
+
214
+ [data-toggle="buttons"] {
215
+ > .btn,
216
+ > .btn-group > .btn {
217
+ input[type="radio"],
218
+ input[type="checkbox"] {
219
+ position: absolute;
220
+ clip: rect(0,0,0,0);
221
+ pointer-events: none;
222
+ }
223
+ }
224
+ }