这是一种使用小
custom message handler
:它获取Bootstrap变量的当前值
--bs-body-bg
并将其发送给Shiny:
library(shiny)
library(bslib)
ui <- page_navbar(
tags$head(
tags$script("
Shiny.addCustomMessageHandler('get_bg', function(value) {
var bg = getComputedStyle(document.body).getPropertyValue('--bs-body-bg');
Shiny.setInputValue('current_bg', {bg});
});
")
),
title = "Dark Mode Demo",
theme = bs_theme(version=5),
nav_panel(
title = "Base Graphics",
card(
card_header("Mosaic"),
plotOutput("base_mosaic")
)
),
nav_spacer(),
nav_item(
input_dark_mode(id = "theme_toggle", mode = "light")
)
)
server <- function(input, output, session) {
# dark / light mode
observeEvent(input$theme_toggle, {
toggle_dark_mode(mode=input$theme_toggle)
session$sendCustomMessage("get_bg", "")
req(input$current_bg)
message("bg=", input$current_bg)
})
output$base_mosaic <- renderPlot({
par(bg = input$current_bg)
plot(1:10)
})
}
shinyApp(ui, server)