Layout in bootstrict is the Bootstrap 5 layout system,
one-to-one: a page, an optional container, the responsive 12-column
grid, and flex stacks for simpler one-dimensional arrangements.
Pages
Every app is wrapped in a page constructor. There are three:
| Constructor | Use for |
|---|---|
bs_page() |
the default fixed-width page |
bs_page_fluid() |
a full-width page |
bs_page_fillable() |
a page whose content fills the viewport height |
All three share the same signature:
bs_page(
..., # page content (and named HTML attributes)
title = NULL, # browser tab / document title
theme = bootstrict_theme(), # a bootstrict_theme()
color_mode = NULL, # "light" or "dark" — sets data-bs-theme
lang = "en"
)A page wires in the bootstrict dependency and the theme,
so it is the only place you configure them:
bs_page(
title = "My app",
theme = bootstrict_theme(primary = "#ff6600"),
color_mode = "light",
bs_container(bs_card(bs_card_body("Hello")))
)See Theming for theme and
color_mode.
Containers
bs_container() centres and horizontally pads its
content. By default it is fixed-width with a responsive max-width;
fluid = TRUE makes it span the full width, and
breakpoint= makes it fluid until a chosen
breakpoint.
bs_container(
...,
fluid = FALSE, # TRUE for a full-width .container-fluid
breakpoint = NULL, # "sm"/"md"/"lg"/"xl"/"xxl" for .container-{bp}
class = NULL
)
bs_container(bs_row(bs_col("a"), bs_col("b"))) # fixed width
bs_container(fluid = TRUE, "full-width content") # 100% wide
bs_container(breakpoint = "lg", "fluid below lg") # full width until lgThe grid: rows and columns
Bootstrap’s grid is a set of rows, each split into up to 12 columns.
bs_row()
bs_row(
..., # bs_col() children (and named attributes)
cols = NULL, # equal-width columns per row: integer 1-6, or "auto"
gutters = NULL, # gutter size 0-5 (both axes)
gx = NULL, # horizontal gutter 0-5
gy = NULL, # vertical gutter 0-5
justify = NULL, # "start"/"center"/"end"/"around"/"between"/"evenly"
align = NULL, # cross-axis: "start"/"center"/"end"
class = NULL
)
bs_col()
bs_col(
..., # column content
width = NULL, # base span: 1-12, "auto", or TRUE (equal-width)
sm = NULL, # span from the sm breakpoint up
md = NULL, # ... md
lg = NULL, # ... lg
xl = NULL, # ... xl
xxl = NULL, # ... xxl
offset = NULL, # push right by 0-11 columns
order = NULL, # 0-5, "first" or "last"
align_self = NULL, # "start"/"center"/"end"
class = NULL
)A column with no width is a bare .col and
shares the row’s space equally with its siblings:
Responsive spans
The breakpoint arguments (width, sm,
md, …) let one column change width as the viewport grows. A
common pattern — full width on phones, a third of the row from
md up:
bs_container(
bs_row(
class = "g-3",
bs_col(md = 4, bs_card(bs_card_body("A"))),
bs_col(md = 4, bs_card(bs_card_body("B"))),
bs_col(md = 4, bs_card(bs_card_body("C")))
)
)Here width is unset, so each column is full-width
(.col-12) below md and becomes
.col-md-4 from md up.
Gutters, alignment and order
gutters (or the per-axis gx /
gy) control the spacing between columns;
justify and align position them within the
row; offset and order push and reorder
individual columns:
bs_row(
gutters = 3,
justify = "between",
bs_col(width = 4, "left"),
bs_col(width = 4, offset = 0, order = "last", "shown last")
)Several grid arguments also accept a named per-breakpoint list for responsive behaviour — for instance a wider gutter only on large screens, or a different equal-column count per breakpoint:
Stacks
For simple one-dimensional layouts, flex stacks are
lighter than the grid. bs_hstack() lays children out in a
row, bs_vstack() in a column; gap= (0-5) sets
the spacing between them.
bs_hstack(
bs_button(label = "A"),
bs_button(label = "B"),
gap = 2
)
bs_vstack(
bs_alert("one"),
bs_alert("two"),
gap = 3
)Because stacks are plain flex containers, they combine naturally with
Bootstrap utility classes passed through class — for
example to right-align a toolbar:
bs_hstack(
gap = 3,
class = "justify-content-end align-items-center",
bs_switch_input("dark", "Dark mode", width = "auto"),
bs_button("open", "Filters", color = "primary")
)