335 lines
6.5 KiB
Markdown
335 lines
6.5 KiB
Markdown
# Spacing & Layout
|
|
|
|
Tailwind CSS spacing scale for consistent layouts and visual rhythm.
|
|
|
|
## Spacing Scale
|
|
|
|
Base unit: **4px (0.25rem)**
|
|
|
|
| Class | Pixels | Class | Pixels | Class | Pixels |
|
|
| ----- | ------ | ----- | ------ | ----- | ------ |
|
|
| `0` | 0px | `8` | 32px | `24` | 96px |
|
|
| `1` | 4px | `10` | 40px | `32` | 128px |
|
|
| `2` | 8px | `12` | 48px | `40` | 160px |
|
|
| `3` | 12px | `14` | 56px | `48` | 192px |
|
|
| `4` | 16px | `16` | 64px | `64` | 256px |
|
|
| `6` | 24px | `20` | 80px | `96` | 384px |
|
|
|
|
## Padding & Margin
|
|
|
|
```tsx
|
|
// All sides
|
|
<div className="p-4">All sides (16px)</div>
|
|
|
|
// Individual sides
|
|
<div className="pt-4 pr-6 pb-4 pl-6">Different sides</div>
|
|
|
|
// Horizontal/Vertical
|
|
<div className="px-4 py-2">Horizontal 16px, vertical 8px</div>
|
|
|
|
// Margin (same syntax with 'm')
|
|
<div className="m-4">All sides margin</div>
|
|
<div className="mx-auto">Center horizontally</div>
|
|
<div className="-mt-4">Negative margin</div>
|
|
```
|
|
|
|
## Space Between Children
|
|
|
|
```tsx
|
|
// Vertical spacing
|
|
<div className="space-y-4">
|
|
<div>Item 1</div>
|
|
<div>Item 2</div>
|
|
<div>Item 3</div>
|
|
</div>
|
|
|
|
// Horizontal spacing
|
|
<div className="flex space-x-4">
|
|
<div>Item 1</div>
|
|
<div>Item 2</div>
|
|
</div>
|
|
```
|
|
|
|
## Flexbox Layouts
|
|
|
|
### Basic Flex
|
|
|
|
```tsx
|
|
// Horizontal
|
|
<div className="flex">
|
|
<div>Item 1</div>
|
|
<div>Item 2</div>
|
|
</div>
|
|
|
|
// Vertical
|
|
<div className="flex flex-col">
|
|
<div>Item 1</div>
|
|
<div>Item 2</div>
|
|
</div>
|
|
|
|
// Wrap
|
|
<div className="flex flex-wrap">
|
|
{items}
|
|
</div>
|
|
```
|
|
|
|
### Alignment
|
|
|
|
```tsx
|
|
// Justify (horizontal)
|
|
<div className="flex justify-between">Left and right</div>
|
|
<div className="flex justify-center">Center</div>
|
|
<div className="flex justify-around">Space around</div>
|
|
|
|
// Align (vertical)
|
|
<div className="flex items-center">Vertically centered</div>
|
|
<div className="flex items-start">Top aligned</div>
|
|
<div className="flex items-end">Bottom aligned</div>
|
|
|
|
// Combined
|
|
<div className="flex items-center justify-between">
|
|
<span>Left</span>
|
|
<span>Right</span>
|
|
</div>
|
|
```
|
|
|
|
### Gap
|
|
|
|
```tsx
|
|
// Gap between flex items (preferred over margin)
|
|
<div className="flex gap-4">
|
|
{items}
|
|
</div>
|
|
|
|
// Different horizontal and vertical gaps
|
|
<div className="flex flex-wrap gap-x-4 gap-y-2">
|
|
{items}
|
|
</div>
|
|
```
|
|
|
|
## Grid Layouts
|
|
|
|
### Basic Grid
|
|
|
|
```tsx
|
|
// Simple grid
|
|
<div className="grid grid-cols-3 gap-4">
|
|
{items}
|
|
</div>
|
|
|
|
// Responsive grid
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
{items}
|
|
</div>
|
|
|
|
// Game card grid (common pattern)
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
|
|
{games.map(game => <GameCard key={game.id} game={game} />)}
|
|
</div>
|
|
```
|
|
|
|
### Column Spanning
|
|
|
|
```tsx
|
|
<div className="grid grid-cols-4 gap-4">
|
|
<div className="col-span-2">Spans 2 columns</div>
|
|
<div>1 column</div>
|
|
<div>1 column</div>
|
|
<div className="col-span-full">Full width</div>
|
|
</div>
|
|
```
|
|
|
|
## Page Layout Patterns
|
|
|
|
### Standard Page
|
|
|
|
```tsx
|
|
<div className="min-h-screen bg-background">
|
|
<header className="border-b border-border">
|
|
<div className="container mx-auto px-4 py-4">{/* Header content */}</div>
|
|
</header>
|
|
|
|
<main className="container mx-auto px-4 py-8">
|
|
<h1 className="text-4xl font-bold mb-6">Page Title</h1>
|
|
<div className="space-y-8">{/* Page sections */}</div>
|
|
</main>
|
|
|
|
<footer className="border-t border-border mt-16">
|
|
<div className="container mx-auto px-4 py-8">{/* Footer */}</div>
|
|
</footer>
|
|
</div>
|
|
```
|
|
|
|
### Two-Column Layout
|
|
|
|
```tsx
|
|
<div className="container mx-auto px-4 py-8">
|
|
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8">
|
|
{/* Sidebar (3 columns) */}
|
|
<aside className="lg:col-span-3">
|
|
<FilterPanel />
|
|
</aside>
|
|
|
|
{/* Main (9 columns) */}
|
|
<main className="lg:col-span-9">
|
|
<GameGrid />
|
|
</main>
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
### Card Grid
|
|
|
|
```tsx
|
|
<div className="container mx-auto px-4 py-8">
|
|
<div className="mb-8">
|
|
<h1 className="text-4xl font-bold mb-2">Browse Games</h1>
|
|
<p className="text-lg text-muted-foreground">Explore the collection</p>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
|
|
{games.map((game) => (
|
|
<GameCard key={game.id} game={game} />
|
|
))}
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
## Container Component
|
|
|
|
Max-width container with responsive padding:
|
|
|
|
```tsx
|
|
// Basic
|
|
<div className="container mx-auto px-4">
|
|
Content
|
|
</div>
|
|
|
|
// Responsive padding
|
|
<div className="container mx-auto px-4 md:px-6 lg:px-8">
|
|
More padding on larger screens
|
|
</div>
|
|
```
|
|
|
|
**Max Widths:**
|
|
|
|
- Mobile: 100% (with padding)
|
|
- 2xl (1400px+): 1400px fixed width
|
|
|
|
## Responsive Spacing
|
|
|
|
```tsx
|
|
// Padding
|
|
<div className="p-4 md:p-6 lg:p-8">
|
|
Increases on larger screens
|
|
</div>
|
|
|
|
// Margin
|
|
<div className="mb-4 md:mb-6 lg:mb-8">
|
|
Section margin
|
|
</div>
|
|
|
|
// Gap
|
|
<div className="flex gap-2 md:gap-4 lg:gap-6">
|
|
{items}
|
|
</div>
|
|
|
|
// Space between
|
|
<div className="space-y-4 md:space-y-6 lg:space-y-8">
|
|
{items}
|
|
</div>
|
|
```
|
|
|
|
## Width & Height
|
|
|
|
### Fixed Widths
|
|
|
|
```tsx
|
|
<div className="w-64">256px</div>
|
|
<div className="w-96">384px</div>
|
|
|
|
// Percentages
|
|
<div className="w-1/2">50%</div>
|
|
<div className="w-1/3">33%</div>
|
|
<div className="w-2/3">67%</div>
|
|
<div className="w-full">100%</div>
|
|
```
|
|
|
|
### Max Widths
|
|
|
|
```tsx
|
|
<div className="max-w-md">448px max</div>
|
|
<div className="max-w-lg">512px max</div>
|
|
<div className="max-w-2xl">672px max</div>
|
|
|
|
// Common pattern for centered content
|
|
<article className="max-w-2xl mx-auto">
|
|
Centered content with readable width
|
|
</article>
|
|
```
|
|
|
|
### Min/Max Heights
|
|
|
|
```tsx
|
|
<div className="min-h-screen">Full viewport height</div>
|
|
<div className="min-h-full">100% of parent</div>
|
|
<div className="max-h-96">Max height 384px</div>
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### 1. Use Consistent Spacing Units
|
|
|
|
```tsx
|
|
// Good: Consistent scale
|
|
<div className="mb-4">
|
|
<h2 className="mb-2">Title</h2>
|
|
<p>Content</p>
|
|
</div>
|
|
|
|
// Bad: Arbitrary values
|
|
<div className="mb-[17px]">
|
|
<h2 className="mb-[9px]">Title</h2>
|
|
</div>
|
|
```
|
|
|
|
### 2. Prefer Gap Over Margins
|
|
|
|
```tsx
|
|
// Good: Using gap
|
|
<div className="flex gap-4">
|
|
{items}
|
|
</div>
|
|
|
|
// Less ideal: Using margins
|
|
<div className="flex">
|
|
<div className="mr-4">Item</div>
|
|
</div>
|
|
```
|
|
|
|
### 3. Maintain Vertical Rhythm
|
|
|
|
```tsx
|
|
<article className="space-y-6">
|
|
<section className="space-y-4">
|
|
<h2>Section 1</h2>
|
|
<p>Content</p>
|
|
</section>
|
|
<section className="space-y-4">
|
|
<h2>Section 2</h2>
|
|
<p>Content</p>
|
|
</section>
|
|
</article>
|
|
```
|
|
|
|
### 4. Responsive Spacing
|
|
|
|
```tsx
|
|
// Increase spacing on larger screens
|
|
<div className="px-4 md:px-6 lg:px-8">Content</div>
|
|
```
|
|
|
|
---
|
|
|
|
Next: [Typography](./typography.md) - Font system and text styles
|