Files
gh-posit-dev-skills-quarto/skills/brand-yml/references/shiny-r.md
2025-11-30 08:48:10 +08:00

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