_breakpoints.scss 3.05 KB
Newer Older
Gleb Mazovetskiy's avatar
Gleb Mazovetskiy committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Breakpoint viewport sizes and media queries.
//
// Breakpoints are defined as a map of (name: minimum width), order from small to large:
//
//    (xs: 0, sm: 34rem, md: 45rem)
//
// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.

// Name of the next breakpoint, or null for the last breakpoint.
//
//    >> breakpoint-next(sm)
//    md
//    >> breakpoint-next(sm, $breakpoints: (xs: 0, sm: 34rem, md: 45rem))
//    md
//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md))
//    md
@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
  $n: index($breakpoint-names, $name);
  @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
}

// Minimum breakpoint width. Null for the smallest (first) breakpoint.
//
//    >> breakpoint-min(sm, (xs: 0, sm: 34rem, md: 45rem))
//    34rem
@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
  $min: map-get($breakpoints, $name);
  @return if($min != 0, $min, null);
}

// Maximum breakpoint width. Null for the largest (last) breakpoint.
// The maximum value is calculated as the minimum of the next one less 0.1.
//
//    >> breakpoint-max(sm, (xs: 0, sm: 34rem, md: 45rem))
//    44.9rem
@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
  $next: breakpoint-next($name, $breakpoints);
  @return if($next, breakpoint-min($next, $breakpoints) - 0.1, null);
}

// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
42
43
// Makes the @content apply to the given breakpoint and wider.
@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
Gleb Mazovetskiy's avatar
Gleb Mazovetskiy committed
44
45
46
47
48
49
50
51
52
53
54
  $min: breakpoint-min($name, $breakpoints);
  @if $min {
    @media (min-width: $min) {
      @content;
    }
  } @else {
    @content;
  }
}

// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
55
56
// Makes the @content apply to the given breakpoint and narrower.
@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
Gleb Mazovetskiy's avatar
Gleb Mazovetskiy committed
57
58
59
60
61
62
63
64
65
66
67
68
  $max: breakpoint-max($name, $breakpoints);
  @if $max {
    @media (max-width: $max) {
      @content;
    }
  } @else {
    @content;
  }
}

// Media between the breakpoint's minimum and maximum widths.
// No minimum for the smallest breakpoint, and no maximum for the largest one.
69
// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
Gleb Mazovetskiy's avatar
Gleb Mazovetskiy committed
70
71
72
73
74
75
76
77
78
79
80
81
@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
  // Nested media query combination does not work in libsass yet
  // https://github.com/sass/libsass/issues/185
  // Work around until the issue is resolved:
  $min: breakpoint-min($name, $breakpoints);
  $max: breakpoint-max($name, $breakpoints);
  @if $min and $max {
    @media (min-width: $min) and (max-width: $max) {
      @content;
    }
  } @else {
    // One of min or max is a no-op, so this branch is not affected by libsass#185
82
83
    @include media-breakpoint-up($name, $breakpoints) {
      @include media-breakpoint-down($name, $breakpoints) {
Gleb Mazovetskiy's avatar
Gleb Mazovetskiy committed
84
85
86
87
88
        @content;
      }
    }
  }
}