Skip to content

Instantly share code, notes, and snippets.

@pongo
Created July 23, 2017 18:41
Show Gist options
  • Select an option

  • Save pongo/00b077e2d77f5fac091b1aa2a386e88f to your computer and use it in GitHub Desktop.

Select an option

Save pongo/00b077e2d77f5fac091b1aa2a386e88f to your computer and use it in GitHub Desktop.
Bootstrap v4 media queries mixins converted to Less via less-plugin-sass2less
// Breakpoint viewport sizes and media queries.
//
// Breakpoints are defined as a map of (name: minimum width), order from small to large:
//
// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
//
// 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, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// md
// >> breakpoint-next(sm, @breakpoint-names: (xs sm md lg xl))
// md
.function-breakpoint-next(@name, @breakpoints: @grid-breakpoints, @breakpoint-names: map-keys(@breakpoints)) {
@n: index(@breakpoint-names, @name);
return: if(@n < length(@breakpoint-names), extract(@breakpoint-names, @n + 1), null);
}
// Minimum breakpoint width. Null for the smallest (first) breakpoint.
//
// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// 576px
.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: 576px, md: 768px, lg: 992px, xl: 1200px))
// 767px
.function-breakpoint-max(@name, @breakpoints: @grid-breakpoints) {
@next: breakpoint-next(@name, @breakpoints);
return: if(@next, breakpoint-min(@next, @breakpoints) - 1px, null);
}
// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
// Useful for making responsive utilities.
//
// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// "" (Returns a blank string)
// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// "-sm"
.function-breakpoint-infix(@name, @breakpoints: @grid-breakpoints) {
return: if(breakpoint-min(@name, @breakpoints) == null, "", "-@{name}");
}
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
// Makes the @content apply to the given breakpoint and wider.
.media-breakpoint-up(@name, @breakpoints: @grid-breakpoints) {
@min: breakpoint-min(@name, @breakpoints);
& when (@min) {
@media (min-width: @min) {
@content;
}
}
& when not (@min) {
@content;
}
}
// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
// Makes the @content apply to the given breakpoint and narrower.
.media-breakpoint-down(@name, @breakpoints: @grid-breakpoints) {
@max: breakpoint-max(@name, @breakpoints);
& when (@max) {
@media (max-width: @max) {
@content;
}
}
& when not (@max) {
@content;
}
}
// Media that spans multiple breakpoint widths.
// Makes the @content apply between the min and max breakpoints
.media-breakpoint-between(@lower, @upper, @breakpoints: @grid-breakpoints) {
@min: breakpoint-max(@lower, @breakpoints);
@max: breakpoint-max(@upper, @breakpoints);
@media (min-width: @min) and (max-width: @max) {
@content;
}
}
// Media between the breakpoint's minimum and maximum widths.
// No minimum for the smallest breakpoint, and no maximum for the largest one.
// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
.media-breakpoint-only(@name, @breakpoints: @grid-breakpoints) {
@min: breakpoint-min(@name, @breakpoints);
@max: breakpoint-max(@name, @breakpoints);
& when (@min != null and @max != null) {
@media (min-width: @min) and (max-width: @max) {
@content;
}
}
& when not (@min != null and @max != null) if @max == null {
.media-breakpoint-up(@name)
} @else if @min == null {
.media-breakpoint-down(@name)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment