From 8089895900d694047bb04ace037bf2fe4656cc42 Mon Sep 17 00:00:00 2001 From: deepanshkhurana Date: Fri, 22 Nov 2024 16:59:58 +0530 Subject: [PATCH 1/5] feat: add theming with config.yml feat: add functions for coloring svg files feat: replace sass colors with css colors --- app/logic/empty_state_utils.R | 45 +- app/logic/general_utils.R | 30 ++ app/main.R | 84 ++-- app/static/css/app.min.css | 2 +- app/static/illustrations/empty_state.svg | 4 +- app/static/illustrations/missing_apps.svg | 2 +- app/styles/_app_table.scss | 2 +- app/styles/_colors.scss | 29 +- app/styles/_dashboard.scss | 8 +- app/styles/_header.scss | 2 +- app/styles/_job_list.scss | 2 +- app/styles/_logs.scss | 2 +- app/styles/main.scss | 2 +- config.yml | 19 + dependencies.R | 2 + renv.lock | 495 ++++++++++++---------- 16 files changed, 418 insertions(+), 312 deletions(-) diff --git a/app/logic/empty_state_utils.R b/app/logic/empty_state_utils.R index 3acbd10..e11d5f4 100644 --- a/app/logic/empty_state_utils.R +++ b/app/logic/empty_state_utils.R @@ -1,9 +1,13 @@ box::use( + base64enc[ + base64encode + ], shiny[ div, img, p, - renderUI + renderUI, + tagAppendAttributes ], ) @@ -13,7 +17,8 @@ box::use( #' @export generate_empty_state_ui <- function( text = "Select an application and a job to view logs", - image_path = "static/illustrations/empty_state.svg" + image_path = "static/illustrations/empty_state.svg", + color = NULL ) { div( class = "empty-state-container", @@ -21,10 +26,40 @@ generate_empty_state_ui <- function( class = "empty-state-text", text ), - img( - src = image_path, - class = "empty-state-image", + replace_svg_fill( + color = color, + svg_path = image_path, alt = text ) ) } + +#' Function to replace fill color in SVG +#' @param color Character. The color to replace +#' @param svg_path Character. The path to the SVG file +#' @param placeholder Character. The placeholder. Default is "PRIMARY" +#' @param alt Character. The alt text for the image +#' @return an image tag with the SVG content +replace_svg_fill <- function( + color, + svg_path = "", + placeholder = "PRIMARY", + alt = "", + class = "empty-state-image" +) { + svg_content <- readLines(svg_path) + svg_content <- paste(svg_content, collapse = "\n") + svg_content <- gsub( + placeholder, + color, + svg_content + ) + img( + class = class, + src = paste0( + "data:image/svg+xml;base64,", + base64encode(charToRaw(svg_content)) + ), + alt = alt + ) +} diff --git a/app/logic/general_utils.R b/app/logic/general_utils.R index 30e33bf..c45cbe2 100644 --- a/app/logic/general_utils.R +++ b/app/logic/general_utils.R @@ -1,3 +1,12 @@ +box::use( + config[ + get + ], + purrr[ + map_chr + ], +) + #' Function to check if a string of log text has error keywords #' #' @param text Character. The log string @@ -37,3 +46,24 @@ format_timestamp <- function( format = to ) } + +#' Generate CSS variables from config.yml +#' @param config the config file +#' @return a string of CSS variables within :root {} +#' @export +generate_css_variables <- function( + config = get("branding") +) { + css_lines <- map_chr( + names(config$colors), + function(name) { + color_value <- config$colors[[name]] + sprintf(" --%s: %s;", name, color_value) + } + ) + paste0( + ":root {\n", + paste(css_lines, collapse = "\n"), + "\n}" + ) +} diff --git a/app/main.R b/app/main.R index 4adf1dd..613b42f 100644 --- a/app/main.R +++ b/app/main.R @@ -1,24 +1,9 @@ # nolint start: box_func_import_count_linter box::use( + config[get], dplyr[select], magrittr[`%>%`], - shiny[ - div, - fluidPage, - img, - isTruthy, - moduleServer, - NS, - observeEvent, - p, - reactive, - reactiveValues, - removeUI, - renderUI, - tagList, - tags, - uiOutput - ], + shiny, shinycssloaders[withSpinner], ) # nolint end @@ -26,6 +11,7 @@ box::use( box::use( app/logic/api_utils[get_app_list], app/logic/empty_state_utils[generate_empty_state_ui], + app/logic/general_utils[generate_css_variables], app/view/mod_app_table, app/view/mod_header, app/view/mod_job_list, @@ -34,29 +20,32 @@ box::use( #' @export ui <- function(id) { - ns <- NS(id) - fluidPage( + ns <- shiny$NS(id) + shiny$fluidPage( class = "dashboard-body", + shiny$tags$head( + shiny$uiOutput(ns("dynamic_colors")) + ), mod_header$ui("header"), - div( + shiny$div( class = "dashboard-container", - div( + shiny$div( class = "app-table", mod_app_table$ui(ns("app_table")) ), - div( + shiny$div( class = "vertical-line" ), - div( + shiny$div( class = "job-list", - uiOutput(ns("job_list_pane")) + shiny$uiOutput(ns("job_list_pane")) ), - div( + shiny$div( class = "vertical-line" ), - div( + shiny$div( class = "logs", - uiOutput(ns("logs_pane")) + shiny$uiOutput(ns("logs_pane")) ) ) ) @@ -64,17 +53,24 @@ ui <- function(id) { #' @export server <- function(id) { - moduleServer(id, function(input, output, session) { + shiny$moduleServer(id, function(input, output, session) { ns <- session$ns + branding <- get("branding") + + output$dynamic_colors <- shiny$renderUI({ + css_content <- generate_css_variables(branding) + shiny$tags$style(shiny$HTML(css_content)) + }) + mod_header$server("header") - state <- reactiveValues() - state$selected_app <- reactive({}) - state$selected_job <- reactive({}) + state <- shiny$reactiveValues() + state$selected_app <- shiny$reactive({}) + state$selected_job <- shiny$reactive({}) - app_list <- reactive({ + app_list <- shiny$reactive({ get_app_list() }) @@ -84,11 +80,11 @@ server <- function(id) { state ) - observeEvent(state$selected_app()$guid, { + shiny$observeEvent(state$selected_app()$guid, { - if (isTruthy(state$selected_app()$guid)) { + if (shiny$isTruthy(state$selected_app()$guid)) { - output$job_list_pane <- renderUI({ + output$job_list_pane <- shiny$renderUI({ mod_job_list$ui(ns("job_list")) }) @@ -99,16 +95,16 @@ server <- function(id) { } else { - removeUI(ns("job_list_pane")) + shiny$removeUI(ns("job_list_pane")) } }, ignoreNULL = FALSE) - observeEvent(state$selected_job()$key, { + shiny$observeEvent(state$selected_job()$key, { - if (isTruthy(state$selected_job()$key)) { + if (shiny$isTruthy(state$selected_job()$key)) { - output$logs_pane <- renderUI({ + output$logs_pane <- shiny$renderUI({ mod_logs$ui(ns("logs")) }) @@ -119,17 +115,19 @@ server <- function(id) { } else { if (!inherits(app_list(), "data.frame")) { - empty_state <- renderUI({ + empty_state <- shiny$renderUI({ generate_empty_state_ui( text = "Oops! Can't read apps from Posit Connect.", - image_path = "static/illustrations/missing_apps.svg" + image_path = "app/static/illustrations/missing_apps.svg", + color = branding$colors$primary ) }) } else { - empty_state <- renderUI({ + empty_state <- shiny$renderUI({ generate_empty_state_ui( text = "Select an application and a job to view logs.", - image_path = "static/illustrations/empty_state.svg" + image_path = "app/static/illustrations/empty_state.svg", + color = branding$colors$primary ) }) } diff --git a/app/static/css/app.min.css b/app/static/css/app.min.css index 1060d16..79ee1dc 100644 --- a/app/static/css/app.min.css +++ b/app/static/css/app.min.css @@ -1 +1 @@ -@import"https://fonts.googleapis.com/css2?family=Maven+Pro:wght@400;600&display=swap";.red-text{color:#a50e0e}.green-text{color:#3a5a40}.yellow-text{color:#a58e0e}.red-highlight{background-color:rgba(252,232,230,.3137254902)}.green-highlight{background-color:rgba(224,240,223,.3137254902)}.yellow-highlight{background-color:rgba(240,235,187,.3137254902)}.red-text{color:#a50e0e}.green-text{color:#3a5a40}.yellow-text{color:#a58e0e}.red-highlight{background-color:rgba(252,232,230,.3137254902)}.green-highlight{background-color:rgba(224,240,223,.3137254902)}.yellow-highlight{background-color:rgba(240,235,187,.3137254902)}.logs .rt-td-inner{padding:0 !important}.logs>div{text-align:center}.logs>div .empty-state-container{margin-top:150px}.logs>div .empty-state-container .empty-state-image{width:50%}.logs>div .empty-state-container .empty-state-text{color:gray;margin-bottom:40px}.logs-container{position:relative}.logs-container .log-entry{display:flex;align-items:center;gap:20px;padding:10px;margin:5px 10px}.logs-container .log-entry i{font-size:1.5em}.logs-container .log-entry .log-info-block{display:flex;flex-direction:column;gap:10px}.logs-container .log-entry .log-info-block .log-info{font-weight:600}.logs-container .log-entry .log-info-block .log-time{font-size:.75em}.logs-container .logs-download{position:absolute;z-index:2;right:0;margin:10px;background:0;border-radius:0;padding:5px 10px}.wrapper{background:none !important}.content-wrapper{background:#fff;color:#333;height:90vh}.dashboard-body{display:flex;flex-direction:column;padding:0}.dashboard-body .dashboard-container{display:flex;flex-direction:row;height:100vh}.dashboard-body .reactable{background:rgba(0,0,0,0)}.dashboard-body .rt-search{width:80%;margin:10px 10px 20px;align-self:center;text-align:center;border-radius:0}.dashboard-body .rt-tr-header{display:none !important}.dashboard-body .rt-tr{align-items:center}.dashboard-body .rt-tr-selected{background:rgba(0,0,0,.062745098)}.dashboard-body .app-table{width:30%;height:100%;overflow-y:auto}.dashboard-body .job-list{width:15%;height:100%;overflow-y:auto}.dashboard-body .logs{background:#fff;width:55%;height:100%;overflow-y:auto}.app-entry{display:flex;flex-direction:column;width:100%}.app-entry .app-title{font-size:1.1em}.app-entry .app-link-icon{font-size:.5em;margin-left:10px;margin-bottom:10px}.app-entry .app-metadata{display:flex;flex-direction:column;gap:5px;color:gray;font-size:.75em}.red-text{color:#a50e0e}.green-text{color:#3a5a40}.yellow-text{color:#a58e0e}.red-highlight{background-color:rgba(252,232,230,.3137254902)}.green-highlight{background-color:rgba(224,240,223,.3137254902)}.yellow-highlight{background-color:rgba(240,235,187,.3137254902)}.job-entry .job-key,.job-entry .job-start-time,.job-entry .job-end-time{font-size:.75em;color:gray}.header{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10px;margin-bottom:20px}.header .header-section{display:flex;align-items:center;gap:10px}.header .left img{width:200px}.header .left h2{margin:0;margin-bottom:5px;margin-left:20px}.header .left .vertical-line{height:50px}.header .right .cta-button{background:#0099f9;color:#fff;padding:10px;border-radius:10px;margin:0 10px}*{font-family:"Maven Pro",sans-serif}body{overflow:hidden}.vertical-line{border-left:1px #eee solid;height:80%;align-self:center} +@import"https://fonts.googleapis.com/css2?family=Maven+Pro:wght@400;600&display=swap";.red-text{color:var(--red)}.green-text{color:var(--green)}.yellow-text{color:var(--yellow)}.red-highlight{background-color:var(--red-highlight)}.green-highlight{background-color:var(--green-highlight)}.yellow-highlight{background-color:var(--yellow-highlight)}.red-text{color:var(--red)}.green-text{color:var(--green)}.yellow-text{color:var(--yellow)}.red-highlight{background-color:var(--red-highlight)}.green-highlight{background-color:var(--green-highlight)}.yellow-highlight{background-color:var(--yellow-highlight)}.logs .rt-td-inner{padding:0 !important}.logs>div{text-align:center}.logs>div .empty-state-container{margin-top:150px}.logs>div .empty-state-container .empty-state-image{width:50%}.logs>div .empty-state-container .empty-state-text{color:var(--grey-text);margin-bottom:40px}.logs-container{position:relative}.logs-container .log-entry{display:flex;align-items:center;gap:20px;padding:10px;margin:5px 10px}.logs-container .log-entry i{font-size:1.5em}.logs-container .log-entry .log-info-block{display:flex;flex-direction:column;gap:10px}.logs-container .log-entry .log-info-block .log-info{font-weight:600}.logs-container .log-entry .log-info-block .log-time{font-size:.75em}.logs-container .logs-download{position:absolute;z-index:2;right:0;margin:10px;background:0;border-radius:0;padding:5px 10px}.wrapper{background:none !important}.content-wrapper{background:var(--white);color:var(--black-text);height:90vh}.dashboard-body{display:flex;flex-direction:column;padding:0}.dashboard-body .dashboard-container{display:flex;flex-direction:row;height:100vh}.dashboard-body .reactable{background:rgba(0,0,0,0)}.dashboard-body .rt-search{width:80%;margin:10px 10px 20px;align-self:center;text-align:center;border-radius:0}.dashboard-body .rt-tr-header{display:none !important}.dashboard-body .rt-tr{align-items:center}.dashboard-body .rt-tr-selected{background:var(--selected-row)}.dashboard-body .app-table{width:30%;height:100%;overflow-y:auto}.dashboard-body .job-list{width:15%;height:100%;overflow-y:auto}.dashboard-body .logs{background:var(--white);width:55%;height:100%;overflow-y:auto}.app-entry{display:flex;flex-direction:column;width:100%}.app-entry .app-title{font-size:1.1em}.app-entry .app-link-icon{font-size:.5em;margin-left:10px;margin-bottom:10px}.app-entry .app-metadata{display:flex;flex-direction:column;gap:5px;color:var(--grey-text);font-size:.75em}.red-text{color:var(--red)}.green-text{color:var(--green)}.yellow-text{color:var(--yellow)}.red-highlight{background-color:var(--red-highlight)}.green-highlight{background-color:var(--green-highlight)}.yellow-highlight{background-color:var(--yellow-highlight)}.job-entry .job-key,.job-entry .job-start-time,.job-entry .job-end-time{font-size:.75em;color:var(--grey-text)}.header{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10px;margin-bottom:20px}.header .header-section{display:flex;align-items:center;gap:10px}.header .left img{width:200px}.header .left h2{margin:0;margin-bottom:5px;margin-left:20px}.header .left .vertical-line{height:50px}.header .right .cta-button{background:var(--primary);color:#fff;padding:10px;border-radius:10px;margin:0 10px}*{font-family:"Maven Pro",sans-serif}body{overflow:hidden}.vertical-line{border-left:1px var(--grey2-border) solid;height:80%;align-self:center} diff --git a/app/static/illustrations/empty_state.svg b/app/static/illustrations/empty_state.svg index f64d1ee..722a490 100644 --- a/app/static/illustrations/empty_state.svg +++ b/app/static/illustrations/empty_state.svg @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/app/static/illustrations/missing_apps.svg b/app/static/illustrations/missing_apps.svg index df10112..65e230a 100644 --- a/app/static/illustrations/missing_apps.svg +++ b/app/static/illustrations/missing_apps.svg @@ -1 +1 @@ -server down \ No newline at end of file +server down diff --git a/app/styles/_app_table.scss b/app/styles/_app_table.scss index 1904be5..676d8d1 100644 --- a/app/styles/_app_table.scss +++ b/app/styles/_app_table.scss @@ -17,7 +17,7 @@ display: flex; flex-direction: column; gap: 5px; - color: $grey-text; + color: var(--grey-text); font-size: 0.75em; } } diff --git a/app/styles/_colors.scss b/app/styles/_colors.scss index 9c7f1cb..0be7e97 100644 --- a/app/styles/_colors.scss +++ b/app/styles/_colors.scss @@ -1,40 +1,23 @@ -$red: #a50e0e; -$red-highlight: #fce8e650; -$green: #3a5a40; -$green-highlight: #e0f0df50; -$yellow: #a58e0e; -$yellow-highlight: #f0ebbb50; -$grey1: #eaeaea; -$grey1-border: #d8d8d8; -$grey2: #f8f8f8; -$grey2-border: #eee; -$black: black; -$white: white; -$grey-text: grey; -$black-text: #333; -$selected-row: #00000010; -$appsilon-blue: #0099f9; - .red-text { - color: $red; + color: var(--red); } .green-text { - color: $green; + color: var(--green); } .yellow-text { - color: $yellow; + color: var(--yellow); } .red-highlight { - background-color: $red-highlight; + background-color: var(--red-highlight); } .green-highlight { - background-color: $green-highlight; + background-color: var(--green-highlight); } .yellow-highlight { - background-color: $yellow-highlight; + background-color: var(--yellow-highlight); } diff --git a/app/styles/_dashboard.scss b/app/styles/_dashboard.scss index c99af6a..69a4270 100644 --- a/app/styles/_dashboard.scss +++ b/app/styles/_dashboard.scss @@ -3,8 +3,8 @@ } .content-wrapper { - background: $white; - color: $black-text; + background: var(--white); + color: var(--black-text); height: 90vh; } @@ -40,7 +40,7 @@ } .rt-tr-selected { - background: $selected-row; + background: var(--selected-row); } .app-table { @@ -56,7 +56,7 @@ } .logs { - background: $white; + background: var(--white); width: 55%; height: 100%; overflow-y: auto; diff --git a/app/styles/_header.scss b/app/styles/_header.scss index b959d4e..15e5459 100644 --- a/app/styles/_header.scss +++ b/app/styles/_header.scss @@ -30,7 +30,7 @@ .right { .cta-button { - background: $appsilon-blue; + background: var(--primary); color: white; padding: 10px; border-radius: 10px; diff --git a/app/styles/_job_list.scss b/app/styles/_job_list.scss index 1ca3cef..63ed958 100644 --- a/app/styles/_job_list.scss +++ b/app/styles/_job_list.scss @@ -5,6 +5,6 @@ .job-start-time, .job-end-time { font-size: 0.75em; - color: $grey-text; + color: var(--grey-text); } } diff --git a/app/styles/_logs.scss b/app/styles/_logs.scss index 5f4535e..e0d9d50 100644 --- a/app/styles/_logs.scss +++ b/app/styles/_logs.scss @@ -16,7 +16,7 @@ } .empty-state-text { - color: $grey-text; + color: var(--grey-text); margin-bottom: 40px; } } diff --git a/app/styles/main.scss b/app/styles/main.scss index 17d49ff..d2497f6 100644 --- a/app/styles/main.scss +++ b/app/styles/main.scss @@ -15,7 +15,7 @@ body { } .vertical-line { - border-left: 1px $grey2-border solid; + border-left: 1px var(--grey2-border) solid; height: 80%; align-self: center; } diff --git a/config.yml b/config.yml index 8e5f085..e0d219e 100644 --- a/config.yml +++ b/config.yml @@ -2,4 +2,23 @@ default: rhino_log_level: !expr Sys.getenv("RHINO_LOG_LEVEL", "INFO") rhino_log_file: !expr Sys.getenv("RHINO_LOG_FILE", NA) app_role: "owner" + branding: + colors: + red: "#a50e0e"# + red-highlight: "#fce8e650" + green: "#3a5a40" + green-highlight: "#e0f0df50" + yellow: "#a58e0e" + yellow-highlight: "#f0ebbb50" + grey1: "#eaeaea" + grey1-border: "#d8d8d8" + grey2: "#f8f8f8" + grey2-border: "#eee" + black: black + white: white + grey-text: grey + black-text: "#333" + selected-row: "#00000010" + primary: "red" + diff --git a/dependencies.R b/dependencies.R index 289f81d..03ed7ac 100644 --- a/dependencies.R +++ b/dependencies.R @@ -6,3 +6,5 @@ library(reactable) library(rhino) library(rsconnect) library(shinycssloaders) +library(treesitter) +library(treesitter.r) diff --git a/renv.lock b/renv.lock index 2c0c389..a7b9d2a 100644 --- a/renv.lock +++ b/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.3.2", + "Version": "4.4.1", "Repositories": [ { "Name": "CRAN", @@ -9,6 +9,17 @@ ] }, "Packages": { + "PKI": { + "Package": "PKI", + "Version": "0.1-14", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "base64enc" + ], + "Hash": "f5b9c6b2f62f1fa3dd53fd1ddccbb241" + }, "R.cache": { "Package": "R.cache", "Version": "0.16.0", @@ -37,22 +48,22 @@ }, "R.oo": { "Package": "R.oo", - "Version": "1.25.0", + "Version": "1.27.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R.methodsS3", "methods", "utils" ], - "Hash": "a0900a114f4f0194cf4aa8cd4a700681" + "Hash": "6ac79ff194202248cf946fe3a5d6d498" }, "R.utils": { "Package": "R.utils", - "Version": "2.12.2", + "Version": "2.12.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R.methodsS3", @@ -61,7 +72,7 @@ "tools", "utils" ], - "Hash": "325f01db13da12c04d8f6e7be36ff514" + "Hash": "3dc2829b790254bfba21e60965787651" }, "R6": { "Package": "R6", @@ -75,34 +86,34 @@ }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.11", + "Version": "1.0.13-1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "methods", "utils" ], - "Hash": "ae6cbbe1492f4de79c45fce06f967ce8" + "Hash": "6b868847b365672d6c1677b1608da9ed" }, "askpass": { "Package": "askpass", - "Version": "1.2.0", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "sys" ], - "Hash": "cad6cf7f1d5f6e906700b9d3e718c796" + "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a" }, "backports": { "Package": "backports", - "Version": "1.4.1", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R" ], - "Hash": "c39fbec8a30d23e721980b8afb31984c" + "Hash": "e1e1b9d75c37401117b636b7ae50827a" }, "base64enc": { "Package": "base64enc", @@ -116,93 +127,132 @@ }, "box": { "Package": "box", - "Version": "1.1.3", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "tools" ], - "Hash": "ce8187a260e8e3abc2294284badc3b76" + "Hash": "d94049c1d9446b0abb413fde9e82a505" + }, + "box.linters": { + "Package": "box.linters", + "Version": "0.10.5", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "fs", + "glue", + "lintr", + "purrr", + "rlang", + "stringr", + "withr", + "xfun", + "xml2", + "xmlparsedata" + ], + "Hash": "8e26a8f1052518f7b69c967117f918be" + }, + "box.lsp": { + "Package": "box.lsp", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "box", + "cli", + "fs", + "rlang" + ], + "Hash": "c39c37f080928f9fd464eb582120d698" }, "brio": { "Package": "brio", - "Version": "1.1.3", + "Version": "1.1.5", "Source": "Repository", - "Repository": "CRAN", - "Hash": "976cf154dfb043c012d87cddd8bca363" + "Repository": "RSPM", + "Requirements": [ + "R" + ], + "Hash": "c1ee497a6d999947c2c224ae46799b1a" }, "bslib": { "Package": "bslib", - "Version": "0.5.1", + "Version": "0.8.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "base64enc", "cachem", + "fastmap", "grDevices", "htmltools", "jquerylib", "jsonlite", + "lifecycle", "memoise", "mime", "rlang", "sass" ], - "Hash": "283015ddfbb9d7bf15ea9f0b5698f0d9" + "Hash": "b299c6741ca9746fb227debcb0f9fb6c" }, "cachem": { "Package": "cachem", - "Version": "1.0.8", + "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "fastmap", "rlang" ], - "Hash": "c35768291560ce302c0a6589f92e837d" + "Hash": "cd9a672193789068eb5a2aad65a0dedf" }, "callr": { "Package": "callr", - "Version": "3.7.3", + "Version": "3.7.6", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", "processx", "utils" ], - "Hash": "9b2191ede20fa29828139b9900922e51" + "Hash": "d7e13f49c19103ece9e58ad2d83a7354" }, "cli": { "Package": "cli", - "Version": "3.6.1", + "Version": "3.6.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "utils" ], - "Hash": "89e6d8219950eac806ae0c489052048a" + "Hash": "b21916dd77a27642b447374a5d30ecf3" }, "codetools": { "Package": "codetools", - "Version": "0.2-19", + "Version": "0.2-20", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "c089a619a7fae175d149d89164f8c7d8" + "Hash": "61e097f35917d342622f21cdc79c256e" }, "commonmark": { "Package": "commonmark", - "Version": "1.9.0", + "Version": "1.9.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "d691c61bff84bd63c383874d2d0c3307" + "Repository": "RSPM", + "Hash": "14eb0596f987c71535d07c3aff814742" }, "config": { "Package": "config", @@ -216,25 +266,25 @@ }, "crayon": { "Package": "crayon", - "Version": "1.5.2", + "Version": "1.5.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "grDevices", "methods", "utils" ], - "Hash": "e8a1e41acf02548751f45c718d55aa6a" + "Hash": "859d96e65ef198fd43e82b9628d593ef" }, "curl": { "Package": "curl", - "Version": "5.2.0", + "Version": "6.0.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R" ], - "Hash": "ce88d13c0b10fe88a37d9c59dba2d7f9" + "Hash": "e8ba62486230951fcd2b881c5be23f96" }, "cyclocomp": { "Package": "cyclocomp", @@ -252,17 +302,16 @@ }, "desc": { "Package": "desc", - "Version": "1.4.2", + "Version": "1.4.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", "cli", - "rprojroot", "utils" ], - "Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21" + "Hash": "99b79fcbd6c4d1ce087f5c5c758b384f" }, "diffobj": { "Package": "diffobj", @@ -281,14 +330,14 @@ }, "digest": { "Package": "digest", - "Version": "0.6.33", + "Version": "0.6.37", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "utils" ], - "Hash": "b18a9cf3c003977b0cc49d5e76ebe48d" + "Hash": "33698c4b3127fc9f506654607fb73676" }, "dplyr": { "Package": "dplyr", @@ -313,69 +362,57 @@ ], "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" }, - "ellipsis": { - "Package": "ellipsis", - "Version": "0.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "rlang" - ], - "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" - }, "evaluate": { "Package": "evaluate", - "Version": "0.23", + "Version": "1.0.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ - "R", - "methods" + "R" ], - "Hash": "daf4a1246be12c1fa8c7705a0935c1a0" + "Hash": "3fd29944b231036ad67c3edb32e02201" }, "fansi": { "Package": "fansi", - "Version": "1.0.5", + "Version": "1.0.6", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "grDevices", "utils" ], - "Hash": "3e8583a60163b4bc1a80016e63b9959e" + "Hash": "962174cf2aeb5b9eea581522286a911f" }, "fastmap": { "Package": "fastmap", - "Version": "1.1.1", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "f7736a18de97dea803bde0a2daaafb27" + "Repository": "RSPM", + "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" }, "fontawesome": { "Package": "fontawesome", - "Version": "0.5.2", + "Version": "0.5.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "htmltools", "rlang" ], - "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + "Hash": "bd1297f9b5b1fc1372d19e2c4cd82215" }, "fs": { "Package": "fs", - "Version": "1.6.3", + "Version": "1.6.5", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "methods" ], - "Hash": "47b5f30c720c23999b913a1a635cf0bb" + "Hash": "7f48af39fa27711ea5fbd183b399920d" }, "generics": { "Package": "generics", @@ -390,42 +427,41 @@ }, "glue": { "Package": "glue", - "Version": "1.6.2", + "Version": "1.8.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "methods" ], - "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e" + "Hash": "5899f1eaa825580172bb56c08266f37c" }, "highr": { "Package": "highr", - "Version": "0.10", + "Version": "0.11", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "xfun" ], - "Hash": "06230136b2d2b9ba5805e1963fa6e890" + "Hash": "d65ba49117ca223614f71b60d85b8ab7" }, "htmltools": { "Package": "htmltools", - "Version": "0.5.7", + "Version": "0.5.8.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "R", "base64enc", "digest", - "ellipsis", "fastmap", "grDevices", "rlang", "utils" ], - "Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f" + "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" }, "htmlwidgets": { "Package": "htmlwidgets", @@ -444,9 +480,9 @@ }, "httpuv": { "Package": "httpuv", - "Version": "1.6.12", + "Version": "1.6.15", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", @@ -455,11 +491,11 @@ "promises", "utils" ], - "Hash": "c992f75861325961c29a188b45e549f7" + "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0" }, "httr2": { "Package": "httr2", - "Version": "1.0.0", + "Version": "1.0.6", "Source": "Repository", "Repository": "RSPM", "Requirements": [ @@ -476,7 +512,7 @@ "vctrs", "withr" ], - "Hash": "e2b30f1fc039a0bab047dd52bb20ef71" + "Hash": "3ef5d07ec78803475a94367d71b40c41" }, "jquerylib": { "Package": "jquerylib", @@ -490,19 +526,19 @@ }, "jsonlite": { "Package": "jsonlite", - "Version": "1.8.7", + "Version": "1.8.9", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "methods" ], - "Hash": "266a20443ca13c65688b2116d5220f76" + "Hash": "4e993b65c2c3ffbffce7bb3e2c6f832b" }, "knitr": { "Package": "knitr", - "Version": "1.45", + "Version": "1.49", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "evaluate", @@ -512,18 +548,18 @@ "xfun", "yaml" ], - "Hash": "1ec462871063897135c1bcbe0fc8f07d" + "Hash": "9fcb189926d93c636dea94fbe4f44480" }, "later": { "Package": "later", - "Version": "1.3.1", + "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "Rcpp", "rlang" ], - "Hash": "40401c9cf2bc2259dfe83311c9384710" + "Hash": "a3e051d405326b8b0012377434c62b37" }, "lazyeval": { "Package": "lazyeval", @@ -537,22 +573,22 @@ }, "lifecycle": { "Package": "lifecycle", - "Version": "1.0.3", + "Version": "1.0.4", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "cli", "glue", "rlang" ], - "Hash": "001cecbeac1cff9301bdc3775ee46a86" + "Hash": "b8552d117e1b808b09a832f589b79035" }, "lintr": { "Package": "lintr", - "Version": "3.1.0", + "Version": "3.1.2", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "backports", @@ -567,17 +603,18 @@ "xml2", "xmlparsedata" ], - "Hash": "2b4b803af6017e93b67ddaf0eacba918" + "Hash": "08cff46381a242d44c0d8dd0aabd9f71" }, "logger": { "Package": "logger", - "Version": "0.2.2", + "Version": "0.4.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ + "R", "utils" ], - "Hash": "c269b06beb2bbadb0d058c0e6fa4ec3d" + "Hash": "f25d781d5bc7757e08cf38c741a5ad1c" }, "magrittr": { "Package": "magrittr", @@ -612,13 +649,13 @@ }, "openssl": { "Package": "openssl", - "Version": "2.1.1", + "Version": "2.2.2", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "askpass" ], - "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5" + "Hash": "d413e0fef796c9401a4419485f709ca1" }, "packrat": { "Package": "packrat", @@ -651,21 +688,18 @@ }, "pkgbuild": { "Package": "pkgbuild", - "Version": "1.4.2", + "Version": "1.4.5", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", "callr", "cli", - "crayon", "desc", - "prettyunits", - "processx", - "rprojroot" + "processx" ], - "Hash": "beb25b32a957a22a5c301a9e441190b3" + "Hash": "30eaaab94db72652e72e3475c1b55278" }, "pkgconfig": { "Package": "pkgconfig", @@ -679,24 +713,25 @@ }, "pkgload": { "Package": "pkgload", - "Version": "1.3.3", + "Version": "1.4.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "cli", - "crayon", "desc", "fs", "glue", + "lifecycle", "methods", "pkgbuild", + "processx", "rlang", "rprojroot", "utils", "withr" ], - "Hash": "903d68319ae9923fb2e2ee7fa8230b91" + "Hash": "2ec30ffbeec83da57655b850cf2d3e0e" }, "praise": { "Package": "praise", @@ -705,34 +740,24 @@ "Repository": "CRAN", "Hash": "a555924add98c99d2f411e37e7d25e9f" }, - "prettyunits": { - "Package": "prettyunits", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" - }, "processx": { "Package": "processx", - "Version": "3.8.2", + "Version": "3.8.4", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", "ps", "utils" ], - "Hash": "3efbd8ac1be0296a46c55387aeace0f3" + "Hash": "0c90a7d71988856bad2a2a45dd871bb9" }, "promises": { "Package": "promises", - "Version": "1.2.1", + "Version": "1.3.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R6", "Rcpp", @@ -742,18 +767,18 @@ "rlang", "stats" ], - "Hash": "0d8a15c9d000970ada1ab21405387dee" + "Hash": "434cd5388a3979e74be5c219bcd6e77d" }, "ps": { "Package": "ps", - "Version": "1.7.5", + "Version": "1.8.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "utils" ], - "Hash": "709d852d33178db54b17c722e5b1e594" + "Hash": "b4404b1de13758dea1c0484ad0d48563" }, "purrr": { "Package": "purrr", @@ -782,13 +807,13 @@ }, "reactR": { "Package": "reactR", - "Version": "0.5.0", + "Version": "0.6.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ "htmltools" ], - "Hash": "c9014fd1a435b2d790dd506589cb24e5" + "Hash": "b8e3d93f508045812f47136c7c44c251" }, "reactable": { "Package": "reactable", @@ -805,21 +830,11 @@ ], "Hash": "6069eb2a6597963eae0605c1875ff14c" }, - "rematch2": { - "Package": "rematch2", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tibble" - ], - "Hash": "76c9e04c712a05848ae7a23d2f170a40" - }, "remotes": { "Package": "remotes", - "Version": "2.4.2.1", + "Version": "2.5.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "methods", @@ -827,7 +842,7 @@ "tools", "utils" ], - "Hash": "63d15047eb239f95160112bcadc4fcb9" + "Hash": "3ee025083e66f18db6cf27b56e23e141" }, "renv": { "Package": "renv", @@ -851,12 +866,14 @@ }, "rhino": { "Package": "rhino", - "Version": "1.7.0", + "Version": "1.10.1", "Source": "Repository", "Repository": "RSPM", "Requirements": [ "R", "box", + "box.linters", + "box.lsp", "cli", "config", "fs", @@ -872,27 +889,26 @@ "testthat", "utils", "withr", - "xml2", "yaml" ], - "Hash": "59ee79b26dd590b08dd1a3111d093832" + "Hash": "cd58cf8f362b8cc8c82aea1de9468218" }, "rlang": { "Package": "rlang", - "Version": "1.1.1", + "Version": "1.1.4", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "utils" ], - "Hash": "a85c767b55f0bf9b7ad16c6d7baee5bb" + "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" }, "rmarkdown": { "Package": "rmarkdown", - "Version": "2.25", + "Version": "2.29", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "bslib", @@ -903,31 +919,31 @@ "jsonlite", "knitr", "methods", - "stringr", "tinytex", "tools", "utils", "xfun", "yaml" ], - "Hash": "d65e35823c817f09f4de424fcdfa812a" + "Hash": "df99277f63d01c34e95e3d2f06a79736" }, "rprojroot": { "Package": "rprojroot", - "Version": "2.0.3", + "Version": "2.0.4", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R" ], - "Hash": "1de7ab598047a87bba48434ba35d497d" + "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144" }, "rsconnect": { "Package": "rsconnect", - "Version": "1.2.1", + "Version": "1.3.3", "Source": "Repository", "Repository": "RSPM", "Requirements": [ + "PKI", "R", "cli", "curl", @@ -942,18 +958,18 @@ "tools", "yaml" ], - "Hash": "94bb3a2125b01b13dd2e4a784c2a9639" + "Hash": "d466c98fdce812325feb4ad406c6ca4b" }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.15.0", + "Version": "0.17.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "5564500e25cffad9e22244ced1379887" + "Repository": "RSPM", + "Hash": "5f90cd73946d706cfe26024294236113" }, "sass": { "Package": "sass", - "Version": "0.4.7", + "Version": "0.4.9", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -963,11 +979,11 @@ "rappdirs", "rlang" ], - "Hash": "6bd4d33b50ff927191ec9acbf52fd056" + "Hash": "d53dbfddf695303ea4ad66f86e99b95d" }, "shiny": { "Package": "shiny", - "Version": "1.7.5.1", + "Version": "1.9.1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -977,7 +993,6 @@ "cachem", "commonmark", "crayon", - "ellipsis", "fastmap", "fontawesome", "glue", @@ -997,21 +1012,22 @@ "withr", "xtable" ], - "Hash": "5ec01cc255f2138fc2f0dc74d2b1a1a1" + "Hash": "6a293995a66e12c48d13aa1f957d09c7" }, "shinycssloaders": { "Package": "shinycssloaders", - "Version": "1.0.0", + "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "digest", "glue", "grDevices", + "htmltools", "shiny" ], - "Hash": "f39bb3c44a9b496723ec7e86f9a771d8" + "Hash": "2b45a467a30d6a88a1892a738c0900cf" }, "sourcetools": { "Package": "sourcetools", @@ -1025,16 +1041,16 @@ }, "stringi": { "Package": "stringi", - "Version": "1.8.3", + "Version": "1.8.4", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "stats", "tools", "utils" ], - "Hash": "058aebddea264f4c99401515182e656a" + "Hash": "39e1144fd75428983dc3f63aa53dfa91" }, "stringr": { "Package": "stringr", @@ -1055,9 +1071,9 @@ }, "styler": { "Package": "styler", - "Version": "1.10.2", + "Version": "1.10.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R.cache", @@ -1070,20 +1086,20 @@ "vctrs", "withr" ], - "Hash": "d61238fd44fc63c8adf4565efe8eb682" + "Hash": "93a2b1beac2437bdcc4724f8bf867e2c" }, "sys": { "Package": "sys", - "Version": "3.4.2", + "Version": "3.4.3", "Source": "Repository", - "Repository": "CRAN", - "Hash": "3a1be13d68d47a8cd0bfd74739ca1555" + "Repository": "RSPM", + "Hash": "de342ebfebdbf40477d0758d05426646" }, "testthat": { "Package": "testthat", - "Version": "3.2.0", + "Version": "3.2.1.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "R6", @@ -1092,7 +1108,6 @@ "cli", "desc", "digest", - "ellipsis", "evaluate", "jsonlite", "lifecycle", @@ -1107,7 +1122,7 @@ "waldo", "withr" ], - "Hash": "877508719fcb8c9525eccdadf07a5102" + "Hash": "3f6e7e5e2220856ff865e4834766bf2b" }, "tibble": { "Package": "tibble", @@ -1130,9 +1145,9 @@ }, "tidyselect": { "Package": "tidyselect", - "Version": "1.2.0", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "cli", @@ -1142,17 +1157,41 @@ "vctrs", "withr" ], - "Hash": "79540e5fcd9e0435af547d885f184fd5" + "Hash": "829f27b9c4919c16b593794a6344d6c0" }, "tinytex": { "Package": "tinytex", - "Version": "0.49", + "Version": "0.54", "Source": "Repository", "Repository": "RSPM", "Requirements": [ "xfun" ], - "Hash": "5ac22900ae0f386e54f1c307eca7d843" + "Hash": "3ec7e3ddcacc2d34a9046941222bf94d" + }, + "treesitter": { + "Package": "treesitter", + "Version": "0.1.0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "R6", + "cli", + "rlang", + "vctrs" + ], + "Hash": "22a579e4ac2ddd021df1791da7fd080f" + }, + "treesitter.r": { + "Package": "treesitter.r", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R" + ], + "Hash": "067c058dbd496c4cd696449870b11d52" }, "utf8": { "Package": "utf8", @@ -1166,9 +1205,9 @@ }, "vctrs": { "Package": "vctrs", - "Version": "0.6.4", + "Version": "0.6.5", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "cli", @@ -1176,60 +1215,60 @@ "lifecycle", "rlang" ], - "Hash": "266c1ca411266ba8f365fcc726444b87" + "Hash": "c03fa420630029418f7e6da3667aac4a" }, "waldo": { "Package": "waldo", - "Version": "0.5.2", + "Version": "0.6.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "cli", "diffobj", - "fansi", "glue", "methods", - "rematch2", - "rlang", - "tibble" + "rlang" ], - "Hash": "c7d3fd6d29ab077cbac8f0e2751449e6" + "Hash": "52f574062a7b66e56926988c3fbdb3b7" }, "withr": { "Package": "withr", - "Version": "2.5.2", + "Version": "3.0.2", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "grDevices", - "graphics", - "stats" + "graphics" ], - "Hash": "4b25e70111b7d644322e9513f403a272" + "Hash": "cc2d62c76458d425210d1eb1478b30b4" }, "xfun": { "Package": "xfun", - "Version": "0.41", + "Version": "0.49", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ + "R", + "grDevices", "stats", "tools" ], - "Hash": "460a5e0fe46a80ef87424ad216028014" + "Hash": "8687398773806cfff9401a2feca96298" }, "xml2": { "Package": "xml2", - "Version": "1.3.5", + "Version": "1.3.6", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", - "methods" + "cli", + "methods", + "rlang" ], - "Hash": "6c40e5cfcc6aefd88110666e18c31f40" + "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" }, "xmlparsedata": { "Package": "xmlparsedata", @@ -1255,10 +1294,10 @@ }, "yaml": { "Package": "yaml", - "Version": "2.3.7", + "Version": "2.3.10", "Source": "Repository", - "Repository": "CRAN", - "Hash": "0d0056cc5383fbc240ccd0cb584bf436" + "Repository": "RSPM", + "Hash": "51dab85c6c98e50a18d7551e9d49f76c" } } } From ac42cd18462da40c062cb6796a5f900ff9e28098 Mon Sep 17 00:00:00 2001 From: deepanshkhurana Date: Fri, 22 Nov 2024 17:00:59 +0530 Subject: [PATCH 2/5] chore: add onClick = "select" to both app list and job list tables --- app/view/mod_app_table.R | 1 + app/view/mod_job_list.R | 1 + 2 files changed, 2 insertions(+) diff --git a/app/view/mod_app_table.R b/app/view/mod_app_table.R index 52c6e0c..859a4f1 100644 --- a/app/view/mod_app_table.R +++ b/app/view/mod_app_table.R @@ -80,6 +80,7 @@ server <- function(id, app_list, state) { searchable = TRUE, borderless = TRUE, pagination = FALSE, + onClick = "select", selection = "single", columns = list( guid = colDef( diff --git a/app/view/mod_job_list.R b/app/view/mod_job_list.R index c4a6fbf..feadeee 100644 --- a/app/view/mod_job_list.R +++ b/app/view/mod_job_list.R @@ -58,6 +58,7 @@ server <- function(id, state) { selection = "single", borderless = TRUE, pagination = FALSE, + onClick = "select", columns = list( job = colDef( cell = function(job_data) { From df18d7ef02f2eee2ee314495c3856b526de6d0d2 Mon Sep 17 00:00:00 2001 From: deepanshkhurana Date: Fri, 22 Nov 2024 17:03:36 +0530 Subject: [PATCH 3/5] chore: revert config color to Appsilon Blue --- config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yml b/config.yml index e0d219e..f47b412 100644 --- a/config.yml +++ b/config.yml @@ -19,6 +19,6 @@ default: grey-text: grey black-text: "#333" selected-row: "#00000010" - primary: "red" + primary: "#0099f9" From 2250cfab651f53b0e90c5185d3398668a6a6e74f Mon Sep 17 00:00:00 2001 From: deepanshkhurana Date: Fri, 22 Nov 2024 17:09:09 +0530 Subject: [PATCH 4/5] docs: update README with new FAQs about branding --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index aaea915..5a9fa1c 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,11 @@ The LogAnalyzer open-source app is a simple, plug and play application developed - I get `"Oops! Can't read apps from Posit Connect."` on the rightmost image? - This may mean that the Posit Connect API's response did not send proper data. - So far, one documented reason for this is that OAuth on Posit Connect instances may prevent the `/content` endpoint from sending app data. +- How do I rebrand the application? + - You can edit the branding in the `config.yml` file. You'll find the `colors` key which will build the CSS. +- How do I recolor the SVGs? + - This requires some creativity. We recommend replacing the primary color hex which you can find in the `.svg` file as `fill="#hexcde"` to `PRIMARY`. + - We use this as a default value in the function that replaces it but you are welcome to use another value and modify the function. # Credits From b33ef11b77b88b5bfe47ef02f0373f6266386115 Mon Sep 17 00:00:00 2001 From: deepanshkhurana Date: Fri, 22 Nov 2024 17:17:26 +0530 Subject: [PATCH 5/5] feat: add handling for logo in config.yml theming --- app/static/{appsilon-logo.png => logo.png} | Bin app/view/mod_header.R | 16 ++++++++++++---- config.yml | 6 +++++- 3 files changed, 17 insertions(+), 5 deletions(-) rename app/static/{appsilon-logo.png => logo.png} (100%) diff --git a/app/static/appsilon-logo.png b/app/static/logo.png similarity index 100% rename from app/static/appsilon-logo.png rename to app/static/logo.png diff --git a/app/view/mod_header.R b/app/view/mod_header.R index e94e1d0..e6a860c 100644 --- a/app/view/mod_header.R +++ b/app/view/mod_header.R @@ -1,5 +1,9 @@ box::use( + config[ + get + ], shiny[ + a, actionLink, div, h2, @@ -12,14 +16,18 @@ box::use( #' @export ui <- function(id) { ns <- NS(id) + branding <- get("branding") div( class = "header", div( class = "left header-section", - img( - src = "static/appsilon-logo.png", - alt = "Appsilon logo", - href = "https://demo.appsilon.com" + a( + img( + src = branding$logo$src, + alt = branding$logo$alt + ), + href = branding$logo$href, + target = "_blank" ), div( class = "vertical-line" diff --git a/config.yml b/config.yml index f47b412..4a6c758 100644 --- a/config.yml +++ b/config.yml @@ -3,8 +3,12 @@ default: rhino_log_file: !expr Sys.getenv("RHINO_LOG_FILE", NA) app_role: "owner" branding: + logo: + src: "static/logo.png" + alt: "Appsilon logo" + href: "https://demo.appsilon.com" colors: - red: "#a50e0e"# + red: "#a50e0e" red-highlight: "#fce8e650" green: "#3a5a40" green-highlight: "#e0f0df50"