close icon
daily.dev platform

Discover more from daily.dev

Personalized news feed, dev communities and search, much better than whatโ€™s out there. Maybe ;)

Start reading - Free forever
Start reading - Free forever
Continue reading >

Top 5 Chakra UI Patterns for Responsive Design

Top 5 Chakra UI Patterns for Responsive Design
Author
Nimrod Kramer
Related tags on daily.dev
toc
Table of contents
arrow-down

๐ŸŽฏ

Explore essential Chakra UI patterns for creating responsive designs that adapt seamlessly across devices with built-in tools and a mobile-first approach.

Chakra UI makes responsive design straightforward with built-in tools and a mobile-first approach. Here's a quick summary of the top patterns to create layouts that work on any device:

  • Flexbox Layout: Use the Flex component for one-dimensional layouts with responsive props.
  • Grid System: Combine Grid and SimpleGrid for flexible, two-dimensional layouts.
  • Responsive Typography: Adjust font sizes and styles across breakpoints using arrays or objects.
  • Spacing and Sizing: Manage widths, padding, and margins with responsive values.
  • Visibility Control: Show or hide components based on screen size with display properties or useMediaQuery.

These patterns leverage Chakra's predefined breakpoints, array/object syntax, and theme customization for a clean and consistent responsive design.

Responsive Styles in Chakra UI

1. Flexbox Layout for Responsiveness

Chakra UI's Flex component simplifies working with CSS Flexbox by offering easy-to-use responsive props and seamless integration with its theme system. Designed with a mobile-first mindset, it leverages Chakra's breakpoint system to ensure layouts adapt smoothly across devices.

Here's a quick example of how you can use the Flex component to create a responsive layout:

<Flex
  direction={{ base: "column", md: "row" }}
  justifyContent={{ base: "center", md: "space-between" }}
  alignItems="center"
  w="full"
  h="screen"
>
  {/* Content goes here */}
</Flex>

Instead of relying on traditional CSS media queries, Chakra UI allows you to use predefined breakpoints or customize your own within the theme object. This keeps your code clean and ensures a consistent design throughout your app.

For more advanced breakpoint logic, the useMediaQuery hook comes in handy:

import { useMediaQuery } from "@chakra-ui/react"

const [isLargerThanMd] = useMediaQuery("(min-width: 48em)")

This setup helps maintain a proper content hierarchy across devices, which is key for creating accessible and responsive designs.

Tips for Using Flex in Responsive Design

  • Start Mobile-First: Build layouts for smaller screens first, then enhance them for larger viewports.
  • Leverage Responsive Props: Use Chakra's responsive array syntax to adjust properties based on breakpoints.
  • Test Across Devices: Ensure your layout behaves consistently on different screen sizes [2].
  • Combine with Grid: Use Flex for one-dimensional layouts, and layer it with the Grid component for more complex two-dimensional designs (covered in the next section).

The Flex component pairs perfectly with Chakra's Grid system, offering powerful tools for creating adaptable layouts. We'll dive into the Grid system next.

2. Grid System for Responsiveness

Chakra UI's Grid system expands on the Flexbox approach by offering two key components: Grid for detailed layouts and SimpleGrid for easier setups.

Hereโ€™s how you can use both:

// Complex Grid implementation
<Grid
  templateColumns={{
    base: "1fr",
    md: "repeat(2, 1fr)",
    lg: "repeat(3, 1fr)"
  }}
  gap={6}
  p={4}
>
  <GridItem>
    <Box p={4} bg="gray.100">Content 1</Box>
  </GridItem>
  <GridItem>
    <Box p={4} bg="gray.100">Content 2</Box>
  </GridItem>
  <GridItem>
    <Box p={4} bg="gray.100">Content 3</Box>
  </GridItem>
</Grid>

// SimpleGrid offers a cleaner syntax
<SimpleGrid
  columns={{ base: 1, md: 2, lg: 3 }}
  spacing={4}
  maxW="1200px"
  mx="auto"
>
  {/* Grid items */}
</SimpleGrid>

Advanced Grid Features

You can adjust grid breakpoints directly through theme configuration for more control:

const theme = extendTheme({
  breakpoints: {
    sm: '30em',
    md: '48em',
    lg: '62em',
    xl: '80em',
  }
})

For layouts that require specific positioning, the gridTemplateAreas prop is incredibly useful:

<Grid
  templateAreas={{
    base: `"header" "main" "sidebar" "footer"`,
    md: `"header header" "sidebar main" "footer footer"`
  }}
  gridTemplateRows={'auto 1fr auto'}
  gap={4}
>
  {/* Grid areas */}
</Grid>

Tips for Effective Grid Usage

  • Use semantic grid areas: This makes your code easier to understand and maintain.
  • Stick to Chakraโ€™s spacing scale: It ensures consistent spacing throughout your layout.
  • Test across breakpoints: Always validate how your grid behaves on different screen sizes.

Chakra's Grid system pairs seamlessly with its spacing tools and visibility controls, allowing you to craft responsive layouts effortlessly. Combined with responsive typography (coming up next), youโ€™ll have everything you need for a complete design system.

3. Typography for Responsiveness

Chakra UI's typography system makes it easy to create responsive designs by using a theme-based approach and flexible style props.

Basic Responsive Typography

Here's how you can set up text and headings to adjust across different screen sizes:

<Text fontSize={["sm", "md", "lg", "xl"]}>
  This text adapts across breakpoints
</Text>

<Heading fontSize={{ base: "24px", md: "36px", lg: "48px" }}>
  Responsive Heading
</Heading>

Theme Customization

Customizing fonts and sizes in Chakra UI is straightforward. You can extend the default theme to set your preferred typography:

const theme = extendTheme({
  fonts: {
    heading: 'Inter, sans-serif',
    body: 'Roboto, system-ui'
  },
  fontSizes: {
    xs: "12px",
    sm: "14px",
    md: "16px",
    lg: "18px",
    xl: "20px"
  }
})

Advanced Typography Controls

For more detailed typography adjustments, Chakra UI allows you to control multiple properties responsively:

<Text
  fontSize={{ base: "16px", md: "18px", lg: "20px" }}
  lineHeight={{ base: 1.5, md: 1.75 }}
  fontWeight={{ base: "normal", md: "medium" }}
  letterSpacing={{ base: "normal", md: "wide" }}
>
  Fully responsive text with multiple properties
</Text>

Best Practices

To get the most out of Chakra UI's typography system, keep these tips in mind:

  • Mobile-First Approach: Begin with styles optimized for smaller screens, then enhance them for larger devices.
  • Use Theme Tokens: Stick to Chakra's predefined tokens like xs, sm, and md for consistent scaling.
  • Maintain Readability: Ensure text is clear and legible across all breakpoints, keeping body text at least 16px.

Combine these typography techniques with Chakra's spacing system to create well-balanced responsive designs. Once your typography is dialed in, you can move on to refining spacing and sizing for a complete layout.

sbb-itb-bfaad5b

4. Spacing and Sizing for Responsiveness

Achieving a consistent look across devices requires careful attention to spacing and sizing. By combining Chakra's typography system with its flexible spacing tools, you can create layouts that adapt seamlessly to any screen size.

Responsive Spacing Patterns

Chakra makes it simple to adjust spacing dynamically with arrays:

<Box
  width={[300, 400, 500]}
  padding={[2, 4, 6]}
  margin={[2, 4, 6]}
>
  Content
</Box>

Need more control over specific breakpoints? Use objects instead:

<Container
  width={{ 
    base: "100%",
    md: "75%",
    lg: "50%" 
  }}
  marginTop={{ 
    base: "1rem",
    md: "2rem",
    lg: "3rem" 
  }}
>
  Content
</Container>

Custom Breakpoints

If your project requires dimensions outside Chakra's default breakpoints, you can define your own:

const customTheme = extendTheme({
  breakpoints: {
    sm: "320px",
    md: "768px",
    lg: "960px",
    xl: "1200px"
  }
})

This allows you to tailor your design to fit unique requirements without compromising responsiveness.

Flexible Units

Switching to relative units ensures layouts remain adaptable:

<Stack
  spacing={{ base: 4, md: 6, lg: 8 }}
  width={{ base: "full", md: "auto" }}
>
  <Box flex={{ base: 1, md: "0 0 50%" }}>
    Flexible content
  </Box>
</Stack>

Relative units, combined with Chakra's visibility controls, offer a powerful way to build layouts that adjust fluidly across devices.

5. Visibility Control for Responsiveness

Chakra UI makes it easy to manage how components are displayed across different screen sizes. By using a mix of properties and hooks, you can fine-tune when and where elements appear, creating a seamless experience across devices. These tools work hand-in-hand with Chakra's spacing and sizing features.

Using the display Property

The simplest way to control visibility is by using the display property with responsive values. Here's an example:

<Box
  display={{ 
    base: "none",
    md: "block",
    lg: "flex"
  }}
>
  Adaptive Content
</Box>

This approach lets you hide or show elements based on screen size by defining specific breakpoints.

Leveraging useMediaQuery for Dynamic Rendering

For more advanced use cases, the useMediaQuery hook allows you to render components dynamically based on screen size:

import { useMediaQuery } from "@chakra-ui/react";

function ResponsiveNavigation() {
  const [isSmallScreen] = useMediaQuery("(max-width: 768px)");

  return (
    <Box>
      {isSmallScreen ? (
        <MobileMenu />
      ) : (
        <DesktopNavbar />
      )}
    </Box>
  );
}

This method is perfect for scenarios where you need to switch between entirely different components.

Combining Conditional Visibility and Layouts

Here's an example of a responsive sidebar layout that adjusts based on screen size:

<Box>
  <Sidebar 
    display={{ base: "none", md: "block" }}
    width="60"
  />
  <Drawer
    isOpen={isMobileOpen}
    placement="left"
    onClose={onClose}
  >
    <DrawerContent>
      <Sidebar onClose={onClose} />
    </DrawerContent>
  </Drawer>
  <Box ml={{ base: 0, md: 60 }}>
    {children}
  </Box>
</Box>

This setup uses a combination of display properties and a Drawer component to handle visibility for mobile and desktop layouts.

Tips for Effective Visibility Management

When working with visibility controls, keep these points in mind:

  • Start with mobile-first styles as your base.
  • Use breakpoints to adjust display properties where needed.
  • Opt for conditional rendering when switching between components.
  • Integrate visibility settings with spacing and sizing for a cohesive responsive design.

These techniques ensure your UI remains flexible and functional across all devices.

Conclusion

Chakra UI offers tools like Flexbox, Grid systems, typography controls, and visibility management to help developers create interfaces that work smoothly on different devices. Its use of array and object syntax, combined with theme customization, makes handling responsiveness straightforward.

The dual syntax approach keeps responsive design clear and manageable. Customizing themes for elements like grid breakpoints and font sizes ensures designs remain consistent while meeting specific project needs.

These features fit well into modern development workflows, helping teams maintain uniform responsive behavior across projects. With these tools, developers can build applications that provide great user experiences on any device or screen size.

FAQs

How to make Chakra UI responsive?

Chakra UI simplifies responsive design with its array and object syntax, removing the need for manual media queries. Here's how you can adjust layout properties across breakpoints:

<Box width={[300, 400, 500]}>
  This box adapts its width across breakpoints
</Box>
<Box width={{
  base: "300px",
  md: "400px",
  lg: "500px"
}}>
  This box uses named breakpoints
</Box>

Is Chakra UI responsive?

Absolutely. Chakra UI includes built-in tools for responsive design. It follows a mobile-first approach using @media(min-width) queries by default [2].

Key features for responsiveness:

  • Predefined mobile-first breakpoints
  • Adjustable theme settings
  • Dynamic component behavior with useMediaQuery [1]

Chakra manages the media queries for you, so you can focus on designing your interface without worrying about the technical details [1][2].

Why not level up your reading with

Stay up-to-date with the latest developer news every time you open a new tab.

Read more