@curiousmedia/breakpoint
v2.1.0
Published
CSS and Javascript media query management tool
Keywords
Readme
Breakpoint
Unified Javascript and SCSS breakpoint manager.
Installation
npm install @curiousmedia/breakpoint
Dart Sass
The Dart Sass implementation is highly recommend and used for all examples unless specified otherwise.
@use '@curiousmedia/breakpoint/src/breakpoint' with (
$breakpoints: (
md: "@media (hover: hover)"
)
);
@include breakpoint.any('md') {
.button {
&:hover {
color: red;
}
}
}LibSass & Ruby Sass
@import '@curiousmedia/breakpoint/src/breakpoint';
$breakpoints: (
md: "@media (hover: hover)"
);
@include breakpointAny('md') {
.button {
&:hover {
color: red;
}
}
}Usage
CSS
Breakpoint presets need to be configured by setting the "breakpoints" SCSS variable.
$breakpoints: (
landscape: "@media (orientation: landscape)",
touch: "@media screen and (pointer: coarse)",
cursor: "@media screen and (pointer: fine)",
hover: "@media screen and (hover: hover)",
still: "@media screen and (prefers-reduced-motion)",
sm: "@media (max-width: 640px)",
md: "@media (min-width: 641px) and (max-width: 1024px)",
lg: "@media (min-width: 1025px)",
grid: "@supports (display: grid)",
page: "@page"
);Presents can be referenced for quick, unified breakpoints across an entire project. Unfortunately, CSS and Javascript breakpoints must be defined separately.
Single breakpoint
Create "md" breakpoint.
@include breakpoint.any(md) {
div {
font-size: 2em;
}
}Multiple breakpoints using any
Create breakpoint where sm or lg conditions are met.
@include breakpoint.any(sm, lg) {
div {
font-size: 2em;
}
}Multiple breakpoints using all
Create breakpoint where landscape and sm conditions are met. If all queries use the same rule (e.g. @media), then they will be merged into a single breakpoint. However, if multiple queries do not use the same rule, they will be nested.
@include breakpoint.all(landscape, sm) {
div {
font-size: 2em;
}
}Custom Breakpoints
Custom breakpoints can be used along side presets.
@include breakpoint.all(sm, '@media (min-width: 400px)') {
div {
font-size: 2em;
}
}Nested
Create nested breakpoints.
div {
@include breakpoint.any(hover) {
@include breakpoint.any(landscape, sm) {
font-size: 2em;
}
@include breakpoint.all(md, grid) {
font-size: 3em;
}
}
}Short hand
Create single-property breakpoint.
div {
@include breakpoint.prop('font-size', (lg: 1em, md: 2em));
}Javascript
Breakpoint presets are configured when class is instantiated.
Configuration
let bp = new Breakpoint({
'landscape': '@media (orientation: landscape)',
'touch': '@media screen and (pointer: coarse)',
'cursor': '@media screen and (pointer: fine)',
'hover': '@media screen and (hover: hover)',
'still': '@media screen and (prefers-reduced-motion)',
'sm': '@media (max-width: 640px)',
'md': '@media (min-width: 641px) and (max-width: 1024px)',
'lg': '@media (min-width: 1025px)',
'grid': '@supports (display: grid)',
'page': "@page"
});Single breakpoint
Query "md" breakpoint.
bp.any('md'); //returns true or falseMultiple breakpoints using any
Query to evaluate if "sm" or "lg" conditions are met.
bp.any('sm', 'lg'); //returns true or falseMultiple breakpoints using all
Query to evaluate if "landscape" and "sm" conditions are met.
bp.all('landscape', 'md'); //returns true or falseCustom Breakpoints
Custom breakpoints can be used along side presets.
bp.all('sm', '@media (min-width: 400px)'); //returns true or falseNotes
Complex queries
This library is designed to handle common media queries. Complex queries with many conditions and not operators have not been tested.
Supported rules
The @page, @media, and @supports rules are supported. Due to the nature of SCSS syntax, additional rules will have to be manually added.
@page
The @page rule will always return true in the Javascript implementation; Javascript isn't computed on printed pages.
