or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

index.md
tile.json

tessl/npm-rebass

React primitive UI components built with Styled System for design systems and responsive layouts

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/rebass@4.0.x

To install, run

npx @tessl/cli install tessl/npm-rebass@4.0.0

index.mddocs/

Rebass

Rebass is a React component library that provides primitive UI components built with Styled System. It offers a minimal, flexible, and theme-able foundation for building design systems with responsive layouts and consistent spacing scales.

Package Information

  • Package Name: rebass
  • Package Type: npm
  • Language: JavaScript (with React)
  • Installation: npm install rebass

Core Imports

import { Box, Flex, Text, Heading, Button, Link, Image, Card } from "rebass";

For CommonJS:

const { Box, Flex, Text, Heading, Button, Link, Image, Card } = require("rebass");

Note: Rebass is part of a larger ecosystem. This Knowledge Tile covers the main rebass package. Related packages include @rebass/forms, @rebass/layout, and @rebass/space for additional components.

Basic Usage

import React from "react";
import { Box, Heading, Text, Button, Card } from "rebass";

function App() {
  return (
    <Box p={4} bg="background">
      <Card p={3} bg="white" borderRadius={8}>
        <Heading mb={2}>Welcome to Rebass</Heading>
        <Text mb={3} color="text">
          Build responsive UI with design constraints and user-defined scales.
        </Text>
        <Button bg="primary" color="white">
          Get Started
        </Button>
      </Card>
    </Box>
  );
}

Architecture

Rebass is built around several key concepts:

  • Styled System Integration: All components accept styled-system props for spacing, layout, typography, color, and flexbox
  • Reflexbox Foundation: Built on top of reflexbox, which provides the base Box and Flex components with emotion/styled integration
  • Theme-aware Styling: Components work with Theme UI and styled-system themes for consistent design tokens
  • Responsive Arrays: Use array syntax for responsive breakpoint styling (e.g., p={[2, 3, 4]})
  • Variant System: Components support theme-based variants for consistent styling patterns
  • Minimal Foundation: Small footprint (~4KB) with essential UI primitives only

Capabilities

Layout Components

Foundation components for structuring layouts with flexbox and grid systems.

/**
 * Box - Base layout component with all styled-system props  
 * Re-exported from reflexbox package
 * @param {BoxProps} props - Component props including all styled-system props
 * @returns {React.Element} Rendered component
 */
const Box = React.forwardRef((props, ref) => {});

/**
 * Flex - Box component with display: flex by default
 * Re-exported from reflexbox package
 * @param {BoxProps} props - Component props including all styled-system props
 * @returns {React.Element} Rendered component
 */
const Flex = React.forwardRef((props, ref) => {});

/**
 * Props interface for Box and Flex components
 * Includes all styled-system props for comprehensive styling
 */
interface BoxProps {
  // Spacing props - margin and padding with responsive support
  m?: ResponsiveValue;
  margin?: ResponsiveValue;
  mt?: ResponsiveValue;
  mr?: ResponsiveValue;
  mb?: ResponsiveValue;
  ml?: ResponsiveValue;
  mx?: ResponsiveValue;
  my?: ResponsiveValue;
  p?: ResponsiveValue;
  padding?: ResponsiveValue;
  pt?: ResponsiveValue;
  pr?: ResponsiveValue;
  pb?: ResponsiveValue;
  pl?: ResponsiveValue;
  px?: ResponsiveValue;
  py?: ResponsiveValue;
  
  // Layout props - size and display properties with responsive support
  width?: ResponsiveValue;
  height?: ResponsiveValue;
  minWidth?: ResponsiveValue;
  maxWidth?: ResponsiveValue;
  minHeight?: ResponsiveValue;
  maxHeight?: ResponsiveValue;
  display?: ResponsiveValue;
  verticalAlign?: ResponsiveValue;
  overflow?: ResponsiveValue;
  overflowX?: ResponsiveValue;
  overflowY?: ResponsiveValue;
  
  // Color props - text and background colors with responsive support
  color?: ResponsiveValue;
  backgroundColor?: ResponsiveValue;
  bg?: ResponsiveValue;
  opacity?: ResponsiveValue;
  
  // Typography props - text styling with responsive support
  fontFamily?: ResponsiveValue;
  fontSize?: ResponsiveValue;
  fontWeight?: ResponsiveValue;
  lineHeight?: ResponsiveValue;
  letterSpacing?: ResponsiveValue;
  textAlign?: ResponsiveValue;
  fontStyle?: ResponsiveValue;
  textTransform?: ResponsiveValue;
  
  // Flexbox props - flex container and item properties with responsive support
  alignItems?: ResponsiveValue;
  alignContent?: ResponsiveValue;
  justifyItems?: ResponsiveValue;
  justifyContent?: ResponsiveValue;
  flexWrap?: ResponsiveValue;
  flexDirection?: ResponsiveValue;
  flex?: ResponsiveValue;
  flexGrow?: ResponsiveValue;
  flexShrink?: ResponsiveValue;
  flexBasis?: ResponsiveValue;
  justifySelf?: ResponsiveValue;
  alignSelf?: ResponsiveValue;
  order?: ResponsiveValue;
  
  // Theme-aware styling props
  sx?: object;
  variant?: string;
  tx?: string;
  __css?: object;
  
  // Element props
  as?: string | React.Component;
  children?: React.ReactNode;
}

/**
 * Responsive value type - accepts single value or array for responsive breakpoints
 * @typedef {(string|number|(string|number)[])} ResponsiveValue
 */

Usage Examples:

// Basic layout with spacing
<Box p={4} m={2} bg="gray.100">
  <Text>Content with padding and margin</Text>
</Box>

// Responsive flexbox layout
<Flex
  flexDirection={["column", "row"]}
  alignItems="center"
  justifyContent="space-between"
  p={[2, 3, 4]}
>
  <Box>Left content</Box>
  <Box>Right content</Box>
</Flex>

// Theme-aware styling with sx prop
<Box
  sx={{
    borderRadius: 4,
    boxShadow: "0 2px 8px rgba(0,0,0,0.1)",
    "&:hover": {
      boxShadow: "0 4px 16px rgba(0,0,0,0.15)",
    },
  }}
>
  Styled box with theme integration
</Box>

Typography Components

Text and heading components with built-in typographic styling and theme integration.

/**
 * Text - General text component with typography styling
 * Built on Box component with tx='text' theme variant
 * @param {TextProps} props - Component props
 * @returns {React.Element} Rendered text element
 */
const Text = React.forwardRef((props, ref) => {});

/**
 * Heading - Heading component with heading-specific defaults
 * Built on Box component, defaults to h2 element with heading styles
 * @param {HeadingProps} props - Component props
 * @returns {React.Element} Rendered heading element
 */
const Heading = React.forwardRef((props, ref) => {});

/**
 * Props for Text component
 */
interface TextProps extends BoxProps {
  /** Theme variant path, defaults to 'text' */
  tx?: string;
  /** Theme variant name for styling */
  variant?: string;
}

/**
 * Props for Heading component
 */
interface HeadingProps extends BoxProps {
  /** Theme variant path, defaults to 'text' */
  tx?: string;
  /** Theme variant name, defaults to 'heading' */
  variant?: string;
}

Usage Examples:

// Basic text with styling
<Text fontSize={2} color="text" lineHeight="1.5">
  This is body text with theme-based sizing and color.
</Text>

// Text with theme variants
<Text variant="caps" color="muted">
  Uppercase text using theme variant
</Text>

// Headings with different levels
<Heading as="h1" fontSize={5} mb={3}>
  Main Title
</Heading>

<Heading as="h3" fontSize={3} fontWeight="normal">
  Subtitle
</Heading>

// Custom heading variant
<Heading variant="display" textAlign="center">
  Display Heading
</Heading>

Interactive Components

Button and link components for user interactions with consistent styling.

/**
 * Button - Interactive button component with button-specific styling
 * Built on Box component, defaults to button element with primary variant
 * @param {ButtonProps} props - Component props
 * @returns {React.Element} Rendered button element
 */
const Button = React.forwardRef((props, ref) => {});

/**
 * Link - Link component for navigation
 * Built on Box component, defaults to anchor element
 * @param {LinkProps} props - Component props
 * @returns {React.Element} Rendered link element
 */
const Link = React.forwardRef((props, ref) => {});

/**
 * Props for Button component
 */
interface ButtonProps extends BoxProps {
  /** Theme variant path, defaults to 'buttons' */
  tx?: string;
  /** Theme variant name, defaults to 'primary' */
  variant?: string;
  /** Whether button is disabled */
  disabled?: boolean;
  /** Button type attribute */
  type?: "button" | "submit" | "reset";
  /** Click event handler */
  onClick?: (event) => void;
}

/**
 * Props for Link component
 */
interface LinkProps extends BoxProps {
  /** Theme variant name, defaults to 'link' */
  variant?: string;
  /** Link href attribute */
  href?: string;
  /** Link target attribute */
  target?: string;
  /** Link rel attribute */
  rel?: string;
  /** Click event handler */
  onClick?: (event) => void;
}

Usage Examples:

// Primary button with default styling
<Button>Click Me</Button>

// Button variants and styling
<Button variant="secondary" size="large" mr={2}>
  Secondary
</Button>

<Button bg="red" color="white" px={4} py={2}>
  Custom Styled
</Button>

// Button as different elements
<Button as="a" href="/signup">
  Sign Up Link
</Button>

// Links with styling
<Link href="/about" color="primary">
  About Us
</Link>

<Link variant="nav" fontSize={1}>
  Navigation Link
</Link>

Media Components

Image component with responsive defaults and styling capabilities.

/**
 * Image - Responsive image component with built-in responsive defaults
 * Built on Box component, defaults to img element with maxWidth: '100%'
 * @param {ImageProps} props - Component props
 * @returns {React.Element} Rendered image element
 */
const Image = React.forwardRef((props, ref) => {});

/**
 * Props for Image component
 */
interface ImageProps extends BoxProps {
  /** Image source URL */
  src?: string;
  /** Image alt text for accessibility */
  alt?: string;
  /** Image width (overrides responsive default) */
  width?: string | number;
  /** Image height (overrides responsive default) */
  height?: string | number;
  /** Image loading strategy */
  loading?: "lazy" | "eager";
  /** Cross-origin attribute for CORS */
  crossOrigin?: string;
  /** Load event handler */
  onLoad?: (event) => void;
  /** Error event handler */
  onError?: (event) => void;
}

Usage Examples:

// Responsive image with default styling
<Image src="/hero.jpg" alt="Hero image" />

// Image with custom sizing and styling
<Image
  src="/avatar.jpg"
  alt="User avatar"
  width={48}
  height={48}
  borderRadius="50%"
/>

// Image with responsive sizing
<Image
  src="/banner.jpg"
  alt="Banner"
  width={["100%", "50%", "33%"]}
  maxWidth={800}
/>

Container Components

Card component for grouping content with consistent container styling.

/**
 * Card - Container component with card-specific styling
 * Built on Box component with card theme variant
 * @param {CardProps} props - Component props
 * @returns {React.Element} Rendered card container
 */
const Card = React.forwardRef((props, ref) => {});

/**
 * Props for Card component
 */
interface CardProps extends BoxProps {
  /** Theme variant name, defaults to 'card' */
  variant?: string;
}

Usage Examples:

// Basic card with default styling
<Card p={3}>
  <Heading mb={2}>Card Title</Heading>
  <Text>Card content goes here.</Text>
</Card>

// Styled card with theme variants
<Card variant="compact" bg="white" borderRadius={8}>
  <Text>Compact card variant</Text>
</Card>

// Card with custom styling
<Card
  p={4}
  bg="white"
  sx={{
    borderRadius: 8,
    boxShadow: "0 2px 8px rgba(0,0,0,0.1)",
    border: "1px solid",
    borderColor: "gray.200",
  }}
>
  <Text>Custom styled card</Text>
</Card>

Theme Integration

All Rebass components are designed to work with theme objects and support Theme UI compatibility:

// Example theme structure
const theme = {
  colors: {
    primary: "#0066cc",
    secondary: "#f0f0f0",
    text: "#333",
    background: "#fff",
  },
  space: [0, 4, 8, 16, 32, 64, 128, 256],
  fontSizes: [12, 14, 16, 20, 24, 32, 48, 64],
  fonts: {
    body: "system-ui, sans-serif",
    heading: "Georgia, serif",
  },
  variants: {
    card: {
      p: 3,
      bg: "white",
      borderRadius: 8,
      boxShadow: "0 2px 8px rgba(0,0,0,0.1)",
    },
    buttons: {
      primary: {
        bg: "primary",
        color: "white",
      },
      secondary: {
        bg: "secondary",
        color: "text",
      },
    },
  },
};

Error Handling

Rebass components generally handle errors gracefully:

  • Invalid style props are ignored
  • Theme values that don't exist fall back to the literal value
  • Components render as expected HTML elements even with invalid props
  • React development warnings appear for invalid HTML attributes passed through