Parcourir la source

grkstyle

tags/v0.3.0
Garrick Aden-Buie il y a 6 ans
Parent
révision
dac3f90311
13 fichiers modifiés avec 801 ajouts et 412 suppressions
  1. +125
    -54
      R/ggplot2.R
  2. +39
    -18
      R/style_extra_css.R
  3. +11
    -14
      R/style_xaringan.R
  4. +544
    -268
      R/theme_settings.R
  5. +52
    -25
      R/utils.R
  6. +5
    -3
      inst/scripts/generate_theme_functions.R
  7. +11
    -14
      inst/scripts/style_xaringan_body.R
  8. +4
    -5
      man/style_extra_css.Rd
  9. +0
    -1
      man/theme_xaringan.Rd
  10. +1
    -2
      man/theme_xaringan_base.Rd
  11. +0
    -1
      man/theme_xaringan_inverse.Rd
  12. +9
    -6
      tests/testthat/test-list2css.R
  13. +0
    -1
      tests/testthat/test-write_extra_css.R

+ 125
- 54
R/ggplot2.R Voir le fichier

@@ -29,7 +29,6 @@
#' geom_point() +
#' theme_xaringan()
#' }
#'
#' @return A ggplot2 theme
#' @family xaringanthemer ggplot2 themes
#' @export
@@ -48,10 +47,13 @@ theme_xaringan <- function(
accent_color <- accent_color %||% xaringanthemer_env$header_color
accent_secondary_color <- accent_secondary_color %||% xaringanthemer_env$text_bold_color %||% accent_color

theme_xaringan_base(text_color, background_color,
accent_color = accent_color,
accent_secondary_color = accent_secondary_color,
...)
theme_xaringan_base(
text_color,
background_color,
accent_color = accent_color,
accent_secondary_color = accent_secondary_color,
...
)
}

#' An Inverse Plot Theme for ggplot2 by xaringanthemer
@@ -83,7 +85,6 @@ theme_xaringan <- function(
#' geom_point() +
#' theme_xaringan()
#' }
#'
#' @return A ggplot2 theme
#' @family xaringanthemer ggplot2 themes
#' @export
@@ -102,10 +103,13 @@ theme_xaringan_inverse <- function(
accent_color <- accent_color %||% xaringanthemer_env$inverse_header_color
accent_secondary_color <- accent_secondary_color %||% accent_color

theme_xaringan_base(text_color, background_color,
accent_color = accent_color,
accent_secondary_color = accent_secondary_color,
...)
theme_xaringan_base(
text_color,
background_color,
accent_color = accent_color,
accent_secondary_color = accent_secondary_color,
...
)
}

#' The ggplot2 xaringanthemer base plot theme
@@ -168,7 +172,7 @@ theme_xaringan_inverse <- function(
#' caption = "{xaringanthemer}"
#' )
#'
#' ggplot(iris) +
#' ggplot(iris) +
#' aes(Petal.Length, Petal.Width) +
#' geom_point() +
#' theme_xaringan_base(
@@ -183,7 +187,6 @@ theme_xaringan_inverse <- function(
#' caption = "{xaringanthemer}"
#' )
#' }
#'
#' @return A ggplot2 theme
#' @family xaringanthemer ggplot2 themes
#' @export
@@ -208,10 +211,14 @@ theme_xaringan_base <- function(

text_font <- if (!is.null(text_font)) {
register_font(text_font, identical(text_font_use_google, TRUE))
} else get_theme_font("text")
} else {
get_theme_font("text")
}
title_font <- if (!is.null(title_font)) {
register_font(title_font, identical(title_font_use_google, TRUE))
} else get_theme_font("header")
} else {
get_theme_font("header")
}

text_font %||% "sans"
title_font %||% "sans"
@@ -226,32 +233,39 @@ theme_xaringan_base <- function(
line = ggplot2::element_line(color = blend(0.2)),
rect = ggplot2::element_rect(fill = background_color),
text = ggplot2::element_text(
color = blend(0.1),
color = blend(0.1),
family = text_font,
size = text_font_size),
size = text_font_size
),
title = ggplot2::element_text(
color = accent_color,
color = accent_color,
family = title_font,
size = title_font_size),
plot.background = ggplot2::element_rect(
fill = background_color,
color = background_color),
size = title_font_size
),
plot.background = ggplot2::element_rect(
fill = background_color,
color = background_color
),
panel.background = ggplot2::element_rect(
fill = background_color,
color = background_color),
fill = background_color,
color = background_color
),
panel.grid.major = ggplot2::element_line(
color = blend(0.8),
inherit.blank = TRUE),
inherit.blank = TRUE
),
panel.grid.minor = ggplot2::element_line(
color = blend(0.9),
inherit.blank = TRUE),
inherit.blank = TRUE
),
axis.title = ggplot2::element_text(size = title_font_size * 0.8),
axis.ticks = ggplot2::element_line(color = blend(0.8)),
axis.text = ggplot2::element_text(color = blend(0.4)),
legend.key = element_rect(fill="transparent", colour=NA),
axis.text = ggplot2::element_text(color = blend(0.4)),
legend.key = element_rect(fill = "transparent", colour = NA),
plot.caption = ggplot2::element_text(
size = text_font_size * 0.8,
color = blend(0.3))
size = text_font_size * 0.8,
color = blend(0.3)
)
)
}

@@ -346,7 +360,9 @@ xaringan_theme_restore_defaults <- function() {
requires_package("ggplot2")
requires_xaringanthemer_env()

if (is.null(xaringanthemer_env$old_ggplot_defaults)) return(invisible())
if (is.null(xaringanthemer_env$old_ggplot_defaults)) {
return(invisible())
}


old_default <- xaringanthemer_env$old_ggplot_defaults
@@ -365,11 +381,13 @@ xaringan_theme_restore_defaults <- function() {
}

safely_set_geom <- function(geom, new) {
tryCatch({
ggplot2::update_geom_defaults(geom, new)
},
error = function(e) invisible(),
warning = function(w) invisible())
tryCatch(
{
ggplot2::update_geom_defaults(geom, new)
},
error = function(e) invisible(),
warning = function(w) invisible()
)
}


@@ -420,7 +438,9 @@ scale_xaringan_discrete <- function(
pal <- function(n) {
colors <- colorspace::sequential_hcl(
n = n,
c1 = color[1, "C"], l1 = color[1, "L"], h1 = color[1, "H"],
c1 = color[1, "C"],
l1 = color[1, "L"],
h1 = color[1, "H"],
rev = direction >= 1
)
}
@@ -431,20 +451,34 @@ scale_xaringan_discrete <- function(
#' @rdname scale_xaringan
#' @export
scale_xaringan_fill_discrete <- function(
..., color = NULL, direction = 1, inverse = FALSE
...,
color = NULL,
direction = 1,
inverse = FALSE
) {
scale_xaringan_discrete(
"fill", ..., color = color, direction = direction, inverse = inverse
"fill",
...,
color = color,
direction = direction,
inverse = inverse
)
}

#' @rdname scale_xaringan
#' @export
scale_xaringan_color_discrete <- function(
..., color = NULL, direction = 1, inverse = FALSE
...,
color = NULL,
direction = 1,
inverse = FALSE
) {
scale_xaringan_discrete(
"color", ..., color = color, direction = direction, inverse = inverse
"color",
...,
color = color,
direction = direction,
inverse = inverse
)
}

@@ -456,13 +490,20 @@ scale_xaringan_colour_discrete <- scale_xaringan_color_discrete
#' @export
scale_xaringan_continuous <- function(
aes_type = c("color", "colour", "fill"),
..., color = NULL, begin = 0, end = 1, inverse = FALSE
...,
color = NULL,
begin = 0,
end = 1,
inverse = FALSE
) {
aes_type <- match.arg(aes_type)
color <- hex2HCL(get_theme_accent_color(color, inverse))

colors <- colorspace::sequential_hcl(
n = 12, c1 = color[1, "C"], l1 = color[1, "L"], h1 = color[1, "H"],
n = 12,
c1 = color[1, "C"],
l1 = color[1, "L"],
h1 = color[1, "H"],
rev = TRUE
)

@@ -471,7 +512,8 @@ scale_xaringan_continuous <- function(
}

ggplot2::continuous_scale(
aes_type, "continuous_sequential",
aes_type,
"continuous_sequential",
palette = scales::gradient_n_pal(colors, values = NULL),
rescaler = rescaler,
oob = scales::censor,
@@ -482,20 +524,38 @@ scale_xaringan_continuous <- function(
#' @rdname scale_xaringan
#' @export
scale_xaringan_fill_continuous <- function(
..., color = NULL, begin = 0, end = 1, inverse = FALSE
...,
color = NULL,
begin = 0,
end = 1,
inverse = FALSE
) {
scale_xaringan_continuous(
"fill", ..., color = color, begin = begin, end = end, inverse = inverse
"fill",
...,
color = color,
begin = begin,
end = end,
inverse = inverse
)
}

#' @rdname scale_xaringan
#' @export
scale_xaringan_color_continuous <- function(
..., color = NULL, begin = 0, end = 1, inverse = FALSE
...,
color = NULL,
begin = 0,
end = 1,
inverse = FALSE
) {
scale_xaringan_continuous(
"color", ..., color = color, begin = begin, end = end, inverse = inverse
"color",
...,
color = color,
begin = begin,
end = end,
inverse = inverse
)
}

@@ -545,7 +605,7 @@ get_theme_font <- function(element = c("text", "header", "code")) {

element_family <- paste0(element, "_font_family")
element_google <- paste0(element, "_font_google")
element_url <- paste0(element, "_font_url")
element_url <- paste0(element, "_font_url")

family <- xaringanthemer_env[[element_family]]
is_google_font <- !is.null(xaringanthemer_env[[element_google]]) ||
@@ -560,13 +620,17 @@ register_font <- function(
fn = sys.calls()[[max(1, length(sys.calls()) - 1)]][[1]],
...
) {
if (is.null(family)) return(NULL)
if (is.null(family)) {
return(NULL)
}
family <- gsub("['\"]", "", family)

if (!identical(xaringanthemer_env$showtext_auto, TRUE)) {
if (requires_package(pkg = "showtext", fn, required = FALSE)) {
showtext::showtext_auto()
} else return(family)
} else {
return(family)
}
xaringanthemer_env$showtext_auto <- TRUE
}

@@ -574,7 +638,9 @@ register_font <- function(
return(family)
} else if (!family %in% sysfonts::font_families()) {
is_default_font <- family %in% c(
"Roboto", "Source Code Pro", "Yanone Kaffeesatz"
"Roboto",
"Source Code Pro",
"Yanone Kaffeesatz"
)
if (identical(google, TRUE) || is_default_font) {
tryCatch(
@@ -585,7 +651,8 @@ register_font <- function(
} else {
warning(paste(
"Please manually register fonts not served by Google Fonts.",
"See `sysfonts::font_add()` for more information."))
"See `sysfonts::font_add()` for more information."
))
}
}
family
@@ -595,7 +662,9 @@ requires_package <- function(pkg = "ggplot2", fn = "", required = TRUE) {
raise <- if (required) stop else warning
if (!requireNamespace(pkg, quietly = TRUE)) {
msg <- paste0(
"`", pkg, "` is ",
"`",
pkg,
"` is ",
if (required) "required " else "suggested ",
if (fn != "") paste0("by ", fn, "() ")[1],
"but is not installed."
@@ -693,7 +762,9 @@ theme_xaringan_get_value <- function(setting) {
}

web_to_point <- function(x, px_per_em = 16, scale = 1) {
if (is.null(x)) return(NULL)
if (is.null(x)) {
return(NULL)
}
if (grepl("pt$", x)) {
return(as.numeric(sub("pt$", "", x)))
} else if (grepl("px$", x)) {

+ 39
- 18
R/style_extra_css.R Voir le fichier

@@ -16,22 +16,26 @@
#' @examples
#' style_extra_css(
#' outfile = stdout(),
#' css = list(
#' ".red" = list(color = "red"),
#' css = list(
#' ".red" = list(color = "red"),
#' ".small" = list("font-size" = "90%"),
#' ".full-width" = list(
#' display = "flex",
#' width = "100%",
#' flex = "1 1 auto"
#' width = "100%",
#' flex = "1 1 auto"
#' )
#' )
#' )
#'
#' @inheritParams style_xaringan
#' @export
style_extra_css <- function(css, outfile = "xaringan-themer.css") {
cat("\n\n/* Extra CSS */", list2css(css), file = outfile,
append = TRUE, sep = "\n")
cat(
"\n\n/* Extra CSS */",
list2css(css),
file = outfile,
append = TRUE,
sep = "\n"
)
}

#' @inheritParams style_extra_css
@@ -43,18 +47,32 @@ list2css <- function(css) {
stop("All elements in `css` list must be named", call. = FALSE)
}
if (purrr::vec_depth(css) != 3) {
stop("`css` list must be a named list within a named list, e.g.:\n",
' list(".class-id" = list("css-property" = "value"))')
stop(
"`css` list must be a named list within a named list, e.g.:\n",
' list(".class-id" = list("css-property" = "value"))'
)
}
if (any(names(css) == "")) {
not_named <- which(names(css) == "")
if (length(not_named) > 1) stop(call. = FALSE,
"All elements in `css` list must be named. Items ",
paste(not_named, collapse = ", "), " are unnamed."
) else stop(call. = FALSE,
"All elements in `css` list must be named. Item ", not_named, " is not named.")
if (length(not_named) > 1) {
stop(
call. = FALSE,
"All elements in `css` list must be named. Items ",
paste(not_named, collapse = ", "),
" are unnamed."
)
} else {
stop(
call. = FALSE,
"All elements in `css` list must be named. Item ",
not_named,
" is not named."
)
}
}
child_unnamed <- purrr::map_lgl(purrr::map(css, ~ {is.null(names(.)) || names(.) == ""}), ~ any(.))
child_unnamed <- purrr::map_lgl(purrr::map(css, ~ {
is.null(names(.)) || names(.) == ""
}), ~ any(.))
if (any(child_unnamed)) {
has_unnamed <- names(css)[child_unnamed]
msg <- paste(
@@ -68,11 +86,12 @@ list2css <- function(css) {
}

purrr::map_chr(names(css), function(el) {
paste(sep = "\n",
paste(
sep = "\n",
el %.% " {",
paste(
purrr::map_chr(names(css[[el]]), function(prop) {
" " %.% prop %.% ': ' %.% css[[el]][[prop]] %.% ';'
" " %.% prop %.% ": " %.% css[[el]][[prop]] %.% ";"
}),
collapse = "\n"
),
@@ -90,7 +109,9 @@ list2fonts <- function(fonts) {
f$url
} else if (inherits(f, "character")) {
f
} else NA_character_
} else {
NA_character_
}
})
paste0("@import url(", fonts[!is.na(fonts)], ");")
}

+ 11
- 14
R/style_xaringan.R Voir le fichier

@@ -127,29 +127,25 @@ style_xaringan <- function(
# Make sure font names are wrapped in quotes if they have spaces
f_args <- names(formals(sys.function()))
for (var in f_args[grepl("font_family$", f_args)]) {
eval(parse(text = paste0(
var, "<-quote_elements_w_spaces(", var, ")"
)))
eval(parse(text = paste0(var, "<-quote_elements_w_spaces(", var, ")")))
}
# Use font_..._google args to overwrite font args
for (var in f_args[grepl("font_google$", f_args)]) {
gf <- eval(parse(text = var))
if (is.null(gf)) next
if (!inherits(gf, "google_font")) stop(
"`", var, "` must be set using `google_font()`."
)
if (!inherits(gf, "google_font")) {
stop("`", var, "` must be set using `google_font()`.")
}
group <- strsplit(var, "_")[[1]][1]
if (group == "text") {
text_font_family <- gf$family
text_font_weight <- gf$weights %||% "normal"
text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1]-1)
text_font_url <- gf$url
text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1] - 1)
text_font_url <- gf$url
} else {
for (thing in c("family", "url")) {
eval(parse(text = paste0(
group, "_font_", thing, " <- gf$", thing
)))
eval(parse(text = paste0(group, "_font_", thing, " <- gf$", thing )))
}
}
}
@@ -167,7 +163,7 @@ style_xaringan <- function(
}
# prepare variables for template
body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ', ')
body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ", ")
background_size_fallback <- if (is.null(background_position)) "cover" else "100%"
background_size <- background_image %??% (background_size %||% background_size_fallback)
title_slide_background_size <- title_slide_background_size %||% (
@@ -182,13 +178,14 @@ style_xaringan <- function(
# prepare header background object
needs_leading_dot <- !grepl("^\\.", header_background_ignore_classes)
header_background_ignore_classes[needs_leading_dot] <- paste0(
".", header_background_ignore_classes[needs_leading_dot]
".",
header_background_ignore_classes[needs_leading_dot]
)
header_background_ignore_classes <- purrr::map(
header_background_ignore_classes,
~ list(class = .)
)
header_background <- list(
header_background <- list(
auto = header_background_auto,
background_color = header_background_color,
text_color = header_background_text_color,

+ 544
- 268
R/theme_settings.R Voir le fichier

@@ -1,327 +1,602 @@
template_variables <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "text_color", "#000", "body", "Text Color"
, "header_color", "#000", "h1, h2, h3", "Header Color"
, "background_color", "#FFF", ".remark-slide-content", "Slide Background Color"
, "link_color", "rgb(249, 38, 114)", "a, a > code", "Link Color"
, "text_bold_color", NULL, "strong", "Bold Text Color"
, "text_slide_number_color", "{inverse_background_color}", ".remark-slide-number", "Slide Number Color"
, "padding", "1rem 4rem 1rem 4rem", ".remark-slide-content", "Slide Padding in `top right [bottom left]` format"
, "background_image", NULL, ".remark-slide-content", "Background image applied to each *and every* slide. Set `title_slide_background_image = \"none\"` to remove the background image from the title slide"
, "background_size", NULL, ".remark-slide-content", "Background image size, requires `background_image` to be set. If `background_image` is set, `background_size` will default to `cover` so the backround fills the screen. If both `background_image` and `background_position` are set, will default to 100 percent"
, "background_position", NULL, ".remark-slide-content", "Background image position, requires `background_image` to be set, and it is recommended to adjust `background_size`"
, "code_highlight_color", "rgba(255,255,0,0.5)", ".remark-code-line-highlighted", "Code Line Highlight"
, "code_inline_color", "#000", ".remark-inline-code", "Inline Code Color"
, "code_inline_background_color", NULL, ".remark-inline-code", "Inline Code Background Color"
, "code_inline_font_size", "1em", ".remark-inline-code", "Inline Code Text Font Size"
, "inverse_background_color", "#272822", ".inverse", "Inverse Background Color"
, "inverse_text_color", "#d6d6d6", ".inverse", "Inverse Text Color"
, "inverse_text_shadow", "{FALSE}", ".inverse", "Enables Shadow on text of inverse slides"
, "inverse_header_color", "#f3f3f3", ".inverse h1, .inverse h2, .inverse h3", "Inverse Header Color"
, "title_slide_text_color", "{inverse_text_color}", ".title-slide", "Title Slide Text Color"
, "title_slide_background_color", "{inverse_background_color}", ".title-slide", "Title Slide Background Color"
, "title_slide_background_image", NULL, ".title-slide", "Title Slide Background Image URL"
, "title_slide_background_size", NULL, ".title-slide", "Title Slide Background Image Size, defaults to \"cover\" if background image is set"
, "title_slide_background_position", NULL, ".title-slide", "Title Slide Background Image Position"
, "footnote_color", NULL, ".footnote", "Footnote text color (if `NA`, then it will be the same color as `text_color`)"
, "footnote_font_size", "0.9em", ".footnote", "Footnote font size"
, "footnote_position_bottom", "3em", ".footnote", "Footnote location from bottom of screen"
, "left_column_subtle_color", "#777", ".left-column h2, .left-column h3", "Left Column Text (not last)"
, "left_column_selected_color", "#000", ".left-column h2:last-of-type, .left-column h3:last-child", "Left Column Current Selection"
, "blockquote_left_border_color", "lightgray", "blockquote", "Blockquote Left Border Color"
, "table_border_color", "#666", "table: border-top, border-bottom", "Table top/bottom border"
, "table_row_border_color", "#ddd", "table thead th: border-bottom", "Table row inner bottom border"
, "table_row_even_background_color", "#eee", "thead, tfoot, tr:nth-child(even)", "Table Even Row Background Color"
, "text_font_size", "20px", ".remark-slide-content", "Slide Body Text Font Size"
, "header_h1_font_size", "55px", ".remark-slide-content h1", "h1 Header Text Font Size"
, "header_h2_font_size", "45px", ".remark-slide-content h2", "h2 Header Text Font Size"
, "header_h3_font_size", "35px", ".remark-slide-content h3", "h3 Header Text Font Size"
, "header_background_auto", "{FALSE}", "", "Add background under slide title automatically for h1 header elements. If not enabled, use `class: header_background` to enable"
, "header_background_color", "{header_color}", ".remark-slide-content h1", "Background Color for h1 Header with Background"
, "header_background_text_color", "{background_color}", ".remark-slide-content h1", "Text Color for h1 Header with Background"
, "header_background_padding", "2rem 4rem 1.5rem 4rem", ".remark-slide-content h1", "Padding for h1 Header with Background"
, "header_background_content_padding_top", "7rem", ".remark-slide-content", "Top Padding for Content in Slide with Header with Background"
, "header_background_ignore_classes", "{c('normal', 'inverse', 'title', 'middle', 'bottom')}", ".remark-slide-content", "Slide Classes Where Header with Background will not be Applied"
, "text_slide_number_font_size", "0.9em", ".remark-slide-number", "Slide Number Text Font Size"
, "text_font_google", NULL, "body", "Use `google_font()` to specify body font"
, "text_font_family", "'Droid Serif'", "body", "Body Text Font Family"
, "text_font_weight", "normal", "body", "Body Text Font Weight"
, "text_font_url", "https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic", "@import url()", "Body Text Font URL(s)"
, "text_font_family_fallback", "'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC'", "body", "Body Text Font Fallbacks"
, "text_font_base", "serif", "body", "Body Text Base Font (Total Failure Fallback)"
, "header_font_google", NULL, "body", "Use `google_font()` to specify header font"
, "header_font_family", "'Yanone Kaffeesatz'", "h1, h2, h3", "Header Font Family"
, "header_font_weight", "normal", "h1, h2, h3", "Header Font Weight"
, "header_font_url", "https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz", "@import url", "Header Font URL"
, "code_font_google", NULL, "body", "Use `google_font()` to specify code font"
, "code_font_family", "'Source Code Pro'", ".remark-code, .remark-inline-code", "Code Font Family"
, "code_font_size", "0.9em", ".remark-inline", "Code Text Font Size"
, "code_font_url", "https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700", "@import url", "Code Font URL"
, "code_font_family_fallback", "'Lucida Console', Monaco", ".remark-code, .remark-inline-code", "Code Font Fallback"
~variable,
~default,
~element,
~description,
"text_color",
"#000",
"body",
"Text Color",
"header_color",
"#000",
"h1, h2, h3",
"Header Color",
"background_color",
"#FFF",
".remark-slide-content",
"Slide Background Color",
"link_color",
"rgb(249, 38, 114)",
"a, a > code",
"Link Color",
"text_bold_color",
NULL,
"strong",
"Bold Text Color",
"text_slide_number_color",
"{inverse_background_color}",
".remark-slide-number",
"Slide Number Color",
"padding",
"1rem 4rem 1rem 4rem",
".remark-slide-content",
"Slide Padding in `top right [bottom left]` format",
"background_image",
NULL,
".remark-slide-content",
"Background image applied to each *and every* slide. Set `title_slide_background_image = \"none\"` to remove the background image from the title slide",
"background_size",
NULL,
".remark-slide-content",
"Background image size, requires `background_image` to be set. If `background_image` is set, `background_size` will default to `cover` so the backround fills the screen. If both `background_image` and `background_position` are set, will default to 100 percent",
"background_position",
NULL,
".remark-slide-content",
"Background image position, requires `background_image` to be set, and it is recommended to adjust `background_size`",
"code_highlight_color",
"rgba(255,255,0,0.5)",
".remark-code-line-highlighted",
"Code Line Highlight",
"code_inline_color",
"#000",
".remark-inline-code",
"Inline Code Color",
"code_inline_background_color",
NULL,
".remark-inline-code",
"Inline Code Background Color",
"code_inline_font_size",
"1em",
".remark-inline-code",
"Inline Code Text Font Size",
"inverse_background_color",
"#272822",
".inverse",
"Inverse Background Color",
"inverse_text_color",
"#d6d6d6",
".inverse",
"Inverse Text Color",
"inverse_text_shadow",
"{FALSE}",
".inverse",
"Enables Shadow on text of inverse slides",
"inverse_header_color",
"#f3f3f3",
".inverse h1, .inverse h2, .inverse h3",
"Inverse Header Color",
"title_slide_text_color",
"{inverse_text_color}",
".title-slide",
"Title Slide Text Color",
"title_slide_background_color",
"{inverse_background_color}",
".title-slide",
"Title Slide Background Color",
"title_slide_background_image",
NULL,
".title-slide",
"Title Slide Background Image URL",
"title_slide_background_size",
NULL,
".title-slide",
"Title Slide Background Image Size, defaults to \"cover\" if background image is set",
"title_slide_background_position",
NULL,
".title-slide",
"Title Slide Background Image Position",
"footnote_color",
NULL,
".footnote",
"Footnote text color (if `NA`, then it will be the same color as `text_color`)",
"footnote_font_size",
"0.9em",
".footnote",
"Footnote font size",
"footnote_position_bottom",
"3em",
".footnote",
"Footnote location from bottom of screen",
"left_column_subtle_color",
"#777",
".left-column h2, .left-column h3",
"Left Column Text (not last)",
"left_column_selected_color",
"#000",
".left-column h2:last-of-type, .left-column h3:last-child",
"Left Column Current Selection",
"blockquote_left_border_color",
"lightgray",
"blockquote",
"Blockquote Left Border Color",
"table_border_color",
"#666",
"table: border-top, border-bottom",
"Table top/bottom border",
"table_row_border_color",
"#ddd",
"table thead th: border-bottom",
"Table row inner bottom border",
"table_row_even_background_color",
"#eee",
"thead, tfoot, tr:nth-child(even)",
"Table Even Row Background Color",
"text_font_size",
"20px",
".remark-slide-content",
"Slide Body Text Font Size",
"header_h1_font_size",
"55px",
".remark-slide-content h1",
"h1 Header Text Font Size",
"header_h2_font_size",
"45px",
".remark-slide-content h2",
"h2 Header Text Font Size",
"header_h3_font_size",
"35px",
".remark-slide-content h3",
"h3 Header Text Font Size",
"header_background_auto",
"{FALSE}",
"",
"Add background under slide title automatically for h1 header elements. If not enabled, use `class: header_background` to enable",
"header_background_color",
"{header_color}",
".remark-slide-content h1",
"Background Color for h1 Header with Background",
"header_background_text_color",
"{background_color}",
".remark-slide-content h1",
"Text Color for h1 Header with Background",
"header_background_padding",
"2rem 4rem 1.5rem 4rem",
".remark-slide-content h1",
"Padding for h1 Header with Background",
"header_background_content_padding_top",
"7rem",
".remark-slide-content",
"Top Padding for Content in Slide with Header with Background",
"header_background_ignore_classes",
"{c('normal', 'inverse', 'title', 'middle', 'bottom')}",
".remark-slide-content",
"Slide Classes Where Header with Background will not be Applied",
"text_slide_number_font_size",
"0.9em",
".remark-slide-number",
"Slide Number Text Font Size",
"text_font_google",
NULL,
"body",
"Use `google_font()` to specify body font",
"text_font_family",
"'Droid Serif'",
"body",
"Body Text Font Family",
"text_font_weight",
"normal",
"body",
"Body Text Font Weight",
"text_font_url",
"https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic",
"@import url()",
"Body Text Font URL(s)",
"text_font_family_fallback",
"'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC'",
"body",
"Body Text Font Fallbacks",
"text_font_base",
"serif",
"body",
"Body Text Base Font (Total Failure Fallback)",
"header_font_google",
NULL,
"body",
"Use `google_font()` to specify header font",
"header_font_family",
"'Yanone Kaffeesatz'",
"h1, h2, h3",
"Header Font Family",
"header_font_weight",
"normal",
"h1, h2, h3",
"Header Font Weight",
"header_font_url",
"https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz",
"@import url",
"Header Font URL",
"code_font_google",
NULL,
"body",
"Use `google_font()` to specify code font",
"code_font_family",
"'Source Code Pro'",
".remark-code, .remark-inline-code",
"Code Font Family",
"code_font_size",
"0.9em",
".remark-inline",
"Code Text Font Size",
"code_font_url",
"https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700",
"@import url",
"Code Font URL",
"code_font_family_fallback",
"'Lucida Console', Monaco",
".remark-code, .remark-inline-code",
"Code Font Fallback"
)

set_default <- function(tv, ...) {
vars <- c(...)
for (var in names(vars)) {
tv[tv$variable == var, 'default'] <- vars[var]
tv[tv$variable == var, "default"] <- vars[var]
}
tv
}

template_mono_light <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "base_color", "#23395b", "multiple", "Monotone base color, works best with a strong color"
, "white_color", "{lighten_color(base_color, 0.9)}", "multiple", "Brightest color used, default is a very light version of `base_color`"
, "black_color", "{darken_color(base_color, 0.3)}", "multiple", "Darkest color used, default is a very dark, version of `base_color`"
~variable,
~default,
~element,
~description,
"base_color",
"#23395b",
"multiple",
"Monotone base color, works best with a strong color",
"white_color",
"{lighten_color(base_color, 0.9)}",
"multiple",
"Brightest color used, default is a very light version of `base_color`",
"black_color",
"{darken_color(base_color, 0.3)}",
"multiple",
"Darkest color used, default is a very dark, version of `base_color`"
)
template_mono_light <- do.call('rbind', list(template_mono_light, template_variables))
template_mono_light <- do.call("rbind", list(template_mono_light, template_variables))
template_mono_light <- set_default(
template_mono_light,
text_color = "{black_color}",
header_color = "{base_color}",
background_color = "{white_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{white_color}",
inverse_header_color = "{white_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{lighten_color(base_color, 0.8)}")
text_color = "{black_color}",
header_color = "{base_color}",
background_color = "{white_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{white_color}",
inverse_header_color = "{white_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{lighten_color(base_color, 0.8)}"
)

template_mono_dark <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "base_color", "#cbf7ed", "multiple", "Monotone Base Color, works best with a light color."
, "white_color", "{lighten_color(base_color, 0.8)}", "multiple", "Brightest color used, default is a very light version of `base_color`"
, "black_color", "{darken_color(base_color, 0.85)}", "multiple", "Darkest color used, default is a very dark, version of `base_color`"
~variable,
~default,
~element,
~description,
"base_color",
"#cbf7ed",
"multiple",
"Monotone Base Color, works best with a light color.",
"white_color",
"{lighten_color(base_color, 0.8)}",
"multiple",
"Brightest color used, default is a very light version of `base_color`",
"black_color",
"{darken_color(base_color, 0.85)}",
"multiple",
"Darkest color used, default is a very dark, version of `base_color`"
)
template_mono_dark <- do.call('rbind', list(template_mono_dark, template_variables))
template_mono_dark <- do.call("rbind", list(template_mono_dark, template_variables))
template_mono_dark <- set_default(
template_mono_dark,
text_color = "{white_color}",
header_color = "{base_color}",
background_color = "{black_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{black_color}",
inverse_header_color = "{black_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{darken_color(base_color, 0.7)}")
text_color = "{white_color}",
header_color = "{base_color}",
background_color = "{black_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{black_color}",
inverse_header_color = "{black_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{darken_color(base_color, 0.7)}"
)

template_mono_accent <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "base_color", "#43418A", "multiple", "Monotone Base Color, works best with a strong color"
, "white_color", "#FFFFFF", "multiple", "Brightest color used"
, "black_color", "#272822", "multiple", "Darkest color used"
~variable,
~default,
~element,
~description,
"base_color",
"#43418A",
"multiple",
"Monotone Base Color, works best with a strong color",
"white_color",
"#FFFFFF",
"multiple",
"Brightest color used",
"black_color",
"#272822",
"multiple",
"Darkest color used"
)
template_mono_accent <- do.call('rbind', list(template_mono_accent, template_variables))
template_mono_accent <- do.call("rbind", list(template_mono_accent, template_variables))
template_mono_accent <- set_default(
template_mono_accent,
text_color = "{black_color}",
header_color = "{base_color}",
background_color = "{white_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{white_color}",
inverse_header_color = "{white_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{lighten_color(base_color, 0.7)}")
text_color = "{black_color}",
header_color = "{base_color}",
background_color = "{white_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{white_color}",
inverse_header_color = "{white_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{lighten_color(base_color, 0.7)}"
)

template_mono_accent_inverse <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "base_color", "#3C989E", "multiple", "Monotone Base Color, works best with a light color"
, "white_color", "#FFFFFF", "multiple", "Brightest color used, default is a very light version of `base_color`"
, "black_color", "{darken_color(base_color, 0.9)}", "multiple", "Darkest color used, default is a very dark, version of `base_color`"
~variable,
~default,
~element,
~description,
"base_color",
"#3C989E",
"multiple",
"Monotone Base Color, works best with a light color",
"white_color",
"#FFFFFF",
"multiple",
"Brightest color used, default is a very light version of `base_color`",
"black_color",
"{darken_color(base_color, 0.9)}",
"multiple",
"Darkest color used, default is a very dark, version of `base_color`"
)
template_mono_accent_inverse <- do.call('rbind', list(template_mono_accent_inverse, template_variables))
template_mono_accent_inverse <- do.call("rbind", list(template_mono_accent_inverse, template_variables))
template_mono_accent_inverse <- set_default(
template_mono_accent_inverse,
text_color = "{white_color}",
header_color = "{base_color}",
background_color = "{black_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{black_color}",
inverse_header_color = "{black_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{darken_color(base_color, 0.7)}")
text_color = "{white_color}",
header_color = "{base_color}",
background_color = "{black_color}",
link_color = "{base_color}",
text_bold_color = "{base_color}",
text_slide_number_color = "{base_color}",
code_inline_color = "{base_color}",
inverse_background_color = "{base_color}",
inverse_text_color = "{black_color}",
inverse_header_color = "{black_color}",
left_column_subtle_color = "{apply_alpha(base_color, 0.6)}",
left_column_selected_color = "{base_color}",
blockquote_left_border_color = "{apply_alpha(base_color, 0.5)}",
table_row_even_background_color = "{darken_color(base_color, 0.7)}"
)

template_duo_light <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "primary_color", "#1F4257", "multiple", "Duotone Secondary Color"
, "secondary_color", "#F97B64", "multiple", "Duotone Primary Color"
, "white_color", "{lighten_color(primary_color, 0.99)}", "multiple", "Brightest color used, default is a very light version of `primary_color`"
, "black_color", "{darken_color(secondary_color, 0.9)}", "multiple", "Darkest color used, default is a very dark version of `secondary_color`"
~variable,
~default,
~element,
~description,
"primary_color",
"#1F4257",
"multiple",
"Duotone Secondary Color",
"secondary_color",
"#F97B64",
"multiple",
"Duotone Primary Color",
"white_color",
"{lighten_color(primary_color, 0.99)}",
"multiple",
"Brightest color used, default is a very light version of `primary_color`",
"black_color",
"{darken_color(secondary_color, 0.9)}",
"multiple",
"Darkest color used, default is a very dark version of `secondary_color`"
)
template_duo_light <- do.call('rbind', list(template_duo_light, template_variables))
template_duo_light <- do.call("rbind", list(template_duo_light, template_variables))
template_duo_light <- set_default(
template_duo_light,
text_color = "{black_color}",
header_color = "{primary_color}",
background_color = "{white_color}",
link_color = "{secondary_color}",
text_bold_color = "{secondary_color}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{secondary_color}",
inverse_background_color = "{primary_color}",
inverse_text_color = "{secondary_color}",
inverse_header_color = "{secondary_color}",
left_column_subtle_color = "{apply_alpha(secondary_color, 0.6)}",
left_column_selected_color = "{secondary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(secondary_color, 0.7)}")
text_color = "{black_color}",
header_color = "{primary_color}",
background_color = "{white_color}",
link_color = "{secondary_color}",
text_bold_color = "{secondary_color}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{secondary_color}",
inverse_background_color = "{primary_color}",
inverse_text_color = "{secondary_color}",
inverse_header_color = "{secondary_color}",
left_column_subtle_color = "{apply_alpha(secondary_color, 0.6)}",
left_column_selected_color = "{secondary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(secondary_color, 0.7)}"
)

template_duo <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "primary_color", "#1F4257", "multiple", "Duotone Primary Color"
, "secondary_color", "#F97B64", "multiple", "Duotone Secondary Color"
~variable,
~default,
~element,
~description,
"primary_color",
"#1F4257",
"multiple",
"Duotone Primary Color",
"secondary_color",
"#F97B64",
"multiple",
"Duotone Secondary Color"
)
template_duo <- do.call('rbind', list(template_duo, template_variables))
template_duo <- do.call("rbind", list(template_duo, template_variables))
template_duo <- set_default(
template_duo,
text_color = "{choose_dark_or_light(primary_color, darken_color(primary_color, 0.9), lighten_color(secondary_color, 0.99))}",
header_color = "{secondary_color}",
background_color = "{primary_color}",
link_color = "{secondary_color}",
text_bold_color = "{secondary_color}",
text_slide_number_color = "{text_color}",
code_inline_color = "{secondary_color}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{primary_color}",
inverse_header_color = "{primary_color}",
title_slide_text_color = "{secondary_color}",
title_slide_background_color = "{primary_color}",
left_column_subtle_color = "{apply_alpha(secondary_color, 0.6)}",
left_column_selected_color = "{secondary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(primary_color, 0.3)}")
text_color = "{choose_dark_or_light(primary_color, darken_color(primary_color, 0.9), lighten_color(secondary_color, 0.99))}",
header_color = "{secondary_color}",
background_color = "{primary_color}",
link_color = "{secondary_color}",
text_bold_color = "{secondary_color}",
text_slide_number_color = "{text_color}",
code_inline_color = "{secondary_color}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{primary_color}",
inverse_header_color = "{primary_color}",
title_slide_text_color = "{secondary_color}",
title_slide_background_color = "{primary_color}",
left_column_subtle_color = "{apply_alpha(secondary_color, 0.6)}",
left_column_selected_color = "{secondary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(primary_color, 0.3)}"
)

template_duo_accent <- tibble::tribble(
~ variable, ~ default, ~ element, ~ description
, "primary_color", "#006747", "multiple", "Duotone Primary Color"
, "secondary_color", "#CFC493", "multiple", "Duotone Secondary Color"
, "white_color", "#FFFFFF", "multiple", "Brightest color used"
, "black_color", "#000000", "multiple", "Darkest color used"
~variable,
~default,
~element,
~description,
"primary_color",
"#006747",
"multiple",
"Duotone Primary Color",
"secondary_color",
"#CFC493",
"multiple",
"Duotone Secondary Color",
"white_color",
"#FFFFFF",
"multiple",
"Brightest color used",
"black_color",
"#000000",
"multiple",
"Darkest color used"
)
template_duo_accent <- do.call('rbind', list(template_duo_accent, template_variables))
template_duo_accent <- do.call("rbind", list(template_duo_accent, template_variables))
template_duo_accent <- set_default(
template_duo_accent,
text_color = "{black_color}",
header_color = "{primary_color}",
background_color = "{white_color}",
link_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
text_bold_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
inverse_header_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
title_slide_background_color = "{primary_color}",
title_slide_text_color = "{choose_dark_or_light(primary_color, black_color, white_color)}",
left_column_subtle_color = "{apply_alpha(primary_color, 0.6)}",
left_column_selected_color = "{primary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(secondary_color, 0.3)}")
text_color = "{black_color}",
header_color = "{primary_color}",
background_color = "{white_color}",
link_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
text_bold_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{choose_dark_or_light(secondary_color, primary_color, secondary_color)}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
inverse_header_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
title_slide_background_color = "{primary_color}",
title_slide_text_color = "{choose_dark_or_light(primary_color, black_color, white_color)}",
left_column_subtle_color = "{apply_alpha(primary_color, 0.6)}",
left_column_selected_color = "{primary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{lighten_color(secondary_color, 0.3)}"
)

template_duo_accent_inverse <- set_default(
template_duo_accent,
text_color = "{white_color}",
header_color = "{primary_color}",
background_color = "{black_color}",
link_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
text_bold_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
inverse_header_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
title_slide_background_color = "{primary_color}",
title_slide_text_color = "{choose_dark_or_light(primary_color, black_color, white_color)}",
left_column_subtle_color = "{apply_alpha(primary_color, 0.6)}",
left_column_selected_color = "{primary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{darken_color(choose_dark_or_light(primary_color, secondary_color, primary_color), 0.3)}")
text_color = "{white_color}",
header_color = "{primary_color}",
background_color = "{black_color}",
link_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
text_bold_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
text_slide_number_color = "{primary_color}",
code_inline_color = "{choose_dark_or_light(secondary_color, secondary_color, primary_color)}",
inverse_background_color = "{secondary_color}",
inverse_text_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
inverse_header_color = "{choose_dark_or_light(secondary_color, black_color, white_color)}",
title_slide_background_color = "{primary_color}",
title_slide_text_color = "{choose_dark_or_light(primary_color, black_color, white_color)}",
left_column_subtle_color = "{apply_alpha(primary_color, 0.6)}",
left_column_selected_color = "{primary_color}",
blockquote_left_border_color = "{apply_alpha(secondary_color, 0.5)}",
table_row_even_background_color = "{darken_color(choose_dark_or_light(primary_color, secondary_color, primary_color), 0.3)}"
)

solarized <- list(
"base03" = "#002b36",
"base02" = "#073642",
"base01" = "#586e75",
"base00" = "#657b83",
"base0" = "#839496",
"base1" = "#93a1a1",
"base2" = "#eee8d5",
"base3" = "#fdf6e3",
"yellow" = "#b58900",
"orange" = "#cb4b16",
"red" = "#dc322f",
"base03" = "#002b36",
"base02" = "#073642",
"base01" = "#586e75",
"base00" = "#657b83",
"base0" = "#839496",
"base1" = "#93a1a1",
"base2" = "#eee8d5",
"base3" = "#fdf6e3",
"yellow" = "#b58900",
"orange" = "#cb4b16",
"red" = "#dc322f",
"magenta" = "#d33682",
"violet" = "#6c71c4",
"blue" = "#268bd2",
"cyan" = "#2aa198",
"green" = "#859900")
"violet" = "#6c71c4",
"blue" = "#268bd2",
"cyan" = "#2aa198",
"green" = "#859900"
)


template_solarized_light <- set_default(
template_variables,
text_color = solarized$base00,
header_color = solarized$red,
background_color = solarized$base3,
link_color = solarized$yellow,
text_bold_color = solarized$magenta,
text_slide_number_color = solarized$base1,
code_highlight_color = "#268bd240", #xaringanthemer:::apply_alpha(solarized$blue, 0.25)
code_inline_color = solarized$violet,
inverse_background_color = solarized$base03,
inverse_text_color = solarized$base3,
inverse_header_color = "{inverse_text_color}",
title_slide_text_color = "{inverse_text_color}",
title_slide_background_color = "{inverse_background_color}",
left_column_subtle_color = solarized$base1,
left_column_selected_color = solarized$base01,
blockquote_left_border_color = solarized$orange,
table_border_color = solarized$base0,
table_row_border_color = solarized$base0,
text_color = solarized$base00,
header_color = solarized$red,
background_color = solarized$base3,
link_color = solarized$yellow,
text_bold_color = solarized$magenta,
text_slide_number_color = solarized$base1,
code_highlight_color = "#268bd240",
# xaringanthemer:::apply_alpha(solarized$blue, 0.25)
code_inline_color = solarized$violet,
inverse_background_color = solarized$base03,
inverse_text_color = solarized$base3,
inverse_header_color = "{inverse_text_color}",
title_slide_text_color = "{inverse_text_color}",
title_slide_background_color = "{inverse_background_color}",
left_column_subtle_color = solarized$base1,
left_column_selected_color = solarized$base01,
blockquote_left_border_color = solarized$orange,
table_border_color = solarized$base0,
table_row_border_color = solarized$base0,
table_row_even_background_color = solarized$base2
)

template_solarized_dark <- set_default(
template_variables,
text_color = solarized$base0,
header_color = solarized$red,
background_color = solarized$base03,
link_color = solarized$yellow,
text_bold_color = solarized$magenta,
text_slide_number_color = solarized$base01,
code_highlight_color = "#268bd240", #xaringanthemer:::apply_alpha(solarized$blue, 0.25)
code_inline_color = solarized$violet,
inverse_background_color = solarized$base3,
inverse_text_color = solarized$base03,
inverse_header_color = "{inverse_text_color}",
title_slide_text_color = "{inverse_text_color}",
title_slide_background_color = "{inverse_background_color}",
left_column_subtle_color = solarized$base01,
left_column_selected_color = solarized$base1,
blockquote_left_border_color = solarized$orange,
table_border_color = solarized$base00,
table_row_border_color = solarized$base00,
text_color = solarized$base0,
header_color = solarized$red,
background_color = solarized$base03,
link_color = solarized$yellow,
text_bold_color = solarized$magenta,
text_slide_number_color = solarized$base01,
code_highlight_color = "#268bd240",
# xaringanthemer:::apply_alpha(solarized$blue, 0.25)
code_inline_color = solarized$violet,
inverse_background_color = solarized$base3,
inverse_text_color = solarized$base03,
inverse_header_color = "{inverse_text_color}",
title_slide_text_color = "{inverse_text_color}",
title_slide_background_color = "{inverse_background_color}",
left_column_subtle_color = solarized$base01,
left_column_selected_color = solarized$base1,
blockquote_left_border_color = solarized$orange,
table_border_color = solarized$base00,
table_row_border_color = solarized$base00,
table_row_even_background_color = solarized$base02
)

@@ -332,9 +607,10 @@ template_solarized_dark <- set_default(
plural_element <- function(css_name) {
is_mult <- grepl(",|and|or", css_name)
is_class <- grepl("^\\.", css_name)
ifelse(is_class,
ifelse(is_mult, "classes", "class"),
ifelse(is_mult, "elements", "element")
ifelse(
is_class,
ifelse(is_mult, "classes", "class"),
ifelse(is_mult, "elements", "element")
)
}


+ 52
- 25
R/utils.R Voir le fichier

@@ -36,12 +36,12 @@ darken_color <- function(color_hex, strength = 0.8) {
#' @param opacity Desired opacity of the output color
#' @export
apply_alpha <- function(color_hex, opacity = 0.5) {
paste0(color_hex, as.hexmode(round(255*opacity, 0)))
paste0(color_hex, as.hexmode(round(255 * opacity, 0)))
}

adjust_value_color <- function(color_hex, strength = 0.5) {
color_hsv <- rgb2hsv(col2rgb(color_hex))[, 1]
color_hsv['v'] <- strength
color_hsv["v"] <- strength
hsv(color_hsv[1], color_hsv[2], color_hsv[3])
}

@@ -68,17 +68,19 @@ is_light_color <- function(x) {
color_rgb <- col2rgb(x)[, 1]
# from https://stackoverflow.com/a/3943023/2022615
color_rgb <- color_rgb / 255
color_rgb[color_rgb <= 0.03928] <- color_rgb[color_rgb <= 0.03928]/12.92
color_rgb[color_rgb > 0.03928] <- ((color_rgb[color_rgb > 0.03928] + 0.055)/1.055)^2.4
color_rgb[color_rgb <= 0.03928] <- color_rgb[color_rgb <= 0.03928] / 12.92
color_rgb[color_rgb > 0.03928] <- ((color_rgb[color_rgb > 0.03928] + 0.055) / 1.055)^2.4
lum <- t(c(0.2126, 0.7152, 0.0722)) %*% color_rgb
lum[1, 1] > 0.179
}

#' @keywords internal
call_style_xaringan <- function() {
paste0("style_xaringan(",
paste(names(formals(style_xaringan)), collapse = ", "),
")")
paste0(
"style_xaringan(",
paste(names(formals(style_xaringan)), collapse = ", "),
")"
)
}

#' Specify Google Font
@@ -96,19 +98,23 @@ call_style_xaringan <- function() {
#' [google_language_codes()].
#' @export
google_font <- function(family, ..., languages = NULL) {
base = "https://fonts.googleapis.com/css?family="
base <- "https://fonts.googleapis.com/css?family="
weights <- if (length(list(...))) paste(c(...), collapse = ",")
languages <- if (!is.null(languages)) paste(google_language_codes(languages), collapse = ",")
structure(list(
family = family,
weights = weights,
languages = languages,
url = paste0(
base, gsub(" ", "+", family),
if (!is.null(weights)) paste0(":", weights),
if (!is.null(languages)) paste0("&subset=", languages)
)
), class = "google_font")
structure(
list(
family = family,
weights = weights,
languages = languages,
url = paste0(
base,
gsub(" ", "+", family),
if (!is.null(weights)) paste0(":", weights),
if (!is.null(languages)) paste0("&subset=", languages)
)
),
class = "google_font"
)
}

#' @title List Valid Google Language Codes
@@ -118,20 +124,41 @@ google_font <- function(family, ..., languages = NULL) {
#' @param language_codes Vector of potential Google language codes
#' @export
google_language_codes <- function(
language_codes = c("latin", "latin-ext", "sinhala", "greek", "hebrew",
"vietnamese", "cyrillic", "cyrillic-ext", "devanagari", "arabic", "khmer",
"tamil", "greek-ext", "thai", "bengali", "gujarati", "oriya",
"malayalam", "gurmukhi", "kannada", "telugu", "myanmar")
) {
language_codes = c(
"latin",
"latin-ext",
"sinhala",
"greek",
"hebrew",
"vietnamese",
"cyrillic",
"cyrillic-ext",
"devanagari",
"arabic",
"khmer",
"tamil",
"greek-ext",
"thai",
"bengali",
"gujarati",
"oriya",
"malayalam",
"gurmukhi",
"kannada",
"telugu",
"myanmar"
)) {
unique(match.arg(language_codes, several.ok = TRUE))
}

print.google_font <- function(x) {
cat(
"Family: ", x$family,
"Family: ",
x$family,
if (!is.null(x$weights)) paste("\nWeights:", x$weights),
if (!is.null(x$languages)) paste("\nLangs: ", x$languages),
"\nURL: ", x$url
"\nURL: ",
x$url
)
}


+ 5
- 3
inst/scripts/generate_theme_functions.R Voir le fichier

@@ -14,14 +14,15 @@ setup_theme_function <- function(
if (file == "clip" && !requireNamespace("clipr", quietly = TRUE)) file <- ""
tv <- template
null_default <- purrr::map_lgl(tv$default, is.null)
tv[null_default, 'default'] <- "{NULL}"
tv[null_default, "default"] <- "{NULL}"
x <- c(
as.character(
glue::glue_data(
tv,
"#' @param {variable} {description}. ",
"Defaults to {gsub('[{{}}]', '`', default)}. ",
"{element_description(element)}")
"{element_description(element)}"
)
),
"#' @template extra_css",
"#' @param outfile Customized xaringan CSS output file name, default is \"xaringan-themer.css\"",
@@ -31,7 +32,8 @@ setup_theme_function <- function(
as.character(
glue::glue_data(
tv,
" {variable} = {ifelse(!grepl('^[{].+[}]$', default), paste0('\"', default, '\"'), gsub('[{}]', '', default))},")
" {variable} = {ifelse(!grepl('^[{].+[}]$', default), paste0('\"', default, '\"'), gsub('[{}]', '', default))},"
)
),
" extra_css = NULL,",
" extra_fonts = NULL,",

+ 11
- 14
inst/scripts/style_xaringan_body.R Voir le fichier

@@ -1,29 +1,25 @@
# Make sure font names are wrapped in quotes if they have spaces
f_args <- names(formals(sys.function()))
for (var in f_args[grepl("font_family$", f_args)]) {
eval(parse(text = paste0(
var, "<-quote_elements_w_spaces(", var, ")"
)))
eval(parse(text = paste0(var, "<-quote_elements_w_spaces(", var, ")")))
}

# Use font_..._google args to overwrite font args
for (var in f_args[grepl("font_google$", f_args)]) {
gf <- eval(parse(text = var))
if (is.null(gf)) next
if (!inherits(gf, "google_font")) stop(
"`", var, "` must be set using `google_font()`."
)
if (!inherits(gf, "google_font")) {
stop("`", var, "` must be set using `google_font()`.")
}
group <- strsplit(var, "_")[[1]][1]
if (group == "text") {
text_font_family <- gf$family
text_font_weight <- gf$weights %||% "normal"
text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1]-1)
text_font_url <- gf$url
text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1] - 1)
text_font_url <- gf$url
} else {
for (thing in c("family", "url")) {
eval(parse(text = paste0(
group, "_font_", thing, " <- gf$", thing
)))
eval(parse(text = paste0(group, "_font_", thing, " <- gf$", thing )))
}
}
}
@@ -41,7 +37,7 @@ for (var in f_args) {
}

# prepare variables for template
body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ', ')
body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ", ")
background_size_fallback <- if (is.null(background_position)) "cover" else "100%"
background_size <- background_image %??% (background_size %||% background_size_fallback)
title_slide_background_size <- title_slide_background_size %||% (
@@ -56,13 +52,14 @@ xaringanthemer_version <- utils::packageVersion("xaringanthemer")
# prepare header background object
needs_leading_dot <- !grepl("^\\.", header_background_ignore_classes)
header_background_ignore_classes[needs_leading_dot] <- paste0(
".", header_background_ignore_classes[needs_leading_dot]
".",
header_background_ignore_classes[needs_leading_dot]
)
header_background_ignore_classes <- purrr::map(
header_background_ignore_classes,
~ list(class = .)
)
header_background <- list(
header_background <- list(
auto = header_background_auto,
background_color = header_background_color,
text_color = header_background_text_color,

+ 4
- 5
man/style_extra_css.Rd Voir le fichier

@@ -28,15 +28,14 @@ named list of class identifiers, for example
\examples{
style_extra_css(
outfile = stdout(),
css = list(
".red" = list(color = "red"),
css = list(
".red" = list(color = "red"),
".small" = list("font-size" = "90\%"),
".full-width" = list(
display = "flex",
width = "100\%",
flex = "1 1 auto"
width = "100\%",
flex = "1 1 auto"
)
)
)

}

+ 0
- 1
man/theme_xaringan.Rd Voir le fichier

@@ -68,7 +68,6 @@ if (requireNamespace("ggplot2", quietly = TRUE)) {
geom_point() +
theme_xaringan()
}

}
\seealso{
Other xaringanthemer ggplot2 themes: \code{\link{theme_xaringan_base}},

+ 1
- 2
man/theme_xaringan_base.Rd Voir le fichier

@@ -81,7 +81,7 @@ if (requireNamespace("ggplot2", quietly = TRUE)) {
caption = "{xaringanthemer}"
)

ggplot(iris) +
ggplot(iris) +
aes(Petal.Length, Petal.Width) +
geom_point() +
theme_xaringan_base(
@@ -96,7 +96,6 @@ if (requireNamespace("ggplot2", quietly = TRUE)) {
caption = "{xaringanthemer}"
)
}

}
\seealso{
Other xaringanthemer ggplot2 themes: \code{\link{theme_xaringan_inverse}},

+ 0
- 1
man/theme_xaringan_inverse.Rd Voir le fichier

@@ -67,7 +67,6 @@ if (requireNamespace("ggplot2", quietly = TRUE)) {
geom_point() +
theme_xaringan()
}

}
\seealso{
Other xaringanthemer ggplot2 themes: \code{\link{theme_xaringan_base}},

+ 9
- 6
tests/testthat/test-list2css.R Voir le fichier

@@ -2,12 +2,15 @@ context("test-list2css.R")

test_that("list2css converts lists to css", {
css <- list(
'.remark-slide' = list(
".remark-slide" = list(
"color" = "#FFF",
"font-size" = "30px"
)
)
expected <- '.remark-slide {\n color: #FFF;\n font-size: 30px;\n}'
expected <- ".remark-slide {
color: #FFF;
font-size: 30px;
}"
expect_equal(list2css(css), expected)

css[[".new-class"]] <- list("background-color" = "#000")
@@ -29,7 +32,7 @@ test_that("list2css errors if css list has unnamed elements", {
"color" = "#FFF",
"font-size" = "30px"
),
'.test' = list(color = 'red')
".test" = list(color = "red")
)
expect_error(list2css(css))
})
@@ -40,7 +43,7 @@ test_that("list2css errors if css list has unnamed properties", {
color = "#FFF",
"font-size" = "30px"
),
'.test' = list('red')
".test" = list("red")
)
expect_error(list2css(css))

@@ -49,7 +52,7 @@ test_that("list2css errors if css list has unnamed properties", {
"#FFF",
"font-size" = "30px"
),
'.test' = list('red')
".test" = list("red")
)
expect_error(list2css(css))
})
@@ -60,7 +63,7 @@ test_that("list2css errors if not list within list", {
list(color = "red"),
"font-size" = "30px"
),
'.test' = list('red')
".test" = list("red")
)
expect_error(list2css(css))
})

+ 0
- 1
tests/testthat/test-write_extra_css.R Voir le fichier

@@ -3,7 +3,6 @@ import <- function(x) paste0("@import url(", x, ");")
# test_that("list2fonts()", {})

describe("list2fonts()", {

lato_url <- "https://fonts.googleapis.com/css?family=Lato"
worksans_url <- "https://fonts.googleapis.com/css?family=Work+Sans"


Chargement…
Annuler
Enregistrer