379 lines
7.7 KiB
Markdown
379 lines
7.7 KiB
Markdown
# Using brand.yml with Shiny for R
|
|
|
|
Guide for applying brand.yml styling to Shiny applications using the bslib package.
|
|
|
|
## Overview
|
|
|
|
The bslib package integrates brand.yml to provide unified visual theming across Shiny applications. Define colors, fonts, and logos once in `_brand.yml`, and bslib automatically applies them to your Shiny app UI.
|
|
|
|
## Installation
|
|
|
|
```r
|
|
# Install bslib (includes brand.yml support)
|
|
install.packages("bslib")
|
|
|
|
# Optional: Install brand.yml package for theming plots/tables
|
|
install.packages("brand.yml")
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
### Automatic Discovery
|
|
|
|
Place `_brand.yml` at your app directory root:
|
|
|
|
```
|
|
my-app/
|
|
├── _brand.yml
|
|
├── app.R
|
|
└── ...
|
|
```
|
|
|
|
Then use `bs_theme()` in your app:
|
|
|
|
```r
|
|
library(shiny)
|
|
library(bslib)
|
|
|
|
ui <- page_fluid(
|
|
theme = bs_theme(), # Automatically finds _brand.yml
|
|
titlePanel("My App"),
|
|
# ... rest of UI
|
|
)
|
|
|
|
server <- function(input, output, session) {
|
|
# ...
|
|
}
|
|
|
|
shinyApp(ui, server)
|
|
```
|
|
|
|
### Search Paths
|
|
|
|
bslib automatically searches for `_brand.yml` in this order:
|
|
|
|
1. Current app directory
|
|
2. `_brand/` subdirectory
|
|
3. `brand/` subdirectory
|
|
4. Parent directories (recursive)
|
|
|
|
## bs_theme() Brand Parameter
|
|
|
|
The `brand` parameter controls how branding is applied:
|
|
|
|
### Automatic (Default)
|
|
|
|
```r
|
|
theme = bs_theme()
|
|
```
|
|
|
|
Searches for `_brand.yml` and applies it if found. No error if file doesn't exist.
|
|
|
|
### Required Brand
|
|
|
|
```r
|
|
theme = bs_theme(brand = TRUE)
|
|
```
|
|
|
|
Requires `_brand.yml` to exist. Throws error if not found.
|
|
|
|
### Explicit Path
|
|
|
|
```r
|
|
theme = bs_theme(brand = "path/to/my-brand.yml")
|
|
```
|
|
|
|
Uses specific brand file. Path can be:
|
|
- Relative to app directory: `"branding/company-brand.yml"`
|
|
- Absolute: `"/Users/name/brands/company.yml"`
|
|
- Directory (auto-finds `_brand.yml`): `"branding/"`
|
|
|
|
### Inline Brand Definition
|
|
|
|
```r
|
|
theme = bs_theme(
|
|
brand = list(
|
|
color = list(
|
|
palette = list(
|
|
blue = "#0066cc",
|
|
gray = "#666666"
|
|
),
|
|
primary = "blue",
|
|
foreground = "gray"
|
|
),
|
|
typography = list(
|
|
fonts = list(
|
|
list(family = "Inter", source = "google", weight = c(400, 600))
|
|
),
|
|
base = "Inter"
|
|
)
|
|
)
|
|
)
|
|
```
|
|
|
|
### Disable Branding
|
|
|
|
```r
|
|
theme = bs_theme(brand = FALSE)
|
|
```
|
|
|
|
Ignores `_brand.yml` even if it exists.
|
|
|
|
## Using with page_*() Functions
|
|
|
|
All bslib page functions support automatic brand discovery:
|
|
|
|
```r
|
|
# page_fluid
|
|
ui <- page_fluid(
|
|
theme = bs_theme(),
|
|
# ... content
|
|
)
|
|
|
|
# page_sidebar
|
|
ui <- page_sidebar(
|
|
theme = bs_theme(),
|
|
sidebar = sidebar(
|
|
# ... sidebar content
|
|
),
|
|
# ... main content
|
|
)
|
|
|
|
# page_navbar
|
|
ui <- page_navbar(
|
|
theme = bs_theme(),
|
|
nav_panel("Tab 1", # ...),
|
|
nav_panel("Tab 2", # ...)
|
|
)
|
|
|
|
# page_fillable
|
|
ui <- page_fillable(
|
|
theme = bs_theme(),
|
|
# ... content
|
|
)
|
|
```
|
|
|
|
## Branded Plots and Tables in Shiny
|
|
|
|
Use theming functions from the brand.yml package to style plots and tables within Shiny apps. See `brand-yml-in-r.md` for complete documentation of theming functions.
|
|
|
|
### Basic Example
|
|
|
|
```r
|
|
library(shiny)
|
|
library(bslib)
|
|
library(ggplot2)
|
|
library(gt)
|
|
library(brand.yml)
|
|
|
|
ui <- page_sidebar(
|
|
theme = bs_theme(brand = TRUE),
|
|
|
|
sidebar = sidebar(
|
|
selectInput("dataset", "Dataset:", c("mtcars", "iris"))
|
|
),
|
|
|
|
card(
|
|
card_header("Branded Plot"),
|
|
plotOutput("plot")
|
|
),
|
|
card(
|
|
card_header("Branded Table"),
|
|
gt_output("table")
|
|
)
|
|
)
|
|
|
|
server <- function(input, output, session) {
|
|
output$plot <- renderPlot({
|
|
ggplot(mtcars, aes(mpg, hp)) +
|
|
geom_point() +
|
|
theme_brand_ggplot2()
|
|
})
|
|
|
|
output$table <- render_gt({
|
|
head(mtcars) |>
|
|
gt() |>
|
|
theme_brand_gt()
|
|
})
|
|
}
|
|
|
|
shinyApp(ui, server)
|
|
```
|
|
|
|
**Benefits:**
|
|
- Consistent styling across UI, plots, and tables
|
|
- Automatic brand detection from `_brand.yml`
|
|
- Works with ggplot2, gt, flextable, plotly, and base R graphics
|
|
|
|
For detailed theming function documentation, see `brand-yml-in-r.md`.
|
|
|
|
## Complete Shiny Example
|
|
|
|
```r
|
|
library(shiny)
|
|
library(bslib)
|
|
|
|
ui <- page_sidebar(
|
|
theme = bs_theme(brand = TRUE), # Require _brand.yml
|
|
|
|
sidebar = sidebar(
|
|
title = "Controls",
|
|
selectInput("dataset", "Dataset:",
|
|
choices = c("iris", "mtcars")),
|
|
numericInput("n", "Number of rows:", 10, min = 1, max = 50)
|
|
),
|
|
|
|
card(
|
|
card_header("Data Summary"),
|
|
tableOutput("summary")
|
|
),
|
|
|
|
card(
|
|
card_header("Data Details"),
|
|
verbatimTextOutput("details")
|
|
)
|
|
)
|
|
|
|
server <- function(input, output, session) {
|
|
dataset <- reactive({
|
|
get(input$dataset)
|
|
})
|
|
|
|
output$summary <- renderTable({
|
|
head(dataset(), input$n)
|
|
})
|
|
|
|
output$details <- renderPrint({
|
|
summary(dataset())
|
|
})
|
|
}
|
|
|
|
shinyApp(ui, server)
|
|
```
|
|
|
|
With `_brand.yml`:
|
|
|
|
```yaml
|
|
color:
|
|
palette:
|
|
brand-blue: "#0066cc"
|
|
brand-gray: "#666666"
|
|
primary: brand-blue
|
|
foreground: brand-gray
|
|
background: "#ffffff"
|
|
|
|
typography:
|
|
fonts:
|
|
- family: Inter
|
|
source: google
|
|
weight: [400, 600]
|
|
base:
|
|
family: Inter
|
|
size: 16px
|
|
headings:
|
|
family: Inter
|
|
weight: 600
|
|
```
|
|
|
|
## R Markdown Shiny Documents
|
|
|
|
Use brand.yml in R Markdown documents with Shiny runtime:
|
|
|
|
```yaml
|
|
---
|
|
title: "Interactive Dashboard"
|
|
output:
|
|
html_document:
|
|
theme:
|
|
version: 5 # Required for brand.yml
|
|
brand: true # Auto-discover _brand.yml
|
|
runtime: shiny
|
|
---
|
|
```
|
|
|
|
Or specify a path:
|
|
|
|
```yaml
|
|
---
|
|
title: "Interactive Dashboard"
|
|
output:
|
|
html_document:
|
|
theme:
|
|
version: 5
|
|
brand: "path/to/brand.yml"
|
|
runtime: shiny
|
|
---
|
|
```
|
|
|
|
**Important**: Set `version: 5` to use Bootstrap 5, which has the best brand.yml support.
|
|
|
|
**Note**: For R Markdown documents without `runtime: shiny`, see `brand-yml-in-r.md`.
|
|
|
|
## Programmatic Brand Access
|
|
|
|
For advanced use cases, access brand data programmatically within Shiny:
|
|
|
|
```r
|
|
library(brand.yml)
|
|
|
|
server <- function(input, output, session) {
|
|
# Read brand data
|
|
brand <- read_brand_yml()
|
|
|
|
# Use in custom UI elements
|
|
output$brand_info <- renderUI({
|
|
div(
|
|
style = paste0("color: ", brand$color$primary, ";"),
|
|
h3(brand$meta$name),
|
|
p("Welcome to our branded app!")
|
|
)
|
|
})
|
|
|
|
# Use in plots with custom styling
|
|
output$custom_plot <- renderPlot({
|
|
plot(mtcars$mpg, mtcars$hp,
|
|
col = brand$color$primary,
|
|
pch = 19)
|
|
})
|
|
}
|
|
```
|
|
|
|
For complete documentation on programmatic access and theming functions, see `brand-yml-in-r.md`.
|
|
|
|
## Tips
|
|
|
|
- **Start simple**: Begin with colors and one font family
|
|
- **Test automatically**: Automatic discovery works well for most cases
|
|
- **Use explicit paths**: For shared brand files across multiple apps
|
|
- **Version control**: Include `_brand.yml` in your git repository
|
|
- **Validate early**: Use `brand = TRUE` during development to catch missing files
|
|
- **Combine with theming functions**: Style plots and tables consistently (see `brand-yml-in-r.md`)
|
|
|
|
## Troubleshooting
|
|
|
|
**Brand not applying to Shiny UI?**
|
|
- Check file is named `_brand.yml` (with underscore)
|
|
- Verify file is in app directory or parent directories
|
|
- Try explicit path: `bs_theme(brand = "path/to/_brand.yml")`
|
|
- Check for YAML syntax errors
|
|
|
|
**Colors not matching?**
|
|
- Verify hex colors have quotes: `"#0066cc"`
|
|
- Check color names match palette definitions
|
|
- Ensure primary/secondary colors reference valid palette names
|
|
|
|
**Fonts not loading?**
|
|
- Verify Google Fonts spelling and availability
|
|
- Check `source: google` is specified correctly
|
|
- Ensure font family names match exactly in typography elements
|
|
|
|
**Plots/tables not branded?**
|
|
- Ensure brand.yml package is installed: `install.packages("brand.yml")`
|
|
- Use theming functions: `theme_brand_ggplot2()`, `theme_brand_gt()`, etc.
|
|
- See `brand-yml-in-r.md` for complete theming documentation
|
|
|
|
## Related Documentation
|
|
|
|
- **[brand-yml-in-r.md](brand-yml-in-r.md)**: General R usage, R Markdown integration, theming functions, and programmatic access
|
|
- **[brand-yml-spec.md](brand-yml-spec.md)**: Complete brand.yml file specification
|