AniUI

Grid

FlatList-based grid layout with configurable columns and gap.

Installation#

npx @aniui/cli add grid

Item 1

Description

Item 2

Description

Item 3

Description

Item 4

Description

Web preview — components render natively on iOS & Android
import { Grid } from "@/components/ui/grid";

const items = Array.from({ length: 6 }, (_, i) => ({ id: String(i), title: `Item ${i + 1}` }));

export function MyScreen() {
  return (
    <Grid
      columns={2}
      gap={12}
      data={items}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => (
        <View className="bg-card rounded-lg p-4 border border-border">
          <Text className="text-foreground">{item.title}</Text>
        </View>
      )}
    />
  );
}

Usage#

app/index.tsx
import { Grid } from "@/components/ui/grid";

const items = Array.from({ length: 6 }, (_, i) => ({ id: String(i), title: `Item ${i + 1}` }));

export function MyScreen() {
  return (
    <Grid
      columns={2}
      gap={12}
      data={items}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => (
        <View className="bg-card rounded-lg p-4 border border-border">
          <Text className="text-foreground">{item.title}</Text>
        </View>
      )}
    />
  );
}

Props#

PropTypeDefault
columns
number
2
gap
number
8
data
T[]
-
renderItem
({ item, index }) => ReactElement
-
keyExtractor
(item, index) => string
-
className
string
-

Also accepts all FlatList props except numColumns.

Accessibility#

  • FlatList-based grid layout with column support.
  • Grid items are individually focusable by screen readers.

Source#

components/ui/grid.tsx
import React from "react";
import { FlatList, View } from "react-native";
import { cn } from "@/lib/utils";

export interface GridProps<T> extends Omit<React.ComponentPropsWithoutRef<typeof FlatList<T>>, "numColumns"> {
  className?: string;
  columns?: number;
  gap?: number;
  data: T[];
  renderItem: ({ item, index }: { item: T; index: number }) => React.ReactElement;
  keyExtractor: (item: T, index: number) => string;
}

export function Grid<T>({
  className,
  columns = 2,
  gap = 8,
  data,
  renderItem,
  keyExtractor,
  ...props
}: GridProps<T>) {
  return (
    <FlatList
      className={cn("", className)}
      data={data}
      numColumns={columns}
      keyExtractor={keyExtractor}
      columnWrapperStyle={columns > 1 ? { gap } : undefined}
      contentContainerStyle={{ gap }}
      renderItem={({ item, index }) => (
        <View style={{ flex: 1 }}>{renderItem({ item, index })}</View>
      )}
      {...props}
    />
  );
}