Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mg901/styled-breakpoints

Simple and powerful breakpoints for styled components and emotion.
https://github.com/mg901/styled-breakpoints

breakpoint breakpoints css-in-js css-in-react emotion media media-queries media-query preact react responsive-design responsive-layout styled-components styled-media-query typescript

Last synced: about 1 month ago
JSON representation

Simple and powerful breakpoints for styled components and emotion.

Awesome Lists containing this project

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







## 🌼 Preview

**Inside** components.

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

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

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


**Outside** components.

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

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

return <>{isMd && }>;
};
```


## Examples

### πŸ‘‰πŸ» Mobile First

From smallest to largest



Edit mobile-first


### πŸ‘‰πŸ» Desktop First

From largest to smallest



Edit desktop first example


### πŸ‘‰πŸ» Hooks API



Hooks api (styled-components)



## πŸ“– Documentation

- [core concepts](#core-concepts)
- 🚩 [getting started](#getting-started)
- [Media Queries API](#media-queries-api)

- [min-width - up](#min-width---up)
- [max-width - down](#max-width---down)
- [single breakpoint - only](#single-breakpoint---only)
- [breakpoints range - between](#breakpoints-range---between)
- [customization](#customization)

- [useMediaQuery hook](#usemediaquery-hook)


## 🧐 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.


## Getting Started

### 🚩 Installation

```sh
npm install styled-breakpoints@latest

# or

yarn add styled-breakpoints@latest
```


### Configuration

#### 🚩 Available breakpoints

Styled Breakpoints includes six default breakpoints, often referred to as grid tiers, for building responsive designs. These breakpoints can be [customized](#customization).

```tsx
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.


#### 🚩 Default Configuration

`theme/config.ts`

```tsx
import { createStyledBreakpointsTheme } from 'styled-breakpoints';

export const theme = createStyledBreakpointsTheme();
```




#### Customization

##### 🚩 Breakpoints

`theme/config.ts`

```tsx
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`

```tsx
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(),
};
```




πŸ’… Using with Styled Components

##### 🚩 Installation

```sh
npm install styled-components

# or

yarn add styled-components
```


`theme/styled.d.ts`

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

type MyTheme = typeof theme;

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





πŸ‘©β€πŸŽ€
Using with Emotion

##### 🚩 Installation

```sh
npm install @emotion/{styled,react}

# or

yarn add @emotion/{styled,react}
```


`theme/emotion.d.ts`

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

type MyTheme = typeof theme;

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




### πŸš€ Integration to App


`app.tsx`

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

const Box = styled.div`
display: none;

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

const App = () => (

πŸ₯³

);
```


## Media queries API

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


### Min-width - `up`


Type declaration

```ts
declare function up(
min: T,
orientation?: 'portrait' | 'landscape'
) => string
```

```tsx
const Box = styled.div`
display: none;

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



Will be converted to pure css:

```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

```ts
declare function down(
max: string,
orientation?: 'portrait' | 'landscape'
) => string
```

```tsx
const Box = styled.div`
display: block;

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



Will be converted to pure css:

```css
@media (max-width: 767.98px) {
display: none;
}
```


> Why subtract .02px? Browsers don’t currently support [range context queries](https://www.w3.org/TR/mediaqueries-4/#range-context), so we work around the limitations of [min- and max- prefixes](https://www.w3.org/TR/mediaqueries-4/#mq-min-max) 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

```ts
declare function only(
name: string,
orientation?: 'portrait' | 'landscape'
) => string
```

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

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



Will be converted to pure css:

```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

```ts
declare function between(
min: string,
max: string,
orientation?: 'portrait' | 'landscape'
) => string
```

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

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



Will be converted to pure css:

```css
@media (min-width: 768px) and (max-width: 1199.98px) {
background-color: rebeccapurple;
}
```




## `useMediaQuery` hook

features:

- 🧐 optimal performance by dynamically monitoring document changes in media queries.
- πŸ’ͺ🏻 It supports SSR (server-side rendering).
- πŸ“¦ Minified and gzipped size 284b.


Type declaration

```ts
declare function useMediaQuery(query: string) => boolean
```

```tsx
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 {isMd && };
};
```




## License

MIT License

Copyright (c) 2018-2019 [Maxim Alyoshin](https://github.com/mg901).

This project is licensed under the MIT License - see the [LICENSE](https://github.com/mg901/styled-breakpoints/blob/master/LICENCE) file for details.




## Contributors



mg901
mg901

πŸ’¬ πŸ’» 🎨 πŸ“– πŸ’‘ πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ πŸ”§ βœ…
Abu Shamsutdinov
Abu Shamsutdinov

πŸ› πŸ’» πŸ’‘ πŸ€” πŸ‘€ πŸ“’
Sova
Sova

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

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

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

πŸ› πŸ’»
Sam Holmes
Sam Holmes

πŸ’» πŸ€”


Ontopic
Ontopic

πŸ€”
Ryan Bell
Ryan Bell

πŸ€”
Bart Nagel
Bart Nagel

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

πŸ’»
Buck DeFore
Buck DeFore

πŸ€”
Pierre Burel
Pierre Burel

πŸ›
Pawel Kochanek
Pawel Kochanek

πŸ› πŸ’»


Ian Christopher B. de Jesus
Ian Christopher B. de Jesus

πŸ›
David de Lusenet
David de Lusenet

πŸ› πŸ€”
Dan Adler
Dan Adler

πŸ›