bootstrap-sass 3.2.0.4 → 3.3.0.0

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

Potentially problematic release.


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

Files changed (81) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -1
  3. data/.travis.yml +8 -2
  4. data/CHANGELOG.md +7 -0
  5. data/CONTRIBUTING.md +1 -1
  6. data/README.md +29 -6
  7. data/Rakefile +3 -4
  8. data/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +1 -1
  9. data/assets/javascripts/bootstrap.js +329 -176
  10. data/assets/javascripts/bootstrap/affix.js +43 -23
  11. data/assets/javascripts/bootstrap/alert.js +6 -4
  12. data/assets/javascripts/bootstrap/button.js +16 -10
  13. data/assets/javascripts/bootstrap/carousel.js +26 -10
  14. data/assets/javascripts/bootstrap/collapse.js +69 -28
  15. data/assets/javascripts/bootstrap/dropdown.js +20 -10
  16. data/assets/javascripts/bootstrap/modal.js +22 -21
  17. data/assets/javascripts/bootstrap/popover.js +13 -7
  18. data/assets/javascripts/bootstrap/scrollspy.js +12 -7
  19. data/assets/javascripts/bootstrap/tab.js +41 -16
  20. data/assets/javascripts/bootstrap/tooltip.js +60 -39
  21. data/assets/javascripts/bootstrap/transition.js +1 -1
  22. data/assets/stylesheets/bootstrap/_button-groups.scss +18 -11
  23. data/assets/stylesheets/bootstrap/_buttons.scss +8 -5
  24. data/assets/stylesheets/bootstrap/_carousel.scss +25 -1
  25. data/assets/stylesheets/bootstrap/_code.scss +1 -0
  26. data/assets/stylesheets/bootstrap/_component-animations.scss +5 -2
  27. data/assets/stylesheets/bootstrap/_dropdowns.scss +4 -6
  28. data/assets/stylesheets/bootstrap/_forms.scss +51 -28
  29. data/assets/stylesheets/bootstrap/_glyphicons.scss +2 -5
  30. data/assets/stylesheets/bootstrap/_grid.scss +4 -4
  31. data/assets/stylesheets/bootstrap/_jumbotron.scss +4 -4
  32. data/assets/stylesheets/bootstrap/_list-group.scss +1 -0
  33. data/assets/stylesheets/bootstrap/_media.scss +27 -36
  34. data/assets/stylesheets/bootstrap/_modals.scss +3 -4
  35. data/assets/stylesheets/bootstrap/_navbar.scss +35 -33
  36. data/assets/stylesheets/bootstrap/_navs.scss +5 -3
  37. data/assets/stylesheets/bootstrap/_normalize.scss +5 -3
  38. data/assets/stylesheets/bootstrap/_pager.scss +2 -3
  39. data/assets/stylesheets/bootstrap/_pagination.scss +1 -1
  40. data/assets/stylesheets/bootstrap/_panels.scss +22 -4
  41. data/assets/stylesheets/bootstrap/_popovers.scss +5 -4
  42. data/assets/stylesheets/bootstrap/_print.scss +102 -96
  43. data/assets/stylesheets/bootstrap/_progress-bars.scss +2 -20
  44. data/assets/stylesheets/bootstrap/_responsive-embed.scss +2 -1
  45. data/assets/stylesheets/bootstrap/_scaffolding.scss +3 -3
  46. data/assets/stylesheets/bootstrap/_tables.scss +11 -10
  47. data/assets/stylesheets/bootstrap/_theme.scss +16 -14
  48. data/assets/stylesheets/bootstrap/_thumbnails.scss +2 -2
  49. data/assets/stylesheets/bootstrap/_type.scss +10 -16
  50. data/assets/stylesheets/bootstrap/_utilities.scss +3 -4
  51. data/assets/stylesheets/bootstrap/_variables.scss +29 -19
  52. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +2 -0
  53. data/assets/stylesheets/bootstrap/mixins/_forms.scss +5 -1
  54. data/assets/stylesheets/bootstrap/mixins/_grid.scss +2 -2
  55. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +1 -1
  56. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -1
  57. data/assets/stylesheets/bootstrap/mixins/_labels.scss +1 -1
  58. data/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +1 -1
  59. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +6 -3
  60. data/lib/bootstrap-sass.rb +2 -5
  61. data/lib/bootstrap-sass/engine.rb +1 -1
  62. data/lib/bootstrap-sass/version.rb +2 -2
  63. data/package.json +3 -3
  64. data/tasks/converter/less_conversion.rb +60 -28
  65. data/tasks/converter/network.rb +12 -6
  66. data/templates/project/_bootstrap-variables.sass +866 -0
  67. data/templates/project/manifest.rb +5 -11
  68. data/test/node_sass_compile_test.sh +8 -0
  69. metadata +7 -28
  70. data/templates/project/_bootstrap-variables.sass.erb +0 -4
  71. data/test/dummy_rails/bin/bundle +0 -3
  72. data/test/dummy_rails/bin/rails +0 -4
  73. data/test/dummy_rails/bin/rake +0 -4
  74. data/test/dummy_rails/db/test.sqlite3 +0 -0
  75. data/test/dummy_rails/lib/assets/.keep +0 -0
  76. data/test/dummy_rails/public/404.html +0 -58
  77. data/test/dummy_rails/public/422.html +0 -58
  78. data/test/dummy_rails/public/500.html +0 -57
  79. data/test/dummy_rails/public/favicon.ico +0 -0
  80. data/test/node_sass_test.rb +0 -16
  81. data/test/support/integration_test.rb +0 -22
@@ -12,11 +12,11 @@
12
12
  background-color: $thumbnail-bg;
13
13
  border: 1px solid $thumbnail-border;
14
14
  border-radius: $thumbnail-border-radius;
15
- @include transition(all .2s ease-in-out);
15
+ @include transition(border .2s ease-in-out);
16
16
 
17
17
  > img,
18
18
  a > img {
19
- @include img-responsive();
19
+ @include img-responsive;
20
20
  margin-left: auto;
21
21
  margin-right: auto;
22
22
  }
@@ -80,11 +80,6 @@ small,
80
80
  font-size: floor((100% * $font-size-small / $font-size-base));
81
81
  }
82
82
 
83
- // Undo browser default styling
84
- cite {
85
- font-style: normal;
86
- }
87
-
88
83
  mark,
89
84
  .mark {
90
85
  background-color: $state-warning-bg;
@@ -163,15 +158,20 @@ ol {
163
158
 
164
159
  // List options
165
160
 
166
- // Unstyled keeps list items block level, just removes default browser padding and list-style
167
- .list-unstyled {
161
+ // [converter] extracted from `.list-unstyled` for libsass compatibility
162
+ @mixin list-unstyled {
168
163
  padding-left: 0;
169
164
  list-style: none;
170
165
  }
166
+ // [converter] extracted as `@mixin list-unstyled` for libsass compatibility
167
+ .list-unstyled {
168
+ @include list-unstyled;
169
+ }
170
+
171
171
 
172
172
  // Inline turns list items into inline-block
173
173
  .list-inline {
174
- @extend .list-unstyled;
174
+ @include list-unstyled;
175
175
  margin-left: -5px;
176
176
 
177
177
  > li {
@@ -204,7 +204,7 @@ dd {
204
204
 
205
205
  .dl-horizontal {
206
206
  dd {
207
- @include clearfix(); // Clear the floated `dt` if an empty `dd` is present
207
+ @include clearfix; // Clear the floated `dt` if an empty `dd` is present
208
208
  }
209
209
 
210
210
  @media (min-width: $grid-float-breakpoint) {
@@ -213,7 +213,7 @@ dd {
213
213
  width: ($dl-horizontal-offset - 20);
214
214
  clear: left;
215
215
  text-align: right;
216
- @include text-overflow();
216
+ @include text-overflow;
217
217
  }
218
218
  dd {
219
219
  margin-left: $dl-horizontal-offset;
@@ -290,12 +290,6 @@ blockquote.pull-right {
290
290
  }
291
291
  }
292
292
 
293
- // Quotes
294
- blockquote:before,
295
- blockquote:after {
296
- content: "";
297
- }
298
-
299
293
  // Addresses
300
294
  address {
301
295
  margin-bottom: $line-height-computed;
@@ -7,10 +7,10 @@
7
7
  // -------------------------
8
8
 
9
9
  .clearfix {
10
- @include clearfix();
10
+ @include clearfix;
11
11
  }
12
12
  .center-block {
13
- @include center-block();
13
+ @include center-block;
14
14
  }
15
15
  .pull-right {
16
16
  float: right !important;
@@ -34,7 +34,7 @@
34
34
  visibility: hidden;
35
35
  }
36
36
  .text-hide {
37
- @include text-hide();
37
+ @include text-hide;
38
38
  }
39
39
 
40
40
 
@@ -53,5 +53,4 @@
53
53
 
54
54
  .affix {
55
55
  position: fixed;
56
- @include translate3d(0, 0, 0);
57
56
  }
@@ -12,11 +12,12 @@ $bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")
12
12
  //
13
13
  //## Gray and brand colors for use across Bootstrap.
14
14
 
15
- $gray-darker: lighten(#000, 13.5%) !default; // #222
16
- $gray-dark: lighten(#000, 20%) !default; // #333
17
- $gray: lighten(#000, 33.5%) !default; // #555
18
- $gray-light: lighten(#000, 46.7%) !default; // #777
19
- $gray-lighter: lighten(#000, 93.5%) !default; // #eee
15
+ $gray-base: #000 !default;
16
+ $gray-darker: lighten($gray-base, 13.5%) !default; // #222
17
+ $gray-dark: lighten($gray-base, 20%) !default; // #333
18
+ $gray: lighten($gray-base, 33.5%) !default; // #555
19
+ $gray-light: lighten($gray-base, 46.7%) !default; // #777
20
+ $gray-lighter: lighten($gray-base, 93.5%) !default; // #eee
20
21
 
21
22
  $brand-primary: #428bca !default;
22
23
  $brand-success: #5cb85c !default;
@@ -38,6 +39,8 @@ $text-color: $gray-dark !default;
38
39
  $link-color: $brand-primary !default;
39
40
  //** Link hover color set via `darken()` function.
40
41
  $link-hover-color: darken($link-color, 15%) !default;
42
+ //** Link hover decoration.
43
+ $link-hover-decoration: underline !default;
41
44
 
42
45
 
43
46
  //== Typography
@@ -189,13 +192,20 @@ $input-bg-disabled: $gray-lighter !default;
189
192
  $input-color: $gray !default;
190
193
  //** `<input>` border color
191
194
  $input-border: #ccc !default;
192
- //** `<input>` border radius
195
+
196
+ // TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
197
+ //** Default `.form-control` border radius
193
198
  $input-border-radius: $border-radius-base !default;
199
+ //** Large `.form-control` border radius
200
+ $input-border-radius-large: $border-radius-large !default;
201
+ //** Small `.form-control` border radius
202
+ $input-border-radius-small: $border-radius-small !default;
203
+
194
204
  //** Border color for inputs on focus
195
205
  $input-border-focus: #66afe9 !default;
196
206
 
197
207
  //** Placeholder text color
198
- $input-color-placeholder: $gray-light !default;
208
+ $input-color-placeholder: #999 !default;
199
209
 
200
210
  //** Default `.form-control` height
201
211
  $input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
@@ -212,6 +222,9 @@ $input-group-addon-bg: $gray-lighter !default;
212
222
  //** Border color for textual input addons
213
223
  $input-group-addon-border-color: $input-border !default;
214
224
 
225
+ //** Disabled cursor for form controls and buttons.
226
+ $cursor-disabled: not-allowed !default;
227
+
215
228
 
216
229
  //== Dropdowns
217
230
  //
@@ -260,8 +273,7 @@ $zindex-dropdown: 1000 !default;
260
273
  $zindex-popover: 1060 !default;
261
274
  $zindex-tooltip: 1070 !default;
262
275
  $zindex-navbar-fixed: 1030 !default;
263
- $zindex-modal-background: 1040 !default;
264
- $zindex-modal: 1050 !default;
276
+ $zindex-modal: 1040 !default;
265
277
 
266
278
 
267
279
  //== Media queries breakpoints
@@ -323,17 +335,17 @@ $grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
323
335
  //## Define the maximum width of `.container` for different screen sizes.
324
336
 
325
337
  // Small screen / tablet
326
- $container-tablet: ((720px + $grid-gutter-width)) !default;
338
+ $container-tablet: (720px + $grid-gutter-width) !default;
327
339
  //** For `$screen-sm-min` and up.
328
340
  $container-sm: $container-tablet !default;
329
341
 
330
342
  // Medium screen / desktop
331
- $container-desktop: ((940px + $grid-gutter-width)) !default;
343
+ $container-desktop: (940px + $grid-gutter-width) !default;
332
344
  //** For `$screen-md-min` and up.
333
345
  $container-md: $container-desktop !default;
334
346
 
335
347
  // Large screen / wide desktop
336
- $container-large-desktop: ((1140px + $grid-gutter-width)) !default;
348
+ $container-large-desktop: (1140px + $grid-gutter-width) !default;
337
349
  //** For `$screen-lg-min` and up.
338
350
  $container-lg: $container-large-desktop !default;
339
351
 
@@ -376,12 +388,12 @@ $navbar-default-toggle-border-color: #ddd !default;
376
388
 
377
389
  // Inverted navbar
378
390
  // Reset inverted navbar basics
379
- $navbar-inverse-color: $gray-light !default;
391
+ $navbar-inverse-color: lighten($gray-light, 15%) !default;
380
392
  $navbar-inverse-bg: #222 !default;
381
393
  $navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
382
394
 
383
395
  // Inverted navbar links
384
- $navbar-inverse-link-color: $gray-light !default;
396
+ $navbar-inverse-link-color: lighten($gray-light, 15%) !default;
385
397
  $navbar-inverse-link-hover-color: #fff !default;
386
398
  $navbar-inverse-link-hover-bg: transparent !default;
387
399
  $navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
@@ -411,8 +423,6 @@ $nav-link-hover-bg: $gray-lighter !default;
411
423
  $nav-disabled-link-color: $gray-light !default;
412
424
  $nav-disabled-link-hover-color: $gray-light !default;
413
425
 
414
- $nav-open-link-hover-color: #fff !default;
415
-
416
426
  //== Tabs
417
427
  $nav-tabs-border-color: #ddd !default;
418
428
 
@@ -537,7 +547,7 @@ $popover-title-bg: darken($popover-bg, 3%) !default;
537
547
  //** Popover arrow width
538
548
  $popover-arrow-width: 10px !default;
539
549
  //** Popover arrow color
540
- $popover-arrow-color: #fff !default;
550
+ $popover-arrow-color: $popover-bg !default;
541
551
 
542
552
  //** Popover outer arrow width
543
553
  $popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
@@ -636,6 +646,8 @@ $alert-danger-border: $state-danger-border !default;
636
646
  $progress-bg: #f5f5f5 !default;
637
647
  //** Progress bar text color
638
648
  $progress-bar-color: #fff !default;
649
+ //** Variable for setting rounded corners on progress bar.
650
+ $progress-border-radius: $border-radius-base !default;
639
651
 
640
652
  //** Default progress bar color
641
653
  $progress-bar-bg: $brand-primary !default;
@@ -850,5 +862,3 @@ $page-header-border-color: $gray-lighter !default;
850
862
  $dl-horizontal-offset: $component-offset-horizontal !default;
851
863
  //** Horizontal line color.
852
864
  $hr-border: $gray-lighter !default;
853
-
854
-
@@ -10,6 +10,7 @@
10
10
 
11
11
  &:hover,
12
12
  &:focus,
13
+ &.focus,
13
14
  &:active,
14
15
  &.active,
15
16
  .open > &.dropdown-toggle {
@@ -28,6 +29,7 @@
28
29
  &,
29
30
  &:hover,
30
31
  &:focus,
32
+ &.focus,
31
33
  &:active,
32
34
  &.active {
33
35
  background-color: $background;
@@ -10,7 +10,11 @@
10
10
  .radio,
11
11
  .checkbox,
12
12
  .radio-inline,
13
- .checkbox-inline {
13
+ .checkbox-inline,
14
+ &.radio label,
15
+ &.checkbox label,
16
+ &.radio-inline label,
17
+ &.checkbox-inline label {
14
18
  color: $text-color;
15
19
  }
16
20
  // Set the border and box shadow on specific inputs to match
@@ -8,14 +8,14 @@
8
8
  margin-left: auto;
9
9
  padding-left: ($gutter / 2);
10
10
  padding-right: ($gutter / 2);
11
- @include clearfix();
11
+ @include clearfix;
12
12
  }
13
13
 
14
14
  // Creates a wrapper for a series of columns
15
15
  @mixin make-row($gutter: $grid-gutter-width) {
16
16
  margin-left: ($gutter / -2);
17
17
  margin-right: ($gutter / -2);
18
- @include clearfix();
18
+ @include clearfix;
19
19
  }
20
20
 
21
21
  // Generate the extra small columns
@@ -17,5 +17,5 @@
17
17
 
18
18
  // New mixin to use as of v3.0.1
19
19
  @mixin text-hide() {
20
- @include hide-text();
20
+ @include hide-text;
21
21
  }
@@ -8,7 +8,6 @@
8
8
  // Keep images from scaling beyond the width of their parents.
9
9
  @mixin img-responsive($display: block) {
10
10
  display: $display;
11
- width: 100% \9; // Force IE10 and below to size SVG images correctly
12
11
  max-width: 100%; // Part 1: Set a maximum relative to the parent
13
12
  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
14
13
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  @mixin label-variant($color) {
4
4
  background-color: $color;
5
-
5
+
6
6
  &[href] {
7
7
  &:hover,
8
8
  &:focus {
@@ -5,6 +5,6 @@
5
5
 
6
6
  // Deprecated parent class requirement as of v3.2.0
7
7
  .progress-striped & {
8
- @include gradient-striped();
8
+ @include gradient-striped;
9
9
  }
10
10
  }
@@ -99,9 +99,12 @@
99
99
 
100
100
  // Placeholder text
101
101
  @mixin placeholder($color: $input-color-placeholder) {
102
- &::-moz-placeholder { color: $color; // Firefox
103
- opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
104
- &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
102
+ // Firefox
103
+ &::-moz-placeholder {
104
+ color: $color;
105
+ opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526
106
+ }
107
+ &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
105
108
  &::-webkit-input-placeholder { color: $color; } // Safari and Chrome
106
109
  }
107
110
 
@@ -3,11 +3,7 @@ module Bootstrap
3
3
  # Inspired by Kaminari
4
4
  def load!
5
5
  register_compass_extension if compass?
6
-
7
- if rails?
8
- register_rails_engine
9
- end
10
-
6
+ register_rails_engine if rails?
11
7
  configure_sass
12
8
  end
13
9
 
@@ -59,6 +55,7 @@ module Bootstrap
59
55
  def register_compass_extension
60
56
  ::Compass::Frameworks.register(
61
57
  'bootstrap',
58
+ :version => Bootstrap::VERSION,
62
59
  :path => gem_path,
63
60
  :stylesheets_directory => stylesheets_path,
64
61
  :templates_directory => File.join(gem_path, 'templates')
@@ -3,7 +3,7 @@ module Bootstrap
3
3
  class Engine < ::Rails::Engine
4
4
  initializer 'bootstrap-sass.assets.precompile' do |app|
5
5
  %w(stylesheets javascripts fonts images).each do |sub|
6
- app.config.assets.paths << root.join('assets', sub)
6
+ app.config.assets.paths << root.join('assets', sub).to_s
7
7
  end
8
8
  app.config.assets.precompile << %r(bootstrap/glyphicons-halflings-regular\.(?:eot|svg|ttf|woff)$)
9
9
  end
@@ -1,4 +1,4 @@
1
1
  module Bootstrap
2
- VERSION = '3.2.0.4'
3
- BOOTSTRAP_SHA = 'c068162161154a4b85110ea1e7dd3d7897ce2b72'
2
+ VERSION = '3.3.0.0'
3
+ BOOTSTRAP_SHA = '16dbdbd7a2c6cfa3be4e5dcc52249e577c02c84a'
4
4
  end
@@ -23,8 +23,8 @@
23
23
  "url": "https://github.com/twbs/bootstrap-sass/issues"
24
24
  },
25
25
  "devDependencies": {
26
- "node-sass": "*",
27
- "mincer": "*",
28
- "ejs": "*"
26
+ "node-sass": "~1.0",
27
+ "mincer": "~1.1",
28
+ "ejs": "~1.0"
29
29
  }
30
30
  }
@@ -22,7 +22,7 @@ class Converter
22
22
  # match any brace that opens or closes a properties body
23
23
  BRACE_RE = /#{RULE_OPEN_BRACE_RE}|#{RULE_CLOSE_BRACE_RE}/m
24
24
  BRACE_RE_REVERSE = /#{RULE_OPEN_BRACE_RE_REVERSE}|#{RULE_CLOSE_BRACE_RE_REVERSE}/m
25
- # valid
25
+ # valid characters in mixin definitions
26
26
  SCSS_MIXIN_DEF_ARGS_RE = /[\w\-,\s$:#%()]*/
27
27
  LESS_MIXIN_DEF_ARGS_RE = /[\w\-,;.\s@:#%()]*/
28
28
 
@@ -31,27 +31,34 @@ class Converter
31
31
 
32
32
  # These mixins will get vararg definitions in SCSS (not supported by LESS):
33
33
  VARARG_MIXINS = %w(
34
- scale transition transition-duration transition-property transition-transform box-shadow
35
- )
34
+ scale transition transition-duration transition-property transition-transform box-shadow
35
+ )
36
+
37
+ # A list of classes that will be extracted into mixins
38
+ # Only the top-level selectors of form .CLASS { ... } are extracted. CLASS must not be used in any other rule definition.
39
+ # This is a work-around for libsass @extend issues
40
+ CLASSES_TO_MIXINS = %w(
41
+ list-unstyled form-inline
42
+ )
36
43
 
37
44
  # Convert a snippet of bootstrap LESS to Scss
38
45
  def convert_less(less)
39
- load_shared
40
46
  less = convert_to_scss(less)
41
47
  less = yield(less) if block_given?
42
48
  less
43
49
  end
44
50
 
45
- def load_shared
51
+ def shared_mixins
46
52
  @shared_mixins ||= begin
47
53
  log_status ' Reading shared mixins from mixins.less'
48
- read_mixins read_files('less', bootstrap_less_files.grep(/mixins\//)).values.join("\n"), nested: NESTED_MIXINS
54
+ CLASSES_TO_MIXINS + read_mixins(read_files('less', bootstrap_less_files.grep(/mixins\//)).values.join("\n"),
55
+ nested: NESTED_MIXINS)
49
56
  end
50
57
  end
51
58
 
52
59
  def process_stylesheet_assets
53
60
  log_status 'Processing stylesheets...'
54
- files = read_files('less', bootstrap_less_files)
61
+ files = read_files('less', bootstrap_less_files)
55
62
  save_to = @save_to[:scss]
56
63
 
57
64
  log_status ' Converting LESS files to Scss:'
@@ -94,7 +101,7 @@ class Converter
94
101
  // NB: in Sass 3.3 there is a native function: function-exists(twbs-font-path)
95
102
  $bootstrap-sass-asset-helper: #{sass_fn_exists('twbs-font-path')} !default;
96
103
  SCSS
97
- file = replace_all file, %r{(\$icon-font-path): \s*"(.*)" (!default);}, "\n" + unindent(<<-SCSS, 14)
104
+ file = replace_all file, %r{(\$icon-font-path): \s*"(.*)" (!default);}, "\n" + unindent(<<-SCSS, 14)
98
105
  // [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
99
106
  \\1: if($bootstrap-sass-asset-helper, "bootstrap/", "\\2bootstrap/") \\3;
100
107
  SCSS
@@ -114,7 +121,6 @@ class Converter
114
121
  when 'thumbnails.less', 'labels.less', 'badges.less'
115
122
  file = extract_nested_rule file, 'a&'
116
123
  when 'glyphicons.less'
117
- file = bootstrap_font_files.map { |p| %Q(//= depend_on "bootstrap/#{File.basename(p)}") } * "\n" + "\n" + file
118
124
  file = replace_rules(file, '@font-face') { |rule|
119
125
  rule = replace_all rule, /(\$icon-font(?:-\w+)+)/, '#{\1}'
120
126
  replace_asset_url rule, :font
@@ -136,6 +142,11 @@ class Converter
136
142
  main_to = File.expand_path("#{save_to}/../_bootstrap.scss")
137
143
  save_file main_to, File.read(main_from).gsub(/ "/, ' "bootstrap/')
138
144
  File.delete(main_from)
145
+
146
+ # generate variables template
147
+ save_file 'templates/project/_bootstrap-variables.sass',
148
+ "// Override Bootstrap variables here (defaults from bootstrap-sass v<%= Bootstrap::VERSION %>):\n\n" +
149
+ File.read("#{save_to}/_variables.scss").gsub(/^(?=\$)/, '// ').gsub(/ !default;/, '')
139
150
  end
140
151
 
141
152
  def bootstrap_less_files
@@ -147,10 +158,11 @@ class Converter
147
158
  # apply general less to scss conversion
148
159
  def convert_to_scss(file)
149
160
  # get local mixin names before converting the definitions
150
- mixins = @shared_mixins + read_mixins(file)
161
+ mixins = shared_mixins + read_mixins(file)
151
162
  file = replace_vars(file)
152
163
  file = replace_mixin_definitions(file)
153
164
  file = replace_mixins(file, mixins)
165
+ file = extract_mixins_from_selectors(file, CLASSES_TO_MIXINS.inject({}) { |h, cl| h.update(".#{cl}" => cl) })
154
166
  file = replace_spin(file)
155
167
  file = replace_fadein(file)
156
168
  file = replace_image_urls(file)
@@ -371,7 +383,7 @@ SASS
371
383
  sel = parent_sel + sel[1..-1]
372
384
  end
373
385
  # unwrap, and replace @include
374
- unindent unwrap_rule_block(rule).gsub(/(@include [\w-]+)\(([\$\w\-,\s]*)\)/) {
386
+ unindent unwrap_rule_block(rule).gsub(/(@include [\w-]+)\(?([\$\w\-,\s]*)\)?/) {
375
387
  args = $2
376
388
  "#{cmt}#{$1}('#{sel.gsub(/\s+/, ' ')}'#{', ' if args && !args.empty?}#{args})"
377
389
  }
@@ -388,6 +400,25 @@ SASS
388
400
  end
389
401
  end
390
402
 
403
+ # .btn { ... } -> @mixin btn { ... }; .btn { @include btn }
404
+ def extract_mixins_from_selectors(file, selectors_to_mixins)
405
+ selectors_to_mixins.each do |selector, mixin|
406
+ file = replace_rules file, Regexp.escape(selector), prefix: false do |selector_css|
407
+ log_transform "#{selector} { ... } -> @mixin #{mixin} { ... }; #{selector} { @include #{mixin} } ", from: 'extract_mixins_from_selectors'
408
+ <<-SCSS
409
+ // [converter] extracted from `#{selector}` for libsass compatibility
410
+ @mixin #{mixin} {#{unwrap_rule_block(selector_css)}
411
+ }
412
+ // [converter] extracted as `@mixin #{mixin}` for libsass compatibility
413
+ #{selector} {
414
+ @include #{mixin};
415
+ }
416
+ SCSS
417
+ end
418
+ end
419
+ file
420
+ end
421
+
391
422
  # @include and @extend from LESS:
392
423
  # .mixin() -> @include mixin()
393
424
  # #scope > .mixin() -> @include scope-mixin()
@@ -396,14 +427,11 @@ SASS
396
427
  mixin_pattern = /(\s+)(([#|\.][\w-]+\s*>\s*)*)\.([\w-]+\(.*\))(?!\s\{)/
397
428
 
398
429
  less = less.gsub(mixin_pattern) do |match|
399
- matches = match.scan(mixin_pattern).flatten
400
- scope = matches[1] || ''
401
- if scope != ''
402
- scope = scope.scan(/[\w-]+/).join('-') + '-'
403
- end
430
+ matches = match.scan(mixin_pattern).flatten
431
+ scope = matches[1] && matches[1] != '' ? matches[1].scan(/[\w-]+/).join('-') + '-' : ''
404
432
  mixin_name = match.scan(/\.([\w-]+)\(.*\)\s?\{?/).first
405
433
  if mixin_name && mixin_names.include?("#{scope}#{mixin_name.first}")
406
- "#{matches.first}@include #{scope}#{matches.last}".gsub(/; \$/, ", $").sub(/;\)$/, ')')
434
+ "#{matches.first}@include #{scope}#{matches.last.gsub(/;\s*\$/, ', $').sub(/;\)$/, ')').sub(/\(\)$/, '')}"
407
435
  else
408
436
  "#{matches.first}@extend .#{scope}#{matches.last.gsub(/\(\)/, '')}"
409
437
  end
@@ -414,7 +442,7 @@ SASS
414
442
  selector =~ /\.([\w-]+)/
415
443
  mixin = $1
416
444
  if mixin && mixin_names.include?(mixin)
417
- "@include #{mixin}()"
445
+ "@include #{mixin}"
418
446
  else
419
447
  "@extend #{selector}"
420
448
  end
@@ -548,16 +576,20 @@ SASS
548
576
  # option :comments -- include immediately preceding comments in rule_block
549
577
  #
550
578
  # replace_rules(".a{ \n .b{} }", '.b') { |rule, pos| ">#{rule}<" } #=> ".a{ \n >.b{}< }"
551
- def replace_rules(less, rule_prefix = SELECTOR_RE, options = {}, &block)
552
- options = {comments: true}.merge(options || {})
553
- less = less.dup
554
- s = CharStringScanner.new(less)
555
- rule_re = /(?:#{rule_prefix}[#{SELECTOR_CHAR})=(\s]*?#{RULE_OPEN_BRACE_RE})/
556
- if options[:comments]
557
- rule_start_re = /(?:#{COMMENT_RE}*)^#{rule_re}/
558
- else
559
- rule_start_re = /^#{rule_re}/
560
- end
579
+ def replace_rules(less, selector = SELECTOR_RE, options = {}, &block)
580
+ options = {prefix: true, comments: true}.merge(options || {})
581
+ less = less.dup
582
+ s = CharStringScanner.new(less)
583
+ rule_re = if options[:prefix]
584
+ /(?:#{selector}[#{SELECTOR_CHAR})=(\s]*?#{RULE_OPEN_BRACE_RE})/
585
+ else
586
+ /#{selector}[\s]*#{RULE_OPEN_BRACE_RE}/
587
+ end
588
+ rule_start_re = if options[:comments]
589
+ /(?:#{COMMENT_RE}*)^#{rule_re}/
590
+ else
591
+ /^#{rule_re}/
592
+ end
561
593
 
562
594
  positions = []
563
595
  while (rule_start = s.scan_next(rule_start_re))