- Add PLAN.md with 40-step checklist across 10 phases - Add CLAUDE.md with project-specific instructions - Set up nix flake with FastHTML/MonsterUI dependencies - Create Python package skeleton (src/animaltrack) - Vendor FastHTML and MonsterUI documentation - Add Docker build configuration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
7.8 KiB
Layout (Flex and Grid) API Reference
This page covers Grids, which are often used for general structure, Flex which is often used for layout of components that are not grid based, padding and positioning that can help you make your layout look good, and dividers that can help break up the page
Grid
See Source
See Output
Column 1 Item 1
Column 1 Item 2
Column 1 Item 3
Column 2 Item 1
Column 2 Item 2
Column 2 Item 3
Column 3 Item 1
Column 3 Item 2
Column 3 Item 3
[code]
def ex_grid():
return Grid(
Div(
P("Column 1 Item 1"),
P("Column 1 Item 2"),
P("Column 1 Item 3")),
Div(
P("Column 2 Item 1"),
P("Column 2 Item 2"),
P("Column 2 Item 3")),
Div(
P("Column 3 Item 1"),
P("Column 3 Item 2"),
P("Column 3 Item 3")))
[/code]
Grid
Source
[code]
Grid(*div, cols_min: int = 1, cols_max: int = 4, cols_sm: int = None, cols_md: int = None, cols_lg: int = None, cols_xl: int = None, cols: int = None, cls='gap-4', **kwargs) -> fastcore.xml.FT
[/code]
Creates a responsive grid layout with smart defaults based on content
Params
-
divDivcomponents to put in the grid -
cols_minMinimum number of columns at any screen size -
cols_maxMaximum number of columns allowed at any screen size -
cols_smNumber of columns on small screens -
cols_mdNumber of columns on medium screens -
cols_lgNumber of columns on large screens -
cols_xlNumber of columns on extra large screens -
colsNumber of columns on all screens -
clsAdditional classes on the grid (tip:gapprovides spacing for grids) -
kwargs
Returns: Responsive grid component
Practical Grid Example
See Source
See Output
Laptop
$999
Add to Cart
Smartphone
$599
Add to Cart
Headphones
$199
Add to Cart
Smartwatch
$299
Add to Cart
Tablet
$449
Add to Cart
Camera
$799
Add to Cart
[code]
def ex_product_grid():
products = [
{"name": "Laptop", "price": "$999", "img": "https://picsum.photos/200/100?random=1"},
{"name": "Smartphone", "price": "$599", "img": "https://picsum.photos/200/100?random=2"},
{"name": "Headphones", "price": "$199", "img": "https://picsum.photos/200/100?random=3"},
{"name": "Smartwatch", "price": "$299", "img": "https://picsum.photos/200/100?random=4"},
{"name": "Tablet", "price": "$449", "img": "https://picsum.photos/200/100?random=5"},
{"name": "Camera", "price": "$799", "img": "https://picsum.photos/200/100?random=6"},
]
product_cards = [
Card(
Img(src=p["img"], alt=p["name"], style="width:100%; height:100px; object-fit:cover;"),
H4(p["name"], cls="mt-2"),
P(p["price"], cls=TextPresets.bold_sm),
Button("Add to Cart", cls=(ButtonT.primary, "mt-2"))
) for p in products
]
return Grid(*product_cards, cols_lg=3)
[/code]
Flex
Play Flex Box Froggy to get an understanding of flex box.
DivFullySpaced
Source
[code]
DivFullySpaced(*c, cls='w-full', **kwargs)
[/code]
Creates a flex div with it's components having as much space between them as possible
Params
-
cComponents -
clsClasses for outer div (w-fullmakes it use all available width) -
kwargs
See Source
See Output
LeftCenterRight
[code]
def ex_fully_spaced_div():
return DivFullySpaced(
Button("Left", cls=ButtonT.primary),
Button("Center", cls=ButtonT.secondary),
Button("Right", cls=ButtonT.destructive)
)
[/code]
DivCentered
Source
[code]
DivCentered(*c, cls='space-y-4', vstack=True, **kwargs) -> fastcore.xml.FT
[/code]
Creates a flex div with it's components centered in it
Params
-
cComponents -
clsClasses for outer div (space-y-4provides spacing between components) -
vstackWhether to stack the components vertically -
kwargs
Returns: Div with components centered in it
See Source
See Output
Centered Title
This content is centered both horizontally and vertically.
[code]
def ex_centered_div():
return DivCentered(
H3("Centered Title"),
P("This content is centered both horizontally and vertically.")
)
[/code]
DivLAligned
Source
[code]
DivLAligned(*c, cls='space-x-4', **kwargs) -> fastcore.xml.FT
[/code]
Creates a flex div with it's components aligned to the left
Params
-
cComponents -
clsClasses for outer div -
kwargs
Returns: Div with components aligned to the left
See Source
See Output
Left Aligned Title
Some text that's left-aligned with the title and image.
[code]
def ex_l_aligned_div():
return DivLAligned(
Img(src="https://picsum.photos/100/100?random=1", style="max-width: 100px;"),
H4("Left Aligned Title"),
P("Some text that's left-aligned with the title and image.")
)
[/code]
DivRAligned
Source
[code]
DivRAligned(*c, cls='space-x-4', **kwargs) -> fastcore.xml.FT
[/code]
Creates a flex div with it's components aligned to the right
Params
-
cComponents -
clsClasses for outer div -
kwargs
Returns: Div with components aligned to the right
See Source
See Output
Action
Right-aligned text
[code]
def ex_r_aligned_div():
return DivRAligned(
Button("Action", cls=ButtonT.primary),
P("Right-aligned text"),
Img(src="https://picsum.photos/100/100?random=3", style="max-width: 100px;")
)
[/code]
DivVStacked
Source
[code]
DivVStacked(*c, cls='space-y-4', **kwargs) -> fastcore.xml.FT
[/code]
Creates a flex div with it's components stacked vertically
Params
-
cComponents -
clsAdditional classes on the div (tip:space-y-4provides spacing between components) -
kwargs
Returns: Div with components stacked vertically
See Source
See Output
Vertical Stack
First paragraph in the stack
Second paragraph in the stack
Action Button
[code]
def ex_v_stacked_div():
return DivVStacked(
H2("Vertical Stack"),
P("First paragraph in the stack"),
P("Second paragraph in the stack"),
Button("Action Button", cls=ButtonT.secondary)
)
[/code]
DivHStacked
Source
[code]
DivHStacked(*c, cls='space-x-4', **kwargs) -> fastcore.xml.FT
[/code]
Creates a flex div with it's components stacked horizontally
Params
-
cComponents -
clsAdditional classes on the div (space-x-4provides spacing between components) -
kwargs
Returns: Div with components stacked horizontally
See Source
See Output
Column 1
Content for column 1
Column 2
Content for column 2
Column 3
Content for column 3
[code]
def ex_h_stacked_div():
return DivHStacked(
Div(H4("Column 1"), P("Content for column 1")),
Div(H4("Column 2"), P("Content for column 2")),
Div(H4("Column 3"), P("Content for column 3"))
)
[/code]
FlexT
Flexbox modifiers using Tailwind CSS
| Option | Value | Option | Value | Option | Value | Option | Value |
|---|---|---|---|---|---|---|---|
| block | flex | inline | inline-flex | left | justify-start | center | justify-center |
| right | justify-end | between | justify-between | around | justify-around | stretch | items-stretch |
| top | items-start | middle | items-center | bottom | items-end | row | flex-row |
| row_reverse | flex-row-reverse | column | flex-col | column_reverse | flex-col-reverse | nowrap | flex-nowrap |
| wrap | flex-wrap | wrap_reverse | flex-wrap-reverse |