Home

Awesome

<div align="center"> <h1> <br> styled-breakpoints <br> <a href="https://github.com/mg901/styled-breakpoints/actions?query=workflow%3Arelease"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/mg901/styled-breakpoints/release.yml?branch=master&style=flat-square"> </a> <a href="https://coveralls.io/github/mg901/styled-breakpoints?branch=master"> <img alt="coverage status" src="https://img.shields.io/coverallsCoverage/github/mg901/styled-breakpoints?style=flat-square"> </a> <a href="https://bundlephobia.com/package/styled-breakpoints"> <img alt="npm bundle size" src="https://img.shields.io/bundlephobia/minzip/styled-breakpoints?style=flat-square"> </a> <a href="https://img.shields.io/npm/dm/styled-breakpoints?style=flat-square"> <img alt="npm downloads" src="https://img.shields.io/npm/dm/styled-breakpoints?style=flat-square"> </a> <a href="https://www.npmjs.com/package/styled-breakpoints"> <img alt="npm version" src="https://img.shields.io/npm/v/styled-breakpoints.svg?style=flat-square"> </a> </h1> <p>Simple and powerful tool for creating media queries with SSR support.</p> <p> <a href="https://www.styled-components.com" rel="nofollow"> <img src="https://raw.githubusercontent.com/styled-components/brand/master/styled-components.png" alt="Styled Components Logo" width="80"> </a> &nbsp;&nbsp;&nbsp;&nbsp;<strong>OR</strong>&nbsp;&nbsp;&nbsp; <a href="https://emotion.sh/docs/introduction" rel="nofollow"><img src="https://raw.githubusercontent.com/emotion-js/emotion/main/emotion.png" alt="Emotion logo" width="80"></a> <p> </div> <br > <br >

🌼 Preview

Inside components.

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

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

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

Outside components.

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

const Layout = () => {
  const { up } = useTheme().breakpoints;
  const isMd = useMediaQuery(up('md'));

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

Examples

πŸ‘‰πŸ» Mobile First

From smallest to largest

<div> <a href="https://codesandbox.io/s/rough-wave-u0uuu?fontsize=14&hidenavigation=1&module=%2Fsrc%2Fapp.tsx&theme=dark"> <img alt="Edit mobile-first" src="https://codesandbox.io/static/img/play-codesandbox.svg"> </a> </div> <br>

πŸ‘‰πŸ» Desktop First

From largest to smallest

<div> <a href="https://codesandbox.io/s/desktop-first-example-0plsg?fontsize=14&hidenavigation=1&module=%2Fsrc%2Fapp.tsx&theme=dark"> <img alt="Edit desktop first example" src="https://codesandbox.io/static/img/play-codesandbox.svg"> </a> </div> <br>

πŸ‘‰πŸ» Hooks API

<div> <a href="https://codesandbox.io/s/styled-components-hooks-api-6q6w8?fontsize=14&hidenavigation=1&module=%2Fsrc%2Fapp.tsx&theme=dark"> <img alt="Hooks api (styled-components)" src="https://codesandbox.io/static/img/play-codesandbox.svg"> </a> </div> <br> <br>

πŸ“– Documentation

<br>

🧐 Core concepts

<br>

Getting Started

🚩 Installation

npm install styled-breakpoints@latest

# or

yarn add styled-breakpoints@latest
<br >

Configuration

🚩 File Structure

 theme/
 β”œβ”€β”€ index.ts
 └── styled.d.ts // or emotion.d.ts
 app.tsx
<br>

🚩 Available breakpoints

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

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

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.

<br>

🚩 Default Configuration

theme/index.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme();
<hr/> <br>

Customization

🚩 Breakpoints

theme/index.ts

import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme({
  breakpoints: {
    small: '100px',
    medium: '200px',
    large: '300px',
    xLarge: '400px',
    xxLarge: '500px',
  },
});
<br>
🎨 Merge with Another Theme

theme/index.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(),
};
<hr> <br> <h4>πŸ’… Using with Styled Components</h4>
🚩 Installation
npm install styled-components

# or

yarn add styled-components
<br>

theme/styled.d.ts

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

type ThemeConfig = typeof theme;

declare module 'styled-components' {
  export interface DefaultTheme extends ThemeConfig {}
}
</details> <hr> <br> <h4> <g-emoji class="g-emoji" alias="woman_singer" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f469-1f3a4.png">πŸ‘©&zwj;🎀</g-emoji> Using with Emotion</h4>
🚩 Installation
npm install @emotion/{styled,react}

# or

yarn add @emotion/{styled,react}
<br >

theme/emotion.d.ts

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

type ThemeConfig = typeof theme;

declare module '@emotion/react' {
  export interface Theme extends ThemeConfig {}
}
<hr/> <br>

πŸš€ Integration to Your App

<br>

app.tsx

import styled { ThemeProvider } from 'styled-components'; // or '@emotion/react'
import { theme } from './theme';

const Box = styled.div`
  display: none;

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

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

Media queries API

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

<br>

πŸ‘‰πŸ» Min-width - up

const Box = styled.div`
  display: none;

  ${({ theme }) => theme.breakpoints.up('sm')} {
    display: block;
  }
`;
<br> <strong>Will convert to vanilla css: </strong>
@media (min-width: 768px) {
  display: block;
}
<hr/> <br>

πŸ‘‰πŸ» Max-width - down

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

<br>
const Box = styled.div`
  display: block;

  ${({ theme }) => theme.breakpoints.down('md')} {
    display: none;
  }
`;
<br> <strong>Will convert to vanilla css: </strong>
@media (max-width: 767.98px) {
  display: none;
}
<br>

<strong>Why subtract .02px?</strong> 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.

<hr/> <br>

πŸ‘‰πŸ» 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.

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

  ${({ theme }) => theme.breakpoints.only('md')} {
    background-color: rebeccapurple;
  }
`;
<br> <strong>Will convert to vanilla css: </strong>
@media (min-width: 768px) and (max-width: 991.98px) {
  background-color: rebeccapurple;
}
<hr/> <br>

πŸ‘‰πŸ» Breakpoints range - between

Similarly, media queries may span multiple breakpoint widths.

<br>
const Box = styled.div`
  background-color: gold;

  ${({ theme }) => theme.breakpoints.between('md', 'xl')} {
    background-color: rebeccapurple;
  }
`;
<br> <strong>Will convert to vanilla css: </strong>
@media (min-width: 768px) and (max-width: 1199.98px) {
  background-color: rebeccapurple;
}
<hr/> <br>

πŸ‘‰πŸ» useMediaQuery hook

features:

<br> <details><summary><strong>Type declaration</strong></summary>
 declare function useMediaQuery(query: string) => boolean
</details>
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 { only } = useTheme().breakpoints;
  const isMd = useMediaQuery(only('md'));

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

License

MIT License

Copyright (c) 2018-2024 Maxim Alyoshin.

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

<hr> <br>

Contributors

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/mg901"><img src="https://avatars.githubusercontent.com/u/7874664?v=4?s=100" width="100px;" alt="mg901"/><br /><sub><b>mg901</b></sub></a><br /><a href="#question-mg901" title="Answering Questions">πŸ’¬</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=mg901" title="Code">πŸ’»</a> <a href="#design-mg901" title="Design">🎨</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=mg901" title="Documentation">πŸ“–</a> <a href="#example-mg901" title="Examples">πŸ’‘</a> <a href="#infra-mg901" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#maintenance-mg901" title="Maintenance">🚧</a> <a href="#projectManagement-mg901" title="Project Management">πŸ“†</a> <a href="#promotion-mg901" title="Promotion">πŸ“£</a> <a href="#research-mg901" title="Research">πŸ”¬</a> <a href="https://github.com/mg901/styled-breakpoints/pulls?q=is%3Apr+reviewed-by%3Amg901" title="Reviewed Pull Requests">πŸ‘€</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=mg901" title="Tests">⚠️</a> <a href="#tool-mg901" title="Tools">πŸ”§</a> <a href="#tutorial-mg901" title="Tutorials">βœ…</a></td> <td align="center" valign="top" width="14.28%"><a href="http://t.me/stuneak"><img src="https://avatars.githubusercontent.com/u/22033385?v=4?s=100" width="100px;" alt="Abu Shamsutdinov"/><br /><sub><b>Abu Shamsutdinov</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Astuneak" title="Bug reports">πŸ›</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=stuneak" title="Code">πŸ’»</a> <a href="#example-stuneak" title="Examples">πŸ’‘</a> <a href="#ideas-stuneak" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/mg901/styled-breakpoints/pulls?q=is%3Apr+reviewed-by%3Astuneak" title="Reviewed Pull Requests">πŸ‘€</a> <a href="#talk-stuneak" title="Talks">πŸ“’</a></td> <td align="center" valign="top" width="14.28%"><a href="https://sergeysova.com/"><img src="https://avatars.githubusercontent.com/u/5620073?v=4?s=100" width="100px;" alt="Sova"/><br /><sub><b>Sova</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/commits?author=sergeysova" title="Code">πŸ’»</a> <a href="#example-sergeysova" title="Examples">πŸ’‘</a> <a href="#ideas-sergeysova" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/mg901/styled-breakpoints/pulls?q=is%3Apr+reviewed-by%3Asergeysova" title="Reviewed Pull Requests">πŸ‘€</a> <a href="#talk-sergeysova" title="Talks">πŸ“’</a></td> <td align="center" valign="top" width="14.28%"><a href="https://jussikinnula.com/"><img src="https://avatars.githubusercontent.com/u/7287118?v=4?s=100" width="100px;" alt="Jussi Kinnula"/><br /><sub><b>Jussi Kinnula</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Ajussikinnula" title="Bug reports">πŸ›</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=jussikinnula" title="Code">πŸ’»</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/rafauke"><img src="https://avatars.githubusercontent.com/u/9576167?v=4?s=100" width="100px;" alt="RafaΕ‚ Wyszomirski"/><br /><sub><b>RafaΕ‚ Wyszomirski</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/commits?author=rafauke" title="Documentation">πŸ“–</a></td> <td align="center" valign="top" width="14.28%"><a href="https://afflite.com/"><img src="https://avatars.githubusercontent.com/u/35396312?v=4?s=100" width="100px;" alt="Adrian CelczyΕ„ski"/><br /><sub><b>Adrian CelczyΕ„ski</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3AGR34SE" title="Bug reports">πŸ›</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=GR34SE" title="Code">πŸ’»</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/samholmes"><img src="https://avatars.githubusercontent.com/u/517469?v=4?s=100" width="100px;" alt="Sam Holmes"/><br /><sub><b>Sam Holmes</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/commits?author=samholmes" title="Code">πŸ’»</a> <a href="#ideas-samholmes" title="Ideas, Planning, & Feedback">πŸ€”</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/Ontopic"><img src="https://avatars.githubusercontent.com/u/1599991?v=4?s=100" width="100px;" alt="Ontopic"/><br /><sub><b>Ontopic</b></sub></a><br /><a href="#ideas-Ontopic" title="Ideas, Planning, & Feedback">πŸ€”</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/iRyanBell"><img src="https://avatars.githubusercontent.com/u/25379378?v=4?s=100" width="100px;" alt="Ryan Bell"/><br /><sub><b>Ryan Bell</b></sub></a><br /><a href="#ideas-iRyanBell" title="Ideas, Planning, & Feedback">πŸ€”</a></td> <td align="center" valign="top" width="14.28%"><a href="https://bartnagel.ca/"><img src="https://avatars.githubusercontent.com/u/199635?v=4?s=100" width="100px;" alt="Bart Nagel"/><br /><sub><b>Bart Nagel</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Atremby" title="Bug reports">πŸ›</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=tremby" title="Code">πŸ’»</a> <a href="#example-tremby" title="Examples">πŸ’‘</a> <a href="#ideas-tremby" title="Ideas, Planning, & Feedback">πŸ€”</a></td> <td align="center" valign="top" width="14.28%"><a href="https://mckelveygreg.github.io/"><img src="https://avatars.githubusercontent.com/u/16110122?v=4?s=100" width="100px;" alt="Greg McKelvey"/><br /><sub><b>Greg McKelvey</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/commits?author=mckelveygreg" title="Code">πŸ’»</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/bdefore"><img src="https://avatars.githubusercontent.com/u/142472?v=4?s=100" width="100px;" alt="Buck DeFore"/><br /><sub><b>Buck DeFore</b></sub></a><br /><a href="#ideas-bdefore" title="Ideas, Planning, & Feedback">πŸ€”</a></td> <td align="center" valign="top" width="14.28%"><a href="https://www.pierreburel.com/"><img src="https://avatars.githubusercontent.com/u/37228?v=4?s=100" width="100px;" alt="Pierre Burel"/><br /><sub><b>Pierre Burel</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Apierreburel" title="Bug reports">πŸ›</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/flagoon"><img src="https://avatars.githubusercontent.com/u/20648154?v=4?s=100" width="100px;" alt="Pawel Kochanek"/><br /><sub><b>Pawel Kochanek</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Aflagoon" title="Bug reports">πŸ›</a> <a href="https://github.com/mg901/styled-breakpoints/commits?author=flagoon" title="Code">πŸ’»</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/iandjx"><img src="https://avatars.githubusercontent.com/u/3683356?v=4?s=100" width="100px;" alt="Ian Christopher B. de Jesus"/><br /><sub><b>Ian Christopher B. de Jesus</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Aiandjx" title="Bug reports">πŸ›</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/daviddelusenet"><img src="https://avatars.githubusercontent.com/u/1398418?v=4?s=100" width="100px;" alt="David de Lusenet"/><br /><sub><b>David de Lusenet</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3Adaviddelusenet" title="Bug reports">πŸ›</a> <a href="#ideas-daviddelusenet" title="Ideas, Planning, & Feedback">πŸ€”</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/AdlerJS"><img src="https://avatars.githubusercontent.com/u/82471930?v=4?s=100" width="100px;" alt="Dan Adler"/><br /><sub><b>Dan Adler</b></sub></a><br /><a href="https://github.com/mg901/styled-breakpoints/issues?q=author%3AAdlerJS" title="Bug reports">πŸ›</a></td> </tr> </tbody> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->