JSPM

styled-breakpoints

13.1.4
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 18307
  • Score
    100M100P100Q139010F
  • License MIT

Simple and powerful css breakpoints for styled-components and emotion

Package Exports

  • styled-breakpoints
  • styled-breakpoints/styled-breakpoints/create-styled-breakpoints-theme/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (styled-breakpoints) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme


styled-breakpoints
GitHub Workflow Status coverage status npm bundle size npm downloads npm version

Simple and powerful tool for creating media queries with SSR support.

Styled Components Logo     OR    Emotion logo



Breakpoints

Breakpoints serve as adjustable widths that determine the behavior of your responsive layout across different device or viewport sizes.


Preview

For own components.

const Box = styled.div`
  background-color: pink;

  ${({ theme }) => theme.breakpoints.up('sm')} {
    background-color: hotpink;
  }

  ${({ theme }) => theme.breakpoints.up('md')} {
    background-color: red;
  }
`;

For third party components.

import { useTheme } from 'styled-components'; // or '@emotion/react'

const Layout = () => {
  // You could use hooks API
  const isMd = useMediaQuery(useTheme().breakpoints.up('md'));

  return <>{isMd && <Box />}</>;
};

Examples

Mobile First

From smallest to largest


Desktop First

From largest to smallest


Hooks API



Documentation


Core concepts

  • Breakpoints act as the fundamental elements of responsive design. They enable you to control when your layout can adapt to a specific viewport or device size.

  • Utilize media queries to structure your CSS based on breakpoints. Media queries are CSS features that allow you to selectively apply styles depending on a defined set of browser and operating system parameters. The most commonly used media query property is min-width.

  • The objective is mobile-first, responsive design. Styled Breakpoints aims to apply the essential styles required for a layout to function at the smallest breakpoint. Additional styles are then added to adjust the design for larger devices. This approach optimizes your CSS, enhances rendering speed, and delivers an excellent user experience.

Available breakpoints

Styled Breakpoints includes six default breakpoints, often referred to as grid tiers, for building responsive designs. These breakpoints can be customized.

Each breakpoint has been carefully selected to accommodate containers with widths that are multiples of 12. The breakpoints also represent a subset of common device sizes and viewport dimensions, although they do not specifically target every use case or device. Instead, they provide a robust and consistent foundation for building designs that cater to nearly any device.

const breakpoints = {
  xs: '0px',
  sm: '576px',
  md: '768px',
  lg: '992px',
  xl: '1200px',
  xxl: '1400px',
};

Quick start

πŸ’… Styled Components

Installation

npm install styled-components styled-breakpoints@latest

# or

yarn add styled-components styled-breakpoints@latest

Configuration

theme/config.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme();

theme/styled.d.ts

import 'styled-components';
import { theme } from './theme/config';

type CustomTheme = typeof theme;

declare module 'styled-components' {
  export interface DefaultTheme extends CustomTheme {}
}

app.tsx

import styled { ThemeProvider } from 'styled-components';
import { theme } from './theme/config';

const Box = styled.div`
  display: none;

  ${({ theme }) => theme.breakpoints.up('sm')} {
    display: block;
  }
`;

const App = () => (
  <ThemeProvider theme={theme}>
    <Box />
  </ThemeProvider>
);

πŸ‘©‍🎀 Emotion

Installation

npm install @emotion/{styled,react} styled-breakpoints@latest

# or

yarn add @emotion/{styled,react} styled-breakpoints@latest

Configuration

theme/config.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme();

theme/emotion.d.ts

import '@emotion/react';
import { theme } from './theme/config';

type CustomTheme = typeof theme;

declare module '@emotion/react' {
  export interface Theme extends CustomTheme {}
}

app.tsx

import styled, { ThemeProvider } from '@emotion/styled';
import { theme } from './theme/config';

const Box = styled.div`
  display: none;

  ${({ theme }) => theme.breakpoints.up('sm')} {
    display: block;
  }
`;

const App = () => (
  <ThemeProvider theme={theme}>
    <Box />
  </ThemeProvider>
);

Media queries API

  • πŸš€ Caching is implemented in all functions to optimize performance.

Min-width - up


Type declaration
  declare function up(
    min: T,
    orientation?: 'portrait' | 'landscape'
  ) => string
const Box = styled.div`
  display: none;

  ${({ theme }) => theme.breakpoints.up('sm')} {
    display: block;
  }
`;

Will be converted to pure css:
@media (min-width: 768px) {
  display: block;
}


Max-width - down

We occasionally use media queries that go in the other direction (the given screen size or smaller):


Type declaration
  declare function down(
    max: string,
    orientation?: 'portrait' | 'landscape'
  ) => string
const Box = styled.div`
  display: block;

  ${({ theme }) => theme.breakpoints.down('md')} {
    display: none;
  }
`;

Will be converted to pure css:
@media (max-width: 767.98px) {
  display: none;
}

Why subtract .02px? Browsers don’t currently support range context queries, so we work around the limitations of min- and max- prefixes and viewports with fractional widths (which can occur under certain conditions on high-dpi devices, for instance) by using values with higher precision.



Single breakpoint - only

There are also media queries and mixins for targeting a single segment of screen sizes using the minimum and maximum breakpoint widths.


Type declaration
  declare function only(
    name: string,
    orientation?: 'portrait' | 'landscape'
  ) => string
const Box = styled.div`
  background-color: pink;

  ${({ theme }) => theme.breakpoints.only('md')} {
    background-color: rebeccapurple;
  }
`;

Will be converted to pure css:
@media (min-width: 768px) and (max-width: 991.98px) {
  background-color: rebeccapurple;
}


Breakpoints range - between

Similarly, media queries may span multiple breakpoint widths.


Type declaration
 declare function between(
    min: string,
    max: string,
    orientation?: 'portrait' | 'landscape'
  ) => string
const Box = styled.div`
  background-color: gold;

  ${({ theme }) => theme.breakpoints.between('md', 'xl')} {
    background-color: rebeccapurple;
  }
`;

Will be converted to pure css:
@media (min-width: 768px) and (max-width: 1199.98px) {
  background-color: rebeccapurple;
}


Customization

πŸ› οΈ Custom breakpoints


theme/config.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme({
  breakpoints: {
    small: '100px',
    medium: '200px',
    large: '300px',
    xLarge: '400px',
    xxLarge: '500px',
  },
});

🎨 Merge with Another Theme


theme/config.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const primaryTheme = {
  fonts: ['sans-serif', 'Roboto'],
  fontSizes: {
    small: '1em',
    medium: '2em',
    large: '3em',
  },
} as const;

export const theme = {
  ...primaryTheme,
  ...createStyledBreakpointsTheme(),
};

useMediaQuery hook

features:

  • 🧐 optimal performance by dynamically monitoring document changes in media queries.
  • βš™οΈ It supports SSR (server-side rendering).
  • πŸ“¦ Minified and gzipped size 324b.

Type declaration
 declare function useMediaQuery(query: string) => boolean
import { useTheme } from 'styled-components'; // or from '@emotion/react'
import { useMediaQuery } from 'styled-breakpoints/use-media-query';
import { Box } from 'third-party-library';

const SomeComponent = () => {
  const { breakpoints } = useTheme();
  const isMd = useMediaQuery(breakpoints.only('md'));

  return <AnotherComponent>{isMd && <Box />}</AnotherComponent>;
};

License

MIT License

Copyright (c) 2018-2019 Maxim Alyoshin.

This project is licensed under the MIT License - see the LICENSE file for details.

Contributors

Thanks goes to these wonderful people (emoji key):

Maxim
Maxim

πŸ’» 🎨 πŸ“– πŸ’‘ πŸ€” πŸ“’
Abu Shamsutdinov
Abu Shamsutdinov

πŸ’» πŸ’‘ πŸ€” πŸ‘€ πŸ“’
Sergey Sova
Sergey Sova

πŸ’» πŸ’‘ πŸ€” πŸ‘€ πŸ“’
Jussi Kinnula
Jussi Kinnula

πŸ› πŸ’»
RafaΕ‚ Wyszomirski
RafaΕ‚ Wyszomirski

πŸ“–
Adrian CelczyΕ„ski
Adrian CelczyΕ„ski

πŸ› πŸ’»
Alexey Olefirenko
Alexey Olefirenko

πŸ’» πŸ€”
samholmes
samholmes

πŸ’» πŸ€”
Ontopic
Ontopic

πŸ€”
Ryan Bell
Ryan Bell

πŸ€”
Bart Nagel
Bart Nagel

πŸ› πŸ’» πŸ’‘ πŸ€”
Greg McKelvey
Greg McKelvey

πŸ’»
Buck DeFore
Buck DeFore

πŸ€”
Pierre Burel
Pierre Burel

πŸ›
Konstantin
Konstantin

πŸ› πŸ’»
Pawel Kochanek
Pawel Kochanek

πŸ› πŸ’»
Ian Christopher B. de Jesus
Ian Christopher B. de Jesus

πŸ›

This project follows the all-contributors specification. Contributions of any kind welcome!