#' @title Turbo CSS/JS dependencies
#'
#' @description Generates the Turbo JS dependencies with specific configurations
#' applied. Include this in any page to enable Turbo functionality in it.
#'
#' @param root (str) path of the turbo root
#' @param libs (str) path of the libraries
#' @param force_reload (flg) whether this page will force a reload
#' @param progress_bar (flg) whether progress bar is visible
#' @param pb_height (css) height of progress bar (top)
#' @param pb_delay (int) milliseconds of delay before progress bar appears
#' @param pb_color (css) color fo the progress bar
#' @param cache_control (str) whether to avoid previewing or caching the page
#' @param turbo_opt_in (flg) if TRUE, then turbo is disabled across the page
#' @param turbo_socket (flg) add the turbo web socket
#' @param app_version (str) a string indicating the version, or NA to
#' disable; used to force reload when assets change
#'
#' @family Turbo
#' @export
turbo_assets <- function(root = NULL,
libs = "assets",
force_reload = FALSE,
progress_bar = TRUE,
pb_height = "5px",
pb_color = "#008080",
pb_delay = 500,
cache_control = c("no-preview", "no-cache"),
turbo_opt_in = FALSE,
turbo_socket = TRUE,
app_version = NA_character_) {
assert_string(app_version, na.ok = TRUE)
assert_string(root, null.ok = TRUE)
assert_string(libs, null.ok = TRUE)
assert_flag(force_reload)
assert_flag(progress_bar)
assert_flag(turbo_socket)
cache_control <- match_arg(cache_control)
tagList(
html_dependency(
name = "turbo",
version = "7.0.0",
src = "turbo",
script = list(src = "dist/turbo.es2017-esm.js", type = "module"),
package = pkg_name,
meta = list() %>%
when(!is.null(root),
append(., list(`turbo-root` = root))) %>%
when(force_reload,
append(., list(`turbo-visit-control` = "reload"))) %>%
when(!is.null(cache_control),
append(., list(`turbo-cache-control` = cache_control)))
),
if (progress_bar) {
html_tags(head(style(HTML(paste(
".turbo-progress-bar {",
css(
height = validateCssUnit(pb_height),
background_color = parseCssColors(pb_color)
),
"}",
collapse = "/"
)))))
} else {
html_tags(head(style(HTML(
".turbo-progress-bar { visibility: hidden; }"
))))
},
if (turbo_socket) {
tagList(
html_dependency(
name = "turbo-webtools",
version = pkg_vers(),
src = "turbo-webtools",
script = list(src = "socket.js", type = "module"),
package = pkg_name
),
html_script(
type = "module",
file = pkg_inst("turbo-webtools/main.js"),
libs = libs %||% "",
version = pkg_vers(),
singleton = TRUE,
head = TRUE
)
)
},
html_script(
text = "
if (typeof(Turbo) == 'undefined') {
document.addEventListener('DOMContentLoaded', function() {
Turbo.session.drive = {{turbo_opt_in}};
});
} else {
Turbo.session.drive = {{turbo_opt_in}};
}
",
turbo_opt_in = if (turbo_opt_in) "false" else "true",
singleton = TRUE
),
html_script(
text = "
if (typeof(Turbo) == 'undefined') {
document.addEventListener('DOMContentLoaded', function() {
Turbo.setProgressBarDelay({{pb_delay}});
});
} else {
Turbo.setProgressBarDelay({{pb_delay}});
}
",
pb_delay = pb_delay,
singleton = TRUE
),
if (!is.na(app_version)) {
html_dependency(
name = "turbo-app-version",
version = app_version,
src = "turbo-app-version",
script = list(src = "version.js", `data-turbo-track` = "reload"),
package = pkg_name,
all_files = FALSE
)
}
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.