bootstrap 4.1.3 → 5.0.0

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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -2
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +7 -4
  5. data/Rakefile +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +226 -166
  7. data/assets/javascripts/bootstrap/base-component.js +63 -0
  8. data/assets/javascripts/bootstrap/button.js +119 -165
  9. data/assets/javascripts/bootstrap/carousel.js +634 -445
  10. data/assets/javascripts/bootstrap/collapse.js +447 -327
  11. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  15. data/assets/javascripts/bootstrap/dropdown.js +550 -425
  16. data/assets/javascripts/bootstrap/modal.js +695 -492
  17. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  18. data/assets/javascripts/bootstrap/popover.js +167 -217
  19. data/assets/javascripts/bootstrap/scrollspy.js +319 -302
  20. data/assets/javascripts/bootstrap/tab.js +303 -221
  21. data/assets/javascripts/bootstrap/toast.js +333 -0
  22. data/assets/javascripts/bootstrap/tooltip.js +896 -577
  23. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  24. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  25. data/assets/javascripts/bootstrap-sprockets.js +15 -7
  26. data/assets/javascripts/bootstrap.js +4262 -3163
  27. data/assets/javascripts/bootstrap.min.js +4 -4
  28. data/assets/stylesheets/_bootstrap-grid.scss +54 -21
  29. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  30. data/assets/stylesheets/_bootstrap.scss +21 -11
  31. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  32. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  33. data/assets/stylesheets/bootstrap/_badge.scss +3 -21
  34. data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
  35. data/assets/stylesheets/bootstrap/_button-group.scss +29 -62
  36. data/assets/stylesheets/bootstrap/_buttons.scss +33 -65
  37. data/assets/stylesheets/bootstrap/_card.scss +55 -141
  38. data/assets/stylesheets/bootstrap/_carousel.scss +94 -101
  39. data/assets/stylesheets/bootstrap/_close.scss +33 -28
  40. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  41. data/assets/stylesheets/bootstrap/_dropdown.scss +114 -40
  42. data/assets/stylesheets/bootstrap/_forms.scss +9 -333
  43. data/assets/stylesheets/bootstrap/_functions.scss +148 -29
  44. data/assets/stylesheets/bootstrap/_grid.scss +4 -34
  45. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  46. data/assets/stylesheets/bootstrap/_images.scss +4 -4
  47. data/assets/stylesheets/bootstrap/_list-group.scss +86 -27
  48. data/assets/stylesheets/bootstrap/_mixins.scss +17 -16
  49. data/assets/stylesheets/bootstrap/_modal.scss +90 -42
  50. data/assets/stylesheets/bootstrap/_nav.scss +31 -10
  51. data/assets/stylesheets/bootstrap/_navbar.scss +68 -61
  52. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  53. data/assets/stylesheets/bootstrap/_pagination.scss +13 -27
  54. data/assets/stylesheets/bootstrap/_popover.scss +63 -88
  55. data/assets/stylesheets/bootstrap/_progress.scss +20 -6
  56. data/assets/stylesheets/bootstrap/_reboot.scss +349 -211
  57. data/assets/stylesheets/bootstrap/_root.scss +5 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +69 -0
  59. data/assets/stylesheets/bootstrap/_tables.scss +79 -116
  60. data/assets/stylesheets/bootstrap/_toasts.scss +51 -0
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +18 -18
  62. data/assets/stylesheets/bootstrap/_transitions.scss +2 -3
  63. data/assets/stylesheets/bootstrap/_type.scss +42 -63
  64. data/assets/stylesheets/bootstrap/_utilities.scss +594 -15
  65. data/assets/stylesheets/bootstrap/_variables.scss +952 -440
  66. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  72. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  74. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  75. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  76. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  77. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  78. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  79. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  80. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  81. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  82. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  83. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +57 -14
  84. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +14 -1
  85. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +13 -9
  86. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -53
  87. data/assets/stylesheets/bootstrap/mixins/_caret.scss +14 -16
  88. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  89. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  90. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  91. data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
  92. data/assets/stylesheets/bootstrap/mixins/_forms.scss +87 -97
  93. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  94. data/assets/stylesheets/bootstrap/mixins/_grid.scss +106 -33
  95. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  96. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  97. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +18 -9
  98. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  99. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  100. data/assets/stylesheets/bootstrap/mixins/_transition.scss +19 -6
  101. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  102. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  103. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  104. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +312 -0
  105. data/bootstrap.gemspec +7 -6
  106. data/lib/bootstrap/engine.rb +3 -0
  107. data/lib/bootstrap/version.rb +4 -2
  108. data/lib/bootstrap.rb +10 -7
  109. data/tasks/updater/js.rb +20 -5
  110. data/tasks/updater/network.rb +8 -2
  111. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  112. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  113. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  114. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  115. data/test/dummy_rails/app/views/pages/root.html +89 -0
  116. data/test/dummy_rails/config/application.rb +0 -3
  117. data/test/gemfiles/rails_6_0.gemfile +7 -0
  118. data/test/gemfiles/rails_6_1.gemfile +7 -0
  119. data/test/support/dummy_rails_integration.rb +3 -1
  120. data/test/test_helper.rb +18 -13
  121. metadata +64 -79
  122. data/assets/javascripts/bootstrap/util.js +0 -143
  123. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  124. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -433
  125. data/assets/stylesheets/bootstrap/_input-group.scss +0 -173
  126. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  127. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  128. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  129. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  130. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  131. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  133. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  134. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  135. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  136. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  137. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  138. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  139. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -13
  140. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  141. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  142. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  143. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  144. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  145. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  146. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  147. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  148. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -37
  149. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  150. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  151. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  152. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  153. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -58
  154. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  155. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  156. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -0,0 +1,21 @@
1
+ // scss-docs-start table-variant
2
+ @mixin table-variant($state, $background) {
3
+ .table-#{$state} {
4
+ $color: color-contrast(opaque($body-bg, $background));
5
+ $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));
6
+ $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));
7
+ $active-bg: mix($color, $background, percentage($table-active-bg-factor));
8
+
9
+ --#{$variable-prefix}table-bg: #{$background};
10
+ --#{$variable-prefix}table-striped-bg: #{$striped-bg};
11
+ --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};
12
+ --#{$variable-prefix}table-active-bg: #{$active-bg};
13
+ --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};
14
+ --#{$variable-prefix}table-hover-bg: #{$hover-bg};
15
+ --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};
16
+
17
+ color: $color;
18
+ border-color: mix($color, $background, percentage($table-border-factor));
19
+ }
20
+ }
21
+ // scss-docs-end table-variant
@@ -1,13 +1,26 @@
1
+ // stylelint-disable property-disallowed-list
1
2
  @mixin transition($transition...) {
3
+ @if length($transition) == 0 {
4
+ $transition: $transition-base;
5
+ }
6
+
7
+ @if length($transition) > 1 {
8
+ @each $value in $transition {
9
+ @if $value == null or $value == none {
10
+ @warn "The keyword 'none' or 'null' must be used as a single argument.";
11
+ }
12
+ }
13
+ }
14
+
2
15
  @if $enable-transitions {
3
- @if length($transition) == 0 {
4
- transition: $transition-base;
5
- } @else {
16
+ @if nth($transition, 1) != null {
6
17
  transition: $transition;
7
18
  }
8
- }
9
19
 
10
- @media screen and (prefers-reduced-motion: reduce) {
11
- transition: none;
20
+ @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {
21
+ @media (prefers-reduced-motion: reduce) {
22
+ transition: none;
23
+ }
24
+ }
12
25
  }
13
26
  }
@@ -0,0 +1,68 @@
1
+ // Utility generator
2
+ // Used to generate utilities & print utilities
3
+ @mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {
4
+ $values: map-get($utility, values);
5
+
6
+ // If the values are a list or string, convert it into a map
7
+ @if type-of($values) == "string" or type-of(nth($values, 1)) != "list" {
8
+ $values: zip($values, $values);
9
+ }
10
+
11
+ @each $key, $value in $values {
12
+ $properties: map-get($utility, property);
13
+
14
+ // Multiple properties are possible, for example with vertical or horizontal margins or paddings
15
+ @if type-of($properties) == "string" {
16
+ $properties: append((), $properties);
17
+ }
18
+
19
+ // Use custom class if present
20
+ $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));
21
+ $property-class: if($property-class == null, "", $property-class);
22
+
23
+ // State params to generate pseudo-classes
24
+ $state: if(map-has-key($utility, state), map-get($utility, state), ());
25
+
26
+ $infix: if($property-class == "" and str-slice($infix, 1, 1) == "-", str-slice($infix, 2), $infix);
27
+
28
+ // Don't prefix if value key is null (eg. with shadow class)
29
+ $property-class-modifier: if($key, if($property-class == "" and $infix == "", "", "-") + $key, "");
30
+
31
+ @if map-get($utility, rfs) {
32
+ // Inside the media query
33
+ @if $is-rfs-media-query {
34
+ $val: rfs-value($value);
35
+
36
+ // Do not render anything if fluid and non fluid values are the same
37
+ $value: if($val == rfs-fluid-value($value), null, $val);
38
+ }
39
+ @else {
40
+ $value: rfs-fluid-value($value);
41
+ }
42
+ }
43
+
44
+ $is-rtl: map-get($utility, rtl);
45
+
46
+ @if $value != null {
47
+ @if $is-rtl == false {
48
+ /* rtl:begin:remove */
49
+ }
50
+ .#{$property-class + $infix + $property-class-modifier} {
51
+ @each $property in $properties {
52
+ #{$property}: $value if($enable-important-utilities, !important, null);
53
+ }
54
+ }
55
+
56
+ @each $pseudo in $state {
57
+ .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
58
+ @each $property in $properties {
59
+ #{$property}: $value if($enable-important-utilities, !important, null);
60
+ }
61
+ }
62
+ }
63
+ @if $is-rtl == false {
64
+ /* rtl:end:remove */
65
+ }
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,29 @@
1
+ // stylelint-disable declaration-no-important
2
+
3
+ // Hide content visually while keeping it accessible to assistive technologies
4
+ //
5
+ // See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
6
+ // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
7
+
8
+ @mixin visually-hidden() {
9
+ position: absolute !important;
10
+ width: 1px !important;
11
+ height: 1px !important;
12
+ padding: 0 !important;
13
+ margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686
14
+ overflow: hidden !important;
15
+ clip: rect(0, 0, 0, 0) !important;
16
+ white-space: nowrap !important;
17
+ border: 0 !important;
18
+ }
19
+
20
+ // Use to only display content when it's focused, or one of its child elements is focused
21
+ // (i.e. when focus is within the element/container that the class was applied to)
22
+ //
23
+ // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
24
+
25
+ @mixin visually-hidden-focusable() {
26
+ &:not(:focus):not(:focus-within) {
27
+ @include visually-hidden();
28
+ }
29
+ }
@@ -0,0 +1,47 @@
1
+ // Loop over each breakpoint
2
+ @each $breakpoint in map-keys($grid-breakpoints) {
3
+
4
+ // Generate media query if needed
5
+ @include media-breakpoint-up($breakpoint) {
6
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
7
+
8
+ // Loop over each utility property
9
+ @each $key, $utility in $utilities {
10
+ // The utility can be disabled with `false`, thus check if the utility is a map first
11
+ // Only proceed if responsive media queries are enabled or if it's the base media query
12
+ @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") {
13
+ @include generate-utility($utility, $infix);
14
+ }
15
+ }
16
+ }
17
+ }
18
+
19
+ // RFS rescaling
20
+ @media (min-width: $rfs-mq-value) {
21
+ @each $breakpoint in map-keys($grid-breakpoints) {
22
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
23
+
24
+ @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {
25
+ // Loop over each utility property
26
+ @each $key, $utility in $utilities {
27
+ // The utility can be disabled with `false`, thus check if the utility is a map first
28
+ // Only proceed if responsive media queries are enabled or if it's the base media query
29
+ @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
30
+ @include generate-utility($utility, $infix, true);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+
38
+ // Print utilities
39
+ @media print {
40
+ @each $key, $utility in $utilities {
41
+ // The utility can be disabled with `false`, thus check if the utility is a map first
42
+ // Then check if the utility needs print styles
43
+ @if type-of($utility) == "map" and map-get($utility, print) == true {
44
+ @include generate-utility($utility, "-print");
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,312 @@
1
+ // stylelint-disable property-blacklist, scss/dollar-variable-default
2
+
3
+ // SCSS RFS mixin
4
+ //
5
+ // Automated responsive values for font sizes, paddings, margins and much more
6
+ //
7
+ // Licensed under MIT (https://github.com/twbs/rfs/blob/master/LICENSE)
8
+
9
+ // Configuration
10
+
11
+ // Base value
12
+ $rfs-base-value: 1.25rem !default;
13
+ $rfs-unit: rem !default;
14
+
15
+ @if $rfs-unit != rem and $rfs-unit != px {
16
+ @error "`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.";
17
+ }
18
+
19
+ // Breakpoint at where values start decreasing if screen width is smaller
20
+ $rfs-breakpoint: 1200px !default;
21
+ $rfs-breakpoint-unit: px !default;
22
+
23
+ @if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {
24
+ @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.";
25
+ }
26
+
27
+ // Resize values based on screen height and width
28
+ $rfs-two-dimensional: false !default;
29
+
30
+ // Factor of decrease
31
+ $rfs-factor: 10 !default;
32
+
33
+ @if type-of($rfs-factor) != number or $rfs-factor <= 1 {
34
+ @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.";
35
+ }
36
+
37
+ // Mode. Possibilities: "min-media-query", "max-media-query"
38
+ $rfs-mode: min-media-query !default;
39
+
40
+ // Generate enable or disable classes. Possibilities: false, "enable" or "disable"
41
+ $rfs-class: false !default;
42
+
43
+ // 1 rem = $rfs-rem-value px
44
+ $rfs-rem-value: 16 !default;
45
+
46
+ // Safari iframe resize bug: https://github.com/twbs/rfs/issues/14
47
+ $rfs-safari-iframe-resize-bug-fix: false !default;
48
+
49
+ // Disable RFS by setting $enable-rfs to false
50
+ $enable-rfs: true !default;
51
+
52
+ // Cache $rfs-base-value unit
53
+ $rfs-base-value-unit: unit($rfs-base-value);
54
+
55
+ // Remove px-unit from $rfs-base-value for calculations
56
+ @if $rfs-base-value-unit == px {
57
+ $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1);
58
+ }
59
+ @else if $rfs-base-value-unit == rem {
60
+ $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1 / $rfs-rem-value);
61
+ }
62
+
63
+ // Cache $rfs-breakpoint unit to prevent multiple calls
64
+ $rfs-breakpoint-unit-cache: unit($rfs-breakpoint);
65
+
66
+ // Remove unit from $rfs-breakpoint for calculations
67
+ @if $rfs-breakpoint-unit-cache == px {
68
+ $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);
69
+ }
70
+ @else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == "em" {
71
+ $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);
72
+ }
73
+
74
+ // Calculate the media query value
75
+ $rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit});
76
+ $rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);
77
+ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);
78
+
79
+ // Internal mixin used to determine which media query needs to be used
80
+ @mixin _rfs-media-query {
81
+ @if $rfs-two-dimensional {
82
+ @if $rfs-mode == max-media-query {
83
+ @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
84
+ @content;
85
+ }
86
+ }
87
+ @else {
88
+ @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
89
+ @content;
90
+ }
91
+ }
92
+ }
93
+ @else {
94
+ @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {
95
+ @content;
96
+ }
97
+ }
98
+ }
99
+
100
+ // Internal mixin that adds disable classes to the selector if needed.
101
+ @mixin _rfs-rule {
102
+ @if $rfs-class == disable and $rfs-mode == max-media-query {
103
+ // Adding an extra class increases specificity, which prevents the media query to override the property
104
+ &,
105
+ .disable-rfs &,
106
+ &.disable-rfs {
107
+ @content;
108
+ }
109
+ }
110
+ @else if $rfs-class == enable and $rfs-mode == min-media-query {
111
+ .enable-rfs &,
112
+ &.enable-rfs {
113
+ @content;
114
+ }
115
+ }
116
+ @else {
117
+ @content;
118
+ }
119
+ }
120
+
121
+ // Internal mixin that adds enable classes to the selector if needed.
122
+ @mixin _rfs-media-query-rule {
123
+
124
+ @if $rfs-class == enable {
125
+ @if $rfs-mode == min-media-query {
126
+ @content;
127
+ }
128
+
129
+ @include _rfs-media-query {
130
+ .enable-rfs &,
131
+ &.enable-rfs {
132
+ @content;
133
+ }
134
+ }
135
+ }
136
+ @else {
137
+ @if $rfs-class == disable and $rfs-mode == min-media-query {
138
+ .disable-rfs &,
139
+ &.disable-rfs {
140
+ @content;
141
+ }
142
+ }
143
+ @include _rfs-media-query {
144
+ @content;
145
+ }
146
+ }
147
+ }
148
+
149
+ // Helper function to get the formatted non-responsive value
150
+ @function rfs-value($values) {
151
+ // Convert to list
152
+ $values: if(type-of($values) != list, ($values,), $values);
153
+
154
+ $val: '';
155
+
156
+ // Loop over each value and calculate value
157
+ @each $value in $values {
158
+ @if $value == 0 {
159
+ $val: $val + ' 0';
160
+ }
161
+ @else {
162
+ // Cache $value unit
163
+ $unit: if(type-of($value) == "number", unit($value), false);
164
+
165
+ @if $unit == px {
166
+ // Convert to rem if needed
167
+ $val: $val + ' ' + if($rfs-unit == rem, #{$value / ($value * 0 + $rfs-rem-value)}rem, $value);
168
+ }
169
+ @else if $unit == rem {
170
+ // Convert to px if needed
171
+ $val: $val + ' ' + if($rfs-unit == px, #{$value / ($value * 0 + 1) * $rfs-rem-value}px, $value);
172
+ }
173
+ @else {
174
+ // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
175
+ $val: $val + ' ' + $value;
176
+ }
177
+ }
178
+ }
179
+
180
+ // Remove first space
181
+ @return unquote(str-slice($val, 2));
182
+ }
183
+
184
+ // Helper function to get the responsive value calculated by RFS
185
+ @function rfs-fluid-value($values) {
186
+ // Convert to list
187
+ $values: if(type-of($values) != list, ($values,), $values);
188
+
189
+ $val: '';
190
+
191
+ // Loop over each value and calculate value
192
+ @each $value in $values {
193
+ @if $value == 0 {
194
+ $val: $val + ' 0';
195
+ }
196
+
197
+ @else {
198
+ // Cache $value unit
199
+ $unit: if(type-of($value) == "number", unit($value), false);
200
+
201
+ // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
202
+ @if not $unit or $unit != px and $unit != rem {
203
+ $val: $val + ' ' + $value;
204
+ }
205
+
206
+ @else {
207
+ // Remove unit from $value for calculations
208
+ $value: $value / ($value * 0 + if($unit == px, 1, 1 / $rfs-rem-value));
209
+
210
+ // Only add the media query if the value is greater than the minimum value
211
+ @if abs($value) <= $rfs-base-value or not $enable-rfs {
212
+ $val: $val + ' ' + if($rfs-unit == rem, #{$value / $rfs-rem-value}rem, #{$value}px);
213
+ }
214
+ @else {
215
+ // Calculate the minimum value
216
+ $value-min: $rfs-base-value + (abs($value) - $rfs-base-value) / $rfs-factor;
217
+
218
+ // Calculate difference between $value and the minimum value
219
+ $value-diff: abs($value) - $value-min;
220
+
221
+ // Base value formatting
222
+ $min-width: if($rfs-unit == rem, #{$value-min / $rfs-rem-value}rem, #{$value-min}px);
223
+
224
+ // Use negative value if needed
225
+ $min-width: if($value < 0, -$min-width, $min-width);
226
+
227
+ // Use `vmin` if two-dimensional is enabled
228
+ $variable-unit: if($rfs-two-dimensional, vmin, vw);
229
+
230
+ // Calculate the variable width between 0 and $rfs-breakpoint
231
+ $variable-width: #{$value-diff * 100 / $rfs-breakpoint}#{$variable-unit};
232
+
233
+ // Return the calculated value
234
+ $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';
235
+ }
236
+ }
237
+ }
238
+ }
239
+
240
+ // Remove first space
241
+ @return unquote(str-slice($val, 2));
242
+ }
243
+
244
+ // RFS mixin
245
+ @mixin rfs($values, $property: font-size) {
246
+ @if $values != null {
247
+ $val: rfs-value($values);
248
+ $fluidVal: rfs-fluid-value($values);
249
+
250
+ // Do not print the media query if responsive & non-responsive values are the same
251
+ @if $val == $fluidVal {
252
+ #{$property}: $val;
253
+ }
254
+ @else {
255
+ @include _rfs-rule {
256
+ #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);
257
+
258
+ // Include safari iframe resize fix if needed
259
+ min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);
260
+ }
261
+
262
+ @include _rfs-media-query-rule {
263
+ #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ // Shorthand helper mixins
270
+ @mixin font-size($value) {
271
+ @include rfs($value);
272
+ }
273
+
274
+ @mixin padding($value) {
275
+ @include rfs($value, padding);
276
+ }
277
+
278
+ @mixin padding-top($value) {
279
+ @include rfs($value, padding-top);
280
+ }
281
+
282
+ @mixin padding-right($value) {
283
+ @include rfs($value, padding-right);
284
+ }
285
+
286
+ @mixin padding-bottom($value) {
287
+ @include rfs($value, padding-bottom);
288
+ }
289
+
290
+ @mixin padding-left($value) {
291
+ @include rfs($value, padding-left);
292
+ }
293
+
294
+ @mixin margin($value) {
295
+ @include rfs($value, margin);
296
+ }
297
+
298
+ @mixin margin-top($value) {
299
+ @include rfs($value, margin-top);
300
+ }
301
+
302
+ @mixin margin-right($value) {
303
+ @include rfs($value, margin-right);
304
+ }
305
+
306
+ @mixin margin-bottom($value) {
307
+ @include rfs($value, margin-bottom);
308
+ }
309
+
310
+ @mixin margin-left($value) {
311
+ @include rfs($value, margin-left);
312
+ }
data/bootstrap.gemspec CHANGED
@@ -11,10 +11,13 @@ Gem::Specification.new do |s|
11
11
  s.homepage = 'https://github.com/twbs/bootstrap-rubygem'
12
12
  s.license = 'MIT'
13
13
 
14
- s.add_runtime_dependency 'popper_js', '>= 1.12.9', '< 2'
14
+ # SassC requires Ruby 2.3.3. Also specify here to make it obvious.
15
+ s.required_ruby_version = '>= 2.3.3'
15
16
 
16
- s.add_runtime_dependency 'sass', '>= 3.5.2'
17
- s.add_runtime_dependency 'autoprefixer-rails', '>= 6.0.3'
17
+ s.add_runtime_dependency 'popper_js', '>= 2.9.2', '< 3'
18
+
19
+ s.add_runtime_dependency 'sassc-rails', '>= 2.0.0'
20
+ s.add_runtime_dependency 'autoprefixer-rails', '>= 9.1.0'
18
21
 
19
22
  # Testing dependencies
20
23
  s.add_development_dependency 'minitest', '~> 5.8.0'
@@ -22,14 +25,12 @@ Gem::Specification.new do |s|
22
25
  s.add_development_dependency 'term-ansicolor'
23
26
  # Integration testing
24
27
  s.add_development_dependency 'capybara', '>= 2.6.0'
25
- s.add_development_dependency 'poltergeist'
28
+ s.add_development_dependency 'cuprite'
26
29
  # Dummy Rails app dependencies
27
30
  s.add_development_dependency 'actionpack', '>= 4.1.5'
28
31
  s.add_development_dependency 'activesupport', '>= 4.1.5'
29
32
  s.add_development_dependency 'json', '>= 1.8.1'
30
33
  s.add_development_dependency 'sprockets-rails', '>= 2.3.2'
31
- s.add_development_dependency 'jquery-rails', '>= 3.1.0'
32
- s.add_development_dependency 'slim-rails'
33
34
  s.add_development_dependency 'uglifier'
34
35
 
35
36
  s.files = `git ls-files`.split("\n")
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'autoprefixer-rails'
4
+ require 'sassc-rails'
2
5
 
3
6
  module Bootstrap
4
7
  module Rails
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bootstrap
2
- VERSION = '4.1.3'
3
- BOOTSTRAP_SHA = '3b558734382ce58b51e5fc676453bfd53bba9201'
4
+ VERSION = '5.0.0'
5
+ BOOTSTRAP_SHA = 'bf0936748602c8109fd916c64b4560799fa1c3f8'
4
6
  end
data/lib/bootstrap.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bootstrap/version'
2
4
  require 'popper_js'
3
5
 
@@ -11,9 +13,16 @@ module Bootstrap
11
13
  register_hanami
12
14
  elsif sprockets?
13
15
  register_sprockets
16
+ elsif defined?(::Sass) && ::Sass.respond_to?(:load_paths)
17
+ # The deprecated `sass` gem:
18
+ ::Sass.load_paths << stylesheets_path
14
19
  end
15
20
 
16
- configure_sass
21
+ if defined?(::Sass::Script::Value::Number)
22
+ # Set precision to 6 as per:
23
+ # https://github.com/twbs/bootstrap/blob/da717b03e6e72d7a61c007acb9223b9626ae5ee5/package.json#L28
24
+ ::Sass::Script::Value::Number.precision = [6, ::Sass::Script::Value::Number.precision].max
25
+ end
17
26
  end
18
27
 
19
28
  # Paths
@@ -48,12 +57,6 @@ module Bootstrap
48
57
 
49
58
  private
50
59
 
51
- def configure_sass
52
- require 'sass'
53
-
54
- ::Sass.load_paths << stylesheets_path
55
- end
56
-
57
60
  def register_rails_engine
58
61
  require 'bootstrap/engine'
59
62
  end
data/tasks/updater/js.rb CHANGED
@@ -2,6 +2,8 @@ require 'tsort'
2
2
 
3
3
  class Updater
4
4
  module Js
5
+ INLINED_SRCS = %w[util/index.js util/backdrop.js util/sanitizer.js util/scrollbar.js].freeze
6
+
5
7
  def update_javascript_assets
6
8
  log_status 'Updating javascripts...'
7
9
  save_to = @save_to[:js]
@@ -11,13 +13,26 @@ class Updater
11
13
  log_processed "#{bootstrap_js_files * ' '}"
12
14
 
13
15
  log_status 'Updating javascript manifest'
14
- manifest = ''
16
+ manifest = "//= require ./bootstrap-global-this-define\n"
15
17
  bootstrap_js_files.each do |name|
16
18
  name = name.gsub(/\.js$/, '')
17
19
  manifest << "//= require ./bootstrap/#{name}\n"
18
20
  end
21
+ manifest << "//= require ./bootstrap-global-this-undefine\n"
19
22
  dist_js = read_files('dist/js', %w(bootstrap.js bootstrap.min.js))
20
23
  {
24
+ 'assets/javascripts/bootstrap-global-this-define.js' => <<~JS,
25
+ // Set a `globalThis` so that bootstrap components are defined on window.bootstrap instead of window.
26
+ window['bootstrap'] = {
27
+ Popper: window.Popper,
28
+ _originalGlobalThis: window['globalThis']
29
+ };
30
+ window['globalThis'] = window['bootstrap'];
31
+ JS
32
+ 'assets/javascripts/bootstrap-global-this-undefine.js' => <<~JS,
33
+ window['globalThis'] = window['bootstrap']._originalGlobalThis;
34
+ window['bootstrap']._originalGlobalThis = null;
35
+ JS
21
36
  'assets/javascripts/bootstrap-sprockets.js' => manifest,
22
37
  'assets/javascripts/bootstrap.js' => dist_js['bootstrap.js'],
23
38
  'assets/javascripts/bootstrap.min.js' => dist_js['bootstrap.min.js'],
@@ -29,13 +44,13 @@ class Updater
29
44
 
30
45
  def bootstrap_js_files
31
46
  @bootstrap_js_files ||= begin
32
- src_files = get_paths_by_type('js/src', /\.js$/) - %w[index.js]
47
+ src_files = get_paths_by_type('js/src', /\.js$/) - INLINED_SRCS
48
+ puts "src_files: #{src_files.inspect}"
33
49
  imports = Deps.new
34
50
  # Get the imports from the ES6 files to order requires correctly.
35
51
  read_files('js/src', src_files).each do |name, content|
36
- imports.add name,
37
- *content.scan(%r{import [a-zA-Z]* from '\./(\w+)})
38
- .flatten(1).map { |f| "#{f}.js" }
52
+ file_imports = content.scan(%r{import *(?:[a-zA-Z]*|\{[a-zA-Z ,]*\}) *from '\./([\w/-]+)}).flatten(1).map { |f| "#{f}.js" }.uniq
53
+ imports.add name, *(file_imports - INLINED_SRCS)
39
54
  end
40
55
  imports.tsort
41
56
  end
@@ -25,7 +25,13 @@ class Updater
25
25
  log_http_get_files files, path_url, false
26
26
  files.map do |name|
27
27
  Thread.start {
28
- contents[name] = open("#{path_url}/#{name}").read
28
+ begin
29
+ url = "#{path_url}/#{name}"
30
+ contents[name] = URI.open(url).read
31
+ rescue Exception => e
32
+ log "Error downloading #{url}: #{e}"
33
+ exit 1
34
+ end
29
35
  WRITE_FILES_MUTEX.synchronize { write_cached_files path, name => contents[name] }
30
36
  }
31
37
  end.each(&:join)
@@ -62,7 +68,7 @@ class Updater
62
68
  File.read(cache_path, mode: 'rb')
63
69
  else
64
70
  log_http_get_file url, false
65
- content = open(url).read
71
+ content = URI.open(url).read
66
72
  File.open(cache_path, 'wb') { |f| f.write content }
67
73
  content
68
74
  end
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css