diff --git a/DESCRIPTION b/DESCRIPTION index 8ae2c0d..05d8829 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,7 +8,6 @@ Authors@R: c(person("Boehringer-Ingelheim Pharma GmbH & Co.KG", role = c("cph", Description: DaVinci Module Manager. License: Apache License (>= 2) Imports: - golem (>= 0.3.1), shiny (>= 1.7.0), glue (>= 1.4.2), htmltools (>= 0.5.2), @@ -18,7 +17,6 @@ Imports: purrr (>= 0.3.4), dplyr (>= 1.0.3), dv.filter (>= 1.0.0), - dv.loader (>= 1.0.0), lubridate (>= 1.7.9.2), shinymeta (>= 0.2.0.1), shinyjs (>= 2.0.0), @@ -28,7 +26,7 @@ Imports: cli (>= 3.3.0) Encoding: UTF-8 LazyData: true -RoxygenNote: 7.3.0 +RoxygenNote: 7.3.1 Roxygen: list(markdown = TRUE) Suggests: testthat (>= 3.0.1), diff --git a/NAMESPACE b/NAMESPACE index 31924cd..807dc24 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,4 +22,3 @@ export(simple_UI) export(simple_server) importFrom(dplyr,"%>%") importFrom(dplyr,.data) -importFrom(golem,get_golem_options) diff --git a/NEWS.md b/NEWS.md index 8e1dbe1..6a8f086 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# dv.manager 2.1.1-9000 + +- Removes `golem` dependency + # dv.manager 2.1.1 - General code housekeeping diff --git a/R/app_config.R b/R/app_config.R index d5d423a..e69de29 100644 --- a/R/app_config.R +++ b/R/app_config.R @@ -1,29 +0,0 @@ -#' Access files in the current app -#' -#' @param ... Character vector specifying directory and or file to -#' point to inside the current package. -#' -#' @noRd -app_sys <- function(...) { - system.file(..., package = "dv.manager") -} - - -#' #' Read App Config -#' #' -#' #' @param value Value to retrieve from the config file. -#' #' @param config R_CONFIG_ACTIVE value. -#' #' @param use_parent Logical, scan the parent directory for config file. -#' #' -#' #' @noRd -#' get_golem_config <- function(value, -#' config = Sys.getenv("R_CONFIG_ACTIVE", "default"), -#' use_parent = TRUE) { -#' config::get( -#' value = value, -#' config = config, -#' # Modify this if your config file is somewhere else: -#' file = app_sys("golem-config.yml"), -#' use_parent = use_parent -#' ) -#' } diff --git a/R/app_server.R b/R/app_server.R index f0c018a..0bc4e92 100644 --- a/R/app_server.R +++ b/R/app_server.R @@ -1,10 +1,5 @@ #' Server side of the dv.manager #' -#' @section golem: -#' This server side is built as a golem application. Therefore it will make use of the [golem::get_golem_options] -#' functionality. Particularly, it will receive three variables through this channel: module_list, data and filter_data. -#' All this variables are specified in the [dv.manager::run_app()] call. -#' #' @section data: #' *data* is the fundamental data source for the application launched by the dv.manager #' - This data source is a named list of: @@ -49,34 +44,30 @@ #' #' @keywords internal -app_server <- function(input = NULL, output = NULL, session = NULL, id = NULL) { - if (is.null(id)) { - log_inform("As app") - return(app_server_golem(input, output, session)) # If id is null then I am calling it as a base app - } else { # Otherwise I am calling it as a module inside another app - return( - shiny::moduleServer( - id, - app_server_golem - ) - ) - } -} - -# Used for future decoupling from golem in the future -app_server_golem <- function(input, output, session) { +app_server <- function(input = NULL, output = NULL, session = NULL) { opts <- list( - "module_list" = golem::get_golem_options("module_list"), - "data" = golem::get_golem_options("data"), - "filter_data" = golem::get_golem_options("filter_data"), - "filter_key" = golem::get_golem_options("filter_key"), - "startup_msg" = golem::get_golem_options("startup_msg"), - "reload_period" = golem::get_golem_options("reload_period") + "module_list" = get_config("module_list"), + "data" = get_config("data"), + "filter_data" = get_config("filter_data"), + "filter_key" = get_config("filter_key"), + "startup_msg" = get_config("startup_msg"), + "reload_period" = get_config("reload_period") ) app_server_(input, output, session, opts) } +app_server_module <- function(id) { + opts <- list( + "module_list" = get_config("module_list"), + "data" = get_config("data"), + "filter_data" = get_config("filter_data"), + "filter_key" = get_config("filter_key"), + "startup_msg" = get_config("startup_msg"), + "reload_period" = get_config("reload_period") + ) + shiny::moduleServer(id = id, module = function(input, output, session) app_server_(input, output, session, opts)) +} app_server_ <- function(input, output, session, opts) { ns <- session[["ns"]] diff --git a/R/app_ui.R b/R/app_ui.R index 7018c99..86ad9aa 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -1,7 +1,7 @@ #' The application User-Interface using an HTML template #' #' @param id This parameter can be either an string id if the app_ui is being used as a module or -#' a request if the app_ui is being used as an standalone application created in golem then it becomes +#' a request if the app_ui is being used as an standalone application then it becomes #' a Internal parameter for `{shiny}` #' DO NOT REMOVE. #' @@ -20,8 +20,8 @@ app_ui <- function(id) { stop("Unknown value type in id") } - data <- golem::get_golem_options("data") - module_list <- golem::get_golem_options("module_list") + data <- get_config("data") + module_list <- get_config("module_list") log_inform("Initializing HTML template UI") log_inform(glue::glue( @@ -99,8 +99,8 @@ app_ui <- function(id) { ))))) shiny::fluidPage( - golem_add_external_resources(), - theme = get_app_theme(), # "bgc-color" = "#002f62"), + insert_header_add_resources(app_title = get_config("title")), + theme = get_app_theme(), class = "display-grid", sidebar, do.call(shiny::tabsetPanel, c( diff --git a/R/get_version.R b/R/get_version.R deleted file mode 100644 index 6309a12..0000000 --- a/R/get_version.R +++ /dev/null @@ -1,29 +0,0 @@ -#' Convenience function to return information relevant about the application -#' -#' It returns the Version, Branch and Commit data of the application to be shown inside the application ui. -#' -#' @noRd - -get_version <- function() { - if (golem::app_prod()) { - version <- utils::packageDescription("dv.manager", fields = "Version") # nolint - branch <- utils::packageDescription("dv.manager", fields = "Branch") # nolint - date <- utils::packageDescription("dv.manager", fields = "Date") - } else { - version <- get_desc_field("Version") - branch <- get_desc_field("Branch") - date <- get_desc_field("Date") - } - return(list(version = glue::glue("{branch}/{version}"), date = date)) -} - -get_desc_field <- function(field, path = ".") { - con <- file("DESCRIPTION") - on.exit(close(con)) - desc_content <- readLines(con) - idx <- which(startsWith(desc_content, paste0(field, ":"))) - value <- unlist(strsplit(desc_content[idx], - split = ": ", fixed = TRUE - ))[2] - return(value) -} diff --git a/R/golem_external_resources.R b/R/golem_external_resources.R deleted file mode 100644 index b63d831..0000000 --- a/R/golem_external_resources.R +++ /dev/null @@ -1,21 +0,0 @@ -#' Add external Resources to the Application -#' -#' This function is internally used to add external -#' resources inside the Shiny application. -#' -#' -#' @noRd -golem_add_external_resources <- function() { - bundle_path <- app_sys("app/www") - golem::add_resource_path("www", bundle_path) - - shiny::tags$head( - golem::bundle_resources( - path = bundle_path, - app_title = golem::get_golem_options("title") - ), - shinyjs::useShinyjs() - # Add here other external resources - # for example, you can add shinyalert::useShinyalert() - ) -} diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R deleted file mode 100644 index 42a1636..0000000 --- a/R/golem_utils_server.R +++ /dev/null @@ -1,63 +0,0 @@ -#' Inverted versions of in, is.null and is.na -#' -#' @noRd -#' -#' @examples -#' 1 %not_in% 1:10 -#' not_null(NULL) -`%not_in%` <- Negate(`%in%`) - -not_null <- Negate(is.null) - -not_na <- Negate(is.na) - -#' Removes the null from a vector -#' -#' @noRd -#' -#' @example -#' drop_nulls(list(1, NULL, 2)) -drop_nulls <- function(x) { - x[!sapply(x, is.null)] -} - -#' If x is `NULL`, return y, otherwise return x -#' -#' @param x,y Two elements to test, one potentially `NULL` -#' -#' @noRd -#' -#' @examples -#' NULL %||% 1 -"%||%" <- function(x, y) { # nolint - if (is.null(x)) { - y - } else { - x - } -} - -#' If x is `NA`, return y, otherwise return x -#' -#' @param x,y Two elements to test, one potentially `NA` -#' -#' @noRd -#' -#' @examples -#' NA %||% 1 -"%|NA|%" <- function(x, y) { # nolint start - if (is.na(x)) { - y - } else { - x - } -} # nolint end - -#' Typing reactiveValues is too long -#' -#' @inheritParams reactiveValues -#' @inheritParams reactiveValuesToList -#' -#' @noRd -rv <- shiny::reactiveValues -rvtl <- shiny::reactiveValuesToList diff --git a/R/golem_utils_ui.R b/R/golem_utils_ui.R deleted file mode 100644 index 0a5cbbf..0000000 --- a/R/golem_utils_ui.R +++ /dev/null @@ -1,303 +0,0 @@ -#' Turn an R list into an HTML list -#' -#' @param list An R list -#' @param class a class for the list -#' -#' @return an HTML list -#' @noRd -#' -#' @examples -#' list_to_li(c("a", "b")) -list_to_li <- function(list, class = NULL) { - if (is.null(class)) { - htmltools::tagList( - lapply( - list, - shiny::tags$li - ) - ) - } else { - res <- lapply( - list, - shiny::tags$li - ) - res <- lapply( - res, - function(x) { - htmltools::tagAppendAttributes( - x, - class = class - ) - } - ) - htmltools::tagList(res) - } -} - -list_to_p <- function(list, class = NULL) { - if (is.null(class)) { - htmltools::tagList( - lapply( - list, - shiny::tags$p - ) - ) - } else { - res <- lapply( - list, - shiny::tags$p - ) - res <- lapply( - res, - function(x) { - htmltools::tagAppendAttributes( - x, - class = class - ) - } - ) - htmltools::tagList(res) - } -} - -named_to_li <- function(list, class = NULL) { - if (is.null(class)) { - res <- mapply( - function(x, y) { - shiny::tags$li( - shiny::HTML( - sprintf("%s: %s", y, x) - ) - ) - }, - list, - names(list), - SIMPLIFY = FALSE - ) - shiny::tagList(res) - } else { - res <- mapply( - function(x, y) { - shiny::tags$li( - shiny::HTML( - sprintf("%s: %s", y, x) - ) - ) - }, - list, - names(list), - SIMPLIFY = FALSE - ) - res <- lapply( - res, - function(x) { - shiny::tagAppendAttributes( - x, - class = class - ) - } - ) - shiny::tagList(res) - } -} - -#' Remove a tag attribute -#' -#' @param tag the tag -#' @param ... the attributes to remove -#' -#' @return a new tag -#' @noRd -#' -#' @examples -#' a <- shiny::tags$p(src = "plop", "pouet") -#' tagRemoveAttributes(a, "src") -tagRemoveAttributes <- function(tag, ...) { # nolint - attrs <- as.character(list(...)) - for (i in seq_along(attrs)) { - tag$attribs[[attrs[i]]] <- NULL - } - tag -} - -#' Hide or display a tag -#' -#' @param tag the tag -#' -#' @return a tag -#' @noRd -#' -#' @examples -#' ## Hide -#' a <- shiny::tags$p(src = "plop", "pouet") -#' undisplay(a) -#' b <- shiny::actionButton("go_filter", "go") -#' undisplay(b) -undisplay <- function(tag) { - # if not already hidden - if ( - !is.null(tag$attribs$style) && - !grepl("display:\\s+none", tag$attribs$style) - ) { - tag$attribs$style <- paste( - "display: none;", - tag$attribs$style - ) - } else { - tag$attribs$style <- "display: none;" - } - tag -} - -display <- function(tag) { - if ( - !is.null(tag$attribs$style) && - grepl("display:\\s+none", tag$attribs$style) - ) { - tag$attribs$style <- gsub( - "(\\s)*display:(\\s)*none(\\s)*(;)*(\\s)*", - "", - tag$attribs$style - ) - } - tag -} - -#' Hide an elements by calling jquery hide on it -#' -#' @param id the id of the element to hide -#' -#' @noRd -#' -jq_hide <- function(id) { - shiny::tags$script(sprintf("$('#%s').hide()", id)) -} - -#' Add a red star at the end of the text -#' -#' Adds a red star at the end of the text -#' (for example for indicating mandatory fields). -#' -#' @param text the HTLM text to put before the red star -#' -#' @return an html element -#' @noRd -#' -#' @examples -#' with_red_star("Enter your name here") -with_red_star <- function(text) { - shiny::tags$span( - shiny::HTML( - paste0( - text, - shiny::tags$span( - style = "color:red", "*" - ) - ) - ) - ) -} - - - -#' Repeat tags$br -#' -#' @param times the number of br to return -#' -#' @return the number of br specified in times -#' @noRd -#' -#' @examples -#' rep_br(5) -rep_br <- function(times = 1) { - shiny::HTML(rep("
", times = times)) -} - -#' Create an url -#' -#' @param url the URL -#' @param text the text to display -#' -#' @return an a tag -#' @noRd -#' -#' @examples -#' enurl("https://www.thinkr.fr", "ThinkR") -enurl <- function(url, text) { - shiny::tags$a(href = url, text) -} - -#' Columns wrappers -#' -#' These are convenient wrappers around -#' `column(12, ...)`, `column(6, ...)`, `column(4, ...)`... -#' -#' @noRd -#' -col_12 <- function(...) { - shiny::column(12, ...) -} - -col_10 <- function(...) { - shiny::column(10, ...) -} - -col_8 <- function(...) { - shiny::column(8, ...) -} - -col_6 <- function(...) { - shiny::column(6, ...) -} - -col_4 <- function(...) { - shiny::column(4, ...) -} - -col_3 <- function(...) { - shiny::column(3, ...) -} - - -col_2 <- function(...) { - shiny::column(2, ...) -} - -col_1 <- function(...) { - shiny::column(1, ...) -} - -# UNCOMMENT AND USE -# -# -# To use this part of the UI -# -#' #' Include Content From a File -#' #' -#' #' Load rendered RMarkdown from a file and turn into HTML. -#' #' -#' #' @rdname includeRMarkdown -#' #' @export -#' #' -#' #' @importFrom rmarkdown render -#' #' @importFrom markdown markdownToHTML -#' #' @importFrom htmltools HTML -#' includeRMarkdown <- function(path) { -#' -#' md <- tempfile(fileext = '.md') -#' -#' on.exit(unlink(md),add = TRUE) -#' -#' rmarkdown::render( -#' path, -#' output_format = 'md_document', -#' output_dir = tempdir(), -#' output_file = md,quiet = TRUE -#' ) -#' -#' html <- markdown::markdownToHTML(md, fragment.only = TRUE) -#' -#' Encoding(html) <- "UTF-8" -#' -#' return(HTML(html)) -#' } diff --git a/R/run_app.R b/R/run_app.R index e9ea155..7d67df0 100644 --- a/R/run_app.R +++ b/R/run_app.R @@ -60,16 +60,14 @@ run_app <- function(data = NULL, app_args <- build_secure_arguments(azure_options, app_ui, app_server) } - - - golem_opts <- list() - golem_opts[["module_list"]] <- check_modules(module_list) - golem_opts[["data"]] <- check_data(data) - golem_opts[["filter_data"]] <- check_filter_data(filter_data, data) - golem_opts[["filter_key"]] <- check_filter_key(filter_key, data) - golem_opts[["startup_msg"]] <- check_startup_msg(startup_msg) - golem_opts[["title"]] <- title - golem_opts[["reload_period"]] <- get_reload_period(check_reload_period(reload_period)) + config <- list() + config[["module_list"]] <- check_modules(module_list) + config[["data"]] <- check_data(data) + config[["filter_data"]] <- check_filter_data(filter_data, data) + config[["filter_key"]] <- check_filter_key(filter_key, data) + config[["startup_msg"]] <- check_startup_msg(startup_msg) + config[["title"]] <- title + config[["reload_period"]] <- get_reload_period(check_reload_period(reload_period)) check_meta_mtime_attribute(data) @@ -87,12 +85,11 @@ run_app <- function(data = NULL, ) if (.launch) { - golem::with_golem_options( - app = do.call(shiny::shinyApp, call_args), - golem_opts = golem_opts - ) + app <- do.call(shiny::shinyApp, call_args) + app <- set_config(app, config) + app } else { - c(app_args, list(golem_opts = golem_opts)) + c(app_args, list(config = config)) } } diff --git a/R/utils-startup.R b/R/utils-startup.R new file mode 100644 index 0000000..6374642 --- /dev/null +++ b/R/utils-startup.R @@ -0,0 +1,54 @@ +set_config <- function(app, l) { + app$appOptions[["dv.manager.config"]] <- l + app +} + +get_config <- function(which = NULL) { + if (is.null(which)) { + shiny::getShinyOption("dv.manager.config") + } else { + shiny::getShinyOption("dv.manager.config")[[which]] + } +} + +get_raw_config <- function(app) { + app$appOptions[["dv.manager.config"]] +} + +insert_header_add_resources <- function(app_title = NULL, ...) { + shiny::tags$head( + title = app_title, + shinyjs::useShinyjs(), + add_manager_dependency(), + add_scoper_dependency(), + ... + ) +} + +add_manager_dependency <- function() { + htmltools::htmlDependency( + name = "dv.manager", + version = utils::packageVersion("dv.manager"), + src = app_sys("www/js"), + script = "init.js" + ) +} + +add_scoper_dependency <- function() { + htmltools::htmlDependency( + name = "scoper", + version = "0.0.0", + src = app_sys("www/js"), + script = "scoper.min.js" + ) +} + +#' Access files in the current app +#' +#' @param ... Character vector specifying directory and or file to +#' point to inside the current package. +#' +#' @noRd +app_sys <- function(...) { + system.file(..., package = "dv.manager") +} diff --git a/R/utils_css.R b/R/utils_css.R index fb26f75..70cf440 100644 --- a/R/utils_css.R +++ b/R/utils_css.R @@ -93,14 +93,14 @@ get_app_theme <- function(custom = FALSE, version = 3) { if (isFALSE(custom)) { theme <- bslib::bs_theme(version = version) %>% bslib::bs_add_variables("brand-primary" = "#002f62") %>% - bslib::bs_add_rules(sass::sass_file(app_sys("app/www/css/custom.scss"))) + bslib::bs_add_rules(sass::sass_file(app_sys("www/css/custom.scss"))) } else { theme <- bslib::bs_theme(version = version) %>% sass::sass_bundle(sass::sass_layer( defaults = list(sass::sass_file(app_sys("app/www/themes/_variables.scss"))), rules = list( - sass::sass_file(app_sys("app/www/themes/_dark.scss")), - sass::sass_file(app_sys("app/www/css/custom.scss")) + sass::sass_file(app_sys("www/themes/_dark.scss")), + sass::sass_file(app_sys("www/css/custom.scss")) ) )) %>% structure(class = class(bslib::bs_theme(version = version))) diff --git a/R/utils_importFrom.R b/R/utils_importFrom.R index 0a09e4e..028ebba 100644 --- a/R/utils_importFrom.R +++ b/R/utils_importFrom.R @@ -15,11 +15,3 @@ NULL #' @keywords internal #' @importFrom dplyr .data NULL - -#' get_golem_options from golem -#' -#' @name get_golem_options -#' @rdname import_from -#' @keywords internal -#' @importFrom golem get_golem_options -NULL diff --git a/inst/golem-config.yml b/inst/golem-config.yml deleted file mode 100644 index aa921f6..0000000 --- a/inst/golem-config.yml +++ /dev/null @@ -1,8 +0,0 @@ -default: - golem_name: dv.manager - golem_version: 0.0.0.9000 - app_prod: no -production: - app_prod: yes -dev: - golem_wd: !expr here::here() diff --git a/inst/www/css/custom.scss b/inst/www/css/custom.scss new file mode 100644 index 0000000..4ce7388 --- /dev/null +++ b/inst/www/css/custom.scss @@ -0,0 +1,354 @@ +// variable definitions +$primary: $brand-primary; +$secondary: #7292fc; +$color-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); +$color-text: #ffffff; +$border-radius: $border-radius-base; +$sidebar-width-open: 300px; +$sidebar-width-collapsed: 60px; +$color-scrollbar: #9b9b9b7f; +// end variable definitions + +body { + font-size: $font-size-base; +} + +/* navigation */ +#main_tab_panel { + &.nav { + display: flex; + flex-wrap: wrap; + background-color: $primary; + box-shadow: $color-shadow; + z-index: 998; + padding-right: 12rem; + + &:first-child { + & li:first-child > a::after { + border-bottom-left-radius: $border-radius; + } + border-bottom-left-radius: $border-radius; + } + + li { + a { + padding: 16px 20px; + text-transform: capitalize; + color: $color-text; + background-color: $primary; + color: $color-text; + + &::after { + content: ""; + position: absolute; + display: block; + left: 0; + width: 0; + bottom: 0; + height: 4px; + background: $secondary; + transition: width 0.5s cubic-bezier(0.455, 0.03, 0.515, 0.955); + } + } + + &:hover, + &.active { + a::after { + width: 100%; + } + } + } + } +} + +#btn-group { + position: fixed; + right: 1em; + top: 0.1em; + z-index: 999; + + .navbar-btn.navbar-btn { + background: none; + border: none; + outline: none; + color: $color-text; + } +} +/* end navigation */ + +.container-fluid { + height: 100vh; + width: auto; + padding: 0; + margin: 0; + display: grid; + grid-template-columns: min-content 1fr auto; + grid-column-gap: 1.6rem; + overflow: hidden; +} + +/* sidebar */ +.sidebar-container { + grid-column: 1 / 2; + grid-row: 1 / 2; + width: $sidebar-width-open; + transition: width 0.3s ease-in-out 0.1s; +} + +.grid-resize { + width: $sidebar-width-collapsed; +} + +body > .container-fluid > .tabbable { + grid-column: 2 / -1; + grid-row: 1 / 3; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: max-content 1fr 25px; + overflow: hidden; +} + +.sidebar { + width: $sidebar-width-open; + height: 100vh; + background-color: $primary; + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + transition: opacity 0.1s ease-in-out, width 0.3s ease-in-out 0.1s, + left 0.3s ease-in-out 0.1s; + box-shadow: $color-shadow; +} + +.tab-content { + grid-column: 1 / -1; + grid-row: 2 / 3; + overflow-y: auto; + overflow-x: auto; + padding-bottom: 2rem; + max-width: 96vw; + margin-top: 0; + padding-top: 2rem; + padding-right: 1.6rem; +} + +#main_tab_panel { + grid-column: 1 / -1; + grid-row: 1 / 2; +} + +.grid_page_date { + grid-column: 1 / -1; + grid-row: 3 / -1; + background-color: $primary; + color: $color-text; + padding-left: 0.8rem; + border-top-left-radius: $border-radius; + display: flex; + align-items: center; + + span { + margin-left: 1.2rem; + } +} + +input[type="checkbox"]#click { + display: none; +} + +@keyframes logo { + from { + opacity: 0; + transform: translateY(45px) + translateX($sidebar-width-open - $sidebar-width-collapsed); + } + to { + transform: translateY(45px) + translateX($sidebar-width-open - $sidebar-width-collapsed); + opacity: 1; + } +} + +.checkbox { + &:not(:checked) ~ .sidebar { + left: $sidebar-width-collapsed - $sidebar-width-open; + + .menu-contents, + .logo-text { + opacity: 0; + } + + .logo { + animation: logo 1.5s ease-in-out 0s 1 normal forwards; + } + } + + &:checked ~ .sidebar { + left: 0; + + .line-1 { + transform: rotate(-45deg) translate(-4px, 5px); + width: 2.5rem; + } + + .line-2 { + opacity: 0; + } + + .line-3 { + transform: rotate(45deg) translate(-4px, -5px); + width: 2.5rem; + } + } +} + +.menu-contents { + transition: opacity 0.2s ease-out; + align-self: stretch; + margin-top: 50px; + margin-bottom: 30px; + flex-grow: 1; + opacity: 1; +} + +#shiny_filter_panel { + height: 94vh; + display: flex; + flex-direction: column; + justify-content: flex-start; + + #shiny_filter { + flex: 1 0 auto; + display: flex; + flex-direction: column; + justify-content: flex-start; + } + .c-well { + min-height: 20px; + padding: 15px; + margin-bottom: 15px; + background-color: $body-bg; + } + + #dataset_selector { + flex: 0 0 auto; + } +} + +#global_filter-filters { + margin-top: 1rem; + .dropdown-menu { + left: $sidebar-width-open; + } +} + +#global_filter-controls { + overflow-y: auto; + overflow-x: hidden; + scrollbar-width: thin; + margin-right: -15px; + flex: 1 10 1vh; + min-height: 7.5rem; + padding: 25px 15px 15px !important; + margin-right: -15px !important; + margin-left: -15px !important; + + .dropdown-menu { + position: fixed; + top: 25vh; + left: $sidebar-width-open; + min-width: min-content; + + &.open { + left: 320px; + min-height: max-content; + height: max-content; + } + + &.inner { + position: inherit; + min-height: max-content; + overflow-x: hidden; + overflow-y: auto; + } + } +} + +@media (max-height: 920px) { + div.dropdown-menu.open { + height: 80vh; + overflow-y: auto; + } +} + +.sidebar { + .logo { + transition: all 0.2s ease-out 0.1s; + width: 40px; + margin: 5px 5px 5px 10px; + position: absolute; + left: 0; + background-color: #ffffff; + padding: 3px; + border-radius: 50%; + } + + .logo-text { + transition: opacity 0.2s ease-out 0.1s; + position: absolute; + font-size: 1.8rem; + color: $color-text; + margin-top: 1.2rem; + letter-spacing: 0.5rem; + } + + .menu-icon { + margin: 1.3rem; + cursor: pointer; + position: absolute; + right: 0; + + .line { + height: 0.2rem; + width: 2.5rem; + background-color: #ffffff; + margin: 0.4rem; + transition: all 0.5s; + } + + .line-1 { + width: 1.2rem; + } + + .line-2 { + width: 1.8rem; + } + + &:hover .line { + width: 2.5rem; + } + } +} +/* end sidebar */ + +#dataset_date, +#dataset_name { + font-size: 1.3rem; +} + +::-webkit-scrollbar { + width: 9px; + height: 9px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background-color: $color-scrollbar; + border-radius: $border-radius-base; + border: transparent; +} diff --git a/inst/www/js/init.js b/inst/www/js/init.js new file mode 100644 index 0000000..fc35a61 --- /dev/null +++ b/inst/www/js/init.js @@ -0,0 +1,15 @@ +// handle the dataset info bar +$(window).on("load", function () { + $(".grid_page_date").detach().appendTo($("#main_tab_panel").parent()); +}); + +//toggle sidebar resize +$(document).ready(function () { + $("input[type=checkbox][id=click]").change(function () { + if ($(this).is(":checked")) { + $(".sidebar-container").removeClass("grid-resize"); + } else { + $(".sidebar-container").addClass("grid-resize"); + } + }); +}); diff --git a/inst/www/js/scoper.min.js b/inst/www/js/scoper.min.js new file mode 100644 index 0000000..ac3c57a --- /dev/null +++ b/inst/www/js/scoper.min.js @@ -0,0 +1 @@ +function scoperInit(){var e=document.createElement("style");e.appendChild(document.createTextNode("")),document.head.appendChild(e),e.sheet.insertRule("body { visibility: hidden; }",0)}function scoper(e,t){var o=new RegExp("([^\r\n,{}]+)(,(?=[^}]*{)|s*{)","g");return e=e.replace(o,function(e,o,n){return o.match(/^\s*(@media|@.*keyframes|to|from|@font-face|1?[0-9]?[0-9])/)?o+n:(o.match(/:scope/)&&(o=o.replace(/([^\s]*):scope/,function(e,t){return""===t?"> *":"> "+t})),(o=o.replace(/^(\s*)/,"$1"+t+" "))+n)})}function scoperProcess(){var e=document.body.querySelectorAll("style[scoped]");if(0!==e.length){for(var t=document.head||document.getElementsByTagName("head")[0],o=0;o li > a { + font-size: $font-size-small; + } +} + +.btn-group.open .dropdown-toggle { + @include box-shadow(none); +} + +.dropdown-header { + font-size: $font-size-small; +} + +// Tables ===================================================================== + +table, +.table { + font-size: $font-size-small; + + a:not(.btn) { + color: #fff; + text-decoration: underline; + } + + .dropdown-menu a { + text-decoration: none; + } + + .text-muted { + color: $text-muted; + } + + > thead > tr > th, + > tbody > tr > th, + > tfoot > tr > th, + > thead > tr > td, + > tbody > tr > td, + > tfoot > tr > td { + border-color: transparent; + } + } + +// Forms ====================================================================== + +input, +textarea { + color: $input-color; +} + +label, +.radio label, +.checkbox label, +.help-block { + font-size: $font-size-small; +} + +.input-addon, +.input-group-addon { + color: $text-color; +} + +.has-warning { + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label, + .form-control-feedback { + color: $brand-warning; + } + + .form-control, + .form-control:focus { + border: 4px solid $brand-warning; + } + + .input-group-addon { + border: none; + } +} + +.has-error { + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label, + .form-control-feedback { + color: $brand-danger; + } + + .form-control, + .form-control:focus { + border: 4px solid $brand-danger; + } + + .input-group-addon { + border: none; + } +} + +.has-success { + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label, + .form-control-feedback { + color: $brand-success; + } + + .form-control, + .form-control:focus { + border: 4px solid $brand-success; + } + + .input-group-addon { + border: none; + } +} + +.form-control:focus { + @include box-shadow(none); +} + +.has-warning, +.has-error, +.has-success { + .form-control:focus { + @include box-shadow(none); + } +} + +// Navs ======================================================================= + +.nav { + .open > a, + .open > a:hover, + .open > a:focus { + border-color: transparent; + } +} + +.nav-tabs { + > li > a { + color: $text-color; + } +} + +.nav-pills { + > li > a { + color: $text-color; + } +} + +.pager { + a { + color: $text-color; + } +} + +// Indicators ================================================================= + +.alert { + color: #fff; + + a, + .alert-link { + color: #fff; + } +} + +.close { + opacity: 0.4; + + &:hover, + &:focus { + opacity: 1; + } +} + +// Progress bars ============================================================== + +// Containers ================================================================= + +.well { + @include box-shadow(none); +} + +a.list-group-item { + + &.active, + &.active:hover, + &.active:focus { + border: none; + } + + &-success { + &.active { + background-color: $state-success-bg; + } + + &.active:hover, + &.active:focus { + background-color: darken($state-success-bg, 5%); + } + } + + &-warning { + &.active { + background-color: $state-warning-bg; + } + + &.active:hover, + &.active:focus { + background-color: darken($state-warning-bg, 5%); + } + } + + &-danger { + &.active { + background-color: $state-danger-bg; + } + + &.active:hover, + &.active:focus { + background-color: darken($state-danger-bg, 5%); + } + } +} + +.panel { + border: none; + + &-default > .panel-heading { + background-color: $table-bg-hover; + color: $text-color; + } +} + +.thumbnail { + background-color: $well-bg; + border: none; +} + +.modal { + padding: 0; + + &-header, + &-footer { + background-color: $table-bg-hover; + border: none; + border-radius: 0; + } +} + +.popover { + &-title { + border: none; + } +} diff --git a/inst/www/themes/_variables.scss b/inst/www/themes/_variables.scss new file mode 100644 index 0000000..a6cbbf3 --- /dev/null +++ b/inst/www/themes/_variables.scss @@ -0,0 +1,850 @@ +$bootstrap-sass-asset-helper: false !default; +// Superhero 3.4.1 +// Variables +// -------------------------------------------------- + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 20%) !default; // #333 +$gray: lighten($gray-base, 33.5%) !default; // #555 +$gray-light: #4e5d6c !default; // #999 +$gray-lighter: #ebebeb !default; // #eee + +$brand-primary: #df691a !default; +$brand-success: #5cb85c !default; +$brand-info: #5bc0de !default; +$brand-warning: #f0ad4e !default; +$brand-danger: #d9534f !default; + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: #2b3e50 !default; +//** Global text color on ``. +$text-color: $gray-lighter !default; + +//** Global textual link color. +$link-color: $brand-primary !default; +//** Link hover color set via `darken()` function. +$link-hover-color: $link-color !default; +//** Link hover decoration. +$link-hover-decoration: underline !default; + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
`.
+$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
+
+$font-size-base: 14px !default;
+$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small: 12px !default;
+
+$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5: $font-size-base !default;
+$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base: 1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed: floor(
+  ($font-size-base * $line-height-base)
+) !default; // ~20px
+
+//** By default, this inherits from the ``.
+$headings-font-family: inherit !default;
+$headings-font-weight: 400 !default;
+$headings-line-height: 1.1 !default;
+$headings-color: inherit !default;
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+$icon-font-path: if(
+  $bootstrap-sass-asset-helper,
+  "bootstrap/",
+  "../fonts/bootstrap/"
+) !default;
+//** File name for all font files.
+$icon-font-name: "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id: "glyphicons_halflingsregular" !default;
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical: 8px !default;
+$padding-base-horizontal: 16px !default;
+
+$padding-large-vertical: 12px !default;
+$padding-large-horizontal: 24px !default;
+
+$padding-small-vertical: 5px !default;
+$padding-small-horizontal: 10px !default;
+
+$padding-xs-vertical: 1px !default;
+$padding-xs-horizontal: 5px !default;
+
+$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small: 1.5 !default;
+
+$border-radius-base: 0 !default;
+$border-radius-large: 0 !default;
+$border-radius-small: 0 !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color: #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg: $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicate dropdowns.
+$caret-width-base: 4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large: 5px !default;
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+$table-cell-padding: 6px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding: 3px !default;
+
+//** Default background color used for all tables.
+$table-bg: transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent: $gray-light !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover: darken($gray-light, 3%) !default;
+$table-bg-active: $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color: $gray-light !default;
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight: normal !default;
+
+$btn-default-color: #fff !default;
+$btn-default-bg: $gray-light !default;
+$btn-default-border: transparent !default;
+
+$btn-primary-color: #fff !default;
+$btn-primary-bg: $brand-primary !default;
+$btn-primary-border: transparent !default;
+
+$btn-success-color: #fff !default;
+$btn-success-bg: $brand-success !default;
+$btn-success-border: transparent !default;
+
+$btn-info-color: #fff !default;
+$btn-info-bg: $brand-info !default;
+$btn-info-border: transparent !default;
+
+$btn-warning-color: #fff !default;
+$btn-warning-bg: $brand-warning !default;
+$btn-warning-border: transparent !default;
+
+$btn-danger-color: #fff !default;
+$btn-danger-bg: $brand-danger !default;
+$btn-danger-border: transparent !default;
+
+$btn-link-disabled-color: $gray-light !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base: $border-radius-base !default;
+$btn-border-radius-large: $border-radius-large !default;
+$btn-border-radius-small: $border-radius-small !default;
+
+//== Forms
+//
+//##
+
+//** `` background color
+$input-bg: #fff !default;
+//** `` background color
+$input-bg-disabled: $gray-lighter !default;
+
+//** Text color for ``s
+$input-color: $body-bg !default;
+//** `` border color
+$input-border: transparent !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on ``s in CSS.
+$input-border-radius: $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large: $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small: $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus: transparent !default;
+
+//** Placeholder text color
+$input-color-placeholder: #ccc !default;
+
+//** Default `.form-control` height
+$input-height-base: (
+  $line-height-computed + ($padding-base-vertical * 2) + 2
+) !default;
+//** Large `.form-control` height
+$input-height-large: (
+  ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) +
+    2
+) !default;
+//** Small `.form-control` height
+$input-height-small: (
+  floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) +
+    2
+) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom: 15px !default;
+
+$legend-color: $text-color !default;
+$legend-border-color: $gray-light !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg: $btn-default-bg !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: transparent !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled: not-allowed !default;
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg: $gray-light !default;
+//** Dropdown menu `border-color`.
+$dropdown-border: transparent !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border: transparent !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg: $body-bg !default;
+
+//** Dropdown link text color.
+$dropdown-link-color: $text-color !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color: $text-color !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg: darken($gray-light, 3%) !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color: $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg: $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color: $body-bg !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color: $body-bg !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color: #000 !default;
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar: 1000 !default;
+$zindex-dropdown: 1000 !default;
+$zindex-popover: 1060 !default;
+$zindex-tooltip: 1070 !default;
+$zindex-navbar-fixed: 1030 !default;
+$zindex-modal-background: 1040 !default;
+$zindex-modal: 1050 !default;
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs: 480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min: $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone: $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm: 768px !default;
+$screen-sm-min: $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet: $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md: 992px !default;
+$screen-md-min: $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop: $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg: 1200px !default;
+$screen-lg-min: $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop: $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max: ($screen-sm-min - 1) !default;
+$screen-sm-max: ($screen-md-min - 1) !default;
+$screen-md-max: ($screen-lg-min - 1) !default;
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns: 12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width: 30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint: $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet: (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm: $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop: (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md: $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop: (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg: $container-large-desktop !default;
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height: 40px !default;
+$navbar-margin-bottom: $line-height-computed !default;
+$navbar-border-radius: $border-radius-base !default;
+$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical: (
+  ($navbar-height - $line-height-computed) / 2
+) !default;
+$navbar-collapse-max-height: 340px !default;
+
+$navbar-default-color: $text-color !default;
+$navbar-default-bg: $gray-light !default;
+$navbar-default-border: transparent !default;
+
+// Navbar links
+$navbar-default-link-color: $text-color !default;
+$navbar-default-link-hover-color: $navbar-default-link-color !default;
+$navbar-default-link-hover-bg: $dropdown-link-hover-bg !default;
+$navbar-default-link-active-color: $navbar-default-link-color !default;
+$navbar-default-link-active-bg: $dropdown-link-hover-bg !default;
+$navbar-default-link-disabled-color: #ccc !default;
+$navbar-default-link-disabled-bg: transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color: $navbar-default-link-color !default;
+$navbar-default-brand-hover-color: $navbar-default-link-color !default;
+$navbar-default-brand-hover-bg: transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg: $navbar-default-link-hover-bg !default;
+$navbar-default-toggle-icon-bar-bg: $text-color !default;
+$navbar-default-toggle-border-color: transparent !default;
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color: $text-color !default;
+$navbar-inverse-bg: $brand-primary !default;
+$navbar-inverse-border: transparent !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color: $text-color !default;
+$navbar-inverse-link-hover-color: $navbar-inverse-link-color !default;
+$navbar-inverse-link-hover-bg: darken($navbar-inverse-bg, 5%) !default;
+$navbar-inverse-link-active-color: $navbar-inverse-link-color !default;
+$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 5%) !default;
+$navbar-inverse-link-disabled-color: #444 !default;
+$navbar-inverse-link-disabled-bg: transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color: $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-bg: transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg: $navbar-inverse-link-hover-bg !default;
+$navbar-inverse-toggle-icon-bar-bg: $text-color !default;
+$navbar-inverse-toggle-border-color: transparent !default;
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding: 10px 15px !default;
+$nav-link-hover-bg: $gray-light !default;
+
+$nav-disabled-link-color: $gray-light !default;
+$nav-disabled-link-hover-color: $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color: transparent !default;
+
+$nav-tabs-link-hover-border-color: $gray-light !default;
+
+$nav-tabs-active-link-hover-bg: $body-bg !default;
+$nav-tabs-active-link-hover-color: $text-color !default;
+$nav-tabs-active-link-hover-border-color: $gray-light !default;
+
+$nav-tabs-justified-link-border-color: $gray-light !default;
+$nav-tabs-justified-active-link-border-color: $gray-light !default;
+
+//== Pills
+$nav-pills-border-radius: $border-radius-base !default;
+$nav-pills-active-link-hover-bg: $component-active-bg !default;
+$nav-pills-active-link-hover-color: $component-active-color !default;
+
+//== Pagination
+//
+//##
+
+$pagination-color: $text-color !default;
+$pagination-bg: $gray-light !default;
+$pagination-border: transparent !default;
+
+$pagination-hover-color: $text-color !default;
+$pagination-hover-bg: $table-bg-hover !default;
+$pagination-hover-border: transparent !default;
+
+$pagination-active-color: $text-color !default;
+$pagination-active-bg: $brand-primary !default;
+$pagination-active-border: transparent !default;
+
+$pagination-disabled-color: darken($table-bg-hover, 10%) !default;
+$pagination-disabled-bg: $gray-light !default;
+$pagination-disabled-border: transparent !default;
+
+//== Pager
+//
+//##
+
+$pager-bg: $pagination-bg !default;
+$pager-border: $pagination-border !default;
+$pager-border-radius: 15px !default;
+
+$pager-hover-bg: $pagination-hover-bg !default;
+
+$pager-active-bg: $pagination-active-bg !default;
+$pager-active-color: $pagination-active-color !default;
+
+$pager-disabled-color: $pagination-disabled-color !default;
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding: 30px !default;
+$jumbotron-color: inherit !default;
+$jumbotron-bg: $gray-light !default;
+$jumbotron-heading-color: inherit !default;
+$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text: $text-color !default;
+$state-success-bg: $brand-success !default;
+$state-success-border: transparent !default;
+
+$state-info-text: $text-color !default;
+$state-info-bg: $brand-info !default;
+$state-info-border: transparent !default;
+
+$state-warning-text: $text-color !default;
+$state-warning-bg: $brand-warning !default;
+$state-warning-border: transparent !default;
+
+$state-danger-text: $text-color !default;
+$state-danger-bg: $brand-danger !default;
+$state-danger-border: transparent !default;
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width: 200px !default;
+//** Tooltip text color
+$tooltip-color: #fff !default;
+//** Tooltip background color
+$tooltip-bg: #000 !default;
+$tooltip-opacity: 0.9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width: 5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color: $tooltip-bg !default;
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg: $gray-light !default;
+//** Popover maximum width
+$popover-max-width: 276px !default;
+//** Popover border color
+$popover-border-color: transparent !default;
+//** Popover fallback border color
+$popover-fallback-border-color: transparent !default;
+
+//** Popover title background color
+$popover-title-bg: $table-bg-hover !default;
+
+//** Popover arrow width
+$popover-arrow-width: 10px !default;
+//** Popover arrow color
+$popover-arrow-color: $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color: transparent !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color: transparent !default;
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg: $gray-light !default;
+//** Primary label background color
+$label-primary-bg: $brand-primary !default;
+//** Success label background color
+$label-success-bg: $brand-success !default;
+//** Info label background color
+$label-info-bg: $brand-info !default;
+//** Warning label background color
+$label-warning-bg: $brand-warning !default;
+//** Danger label background color
+$label-danger-bg: $brand-danger !default;
+
+//** Default label text color
+$label-color: #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color: #fff !default;
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding: 20px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding: 15px !default;
+//** Modal title line-height
+$modal-title-line-height: $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg: $gray-light !default;
+//** Modal content border color
+$modal-content-border-color: transparent !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color: transparent !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg: #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity: 0.5 !default;
+//** Modal header border color
+$modal-header-border-color: $body-bg !default;
+//** Modal footer border color
+$modal-footer-border-color: $modal-header-border-color !default;
+
+$modal-lg: 900px !default;
+$modal-md: 600px !default;
+$modal-sm: 300px !default;
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding: 15px !default;
+$alert-border-radius: $border-radius-base !default;
+$alert-link-font-weight: bold !default;
+
+$alert-success-bg: $state-success-bg !default;
+$alert-success-text: $state-success-text !default;
+$alert-success-border: $state-success-border !default;
+
+$alert-info-bg: $state-info-bg !default;
+$alert-info-text: $state-info-text !default;
+$alert-info-border: $state-info-border !default;
+
+$alert-warning-bg: $state-warning-bg !default;
+$alert-warning-text: $state-warning-text !default;
+$alert-warning-border: $state-warning-border !default;
+
+$alert-danger-bg: $state-danger-bg !default;
+$alert-danger-text: $state-danger-text !default;
+$alert-danger-border: $state-danger-border !default;
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg: $gray-light !default;
+//** Progress bar text color
+$progress-bar-color: #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius: $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg: $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg: $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg: $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg: $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg: $brand-info !default;
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg: $gray-light !default;
+//** `.list-group-item` border color
+$list-group-border: transparent !default;
+//** List group border radius
+$list-group-border-radius: $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg: $table-bg-hover !default;
+//** Text color of active list items
+$list-group-active-color: $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg: $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border: $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color: $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg: $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color: $text-color !default;
+$list-group-link-hover-color: $list-group-link-color !default;
+$list-group-link-heading-color: $text-color !default;
+
+//== Panels
+//
+//##
+
+$panel-bg: $gray-light !default;
+$panel-body-padding: 15px !default;
+$panel-heading-padding: 10px 15px !default;
+$panel-footer-padding: $panel-heading-padding !default;
+$panel-border-radius: $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border: transparent !default;
+$panel-footer-bg: $table-bg-hover !default;
+
+$panel-default-text: $gray-dark !default;
+$panel-default-border: transparent !default;
+$panel-default-heading-bg: #f5f5f5 !default;
+
+$panel-primary-text: #fff !default;
+$panel-primary-border: transparent !default;
+$panel-primary-heading-bg: $brand-primary !default;
+
+$panel-success-text: $state-success-text !default;
+$panel-success-border: transparent !default;
+$panel-success-heading-bg: $state-success-bg !default;
+
+$panel-info-text: $state-info-text !default;
+$panel-info-border: transparent !default;
+$panel-info-heading-bg: $state-info-bg !default;
+
+$panel-warning-text: $state-warning-text !default;
+$panel-warning-border: transparent !default;
+$panel-warning-heading-bg: $state-warning-bg !default;
+
+$panel-danger-text: $state-danger-text !default;
+$panel-danger-border: transparent !default;
+$panel-danger-heading-bg: $state-danger-bg !default;
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding: 4px !default;
+//** Thumbnail background color
+$thumbnail-bg: $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border: #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius: $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color: $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding: 9px !default;
+
+//== Wells
+//
+//##
+
+$well-bg: $gray-light !default;
+$well-border: transparent !default;
+
+//== Badges
+//
+//##
+
+$badge-color: $text-color !default;
+//** Linked badge text color on hover
+$badge-link-hover-color: #fff !default;
+$badge-bg: $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color: $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg: #fff !default;
+
+$badge-font-weight: 300 !default;
+$badge-line-height: 1 !default;
+$badge-border-radius: 10px !default;
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical: 8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg: $gray-light !default;
+//** Breadcrumb text color
+$breadcrumb-color: $text-color !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color: $text-color !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator: "/" !default;
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6) !default;
+
+$carousel-control-color: #fff !default;
+$carousel-control-width: 15% !default;
+$carousel-control-opacity: 0.5 !default;
+$carousel-control-font-size: 20px !default;
+
+$carousel-indicator-active-bg: #fff !default;
+$carousel-indicator-border-color: #fff !default;
+
+$carousel-caption-color: #fff !default;
+
+//== Close
+//
+//##
+
+$close-font-weight: bold !default;
+$close-color: $text-color !default;
+$close-text-shadow: none !default;
+
+//== Code
+//
+//##
+
+$code-color: #c7254e !default;
+$code-bg: #f9f2f4 !default;
+
+$kbd-color: #fff !default;
+$kbd-bg: #333 !default;
+
+$pre-bg: #f5f5f5 !default;
+$pre-color: $gray-dark !default;
+$pre-border-color: #ccc !default;
+$pre-scrollable-max-height: 340px !default;
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted: $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color: $gray-light !default;
+//** Headings small color
+$headings-small-color: $text-color !default;
+//** Blockquote small color
+$blockquote-small-color: $text-color !default;
+//** Blockquote font size
+$blockquote-font-size: ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color: $gray-light !default;
+//** Page header border color
+$page-header-border-color: $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset: $component-offset-horizontal !default;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint: $grid-float-breakpoint !default;
+//** Horizontal line color.
+$hr-border: lighten($gray-light, 5%) !default;
diff --git a/man/app_server.Rd b/man/app_server.Rd
index 863368b..60d8695 100644
--- a/man/app_server.Rd
+++ b/man/app_server.Rd
@@ -4,7 +4,7 @@
 \alias{app_server}
 \title{Server side of the dv.manager}
 \usage{
-app_server(input = NULL, output = NULL, session = NULL, id = NULL)
+app_server(input = NULL, output = NULL, session = NULL)
 }
 \arguments{
 \item{input, output, session}{Internal parameters for {shiny}.
@@ -15,13 +15,6 @@ DO NOT REMOVE.}
 \description{
 Server side of the dv.manager
 }
-\section{golem}{
-
-This server side is built as a golem application. Therefore it will make use of the \link[golem:get_golem_options]{golem::get_golem_options}
-functionality. Particularly, it will receive three variables through this channel: module_list, data and filter_data.
-All this variables are specified in the \code{\link[=run_app]{run_app()}} call.
-}
-
 \section{data}{
 
 \emph{data} is the fundamental data source for the application launched by the dv.manager
diff --git a/man/app_ui.Rd b/man/app_ui.Rd
index 8fd6d83..0342339 100644
--- a/man/app_ui.Rd
+++ b/man/app_ui.Rd
@@ -8,7 +8,7 @@ app_ui(id)
 }
 \arguments{
 \item{id}{This parameter can be either an string id if the app_ui is being used as a module or
-a request if the app_ui is being used as an standalone application created in golem then it becomes
+a request if the app_ui is being used as an standalone application then it becomes
 a Internal parameter for \code{{shiny}}
 DO NOT REMOVE.}
 }
diff --git a/man/build_secure_arguments.Rd b/man/build_secure_arguments.Rd
index 33518ce..0b33740 100644
--- a/man/build_secure_arguments.Rd
+++ b/man/build_secure_arguments.Rd
@@ -9,7 +9,10 @@ build_secure_arguments(azure_options, app_ui, app_server)
 \arguments{
 \item{azure_options}{A named vector/list containing the options for the Azure Authentication:
 Required fields: redirect, resource, tenant, app, version, password.
-See AzureAuth::build_authorization_uri for these. If NULL then application will not be secure.}
+See AzureAuth::build_authorization_uri for these. If NULL then application will not be secure.
+Note that azure_options is only required when the applications handles the authentication by itself. It is not
+required in other environments such as POSIT Connect or other environments where the authentication is handled
+externally.}
 
 \item{app_ui, app_server}{the shiny ui and server functions}
 }
diff --git a/man/import_from.Rd b/man/import_from.Rd
index 54d2bac..9bb5071 100644
--- a/man/import_from.Rd
+++ b/man/import_from.Rd
@@ -2,11 +2,8 @@
 % Please edit documentation in R/utils_importFrom.R
 \name{.data}
 \alias{.data}
-\alias{get_golem_options}
 \title{.data from dplyr}
 \description{
 .data from dplyr
-
-get_golem_options from golem
 }
 \keyword{internal}
diff --git a/man/run_app.Rd b/man/run_app.Rd
index b86cc5a..00cba42 100644
--- a/man/run_app.Rd
+++ b/man/run_app.Rd
@@ -43,7 +43,10 @@ message defined with shiny::modalDialog.}
 
 \item{azure_options}{A named vector/list containing the options for the Azure Authentication:
 Required fields: redirect, resource, tenant, app, version, password.
-See AzureAuth::build_authorization_uri for these. If NULL then application will not be secure.}
+See AzureAuth::build_authorization_uri for these. If NULL then application will not be secure.
+Note that azure_options is only required when the applications handles the authentication by itself. It is not
+required in other environments such as POSIT Connect or other environments where the authentication is handled
+externally.}
 
 \item{reload_period}{Either a lubridate object to specify a duration
 or a positive numeric value which is then interpreted as a lubridate duration object in days. By default NULL}
diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R
index 693831c..0852c78 100644
--- a/tests/testthat/setup.R
+++ b/tests/testthat/setup.R
@@ -1,4 +1,14 @@
-library(shiny)
+package_name <- "dv.manager"
+
+# validation (S)
+vdoc <- source(
+  system.file("validation", "utils-validation.R", package = package_name, mustWork = TRUE),
+  local = TRUE
+)[["value"]]
+specs <- vdoc[["specs"]]
+#  validation (F)
+
+# -----
 
 run_shiny_tests <- !isFALSE(as.logical(Sys.getenv("SKIP_SHINY_TESTS")))
 suspect_check <- any(names(Sys.getenv()) == "_R_CHECK_CRAN_INCOMING_")
diff --git a/tests/testthat/test-run_app.R b/tests/testthat/test-run_app.R
index 94a000e..fdf7907 100644
--- a/tests/testthat/test-run_app.R
+++ b/tests/testthat/test-run_app.R
@@ -131,7 +131,7 @@ test_that(
       module_list = list("Simple" = dv.manager:::mod_simple("adsl", "mod1")),
       filter_data = "DD1",
       .launch = FALSE
-    )[["golem_opts"]][["filter_key"]] %>%
+    )[["config"]][["filter_key"]] %>%
       expect_equal("USUBJID") %>%
       expect_warning(regexp = "Check date: Not passed") %>%
       expect_warning(regexp = "D1 -> DD1 has no date. no meta attribute or no mtime entry", fixed = TRUE) %>%
diff --git a/tests/testthat/test-utils_check.R b/tests/testthat/test-utils_check.R
index 53c1274..ab76f65 100644
--- a/tests/testthat/test-utils_check.R
+++ b/tests/testthat/test-utils_check.R
@@ -38,3 +38,10 @@ test_that(
     expect_false(has_all_items_named(list(a = 1, 2)))
   }
 )
+
+test_that(
+  vdoc[["add_spec"]](specs[["a_spec"]], "my test description"),
+  {
+    expect_true(TRUE)
+  }
+)