Layouts¶
Mesop takes an unopinionated approach to layout. It does not impose a specific layout on your app so you can build custom layouts. The crux of doing layouts in Mesop is the Box component and using the Style API which are Pythonic wrappers around the CSS layout model.
For most Mesop apps, you will use some combination of these types of layouts:
Common layout examples¶
To interact with the examples below, open the Mesop Layouts Colab:
Rows and Columns¶
Basic Row¶
def row():
with me.box(style=me.Style(display="flex", flex_direction="row")):
me.text("Left")
me.text("Right")
Row with Spacing¶
def row():
with me.box(style=me.Style(display="flex", flex_direction="row", justify_content="space-around")):
me.text("Left")
me.text("Right")
Row with Alignment¶
def row():
with me.box(style=me.Style(display="flex", flex_direction="row", align_items="center")):
me.box(style=me.Style(background="red", height=50, width="50%"))
me.box(style=me.Style(background="blue", height=100, width="50%"))
Rows and Columns¶
def app():
with me.box(style=me.Style(display="flex", flex_direction="row", gap=16, height="100%")):
column(1)
column(2)
column(3)
def column(num: int):
with me.box(style=me.Style(
flex_grow=1,
background="#e0e0e0",
padding=me.Padding.all(16),
display="flex",
flex_direction="column",
)):
me.box(style=me.Style(background="red", height=100))
me.box(style=me.Style(background="blue", flex_grow=1))
Grids¶
Side-by-side Grid¶
def grid():
# 1fr means 1 fraction, so each side is the same size.
# Try changing one of the 1fr to 2fr and see what it looks like
with me.box(style=me.Style(display="grid", grid_template_columns="1fr 1fr")):
me.text("A bunch of text")
me.text("Some more text")
Header Body Footer Grid¶
def app():
with me.box(style=me.Style(
display="grid",
grid_template_rows="auto 1fr auto",
height="100%"
)):
# Header
with me.box(style=me.Style(
background="#f0f0f0",
padding=me.Padding.all(24)
)):
me.text("Header")
# Body
with me.box(style=me.Style(
padding=me.Padding.all(24),
overflow_y="auto"
)):
me.text("Body Content")
# Add more body content here
# Footer
with me.box(style=me.Style(
background="#f0f0f0",
padding=me.Padding.all(24)
)):
me.text("Footer")
Sidebar Layout¶
def app():
with me.box(style=me.Style(
display="grid",
grid_template_columns="250px 1fr",
height="100%"
)):
# Sidebar
with me.box(style=me.Style(
background="#f0f0f0",
padding=me.Padding.all(24),
overflow_y="auto"
)):
me.text("Sidebar")
# Main content
with me.box(style=me.Style(
padding=me.Padding.all(24),
overflow_y="auto"
)):
me.text("Main Content")
Responsive UI¶
This is similar to the Grid Sidebar layout above, except on smaller screens, we will hide the sidebar. Try resizing the browser window and see how the UI changes.
Learn more about responsive UI in the viewport size docs.
def app():
is_desktop = me.viewport_size().width > 640
with me.box(style=me.Style(
display="grid",
grid_template_columns="250px 1fr" if is_desktop else "1fr",
height="100%"
)):
if is_desktop:
# Sidebar
with me.box(style=me.Style(
background="#f0f0f0",
padding=me.Padding.all(24),
overflow_y="auto"
)):
me.text("Sidebar")
# Main content
with me.box(style=me.Style(
padding=me.Padding.all(24),
overflow_y="auto"
)):
me.text("Main Content")
Learn more¶
For a real-world example of using these types of layouts, check out the Mesop Showcase app:
To learn more about flexbox layouts (rows and columns), check out:
To learn more about grid layouts, check out: