Skip to content

StatistikStadtZuerich/zuericssstyle

Repository files navigation

CRAN status R-CMD-check GitLab Pipeline

zuericssstyle Hexagon logo for zuericssstyle R package

zuericssstyle is an R package that provides CSS styles and styled Shiny components aligned with the corporate design of the City of Zurich. The package includes reusable styling utilities and widgets that enable the development of Shiny applications consistent with the visual identity guidelines of the City of Zurich.

The components included in this package are based on styling and widgets previously developed and used by Statistik Stadt Zürich for building Shiny applications.

Installation

You can install the latest version of zuericssstyle directly from this repository:

# install.packages("devtools")
devtools::install_github("StatistikStadtZuerich/zuericssstyle")

Alternatively, you can download the repository as a ZIP archive. After extracting the files to a local directory (e.g. your Desktop), install the package using:

remotes::install_local("<path_to_location>/zuericssstyle-main")

Version

To check the currently installed version of zuericssstyle, run:

packageVersion("zuericssstyle")

Usage

zuericssstyle provides a set of wrapper functions around widgets from Shiny to apply styling consistent with the corporate design of the City of Zurich. These wrapper functions extend the original widgets while allowing additional arguments to be passed through the underlying Shiny functions.

Styled Shiny Widgets

All widgets styled by zuericssstyle require the package's CSS to be loaded. The CSS is automatically included in the HTML dependency when using either ssz_page() or add_zcss_deps().

The recommended approach is to use ssz_page() as a styled drop-in replacement for fluidPage() from Shiny:

# preferred: styled page wrapper
ui <- ssz_page(...)

If your application uses a different page layout (e.g. fixedPage()), you can instead wrap the UI definition with add_zcss_deps() to include the required CSS dependencies:

# alternative: include styling and icons around your UI
ui <- add_zcss_deps(fixedPage(...))

This ensures that all zuericssstyle widgets are rendered with the correct styling without additional setup. All additional arguments supported by the underlying Shiny functions can be passed to the corresponding ssz* functions.

Example applications in the inst/example folder demonstrate and allow you to test every widget included in this package. The following sections introduce all styled widgets.

Numeric Input

sszNumericInput() provides a styled numeric input field based on numericInput() from Shiny.

sszNumericInput("number", "Zahl", 4)

Select Input

sszSelectInput() provides a styled version of selectInput() from Shiny.

sszSelectInput(
    "select",
    "Flughafen",
    choices = c("HOU", "LAX", "JFK", "SEA"),
    selected = "LAX"
  )

sszSelectInput(
    "selectmultiple",
    "Flughafen (mehrere)",
    choices = c("HOU", "LAX", "JFK", "SEA"),
    multiple = TRUE
  )

Radio Buttons

sszRadioButtons() provides a styled version of radioButtons() from Shiny.

sszRadioButtons(
   inputId = "ButtonGroupLabel",
   label = "Flughafen:",
   choices = c("EWR", "JFK", "LGA"),
   selected = "JFK"
   )

sszRadioButtons(
    inputId = "ButtonGroupLabelHorizontal",
    label = "Flughafen",
    choices = c("HOU", "LAX", "JFK"),
    selected = "JFK",
    inline = TRUE
  )

Radio Group Buttons

sszRadioGroupButtons() provides a styled version of radioGroupButtons() from shinyWidgets.

sszRadioGroupButtons(
    inputId = "years",
    choices = 2022:2024,
    selected = 2022 # default value
  )

Text Input

sszTextInput() provides a styled version of textInput() from Shiny.

sszTextInput("suchfeld", "Name:")

Autocomplete

sszAutocompleteInput() provides an autocomplete-enabled text input based on autocomplete_input() from the dqshiny package.

sszAutocompleteInput(
            "name",
            "Geben Sie einen Namen ein",
            options = c("aoqiheu", "acdzvxp", "aqneluk", "aeloxch")
          )

Slider Input

sszSliderInput() provides a styled version of sliderInput() from Shiny. Note: As of 2024-10-16, the slider styling is not officially part of the corporate design guidelines. Therefore, the appearance of this widget may change in future versions of this package.

sszSliderInput("choose_numbers",
    "Input",
    value = c(30, 60),
    min = 0,
    max = 100
  )

sszSliderInput("choose_number",
    "Single Input",
    value = c(30),
    min = 0,
    max = 100
  )

Action Button

sszActionButton() provides a styled version of actionButton() from Shiny.

sszActionButton("ActionButtonId", "Abfrage starten")

Download Buttons

sszDownloadButton() provides a styled download button based on downloadButton() from Shiny.

sszDownloadButton("csvDownload",
      label = "CSV",
      image = icons_stzh()("download")
    )

sszDownloadButton("excelDownload",
      label = "XLSX",
      image = icons_stzh()("download")
    )

sszDownloadButton("downloadDownload",
      image = icons_stzh()("download")
    )

sszOgdDownload("ogdDownload",
      href = "https://data.stadt-zuerich.ch/",
      image = icons_stzh()("external-link")
    )

The label argument specifies the text displayed on the button. It must be one of "Download", "CSV", or "XLSX". The default value is "Download".

The image argument allows an icon or image to be displayed before the button text. The default is NULL, meaning no icon is shown. zuericssstyle provides a set of SVG icons shipped in the inst/icons folder and exposes a convenience helper, icons_stzh(), to retrieve them as an icons::icon_set() object. Use icons_stzh() to embed icons in buttons and other widgets.

A button linking to an external resource can be created using sszOgdDownload(). Provide the appropriate link in the href parameter.

Button Layout Helper

When you want several buttons displayed next to each other horizontally, wrap them in a container with the button-div CSS class. It applies a horizontal flex layout with space between items on wide screens and switches to a stacked column layout on small screens (see the responsive rules for .button-div and .downloadWrapperDiv).

Example:

div(
  class = "button-div",
  sszDownloadButton("csvDownload", label = "CSV"),
  div(class = "downloadWrapperDiv", 
      sszDownloadButton("excelDownload", label = "XLSX"),
      sszOgdDownload("ogdDownload",
                     href = "https://data.stadt-zuerich.ch/"
                     )
      )
)

Date Range

sszDateRange() provides a styled version of dateRangeInput() from Shiny. By default, the language is German and the date format is dd.mm.yyyy. This and additional parameters to Shiny's dateRangeInput can be passed as parameters.

sszDateRange("DateRange", "Datum auswählen",
    start = "2001-01-01",
    end = "2010-12-31",
    min = "2001-01-01",
    max = "2012-12-21",
    separator = icons_stzh()("calendar"),
    weekstart = 1
  )

Date Selection with Air Datepicker

sszAirDatepickerInput() provides a styled wrapper around airDatepickerInput() from shinyWidgets. Unlike dateRangeInput(), it allows selecting years only or years and months, in addition to full dates. By default, the language is German and the date format is dd.mm.yyyy.

sszAirDatepickerInput(
          inputId = "airMonthStart2",
          label = "Datum auswählen",
          dateFormat = "MM-yyyy",
          view = "years",
          minView = "months",
          autoClose = TRUE,
          ssz_icon = icons_stzh()("calendar")
        )

Other Styling Options

bslib cards

Cards from bslib can be used both in Shiny applications and in other HTML outputs. The CSS included in zuericssstyle (both the general CSS and the Shiny-specific CSS, see below) provides styling for these card components.

When creating cards, we recommend using a heading element inside card_header to ensure consistent typography and spacing.

library(bslib) 

card(
  card_header(
    h5("A random header")
    ),
  card_body(
    markdown("Some text with a [link](https://www.stadt-zuerich.ch/de/politik-und-verwaltung/statistik-und-daten.html)")
    ),
  card_footer("a footer")
  )

Tables

zuericssstyle provides CSS classes to style reactable tables in a way that is consistent with the corporate design. The styling includes borderless, minimal design with subtle striped background for readability.

reactable(iris,
    paginationType = "simple",
    class = "table-striped"
    language = reactableLang(
      noData = "Keine Einträge gefunden",
      pageNumbers = "{page} von {pages}",
      pagePrevious = "\u276e",
      pageNext = "\u276f"
    )
  )

A pair of CSS helper classes are provided for reactable usage:

  • table-striped: applies a subtle stripe to even rows and disables hover highlighting (use when you want persistent row striping). Best used for static tables.
  • table-hover: no persistent stripes; rows highlight on hover (use when you prefer interactive hover feedback).

When setting one of those classes, the highlight and striped arguments in reactable no longer influence the appearance of the table.

Example:

reactable(iris, class = "ssz-striped")
reactable(iris, class = "ssz-hover")

Context Box

sszContextBox() provides a styled box for additional contextual information, such as definitions, explanations, or glossary entries. It is intended to give users background or context information without indicating a warning (see sszWarningBox()).

The layout uses a flexible container to align the icon and text, and applies package-specific CSS classes to ensure consistent styling.

The icon argument allows an icon or image to be displayed before the text. The default is NULL, meaning no icon is shown.

 sszContextBox(
    title = "Information mit Icon",
    text = "Laboris laborum aute id laboris culpa esse aliquip nisi anim velit. Minim sunt eiusmod do laborum amet ut magna. Labore dolore id nostrud enim Lorem pariatur ad dolore id eiusmod adipisicing laboris laborum minim.",
    icon = icons_ssz("info-help-filled")
  )

  sszContextBox(
    title = "Informationen ohne Icon",
    text = "Laboris laborum aute id laboris culpa esse aliquip nisi anim velit. Minim sunt eiusmod do laborum amet ut magna. Labore dolore id nostrud enim Lorem pariatur ad dolore id eiusmod adipisicing laboris laborum minim."
  )

Info and Warning Box

sszInfoBox() provides a styled box for query-related informational messages, such as summaries or explanations about the current results. It is meant to convey neutral information regarding the query itself, rather than warnings or general context.

sszWarningBox() provides a styled warning box to alert users to potential issues, errors, or important considerations regarding the query or its results.

The layout uses a flexible container to align the icon and text, and applies package-specific CSS classes to ensure consistent styling. sszInfoBox() and sszWarningBox() use both the same CSS classes.

The icon argument allows an icon or image to be displayed before the text. The default is NULL, meaning no icon is shown.

sszInfoBox(
    title = "A message with the wrong sender will not be answered and will be deleted.",
    text = "Laboris laborum aute id laboris culpa esse aliquip nisi anim velit. Minim sunt eiusmod do laborum amet ut magna. Labore dolore id nostrud enim Lorem pariatur ad dolore id eiusmod adipisicing laboris laborum minim.",
    icon = icons_ssz("info-help-filled")
  )

sszWarningBox(
    title = "Title Error",
    text = "Laboris laborum aute id laboris culpa esse aliquip nisi anim velit. Minim sunt eiusmod do laborum amet ut magna. Labore dolore id nostrud enim Lorem pariatur ad dolore id eiusmod adipisicing laboris laborum minim.",
    icon = icons_ssz("important-warning-filled")
  )

Text

Normal paragraph text uses the proprietary display font (HelveticaNeueLTPro) and is sized at 18px. You can override this locally, but the package defaults provide consistent, readable body text. There is two text-specific utility classes in zuericssstyle :

  • .bold-text: apply this class to inline elements (links, spans, strong) to render them with the package's title/font family.

  • .dashed-list: a special list variant that removes the native marker and padding (useful for compact dashed-style lists). The package also provides counter-based ol and custom ul markers so markers align consistently across breakpoints.

p("This text will be ",
   strong(class = "bold-text", "bold"),
   "."
  )

tags$ul(class = "dashed-list",
  tags$li("First item"),
  tags$li("Second item")
)

Div for Chart Buttons

The .ssz-chart-buttons CSS class can be applied to a <div> to create a flexible layout with centered content and a bottom margin, suitable for grouping chart-related buttons.

Example usage:

div(
  class = "ssz-chart-buttons",
  sszRadioGroupButtons(
    inputId = "choice_year",
    choices = c(2022, 2023, 2024)
    )
  )

Tooltip

zuericssstyle also provides CSS classes for tooltip styling (.tooltip-container, .tooltip-title, .tooltip-content, .tooltip-row). For an example, see inst/examples/tooltip/app.R. This example demonstrates how to use the CSS classes only; it does not provide graphs fully styled according to the corporate design of the City uf Zurich. For fully styled charts, refer to the zueriplots documentation.

CSS File for HTML

If you need the CSS file to style an HTML report or other HTML outputs, use:

get_generic_css()

This will write the needed CSS file to your local folder. You can also specify a full file path (e.g. "C:/temp/mystyling.css") as a parameter.

Getting Help

If you encounter a bug, please open an issue or contact statistik@zuerich.ch.

About

A package with styled shiny UI functions and a css for styling according to the corporate design of the city of Zurich

Resources

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE
MIT
LICENSE.md

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors