From ba797df2a5fa0902e8b7ae6cc14c88f8a3c4ab03 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Mon, 17 Jun 2024 17:28:43 -0400 Subject: [PATCH 1/3] Add Tailwind CSS color palettes --- NAMESPACE | 5 + R/continuous-tw3.R | 168 ++++++++++++++++++++++++++++++++++ R/palettes.R | 223 ++++++++++++++++++++++++++++++++++++++------- _pkgdown.yml | 7 ++ man/pal_tw3.Rd | 60 ++++++++++++ man/rgb_tw3.Rd | 63 +++++++++++++ man/scale_tw3.Rd | 94 +++++++++++++++++++ 7 files changed, 586 insertions(+), 34 deletions(-) create mode 100644 R/continuous-tw3.R create mode 100644 man/pal_tw3.Rd create mode 100644 man/rgb_tw3.Rd create mode 100644 man/scale_tw3.Rd diff --git a/NAMESPACE b/NAMESPACE index 6c8c5d2..e4624e5 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,11 +22,13 @@ export(pal_rickandmorty) export(pal_simpsons) export(pal_startrek) export(pal_tron) +export(pal_tw3) export(pal_uchicago) export(pal_ucscgb) export(rgb_bs5) export(rgb_gsea) export(rgb_material) +export(rgb_tw3) export(scale_color_aaas) export(scale_color_bmj) export(scale_color_bs5) @@ -49,6 +51,7 @@ export(scale_color_rickandmorty) export(scale_color_simpsons) export(scale_color_startrek) export(scale_color_tron) +export(scale_color_tw3) export(scale_color_uchicago) export(scale_color_ucscgb) export(scale_colour_aaas) @@ -73,6 +76,7 @@ export(scale_colour_rickandmorty) export(scale_colour_simpsons) export(scale_colour_startrek) export(scale_colour_tron) +export(scale_colour_tw3) export(scale_colour_uchicago) export(scale_colour_ucscgb) export(scale_fill_aaas) @@ -97,6 +101,7 @@ export(scale_fill_rickandmorty) export(scale_fill_simpsons) export(scale_fill_startrek) export(scale_fill_tron) +export(scale_fill_tw3) export(scale_fill_uchicago) export(scale_fill_ucscgb) importFrom(ggplot2,discrete_scale) diff --git a/R/continuous-tw3.R b/R/continuous-tw3.R new file mode 100644 index 0000000..ea27708 --- /dev/null +++ b/R/continuous-tw3.R @@ -0,0 +1,168 @@ +#' Tailwind CSS color palettes +#' +#' Tailwind CSS color palettes. +#' +#' @param palette Palette type. There are 22 available options: +#' - `"slate"` +#' - `"gray"` +#' - `"zinc"` +#' - `"neutral"` +#' - `"stone"` +#' - `"red"` +#' - `"orange"` +#' - `"amber"` +#' - `"yellow"` +#' - `"lime"` +#' - `"green"` +#' - `"emerald"` +#' - `"teal"` +#' - `"cyan"` +#' - `"sky"` +#' - `"blue"` +#' - `"indigo"` +#' - `"violet"` +#' - `"purple"` +#' - `"fuchsia"` +#' - `"pink"` +#' - `"rose"` +#' @param n Number of individual colors to be generated. +#' @param alpha Transparency level, a real number in (0, 1]. +#' See `alpha` in [grDevices::rgb()] for details. +#' @param reverse Logical. Should the order of the colors be reversed? +#' +#' @export rgb_tw3 +#' +#' @importFrom grDevices colorRamp rgb +#' @importFrom scales manual_pal +#' +#' @author Nan Xiao | \email{me@nanx.me} | +#' +#' @references +#' +#' +#' @examples +#' library("scales") +#' show_col(pal_tw3("rose")(10)) +#' show_col(pal_tw3("rose", n = 30, alpha = 0.6, reverse = TRUE)(30)) +rgb_tw3 <- function( + palette = c( + "slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", + "indigo", "violet", "purple", "fuchsia", "pink", "rose" + ), n = 10, alpha = 1, reverse = FALSE) { + palette <- match.arg(palette) + + if (alpha > 1L || alpha <= 0L) stop("alpha must be in (0, 1]") + + raw_cols <- ggsci_db$"tw3"[[palette]] + func_cols <- colorRamp(raw_cols, space = "Lab", interpolate = "spline") + mat_cols <- func_cols(seq(0L, 1L, length.out = n)) + alpha_cols <- rgb( + mat_cols[, 1L], mat_cols[, 2L], mat_cols[, 3L], + alpha = alpha * 255L, maxColorValue = 255L + ) + + if (reverse) alpha_cols <- rev(alpha_cols) + + alpha_cols +} + +#' Tailwind CSS color palettes +#' +#' Tailwind CSS color palettes. +#' +#' @inheritParams rgb_tw3 +#' +#' @export pal_tw3 +#' +#' @importFrom scales manual_pal +#' +#' @author Nan Xiao | \email{me@nanx.me} | +#' +#' @examples +#' library("scales") +#' show_col(pal_tw3("rose")(10)) +#' show_col(pal_tw3("rose", n = 30, alpha = 0.6, reverse = TRUE)(30)) +pal_tw3 <- function( + palette = c( + "slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", + "indigo", "violet", "purple", "fuchsia", "pink", "rose" + ), n = 10, alpha = 1, reverse = FALSE) { + palette <- match.arg(palette) + + alpha_cols <- rgb_tw3(palette, n, alpha, reverse) + manual_pal(unname(alpha_cols)) +} + +#' Tailwind CSS color scales +#' +#' See [pal_tw3()] for details. +#' +#' @inheritParams pal_tw3 +#' @param ... Additional parameters for [ggplot2::discrete_scale()]. +#' +#' @export scale_color_tw3 +#' +#' @importFrom ggplot2 scale_color_gradientn +#' +#' @author Nan Xiao | \email{me@nanx.me} | +#' +#' @rdname scale_tw3 +#' +#' @examples +#' library("ggplot2") +#' +#' data("mtcars") +#' cor <- abs(cor(mtcars)) +#' cor_melt <- data.frame( +#' Var1 = rep(seq_len(nrow(cor)), times = ncol(cor)), +#' Var2 = rep(seq_len(ncol(cor)), each = nrow(cor)), +#' value = as.vector(cor) +#' ) +#' +#' ggplot( +#' cor_melt, +#' aes(x = Var1, y = Var2, fill = value) +#' ) + +#' geom_tile(colour = "black", size = 0.3) + +#' theme_bw() + +#' scale_fill_tw3("slate") +scale_color_tw3 <- function( + palette = c( + "slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", + "indigo", "violet", "purple", "fuchsia", "pink", "rose" + ), alpha = 1, reverse = FALSE, ...) { + palette <- match.arg(palette) + scale_color_gradientn( + colours = rgb_tw3( + palette, + n = 512, alpha = alpha, reverse = reverse + ), + ... + ) +} + +#' @export scale_colour_tw3 +#' @rdname scale_tw3 +scale_colour_tw3 <- scale_color_tw3 + +#' @export scale_fill_tw3 +#' @importFrom ggplot2 scale_fill_gradientn +#' @rdname scale_tw3 +scale_fill_tw3 <- function( + palette = c( + "slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", + "indigo", "violet", "purple", "fuchsia", "pink", "rose" + ), alpha = 1, reverse = FALSE, ...) { + palette <- match.arg(palette) + scale_fill_gradientn( + colours = rgb_tw3( + palette, + n = 512, alpha = alpha, reverse = reverse + ), + ... + ) +} diff --git a/R/palettes.R b/R/palettes.R index 4539f31..00aea13 100644 --- a/R/palettes.R +++ b/R/palettes.R @@ -7,7 +7,7 @@ ggsci_db <- vector("list") # Discrete Color Palettes -# Color palette inspired by plots in Nature Reviews Cancer +# Color palette inspired by plots in Nature Reviews Cancer ---- ggsci_db$"npg"$"nrc" <- c( "Cinnabar" = "#E64B35", "Shakespeare" = "#4DBBD5", "PersianGreen" = "#00A087", "Chambray" = "#3C5488", @@ -16,7 +16,7 @@ ggsci_db$"npg"$"nrc" <- c( "RomanCoffee" = "#7E6148", "Sandrift" = "#B09C85" ) -# Color palette inspired by plots in Science from AAAS +# Color palette inspired by plots in Science from AAAS ---- ggsci_db$"aaas"$"default" <- c( "Chambray" = "#3B4992", "Red" = "#EE0000", "FunGreen" = "#008B45", "HoneyFlower" = "#631879", @@ -25,7 +25,7 @@ ggsci_db$"aaas"$"default" <- c( "Stack" = "#808180", "CodGray" = "#1B1919" ) -# Color palette inspired by plots in The New England Journal of Medicine +# Color palette inspired by plots in The New England Journal of Medicine ---- ggsci_db$"nejm"$"default" <- c( "TallPoppy" = "#BC3C29", "DeepCerulean" = "#0072B5", "Zest" = "#E18727", "Eucalyptus" = "#20854E", @@ -33,7 +33,7 @@ ggsci_db$"nejm"$"default" <- c( "Salomie" = "#FFDC91", "FrenchRose" = "#EE4C97" ) -# Color palette inspired by plots in Lancet Oncology +# Color palette inspired by plots in Lancet Oncology ---- ggsci_db$"lancet"$"lanonc" <- c( "CongressBlue" = "#00468B", "Red" = "#ED0000", "Apple" = "#42B540", "BondiBlue" = "#0099B4", @@ -42,7 +42,7 @@ ggsci_db$"lancet"$"lanonc" <- c( "CodGray" = "#1B1919" ) -# Color palette inspired by plots in The Journal of the American Medical Association +# Color palette inspired by plots in The Journal of the American Medical Association ---- ggsci_db$"jama"$"default" <- c( "Limed Spruce" = "#374E55", "Anzac" = "#DF8F44", "Cerulean" = "#00A1D5", "Apple Blossom" = "#B24745", @@ -50,7 +50,7 @@ ggsci_db$"jama"$"default" <- c( "Makara" = "#80796B" ) -# Color palette from BMJ living style guide +# Color palette from BMJ living style guide ---- # https://technology.bmj.com/living-style-guide/colour.html ggsci_db$"bmj"$"default" <- c( "Blue" = "#2A6EBB", @@ -64,7 +64,7 @@ ggsci_db$"bmj"$"default" <- c( "Grey" = "#747678" ) -# Color palette inspired by plots in Journal of Clinical Oncology +# Color palette inspired by plots in Journal of Clinical Oncology ---- ggsci_db$"jco"$"default" <- c( "Lochmara" = "#0073C2", "Corn" = "#EFC000", "Gray" = "#868686", "ChestnutRose" = "#CD534C", @@ -73,7 +73,7 @@ ggsci_db$"jco"$"default" <- c( "WellRead" = "#A73030", "KashmirBlue" = "#4A6990" ) -# Color palette inspired by UCSC Genome Browser Chromosome Colors +# UCSC Genome Browser chromosome colors ---- ggsci_db$"ucscgb"$"default" <- c( "chr5" = "#FF0000", "chr8" = "#FF9900", "chr9" = "#FFCC00", "chr12" = "#00FF00", "chr15" = "#6699FF", "chr20" = "#CC33FF", @@ -86,7 +86,7 @@ ggsci_db$"ucscgb"$"default" <- c( "chrUn" = "#79CC3D", "chrM" = "#CCCC99" ) -# Color palette inspired by D3.js +# Color palette from D3.js ---- ggsci_db$"d3"$"category10" <- c( "Matisse" = "#1F77B4", "Flamenco" = "#FF7F0E", "ForestGreen" = "#2CA02C", "Punch" = "#D62728", @@ -95,7 +95,7 @@ ggsci_db$"d3"$"category10" <- c( "KeyLimePie" = "#BCBD22", "Java" = "#17BECF" ) -# Color palette inspired by D3.js +# Color palette from D3.js ---- ggsci_db$"d3"$"category20" <- c( "Matisse" = "#1F77B4", "Flamenco" = "#FF7F0E", "ForestGreen" = "#2CA02C", "Punch" = "#D62728", @@ -109,7 +109,7 @@ ggsci_db$"d3"$"category20" <- c( "Deco" = "#DBDB8D", "RegentStBlue" = "#9EDAE5" ) -# Color palette inspired by D3.js +# Color palette from D3.js ---- ggsci_db$"d3"$"category20b" <- c( "EastBay" = "#393B79", "ChaletGreen" = "#637939", "Pesto" = "#8C6D31", "Lotus" = "#843C39", @@ -123,7 +123,7 @@ ggsci_db$"d3"$"category20b" <- c( "TonysPink" = "#E7969C", "LightOrchid" = "#DE9ED6" ) -# Color palette inspired by D3.js +# Color palette from D3.js ---- ggsci_db$"d3"$"category20c" <- c( "BostonBlue" = "#3182BD", "Christine" = "#E6550D", "SeaGreen" = "#31A354", "Deluge" = "#756BB1", @@ -137,7 +137,7 @@ ggsci_db$"d3"$"category20c" <- c( "Snuff" = "#DADAEB", "Alto" = "#D9D9D9" ) -# Observable 10 color palette +# Observable 10 color palette ---- ggsci_db$"observable"$"observable10" <- c( "Blue" = "#4269D0", "Orange" = "#EFB118", @@ -151,7 +151,7 @@ ggsci_db$"observable"$"observable10" <- c( "Gray" = "#9498A0" ) -# Color palette inspired by IGV +# Color palette from IGV ---- ggsci_db$"igv"$"default" <- c( "chr1" = "#5050FF", "chr2" = "#CE3D32", "chr3" = "#749B58", "chr4" = "#F0E685", "chr5" = "#466983", "chr6" = "#BA6338", @@ -172,12 +172,12 @@ ggsci_db$"igv"$"default" <- c( "chr46" = "#FF1463", "chr47" = "#00D68F", "chr48" = "#14FFB1" ) -# Color palette inspired by IGV +# Color palette from IGV ---- ggsci_db$"igv"$"alternating" <- c( "Indigo" = "#5773CC", "SelectiveYellow" = "#FFB900" ) -# Color palette inspired by LocusZoom +# Color palette from LocusZoom ---- ggsci_db$"locuszoom"$"default" <- c( "0.8to1.0" = "#D43F3A", "0.6to0.8" = "#EEA236", "0.4to0.6" = "#5CB85C", "0.2to0.4" = "#46B8DA", @@ -185,7 +185,7 @@ ggsci_db$"locuszoom"$"default" <- c( "nodata" = "#B8B8B8" ) -# Color palette inspired by University of Chicago Color Palette +# University of Chicago color palette ---- ggsci_db$"uchicago"$"default" <- c( "Maroon" = "#800000", "DarkGray" = "#767676", "Yellow" = "#FFA319", "LightGreen" = "#8A9045", @@ -194,7 +194,7 @@ ggsci_db$"uchicago"$"default" <- c( "Violet" = "#350E20" ) -# Color palette inspired by University of Chicago color palette (light version) +# University of Chicago color palette (light version) ---- ggsci_db$"uchicago"$"light" <- c( "Maroon" = "#800000", "LightGray" = "#D6D6CE", "Yellow" = "#FFB547", "LightGreen" = "#ADB17D", @@ -203,7 +203,7 @@ ggsci_db$"uchicago"$"light" <- c( "Violet" = "#725663" ) -# Color palette inspired by University of Chicago color palette (dark version) +# University of Chicago color palette (dark version) ---- ggsci_db$"uchicago"$"dark" <- c( "Maroon" = "#800000", "DarkGray" = "#767676", "Yellow" = "#CC8214", "LightGreen" = "#616530", @@ -212,7 +212,7 @@ ggsci_db$"uchicago"$"dark" <- c( "Violet" = "#350E20" ) -# Color palette inspired by COSMIC Hallmarks of Cancer +# Color palette inspired by COSMIC Hallmarks of Cancer ---- ggsci_db$"cosmic"$"hallmarks_dark" <- c( "Invasion and Metastasis" = "#171717", "Escaping Immunic Response to Cancer" = "#7D0226", @@ -226,7 +226,7 @@ ggsci_db$"cosmic"$"hallmarks_dark" <- c( "Tumour Promoting Inflammation" = "#A8450C" ) -# Color palette inspired by Hanahan, Weinberg Hallmarks of Cancer +# Color palette inspired by Hanahan, Weinberg Hallmarks of Cancer ---- ggsci_db$"cosmic"$"hallmarks_light" <- c( "Invasion and Metastasis" = "#2E2A2B", "Escaping Immunic Response to Cancer" = "#CF4E9C", @@ -240,7 +240,7 @@ ggsci_db$"cosmic"$"hallmarks_light" <- c( "Tumour Promoting Inflammation" = "#DC9445" ) -# Color palette inspired by COSMIC Hallmarks of Cancer +# Color palette inspired by COSMIC Hallmarks of Cancer ---- ggsci_db$"cosmic"$"signature_substitutions" <- c( "C>A" = "#5ABCEB", "C>G" = "#050708", @@ -250,7 +250,7 @@ ggsci_db$"cosmic"$"signature_substitutions" <- c( "T>G" = "#E7C9C6" ) -# Color palette inspired by The Simpsons +# Color palette inspired by The Simpsons ---- ggsci_db$"simpsons"$"springfield" <- c( "HomerYellow" = "#FED439", "HomerBlue" = "#709AE1", "HomerGrey" = "#8A9197", "HomerBrown" = "#D2AF81", @@ -262,7 +262,7 @@ ggsci_db$"simpsons"$"springfield" <- c( "BobGreen" = "#1A9993", "FrinkPink" = "#FD8CC1" ) -# Color palette inspired by Futurama +# Color palette inspired by Futurama ---- ggsci_db$"futurama"$"planetexpress" <- c( "FryOrange" = "#FF6F00", "FryRed" = "#C71000", "FryBlue" = "#008EA0", "LeelaPurple" = "#8A4198", @@ -272,7 +272,7 @@ ggsci_db$"futurama"$"planetexpress" <- c( "ScruffyGreen" = "#1A5354", "LeelaGrey" = "#3F4041" ) -# Color palette inspired by Rick and Morty +# Color palette inspired by Rick and Morty ---- ggsci_db$"rickandmorty"$"schwifty" <- c( "MortyYellow" = "#FAFD7C", "MortyBrown" = "#82491E", "MortyBlue" = "#24325F", "RickBlue" = "#B7E4F9", @@ -282,7 +282,7 @@ ggsci_db$"rickandmorty"$"schwifty" <- c( "RickBrown" = "#917C5D", "MeeseeksBlue" = "#69C8EC" ) -# Color palette inspired by Star Trek +# Color palette inspired by Star Trek ---- ggsci_db$"startrek"$"uniform" <- c( "Engineering" = "#CC0C00", "Sciences" = "#5C88DA", "Senior" = "#84BD00", "Command" = "#FFCD00", @@ -290,7 +290,7 @@ ggsci_db$"startrek"$"uniform" <- c( "Jade" = "#00AF66" ) -# Color palette inspired by Tron Legacy +# Color palette inspired by Tron Legacy ---- ggsci_db$"tron"$"legacy" <- c( "BlackGuard" = "#FF410D", "Sam" = "#6EE2FF", "Clu" = "#F7C530", "Underclass" = "#95CC5E", @@ -298,7 +298,7 @@ ggsci_db$"tron"$"legacy" <- c( "Underclass2" = "#748AA6" ) -# Color palette inspired by the logo of Frontiers +# Color palette inspired by the logo of Frontiers ---- # https://www.frontiersin.org ggsci_db$"frontiers"$"default" <- c( "Crimson" = "#D51317", "Tangerine" = "#F39200", @@ -308,7 +308,7 @@ ggsci_db$"frontiers"$"default" <- c( "Plum" = "#6F286A", "DoveGrey" = "#706F6F" ) -# Flat UI color palette V1 +# Flat UI color palette V1 ---- # https://flatuicolors.com/palette/defo ggsci_db$"flatui"$"default" <- c( "Pomegranate" = "#c0392b", "Pumkin" = "#d35400", @@ -318,7 +318,7 @@ ggsci_db$"flatui"$"default" <- c( "Asbestos" = "#7f8c8d", "Silver" = "#bdc3c7" ) -# Flat UI color palette by Erigon +# Flat UI color palette by Erigon ---- ggsci_db$"flatui"$"flattastic" <- c( "Grapefruit" = "#DA4453", "Bittersweet" = "#E95546", "Sunflower" = "#F6BA59", "Grass" = "#8BC163", @@ -328,7 +328,7 @@ ggsci_db$"flatui"$"flattastic" <- c( "MediumGrey" = "#AAB2BC", "DarkGrey" = "#434A53" ) -# Flat UI color palette by Aussie Palette by Kate Hoolahan +# Flat UI color palette by Aussie Palette by Kate Hoolahan ---- # https://flatuicolors.com/palette/au ggsci_db$"flatui"$"aussie" <- c( "Turbo" = "#F9CA24", "QuinceJelly" = "#F0932B", @@ -340,7 +340,7 @@ ggsci_db$"flatui"$"aussie" <- c( # Continuous Color Palettes -# Color palette inspired by heatmaps generated by GSEA GenePattern +# Color palette from heatmaps generated by GSEA GenePattern ---- ggsci_db$"gsea"$"default" <- c( "Purple" = "#4500AD", "DarkBlue" = "#2700D1", "RoyalBlue" = "#6B58EF", "Malibu" = "#8888FF", @@ -350,7 +350,7 @@ ggsci_db$"gsea"$"default" <- c( "Flamingo" = "#EF4040", "GuardsmanRed" = "#D60C00" ) -# Bootstrap 5 color palettes +# Bootstrap 5 color palettes ---- ggsci_db$"bs5"$"blue" <- c( "blue-100" = "#cfe2ff", "blue-200" = "#9ec5fe", "blue-300" = "#6ea8fe", "blue-400" = "#3d8bfd", @@ -439,7 +439,7 @@ ggsci_db$"bs5"$"gray" <- c( "gray-900" = "#212529" ) -# Material Design color palettes +# Material Design color palettes ---- ggsci_db$"material"$"red" <- c( "Red50" = "#FFEBEE", "Red100" = "#FFCDD2", "Red200" = "#EF9A9A", "Red300" = "#E57373", @@ -591,3 +591,158 @@ ggsci_db$"material"$"blue-grey" <- c( "BlueGrey600" = "#546E7A", "BlueGrey700" = "#455A64", "BlueGrey800" = "#37474F", "BlueGrey900" = "#263238" ) + +# Tailwind CSS v3 color palettes ---- +ggsci_db$"tw3"$"slate" <- c( + "slate-50" = "#f8fafc", "slate-100" = "#f1f5f9", "slate-200" = "#e2e8f0", + "slate-300" = "#cbd5e1", "slate-400" = "#94a3b8", "slate-500" = "#64748b", + "slate-600" = "#475569", "slate-700" = "#334155", "slate-800" = "#1e293b", + "slate-900" = "#0f172a", "slate-950" = "#020617" +) + +ggsci_db$"tw3"$"gray" <- c( + "gray-50" = "#f9fafb", "gray-100" = "#f3f4f6", "gray-200" = "#e5e7eb", + "gray-300" = "#d1d5db", "gray-400" = "#9ca3af", "gray-500" = "#6b7280", + "gray-600" = "#4b5563", "gray-700" = "#374151", "gray-800" = "#1f2937", + "gray-900" = "#111827", "gray-950" = "#030712" +) + +ggsci_db$"tw3"$"zinc" <- c( + "zinc-50" = "#fafafa", "zinc-100" = "#f4f4f5", "zinc-200" = "#e4e4e7", + "zinc-300" = "#d4d4d8", "zinc-400" = "#a1a1aa", "zinc-500" = "#71717a", + "zinc-600" = "#52525b", "zinc-700" = "#3f3f46", "zinc-800" = "#27272a", + "zinc-900" = "#18181b", "zinc-950" = "#09090b" +) + +ggsci_db$"tw3"$"neutral" <- c( + "neutral-50" = "#fafafa", "neutral-100" = "#f5f5f5", "neutral-200" = "#e5e5e5", + "neutral-300" = "#d4d4d4", "neutral-400" = "#a3a3a3", "neutral-500" = "#737373", + "neutral-600" = "#525252", "neutral-700" = "#404040", "neutral-800" = "#262626", + "neutral-900" = "#171717", "neutral-950" = "#0a0a0a" +) + +ggsci_db$"tw3"$"stone" <- c( + "stone-50" = "#fafaf9", "stone-100" = "#f5f5f4", "stone-200" = "#e7e5e4", + "stone-300" = "#d6d3d1", "stone-400" = "#a8a29e", "stone-500" = "#78716c", + "stone-600" = "#57534e", "stone-700" = "#44403c", "stone-800" = "#292524", + "stone-900" = "#1c1917", "stone-950" = "#0c0a09" +) + +ggsci_db$"tw3"$"red" <- c( + "red-50" = "#fef2f2", "red-100" = "#fee2e2", "red-200" = "#fecaca", + "red-300" = "#fca5a5", "red-400" = "#f87171", "red-500" = "#ef4444", + "red-600" = "#dc2626", "red-700" = "#b91c1c", "red-800" = "#991b1b", + "red-900" = "#7f1d1d", "red-950" = "#450a0a" +) + +ggsci_db$"tw3"$"orange" <- c( + "orange-50" = "#fff7ed", "orange-100" = "#ffedd5", "orange-200" = "#fed7aa", + "orange-300" = "#fdba74", "orange-400" = "#fb923c", "orange-500" = "#f97316", + "orange-600" = "#ea580c", "orange-700" = "#c2410c", "orange-800" = "#9a3412", + "orange-900" = "#7c2d12", "orange-950" = "#431407" +) + +ggsci_db$"tw3"$"amber" <- c( + "amber-50" = "#fffbeb", "amber-100" = "#fef3c7", "amber-200" = "#fde68a", + "amber-300" = "#fcd34d", "amber-400" = "#fbbf24", "amber-500" = "#f59e0b", + "amber-600" = "#d97706", "amber-700" = "#b45309", "amber-800" = "#92400e", + "amber-900" = "#78350f", "amber-950" = "#451a03" +) + +ggsci_db$"tw3"$"yellow" <- c( + "yellow-50" = "#fefce8", "yellow-100" = "#fef9c3", "yellow-200" = "#fef08a", + "yellow-300" = "#fde047", "yellow-400" = "#facc15", "yellow-500" = "#eab308", + "yellow-600" = "#ca8a04", "yellow-700" = "#a16207", "yellow-800" = "#854d0e", + "yellow-900" = "#713f12", "yellow-950" = "#422006" +) + +ggsci_db$"tw3"$"lime" <- c( + "lime-50" = "#f7fee7", "lime-100" = "#ecfccb", "lime-200" = "#d9f99d", + "lime-300" = "#bef264", "lime-400" = "#a3e635", "lime-500" = "#84cc16", + "lime-600" = "#65a30d", "lime-700" = "#4d7c0f", "lime-800" = "#3f6212", + "lime-900" = "#365314", "lime-950" = "#1a2e05" +) + +ggsci_db$"tw3"$"green" <- c( + "green-50" = "#f0fdf4", "green-100" = "#dcfce7", "green-200" = "#bbf7d0", + "green-300" = "#86efac", "green-400" = "#4ade80", "green-500" = "#22c55e", + "green-600" = "#16a34a", "green-700" = "#15803d", "green-800" = "#166534", + "green-900" = "#14532d", "green-950" = "#052e16" +) + +ggsci_db$"tw3"$"emerald" <- c( + "emerald-50" = "#ecfdf5", "emerald-100" = "#d1fae5", "emerald-200" = "#a7f3d0", + "emerald-300" = "#6ee7b7", "emerald-400" = "#34d399", "emerald-500" = "#10b981", + "emerald-600" = "#059669", "emerald-700" = "#047857", "emerald-800" = "#065f46", + "emerald-900" = "#064e3b", "emerald-950" = "#022c22" +) + +ggsci_db$"tw3"$"teal" <- c( + "teal-50" = "#f0fdfa", "teal-100" = "#ccfbf1", "teal-200" = "#99f6e4", + "teal-300" = "#5eead4", "teal-400" = "#2dd4bf", "teal-500" = "#14b8a6", + "teal-600" = "#0d9488", "teal-700" = "#0f766e", "teal-800" = "#115e59", + "teal-900" = "#134e4a", "teal-950" = "#042f2e" +) + +ggsci_db$"tw3"$"cyan" <- c( + "cyan-50" = "#ecfeff", "cyan-100" = "#cffafe", "cyan-200" = "#a5f3fc", + "cyan-300" = "#67e8f9", "cyan-400" = "#22d3ee", "cyan-500" = "#06b6d4", + "cyan-600" = "#0891b2", "cyan-700" = "#0e7490", "cyan-800" = "#155e75", + "cyan-900" = "#164e63", "cyan-950" = "#083344" +) + +ggsci_db$"tw3"$"sky" <- c( + "sky-50" = "#f0f9ff", "sky-100" = "#e0f2fe", "sky-200" = "#bae6fd", + "sky-300" = "#7dd3fc", "sky-400" = "#38bdf8", "sky-500" = "#0ea5e9", + "sky-600" = "#0284c7", "sky-700" = "#0369a1", "sky-800" = "#075985", + "sky-900" = "#0c4a6e", "sky-950" = "#082f49" +) + +ggsci_db$"tw3"$"blue" <- c( + "blue-50" = "#eff6ff", "blue-100" = "#dbeafe", "blue-200" = "#bfdbfe", + "blue-300" = "#93c5fd", "blue-400" = "#60a5fa", "blue-500" = "#3b82f6", + "blue-600" = "#2563eb", "blue-700" = "#1d4ed8", "blue-800" = "#1e40af", + "blue-900" = "#1e3a8a", "blue-950" = "#172554" +) + +ggsci_db$"tw3"$"indigo" <- c( + "indigo-50" = "#eef2ff", "indigo-100" = "#e0e7ff", "indigo-200" = "#c7d2fe", + "indigo-300" = "#a5b4fc", "indigo-400" = "#818cf8", "indigo-500" = "#6366f1", + "indigo-600" = "#4f46e5", "indigo-700" = "#4338ca", "indigo-800" = "#3730a3", + "indigo-900" = "#312e81", "indigo-950" = "#1e1b4b" +) + +ggsci_db$"tw3"$"violet" <- c( + "violet-50" = "#f5f3ff", "violet-100" = "#ede9fe", "violet-200" = "#ddd6fe", + "violet-300" = "#c4b5fd", "violet-400" = "#a78bfa", "violet-500" = "#8b5cf6", + "violet-600" = "#7c3aed", "violet-700" = "#6d28d9", "violet-800" = "#5b21b6", + "violet-900" = "#4c1d95", "violet-950" = "#2e1065" +) + +ggsci_db$"tw3"$"purple" <- c( + "purple-50" = "#faf5ff", "purple-100" = "#f3e8ff", "purple-200" = "#e9d5ff", + "purple-300" = "#d8b4fe", "purple-400" = "#c084fc", "purple-500" = "#a855f7", + "purple-600" = "#9333ea", "purple-700" = "#7e22ce", "purple-800" = "#6b21a8", + "purple-900" = "#581c87", "purple-950" = "#3b0764" +) + +ggsci_db$"tw3"$"fuchsia" <- c( + "fuchsia-50" = "#fdf4ff", "fuchsia-100" = "#fae8ff", "fuchsia-200" = "#f5d0fe", + "fuchsia-300" = "#f0abfc", "fuchsia-400" = "#e879f9", "fuchsia-500" = "#d946ef", + "fuchsia-600" = "#c026d3", "fuchsia-700" = "#a21caf", "fuchsia-800" = "#86198f", + "fuchsia-900" = "#701a75", "fuchsia-950" = "#4a044e" +) + +ggsci_db$"tw3"$"pink" <- c( + "pink-50" = "#fdf2f8", "pink-100" = "#fce7f3", "pink-200" = "#fbcfe8", + "pink-300" = "#f9a8d4", "pink-400" = "#f472b6", "pink-500" = "#ec4899", + "pink-600" = "#db2777", "pink-700" = "#be185d", "pink-800" = "#9d174d", + "pink-900" = "#831843", "pink-950" = "#500724" +) + +ggsci_db$"tw3"$"rose" <- c( + "rose-50" = "#fff1f2", "rose-100" = "#ffe4e6", "rose-200" = "#fecdd3", + "rose-300" = "#fda4af", "rose-400" = "#fb7185", "rose-500" = "#f43f5e", + "rose-600" = "#e11d48", "rose-700" = "#be123c", "rose-800" = "#9f1239", + "rose-900" = "#881337", "rose-950" = "#4c0519" +) diff --git a/_pkgdown.yml b/_pkgdown.yml index 34d369f..b12be3f 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -153,3 +153,10 @@ reference: - scale_color_material - scale_colour_material - scale_fill_material + - title: "Tailwind CSS" + contents: + - rgb_tw3 + - pal_tw3 + - scale_color_tw3 + - scale_colour_tw3 + - scale_fill_tw3 diff --git a/man/pal_tw3.Rd b/man/pal_tw3.Rd new file mode 100644 index 0000000..7037d41 --- /dev/null +++ b/man/pal_tw3.Rd @@ -0,0 +1,60 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/continuous-tw3.R +\name{pal_tw3} +\alias{pal_tw3} +\title{Tailwind CSS color palettes} +\usage{ +pal_tw3( + palette = c("slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", + "violet", "purple", "fuchsia", "pink", "rose"), + n = 10, + alpha = 1, + reverse = FALSE +) +} +\arguments{ +\item{palette}{Palette type. There are 22 available options: +\itemize{ +\item \code{"slate"} +\item \code{"gray"} +\item \code{"zinc"} +\item \code{"neutral"} +\item \code{"stone"} +\item \code{"red"} +\item \code{"orange"} +\item \code{"amber"} +\item \code{"yellow"} +\item \code{"lime"} +\item \code{"green"} +\item \code{"emerald"} +\item \code{"teal"} +\item \code{"cyan"} +\item \code{"sky"} +\item \code{"blue"} +\item \code{"indigo"} +\item \code{"violet"} +\item \code{"purple"} +\item \code{"fuchsia"} +\item \code{"pink"} +\item \code{"rose"} +}} + +\item{n}{Number of individual colors to be generated.} + +\item{alpha}{Transparency level, a real number in (0, 1]. +See \code{alpha} in \code{\link[grDevices:rgb]{grDevices::rgb()}} for details.} + +\item{reverse}{Logical. Should the order of the colors be reversed?} +} +\description{ +Tailwind CSS color palettes. +} +\examples{ +library("scales") +show_col(pal_tw3("rose")(10)) +show_col(pal_tw3("rose", n = 30, alpha = 0.6, reverse = TRUE)(30)) +} +\author{ +Nan Xiao | \email{me@nanx.me} | \url{https://nanx.me} +} diff --git a/man/rgb_tw3.Rd b/man/rgb_tw3.Rd new file mode 100644 index 0000000..5853a04 --- /dev/null +++ b/man/rgb_tw3.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/continuous-tw3.R +\name{rgb_tw3} +\alias{rgb_tw3} +\title{Tailwind CSS color palettes} +\usage{ +rgb_tw3( + palette = c("slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", + "violet", "purple", "fuchsia", "pink", "rose"), + n = 10, + alpha = 1, + reverse = FALSE +) +} +\arguments{ +\item{palette}{Palette type. There are 22 available options: +\itemize{ +\item \code{"slate"} +\item \code{"gray"} +\item \code{"zinc"} +\item \code{"neutral"} +\item \code{"stone"} +\item \code{"red"} +\item \code{"orange"} +\item \code{"amber"} +\item \code{"yellow"} +\item \code{"lime"} +\item \code{"green"} +\item \code{"emerald"} +\item \code{"teal"} +\item \code{"cyan"} +\item \code{"sky"} +\item \code{"blue"} +\item \code{"indigo"} +\item \code{"violet"} +\item \code{"purple"} +\item \code{"fuchsia"} +\item \code{"pink"} +\item \code{"rose"} +}} + +\item{n}{Number of individual colors to be generated.} + +\item{alpha}{Transparency level, a real number in (0, 1]. +See \code{alpha} in \code{\link[grDevices:rgb]{grDevices::rgb()}} for details.} + +\item{reverse}{Logical. Should the order of the colors be reversed?} +} +\description{ +Tailwind CSS color palettes. +} +\examples{ +library("scales") +show_col(pal_tw3("rose")(10)) +show_col(pal_tw3("rose", n = 30, alpha = 0.6, reverse = TRUE)(30)) +} +\references{ +\url{https://tailwindcss.com/docs/customizing-colors} +} +\author{ +Nan Xiao | \email{me@nanx.me} | \url{https://nanx.me} +} diff --git a/man/scale_tw3.Rd b/man/scale_tw3.Rd new file mode 100644 index 0000000..c2c0414 --- /dev/null +++ b/man/scale_tw3.Rd @@ -0,0 +1,94 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/continuous-tw3.R +\name{scale_color_tw3} +\alias{scale_color_tw3} +\alias{scale_colour_tw3} +\alias{scale_fill_tw3} +\title{Tailwind CSS color scales} +\usage{ +scale_color_tw3( + palette = c("slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", + "violet", "purple", "fuchsia", "pink", "rose"), + alpha = 1, + reverse = FALSE, + ... +) + +scale_colour_tw3( + palette = c("slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", + "violet", "purple", "fuchsia", "pink", "rose"), + alpha = 1, + reverse = FALSE, + ... +) + +scale_fill_tw3( + palette = c("slate", "gray", "zinc", "neutral", "stone", "red", "orange", "amber", + "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", + "violet", "purple", "fuchsia", "pink", "rose"), + alpha = 1, + reverse = FALSE, + ... +) +} +\arguments{ +\item{palette}{Palette type. There are 22 available options: +\itemize{ +\item \code{"slate"} +\item \code{"gray"} +\item \code{"zinc"} +\item \code{"neutral"} +\item \code{"stone"} +\item \code{"red"} +\item \code{"orange"} +\item \code{"amber"} +\item \code{"yellow"} +\item \code{"lime"} +\item \code{"green"} +\item \code{"emerald"} +\item \code{"teal"} +\item \code{"cyan"} +\item \code{"sky"} +\item \code{"blue"} +\item \code{"indigo"} +\item \code{"violet"} +\item \code{"purple"} +\item \code{"fuchsia"} +\item \code{"pink"} +\item \code{"rose"} +}} + +\item{alpha}{Transparency level, a real number in (0, 1]. +See \code{alpha} in \code{\link[grDevices:rgb]{grDevices::rgb()}} for details.} + +\item{reverse}{Logical. Should the order of the colors be reversed?} + +\item{...}{Additional parameters for \code{\link[ggplot2:discrete_scale]{ggplot2::discrete_scale()}}.} +} +\description{ +See \code{\link[=pal_tw3]{pal_tw3()}} for details. +} +\examples{ +library("ggplot2") + +data("mtcars") +cor <- abs(cor(mtcars)) +cor_melt <- data.frame( + Var1 = rep(seq_len(nrow(cor)), times = ncol(cor)), + Var2 = rep(seq_len(ncol(cor)), each = nrow(cor)), + value = as.vector(cor) +) + +ggplot( + cor_melt, + aes(x = Var1, y = Var2, fill = value) +) + + geom_tile(colour = "black", size = 0.3) + + theme_bw() + + scale_fill_tw3("slate") +} +\author{ +Nan Xiao | \email{me@nanx.me} | \url{https://nanx.me} +} From 4066bc60bb4cc2c55b68cf2fabaf6a98e63c8be4 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Mon, 17 Jun 2024 17:29:04 -0400 Subject: [PATCH 2/3] Add Tailwind CSS color palettes to vignette --- vignettes/ggsci.Rmd | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/vignettes/ggsci.Rmd b/vignettes/ggsci.Rmd index 29febd3..86390ae 100644 --- a/vignettes/ggsci.Rmd +++ b/vignettes/ggsci.Rmd @@ -126,6 +126,13 @@ summarized in the table below. | GSEA | `scale_color_gsea()` | `"default"` | `pal_gsea()` | | | `scale_fill_gsea()` | | | +-----------------+------------------------------+--------------------------------+----------------------+ +| Bootstrap 5 | `scale_color_bs5()` | `"blue"` `"indigo"`
| `pal_bs5()` | +| | `scale_fill_bs5()` | `"purple"` `"pink"`
| | +| | | `"red"` `"orange"`
| | +| | | `"yellow"` `"green"`
| | +| | | `"teal"` `"cyan"`
| | +| | | `"gray"` | | ++-----------------+------------------------------+--------------------------------+----------------------+ | Material Design | `scale_color_material()` | `"red"` `"pink"`
| `pal_material()` | | | `scale_fill_material()` | `"purple"` `"deep-purple"`
| | | | | `"indigo"` `"blue"`
| | @@ -137,6 +144,18 @@ summarized in the table below. | | | `"brown"` `"grey"`
| | | | | `"blue-grey"` | | +-----------------+------------------------------+--------------------------------+----------------------+ +| Tailwind CSS | `scale_color_tw3()` | `"slate"` `"gray"`
| `pal_tw3()` | +| | `scale_fill_tw3()` | `"zinc"` `"neutral"`
| | +| | | `"stone"` `"red"`
| | +| | | `"orange"` `"amber"`
| | +| | | `"yellow"` `"lime"`
| | +| | | `"green"` `"emerald"`
| | +| | | `"teal"` `"cyan"`
| | +| | | `"sky"` `"blue"`
| | +| | | `"indigo"` `"violet"`
| | +| | | `"purple"` `"fuchsia"`
| | +| | | `"pink"` `"rose"` | | ++-----------------+------------------------------+--------------------------------+----------------------+ ## Discrete color palettes @@ -525,6 +544,28 @@ grid.arrange( ) ``` +### Tailwind CSS + +The Tailwind CSS color palettes are from the +[Tailwind default colors](https://tailwindcss.com/docs/customizing-colors). + +```{r, fig.height=3.8} +grid.arrange( + p4 + scale_fill_tw3("slate"), p4 + scale_fill_tw3("gray"), + p4 + scale_fill_tw3("zinc"), p4 + scale_fill_tw3("neutral"), + p4 + scale_fill_tw3("stone"), p4 + scale_fill_tw3("red"), + p4 + scale_fill_tw3("orange"), p4 + scale_fill_tw3("amber"), + p4 + scale_fill_tw3("yellow"), p4 + scale_fill_tw3("lime"), + p4 + scale_fill_tw3("green"), p4 + scale_fill_tw3("emerald"), + p4 + scale_fill_tw3("teal"), p4 + scale_fill_tw3("cyan"), + p4 + scale_fill_tw3("sky"), p4 + scale_fill_tw3("blue"), + p4 + scale_fill_tw3("indigo"), p4 + scale_fill_tw3("violet"), + p4 + scale_fill_tw3("purple"), p4 + scale_fill_tw3("fuchsia"), + p4 + scale_fill_tw3("pink"), p4 + scale_fill_tw3("rose"), + ncol = 8 +) +``` + From the figure above, we can see that even though an identical matrix was visualized by all plots, some palettes are more preferable than the others because our eyes are more sensitive to the changes From d410ea7467bb006fe188015727968f3accb7f3d6 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Mon, 17 Jun 2024 17:29:12 -0400 Subject: [PATCH 3/3] Add Tailwind CSS color palettes to readme --- README.Rmd | 19 +++++++++++++++++++ README.md | 4 ++++ man/figures/README-ggsci-tw3-1.png | Bin 0 -> 37917 bytes 3 files changed, 23 insertions(+) create mode 100644 man/figures/README-ggsci-tw3-1.png diff --git a/README.Rmd b/README.Rmd index 550ff46..81541df 100644 --- a/README.Rmd +++ b/README.Rmd @@ -357,6 +357,25 @@ grid.arrange( ) ``` +### Tailwind CSS + +```{r, ggsci-tw3, fig.height=3.8} +grid.arrange( + p4 + scale_fill_tw3("slate"), p4 + scale_fill_tw3("gray"), + p4 + scale_fill_tw3("zinc"), p4 + scale_fill_tw3("neutral"), + p4 + scale_fill_tw3("stone"), p4 + scale_fill_tw3("red"), + p4 + scale_fill_tw3("orange"), p4 + scale_fill_tw3("amber"), + p4 + scale_fill_tw3("yellow"), p4 + scale_fill_tw3("lime"), + p4 + scale_fill_tw3("green"), p4 + scale_fill_tw3("emerald"), + p4 + scale_fill_tw3("teal"), p4 + scale_fill_tw3("cyan"), + p4 + scale_fill_tw3("sky"), p4 + scale_fill_tw3("blue"), + p4 + scale_fill_tw3("indigo"), p4 + scale_fill_tw3("violet"), + p4 + scale_fill_tw3("purple"), p4 + scale_fill_tw3("fuchsia"), + p4 + scale_fill_tw3("pink"), p4 + scale_fill_tw3("rose"), + ncol = 8 +) +``` + ## Contribute To contribute to this project, please take a look at the diff --git a/README.md b/README.md index 685473b..603f2d0 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,10 @@ open with `vignette("ggsci")` in R) for a quick-start guide. +### Tailwind CSS + + + ## Contribute To contribute to this project, please take a look at the [Contributing diff --git a/man/figures/README-ggsci-tw3-1.png b/man/figures/README-ggsci-tw3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..88e3a17daa658e6e0d9557ffb915351d972c7339 GIT binary patch literal 37917 zcmc$_`9DIU-9clPsw)l~9CAg=7vAig-mug{f4CsI-xc zk`R$fmdcb}_Uy*Yci!Lc#AOJwb z#o56f00RFftWLu5Z?jI64*pFb!rA8}05Y2Y`$8`68q)wkJ+$o}TX{Slkt7U5@ai0I zd3l+)Iw~b4wY1DxUS8tO%udYm)@GOHW_jG%S>EFK((=mW0`KqI-1OSN>9ytQCEg-; z=r5ONWohM1lyGo%vsXfhhK|NU0XTidu#jWI5*nJ?`q2_*VH%Q~taq%F+m?`+_N#9I z*|@<@lCX=QF63xU-b$C%*zJOBca=+&-+dQ7mv!Zs>^{dyx$7aO0X}g{h*KQ7YX+vJOtzA0W z>IZG6bcaCQ(xh1UMcm;VV=vZjDm?f$%^(3!J?E6M zgn!3gdDfd9w)kVUZRMO=Md0$JL9E z_Em<={R4mkTpa8?qI$-CT|)+%rJp;5X$l8C38k`*ow@56c=}6AlAR%4a*Is5Ltxfc zuhzLcn>YKkgn8M=P?jcRiIN0fw{uBy$+lD5#$ueG>@L`*+5K+9b~2=3ci-|SoxEGf z|M|xn_qrB${9)a;e{N@{RDb+@J9R($eJ`C+LG5CcuIcSwH7#hYD4=rO0te^g-&RV!cmnyocv?4+qz(6t>vpoux>Ux+79LI?g48~_sSX?$RjXQopshE~ zTw-~D?crtHrTjZdvRv)gN?&8&w8`x$c=eoW^n_|$$qRTv6fe6@?wnC_$S$Smi*v$m zP<19$BCd>Ib^24smEShz?Ip5%^%AnBa^t#p?$M79Ay!&7Ye3L#;o*TW2DGkWA<^&! zN8y8u7T>#hz22nH%YCZ1K166- zyvVROr%boTUD{3FyQ&g*fo!vedmCLkGw`0F+S18qvtCCj%#j54ebeTFDwwt3)Dnko zSs(XHD-H&19yR(n)0KimTC}InQWj*J4;-lN(d@+oR{WOE-Y$PoUi?_)RCl=%!#Dyo z{ss{WiCkWfKH#_$u*%tm(4&(gIP{SikT*Pd7fhdO2h&nPhF24CtljcJ`RiRl(EeK$ zw460>U+pYC1PWT@fzR}2S?gs1a5e=NZU&haIPH80r=2%=$mZz7rZx2g;1O=mI>_VQ zCR`DffxXEDnNH$Y9-J@}1~Y77%KMMp>{8C?T7VoYlt#!5k!QWlf!JpThA%*c7f%Wk zDtv#2cgMPQ@_LnpS^9VfYg-ipArPE(6OFX6^4RGA=Cl=Ua3;+iy}1(mBSJK?KN*t3 zcrUg=>zcropf(U8sC_S=YBT={j19gq>6e}(=`e}!i-SP-mL2euFamAEQuls;L!5cJ z)2gKej{Y~UO#v*_wajcjV{Zi9bSSR}{JnM-)b7r;|6UA7b2^u5g(`znSD<^&C4Q0%&V zNZW$-HUTOOcyHkQMO==xc5MvI`(cDqw~cP)d3o-RPI*oHNp~3 zu8iL*BE9z6WJ>=M%WWpp??E(PK}tNUA?_;gfiQD|E15^YUK;}iQpw->w-Ao}gIBzn zK(S=#!f7m^yxjz7;u~W&fw%?)+XPfs?KdtrdZPQxqCW$vPjVly>vdqHs`d>#h5iwE zY+*e}Jp#H0zaIqY1Vx@O=JwI*8@M4wyW`9wDS&GBV678@B^K+kiRFmMRQk){V~>EN zqK2Y4+5lE1&$?5?oq7+JOfs2J;lYLE{f=Ki#EO3eYHNaBGhS~;Hz%;mgtOP5i;|}g z?Z;K@x7)3z`a?6xioi-OQkDb9dD}1VxEMyjgyqoP1l_?K8X}Y+J;usBSpgkgIj$7( z4j>ZjEU2g?_`W}3n+eE80vv_Wb};abG3JEiFP>rcp4|d9)7zbJw1D`_fk1gHy-2XJ zfDl3d%VCK0sQY zC|4e>hUg}QX}UYUGI$qOx*3<5g^KMEbUw|?H^DX%Dr$m0^1eOymd?}@!SqP;_27z~ zJnKpkaJ|7TSpE#gQCvmPjmWx8 z$humW5|7ij-h}Nc!4%+%!BcE?6U^ew_i`~TggD&<77~wwLecE#{C6jY?u#+mdCwD# z+P(JZ=x?Pf;Fi1qRT%RG^HVs(13=Fi=Uixu?SJ`Ey<8ZJVmuOVd@impoy(t=IR&&q zLEdP$2zDA4`c|;tM9v$>v}V8YS7F^c$^FMY3kl2@*lwl&nIt}hOR{Wq+03kK|bQH{%*_cDTJoGJ{00Ltt~533w#SGQeTa6XX)1 zA|td$o|WLwQ}lplgfRo?;AeUi0qq6nEtzExbeRpS|BkU-W+hg@$ZSCte9guz(dv$1 z%0~9jR92eA%LAaSCXKTR*b)aGiDA`;&w&ZMai`cx;(twtq%#}Aqlp&@WL*@88@UYy zm`A*#gW{L?`bJ^)n_X~=DHiQds2F~-X|-MpCwE&iXH&f9u7olZz6N*fltXVz$Ovv0 zrVkcC8ftj@IVj9Bez|ue0eeZw-0VUr7iM2@Bjj#QSli-2uUpP4Pb9S0f%EV7z|3}MV^b^o-ZV`ni@>-x(@RKWW7x<*v%8= z{3$qx?_pFN0=^2UtMK$&;M`|0fe%!eex^rg-;Of`kEDXLbt&Jv{c(+#13;OVVJ=ko z){oqO1nfJo)>kfu?h@)L7YsJoit+oQe2u^M8}ylf27+e}Gnpk5_E%syITcAgkp#};>-(RT$kB1UaUmX3xXka zCo;4b%L>T;iLQA;yYM+z6ZzKej<3+b9YJS_oV;Lg3ud1&U@lxB^L4hK#yX9|n}Qpw zTGe*!&`cEqODj%^-@!2fn@U2a%?Dj(%YOvQM(&4k9ACx(PAQYROtF#F|LB4x;vNt|2? zwA~p;lYycGK!h~efcr$Jpiy1*#ace8voro|Fi2H`2@}XdH<5J$^?)NP6^q)2A@hfD z&-A6>0%2zN^#?kH*+xJSVeX0(cOqIZLi?X?qgi<;A>%e;wK-mliU7f05?YIm~rJ)kB}^wz)Ov3SQrV9|b( zP$iqovW=E+!;$lG5zOi>R>iQc#DjEtnV+F6Vfy8+$c~s|SVAFwoe_3T=ErSl;D;!4 z{Ko18?q%3D?t(Bn2JXM$%Asbtw%BRH|JKpi+RbPU5qht7?LII37=PZp|=0Tu_^?FAylzJ9Mm!EBQD1 ztyLg63bW=R6ha>%Tk{J@L)W293fYoB5&*`dLDXm;FB&|Zl@(svdii&4@gCy&&ap%5 z-lv3~>`<=q-k;l*(K12gJwH^uGtql2ZNdrHtKve%jm0+UbZ3MYzM8$lf8a^X>nalU zScAUS&V;f<4pTXIbGsRhclW1{O>O>kHR#bA=j4dkOOq!tzJo`?sPMQ!dfJ%xb;ncB zx!>ytio(VJP*(%#tD4NC*~z0*VjVqVNEdONRgD72%OaU!W*sa5@b z>YsVhw+aihMI2~|70E;_xADjH!=6`N`a~#=h;bGs75bBK1c=H>h7yd_Llh@p$Uv2SJ zF7D*+CLgq`&HSADmwnq-clGv}FWq7Wub(YEy&5KTJU{=-b@O5WDeE#ANP9I_JmZ0$ z<9@w7dy8$Wzj^vZUh#AP=j@U%#KR}VN`KSPdO_~8B2nBCsXvmzz-`rjx~+Wmy#y-xGf>80j3CF4Y6 zC(BhHunXe-4yWg9RdKY=pPBKutN*Sr%8X`vpJaVY3ffnW&JEvgBCZipOUQp_YwEuR#g9-4M)w-i^zF`9tCv4BQta_{SJwgWcP! zYz+wQ`4+4H?Qab@#LEg;{`OcHdjQBdb2h-3HU(O@q1O|9^m>u8GFWMXg=ZZG^Q|*F zOiSUf3aGBv$`{3xgmyAE$m^;;J@ouPjZo(6F4KpxqDN9Z>-BZYUT)obaMP2-yJ}7^ zPejJsZ`u`c50l?r((L(ZQfjPCdFbaqn2-Tct`XkV(L|r8YF4lQEw2t5-2!6s42@X~ zR>*Dc_dwyFdzf(R+$U<8IFNY63+=vwV=G+%TVDT~-=Q2!*^vV@^ z72>psAVTj4!N|z)>kgo#q=d!vs7HNKhFT(pQFBl-qeYRacc#lN_}G(Bn~`U&NWkOn z=?x+2KzQUW1q_1Hr!Z6qLq!Leab$2s*~HYl`fk^_w$k(vxHf)T!B=L7E7I;ma<&bx zI9q%P0A!jCPTXGmx9c$Ub0q?7naGfbx>Q*-5}FL2Szw7RaKbtjFSf5X!h)$;{*pqe zg7&-+Nl0!zMaOFKaWRwwO%)uA6h&Whf05|jiZJaKw>Z+dnAn`i1JIHVZ7+K3$+0R8 z3R|Cyy-y9h1RDF}c8!DCK~RZiiV>M-&fXPaTo?w{;;iP-MM(s@B|xN~kIz5%6!U=D zs0C;rI{D3pX!vyS^T}^+>A>fJ!ic4(al-4r;K^lkuncv{2rN$te`C!30Uh}kps<>W z;mm&td`{(M$WoDry@DEsHi`%cd3->)NOCzEA({RGBkrEWOmxCvi7igS_EAOIrW8!e z3XyY?$&?j{tpMOZe1HI42CIVK%WhIepfLWZGrer+bNN-x|Bc#$XxN`i-Lfi4$!sa^ z2+-@JE3(r;Of#I&qXLPdE8NHvAv7N%`j4C1skLVRW%Tb5NVCKWU6);2h&xPMCt9J# zCElAtQ8pqRamNnRP{_wEowilNjx`yX&w-eW@t>@^xHA@25oENVO>NnbZ);PCnNdFvPlv%Xz|4*#^HJ z(r12s3l%vWRa}lAV*E#@Jn|v3el48R67SWU^`4wU{QnwQ(F5+@>N$l^1 zr4n5!(DDi3^HrY6`a?~CbG9K7X9g(j%hkMZKBy8ra)7D7UnVmN&m@5eaE7Y{nz%kj z-~F+8<1HZdb8Dri47uYNnz)T^ghZTJfEAq9v5w(HQ5z)g7Kwdi+7E4u-J-}&0-}56 zMp$GpKBq6n8!MFPN(Gm7WikbWk6plGV@3m@8+EGsrrumR0UE+;E;3(pEvri*gK5qI z!OUi8x?OD5#J2V8H8oK0g1vc)-N{tK4&Zv!z*WJxBMp!tLhBULPCm@y2(xcnVBsR> zAZlf5j|C7x=Gq|Z5MTD|v(UQGBg{&PsKZToksJ6(kA3igEm#uPS*(d5;;g+tkrE{T z;t#icArqVr>ePeY-lBsT`aLQa4{gOtaoaL?>9yQ+9wJ#D5aF{0fbm4M`4 zF@GKh#wmdLU2OA^SX7yJ$3>TJz=8rCIn=)Z%4FB3;F~N#7;@Ulg|MWKP5Yo^s3>(r z;243J0^E^^xuXwSesDc9!R-!|*bEzCs2+l`pE3?i{rwIV>LUUDU}y2?kJ|Ds>sT+U zlvqJsl40j-uzbgOpe6}L1wsO4jEVrL`%?V7K&Z)@nK}UGIE*(@{Iw87LL)KkFfgtW z#nwZ+wsjTY`1ls{BdZCKZtA-rDSK%5VCgt&8QxsnBqC4=yNKJ{oN@ocy2~Nn@KiLZ zXv`Wzj6f5M#C~o@q+E_gtf!ZB<9Cn@wTa+T!ruir!3RBx1b;ie4ulHn>c(q1n#!#~ z$cA`m3OdU{=4%<^LZ?T5Iw zZ@#|_P3tNvP~5QOyO47d_@)H@BLBHcL^+Exb>MahyFPOuM5NyXV;=CsZl+!YrDbeO zD`Db^;>dP8;3y6z2uGhox~=dwRk+b|5bTlAo`N3_FfI?%lT~c@keZ zTPFo+Yk71L#SvYj3u#f-f*8;Kk(YC&>r;^ z%O^MiU1WL!AK6|>ZG#V%p`McMo(7aR|6OHWoYZ-nP-UaFTtU@Vw42&R&i{aGkUD))aY^qNZlp;sv;E`G9MpX+eNE%)`gB;&v!u z0K(0|F`dTo`8V?gVrg#3z9X7-t>UZ}0to!$U>HpS=JKeO7&d&xEVRb{D|4W^tE$70m5 z@3}0CQ2Y(CBoOx70-TD0AVGSiR)Pga=7_c545jzlmV1 zdCEgJU)dzD;>zh4tFCzg98XPNwkhsj5}mE=757x)<=k@h~5B4W3LKTvAtmB!@-)P)3H_cfo)3SN7-Tf(3m#AjS z)%k-|o?N|h++H?`q8|5|#Q;n(|bDk8g)F|(e>oV`2Eo7XPnOwq1sUe?>0 z8KUv{i>qHpU#W-n?8QF=4@369-#1*lV`|$#vP96_yNYusm-GBisPd!>{Oh`x9GNuNi9I-MQuK&3yx_|H7*5ZhjQ0s^9GKL%h2`_27W8F>~pc zMe|$XM(H754MJ+ zr?2`?OA=@5W<4`+HoSs!_CwO(nRM}{+A|_z%O_7AnC0zKV;GCF+om3g^VV8TZ9nji zUp9Zyn|*L-r2j*Pit~P6;+_%h0p3!bt*$v3PLcU!&Qs$SoUDJP{PPvP-1G9S<6PfE zqO1)(*`QlIO>Q~=%@>U!=cdW{?>n2|6{mE4rbt!y4`!=K^+usq#*U#2y6wc?A5jWe z%Xh$e6S57KTt4QV3w4>8(p81A1FuHXZ5h>gieTdbs9Absm1;XGtGewmd}?jqNgVqL zFcn7ce9SN~d;chpBTK*HeHKSAVz>jP24Efc;NRovK9%L?Ij?#F$2SZF-y|MmZ&w-k z6HOgg$YOKJl=xpDJ> zf$zl4ge0iqlA8!R!znA@<2rNRhKEzd@VT-2UG53MtCfuPg4kGT0^Nkfc6|lyv3Nu$ zfnyuXXSRw1FK(2U^hn|xK5_Xu?%|s7auR)a5*TvWf9TkG5EmW>Qa%+P^_Rnm!@9ef ztzrh_Zfv;IZRDxPXsr7#pa{5Xz&ukz3VVb&IHu9L+3VKb%>LfQM~ zKX2{@K-db7(~yYN%_K#58<8Ro8y#akM8Pi2WV?gh9!o=*9tg^JS-{No=)M>K;zfYF zxp35;PQM$8=hQ_h0-Ds$70$EYUUF2%pNR(zk?H`W)29n^F>5K9S*K#FJo;n=fwVs= z!sh#sh{TjXwW=kxFArGJIG7415G-TgM(78+WY&)a(0D%_p`2sfk6xNX!O1QA!|N;& z7(0l=A3XtDx1b&AllVH)MvQ`0iV`dEB!KYVZ_tJ*$0>m%OMCF-*WYy9h&+_yZtzMd z6_D@|A}{Hh7r3kmFo@ZRqn(@Km+PO3!kC`1z&UlGQTd>R=V}g0F^?L9@3-wyqw}yi zDB}FRfL&>yJvrum4-%(hYKt*fZ zQ3(>1`L!+N0+0iIh+M?w*^BVO|4Q5iN07rRN(O98DLC_&u?J6Is8JB?Q5adfRTBGL zm%9cjp-NX24?&XMJdu0@MwSB5uAfmiaO>nXc)Z6qx+z5|1zY~ z&|ZD!H$_-Z0xJEgUORFnc@Uf*ayT#0pnNM0vH^Ou3|!;N7SOd^D`Tb0(?fxx9?YDb znvmnmZNv9fla;pZtkV$^az14AsXir9P&5N*5MI(r6#S(w{-QWUy$?zHGOlPx$z&GB zX{xtNKzk@GMPj=ZOrxMmhC)RV%l{1|xac?jv7=VD-W5v)(@rl-cM%O`M43uZ;YNhg z)VDfevjbYEFXW5|yr8M0G5uy&f~y{nhKioPJUdNsKSUe?wz)a)wq3|XECi*ld{jP> zoshKCER#{u^O2J%{d&3FN@Mk5RkgX&(Up$}vh3aM<+RhCd}HT-Jsg_Smd$ z;}KZHFc;BH0w!{lPYQ4sENn=@IxDf6g4ZX&>!orNyEaF_9<4pQL6^x^0vNCrXZ8Mq zJHOPz5@b&}#_%QEg~Y7Xwfp6XhX3+HlWoV4=bq?sGUmgPt&Z&23(#V$N;lI1*xP7t z6L2nA!YgiP3N}U>skA*_f&c$nfbBp(Q;_70>BpgYqas;gP z4x*4iQSg3UX7x$aDObTLMJIxw4)$9X)1}bxH!zSB^35Pzpfs56V-FnXgARX0h_FV0e2tMgF>KS>J_C4QE+5~!?E1~nOD<*(kHt?#Zct;w{UZ zsa<%FS1t6y1Z29I691wd3N?@4S1p_Aq&01zfYUEzwmEBLu1vs`uz2J?1tg1p zJ;X`+C0!{|g9$5w%y>&@c3C{wYcD*Oj@zS$V>#*I&&j~;&D8k>aF7Dh1!d^0>w-lR z_f%3qiZ2|KQv&Peon~iO#amW^tz-D}6tLSVTn*b`0Dh(hx#f$hX<&jWsNN4EWtMeZ zlj7qtQ*yARMdF$RScqQ*&+iNEIRo$e$$nivz~oEap>6z(LfL@)#^96VF+kN7-NyYw66EX5{WwhA3h>iVks9rfXHv4Ry}IEZ9AkbNr~UiXHYLmzFLm4o%O%kt zs$>5~NKDHCT+V&is6^{mb-Y))?wah4EFZ>_zmJBY{@Pz#taHCWL%8wFj2OlC-E%NJ zS&oP5?SKTljfk>0}GN4F7vF9X2*}ixE zd@V*ybeZn1L|bt%jwtNK&-rQ~6jy4AYVZ|Zin^GRJ#5VTiAoDFHE!c+P#Hy<83P?l zmp)KB59Xe37Nt+r34~Ix$(UVGk|#7u?6U>Mko#VWEo9T>$d>X(&IRJ zZ0g%?TzIv)=T=@`OMj;-4<7WK1-d-5bPZu=Dl^vD@OK{nBLnr( zJK{Y>&Z}5Lp$kvf8m>YkQE>Z>*SRDHtZ zm~wH+bQ^kkw6^cd!`pvduPPf4Rzs-(iQk~hoM>ph{GbWSMu`rQ@+IJl_tfLUVAkdfqM*m~g z7sKw7Ba@DGvRW{mIknG^#PrmXxr8X+U*pF(MAg9yaf$Z|4A<}Pl#rFFUnQ~#`H?Iw zfkeL{K5qFqFrt~jk|Jcz};O{ zgKhgJzeNp5g2FKz-*>QxpKLffa)YA%FpSx<6BZ|f@|6({mIeamsh7kk*08oPLiWUG z7mJ}zps?~5i$%Pp25Ub%(w7SKLFRFR!^0h)gGO=mjf(ru&x6j8Zc^CYERZFRL3kO2 zoQW$^C1&PIny-^42jlCRl1mLJ*jybcjuvmeU?$Gm=qri=iKr?umM-+U#T+w>vloUXMd`|`IAZ!cmi7xYm13my? zk=}^9aRIZ=!cCM;KkuWVo)bopl$G>AS#U)JxLqAD!)IskO6IG1Sog~`WcX8vHSR?& zUVwGerQyt&BmCiPpcO%fHUU(PgAS^E$P1fzm7>DULmYe936nJYWh2zq}L8 zr;+6&(UHS-9ZoPzy^c}jOK-6(L6>HgGA01-FM~b5^b$6yC%@k>$p@USGH?KYzPEd#v*YQA?XJzVJH7GgS|fQzu+}SO?3;K@i5MpDfqK~j zHb_YXW+AU6SdOzm@)m0)i-wmLojVKMzvXEfFp zi5V(uL5F4--)OOHMo;#q)u4c1H7dgm2HcHxn(M@*(DHz0gXe?E7m00#Ogw7B@!bZsVcH(nw^I!pfd&>xc;50

UDSz85 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 literal 0 HcmV?d00001