|
-
- # Layout ------------------------------------------------------------------
-
- #' Bulma Level
- #'
- #' A multi-purpose horizontal level that can contain almost any other element.
- #'
- #' @param ... Items to be wrapped in a `"level-item"` `<div>` and included in the
- #' main level container. If only one argument is provided and that argument is
- #' a list, the items inside the list will be treated as individual level items.
- #' @param left A list of items to be placed in the left side of the level in a
- #' `"level-left"` container.
- #' @param right A list of items to be placed in the right side of the level in a
- #' `"level-right"` container.
- #' @param type One of `"item"` or `"header"`. The default (`"item"`) places level
- #' items in the standard `"level-item"` container. Use `"header"` to use the
- #' names of the arguments in `...` as headers over their elements to create a
- #' large single-row pseudo-table. See examples for more details.
- #' @param container_tag Which tag should be used for the main `"level"` container?
- #' One of `"div"` or `"nav"`.
- #' @param class Additional classes applied to level container
- #' @param style Additional style parameters applied to level container
- #' @param level_class Additional classes applied to all level item containers (except
- #' for manually created level items).
- #' @param level_style Additional style arguments applied to all level item containers
- #' (except for manually create level items).
- #' @examples
- #' bulma_level("Home", "Menu", "Bulma", "Reservations", "Contact")
- #' bulma_level("Tweets" = 3456, Following = 123, Followers = "456K", Likes = 789, type = "header")
- #'
- #' iris_vals <- lapply(iris, function(x) length(unique(x)))
- #' bulma_level(iris_vals, type = "header")
- #'
- #' @references <https://bulma.io/documentation/layout/level/>
- #' @family Bulma layouts
- #' @export
- bulma_level <- function(
- ...,
- left = NULL,
- right = NULL,
- is_mobile = TRUE,
- type = c("item", "header"),
- container_tag = c("div", "nav"),
- class = NULL,
- style = NULL,
- level_class = NULL,
- level_style = NULL
- ) {
- type <- match.arg(type)
- tag_f <- tag_function(match.arg(container_tag))
- x <- tag_f(
- class = c_str("level", if (is_mobile) "is-mobile", class),
- style = style,
- level_side(left, "left"),
- if (type == "item")
- tagList(lapply(dots2list(...), bulma_level_item, class = level_class, style = level_style)),
- if (type == "header") bulma_level_items_header(..., class = level_class, style = level_style),
- level_side(right, "right")
- )
-
- x
- }
-
- #' Bulma Level Item
- #'
- #' Constructs an individual level item.
- #'
- #' @param ... Elements to be included in the level item
- #' @param class Additional classes to be applied to the level item container
- #' @param style Additional CSS style directives to be applied to the level item container
- #' @family Bulma layouts
- #' @export
- bulma_level_item <- function(..., class = NULL, style = NULL) {
- item <- dots2list(...)
- if (is_level_item(item)) return(item)
- as_level_item(
- tag_div(class = c_str("level-item", class),
- style = style,
- item)
- )
- }
-
- as_level_item <- function(x) {
- if (inherits(x, "level_item")) return(x)
- class(x) <- c("level_item", class(x))
- x
- }
-
- is_level_item <- function(x) inherits(x, "level_item")
-
- level_side <- function(x, side = "left") {
- if (is.null(x)) return(NULL)
- match.arg(side, c("left", "right"))
- items <- lapply(x, bulma_level_item)
- tag_div(class = c_prefix(side, "level-"), items)
- }
-
- #' Bulma Level Items with Headers
- #'
- #' Takes named arguments and converts them to
- #' (level items with headers)[bulma_level_item_header].
- #'
- #' @inheritParams bulma_level_item
- #' @param header_class Additional classes to be applied to the header (upper)
- #' container in addition to `"heading"`
- #' @param body_class Additional classes to be applied to the title (lower)
- #' container in addition to `"title"`
- #' @family Bulma layouts
- #' @export
- bulma_level_items_header <- function(..., class = NULL, style = NULL, header_class = NULL, body_class = NULL) {
- items <- dots2list(...)
- x <- map_arg(
- .f = bulma_level_item_header,
- names(items),
- items,
- .args = list(class = if (is.null(class)) "has-text-centered" else class,
- style = style,
- header_class = header_class,
- body_class = body_class)
- )
- tagList(x)
- }
-
- #' Bulma Level Item with Header
- #'
- #' Constructs an individual level item with a header (upper) and a title (lower).
- #'
- #' @param item_name The header (or name) of the item
- #' @param item_body The body of the item
- #' @inheritParams bulma_level_items_header
- #' @family Bulma layouts
- #' @export
- bulma_level_item_header <- function(item_header, item_body, class = NULL, style = NULL, header_class = NULL, body_class = NULL) {
- bulma_level_item(
- class = class,
- style = style,
- tag_div(
- tag_p(class = c_str("heading", header_class), item_header),
- tag_p(class = c_str("title", body_class), item_body)
- ))
- }
|