Handle media queries in a type-safe with TypeScript

I’ve created a library that can execute media queries in a type-safe way with TypeScript.
If you find it useful, I’d appreciate it if you’d give it a star in the repository.

Install

with emotion

npm install @medi-q/core @medi-q/r…


This content originally appeared on DEV Community and was authored by Karibash

I’ve created a library that can execute media queries in a type-safe way with TypeScript.
If you find it useful, I’d appreciate it if you’d give it a star in the repository.

Install

with emotion

npm install @medi-q/core @medi-q/react @medi-q/emotion

with styled-components

npm install @medi-q/core @medi-q/react @medi-q/styled

Usage

Use the MediQProvider component to pass mediQ objects to lower-level components.
Also, only valid units can be specified for BreakPoints, and a type definition error will occur if an invalid unit is entered.

import React from 'react';
import { BreakPoints, createMediQ } from '@medi-q/core';
import { MediQProvider } from '@medi-q/react';

const breakPoints: BreakPoints = {
  tiny: '400px',
  small: '600px',
  medium: '800px',
  large: '1000px',
};

const App: React.FC = () => {
  return (
    <MediQProvider mediQ={createMediQ(breakPoints)}>
      ...
    </MediQProvider>
  );
};

export default App;

By using the useMediQ hook in the lower-level component, you can execute a media query.
Since the arguments of useMediQ hooks are typed to accept only valid values, a typedef error will occur if an invalid value is entered.
You can also execute media queries with multiple conditions by connecting the queries with and or.

import React from 'react';
import { useMediQ } from '@medi-q/react';

const Page: React.FC = () => {
  const isLessThanSmall = useMediQ('max-small');
  const isGreaterThanMedium = useMediQ('min-medium');
  const isBetweenSmallAndMedium = useMediQ('min-small-and-max-medium');
  return (
    <div>
      {isLessThanSmall && <div>isLessThanSmall</div>}
      {isGreaterThanMedium && <div>isGreaterThanMedium</div>}
      {isBetweenSmallAndMedium && <div>isBetweenSmallAndMedium</div>}
    </div>
  );
};

export default Page;

styled-components / emotion

For use with styled-components and emotion, use medi-q’s ThemeProvider.

import React from 'react';
import { BreakPoints, createMediQ } from '@medi-q/core';
import { ThemeProvider } from '@medi-q/emotion';
// import { ThemeProvider } from '@medi-q/styled';
import theme from './theme';

const breakPoints: BreakPoints = {
  tiny: '400px',
  small: '600px',
  medium: '800px',
  large: '1000px',
};

const App: React.FC = () => {
  return (
    <ThemeProvider theme={theme} mediQ={createMediQ(breakPoints)}>
      ...
    </ThemeProvider>
  );
};

export default App;

You can use medi-q via theme in styled components as follows.

import React from 'react';
import styled from '@emotion/styled';
// import styled from 'styled-components';
import { useMediQ } from '@medi-q/react';

const Wrapper = styled.div`
  background: ${props => props.theme.background};

  ${props => props.theme.mediQ('max-medium')} {
    background: blue;
  }
`;

const Responsive: React.FC = () => {
  const isLessThanSmall = useMediQ('max-small');
  const isGreaterThanMedium = useMediQ('min-medium');
  const isBetweenSmallAndMedium = useMediQ('min-small-and-max-medium');
  return (
    <Wrapper>
      {isLessThanSmall && <div>isLessThanSmall</div>}
      {isGreaterThanMedium && <div>isGreaterThanMedium</div>}
      {isBetweenSmallAndMedium && <div>isBetweenSmallAndMedium</div>}
    </Wrapper>
  );
};

export default Responsive;

When medi-q is used in styled components, it will be converted as follows.

const Wrapper = styled.div`
  background: ${props => props.theme.background};

  ${props => props.theme.mediQ('max-medium')} {
    background: blue;
  }
`;



const Wrapper = styled.div`
  background: ${props => props.theme.background};

  @media (max-width: 50rem) {
    background: blue;
  }
`;


This content originally appeared on DEV Community and was authored by Karibash


Print Share Comment Cite Upload Translate Updates
APA

Karibash | Sciencx (2021-09-25T18:38:47+00:00) Handle media queries in a type-safe with TypeScript. Retrieved from https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/

MLA
" » Handle media queries in a type-safe with TypeScript." Karibash | Sciencx - Saturday September 25, 2021, https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/
HARVARD
Karibash | Sciencx Saturday September 25, 2021 » Handle media queries in a type-safe with TypeScript., viewed ,<https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/>
VANCOUVER
Karibash | Sciencx - » Handle media queries in a type-safe with TypeScript. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/
CHICAGO
" » Handle media queries in a type-safe with TypeScript." Karibash | Sciencx - Accessed . https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/
IEEE
" » Handle media queries in a type-safe with TypeScript." Karibash | Sciencx [Online]. Available: https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/. [Accessed: ]
rf:citation
» Handle media queries in a type-safe with TypeScript | Karibash | Sciencx | https://www.scien.cx/2021/09/25/handle-media-queries-in-a-type-safe-with-typescript/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.