Author SHA1 Message Date
kodor 967e7e1111 docs: regenerate roxygen documentation for paper_bg and force params (#19)
R-CMD-check / R CMD check (pull_request) Successful in 4m29s
2026-08-01 21:44:50 -04:00
kodor f32093c662 fix(test): update theme tests for paper_bg=FALSE default (#19)
R-CMD-check / R CMD check (pull_request) Failing after 5m47s
2026-08-01 21:29:44 -04:00
kodor e257180f15 fix: resolve locked namespace binding in civilytics_load_fonts() and default theme to transparent background
R-CMD-check / R CMD check (pull_request) Failing after 4m13s
- Replace .cv_fonts_loaded <<- TRUE with environment-based state
  (.cv_state) to avoid 'locked namespace binding' error (#18)
- Add force=FALSE argument for idempotent font loading with guard check
- Flip theme_civilytics() paper_bg default to FALSE (transparent) (#7)
- Update roxygen docs and examples for both changes
2026-08-01 02:07:09 -04:00
jared 0ef0f310e2 Merge pull request 'fix(brand): use real company name "Civilytics Consulting" in templates' (#17) from fix/brand-name-consulting into master
R-CMD-check / R CMD check (push) Successful in 4m28s
2026-07-09 16:42:18 -04:00
jared 4fb5c488f8 fix(brand): use real company name "Civilytics Consulting" in templates
R-CMD-check / R CMD check (pull_request) Successful in 4m27s
The title-page kicker in the Typst and LaTeX templates was hardcoded to
"Civilytics Research", which is not a real entity — the company is
Civilytics Consulting. Fix the kicker in both templates, and update the
example report/slides that echoed the same non-real name. Bump to 0.3.1.
2026-07-09 16:41:55 -04:00
jared 96dc1c4c6b Merge pull request 'feat(flextable): reusable Civilytics flextable branding helpers' (#16) from feat/flextable-branding into master
R-CMD-check / R CMD check (push) Successful in 4m25s
2026-07-09 16:18:43 -04:00
jared 6ea9265236 Merge pull request 'fix(quarto): repair LaTeX + Typst branded templates (#11 #12 #13 #14)' (#15) from fix/quarto-template-bugs into master
R-CMD-check / R CMD check (push) Successful in 4m13s
2026-07-09 16:18:29 -04:00
jared b9d427eb76 fix(typst): ship template as partials so code blocks render (#12)
R-CMD-check / R CMD check (pull_request) Successful in 3m54s
The single-file `template: civilytics-typst.typ` discarded Quarto's
auto-generated `definitions` partial, so any Typst document containing a
code block failed with `unknown variable: Skylighting`.

Ship the template as Quarto template-partials instead, so Quarto keeps its
definitions (Skylighting + token functions) and syntax-highlighted code
blocks render while the Civilytics branding still applies:

- split civilytics-typst.typ into typst-template.typ (the styling function)
  and typst-show.typ (the show/entry point, keyword-safe [ ] wrapping kept);
  remove the single-file template
- use_civilytics_theme() now copies both partials and prints the
  template-partials usage
- example report.qmd uses template-partials

Verified: a report with an R code block renders with working syntax
highlighting and full branding.
2026-07-09 16:10:15 -04:00
jared a904d2313a fix(quarto): repair LaTeX + Typst branded templates
R-CMD-check / R CMD check (pull_request) Successful in 3m56s
- LaTeX: capture pandoc's \subtitle into \thesubtitle so subtitled PDFs
  compile; suppress the default \maketitle/abstract so only the branded
  title page renders (no double title); drop the unused tikz dependency
  from the title partial (#13)
- LaTeX: stop requiring a "Source Serif 4 SemiBold" face that the setup
  never installs; use the family's native Bold weight (#14)
- Typst: wrap title/subtitle/date in [ ] so text containing Typst keywords
  ("for"/"in") no longer breaks compilation (#12)
- Fix footer URL civilytics.consulting -> civilytics.com in the LaTeX and
  Typst templates and the slides example (#11)
- Bump version to 0.3.0
2026-07-09 15:57:47 -04:00
jared 761a72da18 Merge pull request 'feat(logo): add stamp_logo_png() for branding file-based (PNG) outputs' (#9) from feat/stamp-logo-png into master
R-CMD-check / R CMD check (push) Successful in 3m51s
Reviewed-on: #9
2026-06-22 16:59:52 -04:00
18 changed files with 160 additions and 90 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
Package: civilytics Package: civilytics
Type: Package Type: Package
Title: Brand Themes, Color Palettes, and Utility Functions for Civilytics Title: Brand Themes, Color Palettes, and Utility Functions for Civilytics
Version: 0.2.0 Version: 0.3.1
Authors@R: Authors@R:
person("Jared", "E. Knowles", email = "jared@civilytics.com", person("Jared", "E. Knowles", email = "jared@civilytics.com",
role = c("aut", "cre")) role = c("aut", "cre"))
+24 -11
View File
@@ -5,32 +5,45 @@ CV_FONT_SANS <- "Inter" # axis text, legends, UI elements
CV_FONT_SERIF <- "Source Serif 4" # body prose / editorial long-form CV_FONT_SERIF <- "Source Serif 4" # body prose / editorial long-form
CV_FONT_MONO <- "JetBrains Mono" # code, data tables, numeric callouts CV_FONT_MONO <- "JetBrains Mono" # code, data tables, numeric callouts
# Internal flag so civilytics_load_fonts() is idempotent within a session. # Mutable package state held in an environment so the binding itself stays
.cv_fonts_loaded <- FALSE # locked (R locks all namespace bindings at load time) while the contents
# remain writable. See https://adv-r.hadley.nz/environments.html#environments-as-containers
.cv_state <- new.env(parent = emptyenv())
.cv_state$fonts_loaded <- FALSE
#' Load Civilytics brand fonts #' Load Civilytics brand fonts
#' #'
#' Downloads Inter and Libre Franklin from Google Fonts via #' Downloads Inter, Libre Franklin, Source Serif 4 and JetBrains Mono from
#' [sysfonts::font_add_google()], then calls [showtext::showtext_auto()] so #' Google Fonts via [sysfonts::font_add_google()], then calls
#' that all graphics devices render text with those fonts. This is called #' [showtext::showtext_auto()] so that all graphics devices render text with
#' automatically when the package loads; use this function to retry if the #' those fonts. This is called automatically when the package loads; use this
#' initial load failed (e.g., the machine was offline at load time). #' function to retry if the initial load failed (e.g., the machine was offline
#' at load time).
#' #'
#' @return Invisibly returns `NULL`. #' Subsequent calls within the same session are no-ops unless `force = TRUE`.
#'
#' @param force Logical. If `TRUE`, reload fonts even if they were already
#' loaded in this session. Default `FALSE`.
#'
#' @return Invisibly returns `TRUE` if fonts were loaded, `FALSE` if skipped
#' (already loaded and `force = FALSE`).
#' @export #' @export
#' #'
#' @examples #' @examples
#' \dontrun{ #' \dontrun{
#' civilytics_load_fonts() #' civilytics_load_fonts()
#' } #' }
civilytics_load_fonts <- function() { civilytics_load_fonts <- function(force = FALSE) {
if (.cv_state$fonts_loaded && !force) return(invisible(FALSE))
sysfonts::font_add_google("Inter", family = "Inter") sysfonts::font_add_google("Inter", family = "Inter")
sysfonts::font_add_google("Libre Franklin", family = "Libre Franklin") sysfonts::font_add_google("Libre Franklin", family = "Libre Franklin")
sysfonts::font_add_google("Source Serif 4", family = "Source Serif 4") sysfonts::font_add_google("Source Serif 4", family = "Source Serif 4")
sysfonts::font_add_google("JetBrains Mono", family = "JetBrains Mono") sysfonts::font_add_google("JetBrains Mono", family = "JetBrains Mono")
showtext::showtext_auto() showtext::showtext_auto()
.cv_fonts_loaded <<- TRUE
invisible(NULL) .cv_state$fonts_loaded <- TRUE
invisible(TRUE)
} }
.onLoad <- function(libname, pkgname) { .onLoad <- function(libname, pkgname) {
+9 -7
View File
@@ -135,12 +135,12 @@ use_civilytics_theme <- function(path = ".", force = FALSE) {
.copy_pkg_file(file.path("quarto/latex", f), file.path("latex", f), path, force) .copy_pkg_file(file.path("quarto/latex", f), file.path("latex", f), path, force)
} }
# Typst # Typst — shipped as template-partials so Quarto keeps its Skylighting
.copy_pkg_file( # definitions and syntax-highlighted code blocks render (see issue #12)
"quarto/typst/civilytics-typst.typ", typst_files <- c("typst-template.typ", "typst-show.typ")
"typst/civilytics-typst.typ", for (f in typst_files) {
path, force .copy_pkg_file(file.path("quarto/typst", f), file.path("typst", f), path, force)
) }
# Logos — for _brand.yml (expects assets/logo/) # Logos — for _brand.yml (expects assets/logo/)
.copy_logos("assets/logo", path, force) .copy_logos("assets/logo", path, force)
@@ -158,7 +158,9 @@ use_civilytics_theme <- function(path = ".", force = FALSE) {
message(" include-in-header: latex/civilytics.tex") message(" include-in-header: latex/civilytics.tex")
message(" include-before-body: latex/civilytics-title.tex") message(" include-before-body: latex/civilytics-title.tex")
message(" typst:") message(" typst:")
message(" template: typst/civilytics-typst.typ") message(" template-partials:")
message(" - typst/typst-template.typ")
message(" - typst/typst-show.typ")
message("---") message("---")
message("\nSee examples/report.qmd for a complete example.") message("\nSee examples/report.qmd for a complete example.")
invisible(NULL) invisible(NULL)
+10 -8
View File
@@ -36,10 +36,12 @@
#' to [civilytics_colors]`["paper_2"]` (`#F2EDE4`). #' to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).
#' @param grid Character. Which major gridlines to draw: `"y"` (default, #' @param grid Character. Which major gridlines to draw: `"y"` (default,
#' horizontal only), `"x"` (vertical only), `"both"`, or `"none"`. #' horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.
#' @param paper_bg Logical. If `TRUE` (default), fill the plot and panel #' @param paper_bg Logical. If `TRUE`, fill the plot and panel backgrounds
#' backgrounds with the warm `paper` color. Set to `FALSE` for a #' with the warm `paper` color (Civilytics cream). Default is `FALSE`
#' transparent background (useful for slides or overlay on colored #' (transparent) so that figures composite cleanly onto any background.
#' surfaces). #' Set to `TRUE` for the branded cream canvas. Note: a transparent device
#' background (e.g., `dev = "ragg_png"`, `dev.args = list(background =
#' "transparent")`) is also needed for fully-transparent PNG exports.
#' #'
#' @section Font size hierarchy: #' @section Font size hierarchy:
#' All text sizes are derived from `font_size` using relative scale factors. #' All text sizes are derived from `font_size` using relative scale factors.
@@ -68,7 +70,7 @@
#' \dontrun{ #' \dontrun{
#' library(ggplot2) #' library(ggplot2)
#' #'
#' # Default editorial theme #' # Default — transparent background for embedding
#' ggplot(mpg, aes(displ, hwy)) + #' ggplot(mpg, aes(displ, hwy)) +
#' geom_point() + #' geom_point() +
#' theme_civilytics() #' theme_civilytics()
@@ -79,10 +81,10 @@
#' scale_color_civilytics() + #' scale_color_civilytics() +
#' theme_civilytics(grid = "both") #' theme_civilytics(grid = "both")
#' #'
#' # Transparent background for embedding #' # Branded cream background (opt-in)
#' ggplot(mpg, aes(displ, hwy)) + #' ggplot(mpg, aes(displ, hwy)) +
#' geom_point() + #' geom_point() +
#' theme_civilytics(paper_bg = FALSE) #' theme_civilytics(paper_bg = TRUE)
#' #'
#' # Larger text for poster or display #' # Larger text for poster or display
#' ggplot(mpg, aes(displ, hwy)) + #' ggplot(mpg, aes(displ, hwy)) +
@@ -102,7 +104,7 @@ theme_civilytics <- function(
accent = unname(civilytics_colors["ember_600"]), accent = unname(civilytics_colors["ember_600"]),
strip_color = unname(civilytics_colors["paper_2"]), strip_color = unname(civilytics_colors["paper_2"]),
grid = c("y", "x", "both", "none"), grid = c("y", "x", "both", "none"),
paper_bg = TRUE) { paper_bg = FALSE) {
grid <- match.arg(grid) grid <- match.arg(grid)
half_line <- font_size / 2 half_line <- font_size / 2
+4 -2
View File
@@ -2,7 +2,7 @@
title: "Who pays when rent outpaces wages?" title: "Who pays when rent outpaces wages?"
subtitle: "A 12-county analysis of cost-burdened renter households, 2019–2024." subtitle: "A 12-county analysis of cost-burdened renter households, 2019–2024."
author: author:
- name: "Civilytics Research" - name: "Jared Knowles"
affiliation: "Civilytics Consulting" affiliation: "Civilytics Consulting"
date: "2026-04-15" date: "2026-04-15"
abstract: | abstract: |
@@ -19,7 +19,9 @@ format:
toc: true toc: true
toc-location: right toc-location: right
typst: typst:
template: ../typst/civilytics-typst.typ template-partials:
- ../typst/typst-template.typ
- ../typst/typst-show.typ
pdf: pdf:
include-in-header: ../latex/civilytics.tex include-in-header: ../latex/civilytics.tex
include-before-body: ../latex/civilytics-title.tex include-before-body: ../latex/civilytics-title.tex
+2 -2
View File
@@ -55,11 +55,11 @@ Big idea goes here.
> Rent has outpaced wages in every county we studied. > Rent has outpaced wages in every county we studied.
Civilytics Research, 2026 Civilytics Consulting, 2026
## Thank you {.thank-you} ## Thank you {.thank-you}
Questions? Questions?
- jared@civilytics.com - jared@civilytics.com
- civilytics.consulting - civilytics.com
+6 -3
View File
@@ -2,11 +2,16 @@
% Replaces Quarto's default \maketitle. Uses values from YAML % Replaces Quarto's default \maketitle. Uses values from YAML
% (\thetitle, \theauthor, \thedate) plus an \ifabstract block. % (\thetitle, \theauthor, \thedate) plus an \ifabstract block.
% Guard: \thesubtitle is normally defined by civilytics.tex's subtitle
% capture; provide a fallback so this partial degrades gracefully if used
% without that preamble. See civilyticsR issue #13.
\providecommand{\thesubtitle}{}
\begin{titlepage} \begin{titlepage}
\pagecolor{paper} \pagecolor{paper}
\color{ink} \color{ink}
\vspace*{0.5in} \vspace*{0.5in}
{\sffamily\bfseries\scriptsize\color{ember}\MakeUppercase{— Civilytics Research}\par} {\sffamily\bfseries\scriptsize\color{ember}\MakeUppercase{— Civilytics Consulting}\par}
\vspace{12pt} \vspace{12pt}
{\displayfont\fontsize{32pt}{34pt}\selectfont\bfseries\color{ink}\thetitle\par} {\displayfont\fontsize{32pt}{34pt}\selectfont\bfseries\color{ink}\thetitle\par}
\vspace{8pt} \vspace{8pt}
@@ -33,8 +38,6 @@
% Pulse mark, in ember % Pulse mark, in ember
\begin{center} \begin{center}
\begin{tikzpicture}[overlay, remember picture]
\end{tikzpicture}
{\color{ember}\rule{40pt}{2pt}} {\color{ember}\rule{40pt}{2pt}}
\end{center} \end{center}
\end{titlepage} \end{titlepage}
+26 -3
View File
@@ -40,17 +40,40 @@
\color{ink} \color{ink}
% --- Fonts (require local install or fontspec lookup) --- % --- Fonts (require local install or fontspec lookup) ---
% Bold uses the family's native Bold weight (present in every Source Serif 4
% install). Do NOT hard-require a "SemiBold" face: the package installs no
% system fonts for the PDF path, and standard Source Serif 4 ships only
% Regular/Bold/Italic/BoldItalic. See civilyticsR issue #14.
\setmainfont{Source Serif 4}[ \setmainfont{Source Serif 4}[
UprightFont = *, UprightFont = *,
ItalicFont = * Italic, ItalicFont = * Italic,
BoldFont = * SemiBold,
BoldItalicFont = * SemiBold Italic,
Ligatures = TeX, Ligatures = TeX,
] ]
\setsansfont{Inter}[Ligatures = TeX] \setsansfont{Inter}[Ligatures = TeX]
\setmonofont{JetBrains Mono}[Scale = 0.92] \setmonofont{JetBrains Mono}[Scale = 0.92]
\newfontfamily\displayfont{Libre Franklin}[Ligatures = TeX] \newfontfamily\displayfont{Libre Franklin}[Ligatures = TeX]
% --- Subtitle capture ---
% Quarto/pandoc defines \subtitle (which appends to \@title) but never
% \thesubtitle, which the title page uses. This preamble is emitted before
% pandoc's \providecommand{\subtitle}, so our definition wins: capture the
% subtitle into \thesubtitle instead. See civilyticsR issue #13.
\makeatletter
\providecommand{\thesubtitle}{}
\def\subtitle#1{\renewcommand{\thesubtitle}{#1}}
\makeatother
% --- Use the Civilytics title page, not pandoc's default ---
% civilytics-title.tex (include-before-body) IS the title page. Quarto emits
% its default \maketitle + abstract *before* include-before-body, which would
% print a second, unstyled title. Neutralise both here, in the preamble
% (runs at \begin{document}, before the default title). The branded title page
% does not display the abstract. See civilyticsR issue #13.
\AtBeginDocument{%
\renewcommand{\maketitle}{}%
\renewenvironment{abstract}{\setbox0=\vbox\bgroup}{\egroup}%
}
% --- Hyperlinks --- % --- Hyperlinks ---
\hypersetup{ \hypersetup{
colorlinks = true, colorlinks = true,
@@ -77,7 +100,7 @@
\renewcommand{\footrulewidth}{0pt} \renewcommand{\footrulewidth}{0pt}
\fancyhead[L]{\sffamily\scriptsize\color{ink3}\MakeUppercase{Civilytics Consulting}} \fancyhead[L]{\sffamily\scriptsize\color{ink3}\MakeUppercase{Civilytics Consulting}}
\fancyhead[R]{\sffamily\scriptsize\color{ink3}\thetitle} \fancyhead[R]{\sffamily\scriptsize\color{ink3}\thetitle}
\fancyfoot[L]{\sffamily\scriptsize\color{ink3}civilytics.consulting} \fancyfoot[L]{\sffamily\scriptsize\color{ink3}civilytics.com}
\fancyfoot[C]{\sffamily\scriptsize\color{ink3}\thepage} \fancyfoot[C]{\sffamily\scriptsize\color{ink3}\thepage}
\fancyfoot[R]{\sffamily\scriptsize\color{ink3}\textcopyright\ 2026} \fancyfoot[R]{\sffamily\scriptsize\color{ink3}\textcopyright\ 2026}
+17
View File
@@ -0,0 +1,17 @@
// Civilytics — Typst show/entry partial for Quarto (typst-show.typ).
// Pairs with typst-template.typ. Quarto appends the rendered document body
// after this partial, so this file intentionally ends with the show rule and
// no trailing body token. (Do not write that token in a comment here: Quarto
// interpolates its template variables even inside comments.)
// Title/subtitle/date are wrapped in [ ] so arbitrary text (including words
// that are Typst keywords like "for"/"in") is treated as content, not code.
// See civilyticsR issue #12.
#show: doc => civilytics(
title: [$title$],
$if(subtitle)$subtitle: [$subtitle$],$endif$
$if(by-author)$authors: ($for(by-author)$"$it.name.literal$",$endfor$),$endif$
$if(date)$date: [$date$],$endif$
$if(abstract)$abstract: [$abstract$],$endif$
toc: $if(toc)$true$else$false$endif$,
doc
)
@@ -1,9 +1,15 @@
// ============================================================= // =============================================================
// Civilytics — Typst template for Quarto PDF // Civilytics — Typst template partial for Quarto PDF (typst-template.typ).
// Shipped as a Quarto template-partial (paired with typst-show.typ) rather
// than a full `template:` so Quarto keeps its own `definitions` partial —
// which defines Skylighting/token functions needed for syntax-highlighted
// code blocks. See civilyticsR issue #12.
// Usage in YAML: // Usage in YAML:
// format: // format:
// typst: // typst:
// template: quarto/typst/civilytics-typst.typ // template-partials:
// - quarto/typst/typst-template.typ
// - quarto/typst/typst-show.typ
// ============================================================= // =============================================================
#let paper-bg = rgb("#FAF7F2") #let paper-bg = rgb("#FAF7F2")
@@ -54,7 +60,7 @@
grid( grid(
columns: (1fr, auto, 1fr), columns: (1fr, auto, 1fr),
align: (left, center, right), align: (left, center, right),
[civilytics.consulting], [civilytics.com],
counter(page).display("1 / 1", both: true), counter(page).display("1 / 1", both: true),
[© 2026] [© 2026]
) )
@@ -158,7 +164,7 @@
if title != none { if title != none {
block[ block[
#set text(font: sans-stack, size: 8pt, weight: 600, fill: ember, tracking: 0.1em) #set text(font: sans-stack, size: 8pt, weight: 600, fill: ember, tracking: 0.1em)
#upper[— Civilytics Research] #upper[— Civilytics Consulting]
] ]
v(8pt) v(8pt)
block[ block[
@@ -229,16 +235,3 @@
doc doc
} }
// Quarto entry point
#show: doc => civilytics(
title: $title$,
$if(subtitle)$subtitle: $subtitle$,$endif$
$if(by-author)$authors: ($for(by-author)$"$it.name.literal$",$endfor$),$endif$
$if(date)$date: $date$,$endif$
$if(abstract)$abstract: [$abstract$],$endif$
toc: $if(toc)$true$else$false$endif$,
doc
)
$body$
+15 -7
View File
@@ -4,17 +4,25 @@
\alias{civilytics_load_fonts} \alias{civilytics_load_fonts}
\title{Load Civilytics brand fonts} \title{Load Civilytics brand fonts}
\usage{ \usage{
civilytics_load_fonts() civilytics_load_fonts(force = FALSE)
}
\arguments{
\item{force}{Logical. If \code{TRUE}, reload fonts even if they were already
loaded in this session. Default \code{FALSE}.}
} }
\value{ \value{
Invisibly returns `NULL`. Invisibly returns \code{TRUE} if fonts were loaded, \code{FALSE} if skipped
(already loaded and \code{force = FALSE}).
} }
\description{ \description{
Downloads Inter and Libre Franklin from Google Fonts via Downloads Inter, Libre Franklin, Source Serif 4 and JetBrains Mono from
[sysfonts::font_add_google()], then calls [showtext::showtext_auto()] so Google Fonts via \code{sysfonts::font_add_google()}, then calls
that all graphics devices render text with those fonts. This is called \code{showtext::showtext_auto()} so that all graphics devices render text with
automatically when the package loads; use this function to retry if the those fonts. This is called automatically when the package loads; use this
initial load failed (e.g., the machine was offline at load time). function to retry if the initial load failed (e.g., the machine was offline
at load time).
Subsequent calls within the same session are no-ops unless \code{force = TRUE}.
} }
\examples{ \examples{
\dontrun{ \dontrun{
+10 -8
View File
@@ -17,7 +17,7 @@ theme_civilytics(
accent = unname(civilytics_colors["ember_600"]), accent = unname(civilytics_colors["ember_600"]),
strip_color = unname(civilytics_colors["paper_2"]), strip_color = unname(civilytics_colors["paper_2"]),
grid = c("y", "x", "both", "none"), grid = c("y", "x", "both", "none"),
paper_bg = TRUE paper_bg = FALSE
) )
} }
\arguments{ \arguments{
@@ -56,10 +56,12 @@ to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{grid}{Character. Which major gridlines to draw: `"y"` (default, \item{grid}{Character. Which major gridlines to draw: `"y"` (default,
horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.} horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas. Note: a transparent device
background (e.g., `dev = "ragg_png"`, `dev.args = list(background =
"transparent")`) is also needed for fully-transparent PNG exports.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
@@ -105,7 +107,7 @@ shrinkage.
\dontrun{ \dontrun{
library(ggplot2) library(ggplot2)
# Default editorial theme # Default — transparent background for embedding
ggplot(mpg, aes(displ, hwy)) + ggplot(mpg, aes(displ, hwy)) +
geom_point() + geom_point() +
theme_civilytics() theme_civilytics()
@@ -116,10 +118,10 @@ ggplot(mpg, aes(displ, hwy, colour = class)) +
scale_color_civilytics() + scale_color_civilytics() +
theme_civilytics(grid = "both") theme_civilytics(grid = "both")
# Transparent background for embedding # Branded cream background (opt-in)
ggplot(mpg, aes(displ, hwy)) + ggplot(mpg, aes(displ, hwy)) +
geom_point() + geom_point() +
theme_civilytics(paper_bg = FALSE) theme_civilytics(paper_bg = TRUE)
# Larger text for poster or display # Larger text for poster or display
ggplot(mpg, aes(displ, hwy)) + ggplot(mpg, aes(displ, hwy)) +
+4 -4
View File
@@ -56,10 +56,10 @@ to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{grid}{Character. Which major gridlines to draw: `"y"` (default, \item{grid}{Character. Which major gridlines to draw: `"y"` (default,
horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.} horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
+4 -4
View File
@@ -52,10 +52,10 @@ design system.}
\item{strip_color}{Character. Hex code for facet strip background. Defaults \item{strip_color}{Character. Hex code for facet strip background. Defaults
to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).} to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
+4 -4
View File
@@ -52,10 +52,10 @@ design system.}
\item{strip_color}{Character. Hex code for facet strip background. Defaults \item{strip_color}{Character. Hex code for facet strip background. Defaults
to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).} to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
+4 -4
View File
@@ -56,10 +56,10 @@ to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{grid}{Character. Which major gridlines to draw: `"y"` (default, \item{grid}{Character. Which major gridlines to draw: `"y"` (default,
horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.} horizontal only), `"x"` (vertical only), `"both"`, or `"none"`.}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
+4 -4
View File
@@ -52,10 +52,10 @@ design system.}
\item{strip_color}{Character. Hex code for facet strip background. Defaults \item{strip_color}{Character. Hex code for facet strip background. Defaults
to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).} to [civilytics_colors]`["paper_2"]` (`#F2EDE4`).}
\item{paper_bg}{Logical. If `TRUE` (default), fill the plot and panel \item{paper_bg}{Logical. If `TRUE`, fill the plot and panel backgrounds
backgrounds with the warm `paper` color. Set to `FALSE` for a with the warm `paper` color (Civilytics cream). Default is `FALSE`
transparent background (useful for slides or overlay on colored (transparent) so that figures composite cleanly onto any background.
surfaces).} Set to `TRUE` for the branded cream canvas.}
} }
\value{ \value{
A complete ggplot2 [ggplot2::theme()] object. A complete ggplot2 [ggplot2::theme()] object.
+6 -1
View File
@@ -133,8 +133,13 @@ test_that("theme_civilytics uses brand ink color for text", {
expect_equal(th$text$colour, unname(civilytics_colors["ink"])) expect_equal(th$text$colour, unname(civilytics_colors["ink"]))
}) })
test_that("theme_civilytics uses brand paper color for plot background", { test_that("theme_civilytics has transparent background by default", {
th <- theme_civilytics() th <- theme_civilytics()
expect_true(is.na(th$plot.background$fill))
})
test_that("theme_civilytics uses brand paper color when paper_bg = TRUE", {
th <- theme_civilytics(paper_bg = TRUE)
expect_equal(th$plot.background$fill, unname(civilytics_colors["paper"])) expect_equal(th$plot.background$fill, unname(civilytics_colors["paper"]))
}) })