From 18a52242bb67755d1c7565105061e492ab743e40 Mon Sep 17 00:00:00 2001 From: cpsievert Date: Mon, 29 Jul 2024 20:35:03 +0000 Subject: [PATCH] Built site for bslib@0.8.0: 112efd0 --- CODE_OF_CONDUCT.html | 2 +- PULL_REQUEST_TEMPLATE.html | 2 +- .../examples/linked-htmlwidgets/index.html | 4 +- .../page-fillable-htmlwidgets/index.html | 12 ++-- articles/any-project/index.html | 2 +- articles/bs4-variables/index.html | 4 +- articles/bs5-variables/index.html | 4 +- articles/cards/index.html | 66 ++++++++--------- articles/column-layout/index.html | 16 ++--- articles/custom-components/index.html | 2 +- .../dashboards/examples/scrolling-layout.png | Bin 55149 -> 55147 bytes articles/dashboards/index.html | 2 +- articles/examples/index.html | 2 +- .../examples/full-screen-cards/index.html | 12 ++-- .../examples/multiple-columns/index.html | 6 +- .../filling/examples/page-fillable/index.html | 6 +- .../examples/sidebar-layouts/index.html | 16 ++--- .../filling/examples/value-boxes/index.html | 6 +- articles/filling/index.html | 2 +- .../examples/hello-layout-sidebar/index.html | 10 +-- .../sidebars/examples/multi-page/index.html | 44 ++++++------ .../examples/page-fill-double/index.html | 8 +-- .../examples/restricting-growth/index.html | 18 ++--- .../examples/shiny-dynamic-sidebar/index.html | 16 ++--- .../examples/shiny-sidebar-state/index.html | 12 ++-- articles/sidebars/index.html | 68 +++++++++--------- articles/theming/index.html | 2 +- articles/tooltips-popovers/index.html | 2 +- articles/utility-classes/index.html | 2 +- .../examples/fill-false/index.html | 2 +- articles/value-boxes/index.html | 6 +- articles/why-sass/index.html | 2 +- authors.html | 2 +- news/index.html | 4 +- pkgdown.yml | 2 +- reference/accordion.html | 2 +- reference/accordion_panel_set.html | 2 +- reference/as.tags.bslib_sidebar.html | 2 +- reference/as_fill_carrier.html | 2 +- reference/bind_task_button.html | 2 +- reference/bootswatch_themes.html | 2 +- reference/breakpoints.html | 2 +- reference/bs_bundle.html | 2 +- reference/bs_current_theme.html | 2 +- reference/bs_dependency.html | 2 +- reference/bs_get_variables.html | 2 +- reference/bs_global_theme.html | 2 +- reference/bs_remove.html | 2 +- reference/bs_theme.html | 2 +- reference/bs_theme_dependencies.html | 2 +- reference/bs_theme_preview.html | 2 +- reference/bslib-package.html | 2 +- reference/builtin_themes.html | 2 +- reference/card.html | 2 +- reference/card_body.html | 2 +- reference/deprecated.html | 2 +- reference/font_face.html | 2 +- reference/html-browse.html | 2 +- reference/input_dark_mode.html | 2 +- reference/input_switch.html | 2 +- reference/input_task_button.html | 2 +- reference/layout_column_wrap.html | 2 +- reference/layout_columns.html | 2 +- reference/nav-items.html | 2 +- reference/nav_prepend.html | 2 +- reference/nav_select.html | 2 +- reference/navset.html | 2 +- reference/page.html | 2 +- reference/page_fillable.html | 2 +- reference/page_navbar.html | 2 +- reference/page_sidebar.html | 2 +- reference/popover.html | 2 +- reference/precompiled_css_path.html | 2 +- reference/reexports.html | 2 +- reference/run_with_themer.html | 2 +- reference/save-html.html | 2 +- reference/sidebar.html | 2 +- reference/theme_bootswatch.html | 2 +- reference/theme_version.html | 2 +- reference/tooltip.html | 2 +- reference/value_box.html | 2 +- reference/versions.html | 2 +- search.json | 2 +- 83 files changed, 231 insertions(+), 231 deletions(-) diff --git a/CODE_OF_CONDUCT.html b/CODE_OF_CONDUCT.html index 7842c02dd..6b12b5718 100644 --- a/CODE_OF_CONDUCT.html +++ b/CODE_OF_CONDUCT.html @@ -69,7 +69,7 @@
diff --git a/PULL_REQUEST_TEMPLATE.html b/PULL_REQUEST_TEMPLATE.html index aa8cb4846..7779b38cd 100644 --- a/PULL_REQUEST_TEMPLATE.html +++ b/PULL_REQUEST_TEMPLATE.html @@ -69,7 +69,7 @@
diff --git a/articles/any-project/examples/linked-htmlwidgets/index.html b/articles/any-project/examples/linked-htmlwidgets/index.html index da2fcd190..57ec40d53 100644 --- a/articles/any-project/examples/linked-htmlwidgets/index.html +++ b/articles/any-project/examples/linked-htmlwidgets/index.html @@ -52,7 +52,7 @@

Client-side filtering

-
+ diff --git a/articles/bs5-variables/index.html b/articles/bs5-variables/index.html index 18646f1dc..0d80cd83f 100644 --- a/articles/bs5-variables/index.html +++ b/articles/bs5-variables/index.html @@ -115,7 +115,7 @@

Bootstrap 5 variables

- Source: vignettes/bs5-variables/index.Rmd + Source: vignettes/bs5-variables/index.Rmd
index.Rmd
@@ -161,7 +161,7 @@

Bootstrap 5 variables

- + diff --git a/articles/cards/index.html b/articles/cards/index.html index 6ede483ce..1122f217a 100644 --- a/articles/cards/index.html +++ b/articles/cards/index.html @@ -114,7 +114,7 @@

Cards

- Source: vignettes/cards/index.Rmd + Source: vignettes/cards/index.Rmd
index.Rmd
@@ -266,7 +266,7 @@

Restricting growth), lorem::ipsum(paragraphs = 3, sentences = 5) ) -
+
A long, scrolling, description

Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie.

@@ -302,11 +302,11 @@

Filling outputs card_header("A filling plot"), card_body(plotly_widget) )

-
+
A filling plot
- +
@@ -338,7 +338,7 @@

Filling outputs "Copyright 2023 RStudio, PBC" ) )

-
+
A filling map
-
- +
+
@@ -435,11 +435,11 @@

Multiple card_body())

-
+
Filling plot, scrolling description
- +
-
+
Filling plot, short description
- +
-
+
A multi-column filling layout
-
+
A filling plot
- +
-
+
-
+
-
-
+
+
A plotly plot
- +
-
+
A leaflet plot
-
+

Learn more about htmlwidgets

@@ -686,17 +686,17 @@
-
+
A sidebar layout inside a card
- +
-
@@ -734,7 +734,7 @@

Static images)

-
+
Shiny's hex sticker
@@ -818,11 +818,11 @@

Flexbox)

-
+
A plot with an action links
- +

Here's a simple hyperlink.

@@ -852,7 +852,7 @@

Flexbox)

-
+
-
+
Filling content
@@ -248,7 +248,7 @@

Responsive number of columns -
+
Filling content
@@ -292,7 +292,7 @@

Fixed column width -
+
-
+
Filling content
@@ -385,7 +385,7 @@

By cell

-
+
Filling content
-
+
Filling content
-
+
Filling content
diff --git a/articles/dashboards/examples/scrolling-layout.png b/articles/dashboards/examples/scrolling-layout.png index 79562d9c0540141a627e100e8cbcf854a87a9846..8711d4c39ef9cee4bdc985c272088cbe805f2576 100644 GIT binary patch delta 36248 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 F{{Y@}gAM=y delta 36210 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 diff --git a/articles/dashboards/index.html b/articles/dashboards/index.html index a75d391de..eb381e058 100644 --- a/articles/dashboards/index.html +++ b/articles/dashboards/index.html @@ -106,7 +106,7 @@

Dashboards

- Source:
vignettes/dashboards/index.Rmd + Source: vignettes/dashboards/index.Rmd
index.Rmd
diff --git a/articles/examples/index.html b/articles/examples/index.html index af89ce9a9..fe39ba547 100644 --- a/articles/examples/index.html +++ b/articles/examples/index.html @@ -106,7 +106,7 @@

Examples

- Source: vignettes/examples/index.Rmd + Source: vignettes/examples/index.Rmd
index.Rmd
diff --git a/articles/filling/examples/full-screen-cards/index.html b/articles/filling/examples/full-screen-cards/index.html index b4bdc07ea..26a5ddafb 100644 --- a/articles/filling/examples/full-screen-cards/index.html +++ b/articles/filling/examples/full-screen-cards/index.html @@ -28,11 +28,11 @@
-
+
Diamond price
- +
@@ -42,11 +42,11 @@
-
+
Diamond carat
- +
@@ -56,11 +56,11 @@
-
+
Diamond cut by clarity
- +
diff --git a/articles/filling/examples/multiple-columns/index.html b/articles/filling/examples/multiple-columns/index.html index 27791c5be..135b5d7a5 100644 --- a/articles/filling/examples/multiple-columns/index.html +++ b/articles/filling/examples/multiple-columns/index.html @@ -30,14 +30,14 @@

Diamond plots

- +
- +
- + diff --git a/articles/filling/examples/page-fillable/index.html b/articles/filling/examples/page-fillable/index.html index ef5b165b7..218802200 100644 --- a/articles/filling/examples/page-fillable/index.html +++ b/articles/filling/examples/page-fillable/index.html @@ -27,10 +27,10 @@

Diamond plots

- +
- +
- + diff --git a/articles/filling/examples/sidebar-layouts/index.html b/articles/filling/examples/sidebar-layouts/index.html index e97dd5484..73befb073 100644 --- a/articles/filling/examples/sidebar-layouts/index.html +++ b/articles/filling/examples/sidebar-layouts/index.html @@ -30,11 +30,11 @@
-
+
Diamond price
- +
@@ -44,11 +44,11 @@
-
+
Diamond carat
- +
@@ -58,11 +58,11 @@
-
+
Diamond cut by clarity
- +
@@ -71,13 +71,13 @@
-
diff --git a/articles/filling/examples/value-boxes/index.html b/articles/filling/examples/value-boxes/index.html index f7ef2d542..8237f697d 100644 --- a/articles/filling/examples/value-boxes/index.html +++ b/articles/filling/examples/value-boxes/index.html @@ -75,14 +75,14 @@
- +
- +
- + diff --git a/articles/filling/index.html b/articles/filling/index.html index 6176939c8..c30dcb1dd 100644 --- a/articles/filling/index.html +++ b/articles/filling/index.html @@ -107,7 +107,7 @@

Filling layouts

- Source: vignettes/filling/index.Rmd + Source: vignettes/filling/index.Rmd
index.Rmd
diff --git a/articles/sidebars/examples/hello-layout-sidebar/index.html b/articles/sidebars/examples/hello-layout-sidebar/index.html index 4a4b0003a..bfef9b916 100644 --- a/articles/sidebars/examples/hello-layout-sidebar/index.html +++ b/articles/sidebars/examples/hello-layout-sidebar/index.html @@ -48,9 +48,9 @@
- +
-
@@ -84,7 +84,7 @@
-
diff --git a/articles/sidebars/examples/multi-page/index.html b/articles/sidebars/examples/multi-page/index.html index 721c6228e..5e06fd2b5 100644 --- a/articles/sidebars/examples/multi-page/index.html +++ b/articles/sidebars/examples/multi-page/index.html @@ -49,7 +49,7 @@
-
-
+
+
-
-
-
+
+
- +
-
@@ -134,13 +134,13 @@
-
+
- +
-
@@ -175,13 +175,13 @@
-
+
- +
-
diff --git a/articles/sidebars/examples/page-fill-double/index.html b/articles/sidebars/examples/page-fill-double/index.html index a637887c7..72d73646f 100644 --- a/articles/sidebars/examples/page-fill-double/index.html +++ b/articles/sidebars/examples/page-fill-double/index.html @@ -24,17 +24,17 @@

Left and right sidebar

-
diff --git a/articles/sidebars/examples/restricting-growth/index.html b/articles/sidebars/examples/restricting-growth/index.html index 178f1ebe1..56db6ba0a 100644 --- a/articles/sidebars/examples/restricting-growth/index.html +++ b/articles/sidebars/examples/restricting-growth/index.html @@ -46,17 +46,17 @@

Sidebar demo

-
+
- +
- +
- +
-
@@ -134,13 +134,13 @@

Sidebar demo

-
+
-
diff --git a/articles/sidebars/examples/shiny-dynamic-sidebar/index.html b/articles/sidebars/examples/shiny-dynamic-sidebar/index.html index 07cb97a6d..6f42afbfc 100644 --- a/articles/sidebars/examples/shiny-dynamic-sidebar/index.html +++ b/articles/sidebars/examples/shiny-dynamic-sidebar/index.html @@ -25,12 +25,12 @@ -
@@ -39,9 +39,9 @@
-
-
Page 1 contents
-
Page 2 contents
+
+
Page 1 contents
+
Page 2 contents
-
diff --git a/articles/sidebars/examples/shiny-sidebar-state/index.html b/articles/sidebars/examples/shiny-sidebar-state/index.html index 8c45c1782..30be32bfa 100644 --- a/articles/sidebars/examples/shiny-sidebar-state/index.html +++ b/articles/sidebars/examples/shiny-sidebar-state/index.html @@ -25,12 +25,12 @@ -
@@ -39,9 +39,9 @@ diff --git a/articles/utility-classes/index.html b/articles/utility-classes/index.html index 18b8aea23..b4898ee63 100644 --- a/articles/utility-classes/index.html +++ b/articles/utility-classes/index.html @@ -106,7 +106,7 @@

Utility classes

- Source: vignettes/utility-classes/index.Rmd + Source: vignettes/utility-classes/index.Rmd
index.Rmd
diff --git a/articles/value-boxes/examples/fill-false/index.html b/articles/value-boxes/examples/fill-false/index.html index c85a12708..e539a8c0c 100644 --- a/articles/value-boxes/examples/fill-false/index.html +++ b/articles/value-boxes/examples/fill-false/index.html @@ -62,7 +62,7 @@
- +
diff --git a/articles/value-boxes/index.html b/articles/value-boxes/index.html index 1a3aa8927..ee6c2d70d 100644 --- a/articles/value-boxes/index.html +++ b/articles/value-boxes/index.html @@ -109,7 +109,7 @@

Value boxes

- Source: vignettes/value-boxes/index.Rmd + Source: vignettes/value-boxes/index.Rmd
index.Rmd
@@ -462,12 +462,12 @@

Expandable sparklines full_screen = TRUE, theme = "success" )

-
+
- +
diff --git a/authors.html b/authors.html index ae01733c0..ca8686c3d 100644 --- a/authors.html +++ b/authors.html @@ -114,7 +114,7 @@

Authors

Citation

-

Source: DESCRIPTION

+

Source: DESCRIPTION

Sievert C, Cheng J, Aden-Buie G (2024). bslib: Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'. diff --git a/news/index.html b/news/index.html index 0048a921b..1ee2e6837 100644 --- a/news/index.html +++ b/news/index.html @@ -69,11 +69,11 @@

-

bslib 0.8.0

+

bslib 0.8.0

CRAN release: 2024-07-29

Breaking changes

  • To help reduce the potential for squashed content, the main content area of page_sidebar() and page_navbar() with a sidebar now have a (customizable) minimum height and width on a “medium-sized” window. To revert to previous behavior, set theme = bs_theme("bslib-page-main-min-height" = "unset", "bslib-page-main-min-width" = "unset"). (#1057, #1059, #1084)

  • diff --git a/pkgdown.yml b/pkgdown.yml index f677875e5..a2b1dac63 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -17,7 +17,7 @@ articles: utility-classes/index: utility-classes/index.html value-boxes/index: value-boxes/index.html why-sass/index: why-sass/index.html -last_built: 2024-07-29T16:59Z +last_built: 2024-07-29T20:32Z urls: reference: https://rstudio.github.io/bslib/reference article: https://rstudio.github.io/bslib/articles diff --git a/reference/accordion.html b/reference/accordion.html index e4d962e65..92b065c82 100644 --- a/reference/accordion.html +++ b/reference/accordion.html @@ -79,7 +79,7 @@
    diff --git a/reference/accordion_panel_set.html b/reference/accordion_panel_set.html index 37321df74..6a33d5f21 100644 --- a/reference/accordion_panel_set.html +++ b/reference/accordion_panel_set.html @@ -75,7 +75,7 @@
    diff --git a/reference/as.tags.bslib_sidebar.html b/reference/as.tags.bslib_sidebar.html index 9f6b5bed0..0e2f4cb7b 100644 --- a/reference/as.tags.bslib_sidebar.html +++ b/reference/as.tags.bslib_sidebar.html @@ -71,7 +71,7 @@
    diff --git a/reference/as_fill_carrier.html b/reference/as_fill_carrier.html index 85721ee79..37d9ea074 100644 --- a/reference/as_fill_carrier.html +++ b/reference/as_fill_carrier.html @@ -81,7 +81,7 @@
    diff --git a/reference/bind_task_button.html b/reference/bind_task_button.html index 01b846ca7..fd5669aaa 100644 --- a/reference/bind_task_button.html +++ b/reference/bind_task_button.html @@ -87,7 +87,7 @@
    diff --git a/reference/bootswatch_themes.html b/reference/bootswatch_themes.html index 03f61504e..a67e16f5b 100644 --- a/reference/bootswatch_themes.html +++ b/reference/bootswatch_themes.html @@ -69,7 +69,7 @@
    diff --git a/reference/breakpoints.html b/reference/breakpoints.html index 83d2dab2f..f3e6ef7f0 100644 --- a/reference/breakpoints.html +++ b/reference/breakpoints.html @@ -71,7 +71,7 @@
    diff --git a/reference/bs_bundle.html b/reference/bs_bundle.html index d288a68d2..9e9554a8d 100644 --- a/reference/bs_bundle.html +++ b/reference/bs_bundle.html @@ -73,7 +73,7 @@
    diff --git a/reference/bs_current_theme.html b/reference/bs_current_theme.html index 2dd4cbe2e..3349fb3d7 100644 --- a/reference/bs_current_theme.html +++ b/reference/bs_current_theme.html @@ -73,7 +73,7 @@
    diff --git a/reference/bs_dependency.html b/reference/bs_dependency.html index ae9ef3aaf..82ecab352 100644 --- a/reference/bs_dependency.html +++ b/reference/bs_dependency.html @@ -93,7 +93,7 @@
    diff --git a/reference/bs_get_variables.html b/reference/bs_get_variables.html index c14c267ed..0dafbf876 100644 --- a/reference/bs_get_variables.html +++ b/reference/bs_get_variables.html @@ -71,7 +71,7 @@
    diff --git a/reference/bs_global_theme.html b/reference/bs_global_theme.html index b7f27ca64..e1eaa2253 100644 --- a/reference/bs_global_theme.html +++ b/reference/bs_global_theme.html @@ -77,7 +77,7 @@
    diff --git a/reference/bs_remove.html b/reference/bs_remove.html index a357d0860..eef596696 100644 --- a/reference/bs_remove.html +++ b/reference/bs_remove.html @@ -77,7 +77,7 @@
    diff --git a/reference/bs_theme.html b/reference/bs_theme.html index 7ef27a521..1714c4e8c 100644 --- a/reference/bs_theme.html +++ b/reference/bs_theme.html @@ -87,7 +87,7 @@
    diff --git a/reference/bs_theme_dependencies.html b/reference/bs_theme_dependencies.html index 4f7d32e4a..7071ce5cc 100644 --- a/reference/bs_theme_dependencies.html +++ b/reference/bs_theme_dependencies.html @@ -79,7 +79,7 @@
    diff --git a/reference/bs_theme_preview.html b/reference/bs_theme_preview.html index 5f6bae63c..4e0916ce5 100644 --- a/reference/bs_theme_preview.html +++ b/reference/bs_theme_preview.html @@ -77,7 +77,7 @@
    diff --git a/reference/bslib-package.html b/reference/bslib-package.html index fb43e9c08..099a94b3d 100644 --- a/reference/bslib-package.html +++ b/reference/bslib-package.html @@ -69,7 +69,7 @@
    diff --git a/reference/builtin_themes.html b/reference/builtin_themes.html index 6ce7fe448..c01ca7251 100644 --- a/reference/builtin_themes.html +++ b/reference/builtin_themes.html @@ -69,7 +69,7 @@
    diff --git a/reference/card.html b/reference/card.html index b43003491..06de97ce8 100644 --- a/reference/card.html +++ b/reference/card.html @@ -75,7 +75,7 @@
    diff --git a/reference/card_body.html b/reference/card_body.html index e9010c909..85dd854c7 100644 --- a/reference/card_body.html +++ b/reference/card_body.html @@ -75,7 +75,7 @@
    diff --git a/reference/deprecated.html b/reference/deprecated.html index 61a7d4514..d19f27422 100644 --- a/reference/deprecated.html +++ b/reference/deprecated.html @@ -69,7 +69,7 @@
    diff --git a/reference/font_face.html b/reference/font_face.html index d2feeabd7..c5d0501db 100644 --- a/reference/font_face.html +++ b/reference/font_face.html @@ -75,7 +75,7 @@
    diff --git a/reference/html-browse.html b/reference/html-browse.html index 2a56f7cc1..22849a493 100644 --- a/reference/html-browse.html +++ b/reference/html-browse.html @@ -69,7 +69,7 @@
    diff --git a/reference/input_dark_mode.html b/reference/input_dark_mode.html index e5d15cbae..5363dc774 100644 --- a/reference/input_dark_mode.html +++ b/reference/input_dark_mode.html @@ -75,7 +75,7 @@
    diff --git a/reference/input_switch.html b/reference/input_switch.html index 686375eff..351782ca0 100644 --- a/reference/input_switch.html +++ b/reference/input_switch.html @@ -71,7 +71,7 @@
    diff --git a/reference/input_task_button.html b/reference/input_task_button.html index 4ec92636f..3930a7fb4 100644 --- a/reference/input_task_button.html +++ b/reference/input_task_button.html @@ -85,7 +85,7 @@
    diff --git a/reference/layout_column_wrap.html b/reference/layout_column_wrap.html index 63e1c8446..5240726b3 100644 --- a/reference/layout_column_wrap.html +++ b/reference/layout_column_wrap.html @@ -77,7 +77,7 @@
    diff --git a/reference/layout_columns.html b/reference/layout_columns.html index 57fab79c2..3e92287b3 100644 --- a/reference/layout_columns.html +++ b/reference/layout_columns.html @@ -69,7 +69,7 @@
    diff --git a/reference/nav-items.html b/reference/nav-items.html index 89bcbdd1c..834f95ccc 100644 --- a/reference/nav-items.html +++ b/reference/nav-items.html @@ -71,7 +71,7 @@
    diff --git a/reference/nav_prepend.html b/reference/nav_prepend.html index 6ec59f948..ee7f0a088 100644 --- a/reference/nav_prepend.html +++ b/reference/nav_prepend.html @@ -77,7 +77,7 @@
    diff --git a/reference/nav_select.html b/reference/nav_select.html index 0a996e34e..9df815f32 100644 --- a/reference/nav_select.html +++ b/reference/nav_select.html @@ -73,7 +73,7 @@
    diff --git a/reference/navset.html b/reference/navset.html index 8f5ec45fc..0e753b0de 100644 --- a/reference/navset.html +++ b/reference/navset.html @@ -69,7 +69,7 @@
    diff --git a/reference/page.html b/reference/page.html index 9e991c5a7..51a615cc8 100644 --- a/reference/page.html +++ b/reference/page.html @@ -79,7 +79,7 @@
    diff --git a/reference/page_fillable.html b/reference/page_fillable.html index 79ae74ada..2766317da 100644 --- a/reference/page_fillable.html +++ b/reference/page_fillable.html @@ -73,7 +73,7 @@
    diff --git a/reference/page_navbar.html b/reference/page_navbar.html index d99d382e3..49851d86a 100644 --- a/reference/page_navbar.html +++ b/reference/page_navbar.html @@ -75,7 +75,7 @@
    diff --git a/reference/page_sidebar.html b/reference/page_sidebar.html index 76a4023af..40bec9864 100644 --- a/reference/page_sidebar.html +++ b/reference/page_sidebar.html @@ -71,7 +71,7 @@
    diff --git a/reference/popover.html b/reference/popover.html index 4bcf5d246..2fb6fa46b 100644 --- a/reference/popover.html +++ b/reference/popover.html @@ -73,7 +73,7 @@
    diff --git a/reference/precompiled_css_path.html b/reference/precompiled_css_path.html index 4f2a921ff..c4622bcf2 100644 --- a/reference/precompiled_css_path.html +++ b/reference/precompiled_css_path.html @@ -71,7 +71,7 @@
    diff --git a/reference/reexports.html b/reference/reexports.html index 1965fc77f..124e8199e 100644 --- a/reference/reexports.html +++ b/reference/reexports.html @@ -83,7 +83,7 @@
    diff --git a/reference/run_with_themer.html b/reference/run_with_themer.html index 5a361b186..00f1b8026 100644 --- a/reference/run_with_themer.html +++ b/reference/run_with_themer.html @@ -83,7 +83,7 @@
    diff --git a/reference/save-html.html b/reference/save-html.html index 25c03a7f3..ec7f5d4a1 100644 --- a/reference/save-html.html +++ b/reference/save-html.html @@ -69,7 +69,7 @@
    diff --git a/reference/sidebar.html b/reference/sidebar.html index f65c38005..d351ab8f0 100644 --- a/reference/sidebar.html +++ b/reference/sidebar.html @@ -105,7 +105,7 @@
    diff --git a/reference/theme_bootswatch.html b/reference/theme_bootswatch.html index 09695cd30..9f8c509d7 100644 --- a/reference/theme_bootswatch.html +++ b/reference/theme_bootswatch.html @@ -69,7 +69,7 @@
    diff --git a/reference/theme_version.html b/reference/theme_version.html index 064ae107a..8563d67fd 100644 --- a/reference/theme_version.html +++ b/reference/theme_version.html @@ -69,7 +69,7 @@
    diff --git a/reference/tooltip.html b/reference/tooltip.html index 636f9024e..623366b1f 100644 --- a/reference/tooltip.html +++ b/reference/tooltip.html @@ -71,7 +71,7 @@
    diff --git a/reference/value_box.html b/reference/value_box.html index 833f4e511..0d51e6719 100644 --- a/reference/value_box.html +++ b/reference/value_box.html @@ -79,7 +79,7 @@
    diff --git a/reference/versions.html b/reference/versions.html index 95b065cf1..908dfbcd5 100644 --- a/reference/versions.html +++ b/reference/versions.html @@ -69,7 +69,7 @@
    diff --git a/search.json b/search.json index a4f8c80b3..8f50f42f5 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":[]},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"our-pledge","dir":"","previous_headings":"","what":"Our Pledge","title":"Contributor Covenant Code of Conduct","text":"members, contributors, leaders pledge make participation community harassment-free experience everyone, regardless age, body size, visible invisible disability, ethnicity, sex characteristics, gender identity expression, level experience, education, socio-economic status, nationality, personal appearance, race, religion, sexual identity orientation. pledge act interact ways contribute open, welcoming, diverse, inclusive, healthy community.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"our-standards","dir":"","previous_headings":"","what":"Our Standards","title":"Contributor Covenant Code of Conduct","text":"Examples behavior contributes positive environment community include: Demonstrating empathy kindness toward people respectful differing opinions, viewpoints, experiences Giving gracefully accepting constructive feedback Accepting responsibility apologizing affected mistakes, learning experience Focusing best just us individuals, overall community Examples unacceptable behavior include: use sexualized language imagery, sexual attention advances kind Trolling, insulting derogatory comments, personal political attacks Public private harassment Publishing others’ private information, physical email address, without explicit permission conduct reasonably considered inappropriate professional setting","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"enforcement-responsibilities","dir":"","previous_headings":"","what":"Enforcement Responsibilities","title":"Contributor Covenant Code of Conduct","text":"Community leaders responsible clarifying enforcing standards acceptable behavior take appropriate fair corrective action response behavior deem inappropriate, threatening, offensive, harmful. Community leaders right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct, communicate reasons moderation decisions appropriate.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"scope","dir":"","previous_headings":"","what":"Scope","title":"Contributor Covenant Code of Conduct","text":"Code Conduct applies within community spaces, also applies individual officially representing community public spaces. Examples representing community include using official e-mail address, posting via official social media account, acting appointed representative online offline event.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"enforcement","dir":"","previous_headings":"","what":"Enforcement","title":"Contributor Covenant Code of Conduct","text":"Instances abusive, harassing, otherwise unacceptable behavior may reported community leaders responsible enforcement [INSERT CONTACT METHOD]. complaints reviewed investigated promptly fairly. community leaders obligated respect privacy security reporter incident.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"enforcement-guidelines","dir":"","previous_headings":"","what":"Enforcement Guidelines","title":"Contributor Covenant Code of Conduct","text":"Community leaders follow Community Impact Guidelines determining consequences action deem violation Code Conduct:","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"id_1-correction","dir":"","previous_headings":"Enforcement Guidelines","what":"1. Correction","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Use inappropriate language behavior deemed unprofessional unwelcome community. Consequence: private, written warning community leaders, providing clarity around nature violation explanation behavior inappropriate. public apology may requested.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"id_2-warning","dir":"","previous_headings":"Enforcement Guidelines","what":"2. Warning","title":"Contributor Covenant Code of Conduct","text":"Community Impact: violation single incident series actions. Consequence: warning consequences continued behavior. interaction people involved, including unsolicited interaction enforcing Code Conduct, specified period time. includes avoiding interactions community spaces well external channels like social media. Violating terms may lead temporary permanent ban.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"id_3-temporary-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"3. Temporary Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: serious violation community standards, including sustained inappropriate behavior. Consequence: temporary ban sort interaction public communication community specified period time. public private interaction people involved, including unsolicited interaction enforcing Code Conduct, allowed period. Violating terms may lead permanent ban.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"id_4-permanent-ban","dir":"","previous_headings":"Enforcement Guidelines","what":"4. Permanent Ban","title":"Contributor Covenant Code of Conduct","text":"Community Impact: Demonstrating pattern violation community standards, including sustained inappropriate behavior, harassment individual, aggression toward disparagement classes individuals. Consequence: permanent ban sort public interaction within community.","code":""},{"path":"https://rstudio.github.io/bslib/CODE_OF_CONDUCT.html","id":"attribution","dir":"","previous_headings":"","what":"Attribution","title":"Contributor Covenant Code of Conduct","text":"Code Conduct adapted Contributor Covenant, version 2.0, available https://www.contributor-covenant.org/version/2/0/ code_of_conduct.html. Community Impact Guidelines inspired Mozilla’s code conduct enforcement ladder. answers common questions code conduct, see FAQ https://www.contributor-covenant.org/faq. Translations available https://www.contributor-covenant.org/translations.","code":""},{"path":"https://rstudio.github.io/bslib/PULL_REQUEST_TEMPLATE.html","id":"pull-request","dir":"","previous_headings":"","what":"Pull Request","title":"NA","text":"submit pull request, please ensure ’ve completed following checklist Ensure already open relevant GitHub issue describing problem detail ’ve already received indication maintainers welcome contribution fix problem. helps us prevent wasting anyone’s time. Add unit tests tests/testthat directory. project uses roxygen2 documentation. ’ve made changes documentation, run devtools::document(). Run devtools::check() (, equivalently, click Build->Check Package RStudio IDE) make sure change add messages, warnings, errors. Note decent chance tests already failing changes. Just make sure haven’t introduced new ones. Ensure code changes follow style outlined http://r-pkgs..co.nz/style.html Add entry NEWS.md concisely describing changed.","code":""},{"path":"https://rstudio.github.io/bslib/articles/any-project/index.html","id":"shiny","dir":"Articles > Any-project","previous_headings":"","what":"Shiny","title":"Any project","text":"bslib provides handful page_*() functions can used drop-replacements shiny::*Page(). first important difference page_*() provides latest version Bootstrap (default). example: addition, bslib’s page_*() functions provide new capabilities. importantly, cover Shiny dashboards, page_navbar() page_sidebar() provide deep integration sidebar layouts, filling layouts, navbar customizations, theming, . Another new important page_*() function page_fillable(). function provides new approach filling layouts forms foundation higher-level abstractions page_sidebar() page_navbar(). See filling layouts (especially Practice section) learn page_fillable().","code":"library(shiny) # Same as fluidPage(), but with latest Bootstrap ui <- page_fluid( h2(\"Hello world\") ) shinyApp(ui, function(...) {})"},{"path":"https://rstudio.github.io/bslib/articles/any-project/index.html","id":"without-shiny","dir":"Articles > Any-project","previous_headings":"","what":"Without Shiny","title":"Any project","text":"page_*() functions offer means getting started Shiny can also used create static HTML pages (.e., HTML file server-side code). Probably intriguing use case crosstalk (.e., htmlwidgets can linked together). example: since result static HTML, can save HTML file share others email, Slack, etc.: Also, clear, static HTML can also useful without crosstalk. example, can use page_fillable() layout numerous htmlwidgets:","code":"library(crosstalk) library(leaflet) # Use crosstalk to create a client-side filter between the map and slider quake_dat <- SharedData$new(quakes) map_filter <- filter_slider(\"mag\", \"Magnitude\", quake_dat, ~mag) map_quakes <- leaflet(quake_dat) |> addTiles() |> addCircleMarkers() page_sidebar( title = \"Client-side filtering\", sidebar = map_filter, # Can also put other bslib components here # like cards, value boxes, etc. map_quakes ) htmltools::save_html(.Last.value, \"index.html\") plot_card <- card( full_screen = TRUE, card_header(\"Plot\"), plotly::plot_ly() ) page_fillable( layout_columns(plot_card, plot_card), plot_card )"},{"path":"https://rstudio.github.io/bslib/articles/any-project/index.html","id":"r-markdown","dir":"Articles > Any-project","previous_headings":"","what":"R Markdown","title":"Any project","text":"Use theme parameter compatible output format1 get started R Markdown. supplying bslib: true parameter, ’ll get latest “stock” version Bootstrap (akin using page_*() Shiny). Alternatively, can supply bs_theme() parameters theme parameter specify Bootstrap version, add Bootswatch theme, customize theming colors (Getting Started Theming covers depth). bslib also provides R Markdown templates can accessed RStudio going File -> New File -> R Markdown -> Template: addition rmarkdown::html_document, least R Markdown projects compatible bslib. cases, can get started projects pretty similar fashion rmarkdown::html_document. See following articles learn : flexdashboard, pkgdown, bookdown.","code":"--- output: html_document: theme: bslib: true --- --- output: html_document: theme: version: 5 bootswatch: minty primary: \"#6CC3D4\" ---"},{"path":"https://rstudio.github.io/bslib/articles/any-project/index.html","id":"in-production","dir":"Articles > Any-project","previous_headings":"","what":"In production","title":"Any project","text":"deploying bslib project production, ’s wise “hard-code” version Bootstrap used developed. reduces chance project breaking bslib updates ’s Bootstrap dependency. , call version_default() get current version Bootstrap, pass value relevant theme object.","code":"library(shiny) ui <- page_fluid( theme = bs_theme(version = 5), ... ) shinyApp(ui, function(...) {}) --- output: html_document: theme: version: 5 ---"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"setup-code","dir":"Articles > Cards","previous_headings":"","what":"Setup code","title":"Cards","text":"demonstrate bslib cards work outside Shiny (.e., R Markdown, static HTML, etc), ’ll make repeated use statically rendered htmlwidgets like plotly leaflet. ’s code create widgets: Cards work equally well Shiny. examples , replace plotly_widget plotlyOutput() leaflet_widget leafletOutput() adapt Shiny server-rendered plots/maps.","code":"library(bslib) library(shiny) library(htmltools) library(plotly) library(leaflet) plotly_widget <- plot_ly(x = diamonds$cut) %>% config(displayModeBar = FALSE) %>% layout(margin = list(t = 0, b = 0, l = 0, r = 0)) leaflet_widget <- leafletOptions(attributionControl = FALSE) %>% leaflet(options = .) %>% addTiles()"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"hello-card","dir":"Articles > Cards","previous_headings":"","what":"Hello card()","title":"Cards","text":"card() designed handle number “known” card items (e.g., card_header(), card_body(), etc) unnamed arguments (.e., children). ’ll see shortly, card() also useful named arguments (e.g., full_screen, height, etc). core, card() card items just HTML div() special Bootstrap class, can use Bootstrap’s utility classes customize things like colors, text, borders, etc. text link","code":"card( card_header( class = \"bg-dark\", \"A header\" ), card_body( markdown(\"Some text with a [link](https://github.com)\") ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"implicit-card_body","dir":"Articles > Cards","previous_headings":"","what":"Implicit card_body()","title":"Cards","text":"find using card_body() without changing defaults, consider dropping altogether since direct children card() aren’t “known” card() items, wrapped together implicit card_body() call.1 example, code right generates HTML identical previous example: text link.","code":"card( card_header( class = \"bg-dark\", \"A header\" ), markdown(\"Some text with a [link](https://github.com).\") )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"restricting-growth","dir":"Articles > Cards","previous_headings":"","what":"Restricting growth","title":"Cards","text":"default, card()’s size grows accommodate size contents. Thus, card_body() contains large amount text, tables, etc., may want specify height max_height. said, laying multiple cards, ’s likely best specify height card(), instead, let layout determine height layout_column_wrap(). Although scrolling convenient reducing amount space required park lots content, can also nuisance user. help reduce need scrolling, consider pairing scrolling full_screen = TRUE (adds icon expand card’s size browser window). Notice , card expanded full-screen, max_height/height won’t effect full-screen size card. Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"card( max_height = 250, full_screen = TRUE, card_header( \"A long, scrolling, description\" ), lorem::ipsum(paragraphs = 3, sentences = 5) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"filling-outputs","dir":"Articles > Cards","previous_headings":"","what":"Filling outputs","title":"Cards","text":"card()’s default behavior optimized facilitating filling layouts. specifically, fill item (e.g., plotly_widget), appears direct child card_body(), resizes fit card()s specified height. means, specifying height = 250 ’ve effectively shrunk plot’s height default 400 200 pixels. , expanded full_screen, plot grows match card()’s new size. htmlwidgets (e.g., plotly, leaflet, etc) Shiny output bindings (e.g, plotOutput(), imageOutput(), etc) fill items default, behavior “just works” scenarios. , situations, ’s helpful remove card_body()’s padding, can done via spacing & alignment utility classes. Fill item(s) aren’t limited much grow shrink, can problematic card becomes small. work around , consider adding min_height card_body() container. example, try using handle lower-right portion card example make card taller/smaller. interactive example bit contrived ’re using CSS resize demonstrate make plots don’t shrink beyond certain point, concept becomes quite useful implementing page-level filling layouts (.e., page_fillable()) multiple cards. ’ll learn filling layouts, fill item loses ability fill wrapped additional UI element isn’t fillable container. fix situation, use as_fill_carrier() allow additional element carry potential fill card_body() fill item.","code":"card( height = 250, full_screen = TRUE, card_header(\"A filling plot\"), card_body(plotly_widget) ) card( height = 275, full_screen = TRUE, card_header(\"A filling map\"), card_body( class = \"p-0\", leaflet_widget ), card_footer( class = \"fs-6\", \"Copyright 2023 RStudio, PBC\" ) ) card( height = 300, style = \"resize:vertical;\", card_header(\"Plots that grow but don't shrink\"), card_body( min_height = 250, plotly_widget, plotly_widget ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"multiple-card_body","dir":"Articles > Cards","previous_headings":"","what":"Multiple card_body()","title":"Cards","text":"card() can multiple card_body()s, especially useful : Combining resizable non-resizable contents (.e., fill items non-fill). Allowing card_body() styling (via inline styles /utility classes) resizing limits (e.g., min_height). example, pairing filling output scrolling content, may want min_height filling output since scrolling content force shrink: Elit sagittis ante pharetra ligula tincidunt sapien dapibus volutpat. Cursus nam nisl penatibus luctus, eu, praesent suspendisse sagittis curabitur, rhoncus sollicitudin venenatis elementum! Felis habitasse pretium ultricies, arcu lacus: habitant curae, dis venenatis! Interdum fames eros scelerisque cursus: orci phasellus enim sapien aliquam! Est fusce dignissim, commodo iaculis tincidunt fringilla, donec class morbi – elementum auctor scelerisque neque justo netus habitasse. Consectetur proin sodales venenatis, ultricies luctus eget bibendum. Venenatis dis conubia aliquam pretium venenatis habitasse egestas. Dui natoque dui eu aliquet mauris: risus, gravida vitae nunc arcu potenti? Nullam bibendum scelerisque nostra rutrum aenean turpis sagittis orci! Interdum fermentum feugiat eu gravida integer, parturient eros cursus inceptos aenean augue iaculis posuere lacinia tempor ad? Lorem dictumst metus ultricies morbi mus: ullamcorper mus duis. Mauris consequat congue feugiat litora suscipit. Rutrum aliquam ante accumsan inceptos vulputate cum torquent curabitur commodo et lacinia. Fames quisque senectus, vestibulum natoque lacinia. Tortor dis est enim fusce nec. Elit mi dictumst nullam habitasse dis, imperdiet, placerat elementum vivamus. Libero fermentum quis facilisi auctor fermentum fusce potenti eros aliquet arcu. Tempor parturient dui – vulputate metus ultrices consequat: ridiculus molestie cum condimentum. Ad quis montes ridiculus vivamus, dapibus tortor? Na tortor. Elit torquent taciti, sapien ante felis tempus vestibulum lacinia interdum! Vitae magna rhoncus, nunc nisl, etiam magnis mattis aenean fames. Praesent natoque quam nam suspendisse dignissim; pretium, malesuada, massa congue nisi? Cras potenti dis, senectus elementum lacus dapibus natoque laoreet bibendum lacus. Na lacus. Ipsum sodales cubilia torquent leo massa himenaeos erat dignissim. Condimentum sed diam elementum justo congue, luctus curae. Sodales inceptos facilisis ullamcorper, proin odio maecenas natoque ornare iaculis. Placerat scelerisque viverra porta dignissim fermentum eros congue tincidunt et eget! Suspendisse aliquet sem sed donec ultrices convallis nulla penatibus, eget nec laoreet viverra orci eget pharetra; rutrum habitant. Lorem fringilla pulvinar mauris risus ornare . Congue ultricies non platea, neque nisi viverra, class sapien. Libero netus fusce platea parturient auctor taciti molestie egestas lacinia nulla. Sociis natoque curae metus penatibus arcu. Etiam et blandit scelerisque curabitur elementum sagittis etiam, ut quam nascetur fames. Amet porttitor vulputate feugiat – luctus senectus taciti convallis: mauris metus aenean. Mollis malesuada suscipit nam tristique, rhoncus maecenas porttitor nullam? Porta montes rutrum nostra pellentesque taciti proin nibh, nam sem ultricies. Et pulvinar fermentum neque viverra sagittis hendrerit, rhoncus venenatis himenaeos! Facilisis pulvinar venenatis, habitant egestas tortor tincidunt lobortis. Lorem netus mauris dapibus, scelerisque euismod nunc venenatis varius. Sagittis metus habitant, mattis auctor suspendisse suspendisse, orci habitasse? Nam inceptos nisl pellentesque senectus tempor facilisi quam metus mollis, aliquet nec faucibus luctus. Massa cras justo nam id ad ullamcorper porttitor; quisque diam. Viverra sociis. Consectetur convallis senectus accumsan; id cursus porta sem eros. Viverra dignissim, enim ultricies purus sem neque tellus curabitur. Posuere porta orci arcu, fringilla conubia himenaeos urna lacus. Mauris sed aptent, aenean lacinia malesuada turpis justo sagittis class? Na class! Also, content fixed size, allowed scroll, set fill = FALSE: caption","code":"card( height = 375, full_screen = TRUE, card_header( \"Filling plot, scrolling description\" ), card_body( min_height = 200, plotly_widget ), card_body( class = \"lead container\", lorem::ipsum(paragraphs = 10, sentences = 5) ) ) card( height = 350, full_screen = TRUE, card_header( \"Filling plot, short description\" ), plotly_widget, card_body( fill = FALSE, gap = 0, card_title(\"A subtitle\"), p(class = \"text-muted\", \"And a caption\") ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"multiple-columns","dir":"Articles > Cards","previous_headings":"","what":"Multiple columns","title":"Cards","text":"’ll learn column-based layouts, layout_column_wrap() great multi-column layouts responsive accommodate filling output. equal-width 2-column layout using width = 1/2, ’s also possible varying column widths. Dolor nullam gravida tincidunt fringilla ultricies eleifend magna enim. Aptent nisi ornare dictum aliquet penatibus arcu duis euismod? Ornare rutrum suspendisse convallis velit ridiculus, velit tempus est fermentum torquent pellentesque. Eleifend metus, laoreet natoque, primis massa facilisi magnis. Cubilia egestas aptent rutrum pretium interdum , neque, netus inceptos pellentesque. Dolor urna ultrices porttitor cras – taciti magna pharetra penatibus. Cubilia rhoncus dapibus, sodales condimentum arcu proin natoque gravida. Accumsan gravida justo orci lacinia convallis augue condimentum habitant. Curae mattis proin tincidunt dignissim et praesent nunc fusce ultrices litora lacinia! Tincidunt tincidunt euismod platea molestie? Adipiscing cum porta accumsan, fusce hac porta porta. Pharetra suscipit bibendum suscipit pellentesque quisque: purus porta magna. Netus quis cras rutrum mi ultrices: torquent senectus! Mauris varius tincidunt cras habitasse metus ut nisi! Felis erat faucibus vel iaculis ridiculus odio quis nullam quam pulvinar nunc litora!","code":"card( height = 350, full_screen = TRUE, card_header(\"A multi-column filling layout\"), card_body( min_height = 200, layout_column_wrap( width = 1/2, plotOutput(\"p1\"), plotOutput(\"p2\") ) ), lorem::ipsum(paragraphs = 3, sentences = 5) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"multiple-cards","dir":"Articles > Cards","previous_headings":"","what":"Multiple cards","title":"Cards","text":"layout_column_wrap() especially nice laying multiple cards since card particular row height (default). Learn column-based layouts.","code":"layout_column_wrap( width = 1/2, height = 300, card(full_screen = TRUE, card_header(\"A filling plot\"), plotly_widget), card(full_screen = TRUE, card_header(\"A filling map\"), card_body(class = \"p-0\", leaflet_widget)) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"multiple-tabs","dir":"Articles > Cards","previous_headings":"","what":"Multiple tabs","title":"Cards","text":"navset_card_tab() navset_card_pill() make possible create cards multiple tabs pills. functions full_screen capabilities normal card()s well options like title (since natural place card_header() used). Note , nav_panel() object similar card(). , direct children aren’t already card items (e.g., card_title()), get implicitly wrapped card_body(). Plotly Leaflet Learn htmlwidgets","code":"library(leaflet) navset_card_tab( height = 450, full_screen = TRUE, title = \"HTML Widgets\", nav_panel( \"Plotly\", card_title(\"A plotly plot\"), plotly_widget ), nav_panel( \"Leaflet\", card_title(\"A leaflet plot\"), leaflet_widget ), nav_panel( shiny::icon(\"circle-info\"), markdown(\"Learn more about [htmlwidgets](http://www.htmlwidgets.org/)\") ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"sidebars","dir":"Articles > Cards","previous_headings":"","what":"Sidebars","title":"Cards","text":"’ll learn sidebar layouts, layout_sidebar() just works placed inside card(). case, want fill items (e.g., plotly_widget) still fill card like ’ve seen , ’ll need set fillable = TRUE layout_sidebar().","code":"card( height = 300, full_screen = TRUE, card_header(\"A sidebar layout inside a card\"), layout_sidebar( fillable = TRUE, sidebar = sidebar( actionButton(\"btn\", \"A button\") ), plotly_widget ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"static-images","dir":"Articles > Cards","previous_headings":"","what":"Static images","title":"Cards","text":"card_image() makes easy embed static (.e., pre-generated) images card. Provide URL href make clickable. case multiple card_image()s, consider laying multiple cards layout_column_wrap() produce grid clickable thumbnails. Brought RStudio.","code":"card( height = 300, full_screen = TRUE, card_image( file = \"shiny-hex.svg\", alt = \"Shiny's hex sticker\", href = \"https://github.com/rstudio/shiny\" ), card_body( fill = FALSE, card_title(\"Shiny for R\"), p( class = \"fw-light text-muted\", \"Brought to you by RStudio.\" ) ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"flexbox","dir":"Articles > Cards","previous_headings":"","what":"Flexbox","title":"Cards","text":"card() card_body() default fillable = TRUE (, CSS flexbox containers), works wonders facilitating filling outputs, also leads surprising behavior inline tags (e.g., actionButton(), span(), strings, etc). Specifically, inline tag placed new line, “normal” layout flow (fillable = FALSE), inline tags render inline. said, sometimes working flexbox layout quite useful, even working inline tags. leverage flexbox’s gap property control spacing plot, (full-width) button, paragraph. Note , using markdown() paragraph, wraps results

    tag, means contents paragraph longer subject flexbox layout. wanted, something similar render actionButton() inline wrapping div(). simple hyperlink. addition gap, flexbox really nice ways handling otherwise difficult spacing alignment issues. , thanks Bootstrap’s flex utility classes, can easily opt-customize defaults.","code":"card( card_body( fillable = TRUE, \"Here's some\", tags$i(\"inline\"), \"text\", actionButton(\"btn1\", \"A button\") ), card_body( fillable = FALSE, \"Here's some\", tags$i(\"inline\"), \"text\", actionButton(\"btn2\", \"A button\") ) ) card( height = 325, full_screen = TRUE, card_header(\"A plot with an action links\"), card_body( class = \"gap-2 container\", plotly_widget, actionButton( \"go_btn\", \"Action button\", class = \"btn-primary rounded-0\" ), markdown(\"Here's a _simple_ [hyperlink](https://www.google.com/).\") ) ) card( height = 300, full_screen = TRUE, card_header( class = \"d-flex justify-content-between\", \"Centered plot\", checkboxInput(\"check\", \" Check me\", TRUE) ), card_body( class = \"align-items-center\", plotOutput(\"id\", width = \"75%\") ) )"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"shiny","dir":"Articles > Cards","previous_headings":"","what":"Shiny","title":"Cards","text":"Since article statically rendered, examples use statically rendered content/widgets, card() functionality works dynamically rendered content via Shiny (e.g., plotOutput(), plotlyOutput(), etc). additional benefit comes using shiny ability use getCurrentOutputInfo() render new/different content output container becomes large enough, particularly useful card(full_screen = T, ...). example, may want additional captions/labels plot large, additional controls table, etc (see value boxes article clever use ).","code":"# UI logic ui <- page_fluid( card( max_height = 200, full_screen = TRUE, card_header(\"A dynamically rendered plot\"), plotOutput(\"plot_id\") ) ) # Server logic server <- function(input, output, session) { output$plot_id <- renderPlot({ info <- getCurrentOutputInfo() if (info$height() > 600) { # code for \"large\" plot } else { # code for \"small\" plot } }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/cards/index.html","id":"appendix","dir":"Articles > Cards","previous_headings":"","what":"Appendix","title":"Cards","text":"following CSS used give plotOutput() background color; ’s necessary documentation page actually hooked Shiny app, can’t show real plot.","code":".shiny-plot-output { background-color: #216B7288; height: 400px; width: 100%; }"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"uniform-width-and-height","dir":"Articles > Column-layout","previous_headings":"","what":"Uniform width and height","title":"Column-based layout","text":"displaying multiple cards (value boxes, etc) , ’s often visually appealing displayed grid-like layout card height width. layout_column_wrap() optimizes design principle, demands width column (number columns). event cards columns available, cards wrapped new row (default, rows height, can easily vary row height).","code":""},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"fixed-number-of-columns","dir":"Articles > Column-layout","previous_headings":"Uniform width and height","what":"Fixed number of columns","title":"Column-based layout","text":"fixed number columns, provide width = 1/n, n number columns.1 animation (except mobile devices) shows, width layout_column_wrap() container changes, card grows shrinks maintain 1/2 width. Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia. One potential issue fixed number columns , medium sized screens, card width may become small. happens problem, specifying “responsive” number columns may preferable.","code":"layout_column_wrap( width = 1/2, height = 300, card1, card2, card3 ) |> anim_width(\"100%\", \"67%\")"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"responsive-number-of-columns","dir":"Articles > Column-layout","previous_headings":"Uniform width and height","what":"Responsive number of columns","title":"Column-based layout","text":"responsive number columns (.e., number columns depends window size), provide width valid CSS unit, like 200 pixels. case (three cards), 3rd card gets wrapped onto new line viewport less 600 pixels, wider screens, cards equally distribute free space. Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = \"200px\", height = 300, card1, card2, card3 ) |> anim_width(\"100%\", \"67%\")"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"fixed-column-width","dir":"Articles > Column-layout","previous_headings":"Uniform width and height","what":"Fixed column width","title":"Column-based layout","text":"keep width column fixed (don’t allow cards grow take free space), set fixed_width = TRUE. Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = \"200px\", height = 300, fixed_width = TRUE, card1, card2, card3 ) |> anim_width(\"100%\", \"67%\")"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"varying-heights","dir":"Articles > Column-layout","previous_headings":"","what":"Varying heights","title":"Column-based layout","text":"default, layout_column_wrap() wraps columns onto new row, rows given equal height.","code":""},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"by-row","dir":"Articles > Column-layout","previous_headings":"Varying heights","what":"By row","title":"Column-based layout","text":"allow height row different, set heights_equal = \"row\": Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = 1/2, heights_equal = \"row\", card1, card3, card2 ) |> anim_height(300, 450)"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"by-cell","dir":"Articles > Column-layout","previous_headings":"Varying heights","what":"By cell","title":"Column-based layout","text":"Since card fill item default (.e., fill = TRUE), card grows/shrinks fill available vertical space particular row. can prevented setting fill = FALSE particular card. Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = \"200px\", card1, card3, card(fill = FALSE, card_header(\"Nothing much here\"), \"This is it.\" ) ) |> anim_height(300, 450)"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"varying-widths","dir":"Articles > Column-layout","previous_headings":"","what":"Varying widths","title":"Column-based layout","text":"Set width NULL provide custom grid-template-columns property (possibly CSS grid properties) accomplish complex layouts, like varying column widths. particular layout gives 1st 3rd card twice much space 2nd: Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = NULL, height = 300, fill = FALSE, style = css(grid_template_columns = \"2fr 1fr 2fr\"), card1, card2, card3 ) |> anim_height(300, 450)"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"nested-layouts","dir":"Articles > Column-layout","previous_headings":"","what":"Nested layouts","title":"Column-based layout","text":"complex layouts can achieved leveraging fact layout_column_wrap() can appear within another layout_column_wrap()s. example Dolor odio etiam tristique aenean, cubilia ligula leo pulvinar fermentum vestibulum. Hac erat aenean eros dis, integer, ad ultrices ultricies erat rhoncus? Dictumst integer aptent suscipit arcu, turpis, per ultrices, commodo convallis morbi. Proin integer ultrices viverra iaculis cum ut ante ullamcorper. Nulla maecenas molestie. Lorem cursus eu laoreet donec, pulvinar massa non purus, egestas iaculis! Quisque suscipit sociosqu ac, himenaeos eleifend tincidunt auctor elementum enim id netus nibh curabitur. Habitant bibendum – aenean pellentesque neque commodo augue nam. Ullamcorper leo dictumst fermentum , ullamcorper dui aliquet suspendisse dis lacinia facilisis nisl varius? Nullam cum. Dolor faucibus ultricies est suspendisse vestibulum. Ad ultrices elementum luctus montes, sociosqu facilisis primis; senectus augue vulputate eget! Accumsan aliquet auctor, eget sagittis enim; eleifend ornare blandit eros – magnis fusce? Dapibus lacus netus sed id duis nulla quam maecenas feugiat fames senectus dictum cubilia. Mauris arcu lacinia.","code":"layout_column_wrap( width = 1/2, height = 300, card1, layout_column_wrap( width = 1, heights_equal = \"row\", card2, card3 ) )"},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"other-grid-based-layouts","dir":"Articles > Column-layout","previous_headings":"","what":"Other grid-based layouts","title":"Column-based layout","text":"layout_column_wrap() provides simplified interface CSS grid won’t accommodate everything can . case, recommend using {gridlayout} /Shiny UI editor produce layout.","code":""},{"path":"https://rstudio.github.io/bslib/articles/column-layout/index.html","id":"appendix","dir":"Articles > Column-layout","previous_headings":"","what":"Appendix","title":"Column-based layout","text":"spirit reproducibility, section discloses custom CSS R code used examples . following CSS used give plotOutput() background color; ’s necessary documentation page actually hooked Shiny app, can’t show real plot. R functions add animation-related CSS class styles whatever tags give . CSS animation rules power anim_width anim_height R functions.","code":".shiny-plot-output { background-color: #216B7288; height: 400px; width: 100%; } library(htmltools) anim_width <- function(x, width1, width2) { x |> tagAppendAttributes( class = \"animate-width\", style = css( `--width1` = validateCssUnit(width1), `--width2` = validateCssUnit(width2), ), ) } anim_height <- function(x, height1, height2) { # Wrap in a div fixed at the height of height2, so the rest of # the content on the page doesn't shift up and down div(style = css(height = validateCssUnit(height2)), x |> tagAppendAttributes( class = \"animate-height\", style = css( `--height1` = validateCssUnit(height1), `--height2` = validateCssUnit(height2), ), ) ) } @keyframes changewidth { from { width: var(--width1); } 25% { width: var(--width1); } 50% { width: var(--width2); } 75% { width: var(--width2); } to { width: var(--width1); } } .animate-width { animation-duration: 6s; animation-name: changewidth; animation-iteration-count: infinite; border-right: 2px solid #DDD; padding-right: 1rem; padding-bottom: 3rem; } @keyframes changeheight { from { height: var(--height1); } 25% { height: var(--height1); } 50% { height: var(--height2); } 75% { height: var(--height2); } to { height: var(--height1); } } .animate-height { height: 600px; animation-duration: var(--anim-duration, 6s); animation-name: changeheight; animation-iteration-count: infinite; padding-bottom: 3rem; }"},{"path":"https://rstudio.github.io/bslib/articles/custom-components/index.html","id":"a-basic-themeable-component","dir":"Articles > Custom-components","previous_headings":"","what":"A basic themeable component","title":"Custom components","text":"going full-blown dynamically themeable custom component, let’s start relatively straight-forward example implementing custom person() component. Say following R function generate HTML classes ’ll write custom Sass/CSS styles : ’s custom Sass style classes. Since Sass rules listen Bootstrap Sass variables like $gray-600, person() styles works great different bs_theme() input: save Sass rules file named person.scss, can bs_add_rules() bs_theme() use themeable person() component like :","code":"person <- function(name, title, company) { div( class = \"person\", h3(class = \"name\", name), div(class = \"title\", title), div(class = \"company\", company) ) } .person { display: inline-block; padding: $spacer; border: $border-width solid $border-color; @include border-radius; @include box-shadow; outline: 0; width: 300px; .title { font-weight: bold; } .title, .company { color: $gray-600; } margin: $grid-gutter-width; margin-right: 0; // On mobile, span entire width @include media-breakpoint-down(sm) { display: block; width: auto; margin-right: $grid-gutter-width; } } .person:last-of-type { margin-right: $grid-gutter-width; } ui <- fluidPage( theme = bs_theme(bg = \"#002B36\", fg = \"#EEE8D5\") %>% bs_add_rules(sass::sass_file(\"person.scss\")), person(\"Andrew Carnegie\", \"Owner\", \"Carnegie Steel Company\"), person(\"John D. Rockefeller\", \"Chairman\", \"Standard Oil\") ) shinyApp(ui, function(input, output) {})"},{"path":"https://rstudio.github.io/bslib/articles/custom-components/index.html","id":"dynamically-themeable-component","dir":"Articles > Custom-components","previous_headings":"","what":"Dynamically themeable component","title":"Custom components","text":"make custom person() component dynamically themeable (.e., make work session$setCurrentTheme()), need R function generates htmltools::htmlDependency() given theme. required, suppose function, person_dependency, lives R package called {mypkg} includes person.scss (pre-compiled person.css) file inst/ directory. following: Note theme bs_theme() object, person.scss compiled Bootstrap Sass variables mixins included via bs_dependency() (returns compiled CSS htmlDependency()). Otherwise, theme bs_theme() object, person() used context bslib relevant, pre-compiled CSS file returned instead. Pre-complied CSS isn’t necessarily requirement, ’s good idea increasing performance reducing software dependencies end users.","code":"name <- \"person\" version <- \"1.0.0\" person_dependency <- function(theme) { if (is_bs_theme(theme)) { scss <- system.file(package = \"mypkg\", \"person.scss\") bs_dependency( input = sass::sass_file(scss), theme = theme, name = name, version = version ) } else { htmlDependency( name = name, version = version, stylesheet = \"person.css\", package = \"mypkg\", all_files = FALSE ) } } #' @export person <- function(name, title, company) { div( class = \"person\", h3(class = \"name\", name), div(class = \"title\", title), div(class = \"company\", company), bs_dependency_defer(person_dependency) ) }"},{"path":"https://rstudio.github.io/bslib/articles/custom-components/index.html","id":"html-widgets","dir":"Articles > Custom-components","previous_headings":"","what":"HTML widgets","title":"Custom components","text":"htmlwidgets can themed via CSS, recommend supplying bs_dependency_defer() dependencies argument createWidget() (similar person() component last section), make widget dynamically themeable. widgets can themed via CSS, best option may query active theme inside preRenderHook() via bs_current_theme(), translate relevant information widget’s instance data, example:","code":"my_widget <- function(...) { createWidget( name = \"mywidget\", ..., preRenderHook = my_widget_hook ) } my_widget_hook <- function(instance) { theme <- bslib::bs_current_theme() if (!bslib::is_bs_theme(theme)) { return(instance) } instance$x$theme <- modifyList( instance$x$theme, as.list( bslib::bs_get_variables(theme, c(\"bg\", \"fg\")) ) ) instance }"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"hello-dashboards","dir":"Articles > Dashboards","previous_headings":"","what":"Hello dashboards","title":"Dashboards","text":"Quickly create dashboard providing title, sidebar, main area contents page_sidebar(). sidebar main content areas can hold arbitrary collection UI elements, ’s good practice keep inputs sidebar outputs main content area. Also, consider wrapping outputs card() sidebar contents sidebar() object add title /customize styling, positioning, etc. Let’s start basic yet interesting example customizable histogram numeric variables palmerpenguins dataset. Throughout rest article, ’ll cover layout multiple outputs, add multiple pages, . , ’ll useful reusable outputs inputs. , let’s create list cards, plotOutput() container numeric variable interest, plus color_by input control color histograms species, island, sex. Now, quick example, let’s pass color_by directly sidebar cards main content area. default, card placed new row, cards allowed grow/shrink fit browser window (browser window wide enough). next section, ’ll cover customize layout.","code":"library(shiny) library(bslib) ui <- page_sidebar( title = \"My dashboard\", sidebar = \"Sidebar\", \"Main content area\" ) shinyApp(ui, function(input, output) {}) library(ggplot2) data(penguins, package = \"palmerpenguins\") ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = sidebar( title = \"Histogram controls\", varSelectInput( \"var\", \"Select variable\", dplyr::select_if(penguins, is.numeric) ), numericInput(\"bins\", \"Number of bins\", 30) ), card( card_header(\"Histogram\"), plotOutput(\"p\") ) ) server <- function(input, output) { output$p <- renderPlot({ ggplot(penguins) + geom_histogram(aes(!!input$var), bins = input$bins) + theme_bw(base_size = 20) }) } shinyApp(ui, server) cards <- list( card( full_screen = TRUE, card_header(\"Bill Length\"), plotOutput(\"bill_length\") ), card( full_screen = TRUE, card_header(\"Bill depth\"), plotOutput(\"bill_depth\") ), card( full_screen = TRUE, card_header(\"Body Mass\"), plotOutput(\"body_mass\") ) ) color_by <- varSelectInput( \"color_by\", \"Color by\", penguins[c(\"species\", \"island\", \"sex\")], selected = \"species\" ) ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, !!!cards ) server <- function(input, output) { gg_plot <- reactive({ ggplot(penguins) + geom_density(aes(fill = !!input$color_by), alpha = 0.2) + theme_bw(base_size = 16) + theme(axis.title = element_blank()) }) output$bill_length <- renderPlot(gg_plot() + aes(bill_length_mm)) output$bill_depth <- renderPlot(gg_plot() + aes(bill_depth_mm)) output$body_mass <- renderPlot(gg_plot() + aes(body_mass_g)) } shinyApp(ui, server)"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"multi-column","dir":"Articles > Dashboards","previous_headings":"Layouts","what":"Multi-column","title":"Dashboards","text":"Create multi-column layouts layout_columns(). col_widths specified, divides space evenly among UI elements row. vector column widths may also supplied allocate given number columns (12) element. , elements go beyond 12 column mark, get wrapped onto new row. default, row heights equal, can customized row_heights argument (numeric values interpreted fractional units, fixed length units also supported). Negative col_widths may also provided easily create negative/empty space: Although don’t show , layout_columns() also supports different col_widths row_heights different breakpoints(). useful creating responsive layouts adapt different screen sizes. learn , visit layout_columns().","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, layout_columns(cards[[1]], cards[[2]]), cards[[3]] ) shinyApp(ui, server) ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, layout_columns( col_widths = c(4, 8, 12), row_heights = c(1, 2), cards[[1]], cards[[2]], cards[[3]] ) ) shinyApp(ui, server) ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, layout_columns( col_widths = c(4, 8, -2, 8, -2), cards[[1]], cards[[2]], cards[[3]] ) ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"multi-page","dir":"Articles > Dashboards","previous_headings":"Layouts","what":"Multi-page","title":"Dashboards","text":"add multiple pages, change page_sidebar() page_navbar() use nav_panel() supply title content page. can also take advantage bslib’s nav_spacer() nav_item() control alignment UI elements navbar (e.g., external hyperlink). wary page_navbar()’s sidebar argument puts sidebar every page, may may desirable. sidebar article, ’ll learn strategies keeping sidebar’s contents close elements affect. Specifically, article covers : (1) hide/show sidebar contents particular pages, (2) put particular sidebar() given page, even (3) put sidebar layouts inside card().","code":"ui <- page_navbar( title = \"Penguins dashboard\", sidebar = color_by, nav_spacer(), nav_panel(\"Bill Length\", cards[[1]]), nav_panel(\"Bill Depth\", cards[[2]]), nav_panel(\"Body Mass\", cards[[3]]), nav_item(tags$a(\"Posit\", href = \"https://posit.co\")) ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"multi-panel","dir":"Articles > Dashboards","previous_headings":"Layouts","what":"Multi-panel","title":"Dashboards","text":"Multiple nav_panel()s don’t necessarily need go directly page_navbar(). can also consumed navset_*() component, including navset_card_underline(). See learn multi-panel layout options.","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, navset_card_underline( title = \"Histograms by species\", nav_panel(\"Bill Length\", plotOutput(\"bill_length\")), nav_panel(\"Bill Depth\", plotOutput(\"bill_depth\")), nav_panel(\"Body Mass\", plotOutput(\"body_mass\")) ) ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"scrolling-vs-filling","dir":"Articles > Dashboards","previous_headings":"Layouts","what":"Scrolling vs filling","title":"Dashboards","text":"page_sidebar() page_navbar() default filling layout, meaning outputs like plotOutput(), htmlwidgets, etc. encouraged grow/shrink fit browser window. result, contents large intrinsic minimum height (e.g., long textual description), filling layout may cause cards/outputs grow/shrink beyond desirable. combat , consider setting height card()s shouldn’t grow/shrink min_height/max_height card()s shouldn’t shrink/grow beyond certain point. Filling layout may desirable lot outputs display single page. case, consider setting fillable = FALSE prevent growing/shrinking altogether. page layout fillable, outputs fall back intrinsic height, usually 400px. Users able scroll page outputs take vertical space height window. Like page_sidebar(), page_navbar() also fillable argument also defaults TRUE, makes every page (.e., nav_panel()) fillable. make just subset pages fillable, pass vector page names fillable (e.g., fillable = c(\"Bill Length\", \"Bill Depth\")). make pages non-fillable, set fillable = FALSE.","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, card(min_height = 200, plotOutput(\"bill_length\")), card(height = 200, lorem::ipsum(15)) ) shinyApp(ui, server) ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, fillable = FALSE, !!!cards ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"mobile-layout","dir":"Articles > Dashboards","previous_headings":"Layouts","what":"Mobile layout","title":"Dashboards","text":"default, filling layout enabled mobile devices, meaning fillable effectively FALSE case. enable filling layout mobile devices, set fillable_mobile = TRUE. case, ’s good practice set min_height card()s prevent growing/shrinking beyond desirable. Also, sidebars collapsed default mobile devices, can opened via sidebar()’s open argument.","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, fillable_mobile = TRUE, card(min_height = 200, plotOutput(\"bill_length\")), card(height = 200, lorem::ipsum(15)) ) shinyApp(ui, server)"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"value-boxes","dir":"Articles > Dashboards","previous_headings":"Components","what":"Value boxes","title":"Dashboards","text":"value_box() special kind card designed highlighting value along title showcase placeholder (typically bsicons icon). covered detail value boxes article, ’s palmerpenguins example:","code":"means <- colMeans( penguins[c(\"bill_length_mm\", \"bill_depth_mm\", \"body_mass_g\")], na.rm = TRUE ) ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, layout_columns( fill = FALSE, value_box( title = \"Average bill length\", value = scales::unit_format(unit = \"mm\")(means[[1]]), showcase = bsicons::bs_icon(\"align-bottom\") ), value_box( title = \"Average bill depth\", value = scales::unit_format(unit = \"mm\")(means[[2]]), showcase = bsicons::bs_icon(\"align-center\") ), value_box( title = \"Average body mass\", value = scales::unit_format(unit = \"g\", big.mark = \",\")(means[[3]]), showcase = bsicons::bs_icon(\"handbag\") ) ), layout_columns( cards[[1]], cards[[2]] ), cards[[3]] ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"accordions","dir":"Articles > Dashboards","previous_headings":"Components","what":"Accordions","title":"Dashboards","text":"accordion() uses vertical collapsing provide scalable navigation many sections content. Accordions can placed anywhere page, including sidebar, convenient grouping sections input controls. Learn accordions reference page.","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = sidebar( bg = \"white\", accordion( accordion_panel( \"Primary controls\", color_by ), accordion_panel( \"Other controls\", \"Other controls go here\" ) ) ), accordion( open = c(\"Bill Length\", \"About\"), accordion_panel( \"Bill Length\", plotOutput(\"bill_length\") ), accordion_panel( \"Bill Depth\", plotOutput(\"bill_depth\") ), accordion_panel( \"Body Mass\", plotOutput(\"body_mass\") ) ) ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"cards-with-sidebars","dir":"Articles > Dashboards","previous_headings":"Components","what":"Cards with sidebars","title":"Dashboards","text":"’ve already seen sidebar argument page_sidebar() page_navbar() yields “page-level” sidebar layout, can also made “component-level” via layout_sidebar(). especially useful keeping input controls near outputs affect complex apps. layout_sidebar() also works inside card(), making easy add headers, footers, full_screen behavior, etc. learn , visit cards sidebars articles.","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = sidebar( title = \"Global controls\", color_by ), card( full_screen = TRUE, card_header(\"Bill Length\"), layout_sidebar( sidebar = sidebar( title = \"Local controls\", position = \"right\", \"...\" ), plotOutput(\"bill_length\") ) ), cards[[2]], cards[[3]], ) shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"theming","dir":"Articles > Dashboards","previous_headings":"","what":"Theming","title":"Dashboards","text":"getting started theming article, ’ll learn general theming strategies also translate dashboards. , passing bs_theme() object theme argument page_sidebar() (page_navbar()), can add Bootswatch theme, easily use Google Fonts, customize 100s theming variables, much . Keep mind, however, bs_theme() customizes CSS styles. , want plotOutput()s match CSS, consider using thematic package translate styles ggplot2::theme() settings. , also aware “complete” ggplot2 themes (e.g., theme_bw()) work sensibly setting globally (.e., theme_set(theme_bw())).","code":"ui <- page_sidebar( title = \"Penguins dashboard\", sidebar = color_by, theme = bs_theme( bootswatch = \"darkly\", base_font = font_google(\"Inter\"), navbar_bg = \"#25443B\" ), !!!cards ) # Enable thematic thematic::thematic_shiny(font = \"auto\") # Change ggplot2's default \"gray\" theme theme_set(theme_bw(base_size = 16)) # New server logic (removes the `+ theme_bw()` part) server <- function(input, output) { gg_plot <- reactive({ ggplot(penguins) + geom_density(aes(fill = !!input$color_by), alpha = 0.2) + theme(axis.title = element_blank()) }) output$bill_length <- renderPlot(gg_plot() + aes(bill_length_mm)) output$bill_depth <- renderPlot(gg_plot() + aes(bill_depth_mm)) output$body_mass <- renderPlot(gg_plot() + aes(body_mass_g)) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/dashboards/index.html","id":"in-production","dir":"Articles > Dashboards","previous_headings":"","what":"In production","title":"Dashboards","text":"deploying dashboard production, ’s wise “hard-code” version Bootstrap used developed. reduces chance dashboard breaking bslib updates ’s Bootstrap dependency. , call version_default() get current version Bootstrap, pass value bs_theme(version = ...) (pass theme object theme argument relevant page_*() function).","code":"library(shiny) ui <- page_sidebar( theme = bs_theme(version = 5), ... ) shinyApp(ui, function(...) {})"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/examples/index.html","id":"multi-page","dir":"Articles > Examples","previous_headings":"Sidebar layouts","what":"Multi-page","title":"Examples","text":"","code":"# source(\"example_gallery/multi_page\")"},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"activating-fill","dir":"Articles > Filling","previous_headings":"In theory","what":"Activating fill","title":"Filling layouts","text":"Just like HTML container, fillable container’s default height depends height ’s children. , example, ’s single fill item defined height 400px (default Shiny outputs), fillable container’s height also 400px (plus padding, border, etc). Defining height fillable container activates immediate children’s potential fill. , example, fillable container’s height set 200px, fill child shrink 200px: multiple fill items immediate children fillable container, ’d keep shrinking (case, 100px ): Adding non-fill item (e.g., htmltools::p()-aragraph text) won’t cause particular item grow/shrink, fill items divvy remaining space (careful: non-fill item(s) larger fillable container, fill items won’t visible!). big reason card()s min_height argument (prevent fill items shrinking much). Notice resizing handle lower-right hand corner fillable container . Use change size fillable container compare behavior fill non-fill items.","code":""},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"carrying-fill","dir":"Articles > Filling","previous_headings":"In theory","what":"Carrying fill","title":"Filling layouts","text":"previous section focuses fairly simple case one parent container. However, practice, ’ll likely working multiple levels parents, quickly complicates things, especially : Fill items require immediate parent fillable container order fill. “raw” HTML tags (e.g., div(), p(), etc.) well many Shiny UI elements (e.g., wellPanel(), etc.) neither fillable fill (.e., ’ll call non-fill elements). result, common way (1) breaks non-fill element, like div(), comes fillable fill. fact, ’ll run exact behavior using uiOutput() insert dynamically rendered fill item fillable container (see section concrete example). Assuming goal fill item fit fillable container, ’s useful coerce non-fill element fill item fillable container, call fill carriers. UI element can coerced fill carrier as_fill_carrier(). concept fill carrier especially useful relevant cards. cases, card numerous children like header body, body commonly contains fill item(s) (ensure fill items). card_body() defaults fillable = TRUE (fill = TRUE). might wonder, want need fillable = FALSE fill = FALSE card_body()? One big reason fillable containers powered CSS flexbox, changes way ’s children rendered. , although changes nice “stretchy” children, downsides rendering inline elements. , ’s , ’s recommended use multiple card bodies combining fill non-fill","code":""},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"in-practice","dir":"Articles > Filling","previous_headings":"","what":"In practice","title":"Filling layouts","text":"section puts practice learned theory fillable containers fill items.","code":""},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"setup-code","dir":"Articles > Filling","previous_headings":"In practice","what":"Setup code","title":"Filling layouts","text":"example sub-sections follow assume ’ve ran following code. ’re using plotly create list fill items, concepts extend htmlwidgets (e.g., leaflet) Shiny outputs like plotOutput().2","code":"library(plotly) plots <- list( plot_ly(diamonds) |> add_histogram(x = ~price), plot_ly(diamonds) |> add_histogram(x = ~carat), plot_ly(diamonds) |> add_histogram(x = ~cut, color = ~clarity) ) plots <- lapply(plots, function(x) { config(x, displayModeBar = FALSE) |> layout(margin = list(t = 0, b = 0, l = 0, r = 0)) })"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"filling-the-window","dir":"Articles > Filling","previous_headings":"In practice","what":"Filling the window","title":"Filling layouts","text":"Perhaps important fillable container page_fillable(), sets ’s height equal browser window. Thus, fill items appear direct children, ’ll fill window. page_fillable() also defaults fillable_mobile = FALSE, means height isn’t set equal viewport mobile. result, fill items use defined height (instead viewport size) mobile, often better behavior showing multiple outputs. Notice resizing handle lower-right hand corner example . Use change size “window” see behavior filling plots ’re worried plots becoming small, consider putting card_body() min_height (like later ). Also, don’t want card border, can card(class = \"border-0\", ...)","code":"page_fillable( h2(\"Diamond plots\"), plots[[1]], plots[[2]], plots[[3]] )"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"multiple-columns","dir":"Articles > Filling","previous_headings":"In practice","what":"Multiple columns","title":"Filling layouts","text":"Since layout_columns() fill item (default), grows/shrinks just like fill item. also defaults fillable = TRUE, case, means column gets wrapped fillable container. ’s , example, plots[[1]] plots[[1]] also grow/shrink match size layout_columns() container.","code":"page_fillable( h2(\"Diamond plots\"), layout_columns(plots[[1]], plots[[2]]), plots[[3]] )"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"value-boxes","dir":"Articles > Filling","previous_headings":"In practice","what":"Value boxes","title":"Filling layouts","text":"Since value_box() fill item (default), grows/shrinks just like fill item. especially useful keeping common baseline multi-column layout. said, multi-layout column holds value boxes probably doesn’t want default fill = TRUE behavior, since value boxes given /less space window becomes larger/smaller: learn layout_columns(), see article.","code":"boxes <- layout_columns( fill = FALSE, value_box( \"Total diamonds\", scales::comma(nrow(diamonds)), showcase = bsicons::bs_icon(\"gem\", size = NULL) ), value_box( \"Average price\", scales::dollar(mean(diamonds$price), accuracy = 1), showcase = bsicons::bs_icon(\"coin\", size = NULL), theme_color = \"success\" ), value_box( \"Average carat\", scales::number(mean(diamonds$carat), accuracy = .1), showcase = bsicons::bs_icon(\"search\", size = NULL), theme_color = \"dark\" ) ) page_fillable( boxes, layout_columns(plots[[1]], plots[[2]]), plots[[3]] )"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"full-screen-cards","dir":"Articles > Filling","previous_headings":"In practice","what":"Full-screen cards","title":"Filling layouts","text":"alluded Carrying fill section, card() card_body() fill carriers (, fillable fill, default). Therefore, wrapping plot card, card grows/shrinks (since fill), also retain plot’s ability grow/shrink (since fillable). Note , changed page_fillable() page_fluid() (page_fixed()), plot render ’s default height (400px) since longer fillable specified height. said, even case, expand card full-screen, plot still grows fit full screen card (since card() fillable container specified height, card_body() fill carrier, plot fill item).","code":"plot_card <- function(header, ...) { card( full_screen = TRUE, card_header(header, class = \"bg-dark\"), card_body(..., min_height = 150) ) } page_fillable( layout_columns( plot_card(\"Diamond price\", plots[[1]]), plot_card(\"Diamond carat\", plots[[2]]) ), plot_card(\"Diamond cut by clarity\", plots[[3]]) )"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"sidebar-layouts","dir":"Articles > Filling","previous_headings":"In practice","what":"Sidebar layouts","title":"Filling layouts","text":"Similar ’ve seen outputs card()s, layout_sidebar() also fill item (default), placing direct child page_fillable() makes fit window. Also, main content’s container defaults fillable container, behavior undesirable, set fillable = FALSE layout_sidebar(). learn layout_sidebar(), see article.","code":"page_fillable( padding = 0, layout_sidebar( border = FALSE, fillable = FALSE, sidebar = sidebar( title = \"Diamond plots\", \"Input controls here...\" ), layout_columns( plot_card(\"Diamond price\", plots[[1]]), plot_card(\"Diamond carat\", plots[[2]]) ), plot_card(\"Diamond cut by clarity\", plots[[3]]) ) )"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"ui-output","dir":"Articles > Filling","previous_headings":"Other advice","what":"Dynamic UI","title":"Filling layouts","text":"alluded Carrying fill section, uiOutput() puts additional UI element around renderUI()’s return value. , order carry potential fill fill item (e.g., plot_ly()), mark uiOutput() fill carrier.","code":"library(plotly) ui <- page_fluid( card( full_screen = TRUE, max_height = 300, card_header(\"My plot\"), uiOutput(\"plot\", as_fill_carrier()) ) ) server <- function(input, output) { output$plot <- renderUI({ plot_ly(diamonds, x = ~price) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"dt-tables","dir":"Articles > Filling","previous_headings":"Other advice","what":"DT tables","title":"Filling layouts","text":"DT’s datatable() ’s unique interface filling container. Specifically, make sure set datatable(fillContainer = TRUE) order table grow/shrink ’d expect .","code":"library(DT) ui <- page_fluid( card( full_screen = TRUE, max_height = 350, card_header(\"My table\"), dataTableOutput(\"dt\") ) ) server <- function(input, output) { output$dt <- renderDataTable({ datatable( mtcars, fillContainer = TRUE ) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"other-htmlwidgets","dir":"Articles > Filling","previous_headings":"Other advice","what":"Other htmlwidgets","title":"Filling layouts","text":"Broadly speaking, htmlwidgets like plotly leaflet fill items default, might always case. Also, sometimes, might want particular widget treated fill item. Shiny case, able control fill argument output container (e.g., plotlyOutput(\"id\", fill = FALSE)), fill argument available can also use bslib’s as_fill() API opt /. non-Shiny case, can control fill widget’s htmlwidgets::sizingPolicy() (e.g., leaflet()$sizingPolicy$fill).","code":""},{"path":"https://rstudio.github.io/bslib/articles/filling/index.html","id":"avoid-fluidrowcolumn","dir":"Articles > Filling","previous_headings":"Other advice","what":"Avoid fluidRow()/column()","title":"Filling layouts","text":"Modern versions Bootstrap Grid currently use CSS Flexbox way filling layout mostly incompatible fluidRow()/column(). Instead, use layout_columns() implement multi-column filling layouts","code":""},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"overview","dir":"Articles > Sidebars","previous_headings":"","what":"Overview","title":"Sidebars","text":"three main types sidebar layouts: floating, filling, multi-page/tab.","code":""},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"floating-layout","dir":"Articles > Sidebars","previous_headings":"Overview","what":"Floating layout","title":"Sidebars","text":"Use layout_sidebar() create sidebar layout can go anywhere page. layout approach great visually grouping together semantically related inputs output(s). can also paired card() leverage full_screen expansion, add header/footer, .","code":"layout_sidebar( sidebar = sidebar(\"Sidebar\"), \"Main contents\" ) card( full_screen = TRUE, card_header(\"Title\"), layout_sidebar( sidebar = sidebar(\"Sidebar\"), \"Main contents\" ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"filling-layout","dir":"Articles > Sidebars","previous_headings":"Overview","what":"Filling layout","title":"Sidebars","text":"Getting Started dashboards article, saw page_sidebar() yields sidebar layout fills page. Underneath hood, page_sidebar() just simple wrapper around page_fillable() layout_sidebar(). Understanding unlocks potential (number ) sidebar layouts within filling layout.","code":"page_fillable( layout_sidebar( sidebar = sidebar(\"Sidebar area\"), \"Main area\" ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"multi-page-layout","dir":"Articles > Sidebars","previous_headings":"Overview","what":"Multi-page layout","title":"Sidebars","text":"multi-page (multi-tab) layout, use sidebar argument page_navbar() (navset_card_tab()). case, get sidebar fills page, sidebar remains visible every page/tab. Later , ’ll explore put multiple, varied, layouts different pages; also keep mind, actually desirable sidebar every page, often helps hide/show sidebar contents certain pages via conditionalPanel(). Page 1 Page 2 Tab 1 Tab 2","code":"page_navbar( sidebar = sidebar(\"Sidebar\"), nav_panel(\"Page 1\", \"Page 1 content\"), nav_panel(\"Page 2\", \"Page 2 content\") ) navset_card_tab( sidebar = sidebar(\"Sidebar\"), nav_panel(\"Tab 1\", \"Tab 1 content\"), nav_panel(\"Tab 2\", \"Tab 2 content\") )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"a-real-example","dir":"Articles > Sidebars","previous_headings":"","what":"A real example","title":"Sidebars","text":"Now ’ve enumerated bslib’s sidebar layout options, lets use real data1 create real inputs outputs, explore additional features sidebar layouts. Shiny app2, ’ll probably want use inputs like selectInput(), sliderInput(), etc., sidebar, ’re reading article static website, ’ll use crosstalk input widgets.","code":""},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"setup-code","dir":"Articles > Sidebars","previous_headings":"A real example","what":"Setup code","title":"Sidebars","text":"Throughout section, ’ll make repeated use following widgets plotly leaflet. details widgets work alongside crosstalk create linked views isn’t important understanding sidebar layouts, keep mind give us list filters plots (views diamonds dataset), well map_filter map_quakes (views quakes dataset).","code":"library(bslib) library(shiny) library(crosstalk) library(plotly) library(leaflet) # Creates the \"filter link\" between the controls and plots dat <- SharedData$new(dplyr::sample_n(diamonds, 1000)) # Sidebar elements (e.g., filter controls) filters <- list( filter_select(\"cut\", \"Cut\", dat, ~cut), filter_select(\"color\", \"Color\", dat, ~color), filter_select(\"clarity\", \"Clarity\", dat, ~clarity) ) # plotly visuals plots <- list( plot_ly(dat) |> add_histogram(x = ~price), plot_ly(dat) |> add_histogram(x = ~carat), plot_ly(dat) |> add_histogram(x = ~cut, color = ~clarity) ) plots <- lapply(plots, \\(x) config(x, displayModeBar = FALSE)) # map filter and visual quake_dat <- SharedData$new(quakes) map_filter <- filter_slider(\"mag\", \"Magnitude\", quake_dat, ~mag) map_quakes <- leaflet(quake_dat) |> addTiles() |> addCircleMarkers()"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"hello-sidebar","dir":"Articles > Sidebars","previous_headings":"A real example","what":"Hello layout_sidebar()","title":"Sidebars","text":"layout_sidebar() behaves lot like card. example, used inside page_fillable() ’ll also grow/shrink fit page (default fill = TRUE). also default fillable = TRUE allows fill items main content area (e.g., plots[[1]]) also grow/shrink fit container. also behave lot like card_body() can put directly inside card() (useful adding header/footer, full_screen = TRUE, etc.). example resizable. Try using handle lower-right corner change “window” size notice plot grow/shrink fit window (fillable = TRUE). learn fillable containers fill items work, see article filling layouts.","code":"sidebar_diamonds <- layout_sidebar( sidebar = filters[[1]], plots[[1]] ) sidebar_quakes <- layout_sidebar( sidebar = map_filter, map_quakes ) page_fillable( sidebar_diamonds, card( card_header(\"Earthquakes\"), sidebar_quakes ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"multi-page-example","dir":"Articles > Sidebars","previous_headings":"A real example","what":"Multi-page varied layout","title":"Sidebars","text":"covered Getting Started dashboards, sidebar argument page_navbar() puts sidebar page fills window. However, sometimes ’s better particular pages sidebar layout. acheive , just provide layout_sidebar() “root” element fillable page. example, let’s put “page-level” sidebar page dedicated Earthquakes, put multiple sidebar layouts page dedicated Diamonds (one plot). case, ’ve allowed Earthquakes page fillable since multiple plots Diamonds page (also keep Diamonds page fillable put min_height cards prevent shrinking much). Just like page_navbar(), navset_card_tab() also sidebar argument puts sidebar tab. approach (.e., putting layout_sidebar() within nav_panel()) can used put different sidebars different tabs.","code":"page_navbar( title = \"Sidebar demo\", fillable = \"Earthquakes\", nav_panel(\"Earthquakes\", sidebar_quakes), nav_panel( \"Diamonds\", Map( function(filter, plot) { card( full_screen = TRUE, layout_sidebar(sidebar = filter, plot) ) }, filters, plots ) ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"restricting-growth","dir":"Articles > Sidebars","previous_headings":"A real example","what":"Restricting growth","title":"Sidebars","text":"Just like cards, filling layout isn’t enforcing size layout_sidebar(), allow ’s contents decide big . Thus, large amount sidebar/main contents, consider specifying height max_height via card() (well full_screen = TRUE reduce need scrolling).","code":"page_fixed( h1(\"Sidebar demo\", class = \"lead mt-3\"), card( height = 400, full_screen = TRUE, layout_sidebar(sidebar = filters, plots) ), card( full_screen = TRUE, layout_sidebar(sidebar = map_filter, map_quakes) ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"shiny","dir":"Articles > Sidebars","previous_headings":"","what":"Shiny","title":"Sidebars","text":"Although sidebars work just fine outside Shiny, using Shiny provides additional useful features.","code":""},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"conditional-contents","dir":"Articles > Sidebars","previous_headings":"Shiny","what":"Conditional contents","title":"Sidebars","text":"Sometimes multiple page/tab setting, ’s useful sidebar every page/tab, changes ’s contents based page/tab active.3 Thanks conditionalPanel(), can done fairly easily Shiny app page_navbar() (navset_card_tab()/navset_tab_pill()). trick provide id page_navbar() reference id conditionalPanel():","code":"shinyApp( page_navbar( title = \"Conditional sidebar\", id = \"nav\", sidebar = sidebar( conditionalPanel( \"input.nav === 'Page 1'\", \"Page 1 sidebar\" ), conditionalPanel( \"input.nav === 'Page 2'\", \"Page 2 sidebar\" ) ), nav_panel(\"Page 1\", \"Page 1 contents\"), nav_panel(\"Page 2\", \"Page 2 contents\") ), server = function(...) { # no server logic required } )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"reactive-updates","dir":"Articles > Sidebars","previous_headings":"Shiny","what":"Reactive updates","title":"Sidebars","text":"programmatically update (/re-actively read) open/closed state sidebar(), provide id reference id server code. reference use id programmatically open sidebar 2nd page.","code":"library(shiny) ui <- page_navbar( title = \"Sidebar updates\", id = \"nav\", sidebar = sidebar( id = \"sidebar\", open = FALSE, \"Sidebar\" ), nav_panel(\"Page 1\", \"Sidebar closed. Go to Page 2 to open.\"), nav_panel(\"Page 2\", \"Sidebar open. Go to Page 1 to close.\") ) server <- function(input, output) { observe({ sidebar_toggle( id = \"sidebar\", open = input$nav == \"Page 2\" ) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"accordions","dir":"Articles > Sidebars","previous_headings":"","what":"Accordions","title":"Sidebars","text":"sidebars special treatment accordions. accordion() appears directly within sidebar() (immediate child sidebar), accordion panels render flush sidebar, providing convenient way group multiple related input controls collapsible section. example depends objects setup code section.","code":"accordion_filters <- accordion( accordion_panel( \"Dropdowns\", icon = bsicons::bs_icon(\"menu-app\"), !!!filters ), accordion_panel( \"Numerical\", icon = bsicons::bs_icon(\"sliders\"), filter_slider(\"depth\", \"Depth\", dat, ~depth), filter_slider(\"table\", \"Table\", dat, ~table) ) ) card( card_header(\"Groups of diamond filters\"), layout_sidebar( sidebar = accordion_filters, plots[[1]] ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"nested-sidebars","dir":"Articles > Sidebars","previous_headings":"","what":"Nested sidebars","title":"Sidebars","text":"’s possible nest sidebar layouts, means can effectively number left /right sidebars given layout. , ’ll want main content area every layout_sidebar() contains layout_sidebar() fillable zero padding (class = \"p-0\").","code":"page_fillable( h1(\"Left and right sidebar\", class = \"px-3 my-3\"), layout_sidebar( sidebar = sidebar(\"Left sidebar\"), layout_sidebar( sidebar = sidebar(\"Right sidebar\", position = \"right\", open = FALSE), \"Main contents\", border = FALSE ), border_radius = FALSE, fillable = TRUE, class = \"p-0\" ) )"},{"path":"https://rstudio.github.io/bslib/articles/sidebars/index.html","id":"styling-and-customization","dir":"Articles > Sidebars","previous_headings":"","what":"Styling and customization","title":"Sidebars","text":"sections ’ve focused primarily variety interface layouts sidebars can used. Along way, ’ve touched named arguments sidebar() layout_sidebar() helpful customizing styling behavior sidebar main content areas. However, handful arguments customize look feel sidebar layout. sidebar() layout_sidebar() allow specific background color (via bg), applied sidebar area main content area respectively. bg provided, bslib automatically provides high-contrast foreground color ensure readability (fg color may also provided). functions also include class argument works well Bootstrap utility classes style argument inline styles. aware layout_sidebar(), bg, class style attributes applied main content area’s container overall layout container. add additional classes layout container, use htmltools::tagAppendAttributes(). Also note layout_sidebar() derives ’s default style Bootstrap CSS variables (e.g., --bs-card-border-color), enables theming component-level (theming via bs_theme() works page-level). following example combines concepts create sidebar dark background. Utility classes used make sidebar text monospace bold, used tagAppendAttributes() tweak border color sidebar layout match sidebar background.","code":"library(htmltools) library(leaflet) squake <- SharedData$new(quakes) container <- layout_sidebar( class = \"p-0\", sidebar = sidebar( title = \"Earthquakes off Fiji\", bg = \"#1E1E1E\", width = \"35%\", class = \"fw-bold font-monospace\", filter_slider(\"mag\", \"Magnitude\", squake, ~mag) ), leaflet(squake) |> addTiles() |> addCircleMarkers() ) tagAppendAttributes(container, style = css(\"--bs-card-border-color\" = \"#1E1E1E\"))"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"real-time","dir":"Articles > Theming","previous_headings":"","what":"Real-time theming","title":"Theming","text":"get started theming, consider overlaying real-time theming widget Shiny app (runtime: shiny R Markdown document). great way experiment different Bootswatch themes, main colors, fonts, . add widget, call bs_themer() Shiny runtime content (.e., within server function) also make sure app/document uses {bslib} ’s Bootstrap dependency. don’t particular app document mind, can also use bs_theme_preview() create demo Shiny app theming widget already overlayed (see hosted version): running theming widget locally, ’ll see output like R console (R Markdown, ’ll see YAML output instead R code) reproduce theming changes:","code":"# Shiny example ui <- page_sidebar( title = \"My app\" ) server <- function(input, output) { bs_themer() } shinyApp(ui, server) # R Markdown example --- runtime: shiny output: html_document: theme: bslib: true --- ```{r} bslib::bs_themer() ``` bs_theme_preview()"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"bootswatch","dir":"Articles > Theming","previous_headings":"","what":"Bootswatch themes","title":"Theming","text":"Bootswatch theme available bs_theme()’s bootswatch argument. may already familiar using “pre-packaged” themes via shinythemes package (via theme parameter R Markdown). older approaches provide Bootswatch 3 themes, bslib, can use newer themes like minty zephyr.","code":"# Shiny example page_sidebar( theme = bs_theme(bootswatch = \"minty\") ) # R Markdown example --- output: html_document: theme: bootswatch: minty ---"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"main-colors","dir":"Articles > Theming","previous_headings":"","what":"Main colors & fonts","title":"Theming","text":"bs_theme() also provides named arguments customizing main background color (bg), foreground color (fg), accent colors (primary, secondary, etc), fonts (base_font, heading_font, code_font, etc). ’s example using subset named arguments implement dark mode custom fonts: Among coloring options bs_theme(), bg, fg, primary far influential effect nearly every color page. fact, bg fg alone impact 100s defaults — everything text color, card()s, accordion()s, much . accent colors don’t impact nearly much, primary control color important things like hyperlinks, navset_pill() links, accent/focus colors inputs, . said, accent colors can handy customizing things like shiny::actionButton() (defaults secondary color), shiny::showNotification() , generally HTML content leverages Color Utility Classes. choosing bg fg colors, keep mind ’s generally good idea pick colors similar hue large difference luminance. bs_theme() also provides 3 named arguments main fonts: base_font, heading_font, code_font. using web safe font combinations, ’s ok provide character string (comma-separated) font families arguments (e.g., bs_theme(base_font = '\"Times New Roman\", Times, serif'). Otherwise, use one font_google(), font_link(), /font_face() helpers include relevant file(s) client’s browser may render font(s). font_link() font_face() fairly low-level interfaces CSS web font API, font_google() additional ability download cache font file(s), making internet connection needed first time particular font used. choosing fonts, keep mind ’s generally good practice put serif fonts base_font, sans-serif fonts heading_font, monospace fonts code_font. aren’t sure start, fontpair.co nice gallery Google Font pairings.","code":"# Shiny example page_sidebar( title = \"My app\", bs_theme( bg = \"#101010\", fg = \"#FFF\", primary = \"#E69F00\", secondary = \"#0072B2\", success = \"#009E73\", base_font = font_google(\"Inter\"), code_font = font_google(\"JetBrains Mono\") ), ... ) # R Markdown example --- output: html_document: theme: bg: \"#101010\" fg: \"#FFF\" primary: \"#E69F00\" secondary: \"#0072B2\" success: \"#009E73\" base_font: google: \"Prompt\" code_font: google: \"JetBrains Mono\" ---"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"theming-variables","dir":"Articles > Theming","previous_headings":"","what":"Theming variables","title":"Theming","text":"bs_theme() also provides access 100s specific theming options considering anything passed ’s ... argument new Bootstrap Sass variable defaults. allows get targetted theming; example, let’s set $progress-bar-bg Sass variable 'orange' (CSS color). addition CSS values (e.g., \"orange\"), variable can valid Sass expression, quite useful leveraging Sass’ built-module’s (e.g., mix() mixing colors) Underneath hood, bs_theme() works placing Sass variable defaults Bootstrap’s variable defaults. ’s something like bs_theme(primary = \"red\") “just works” sense provides $primary new default value, also passes value variables default $primary (e.g. $progress-bar-bg). Since bs_theme() defines variables Bootstrap, must define variables differently want reference Bootstrap’s Sass code. example, wanted $progress-bar-bg default $secondary instead $primary? Thankfully bs_add_variables() provides workaround. default, bs_add_variables() works just like bs_theme() (puts variable definitions Sass code), .= \"declarations\", can place definition Bootstrap: ’s currently easy way define variables way R Markdown (using !expr pass bs_theme() object directly theme)","code":"# Shiny example bs_theme( bg = \"#002B36\", fg = \"#EEE8D5\", \"progress-bar-bg\" = \"orange\" ) # R Markdown example --- output: html_document: theme: bg: \"#002B36\" fg: \"#EEE8D5\" progress-bar-bg: \"orange\" --- bs_theme(\"progress-bar-bg\" = \"mix(white, orange, 20%)\") #> $progress-bar-bg: mix(white, orange, 20%) !default; #> @import \"scss/_variables.scss\"; # Reduced version of the Sass code behind `bs_theme(primary = \"red\")` sass::sass(\" $primary: red !default; // First one wins $primary: blue !default; $progress-bar-bg: $primary !default; @debug $primary, $progress-bar-bg; \") #> red, red bs_theme(\"progress-bar-bg\" = \"$secondary\") |> sass::sass() #> Error: Undefined variable: \"$secondary\". bs_theme() |> bs_add_variables( \"progress-bar-bg\" = \"$secondary\", .where = \"declarations\" ) #> @import \"scss/_variables.scss\"; #> $progress-bar-bg: $secondary; output: html_document: theme: !expr bslib::bs_add_variables(bslib::bs_theme(), \"progress-bar-bg\" = \"$secondary\", .where = \"declarations\")"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"add-rules","dir":"Articles > Theming","previous_headings":"","what":"Adding rules","title":"Theming","text":"good amount theming possible customizing Bootstrap Sass variables bs_theme(), sometimes may also want add additional Sass/CSS rules. bs_add_rules() function makes easy Shiny usage generally accepts valid Sass/CSS (see sass::as_sass()). example, ’s one add local SCSS/CSS files /Sass/CSS code string (CSS file case taken nes.css) R Markdown case, ’s recommended additional CSS (Sass) rules come css parameter, may also use bslib engine. bs_add_rules(), rules can reference Bootstrap Sass variables well utilize convenient Sass mixins functions like color-contrast(), mix(), etc.","code":"bs_theme( bg = \"#e5e5e5\", fg = \"#0d0c0c\", primary = \"#dd2020\", base_font = font_google(\"Press Start 2P\"), code_font = font_google(\"Press Start 2P\"), \"font-size-base\" = \"0.75rem\", \"enable-rounded\" = FALSE ) %>% bs_add_rules( list( sass::sass_file(\"nes.min.css\"), sass::sass_file(\"custom.scss\"), \"body { background-color: $body-bg; }\" ) ) --- output: html_document: theme: bslib: true css: my-rules.scss --- ```{bslib} $custom-bg: rgba($primary, 0.3); .custom { background-color: $custom-bg; color: color-contrast(opaque($body-bg, $custom-bg)) } ``` ::: {.custom} Hello custom block with custom styles! :::"},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"utility-classes","dir":"Articles > Theming","previous_headings":"","what":"Utility Classes","title":"Theming","text":"Utility classes primarily helpful styling component (rather page) level, particularly handy things like spacing, border, colors, . See article Utility Classes useful examples specific Shiny R Markdown.","code":""},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"component-support","dir":"Articles > Theming","previous_headings":"","what":"Component support","title":"Theming","text":"list known--themeable HTML components “just work” well custom real-time themes: “core” Shiny UI (e.g., sliderInput(), selectInput(), etc.) one exception plotOutput(), case, {thematic} package can used essentially translate CSS R plot theming defaults. Just put thematic_shiny() Shiny apps thematic_rmd() R Markdown documents. rmarkdown::html_document() specific features well {flexdashboard}. un-styled HTML content (e.g., tags$input(type = \"checkbox\")). htmlwidgets like DT plotly (ggplotly() supported thematic right now) time, ’re hoping list grows package authors developers embrace bslib’s tools making themeable custom components.","code":""},{"path":"https://rstudio.github.io/bslib/articles/theming/index.html","id":"dynamic","dir":"Articles > Theming","previous_headings":"","what":"Dynamic theming","title":"Theming","text":"functionality behind real-time theming can leveraged Shiny app (runtime:shiny Rmd doc) implement custom theming widget (via session$setCurrentTheme()), like dark mode switch: See sections setCurrentTheme getCurrentTheme learn .","code":"light <- bs_theme() dark <- bs_theme(bg = \"black\", fg = \"white\", primary = \"purple\") ui <- fluidPage( theme = light, checkboxInput(\"dark_mode\", \"Dark mode\") ) server <- function(input, output, session) { observe(session$setCurrentTheme( if (isTRUE(input$dark_mode)) dark else light )) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"motivation","dir":"Articles > Tooltips-popovers","previous_headings":"","what":"Motivation","title":"Tooltips & Popovers","text":"Tooltips popovers useful means displaying (tooltips) interacting (popovers) additional information non-obtrusive way. motivating example applies components achieve useful patterns: Attaches tooltip() “tip” icon card_header(), allowing user learn data visualized. Attaches popover() “settings” icon card_header(), allowing user control parameters visualization Attaches popover() link card_footer(), facilitates display information, also allowing interaction information (e.g., hyperlink).","code":"library(shiny) library(bslib) library(palmerpenguins) library(ggplot2) ui <- page_fillable( card( card_header( \"Penguin body mass\", tooltip( bsicons::bs_icon(\"question-circle\"), \"Mass measured in grams.\", placement = \"right\" ), popover( bsicons::bs_icon(\"gear\", class = \"ms-auto\"), selectInput(\"yvar\", \"Split by\", c(\"sex\", \"species\", \"island\")), selectInput(\"color\", \"Color by\", c(\"species\", \"island\", \"sex\"), \"island\"), title = \"Plot settings\" ), class = \"d-flex align-items-center gap-1\" ), plotOutput(\"plt\"), card_footer( \"Source: Gorman KB, Williams TD, Fraser WR (2014).\", popover( a(\"Learn more\", href = \"#\"), markdown( \"Originally published in: Gorman KB, Williams TD, Fraser WR (2014) Ecological Sexual Dimorphism and Environmental Variability within a Community of Antarctic Penguins (Genus Pygoscelis). PLoS ONE 9(3): e90081. [doi:10.1371/journal.pone.0090081](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0090081)\" ) ) ) ) ) server <- function(input, output, session) { output$plt <- renderPlot({ ggplot(penguins, aes(x = body_mass_g, y = !!sym(input$yvar), fill = !!sym(input$color))) + ggridges::geom_density_ridges(scale = 0.9, alpha = 0.5) + coord_cartesian(clip = \"off\") + labs(x = NULL, y = NULL) + ggokabeito::scale_fill_okabe_ito() + theme_minimal(base_size = 20) + theme(legend.position = \"top\") }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"get-started","dir":"Articles > Tooltips-popovers","previous_headings":"","what":"Get started","title":"Tooltips & Popovers","text":"terms ’re implemented, tooltips popovers quite similar. require UI element serve “trigger” (.e., UI user must interact toggle visibility) well message show. tooltip() popover() treat 1st argument trigger, whereas unnamed arguments go message. Optionally, popover(), title may also provided. terms UX applications, tooltips popovers quite different. Tooltips toggled via focus / hover whereas popovers toggled via click. result, popovers much “persistent” (.e., harder open/close), thus used tooltips interaction may needed. put another way, use tooltips small “read-” messages, popovers user able interact message .","code":"actionButton( \"btn_tip\", \"Focus/hover here for tooltip\" ) |> tooltip(\"Tooltip message\") actionButton( \"btn_pop\", \"Click here for popover\" ) |> popover( \"Popover message\", title = \"Popover title\" )"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"icons","dir":"Articles > Tooltips-popovers","previous_headings":"Examples","what":"Icons","title":"Tooltips & Popovers","text":"general, icons probably ubiquitous trigger tooltip() (popover()). ’re small, unobtrusive, provide clear affordance ’s information available. ’d like display icon inline text, also treat text part trigger, wrap icon text span(). Alternatively, wanted just icon trigger, bring tooltip() modifier inside span() (.e., containing element text). Another way replace span() 1st example list() (tagList()), happens work since tooltip() popover() use last HTML element 1st argument trigger.","code":"tooltip( span( \"This text does trigger\", bs_icon(\"info-circle\") ), \"Tooltip message\", placement = \"bottom\" ) span( \"This text doesn't trigger\", tooltip( bs_icon(\"info-circle\"), \"Tooltip message\", placement = \"bottom\" ) )"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"input-labels","dir":"Articles > Tooltips-popovers","previous_headings":"Examples","what":"Input labels","title":"Tooltips & Popovers","text":"Input labels great place apply learned icons. ’re already common place provide information input, adding tooltip popover natural place provide additional context.","code":"textInput( \"txt\", label = tooltip( trigger = list( \"Input label\", bs_icon(\"info-circle\") ), \"Tooltip message\" ) )"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"cards","dir":"Articles > Tooltips-popovers","previous_headings":"Examples","what":"Cards","title":"Tooltips & Popovers","text":"Cards provide wealth opportunity apply learned icons. specifically, tooltips/popovers often work well inside card_header()/card_footer() since ’re already designed providing additional information output(s). next sections explore useful patterns.","code":""},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"simple-tooltip","dir":"Articles > Tooltips-popovers","previous_headings":"Examples > Cards","what":"Simple tooltip","title":"Tooltips & Popovers","text":"Often times ’s useful provide additional information card’s header, especially header contains acronyms jargon. case, tooltip() can help non-expert users gain context data visualized.","code":"card( card_header( \"Card header\", tooltip( bs_icon(\"info-circle\"), \"Tooltip message\" ) ), \"Card body...\" )"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"input-toolbar","dir":"Articles > Tooltips-popovers","previous_headings":"Examples > Cards","what":"Input toolbar","title":"Tooltips & Popovers","text":"app “secondary” inputs specific given card, can useful “hideaway” inputs popover() attached card’s header. especially useful inputs just meant tweak parameters /relevant subset users. case, can useful provide “settings” icon card’s header, clicked, opens popover() containing inputs.","code":"gear <- popover( bs_icon(\"gear\"), textInput(\"txt\", NULL, \"Enter input\"), title = \"Input controls\" ) card( card_header( \"Card header\", gear, class = \"d-flex justify-content-between\" ), \"Card body...\" )"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"popover-with-hyperlink","dir":"Articles > Tooltips-popovers","previous_headings":"Examples > Cards","what":"Popover with hyperlink","title":"Tooltips & Popovers","text":"popover()s useful creating input toolbars, can also useful non-input situations, like providing context along hyperlinks. Taking inspiration motivating example, can provide popover() attached actionLink() card’s footer.1","code":"foot <- popover( actionLink(\"link\", \"Card footer\"), \"Here's a \", a(\"hyperlink\", href = \"https://google.com\") ) card( card_header(\"Card header\"), \"Card body...\", card_footer(foot) )"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"editable-header","dir":"Articles > Tooltips-popovers","previous_headings":"Examples > Cards","what":"Editable header","title":"Tooltips & Popovers","text":"Combining idea input toolbar Shiny’s uiOutput()/renderUI() (.e., dynamic UI) pattern, can create editable header. case, ’ll use popover() attached uiOutput() card’s header, clicked, opens textInput().","code":"ui <- page_fixed( card( card_header( popover( uiOutput(\"card_title\", inline = TRUE), title = \"Provide a new title\", textInput(\"card_title\", NULL, \"An editable title\") ) ), \"The card body...\" ) ) server <- function(input, output) { output$card_title <- renderUI({ list( input$card_title, bsicons::bs_icon(\"pencil-square\") ) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"shiny","dir":"Articles > Tooltips-popovers","previous_headings":"","what":"Shiny","title":"Tooltips & Popovers","text":"Shiny, ’s possible programmatically show, hide, update contents tooltip() popover(). can useful creating dynamic apps, tooltip/popover’s contents dependent user input. next sections explore useful patterns.","code":""},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"readupdate-visibility","dir":"Articles > Tooltips-popovers","previous_headings":"Shiny","what":"Read/update visibility","title":"Tooltips & Popovers","text":"Use toggle_tooltip()/toggle_popover() programmatically show/hide tooltip()/popover(). useful want tooltip shown page load /tooltip shown response user input (e.g., button click).","code":"library(shiny) ui <- page_fixed( \"Here's a tooltip:\", tooltip( bsicons::bs_icon(\"info-circle\"), \"Tooltip message\", id = \"tooltip\" ), actionButton(\"show_tooltip\", \"Show tooltip\"), actionButton(\"hide_tooltip\", \"Hide tooltip\") ) server <- function(input, output) { observeEvent(input$show_tooltip, { toggle_tooltip(\"tooltip\", show = TRUE) }) observeEvent(input$hide_tooltip, { toggle_tooltip(\"tooltip\", show = FALSE) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"update-contents","dir":"Articles > Tooltips-popovers","previous_headings":"Shiny","what":"Update contents","title":"Tooltips & Popovers","text":"Use update_tooltip()/update_popover() programmatically update contents tooltip()/popover(). especially useful tooltip/popover reflect user input (e.g., text input).","code":"library(shiny) ui <- page_fixed( \"Here's a tooltip:\", tooltip( bsicons::bs_icon(\"info-circle\"), \"Tooltip message\", id = \"tooltip\" ), textInput(\"tooltip_msg\", NULL, \"Tooltip message\") ) server <- function(input, output) { observeEvent(input$tooltip_msg, { update_tooltip(\"tooltip\", input$tooltip_msg) }) } shinyApp(ui, server)"},{"path":[]},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"additional-options","dir":"Articles > Tooltips-popovers","previous_headings":"Appendix","what":"Additional options","title":"Tooltips & Popovers","text":"tooltip() popover() support number additional options covered article, documented respective reference pages (?tooltip ?popover).","code":""},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"popovers-vs-modals","dir":"Articles > Tooltips-popovers","previous_headings":"Appendix","what":"Popovers vs modals","title":"Tooltips & Popovers","text":"already familiar Shiny’s modalDialog()/showModal() might wonder popover() appropriate. general, modalDialog()s appropriate “blocking” interactions (.e., user must interact modal interact anything else). contrast, popover()s appropriate “non-blocking” interactions (.e., user can interact popover UI elements time). said, popovers don’t always scale well larger messages/menus. cases, consider offcanvas menu (bslib doesn’t currently support offcanvas menus, ’s roadmap).","code":""},{"path":"https://rstudio.github.io/bslib/articles/tooltips-popovers/index.html","id":"popovers-on-hyperlinks","dir":"Articles > Tooltips-popovers","previous_headings":"Appendix","what":"Popovers on hyperlinks","title":"Tooltips & Popovers","text":"general, ’s recommended use hyperlink trigger popover(). ’s , typical click action hyperlink (.e., navigating new page) conflicts click action popover(). reason, popover() changes trigger interaction hover/focus attached hyperlink (.e., acts like tooltip() case), least makes popover content visible. said, still bit confusing UX, thus avoided. Instead, consider using icon (next hyperlink) trigger popover().","code":""},{"path":"https://rstudio.github.io/bslib/articles/utility-classes/index.html","id":"add-margin","dir":"Articles > Utility-classes","previous_headings":"","what":"Add margin","title":"Utility classes","text":"look source theme demo app, actionButton() logic makes use margin spacing (m-2) add spacing buttons (also make use button modifier classes achieve different background colors). ’s worth noting actionButton(), like many core shiny UI components, doesn’t actually explicit class argument, route implicit arguments (.e., ...) top-level HTML tag, actionButton(..., class = \"btn-primary\") add class appropriate place. Another place top-level class can useful customizing body tabPanel().","code":"actionButton(\"primary\", \"Primary\", icon(\"product-hunt\"), class = \"btn-primary m-2\") actionButton(\"secondary\", \"Secondary (default)\", class = \"m-2\") actionButton(\"success\", \"Success\", icon(\"check\"), class = \"btn-success m-2\")"},{"path":"https://rstudio.github.io/bslib/articles/utility-classes/index.html","id":"add-padding-borders-and-alignment","dir":"Articles > Utility-classes","previous_headings":"","what":"Add padding, borders, and alignment","title":"Utility classes","text":"default, tabset panels don’t come padding border(s) around body’s content, can make appears though content just floating space: can help solve issue adding padding tab’s content (p-3) well nice border matches tab’s borders. tabsetPanel(type=\"pills\") , looks bit better full, rounded, border: ’s also worth noting can also add classes rmarkdown tabsets, like : Unfortunately, can’t always rely class argument placing HTML tag need achieve styling goals. example, can’t simply tabsetPanel(class = \"justify-content-center\", ...) horizontally center tabset. can, however, leverage Sass’s @extend rule essentially add utility classes relevant HTML element(s):","code":"tabsetPanel( tabPanel(\"One\", \"No padding\"), tabPanel(\"Two\", \"Very sad!\") ) tab <- function(...) { shiny::tabPanel(..., class = \"p-3 border border-top-0 rounded-bottom\") } tabsetPanel( tab(\"One\", \"With padding\"), tab(\"Two\", \"Nice!\") ) pill <- function(...) { shiny::tabPanel(..., class = \"p-3 border rounded\") } tabsetPanel( type = \"pills\", pill(\"One\", \"With padding\"), pill(\"Two\", \"Nice!\") ) fluidPage( theme = bs_theme() %>% bs_add_rules(\"#my-nav { @extend .justify-content-center }\"), tabsetPanel( type = \"pills\", id = \"my-nav\", pill(\"One\", \"With padding\"), pill(\"Two\", \"Nice!\") ) )"},{"path":"https://rstudio.github.io/bslib/articles/utility-classes/index.html","id":"add-background-color","dir":"Articles > Utility-classes","previous_headings":"","what":"Add background color","title":"Utility classes","text":"Add bg-* class HTML element set background color theme color (e.g., primary, secondary, etc), note ’ll also make sure foreground color properly contrasts background color (.e., foreground switches white/black intelligently based dark/light background). use bg-primary card component containing {DT} table.","code":"bs4_card <- function(body, title) { div( class = \"card\", div(class = \"card-header bg-primary\", title), div(class = \"card-body d-flex justify-content-center\", body) ) } shinyApp( fluidPage( theme = bslib::bs_theme(primary = \"orange\"), uiOutput(\"dat\") ), function(input, output) { output$dat <- renderUI({ table <- DT::datatable(mtcars, fillContainer = TRUE, style = \"bootstrap4\", rownames = FALSE) bs4_card(table, \"The mtcars dataset\") }) } )"},{"path":"https://rstudio.github.io/bslib/articles/utility-classes/index.html","id":"create-new-utility-classes","dir":"Articles > Utility-classes","previous_headings":"","what":"Create new utility classes","title":"Utility classes","text":"Bootstrap Sass also handful Sass maps allow easy creation /modification utility classes. One case creating background color utility classes, say bg-flair via $theme-colors map. useful wanted let $primary default $blue, use bg-flair instead bg-primary color card’s title:","code":"bs_theme(\"theme-colors\" = \"('flair': orange)\")"},{"path":"https://rstudio.github.io/bslib/articles/value-boxes/index.html","id":"build-a-box-app","dir":"Articles > Value-boxes","previous_headings":"","what":"Build a Box App","title":"Value boxes","text":"Want explore value_box() options layouts interactive app? Check Build Box App! Use app quickly choose right layout theme value boxes, copy code right app.","code":""},{"path":"https://rstudio.github.io/bslib/articles/value-boxes/index.html","id":"hello-value_box","dir":"Articles > Value-boxes","previous_headings":"","what":"Hello value_box()","title":"Value boxes","text":"value_box() 4 main parts: value: text value. title: Optional text display value. showcase: Optional UI element(s) display alongside value. theme: Optional theme change appearance value box. ...: text/UI elements appear value. ’ll see later, one can clever goes showcase, many cases icon provides enough visual context box feel “complete”. recommend using new bsicons package since ’s designed Bootstrap mind, also use fontawesome {icons}. value box can showcase plot icon, choosing one three values showcase_layout: \"left center\", \"top right\", \"bottom\". See Showcase Layouts section value_box() documentation details. overall appearance value box may customized theme argument, can choose wide variety themes — Themes section value_box() documentation lays options. Left center Top Right got 99 problems bslib ain't one hit got 99 problems bslib ain't one hit ","code":"value_box( title = \"I got\", value = \"99 problems\", showcase = bs_icon(\"music-note-beamed\"), p(\"bslib ain't one\", bs_icon(\"emoji-smile\")), p(\"hit me\", bs_icon(\"suit-spade\")) ) value_box( title = \"I got\", value = \"99 problems\", showcase = bs_icon(\"music-note-beamed\"), showcase_layout = \"top right\", theme = \"secondary\", p(\"bslib ain't one\", bs_icon(\"emoji-smile\")), p(\"hit me\", bs_icon(\"suit-spade\")) )"},{"path":"https://rstudio.github.io/bslib/articles/value-boxes/index.html","id":"dynamic-rendering-shiny","dir":"Articles > Value-boxes","previous_headings":"","what":"Dynamic rendering (Shiny)","title":"Value boxes","text":"using Shiny dynamically render value_box() contents, ’s good practice use textOutput() serve placeholder value, title, etc. way, value takes moment compute, value box appear value ready, thus reduces “layout shift” value actually rendered.","code":"ui <- page_fixed( value_box( title = \"The current time\", value = textOutput(\"time\"), showcase = bs_icon(\"clock\") ) ) server <- function(input, output) { output$time <- renderText({ invalidateLater(1000) format(Sys.time()) }) } shinyApp(ui, server)"},{"path":"https://rstudio.github.io/bslib/articles/value-boxes/index.html","id":"multiple-value-boxes","dir":"Articles > Value-boxes","previous_headings":"","what":"Multiple value boxes","title":"Value boxes","text":"layout multiple value boxes, ’s recommended use layout_column_wrap() (layout_columns()), ensures uniform height width (least default) across boxes. 1st value 123 1st detail 2nd value 456 2nd detail 3rd detail 3rd value 789 4th detail 5th detail 6th detail , incorporating multiple value boxes larger filling layout, ’s good practice set fill = FALSE layout container since ’ll prevent boxes using space really need. example, try resizing following example vertically. Notice height value boxes don’t change, height plot (isn’t allowed shrink 200 pixels):","code":"vbs <- list( value_box( title = \"1st value\", value = \"123\", showcase = bs_icon(\"bar-chart\"), theme = \"purple\", p(\"The 1st detail\") ), value_box( title = \"2nd value\", value = \"456\", showcase = bs_icon(\"graph-up\"), theme = \"teal\", p(\"The 2nd detail\"), p(\"The 3rd detail\") ), value_box( title = \"3rd value\", value = \"789\", showcase = bs_icon(\"pie-chart\"), theme = \"pink\", p(\"The 4th detail\"), p(\"The 5th detail\"), p(\"The 6th detail\") ) ) layout_column_wrap( width = \"250px\", !!!vbs ) page_fillable( layout_column_wrap( width = \"250px\", fill = FALSE, vbs[[1]], vbs[[2]] ), card( min_height = 200, plotly::plot_ly(x = rnorm(100)) ) )"},{"path":"https://rstudio.github.io/bslib/articles/value-boxes/index.html","id":"expandable-sparklines","dir":"Articles > Value-boxes","previous_headings":"","what":"Expandable sparklines","title":"Value boxes","text":"--hood, value_box() implemented using card(), mainly inherit ’s full_screen capabilities. Expanding value_box() full screen isn’t useful showcase something simple like icon, becomes quite compelling something like “expandable sparkline”. code right demonstrates one way might go plotly. Note , since example statically rendered (outside Shiny), make use htmlwidgets::onRender() add JavaScript effectively says: “Show xaxis chart ’s taller 200 pixels; otherwise, hide ”. aren’t wanting write JavaScript can achieve similar behavior (.e., displaying different chart depending ’s size) via shiny::getCurrentOutputInfo(), mentioned article cards. fact, ’s source code Shiny app effectively thing without JavaScript (note also leverages getCurrentOutputInfo() values avoid hard coding \"white\" colors sparklines). Personal Savings Rate 7.6% Started 12.6% Averaged 8.6% period Peaked 17.3% May 1975","code":"library(plotly) sparkline <- plot_ly(economics) %>% add_lines( x = ~date, y = ~psavert, color = I(\"white\"), span = I(1), fill = 'tozeroy', alpha = 0.2 ) %>% layout( xaxis = list(visible = F, showgrid = F, title = \"\"), yaxis = list(visible = F, showgrid = F, title = \"\"), hovermode = \"x\", margin = list(t = 0, r = 0, l = 0, b = 0), font = list(color = \"white\"), paper_bgcolor = \"transparent\", plot_bgcolor = \"transparent\" ) %>% config(displayModeBar = F) %>% htmlwidgets::onRender( \"function(el) { el.closest('.bslib-value-box') .addEventListener('bslib.card', function(ev) { Plotly.relayout(el, {'xaxis.visible': ev.detail.fullScreen}); }) }\" ) value_box( title = \"Personal Savings Rate\", value = \"7.6%\", p(\"Started at 12.6%\"), p(\"Averaged 8.6% over that period\"), p(\"Peaked 17.3% in May 1975\"), showcase = sparkline, full_screen = TRUE, theme = \"success\" )"},{"path":"https://rstudio.github.io/bslib/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Carson Sievert. Author, maintainer. Joe Cheng. Author. Garrick Aden-Buie. Author. Posit Software, PBC. Copyright holder, funder. Bootstrap contributors. Contributor. Bootstrap library Twitter, Inc. Copyright holder. Bootstrap library Javi Aguilar. Contributor, copyright holder. Bootstrap colorpicker library Thomas Park. Contributor, copyright holder. Bootswatch library PayPal. Contributor, copyright holder. Bootstrap accessibility plugin","code":""},{"path":"https://rstudio.github.io/bslib/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Sievert C, Cheng J, Aden-Buie G (2024). bslib: Custom 'Bootstrap' 'Sass' Themes 'shiny' 'rmarkdown'. R package version 0.8.0, https://github.com/rstudio/bslib, https://rstudio.github.io/bslib/.","code":"@Manual{, title = {bslib: Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'}, author = {Carson Sievert and Joe Cheng and Garrick Aden-Buie}, year = {2024}, note = {R package version 0.8.0, https://github.com/rstudio/bslib}, url = {https://rstudio.github.io/bslib/}, }"},{"path":"https://rstudio.github.io/bslib/index.html","id":"bslib","dir":"","previous_headings":"","what":"Custom Bootstrap Sass Themes for shiny and rmarkdown","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"bslib R package provides modern UI toolkit Shiny R Markdown based Bootstrap. facilitates: underlying UI components (e.g., cards, value boxes, sidebars, etc) also designed work contexts (e.g., R Markdown). Apps can even themed interactively real-time. Shiny R Markdown currently default Bootstrap 3 may continue maintain backwards compatibility.","code":""},{"path":"https://rstudio.github.io/bslib/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"Install bslib package CRAN follows:","code":"install.packages(\"bslib\")"},{"path":"https://rstudio.github.io/bslib/index.html","id":"an-example","dir":"","previous_headings":"","what":"An example","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"quickest way see bslib can run bslib::bs_theme_preview() console. launches demo app containing bslib shiny UI components well theming widget (bslib::bs_themer()) overlaid app. See real-time theming learn .","code":""},{"path":"https://rstudio.github.io/bslib/index.html","id":"get-started","dir":"","previous_headings":"","what":"Get started","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"Since bslib covers wide array uses, numerous getting started articles, focusing particular interest: Shiny dashboards Bootstrap project Theming","code":""},{"path":"https://rstudio.github.io/bslib/index.html","id":"getting-help","dir":"","previous_headings":"","what":"Getting help","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"two main places get help bslib: RStudio community friendly place ask questions (sure add bslib tag creating topic). Stack Overflow great source answers common bslib questions. also great place get help, created reproducible example illustrates problem. Use tags [r][bslib] ask question. Add tag [bslib] using Shiny runtime.","code":""},{"path":"https://rstudio.github.io/bslib/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Custom Bootstrap Sass Themes for shiny and rmarkdown","text":"Please note bslib project released Contributor Code Conduct. contributing project, agree abide terms.","code":""},{"path":"https://rstudio.github.io/bslib/reference/accordion.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a vertically collapsing accordion — accordion","title":"Create a vertically collapsing accordion — accordion","text":"accordion can used organize UI elements content limited space. comprises multiple, vertically stacked panels expand collapse clicked, providing compact layout works well grouping input elements sidebar() organizing detailed context-specific information.","code":""},{"path":"https://rstudio.github.io/bslib/reference/accordion.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a vertically collapsing accordion — accordion","text":"","code":"accordion( ..., id = NULL, open = NULL, multiple = TRUE, class = NULL, width = NULL, height = NULL ) accordion_panel(title, ..., value = title, icon = NULL)"},{"path":"https://rstudio.github.io/bslib/reference/accordion.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a vertically collapsing accordion — accordion","text":"... Named arguments become attributes

    element. Unnamed arguments accordion_panel()s. id provided, can use input$id server logic determine accordion_panel()s currently active. value correspond accordion_panel()'s value argument. open character vector accordion_panel() values open (.e., show) default. default value NULL open first accordion_panel(). Use value TRUE open (FALSE open none) items. possible open one panel multiple=TRUE. multiple Whether multiple accordion_panel() can open . class Additional CSS classes include accordion div. width, height valid CSS unit; example, height=\"100%\". title title appear accordion_panel()'s header. value character string uniquely identifies panel. icon htmltools::tag child (e.g., bsicons::bs_icon()) positioned just title.","code":""},{"path":"https://rstudio.github.io/bslib/reference/accordion.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create a vertically collapsing accordion — accordion","text":"bslib's accordion component derived Bootstrap Accordion component. Accordions also featured bslib website: Get Started: Dashboards Sidebars: Accordions","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/accordion.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a vertically collapsing accordion — accordion","text":"","code":"if (FALSE) { # rlang::is_interactive() items <- lapply(LETTERS, function(x) { accordion_panel(paste(\"Section\", x), paste(\"Some narrative for section\", x)) }) # First shown by default accordion(!!!items) # Nothing shown by default accordion(!!!items, open = FALSE) # Everything shown by default accordion(!!!items, open = TRUE) # Show particular sections accordion(!!!items, open = \"Section B\") accordion(!!!items, open = c(\"Section A\", \"Section B\")) # Provide an id to create a shiny input binding library(shiny) ui <- page_fluid( accordion(!!!items, id = \"acc\") ) server <- function(input, output) { observe(print(input$acc)) } shinyApp(ui, server) }"},{"path":"https://rstudio.github.io/bslib/reference/accordion_panel_set.html","id":null,"dir":"Reference","previous_headings":"","what":"Dynamically update accordions — accordion_panel_set","title":"Dynamically update accordions — accordion_panel_set","text":"Dynamically update/modify accordion()s Shiny app. updated programmatically, accordion() must id. functions require active Shiny session work running Shiny app.","code":""},{"path":"https://rstudio.github.io/bslib/reference/accordion_panel_set.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Dynamically update accordions — accordion_panel_set","text":"","code":"accordion_panel_set(id, values, session = get_current_session()) accordion_panel_open(id, values, session = get_current_session()) accordion_panel_close(id, values, session = get_current_session()) accordion_panel_insert( id, panel, target = NULL, position = c(\"after\", \"before\"), session = get_current_session() ) accordion_panel_remove(id, target, session = get_current_session()) accordion_panel_update( id, target, ..., title = NULL, value = NULL, icon = NULL, session = get_current_session() )"},{"path":"https://rstudio.github.io/bslib/reference/accordion_panel_set.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Dynamically update accordions — accordion_panel_set","text":"id character string matches existing accordion()'s id. values either character string (used identify particular accordion_panel()s value) TRUE (.e., values). session shiny session object (default almost always used). panel accordion_panel(). target value existing panel insert next . removing: value accordion_panel() remove. position panel added target? target NULL (default), \"\" append last panel \"\" prepend first panel. ... Elements become new content panel. title title appear accordion_panel()'s header. value character string uniquely identifies panel. icon htmltools::tag child (e.g., bsicons::bs_icon()) positioned just title.","code":""},{"path":"https://rstudio.github.io/bslib/reference/accordion_panel_set.html","id":"functions","dir":"Reference","previous_headings":"","what":"Functions","title":"Dynamically update accordions — accordion_panel_set","text":"accordion_panel_set(): accordion_panel_open(), except also closes currently open panels. accordion_panel_open(): open accordion_panel()s. accordion_panel_close(): close accordion_panel()s. accordion_panel_insert(): insert new accordion_panel() accordion_panel_remove(): remove accordion_panel()s. accordion_panel_update(): update accordion_panel().","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/as.tags.bslib_sidebar.html","id":null,"dir":"Reference","previous_headings":"","what":"Render a sidebar as HTML tags — as.tags.bslib_sidebar","title":"Render a sidebar as HTML tags — as.tags.bslib_sidebar","text":"Renders sidebar element collapse toggle elements sidebar() layout_sidebar() context.","code":""},{"path":"https://rstudio.github.io/bslib/reference/as.tags.bslib_sidebar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Render a sidebar as HTML tags — as.tags.bslib_sidebar","text":"","code":"# S3 method for class 'bslib_sidebar' as.tags(x, ...)"},{"path":"https://rstudio.github.io/bslib/reference/as.tags.bslib_sidebar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Render a sidebar as HTML tags — as.tags.bslib_sidebar","text":"x sidebar() object. ... Additional arguments passed htmltools::.tags().","code":""},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":null,"dir":"Reference","previous_headings":"","what":"Test and/or coerce fill behavior — as_fill_carrier","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"Filling layouts bslib built foundation fillable containers fill items (fill carriers fillable fill). bslib components (e.g., card(), card_body(), layout_sidebar()) possess fillable fill arguments (control fill behavior). However, sometimes useful add, remove, /test fillable/fill properties arbitrary htmltools::tag(), functions designed .","code":""},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"","code":"as_fill_carrier( x, ..., min_height = NULL, max_height = NULL, gap = NULL, class = NULL, style = NULL, css_selector = NULL ) as_fillable_container( x, ..., min_height = NULL, max_height = NULL, gap = NULL, class = NULL, style = NULL, css_selector = NULL ) as_fill_item( x, ..., min_height = NULL, max_height = NULL, class = NULL, style = NULL, css_selector = NULL ) remove_all_fill(x) is_fill_carrier(x) is_fillable_container(x) is_fill_item(x)"},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"x htmltools::tag(). ... Currently ignored. min_height, max_height valid CSS unit (e.g., 150). gap valid CSS unit. class character vector class names add tag. style character vector CSS properties add tag. css_selector character string containing CSS selector targeting particular (inner) tag(s) interest. details selector(s) supported, see htmltools::tagAppendAttributes().","code":""},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"as_fill(), as_fillable(), as_fill_carrier(): tagified version x, relevant tags modified possess relevant fill properties. is_fill(), is_fillable(), is_fill_carrier(): logical vector, length matching number top-level tags possess relevant fill properties.","code":""},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"Although as_fill(), as_fillable(), as_fill_carrier() can work non-tag objects htmltools::.tags method (e.g., htmlwidgets), return \"tagified\" version object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"Filling Layouts article bslib website introduces concept fillable containers fill items.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/as_fill_carrier.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Test and/or coerce fill behavior — as_fill_carrier","text":"","code":"if (FALSE) { # rlang::is_interactive() library(shiny) shinyApp( page_fillable( # without `as_fill_carrier()`, the plot won't fill the page because # `uiOutput()` is neither a fillable container nor a fill item by default. as_fill_carrier(uiOutput(\"ui\")) ), function(input, output) { output$ui <- renderUI({ div( class = \"bg-info text-white\", as_fill_item(), \"A fill item\" ) }) } ) }"},{"path":"https://rstudio.github.io/bslib/reference/bind_task_button.html","id":null,"dir":"Reference","previous_headings":"","what":"Bind input_task_button to ExtendedTask — bind_task_button","title":"Bind input_task_button to ExtendedTask — bind_task_button","text":"Sets shiny::ExtendedTask relay state existing input_task_button(), task button stays \"busy\" state long extended task running. Note bind_task_button automatically cause button presses invoke extended task; still need use shiny::bindEvent() (shiny::observeEvent()) cause button press trigger invocation, example . bind_task_button used bind one task button multiple ExtendedTask objects; attempt , bound ExtendedTask completes cause button return \"ready\" state.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bind_task_button.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Bind input_task_button to ExtendedTask — bind_task_button","text":"","code":"bind_task_button(target, task_button_id, ...) # Default S3 method bind_task_button(target, task_button_id, ...) # S3 method for class 'ExtendedTask' bind_task_button(target, task_button_id, ..., session = get_current_session())"},{"path":"https://rstudio.github.io/bslib/reference/bind_task_button.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Bind input_task_button to ExtendedTask — bind_task_button","text":"target target object (.e. ExtendedTask). task_button_id string matching id argument passed corresponding input_task_button() call. ... arguments passed methods. session Shiny session object (default almost always used).","code":""},{"path":"https://rstudio.github.io/bslib/reference/bind_task_button.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Bind input_task_button to ExtendedTask — bind_task_button","text":"target object passed .","code":""},{"path":"https://rstudio.github.io/bslib/reference/bind_task_button.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Bind input_task_button to ExtendedTask — bind_task_button","text":"","code":"if (FALSE) { # rlang::is_interactive() library(shiny) library(bslib) library(future) plan(multisession) ui <- page_sidebar( sidebar = sidebar( input_task_button(\"recalc\", \"Recalculate\") ), textOutput(\"outval\") ) server <- function(input, output) { rand_task <- ExtendedTask$new(function() { future({ # Slow operation goes here Sys.sleep(2) runif(1) }, seed = TRUE) }) # Make button state reflect task. # If using R >=4.1, you can do this instead: # rand_task <- ExtendedTask$new(...) |> bind_task_button(\"recalc\") bind_task_button(rand_task, \"recalc\") observeEvent(input$recalc, { rand_task$invoke() }) output$outval <- renderText({ rand_task$result() }) } shinyApp(ui, server) }"},{"path":"https://rstudio.github.io/bslib/reference/bootswatch_themes.html","id":null,"dir":"Reference","previous_headings":"","what":"Obtain a list of all available bootswatch themes. — bootswatch_themes","title":"Obtain a list of all available bootswatch themes. — bootswatch_themes","text":"Obtain list available bootswatch themes.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bootswatch_themes.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Obtain a list of all available bootswatch themes. — bootswatch_themes","text":"","code":"bootswatch_themes(version = version_default(), full_path = FALSE)"},{"path":"https://rstudio.github.io/bslib/reference/bootswatch_themes.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Obtain a list of all available bootswatch themes. — bootswatch_themes","text":"version major version Bootswatch. full_path Whether return path installed theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bootswatch_themes.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Obtain a list of all available bootswatch themes. — bootswatch_themes","text":"Returns character vector Bootswatch themes.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/breakpoints.html","id":null,"dir":"Reference","previous_headings":"","what":"Define breakpoint values — breakpoints","title":"Define breakpoint values — breakpoints","text":"generic constructor responsive breakpoints.","code":""},{"path":"https://rstudio.github.io/bslib/reference/breakpoints.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Define breakpoint values — breakpoints","text":"","code":"breakpoints(..., xs = NULL, sm = NULL, md = NULL, lg = NULL)"},{"path":"https://rstudio.github.io/bslib/reference/breakpoints.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Define breakpoint values — breakpoints","text":"... breakpoints (e.g., xl). xs default value apply xs breakpoint. Note breakpoint generally equivalent \"sizes\" typically treated base case value apply default across breakpoints unless overridden larger breakpoint. sm Values apply sm breakpoint. md Values apply md breakpoint. lg Values apply lg breakpoint.","code":""},{"path":"https://rstudio.github.io/bslib/reference/breakpoints.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Define breakpoint values — breakpoints","text":"Bootstrap's Breakpoints article provides detail breakpoints used customized.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/breakpoints.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Define breakpoint values — breakpoints","text":"","code":"breakpoints(sm = c(4, 4, 4), md = c(3, 3, 6), lg = c(-2, 8, -2)) #> #> sm: 4 4 4 #> md: 3 3 6 #> lg: -2 8 -2"},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":null,"dir":"Reference","previous_headings":"","what":"Add low-level theming customizations — bs_add_variables","title":"Add low-level theming customizations — bs_add_variables","text":"functions provide direct access layers bslib theme created bs_theme(). Learn composable Sass layers sass website.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add low-level theming customizations — bs_add_variables","text":"","code":"bs_add_variables( theme, ..., .where = \"defaults\", .default_flag = identical(.where, \"defaults\") ) bs_add_rules(theme, rules) bs_add_functions(theme, functions) bs_add_mixins(theme, mixins) bs_bundle(theme, ...)"},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add low-level theming customizations — bs_add_variables","text":"theme bs_theme() object. ... bs_add_variables(): named Sass variables values can passed directly defaults argument sass::sass_layer(). bs_bundle(): arguments can handled sass::sass_bundle() appended theme .Whether place variable definitions Sass \"defaults\", Sass \"declarations\", Sass \"rules\". .default_flag Whether add !default flag (missing) variable expressions. recommended keep TRUE .= \"defaults\". rules Sass rules. Anything understood sass::as_sass() may provided (e.g., list, character vector, sass::sass_file(), etc) functions character vector sass::sass_file() containing functions definitions. mixins character vector sass::sass_file() containing mixin definitions.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add low-level theming customizations — bs_add_variables","text":"Returns modified bs_theme() object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add low-level theming customizations — bs_add_variables","text":"Compared higher-level theme customization available bs_theme(), functions direct interface Bootstrap Sass, therefore, nothing ensure theme customizations portable major Bootstrap versions.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"functions","dir":"Reference","previous_headings":"","what":"Functions","title":"Add low-level theming customizations — bs_add_variables","text":"bs_add_variables(): Add Bootstrap Sass variable defaults. bs_add_rules(): Add additional Sass rules. bs_add_functions(): Add additional Sass functions. bs_add_mixins(): Add additional Sass mixins. bs_bundle(): Add additional sass::sass_bundle() objects existing theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Add low-level theming customizations — bs_add_variables","text":"bslib's theming capabilities powered sass package. Learn composable Sass layers sass website.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_bundle.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add low-level theming customizations — bs_add_variables","text":"","code":"if (FALSE) { # rlang::is_interactive() # Function to preview the styling a (primary) Bootstrap button library(htmltools) button <- tags$a(class = \"btn btn-primary\", href = \"#\", role = \"button\", \"Hello\") preview_button <- function(theme) { browsable(tags$body(bs_theme_dependencies(theme), button)) } # Here we start with a theme based on a Bootswatch theme, # then override some variable defaults theme <- bs_add_variables( bs_theme(bootswatch = \"sketchy\", primary = \"orange\"), \"body-bg\" = \"#EEEEEE\", \"font-family-base\" = \"monospace\", \"font-size-base\" = \"1.4rem\", \"btn-padding-y\" = \".16rem\", \"btn-padding-x\" = \"2rem\" ) preview_button(theme) # If you need to set a variable based on another Bootstrap variable theme <- bs_add_variables(theme, \"body-color\" = \"$success\", .where = \"declarations\") preview_button(theme) # Start a new global theme and add some custom rules that # use Bootstrap variables to define a custom styling for a # 'person card' person_rules <- system.file(\"custom\", \"person.scss\", package = \"bslib\") theme <- bs_add_rules(bs_theme(), sass::sass_file(person_rules)) # Include custom CSS that leverages bootstrap Sass variables person <- function(name, title, company) { tags$div( class = \"person\", h3(class = \"name\", name), div(class = \"title\", title), div(class = \"company\", company) ) } page_fluid( theme = theme, person(\"Andrew Carnegie\", \"Owner\", \"Carnegie Steel Company\"), person(\"John D. Rockefeller\", \"Chairman\", \"Standard Oil\") ) }"},{"path":"https://rstudio.github.io/bslib/reference/bs_current_theme.html","id":null,"dir":"Reference","previous_headings":"","what":"Obtain the currently active theme at render time — bs_current_theme","title":"Obtain the currently active theme at render time — bs_current_theme","text":"Intended advanced use developers obtain currently active theme render time primarily implementing themable widgets otherwise themed via bs_dependency_defer() .","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_current_theme.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Obtain the currently active theme at render time — bs_current_theme","text":"","code":"bs_current_theme(session = get_current_session(FALSE))"},{"path":"https://rstudio.github.io/bslib/reference/bs_current_theme.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Obtain the currently active theme at render time — bs_current_theme","text":"session current Shiny session ().","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_current_theme.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Obtain the currently active theme at render time — bs_current_theme","text":"Returns bs_theme() object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_current_theme.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Obtain the currently active theme at render time — bs_current_theme","text":"function generally called print/render time. example: Inside preRenderHook htmlwidgets::createWidget(). Inside custom print method generates htmltools::tags. Inside htmltools::tagFunction() Calling function print/render time important different things based context called: reactive context active, session$getCurrentTheme() called (reactive read). reactive context active, shiny::getCurrentTheme() called (returns current app's theme, relevant). shiny::getCurrentTheme() comes empty, bs_global_get() called, relevant rmarkdown::html_document(), possibly static rendering contexts.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":null,"dir":"Reference","previous_headings":"","what":"Themeable HTML components — bs_dependency","title":"Themeable HTML components — bs_dependency","text":"Themeable HTML components use Sass generate CSS rules Bootstrap Sass variables, functions, /mixins (.e., stuff inside theme). bs_dependencies() makes bit easier create themeable components compiling sass::sass() (input) together Bootstrap Sass inside theme, packaging result htmltools::htmlDependency(). Themable components can also dynamically themed inside Shiny (.e., may themed 'real-time' via bs_themer(), generally, update styles response shiny::session's setCurrentTheme() method). Dynamically themeable components provide \"recipe\" (.e., function) bs_dependency_defer(), describing generate new CSS stylesheet(s) new theme. function called HTML page first rendered, may invoked new theme whenever shiny::session's setCurrentTheme() called.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Themeable HTML components — bs_dependency","text":"","code":"bs_dependency( input = list(), theme, name, version, cache_key_extra = NULL, .dep_args = list(), .sass_args = list() ) bs_dependency_defer(func, memoise = TRUE)"},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Themeable HTML components — bs_dependency","text":"input Sass rules compile, using theme. theme bs_theme() object. name Library name version Library version cache_key_extra Extra information add sass cache key. useful add version package. .dep_args list additional arguments pass htmltools::htmlDependency(). Note package effect script must absolute path(s). .sass_args list additional arguments pass sass::sass_partial(). func non-anonymous function, single argument. function accept bs_theme() object return single htmltools::htmlDependency(), list , NULL. memoise whether memoise (.e., cache) func results short period time. default, TRUE, can large performance benefits many instances themable widget rendered. Note may want avoid memoisation func relies side-effects (e.g., files -disk) need change themable widget instance.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Themeable HTML components — bs_dependency","text":"bs_dependency() returns htmltools::htmlDependency() bs_dependency_defer() returns htmltools::tagFunction()","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Themeable HTML components — bs_dependency","text":"Theming: Custom components gives tutorial creating dynamically themable custom component.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_dependency.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Themeable HTML components — bs_dependency","text":"","code":"if (FALSE) { # rlang::is_interactive() myWidgetVersion <- \"1.2.3\" myWidgetDependency <- function() { list( bs_dependency_defer(myWidgetCss), htmlDependency( name = \"mywidget-js\", version = myWidgetVersion, src = system.file(package = \"mypackage\", \"js\"), script = \"mywidget.js\" ) ) } myWidgetCSS <- function(theme) { if (!is_bs_theme(theme)) { return( htmlDependency( name = \"mywidget-css\", version = myWidgetVersion, src = system.file(package = \"mypackage\", \"css\"), stylesheet = \"mywidget.css\" ) ) } # Compile mywidget.scss using the variables and defaults from the theme # object. sass_input <- sass::sass_file(system.file(package = \"mypackage\", \"scss/mywidget.scss\")) bs_dependency( input = sass_input, theme = theme, name = \"mywidget\", version = myWidgetVersion, cache_key_extra = utils::packageVersion(\"mypackage\") ) } # Note that myWidgetDependency is not defined inside of myWidget. This is so # that, if `myWidget()` is called multiple times, Shiny can tell that the # function objects are identical and deduplicate them. myWidget <- function(id) { div( id = id, span(\"myWidget\"), myWidgetDependency() ) } }"},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":null,"dir":"Reference","previous_headings":"","what":"Retrieve Sass variable values from the current theme — bs_get_variables","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"Useful retrieving variable current theme using value inform another R function.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"","code":"bs_get_variables(theme, varnames) bs_get_contrast(theme, varnames)"},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"theme bs_theme() object. varnames character string referencing Sass variable current theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"Returns character string containing CSS/Sass value. variable(s) defined, value NA.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"Theming: Bootstrap 5 variables provides searchable reference theming variables available Bootstrap 5.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_get_variables.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Retrieve Sass variable values from the current theme — bs_get_variables","text":"","code":"vars <- c(\"body-bg\", \"body-color\", \"primary\", \"border-radius\") bs_get_variables(bs_theme(), varnames = vars) #> body-bg body-color primary border-radius #> \"#ffffff\" \"#1D1F21\" \"#007bc2\" \"3px\" bs_get_variables(bs_theme(bootswatch = \"darkly\"), varnames = vars) #> body-bg body-color primary border-radius #> \"#222\" \"#fff\" \"#375a7f\" \"0.375rem\" bs_get_contrast(bs_theme(), c(\"primary\", \"dark\", \"light\")) #> primary dark light #> \"#FFFFFF\" \"#FFFFFF\" \"#000000\" library(htmltools) div( class = \"bg-primary\", style = css( color = bs_get_contrast(bs_theme(), \"primary\") ) ) #>
    <\/div>"},{"path":"https://rstudio.github.io/bslib/reference/bs_global_theme.html","id":null,"dir":"Reference","previous_headings":"","what":"Global theming — bs_global_theme","title":"Global theming — bs_global_theme","text":"bs_global_theme() creates sets global Bootstrap Sass theme. theme typically found bs_theme_dependencies() app document global theme used. can obtain current global theme bs_global_get() directly set global theme bs_global_set().","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_global_theme.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Global theming — bs_global_theme","text":"","code":"bs_global_theme( version = version_default(), preset = NULL, bg = NULL, fg = NULL, primary = NULL, secondary = NULL, success = NULL, info = NULL, warning = NULL, danger = NULL, base_font = NULL, code_font = NULL, heading_font = NULL, ..., bootswatch = NULL ) bs_global_set(theme = bs_theme()) bs_global_get() bs_global_clear() bs_global_add_variables( ..., .where = \"defaults\", .default_flag = identical(.where, \"defaults\") ) bs_global_add_rules(...) bs_global_bundle(...) bs_global_theme_update( ..., preset = NULL, bg = NULL, fg = NULL, primary = NULL, secondary = NULL, success = NULL, info = NULL, warning = NULL, danger = NULL, base_font = NULL, code_font = NULL, heading_font = NULL, bootswatch = NULL )"},{"path":"https://rstudio.github.io/bslib/reference/bs_global_theme.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Global theming — bs_global_theme","text":"version major version Bootstrap use (see versions() possible values). Defaults currently recommended version new projects (currently Bootstrap 5). preset name theme preset, either built-theme provided bslib Bootswatch theme (see builtin_themes() bootswatch_themes() possible values). argument takes precedence bootswatch argument one preset bootswatch can provided. bootswatch theme specified, version 5 higher, preset defaults \"shiny\". remove \"shiny\" preset, provide value \"bootstrap\" (value also work bs_theme_update() remove preset bootswatch theme). bg color string background. fg color string foreground. primary color used hyperlinks, indicate primary/default actions, show active selection state Bootstrap components. Generally bold, saturated color contrasts theme's base colors. secondary color components messages need stand . (supported Bootstrap 3.) success color messages indicate operation succeeded. Typically green. info color messages informative critical. Typically shade blue-green. warning color warning messages. Typically yellow. danger color errors. Typically red. base_font default typeface. code_font typeface used code. sure monospace! heading_font typeface used heading elements. ... arguments passed along bs_add_variables(). bootswatch name bootswatch theme (see bootswatch_themes() possible values). provided bs_theme_update(), previous Bootswatch theme first removed new one applied (use bootswatch = \"bootstrap\" effectively remove Bootswatch theme). theme bs_theme() object. .Whether place variable definitions Sass \"defaults\", Sass \"declarations\", Sass \"rules\". .default_flag Whether add !default flag (missing) variable expressions. recommended keep TRUE .= \"defaults\".","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_global_theme.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Global theming — bs_global_theme","text":"Functions modify global theme (e.g., bs_global_set()) invisibly return previously set theme. bs_global_get() returns current global theme.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_global_theme.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Global theming — bs_global_theme","text":"","code":"# Remember the global state now (so we can restore later) theme <- bs_global_get() # Use Bootstrap 3 (globally) with some theme customization bs_global_theme(3, bg = \"#444\", fg = \"#e4e4e4\", primary = \"#e39777\") if (rlang::is_interactive()) { bs_theme_preview(with_themer = FALSE) } # If no global theme is active, bs_global_get() returns NULL bs_global_clear() bs_global_get() #> NULL # Restore the original state bs_global_set(theme)"},{"path":"https://rstudio.github.io/bslib/reference/bs_remove.html","id":null,"dir":"Reference","previous_headings":"","what":"Remove or retrieve Sass code from a theme — bs_remove","title":"Remove or retrieve Sass code from a theme — bs_remove","text":"Bootstrap theme created bs_theme() comprised many Sass layers. bs_remove() bs_retrieve() allow remove retrieve individual layer, either reduce size compiled CSS extract styles theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_remove.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Remove or retrieve Sass code from a theme — bs_remove","text":"","code":"bs_remove(theme, ids = character(0)) bs_retrieve(theme, ids = character(0), include_unnamed = TRUE)"},{"path":"https://rstudio.github.io/bslib/reference/bs_remove.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Remove or retrieve Sass code from a theme — bs_remove","text":"theme bs_theme() object. ids character vector ids include_unnamed whether include unnamed sass::sass_layer()s (e.g., Bootstrap Sass variables, functions, mixins).","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_remove.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Remove or retrieve Sass code from a theme — bs_remove","text":"Returns modified bs_theme() object.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_remove.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Remove or retrieve Sass code from a theme — bs_remove","text":"","code":"bs4 <- bs_theme(version = 4) # Retrieve sass bundle for print styles bs_retrieve(bs4, \"_print\", include_unnamed = FALSE) #> /* Sass Bundle: _print */ #> @import \"/home/runner/work/_temp/Library/bslib/lib/bs4/scss/_print.scss\"; #> /* *** */ # Remove CSS rules for print and carousels bs4_no_print <- bs_remove(bs4, c(\"_print\", \"_carousel\")) suppressWarnings( bs_retrieve(bs4_no_print, \"_print\", include_unnamed = FALSE) ) #> /* Sass Bundle: (empty) *** */ # Remove BS3 compatibility layer bs4_no_compat <- bs_remove(bs4, \"bs3compat\")"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a Bootstrap theme — bs_theme","title":"Create a Bootstrap theme — bs_theme","text":"Creates Bootstrap theme object, can: Choose (major) Bootstrap version. Choose Bootswatch theme (optional). Customize main colors fonts via explicitly named arguments (e.g., bg, fg, primary, etc). Customize , lower-level, Bootstrap Sass variable defaults via .... learn implement custom themes, well use inside Shiny R Markdown, see .","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a Bootstrap theme — bs_theme","text":"","code":"bs_theme( version = version_default(), preset = NULL, ..., bg = NULL, fg = NULL, primary = NULL, secondary = NULL, success = NULL, info = NULL, warning = NULL, danger = NULL, base_font = NULL, code_font = NULL, heading_font = NULL, font_scale = NULL, bootswatch = NULL ) bs_theme_update( theme, ..., preset = NULL, bg = NULL, fg = NULL, primary = NULL, secondary = NULL, success = NULL, info = NULL, warning = NULL, danger = NULL, base_font = NULL, code_font = NULL, heading_font = NULL, font_scale = NULL, bootswatch = NULL ) is_bs_theme(x)"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a Bootstrap theme — bs_theme","text":"version major version Bootstrap use (see versions() possible values). Defaults currently recommended version new projects (currently Bootstrap 5). preset name theme preset, either built-theme provided bslib Bootswatch theme (see builtin_themes() bootswatch_themes() possible values). argument takes precedence bootswatch argument one preset bootswatch can provided. bootswatch theme specified, version 5 higher, preset defaults \"shiny\". remove \"shiny\" preset, provide value \"bootstrap\" (value also work bs_theme_update() remove preset bootswatch theme). ... arguments passed along bs_add_variables(). bg color string background. fg color string foreground. primary color used hyperlinks, indicate primary/default actions, show active selection state Bootstrap components. Generally bold, saturated color contrasts theme's base colors. secondary color components messages need stand . (supported Bootstrap 3.) success color messages indicate operation succeeded. Typically green. info color messages informative critical. Typically shade blue-green. warning color warning messages. Typically yellow. danger color errors. Typically red. base_font default typeface. code_font typeface used code. sure monospace! heading_font typeface used heading elements. font_scale scalar multiplier apply base font size. example, value 1.5 scales font sizes 150% value 0.8 scales 80%. Must positive number. bootswatch name bootswatch theme (see bootswatch_themes() possible values). provided bs_theme_update(), previous Bootswatch theme first removed new one applied (use bootswatch = \"bootstrap\" effectively remove Bootswatch theme). theme bs_theme() object. x object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a Bootstrap theme — bs_theme","text":"Returns sass::sass_bundle() (list-like) object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"colors","dir":"Reference","previous_headings":"","what":"Colors","title":"Create a Bootstrap theme — bs_theme","text":"Colors may provided format htmltools::parseCssColors() can understand. control vast majority ('grayscale') color defaults, specify fg (foreground) bg (background) colors. primary secondary theme colors also useful accenting main grayscale colors things like hyperlinks, tabset panels, buttons.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"fonts","dir":"Reference","previous_headings":"","what":"Fonts","title":"Create a Bootstrap theme — bs_theme","text":"Use base_font, code_font, heading_font control main typefaces. arguments set new defaults relevant font-family CSS properties, necessarily import relevant font files. set CSS properties import font files, consider using various font_face() helpers. *_font argument may single font font_collection(). font can created font_google(), font_link(), font_face(), can character vector font names following format: single unquoted name (e.g., \"Source Sans Pro\"). single quoted name (e.g., \"'Source Sans Pro'\"). comma-separated list names w/ individual names quoted necessary. (e.g. c(\"Open Sans\", \"'Source Sans Pro'\", \"'Helvetica Neue', Helvetica, sans-serif\")) font_google() sets local = TRUE default, ensures font files downloaded Google Fonts document app rendered. guarantees client access font family, making relatively safe specify just one font family: said, recommend specify multiple \"fallback\" font families, especially relying remote /system fonts available. Fallback fonts useful handling missing fonts, also ensure users experience Flash Invisible Text (FOIT) can quite noticeable remote web fonts slow internet connection.","code":"bs_theme(base_font = font_google(\"Pacifico\", local = TRUE)) bs_theme(base_font = font_collection(font_google(\"Pacifico\", local = FALSE), \"Roboto\", \"sans-serif\"))"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create a Bootstrap theme — bs_theme","text":"Get Started: Theming introduces theming bslib Shiny apps R Markdown documents. Theming: Bootstrap 5 variables provides searchable reference theming variables available Bootstrap 5. Theming: Custom components gives tutorial creating dynamically themable custom component. bslib's theming capabilities powered sass package. Bootstrap's utility classes can helpful want change appearance element without writing CSS customizing bs_theme().","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_theme.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a Bootstrap theme — bs_theme","text":"","code":"if (FALSE) { # rlang::is_interactive() theme <- bs_theme( # Controls the default grayscale palette bg = \"#202123\", fg = \"#B8BCC2\", # Controls the accent (e.g., hyperlink, button, etc) colors primary = \"#EA80FC\", secondary = \"#48DAC6\", base_font = c(\"Grandstander\", \"sans-serif\"), code_font = c(\"Courier\", \"monospace\"), heading_font = \"'Helvetica Neue', Helvetica, sans-serif\", # Can also add lower-level customization \"input-border-color\" = \"#EA80FC\" ) bs_theme_preview(theme) # Lower-level bs_add_*() functions allow you to work more # directly with the underlying Sass code theme <- bs_add_variables(theme, \"my-class-color\" = \"red\") theme <- bs_add_rules(theme, \".my-class { color: $my-class-color }\") }"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":null,"dir":"Reference","previous_headings":"","what":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"bs_theme_dependencies() compiles Bootstrap Sass CSS returns , along HTML dependencies, list htmltools::htmlDependency()s. users need call function directly Shiny & R Markdown perform compilation automatically handed bs_theme(). looking create themeable component, see bs_dependency().","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"","code":"bs_theme_dependencies( theme, sass_options = sass::sass_options_get(output_style = \"compressed\"), cache = sass::sass_cache_get(), jquery = jquerylib::jquery_core(3), precompiled = get_precompiled_option(\"bslib.precompiled\", default = TRUE) )"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"theme bs_theme() object. sass_options sass::sass_options() object. cache can directory use cache, FileCache object created sass_file_cache(), FALSE NULL caching. jquery jquerylib::jquery_core() object. precompiled compiling theme object, first look precompiled CSS file theme_version(). precompiled = TRUE precompiled CSS file exists theme object, fetched immediately compiled. moment, provide precompiled CSS \"stock\" builds Bootstrap (.e., theming additions, Bootswatch themes, non-default sass_options).","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"Returns list HTML dependencies containing Bootstrap CSS, Bootstrap JavaScript, jquery. list may contain additional HTML dependencies bundled theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":"sass-caching-and-precompilation","dir":"Reference","previous_headings":"","what":"Sass caching and precompilation","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"Shiny Developer Mode enabled (setting options(shiny.devmode = TRUE) calling shiny::devmode(TRUE)), sass caching bslib precompilation disabled default; , call bs_theme_dependencies(theme) expands bs_theme_dependencies(theme, cache = F, precompiled = F)). useful local development enabling caching/precompilation may produce incorrect results local changes made bslib's source files.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_dependencies.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compile Bootstrap Sass with (optional) theming — bs_theme_dependencies","text":"","code":"if (FALSE) { # rlang::is_interactive() # Function to preview the styling a (primary) Bootstrap button library(htmltools) button <- tags$a(class = \"btn btn-primary\", href = \"#\", role = \"button\", \"Hello\") preview_button <- function(theme) { browsable(tags$body(bs_theme_dependencies(theme), button)) } # Latest Bootstrap preview_button(bs_theme()) # Bootstrap 3 preview_button(bs_theme(3)) # Bootswatch 4 minty theme preview_button(bs_theme(4, bootswatch = \"minty\")) # Bootswatch 4 sketchy theme preview_button(bs_theme(4, bootswatch = \"sketchy\")) }"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":null,"dir":"Reference","previous_headings":"","what":"Preview a Bootstrap theme — bs_theme_preview","title":"Preview a Bootstrap theme — bs_theme_preview","text":"Launches example shiny app can used get quick preview bs_theme(), well interactive GUI tweaking main theme settings. Calling bs_theme_preview() arguments starts theme preview app default theme, great way see available theme presets start creating theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Preview a Bootstrap theme — bs_theme_preview","text":"","code":"bs_theme_preview(theme = bs_theme(), ..., with_themer = TRUE)"},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Preview a Bootstrap theme — bs_theme_preview","text":"theme bs_theme() object. ... passed along shiny::runApp(). with_themer whether run app run_with_themer().","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Preview a Bootstrap theme — bs_theme_preview","text":"nothing, function called side-effects (launching application).","code":""},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Preview a Bootstrap theme — bs_theme_preview","text":"app launches subject change new features developed bslib shiny.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bs_theme_preview.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Preview a Bootstrap theme — bs_theme_preview","text":"","code":"if (FALSE) { # rlang::is_interactive() theme <- bs_theme(bg = \"#6c757d\", fg = \"white\", primary = \"orange\") bs_theme_preview(theme) }"},{"path":"https://rstudio.github.io/bslib/reference/bslib-package.html","id":null,"dir":"Reference","previous_headings":"","what":"bslib: Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown' — bslib-package","title":"bslib: Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown' — bslib-package","text":"Simplifies custom 'CSS' styling 'shiny' 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 5 well various 'Bootswatch' themes. interactive widget also provided previewing themes real time.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/bslib-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"bslib: Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown' — bslib-package","text":"Maintainer: Carson Sievert carson@posit.co (ORCID) Authors: Joe Cheng joe@posit.co Garrick Aden-Buie garrick@posit.co (ORCID) contributors: Posit Software, PBC [copyright holder, funder] Bootstrap contributors (Bootstrap library) [contributor] Twitter, Inc (Bootstrap library) [copyright holder] Javi Aguilar (Bootstrap colorpicker library) [contributor, copyright holder] Thomas Park (Bootswatch library) [contributor, copyright holder] PayPal (Bootstrap accessibility plugin) [contributor, copyright holder]","code":""},{"path":"https://rstudio.github.io/bslib/reference/builtin_themes.html","id":null,"dir":"Reference","previous_headings":"","what":"Obtain a list of all available built-in bslib themes. — builtin_themes","title":"Obtain a list of all available built-in bslib themes. — builtin_themes","text":"Obtain list available built-bslib themes.","code":""},{"path":"https://rstudio.github.io/bslib/reference/builtin_themes.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Obtain a list of all available built-in bslib themes. — builtin_themes","text":"","code":"builtin_themes(version = version_default(), full_path = FALSE)"},{"path":"https://rstudio.github.io/bslib/reference/builtin_themes.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Obtain a list of all available built-in bslib themes. — builtin_themes","text":"version major version Bootstrap. full_path whether return path installed theme.","code":""},{"path":"https://rstudio.github.io/bslib/reference/builtin_themes.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Obtain a list of all available built-in bslib themes. — builtin_themes","text":"Returns character vector built-themes provided bslib.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":null,"dir":"Reference","previous_headings":"","what":"A Bootstrap card component — card","title":"A Bootstrap card component — card","text":"general purpose container grouping related UI elements together border optional padding. learn card()s, see Cards article articles listed References section .","code":""},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A Bootstrap card component — card","text":"","code":"card( ..., full_screen = FALSE, height = NULL, max_height = NULL, min_height = NULL, fill = TRUE, class = NULL, wrapper = card_body, id = NULL )"},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"A Bootstrap card component — card","text":"... Unnamed arguments can valid child htmltools tag (includes card items card_body(). Named arguments become HTML attributes returned UI element. full_screen TRUE, icon appear hovering card body. Clicking icon expands card fit viewport size. height valid CSS unit (e.g., height=\"200px\"). apply card made full_screen (case, consider setting height card_body()). max_height, min_height valid CSS unit (e.g., max_height=\"200px\"). apply card made full_screen (case, consider setting max_height card_body()). fill Whether allow card grow/shrink fit fillable container opinionated height (e.g., page_fillable()). class Additional CSS classes returned UI element. wrapper function (returns UI element) call unnamed arguments ... already card item(s) (like card_header(), card_body(), etc.). Note non-card items grouped together one wrapper call (e.g. given card(\"\", \"b\", card_body(\"c\"), \"d\"), wrapper called twice, \"\" \"b\" \"d\"). id Provide unique identifier card() value_box() report full screen state Shiny. example, using id = \"my_card\", can observe card's full screen state input$my_card_full_screen.","code":""},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"A Bootstrap card component — card","text":"htmltools::div() tag.","code":""},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"A Bootstrap card component — card","text":"Several articles bslib website feature card component: Cards Get Started: Dashboards Get Started: Project Column-based layouts Filling layouts: Full-screen cards","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/card.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A Bootstrap card component — card","text":"","code":"if (FALSE) { # rlang::is_interactive() library(htmltools) card( full_screen = TRUE, card_header( \"This is the header\" ), card_body( p(\"This is the body.\"), p(\"This is still the body.\") ), card_footer( \"This is the footer\" ) ) }"},{"path":"https://rstudio.github.io/bslib/reference/card_body.html","id":null,"dir":"Reference","previous_headings":"","what":"Card items — card_body","title":"Card items — card_body","text":"Components designed provided direct children card(). general overview card() API, see Cards article articles listed References section card() documentation.","code":""},{"path":"https://rstudio.github.io/bslib/reference/card_body.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Card items — card_body","text":"","code":"card_body( ..., fillable = TRUE, min_height = NULL, max_height = NULL, max_height_full_screen = max_height, height = NULL, padding = NULL, gap = NULL, fill = TRUE, class = NULL ) card_title(..., container = htmltools::h5) card_header(..., class = NULL, container = htmltools::div) card_footer(..., class = NULL) card_image( file, ..., alt = \"\", src = NULL, href = NULL, border_radius = c(\"auto\", \"top\", \"bottom\", \"all\", \"none\"), mime_type = NULL, class = NULL, height = NULL, fill = FALSE, width = NULL, container = NULL ) as.card_item(x) is.card_item(x)"},{"path":"https://rstudio.github.io/bslib/reference/card_body.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Card items — card_body","text":"... Unnamed arguments can valid child htmltools tag. Named arguments become HTML attributes returned UI element. fillable Whether card item fillable (.e. flexbox) container. min_height, max_height, max_height_full_screen valid CSS length unit. height valid CSS unit (e.g., height=\"200px\"). apply card made full_screen (case, consider setting height card_body()). padding Padding use body. can numeric vector (interpreted pixels) character vector valid CSS lengths. length can one four. one, value used four sides. two, first value used top bottom, second value used left right. three, first used top, second left right, third bottom. four, values interpreted top, right, bottom, left respectively. gap CSS length unit defining gap (.e., spacing) elements provided .... argument applicable fillable = TRUE fill Whether allow element grow/shrink fit card() container. class Additional CSS classes returned UI element. container function generate HTML element contain image. Setting value card_body() places image inside card body area, otherwise image extend edges card. file file path pointing image. Local images (.e. URI starting https:// similar) base64 encoded provided src attribute . Alternatively, may directly set image src, case file ignored. alt Alternate text image, used screen readers assistive devices. Provide alt text description image images important content. alt text provided, image considered decorative read announced screen readers. information, Web Accessibility Initiative (WAI) helpful tutorial alt text. src src attribute tag. provided, file ignored entirely. Use src provide relative path file served Shiny application base64 encoded. href optional URL link user clicks image. border_radius side image rounded corners, useful card_image() used image cap top bottom card. value border_radius determines whether card-img-top (\"top\"), card-img-bottom (\"bottom\"), card-img (\"\") Bootstrap classes applied card. default \"auto\" value use image's position within card() automatically choose appropriate class. mime_type mime type file base64 encoded. argument available advanced use cases mime::guess_type() unable automatically determine file type. width valid CSS unit (e.g., width=\"100%\"). x object test (coerce ) card item.","code":""},{"path":"https://rstudio.github.io/bslib/reference/card_body.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Card items — card_body","text":"htmltools::div() tag.","code":""},{"path":"https://rstudio.github.io/bslib/reference/card_body.html","id":"functions","dir":"Reference","previous_headings":"","what":"Functions","title":"Card items — card_body","text":"card_body(): general container \"main content\" card(). card_title(): Similar card_header() without border background color. card_header(): header (border background color) card(). Typically appears card_body(). card_footer(): header (border background color) card(). Typically appears card_body(). card_image(): Include static images card, example image cap top bottom card. .card_item(): Mark object card item. prevent card() putting object inside wrapper (.e., card_body()).","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/deprecated.html","id":null,"dir":"Reference","previous_headings":"","what":"Deprecated functions — deprecated","title":"Deprecated functions — deprecated","text":"functions deprecated remain backwards compatibility.","code":""},{"path":"https://rstudio.github.io/bslib/reference/deprecated.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Deprecated functions — deprecated","text":"","code":"bs_theme_new(...) bs_theme_clear(...) bs_theme_get(...) bs_theme_set(...) bs_theme_base_colors(...) bs_theme_accent_colors(...) bs_theme_fonts(...) bs_theme_add_variables(...) bs_theme_add(...) bs_theme_get_variables(...) bootstrap(theme = bs_theme_get(), ...) bootstrap_sass(rules = list(), theme = bs_theme_get(), ...) bs_add_declarations(theme, declarations) card_body_fill(...) page_fill(...) nav(...) nav_content(...) navs_tab(...) navs_pill(...) navs_pill_list(...) navs_hidden(...) navs_bar(...) navs_tab_card(...) navs_pill_card(...)"},{"path":"https://rstudio.github.io/bslib/reference/deprecated.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Deprecated functions — deprecated","text":"bs_theme() object.","code":""},{"path":"https://rstudio.github.io/bslib/reference/deprecated.html","id":"navigation-containers","dir":"Reference","previous_headings":"","what":"Navigation Containers","title":"Deprecated functions — deprecated","text":"Several functions navigation containers renamed version 0.5.0: nav() renamed nav_panel() nav_content() renamed nav_panel_hidden() navs_tab() renamed navset_tab() navs_pill() renamed navset_pill() navs_pill_list() renamed navset_pill_list() navs_hidden() renamed navset_hidden() navs_bar() renamed navset_bar() navs_tab_card() renamed navset_card_tab() navs_pill_card() renamed navset_card_pill()","code":""},{"path":"https://rstudio.github.io/bslib/reference/font_face.html","id":null,"dir":"Reference","previous_headings":"","what":"Helpers for importing web fonts — font_face","title":"Helpers for importing web fonts — font_face","text":"font_google(), font_link(), font_face() re-exported sass package (see sass::font_face() details). quick example use functions bs_theme(), see examples section .","code":""},{"path":"https://rstudio.github.io/bslib/reference/font_face.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Helpers for importing web fonts — font_face","text":"","code":"# If you have an internet connection, running the following code # will download, cache, and import the relevant Google Font files # for local use theme <- bs_theme( base_font = font_google(\"Fira Sans\"), code_font = font_google(\"Fira Code\"), heading_font = font_google(\"Fredoka One\") ) if (interactive()) { bs_theme_preview(theme) } # Three different yet equivalent ways of importing a remotely-hosted Google Font a <- font_google(\"Crimson Pro\", wght = \"200..900\", local = FALSE) b <- font_link( \"Crimson Pro\", href = \"https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@200..900\" ) url <- \"https://fonts.gstatic.com/s/crimsonpro/v13/q5uDsoa5M_tv7IihmnkabARboYF6CsKj.woff2\" c <- font_face( family = \"Crimson Pro\", style = \"normal\", weight = \"200 900\", src = paste0(\"url(\", url, \") format('woff2')\") ) theme <- bs_theme(base_font = c) if (interactive()) { bs_theme_preview(theme) }"},{"path":"https://rstudio.github.io/bslib/reference/html-browse.html","id":null,"dir":"Reference","previous_headings":"","what":"Print a bslib page/fragment — print.bslib_fragment","title":"Print a bslib page/fragment — print.bslib_fragment","text":"Print bslib page/fragment","code":""},{"path":"https://rstudio.github.io/bslib/reference/html-browse.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Print a bslib page/fragment — print.bslib_fragment","text":"","code":"# S3 method for class 'bslib_fragment' print(x, ...) # S3 method for class 'bslib_page' print(x, ...)"},{"path":"https://rstudio.github.io/bslib/reference/html-browse.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Print a bslib page/fragment — print.bslib_fragment","text":"x bslib page/fragment. ... passed along underlying print method.","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_dark_mode.html","id":null,"dir":"Reference","previous_headings":"","what":"Dark mode input control — input_dark_mode","title":"Dark mode input control — input_dark_mode","text":"Creates button toggles dark light modes, specifically toggling light dark Bootstrap color modes – new feature added Bootstrap 5.3.","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_dark_mode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Dark mode input control — input_dark_mode","text":"","code":"input_dark_mode(..., id = NULL, mode = NULL) toggle_dark_mode(mode = NULL, ..., session = get_current_session())"},{"path":"https://rstudio.github.io/bslib/reference/input_dark_mode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Dark mode input control — input_dark_mode","text":"... Additional attributes passed input control UI, class, style, etc. toggle_dark_mode(), ... included future extensibility currently ignored. id optional input id, required reactively read current color mode. mode initial mode dark mode switch. default set NULL, user's system settings preferred color scheme used. Otherwise, set \"light\" \"dark\" force particular initial mode. session Shiny session object (default almost always used).","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_dark_mode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Dark mode input control — input_dark_mode","text":"Returns UI element dark mode switch input control. server value received input corresponding id string value current color mode (\"light\" \"dark\").","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_dark_mode.html","id":"functions","dir":"Reference","previous_headings":"","what":"Functions","title":"Dark mode input control — input_dark_mode","text":"input_dark_mode(): Create dark mode switch input control toggle_dark_mode(): Programmatically toggle set current light dark color mode.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/input_switch.html","id":null,"dir":"Reference","previous_headings":"","what":"Switch input control — input_switch","title":"Switch input control — input_switch","text":"Create -style switch control specifying logical values.","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_switch.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Switch input control — input_switch","text":"","code":"input_switch(id, label, value = FALSE, width = NULL) update_switch(id, label = NULL, value = NULL, session = get_current_session()) toggle_switch(id, value = NULL, session = get_current_session())"},{"path":"https://rstudio.github.io/bslib/reference/input_switch.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Switch input control — input_switch","text":"id input id. label label switch. value Whether switch checked default. width valid CSS unit (e.g., width=\"200px\"). session shiny session object (default almost always used).","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_switch.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Switch input control — input_switch","text":"Returns UI element switch input control. server value received input corresponding id logical (TRUE/FALSE) value.","code":""},{"path":[]},{"path":"https://rstudio.github.io/bslib/reference/input_switch.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Switch input control — input_switch","text":"","code":"if (FALSE) { # rlang::is_interactive() library(shiny) library(bslib) ui <- page_fixed( title = \"Keyboard Settings\", h2(\"Keyboard Settings\"), input_switch(\"auto_capitalization\", \"Auto-Capitalization\", TRUE), input_switch(\"auto_correction\", \"Auto-Correction\", TRUE), input_switch(\"check_spelling\", \"Check Spelling\", TRUE), input_switch(\"smart_punctuation\", \"Smart Punctuation\"), h2(\"Preview\"), verbatimTextOutput(\"preview\") ) server <- function(input, output, session) { output$preview <- renderPrint({ list( auto_capitalization = input$auto_capitalization, auto_correction = input$auto_correction, check_spelling = input$check_spelling, smart_punctuation = input$smart_punctuation ) }) } shinyApp(ui, server) }"},{"path":"https://rstudio.github.io/bslib/reference/input_task_button.html","id":null,"dir":"Reference","previous_headings":"","what":"Button for launching longer-running operations — input_task_button","title":"Button for launching longer-running operations — input_task_button","text":"input_task_button button can used conjuction shiny::bindEvent() (older shiny::eventReactive() shiny::observeEvent() functions) trigger actions recomputation. similar shiny::actionButton(), except prevents user clicking operation already progress. Upon click, automatically displays customizable progress message disables ; server dealt whatever reactivity triggered click, button automatically reverts original appearance re-enables .","code":""},{"path":"https://rstudio.github.io/bslib/reference/input_task_button.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Button for launching longer-running operations — input_task_button","text":"","code":"input_task_button( id, label, ..., icon = NULL, label_busy = \"Processing...\", icon_busy = rlang::missing_arg(), type = \"primary\", auto_reset = TRUE ) update_task_button(id, ..., state = NULL, session = get_current_session())"},{"path":"https://rstudio.github.io/bslib/reference/input_task_button.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Button for launching longer-running operations — input_task_button","text":"id input slot used access value. label label button ready (clickable) state; usually string. ... Named arguments become attributes include