bootstrap 4.3.1 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +15 -1
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +1 -1
  5. data/assets/javascripts/bootstrap/alert.js +26 -35
  6. data/assets/javascripts/bootstrap/button.js +93 -52
  7. data/assets/javascripts/bootstrap/carousel.js +122 -120
  8. data/assets/javascripts/bootstrap/collapse.js +75 -71
  9. data/assets/javascripts/bootstrap/dropdown.js +143 -140
  10. data/assets/javascripts/bootstrap/modal.js +165 -134
  11. data/assets/javascripts/bootstrap/popover.js +47 -39
  12. data/assets/javascripts/bootstrap/scrollspy.js +71 -71
  13. data/assets/javascripts/bootstrap/tab.js +51 -60
  14. data/assets/javascripts/bootstrap/toast.js +84 -72
  15. data/assets/javascripts/bootstrap/tooltip.js +141 -131
  16. data/assets/javascripts/bootstrap/util.js +28 -7
  17. data/assets/javascripts/bootstrap-sprockets.js +6 -6
  18. data/assets/javascripts/bootstrap.js +811 -826
  19. data/assets/javascripts/bootstrap.min.js +3 -3
  20. data/assets/stylesheets/_bootstrap-grid.scss +3 -3
  21. data/assets/stylesheets/_bootstrap-reboot.scss +3 -3
  22. data/assets/stylesheets/_bootstrap.scss +3 -3
  23. data/assets/stylesheets/bootstrap/_badge.scss +1 -1
  24. data/assets/stylesheets/bootstrap/_breadcrumb.scss +4 -1
  25. data/assets/stylesheets/bootstrap/_button-group.scss +1 -1
  26. data/assets/stylesheets/bootstrap/_buttons.scss +13 -8
  27. data/assets/stylesheets/bootstrap/_card.scss +28 -35
  28. data/assets/stylesheets/bootstrap/_carousel.scss +6 -6
  29. data/assets/stylesheets/bootstrap/_close.scss +2 -3
  30. data/assets/stylesheets/bootstrap/_code.scss +1 -1
  31. data/assets/stylesheets/bootstrap/_custom-forms.scss +24 -9
  32. data/assets/stylesheets/bootstrap/_dropdown.scss +5 -4
  33. data/assets/stylesheets/bootstrap/_forms.scss +26 -9
  34. data/assets/stylesheets/bootstrap/_functions.scss +60 -5
  35. data/assets/stylesheets/bootstrap/_grid.scss +33 -8
  36. data/assets/stylesheets/bootstrap/_images.scss +2 -2
  37. data/assets/stylesheets/bootstrap/_input-group.scss +1 -2
  38. data/assets/stylesheets/bootstrap/_list-group.scss +36 -31
  39. data/assets/stylesheets/bootstrap/_mixins.scss +3 -3
  40. data/assets/stylesheets/bootstrap/_modal.scss +28 -16
  41. data/assets/stylesheets/bootstrap/_nav.scss +4 -3
  42. data/assets/stylesheets/bootstrap/_navbar.scss +45 -15
  43. data/assets/stylesheets/bootstrap/_pagination.scss +3 -2
  44. data/assets/stylesheets/bootstrap/_popover.scss +8 -9
  45. data/assets/stylesheets/bootstrap/_print.scss +2 -2
  46. data/assets/stylesheets/bootstrap/_progress.scss +6 -2
  47. data/assets/stylesheets/bootstrap/_reboot.scss +24 -27
  48. data/assets/stylesheets/bootstrap/_root.scss +1 -0
  49. data/assets/stylesheets/bootstrap/_spinners.scss +1 -0
  50. data/assets/stylesheets/bootstrap/_tables.scss +3 -3
  51. data/assets/stylesheets/bootstrap/_type.scss +2 -2
  52. data/assets/stylesheets/bootstrap/_utilities.scss +2 -1
  53. data/assets/stylesheets/bootstrap/_variables.scss +46 -22
  54. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +5 -3
  55. data/assets/stylesheets/bootstrap/mixins/_badge.scss +1 -1
  56. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +26 -13
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +11 -8
  58. data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -8
  59. data/assets/stylesheets/bootstrap/mixins/_float.scss +3 -3
  60. data/assets/stylesheets/bootstrap/mixins/_forms.scss +34 -49
  61. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +30 -15
  62. data/assets/stylesheets/bootstrap/mixins/_grid.scss +18 -0
  63. data/assets/stylesheets/bootstrap/mixins/_hover.scss +4 -4
  64. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -1
  65. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +1 -1
  66. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  67. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +2 -1
  68. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  69. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +3 -2
  70. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +1 -1
  71. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +3 -2
  72. data/assets/stylesheets/bootstrap/mixins/_transition.scss +17 -7
  73. data/assets/stylesheets/bootstrap/utilities/_background.scss +2 -2
  74. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +5 -0
  75. data/assets/stylesheets/bootstrap/utilities/_text.scss +3 -4
  76. data/bootstrap.gemspec +1 -1
  77. data/lib/bootstrap/version.rb +2 -2
  78. data/tasks/updater/network.rb +2 -2
  79. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  80. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  81. data/test/gemfiles/rails_6_0.gemfile +7 -0
  82. data/test/support/dummy_rails_integration.rb +3 -1
  83. data/test/test_helper.rb +18 -13
  84. metadata +11 -5
@@ -10,21 +10,36 @@
10
10
  //
11
11
  // Example usage: change the default blue border and shadow to white for better
12
12
  // contrast against a dark gray background.
13
- @mixin form-control-focus() {
13
+ @mixin form-control-focus($ignore-warning: false) {
14
14
  &:focus {
15
15
  color: $input-focus-color;
16
16
  background-color: $input-focus-bg;
17
17
  border-color: $input-focus-border-color;
18
18
  outline: 0;
19
- // Avoid using mixin so we can pass custom focus shadow properly
20
19
  @if $enable-shadows {
21
- box-shadow: $input-box-shadow, $input-focus-box-shadow;
20
+ @include box-shadow($input-box-shadow, $input-focus-box-shadow);
22
21
  } @else {
22
+ // Avoid using mixin so we can pass custom focus shadow properly
23
23
  box-shadow: $input-focus-box-shadow;
24
24
  }
25
25
  }
26
+ @include deprecate("The `form-control-focus()` mixin", "v4.4.0", "v5", $ignore-warning);
26
27
  }
27
28
 
29
+ // This mixin uses an `if()` technique to be compatible with Dart Sass
30
+ // See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details
31
+ @mixin form-validation-state-selector($state) {
32
+ @if ($state == "valid" or $state == "invalid") {
33
+ .was-validated #{if(&, "&", "")}:#{$state},
34
+ #{if(&, "&", "")}.is-#{$state} {
35
+ @content;
36
+ }
37
+ } @else {
38
+ #{if(&, "&", "")}.is-#{$state} {
39
+ @content;
40
+ }
41
+ }
42
+ }
28
43
 
29
44
  @mixin form-validation-state($state, $color, $icon) {
30
45
  .#{$state}-feedback {
@@ -50,16 +65,22 @@
50
65
  @include border-radius($form-feedback-tooltip-border-radius);
51
66
  }
52
67
 
68
+ @include form-validation-state-selector($state) {
69
+ ~ .#{$state}-feedback,
70
+ ~ .#{$state}-tooltip {
71
+ display: block;
72
+ }
73
+ }
74
+
53
75
  .form-control {
54
- .was-validated &:#{$state},
55
- &.is-#{$state} {
76
+ @include form-validation-state-selector($state) {
56
77
  border-color: $color;
57
78
 
58
79
  @if $enable-validation-icons {
59
80
  padding-right: $input-height-inner;
60
- background-image: $icon;
81
+ background-image: escape-svg($icon);
61
82
  background-repeat: no-repeat;
62
- background-position: center right $input-height-inner-quarter;
83
+ background-position: right $input-height-inner-quarter center;
63
84
  background-size: $input-height-inner-half $input-height-inner-half;
64
85
  }
65
86
 
@@ -67,18 +88,12 @@
67
88
  border-color: $color;
68
89
  box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
69
90
  }
70
-
71
- ~ .#{$state}-feedback,
72
- ~ .#{$state}-tooltip {
73
- display: block;
74
- }
75
91
  }
76
92
  }
77
93
 
78
94
  // stylelint-disable-next-line selector-no-qualifying-type
79
95
  textarea.form-control {
80
- .was-validated &:#{$state},
81
- &.is-#{$state} {
96
+ @include form-validation-state-selector($state) {
82
97
  @if $enable-validation-icons {
83
98
  padding-right: $input-height-inner;
84
99
  background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
@@ -87,41 +102,23 @@
87
102
  }
88
103
 
89
104
  .custom-select {
90
- .was-validated &:#{$state},
91
- &.is-#{$state} {
105
+ @include form-validation-state-selector($state) {
92
106
  border-color: $color;
93
107
 
94
108
  @if $enable-validation-icons {
95
109
  padding-right: $custom-select-feedback-icon-padding-right;
96
- background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;
110
+ background: $custom-select-background, escape-svg($icon) $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;
97
111
  }
98
112
 
99
113
  &:focus {
100
114
  border-color: $color;
101
115
  box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
102
116
  }
103
-
104
- ~ .#{$state}-feedback,
105
- ~ .#{$state}-tooltip {
106
- display: block;
107
- }
108
- }
109
- }
110
-
111
-
112
- .form-control-file {
113
- .was-validated &:#{$state},
114
- &.is-#{$state} {
115
- ~ .#{$state}-feedback,
116
- ~ .#{$state}-tooltip {
117
- display: block;
118
- }
119
117
  }
120
118
  }
121
119
 
122
120
  .form-check-input {
123
- .was-validated &:#{$state},
124
- &.is-#{$state} {
121
+ @include form-validation-state-selector($state) {
125
122
  ~ .form-check-label {
126
123
  color: $color;
127
124
  }
@@ -134,8 +131,7 @@
134
131
  }
135
132
 
136
133
  .custom-control-input {
137
- .was-validated &:#{$state},
138
- &.is-#{$state} {
134
+ @include form-validation-state-selector($state) {
139
135
  ~ .custom-control-label {
140
136
  color: $color;
141
137
 
@@ -144,11 +140,6 @@
144
140
  }
145
141
  }
146
142
 
147
- ~ .#{$state}-feedback,
148
- ~ .#{$state}-tooltip {
149
- display: block;
150
- }
151
-
152
143
  &:checked {
153
144
  ~ .custom-control-label::before {
154
145
  border-color: lighten($color, 10%);
@@ -170,17 +161,11 @@
170
161
 
171
162
  // custom file
172
163
  .custom-file-input {
173
- .was-validated &:#{$state},
174
- &.is-#{$state} {
164
+ @include form-validation-state-selector($state) {
175
165
  ~ .custom-file-label {
176
166
  border-color: $color;
177
167
  }
178
168
 
179
- ~ .#{$state}-feedback,
180
- ~ .#{$state}-tooltip {
181
- display: block;
182
- }
183
-
184
169
  &:focus {
185
170
  ~ .custom-file-label {
186
171
  border-color: $color;
@@ -15,12 +15,15 @@
15
15
  @each $breakpoint in map-keys($breakpoints) {
16
16
  $infix: breakpoint-infix($breakpoint, $breakpoints);
17
17
 
18
- // Allow columns to stretch full width below their breakpoints
19
- @for $i from 1 through $columns {
20
- .col#{$infix}-#{$i} {
21
- @extend %grid-column;
18
+ @if $columns > 0 {
19
+ // Allow columns to stretch full width below their breakpoints
20
+ @for $i from 1 through $columns {
21
+ .col#{$infix}-#{$i} {
22
+ @extend %grid-column;
23
+ }
22
24
  }
23
25
  }
26
+
24
27
  .col#{$infix},
25
28
  .col#{$infix}-auto {
26
29
  @extend %grid-column;
@@ -31,17 +34,27 @@
31
34
  .col#{$infix} {
32
35
  flex-basis: 0;
33
36
  flex-grow: 1;
37
+ min-width: 0; // See https://github.com/twbs/bootstrap/issues/25410
34
38
  max-width: 100%;
35
39
  }
40
+
41
+ @if $grid-row-columns > 0 {
42
+ @for $i from 1 through $grid-row-columns {
43
+ .row-cols#{$infix}-#{$i} {
44
+ @include row-cols($i);
45
+ }
46
+ }
47
+ }
48
+
36
49
  .col#{$infix}-auto {
37
- flex: 0 0 auto;
38
- width: auto;
39
- max-width: 100%; // Reset earlier grid tiers
50
+ @include make-col-auto();
40
51
  }
41
52
 
42
- @for $i from 1 through $columns {
43
- .col#{$infix}-#{$i} {
44
- @include make-col($i, $columns);
53
+ @if $columns > 0 {
54
+ @for $i from 1 through $columns {
55
+ .col#{$infix}-#{$i} {
56
+ @include make-col($i, $columns);
57
+ }
45
58
  }
46
59
  }
47
60
 
@@ -53,11 +66,13 @@
53
66
  .order#{$infix}-#{$i} { order: $i; }
54
67
  }
55
68
 
56
- // `$columns - 1` because offsetting by the width of an entire row isn't possible
57
- @for $i from 0 through ($columns - 1) {
58
- @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
59
- .offset#{$infix}-#{$i} {
60
- @include make-col-offset($i, $columns);
69
+ @if $columns > 0 {
70
+ // `$columns - 1` because offsetting by the width of an entire row isn't possible
71
+ @for $i from 0 through ($columns - 1) {
72
+ @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
73
+ .offset#{$infix}-#{$i} {
74
+ @include make-col-offset($i, $columns);
75
+ }
61
76
  }
62
77
  }
63
78
  }
@@ -45,7 +45,25 @@
45
45
  max-width: percentage($size / $columns);
46
46
  }
47
47
 
48
+ @mixin make-col-auto() {
49
+ flex: 0 0 auto;
50
+ width: auto;
51
+ max-width: 100%; // Reset earlier grid tiers
52
+ }
53
+
48
54
  @mixin make-col-offset($size, $columns: $grid-columns) {
49
55
  $num: $size / $columns;
50
56
  margin-left: if($num == 0, 0, percentage($num));
51
57
  }
58
+
59
+ // Row columns
60
+ //
61
+ // Specify on a parent element(e.g., .row) to force immediate children into NN
62
+ // numberof columns. Supports wrapping to new lines, but does not do a Masonry
63
+ // style grid.
64
+ @mixin row-cols($count) {
65
+ & > * {
66
+ flex: 0 0 100% / $count;
67
+ max-width: 100% / $count;
68
+ }
69
+ }
@@ -9,18 +9,18 @@
9
9
  //
10
10
  // Issue: https://github.com/twbs/bootstrap/issues/25195
11
11
 
12
- @mixin hover {
12
+ @mixin hover() {
13
13
  &:hover { @content; }
14
14
  }
15
15
 
16
- @mixin hover-focus {
16
+ @mixin hover-focus() {
17
17
  &:hover,
18
18
  &:focus {
19
19
  @content;
20
20
  }
21
21
  }
22
22
 
23
- @mixin plain-hover-focus {
23
+ @mixin plain-hover-focus() {
24
24
  &,
25
25
  &:hover,
26
26
  &:focus {
@@ -28,7 +28,7 @@
28
28
  }
29
29
  }
30
30
 
31
- @mixin hover-focus-active {
31
+ @mixin hover-focus-active() {
32
32
  &:hover,
33
33
  &:focus,
34
34
  &:active {
@@ -7,7 +7,7 @@
7
7
  //
8
8
  // Keep images from scaling beyond the width of their parents.
9
9
 
10
- @mixin img-fluid {
10
+ @mixin img-fluid() {
11
11
  // Part 1: Set a maximum relative to the parent
12
12
  max-width: 100%;
13
13
  // Part 2: Override the height to auto, otherwise images will be stretched
@@ -6,7 +6,7 @@
6
6
  background-color: $background;
7
7
 
8
8
  &.list-group-item-action {
9
- @include hover-focus {
9
+ @include hover-focus() {
10
10
  color: $color;
11
11
  background-color: darken($background, 5%);
12
12
  }
@@ -1,7 +1,7 @@
1
1
  // Lists
2
2
 
3
3
  // Unstyled keeps list items block level, just removes default browser padding and list-style
4
- @mixin list-unstyled {
4
+ @mixin list-unstyled() {
5
5
  padding-left: 0;
6
6
  list-style: none;
7
7
  }
@@ -2,9 +2,10 @@
2
2
  //
3
3
  // Dividers (basically an hr) within dropdowns and nav lists
4
4
 
5
- @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {
5
+ @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) {
6
6
  height: 0;
7
7
  margin: $margin-y 0;
8
8
  overflow: hidden;
9
9
  border-top: 1px solid $color;
10
+ @include deprecate("The `nav-divider()` mixin", "v4.4.0", "v5", $ignore-warning);
10
11
  }
@@ -1,4 +1,4 @@
1
- @mixin reset-text {
1
+ @mixin reset-text() {
2
2
  font-family: $font-family-base;
3
3
  // We deliberately do NOT reset font-size or word-wrap.
4
4
  font-style: normal;
@@ -3,11 +3,12 @@
3
3
  // See: https://a11yproject.com/posts/how-to-hide-content/
4
4
  // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
5
5
 
6
- @mixin sr-only {
6
+ @mixin sr-only() {
7
7
  position: absolute;
8
8
  width: 1px;
9
9
  height: 1px;
10
10
  padding: 0;
11
+ margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686
11
12
  overflow: hidden;
12
13
  clip: rect(0, 0, 0, 0);
13
14
  white-space: nowrap;
@@ -20,7 +21,7 @@
20
21
  //
21
22
  // Credit: HTML5 Boilerplate
22
23
 
23
- @mixin sr-only-focusable {
24
+ @mixin sr-only-focusable() {
24
25
  &:active,
25
26
  &:focus {
26
27
  position: static;
@@ -26,7 +26,7 @@
26
26
  $hover-background: darken($background, 5%);
27
27
 
28
28
  .table-#{$state} {
29
- @include hover {
29
+ @include hover() {
30
30
  background-color: $hover-background;
31
31
 
32
32
  > td,
@@ -2,15 +2,16 @@
2
2
 
3
3
  // Typography
4
4
 
5
- @mixin text-emphasis-variant($parent, $color) {
5
+ @mixin text-emphasis-variant($parent, $color, $ignore-warning: false) {
6
6
  #{$parent} {
7
7
  color: $color !important;
8
8
  }
9
9
  @if $emphasized-link-hover-darken-percentage != 0 {
10
10
  a#{$parent} {
11
- @include hover-focus {
11
+ @include hover-focus() {
12
12
  color: darken($color, $emphasized-link-hover-darken-percentage) !important;
13
13
  }
14
14
  }
15
15
  }
16
+ @include deprecate("`text-emphasis-variant()`", "v4.4.0", "v5", $ignore-warning);
16
17
  }
@@ -1,16 +1,26 @@
1
1
  // stylelint-disable property-blacklist
2
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
+
3
15
  @if $enable-transitions {
4
- @if length($transition) == 0 {
5
- transition: $transition-base;
6
- } @else {
16
+ @if nth($transition, 1) != null {
7
17
  transition: $transition;
8
18
  }
9
- }
10
19
 
11
- @if $enable-prefers-reduced-motion-media-query {
12
- @media (prefers-reduced-motion: reduce) {
13
- transition: none;
20
+ @if $enable-prefers-reduced-motion-media-query and nth($transition, 1) != null and nth($transition, 1) != none {
21
+ @media (prefers-reduced-motion: reduce) {
22
+ transition: none;
23
+ }
14
24
  }
15
25
  }
16
26
  }
@@ -1,12 +1,12 @@
1
1
  // stylelint-disable declaration-no-important
2
2
 
3
3
  @each $color, $value in $theme-colors {
4
- @include bg-variant(".bg-#{$color}", $value);
4
+ @include bg-variant(".bg-#{$color}", $value, true);
5
5
  }
6
6
 
7
7
  @if $enable-gradients {
8
8
  @each $color, $value in $theme-colors {
9
- @include bg-gradient-variant(".bg-gradient-#{$color}", $value);
9
+ @include bg-gradient-variant(".bg-gradient-#{$color}", $value, true);
10
10
  }
11
11
  }
12
12
 
@@ -0,0 +1,5 @@
1
+ // stylelint-disable declaration-no-important
2
+
3
+ @each $value in $user-selects {
4
+ .user-select-#{$value} { user-select: $value !important; }
5
+ }
@@ -11,7 +11,7 @@
11
11
  .text-justify { text-align: justify !important; }
12
12
  .text-wrap { white-space: normal !important; }
13
13
  .text-nowrap { white-space: nowrap !important; }
14
- .text-truncate { @include text-truncate; }
14
+ .text-truncate { @include text-truncate(); }
15
15
 
16
16
  // Responsive alignment
17
17
 
@@ -45,7 +45,7 @@
45
45
  .text-white { color: $white !important; }
46
46
 
47
47
  @each $color, $value in $theme-colors {
48
- @include text-emphasis-variant(".text-#{$color}", $value);
48
+ @include text-emphasis-variant(".text-#{$color}", $value, true);
49
49
  }
50
50
 
51
51
  .text-body { color: $body-color !important; }
@@ -63,8 +63,7 @@
63
63
  .text-decoration-none { text-decoration: none !important; }
64
64
 
65
65
  .text-break {
66
- word-break: break-word !important; // IE & < Edge 18
67
- overflow-wrap: break-word !important;
66
+ word-wrap: break-word !important;
68
67
  }
69
68
 
70
69
  // Reset
data/bootstrap.gemspec CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
  s.add_development_dependency 'term-ansicolor'
26
26
  # Integration testing
27
27
  s.add_development_dependency 'capybara', '>= 2.6.0'
28
- s.add_development_dependency 'poltergeist'
28
+ s.add_development_dependency 'cuprite'
29
29
  # Dummy Rails app dependencies
30
30
  s.add_development_dependency 'actionpack', '>= 4.1.5'
31
31
  s.add_development_dependency 'activesupport', '>= 4.1.5'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bootstrap
4
- VERSION = '4.3.1'
5
- BOOTSTRAP_SHA = '8fa0d3010112dca5dd6dd501173415856001ba8b'
4
+ VERSION = '4.5.0'
5
+ BOOTSTRAP_SHA = '7a6da5e3e7ad7c749dde806546a35d4d4259d965'
6
6
  end
@@ -25,7 +25,7 @@ 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
+ contents[name] = URI.open("#{path_url}/#{name}").read
29
29
  WRITE_FILES_MUTEX.synchronize { write_cached_files path, name => contents[name] }
30
30
  }
31
31
  end.each(&:join)
@@ -62,7 +62,7 @@ class Updater
62
62
  File.read(cache_path, mode: 'rb')
63
63
  else
64
64
  log_http_get_file url, false
65
- content = open(url).read
65
+ content = URI.open(url).read
66
66
  File.open(cache_path, 'wb') { |f| f.write content }
67
67
  content
68
68
  end
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -0,0 +1 @@
1
+ Chrome >= 25
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'actionpack', '~> 6.0.3'
4
+ gem 'activesupport', '~> 6.0.3'
5
+ gem 'autoprefixer-rails', '>= 9.7.6'
6
+
7
+ gemspec path: '../../'
@@ -17,7 +17,9 @@ module DummyRailsIntegration
17
17
 
18
18
  def screenshot!
19
19
  path = "tmp/#{name}.png"
20
- page.driver.render(File.join(GEM_PATH, path), full: true)
20
+ full_path = File.join(GEM_PATH, path)
21
+ FileUtils.mkdir_p(File.dirname(full_path))
22
+ page.driver.render(full_path, full: true)
21
23
  STDERR.puts "Screenshot saved to #{path}"
22
24
  end
23
25
 
data/test/test_helper.rb CHANGED
@@ -12,24 +12,29 @@ end
12
12
 
13
13
  GEM_PATH = File.expand_path('../', File.dirname(__FILE__))
14
14
 
15
- #= Capybara + Poltergeist
16
- require 'capybara/poltergeist'
17
-
18
- Capybara.register_driver :poltergeist do |app|
19
- Capybara::Poltergeist::Driver.new(
20
- app,
21
- # inspector: '/Applications/Chromium.app/Contents/MacOS/Chromium', # open in inspector: page.driver.debug
22
- window_size: [1280, 1024],
23
- timeout: 90,
24
- js_errors: true
25
- )
15
+ #= Capybara
16
+ require 'capybara/cuprite'
17
+
18
+ browser_path = ENV['CHROMIUM_BIN'] || %w[
19
+ /usr/bin/chromium-browser
20
+ /snap/bin/chromium
21
+ /Applications/Chromium.app/Contents/MacOS/Chromium
22
+ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
23
+ ].find { |path| File.executable?(path) }
24
+
25
+ Capybara.register_driver :cuprite do |app|
26
+ options = {
27
+ window_size: [1280, 1024]
28
+ }
29
+ options[:browser_path] = browser_path if browser_path
30
+ Capybara::Cuprite::Driver.new(app, options)
26
31
  end
27
32
 
28
33
  Capybara.configure do |config|
29
34
  config.server = :webrick
30
35
  config.app_host = 'http://localhost:7000'
31
- config.default_driver = :poltergeist
32
- config.javascript_driver = :poltergeist
36
+ config.default_driver = :cuprite
37
+ config.javascript_driver = :cuprite
33
38
  config.server_port = 7000
34
39
  config.default_max_wait_time = 10
35
40
  end