egenn commited on
Commit
f127f19
·
1 Parent(s): 16470d0
Dockerfile CHANGED
@@ -4,13 +4,16 @@ WORKDIR /code
4
 
5
  # Install stable packages from CRAN
6
  RUN install2.r --error \
7
- ggExtra \
8
- shiny
 
9
 
10
  # Install development packages from GitHub
11
  RUN installGithub.r \
12
  rstudio/bslib \
13
- rstudio/httpuv
 
 
14
 
15
  COPY . .
16
 
 
4
 
5
  # Install stable packages from CRAN
6
  RUN install2.r --error \
7
+ shiny \
8
+ htmltools \
9
+ plotly
10
 
11
  # Install development packages from GitHub
12
  RUN installGithub.r \
13
  rstudio/bslib \
14
+ rstudio/httpuv \
15
+ egenn/rtemis \
16
+ egenn/rtemisbio
17
 
18
  COPY . .
19
 
app.R CHANGED
@@ -1,58 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  library(shiny)
2
  library(bslib)
3
- library(dplyr)
4
- library(ggplot2)
5
-
6
- df <- readr::read_csv("penguins.csv")
7
- # Find subset of columns that are suitable for scatter plot
8
- df_num <- df |> select(where(is.numeric), -Year)
9
-
10
- ui <- page_sidebar(
11
- theme = bs_theme(bootswatch = "minty"),
12
- title = "Penguins explorer",
13
- sidebar = sidebar(
14
- varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"),
15
- varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"),
16
- checkboxGroupInput("species", "Filter by species",
17
- choices = unique(df$Species), selected = unique(df$Species)
18
- ),
19
- hr(), # Add a horizontal rule
20
- checkboxInput("by_species", "Show species", TRUE),
21
- checkboxInput("show_margins", "Show marginal plots", TRUE),
22
- checkboxInput("smooth", "Add smoother"),
23
- ),
24
- plotOutput("scatter")
25
- )
26
-
27
- server <- function(input, output, session) {
28
- subsetted <- reactive({
29
- req(input$species)
30
- df |> filter(Species %in% input$species)
31
- })
32
-
33
- output$scatter <- renderPlot(
34
- {
35
- p <- ggplot(subsetted(), aes(!!input$xvar, !!input$yvar)) +
36
- theme_light() +
37
- list(
38
- theme(legend.position = "bottom"),
39
- if (input$by_species) aes(color = Species),
40
- geom_point(),
41
- if (input$smooth) geom_smooth()
42
- )
43
-
44
- if (input$show_margins) {
45
- margin_type <- if (input$by_species) "density" else "histogram"
46
- p <- p |> ggExtra::ggMarginal(
47
- type = margin_type, margins = "both",
48
- size = 8, groupColour = input$by_species, groupFill = input$by_species
49
- )
50
- }
51
-
52
- p
53
- },
54
- res = 100
55
  )
56
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- shinyApp(ui, server)
 
1
+ # xtlive.R
2
+ # ::rtemislive::
3
+ # 2024 EDG rtemis.org
4
+
5
+ # [ Shiny ]
6
+ # https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/
7
+ # https://posit-dev.github.io/r-shinylive/
8
+ # to run shiny app:
9
+ # shiny::runApp("./")
10
+ #
11
+ # [ bslib ]
12
+ # https://rstudio.github.io/bslib/
13
+ # Theming variables: https://rstudio.github.io/bslib/articles/bs5-variables/index.html
14
+ #
15
+ # [ Bootstrap icons ]
16
+ # https://icons.getbootstrap.com
17
+ #
18
+ # [ Huggingface Spaces]
19
+ # https://huggingface.co/docs/hub/en/spaces-sdks-docker-shiny
20
+
21
+ # Setup
22
  library(shiny)
23
  library(bslib)
24
+ library(htmltools)
25
+ library(plotly)
26
+ library(rtemis)
27
+ library(rtemisbio)
28
+ source("globals.R")
29
+
30
+ # Source built-in datasets from data.R
31
+ source("data.R")
32
+ # Get names of all objects defined in data.R
33
+ builtin_names <- readLines("data.R") |>
34
+ (\(z) grep("<-", x = z, value = TRUE))() |>
35
+ (\(z) gsub(" <-.*", "", x = z))()
36
+
37
+ # Colors
38
+ primary <- "#72CDF4"
39
+ secondary <- "#704071"
40
+ info <- helpcol <- "#FEB2E0"
41
+ success <- "#B4DC55"
42
+
43
+ #' Create timeseries visualization shinylive app
44
+ #'
45
+ #' Visualize timeseries data using `dplot3_xt()`
46
+ #'
47
+ #' Set verbosity to 1 to monitor app progress
48
+ #'
49
+ #' @param default_theme Character: "dark" or "light" theme
50
+ #' @param verbosity Integer: 0 = silent, 1 = verbose
51
+ #'
52
+ #' @author EDG
53
+ #' @export
54
+ #' @return A shiny app that can be converted to a shinylive app
55
+
56
+ xtlive <- function(
57
+ default_theme = "dark",
58
+ xt_plotly_height = "900px",
59
+ verbosity = 1) {
60
+ # Logo
61
+ logo <- base64enc::dataURI(
62
+ file = "./www/rtemisxt_gray.png", mime = "image/png"
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  )
64
+ # Version
65
+ xtl <- paste0(
66
+ "xtlive v.0.0.2",
67
+ # " | ", "rtemis v.0.97.3", utils::packageVersion("rtemis"), # doesn't work in shinylive
68
+ " | R v.", version$major, ".", version$minor,
69
+ " | running on ", sessionInfo()[[2]]
70
+ )
71
+
72
+ # UI page_navbar ----
73
+ ui <- function(request) {
74
+ bslib::page_navbar(
75
+ # Title ----
76
+ title = list(
77
+ logo = a(
78
+ img(
79
+ src = logo,
80
+ width = "140px",
81
+ height = "auto",
82
+ alt = "rtemis"
83
+ ),
84
+ href = "https://rtemis.org/xtlive"
85
+ )
86
+ ),
87
+ id = "xtlive",
88
+ selected = "Welcome",
89
+ footer = span(
90
+ xtl,
91
+ " © 2024 EDG",
92
+ style = "display: block; text-align: center; margin-top: 1em; margin-bottom: 1em;"
93
+ ),
94
+ # Theme ----
95
+ theme = bslib::bs_theme(
96
+ bg = "#fff",
97
+ fg = "#000",
98
+ primary = primary,
99
+ secondary = secondary,
100
+ success = success,
101
+ info = info,
102
+ `tooltip-bg` = "#303030",
103
+ `tooltip-color` = helpcol,
104
+ `tooltip-opacity` = 1,
105
+ `tooltip-border-radius` = "10px",
106
+ `tooltip-padding-x` = "1rem",
107
+ `tooltip-padding-y` = "1rem",
108
+ `tooltip-font-size` = "1rem"
109
+ # base_font = bslib::font_google("Inter"), # doesn't work in shinylive
110
+ # code_font = bslib::font_google("Fira Code")
111
+ ) |>
112
+ bs_add_rules(sass::sass_file("www/rtemislive.scss")),
113
+ # Window title ----
114
+ window_title = "rtemis xtlive",
115
+ # Language ----
116
+ lang = "en",
117
+ # tags$script(src = "globals.js"),
118
+ # Nav Panels ----
119
+ ## [] Welcome ----
120
+ bslib::nav_panel(
121
+ title = "Welcome",
122
+ icon = bsicons::bs_icon("stars"),
123
+ bslib::card(
124
+ h4("Welcome to xtlive.", style = "text-align: center;"),
125
+ card_body(
126
+ class = "d-inline text-center",
127
+ HTML(paste0(
128
+ "xtlive is a web interface for ",
129
+ as.character(a("rtemis", href = "https://rtemis.org", target = "_blank")),
130
+ ", <br>providing interactive visualization of timeseries data.",
131
+ "<br><br>",
132
+ rthelp_inline(
133
+ "To get started, use the navigation tabs at the top.",
134
+ title = "Welcome"
135
+ ),
136
+ "<br><br>This application has been compiled to ",
137
+ as.character(a("WebAssembly", href = "https://webassembly.org/", target = "_blank")),
138
+ " using ",
139
+ as.character(a("shinylive", href = "https://posit-dev.github.io/r-shinylive/", target = "_blank")),
140
+ "<br>and is best viewed with the latest version of Chrome."
141
+ ))
142
+ ),
143
+ bslib::card_image(
144
+ file = "./www/rtemisxt_splash.png",
145
+ alt = "rtemislive",
146
+ align = "center",
147
+ border_radius = "all",
148
+ fill = FALSE,
149
+ width = "40%",
150
+ class = "mx-auto"
151
+ )
152
+ )
153
+ ), # /nav_panel Welcome
154
+ ## [] Timeseries Visualization ----
155
+ bslib::nav_panel(
156
+ title = "Timeseries",
157
+ icon = bsicons::bs_icon("body-text"),
158
+ card(
159
+ full_screen = TRUE,
160
+ class = "p-0",
161
+ # allow items side by side ----
162
+ card_header(
163
+ class = "d-flex justify-content-end",
164
+ # tooltip UI output ----
165
+ uiOutput("ui_xt_tooltip"),
166
+ # popover UI output ----
167
+ uiOutput("ui_xt_popover")
168
+ ),
169
+ layout_sidebar(
170
+ fillable = TRUE,
171
+ # Data Load Sidebar ----
172
+ sidebar = bslib::sidebar(
173
+ uiOutput("ui_xt_load_switch"), # Switch between file upload and built-in data
174
+ uiOutput("ui_xt_data_load"), # File upload or built-in data selection depending on switch
175
+ uiOutput("ui_xt_data_info"), # Shows dataset info
176
+ uiOutput("ui_xt_plot_button"), # Click to plot
177
+ # uiOutput("ui_xt_tooltip")
178
+ ),
179
+ # layout_sidebar(
180
+ # sidebar = bslib::sidebar(
181
+ # position = "right",
182
+ # # xt transformations
183
+ # "Timeseries Transformations"
184
+ # ),
185
+ # # Plot Output ----
186
+ # # for shinylive, do not use plotlyOutput directly in ui !!
187
+ # # fails when no plot is rendered, unlike shiny
188
+ # uiOutput("ui_dplot3_xt")
189
+ # )
190
+ uiOutput("ui_dplot3_xt")
191
+ )
192
+ )
193
+ ), # /nav_panel Timeseries Visualization
194
+ ## [] About ----
195
+ bslib::nav_panel(
196
+ title = "About",
197
+ icon = bsicons::bs_icon("info-square"),
198
+ bslib::card(
199
+ card_image(
200
+ file = "./www/rtemislive.jpeg",
201
+ href = "https://rtemis.org",
202
+ alt = "rtemislive",
203
+ align = "center",
204
+ border_radius = "all",
205
+ fill = FALSE,
206
+ width = "54%",
207
+ class = "mx-auto"
208
+ ),
209
+ div(
210
+ class = "d-inline text-center",
211
+ HTML(paste0(
212
+ "Powered by rtemis (",
213
+ as.character(a("rtemis.org", href = "https://rtemis.org", target = "_blank")),
214
+ ")."
215
+ )),
216
+ br(), br(),
217
+ a(
218
+ img(
219
+ src = "rtemis_gray.png",
220
+ alt = "rtemis",
221
+ align = "center",
222
+ width = "190px"
223
+ ),
224
+ href = "https://rtemis.org",
225
+ target = "_blank"
226
+ ),
227
+ align = "center"
228
+ )
229
+ )
230
+ ), # /nav_panel About
231
+ bslib::nav_spacer(),
232
+ bslib::nav_item(input_dark_mode(id = "dark_mode", mode = default_theme)),
233
+ header = list(
234
+ # busy indicators ----
235
+ shinybusy::add_busy_spinner(
236
+ spin = "orbit",
237
+ # color = "#72CDF4",
238
+ color = "#00ffff",
239
+ timeout = 200,
240
+ position = "bottom-left",
241
+ onstart = FALSE
242
+ )
243
+ )
244
+ ) # /ui /bslib::page_navbar
245
+ } # /ui function
246
+
247
+ # Server ----
248
+ server <- function(input, output, session) {
249
+ # UI xt load switch ----
250
+ output$ui_xt_load_switch <- shiny::renderUI({
251
+ if (verbosity > 0) {
252
+ message("Rendering ui_xt_load_switch")
253
+ }
254
+ # Radio buttons: built-in data vs upload file ----
255
+ shiny::radioButtons(
256
+ inputId = "xt_load_switch",
257
+ label = "Data source",
258
+ choices = list(
259
+ `Built-in datasets` = "builtin",
260
+ `File upload` = "upload"
261
+ ),
262
+ selected = "builtin"
263
+ )
264
+ })
265
+
266
+ # UI xt Data ----
267
+ output$ui_xt_data_load <- shiny::renderUI({
268
+ req(input$xt_load_switch)
269
+ if (input$xt_load_switch == "upload") {
270
+ # Upload xt JSON file
271
+ if (verbosity > 0) {
272
+ message("Rendering ui_xt_data_load for file upload")
273
+ }
274
+ shiny::fileInput(
275
+ inputId = "xt_file",
276
+ label = "Upload xt file",
277
+ buttonLabel = "Browse local files...",
278
+ )
279
+ } else {
280
+ # Select built-in data stored in ./data/ directory
281
+ if (verbosity > 0) {
282
+ message("Rendering ui_xt_data_load for built-in data selection")
283
+ }
284
+ shiny::selectizeInput(
285
+ inputId = "xt_builtin_data",
286
+ label = "Select built-in xt dataset",
287
+ choices = builtin_names,
288
+ selected = builtin_names[1]
289
+ )
290
+ }
291
+ }) # /ui_xt_data_load
292
+
293
+ # UI for xt data info ----
294
+ output$ui_xt_data_info <- shiny::renderUI({
295
+ req(xt_obj())
296
+ if (verbosity > 0) {
297
+ message("Rendering ui_xt_data_info")
298
+ }
299
+ # inv comment
300
+ bslib::card(
301
+ bslib::card_title("xt Dataset Info", container = htmltools::h6),
302
+ bslib::card_body(
303
+ summarize_xt(xt_obj()),
304
+ fillable = FALSE
305
+ ) # /card_body
306
+ ) # /card
307
+ }) # /ui_xt_data_info
308
+
309
+ # UI for plot action button ----
310
+ output$ui_xt_plot_button <- shiny::renderUI({
311
+ req(xt_obj())
312
+ if (verbosity > 0) {
313
+ message("Rendering ui_xt_plot_button")
314
+ }
315
+ bslib::input_task_button(
316
+ "xt_plot_button",
317
+ "Plot dataset",
318
+ icon = bsicons::bs_icon("magic"),
319
+ label_busy = "Drawing...",
320
+ icon_busy = bsicons::bs_icon("clock-history"),
321
+ type = "primary",
322
+ auto_reset = TRUE
323
+ )
324
+ }) # /ui_xt_plot_button
325
+
326
+ # Load Dataset ----
327
+ xt_obj <- shiny::reactive({
328
+ req(input$xt_load_switch)
329
+ if (input$xt_load_switch == "upload") {
330
+ # inv changed to "req(input$xt_file$datapath)": no help
331
+ req(input$xt_file$datapath)
332
+ if (verbosity > 0) {
333
+ message("Loading xt data from file '", input$xt_file$datapath, "'")
334
+ }
335
+ # get file extension
336
+ ext <- tools::file_ext(input$xt_file$datapath)
337
+ dat <- if (ext == "json") {
338
+ read.xtjson(input$xt_file$datapath)
339
+ } else if (ext == "rds") {
340
+ readRDS(input$xt_file$datapath)
341
+ } else {
342
+ stop("Unsupported file format")
343
+ }
344
+ if (verbosity > 0) {
345
+ message("Loaded dataset of class '", class(dat)[1], "'")
346
+ }
347
+ return(dat)
348
+ } else {
349
+ # Load built-in data from data.R objects
350
+ req(input$xt_builtin_data)
351
+ if (verbosity > 0) {
352
+ message("Loading built-in xt dataset '", input$xt_builtin_data, "'")
353
+ }
354
+ # Reading from data folder works fine in shiny app, not shinylive,
355
+ # use objects from data.R instead
356
+ # assign to dat object of name input$xt_builtin_data
357
+ dat <- get(input$xt_builtin_data)
358
+ if (verbosity > 0) {
359
+ message("Loaded dataset of class '", class(dat)[1], "'")
360
+ }
361
+ return(dat)
362
+ }
363
+ }) # /xt_obj
364
+
365
+ # dplot3 theme is "white" or "black" ----
366
+ dplot3_theme <- shiny::reactive({
367
+ req(input$dark_mode)
368
+ if (input$dark_mode == "dark") {
369
+ "black"
370
+ } else {
371
+ "white"
372
+ }
373
+ }) # /dplot3_theme
374
+
375
+ # dplot3_theme() ----
376
+ dplot3_theme <- shiny::reactive({
377
+ req(input$dark_mode)
378
+ if (input$dark_mode == "dark") {
379
+ "darkgraygrid"
380
+ } else {
381
+ "whitegrid"
382
+ }
383
+ }) # /dplot3_theme
384
+
385
+ # Render plotly ----
386
+ output$dplot3_xt <- plotly::renderPlotly({
387
+ req(xt_obj())
388
+ if (verbosity > 0) {
389
+ message("Rendering dplot3_xt of object with class '", class(xt_obj())[1], "'")
390
+ }
391
+ dplot3_xt(
392
+ x = xt_obj(),
393
+ yline.width = input$xt.linewidth,
394
+ y2line.width = input$xt.linewidth,
395
+ theme = dplot3_theme(),
396
+ bg = input$plot.bg, # legend.bg defaults to transparent, this sets paper bg
397
+ plot.bg = input$plot.bg,
398
+ legend.x = 0,
399
+ legend.xanchor = "left",
400
+ show.rangeslider = input$show.rangeslider,
401
+ margin = list(l = 75, r = 75, b = 75, t = 75),
402
+ )
403
+ }) |> # /dplot3_xt
404
+ # bindEvent(input$xt_plot_button)
405
+ bindEvent(input$xt_plot_button, input$xt_plot_update_button)
406
+
407
+ # Create variable clicked that is TRUE after input$xt_plot_button is clicked
408
+ # clicked <- shiny::reactiveVal(TRUE)
409
+ clicked <- shiny::reactiveVal(FALSE)
410
+ shiny::observeEvent(input$xt_plot_button, {
411
+ clicked(TRUE)
412
+ })
413
+
414
+ # UI xt tooltip ----
415
+ output$ui_xt_tooltip <- shiny::renderUI({
416
+ if (clicked()) {
417
+ bslib::tooltip(
418
+ trigger = span(
419
+ "Plot help", bsicons::bs_icon("info-circle", class = "text-info"),
420
+ style = "text-align: right;",
421
+ class = "rtanihi"
422
+ ),
423
+ div(
424
+ # HTML(
425
+ # paste0(
426
+ # "<ul>",
427
+ # "<li>Hover over plot to see annotations.",
428
+ # "<li>Click on legend items to toggle visibility of annotations.",
429
+ # "<li>Double-click on legend items to isolate a single annotation type.",
430
+ # "<li>Click on top-right gear icon to change plot settings.",
431
+ # "</ul>"
432
+ # )
433
+ # ),
434
+ rthelplist(
435
+ c(
436
+ "Hover over plot to see spike lines",
437
+ # "Use top-right gear icon to access plot settings and click on 'Update rendering' to apply.",
438
+ "Use top-right gear icon to access plot settings.",
439
+ htmlEscape("To enter superscripts and subscripts in labs or units, use HTML tags, e.g. '<sup>2</sup>' and '<sub>i</sub>'.")
440
+ )
441
+ ),
442
+ style = "text-align: left;"
443
+ ), # /div rt-tooltip
444
+ placement = "bottom"
445
+ ) # /tooltip
446
+ }
447
+ }) # /ui_xt_tooltip
448
+
449
+ # UI xt popover ----
450
+ output$ui_xt_popover <- shiny::renderUI({
451
+ if (clicked()) {
452
+ popover(
453
+ trigger = bsicons::bs_icon("gear", class = "ms-auto"),
454
+ textInput(inputId = "xt.xlab", label = "X-axis label", value = ""),
455
+ textInput(inputId = "xt.ylab", label = "Left Y-axis label", value = ""),
456
+ textInput(inputId = "xt.y2lab", label = "Right Y-axis label", value = ""),
457
+ textInput(inputId = "xt.xunits", label = "X-axis units", value = ""),
458
+ textInput(inputId = "xt.yunits", label = "Left Y-axis units", value = ""),
459
+ textInput(inputId = "xt.y2units", label = "Right Y-axis units", value = ""),
460
+ textInput(inputId = "xt.firsttick", label = "First X-axis tick", value = "2"),
461
+ textInput(inputId = "xt.ticksevery", label = "Show X-axis ticks every this many X values", value = "2"),
462
+ sliderInput(inputId = "xt.linewidth", label = "Line width", min = 1, max = 10, value = 3),
463
+ bslib::input_switch(
464
+ id = "show.rangeslider",
465
+ label = "Show rangeslider",
466
+ value = TRUE
467
+ ),
468
+ shinyWidgets::colorPickr(
469
+ "plot.bg",
470
+ label = "Plot background",
471
+ selected = ifelse(input$dark_mode == "dark", "#191919", "#FFFFFF")
472
+ ),
473
+ # shinyWidgets::colorPickr(
474
+ # "marker.col",
475
+ # label = "Marker color",
476
+ # selected = ifelse(input$dark_mode == "dark", "#3f3f3f", "#dfdfdf")
477
+ # ),
478
+ # tags$i("Click on 'Plot dataset' to update render after changing settings."),
479
+ bslib::input_task_button(
480
+ "xt_plot_update_button",
481
+ "Update rendering",
482
+ icon = bsicons::bs_icon("arrow-clockwise"),
483
+ label_busy = "Drawing...",
484
+ icon_busy = bsicons::bs_icon("clock-history"),
485
+ type = "primary",
486
+ auto_reset = TRUE
487
+ ),
488
+ title = "Plot settings",
489
+ placement = "auto"
490
+ # options = list(trigger = "hover focus click")
491
+ ) # /popover
492
+ }
493
+ }) # /ui_xt_popover
494
+
495
+
496
+ # UI dplot3_xt ----
497
+ output$ui_dplot3_xt <- renderUI({
498
+ if (clicked() == FALSE || is.null(xt_obj())) {
499
+ rthelp(
500
+ # "Select Data Source and Click 'Plot dataset' on the left.",
501
+ "Select Data Source on the left.",
502
+ title = "Timeseries Visualization "
503
+ )
504
+ } else {
505
+ plotly::plotlyOutput(
506
+ "dplot3_xt",
507
+ width = "100%",
508
+ height = xt_plotly_height
509
+ )
510
+ }
511
+ }) # /ui_dplot3_xt
512
+ } # /server
513
+
514
+ # Shiny app ----
515
+ shiny::shinyApp(ui = ui, server = server, enableBookmarking = "url")
516
+ } # xtlive
517
 
518
+ xtlive()
data.R ADDED
The diff for this file is too large to render. See raw diff
 
favicon.png ADDED
globals.R ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # globals.R
2
+ # seqvizlive
3
+ # EDG rtemis.org
4
+
5
+ # Themes ----
6
+ # {bg_dark, bg_light} also used by plot.bg
7
+ bg_dark <- "#191919"
8
+ bg_light <- "#ffffff"
9
+ primary_dark <- "#72CDF4"
10
+ primary_light <- "#1295D8"
11
+ seconday_dark <- "#808080"
12
+ secondary_light <- "#808080"
13
+ info_dark <- "#FEB2E0"
14
+ info_light <- "#E44C9A"
15
+ success_dark <- "#B4DC55"
16
+ success_light <- "#84C234"
17
+
18
+ bslib_dark <- bslib::bs_theme(
19
+ bg = bg_dark,
20
+ fg = "#fff",
21
+ primary = primary_dark,
22
+ secondary = seconday_dark,
23
+ success = success_dark,
24
+ info = info_dark,
25
+ `tooltip-bg` = "#bbbbbb",
26
+ `tooltip-color` = info_dark,
27
+ `tooltip-opacity` = .95
28
+ ) |>
29
+ bslib::bs_add_rules(sass::sass_file("www/rtemislive.scss"))
30
+
31
+ bslib_light <- bslib::bs_theme(
32
+ bg = bg_light,
33
+ fg = "#000",
34
+ primary = primary_light,
35
+ secondary = secondary_light,
36
+ success = success_light,
37
+ info = info_light,
38
+ `tooltip-bg` = "#303030",
39
+ `tooltip-color` = info_light,
40
+ `tooltip-opacity` = .95
41
+ ) |>
42
+ bslib::bs_add_rules(sass::sass_file("www/rtemislive.scss"))
43
+
44
+ # from rtemislive
45
+ rthelp <- function(..., title = NULL, class = "rthelp") {
46
+ div(
47
+ div(HTML(paste0(title, " Instructions")),
48
+ style = "color: #808080; font-weight: 300; padding-bottom:.5em;"
49
+ ),
50
+ HTML(paste0("<i>", paste(..., sep = "<br>")), "</i>"),
51
+ class = class
52
+ )
53
+ } # rtemislive::rthelp
54
+
55
+ rthelp_inline <- function(..., title = NULL, class = "rthelp-inline") {
56
+ rthelp(..., title = title, class = class)
57
+ } # rtemislive::rthelp_inline
58
+
59
+ bold <- function(x) {
60
+ paste0("<b>", x, "</b>")
61
+ }
62
+
63
+ hilite <- function(x) {
64
+ paste0("<span style='color: #72CDF4;font-weight: bold;'>", x, "</span>")
65
+ }
66
+
67
+ #' Summarize xt object in HTML
68
+ #'
69
+ #' @param x xt object
70
+ #'
71
+ #' @return HTML string
72
+ #' @author EDG
73
+ summarize_xt <- function(x) {
74
+ htmltools::HTML(
75
+ paste0(
76
+ paste0("N time points: ", hilite(length(x$x[[1]])))
77
+ )
78
+ )
79
+ } # seqvizlive::summarize_xt
80
+
81
+
82
+ # Create list using custom bullet
83
+ rthelplist <- function(x, bullet = bsicons::bs_icon("arrow-right-short")) {
84
+ htmltools::HTML(
85
+ paste0(
86
+ bullet, "<i>", x, "</i>", "<br>"
87
+ )
88
+ )
89
+ } # seqvizlive::rtlist
90
+
91
+ rtTheme <- theme_darkgraygrid()
penguins.csv DELETED
@@ -1,345 +0,0 @@
1
- Species,Island,Bill Length (mm),Bill Depth (mm),Flipper Length (mm),Body Mass (g),Sex,Year
2
- Adelie,Torgersen,39.1,18.7,181,3750,male,2007
3
- Adelie,Torgersen,39.5,17.4,186,3800,female,2007
4
- Adelie,Torgersen,40.3,18,195,3250,female,2007
5
- Adelie,Torgersen,NA,NA,NA,NA,NA,2007
6
- Adelie,Torgersen,36.7,19.3,193,3450,female,2007
7
- Adelie,Torgersen,39.3,20.6,190,3650,male,2007
8
- Adelie,Torgersen,38.9,17.8,181,3625,female,2007
9
- Adelie,Torgersen,39.2,19.6,195,4675,male,2007
10
- Adelie,Torgersen,34.1,18.1,193,3475,NA,2007
11
- Adelie,Torgersen,42,20.2,190,4250,NA,2007
12
- Adelie,Torgersen,37.8,17.1,186,3300,NA,2007
13
- Adelie,Torgersen,37.8,17.3,180,3700,NA,2007
14
- Adelie,Torgersen,41.1,17.6,182,3200,female,2007
15
- Adelie,Torgersen,38.6,21.2,191,3800,male,2007
16
- Adelie,Torgersen,34.6,21.1,198,4400,male,2007
17
- Adelie,Torgersen,36.6,17.8,185,3700,female,2007
18
- Adelie,Torgersen,38.7,19,195,3450,female,2007
19
- Adelie,Torgersen,42.5,20.7,197,4500,male,2007
20
- Adelie,Torgersen,34.4,18.4,184,3325,female,2007
21
- Adelie,Torgersen,46,21.5,194,4200,male,2007
22
- Adelie,Biscoe,37.8,18.3,174,3400,female,2007
23
- Adelie,Biscoe,37.7,18.7,180,3600,male,2007
24
- Adelie,Biscoe,35.9,19.2,189,3800,female,2007
25
- Adelie,Biscoe,38.2,18.1,185,3950,male,2007
26
- Adelie,Biscoe,38.8,17.2,180,3800,male,2007
27
- Adelie,Biscoe,35.3,18.9,187,3800,female,2007
28
- Adelie,Biscoe,40.6,18.6,183,3550,male,2007
29
- Adelie,Biscoe,40.5,17.9,187,3200,female,2007
30
- Adelie,Biscoe,37.9,18.6,172,3150,female,2007
31
- Adelie,Biscoe,40.5,18.9,180,3950,male,2007
32
- Adelie,Dream,39.5,16.7,178,3250,female,2007
33
- Adelie,Dream,37.2,18.1,178,3900,male,2007
34
- Adelie,Dream,39.5,17.8,188,3300,female,2007
35
- Adelie,Dream,40.9,18.9,184,3900,male,2007
36
- Adelie,Dream,36.4,17,195,3325,female,2007
37
- Adelie,Dream,39.2,21.1,196,4150,male,2007
38
- Adelie,Dream,38.8,20,190,3950,male,2007
39
- Adelie,Dream,42.2,18.5,180,3550,female,2007
40
- Adelie,Dream,37.6,19.3,181,3300,female,2007
41
- Adelie,Dream,39.8,19.1,184,4650,male,2007
42
- Adelie,Dream,36.5,18,182,3150,female,2007
43
- Adelie,Dream,40.8,18.4,195,3900,male,2007
44
- Adelie,Dream,36,18.5,186,3100,female,2007
45
- Adelie,Dream,44.1,19.7,196,4400,male,2007
46
- Adelie,Dream,37,16.9,185,3000,female,2007
47
- Adelie,Dream,39.6,18.8,190,4600,male,2007
48
- Adelie,Dream,41.1,19,182,3425,male,2007
49
- Adelie,Dream,37.5,18.9,179,2975,NA,2007
50
- Adelie,Dream,36,17.9,190,3450,female,2007
51
- Adelie,Dream,42.3,21.2,191,4150,male,2007
52
- Adelie,Biscoe,39.6,17.7,186,3500,female,2008
53
- Adelie,Biscoe,40.1,18.9,188,4300,male,2008
54
- Adelie,Biscoe,35,17.9,190,3450,female,2008
55
- Adelie,Biscoe,42,19.5,200,4050,male,2008
56
- Adelie,Biscoe,34.5,18.1,187,2900,female,2008
57
- Adelie,Biscoe,41.4,18.6,191,3700,male,2008
58
- Adelie,Biscoe,39,17.5,186,3550,female,2008
59
- Adelie,Biscoe,40.6,18.8,193,3800,male,2008
60
- Adelie,Biscoe,36.5,16.6,181,2850,female,2008
61
- Adelie,Biscoe,37.6,19.1,194,3750,male,2008
62
- Adelie,Biscoe,35.7,16.9,185,3150,female,2008
63
- Adelie,Biscoe,41.3,21.1,195,4400,male,2008
64
- Adelie,Biscoe,37.6,17,185,3600,female,2008
65
- Adelie,Biscoe,41.1,18.2,192,4050,male,2008
66
- Adelie,Biscoe,36.4,17.1,184,2850,female,2008
67
- Adelie,Biscoe,41.6,18,192,3950,male,2008
68
- Adelie,Biscoe,35.5,16.2,195,3350,female,2008
69
- Adelie,Biscoe,41.1,19.1,188,4100,male,2008
70
- Adelie,Torgersen,35.9,16.6,190,3050,female,2008
71
- Adelie,Torgersen,41.8,19.4,198,4450,male,2008
72
- Adelie,Torgersen,33.5,19,190,3600,female,2008
73
- Adelie,Torgersen,39.7,18.4,190,3900,male,2008
74
- Adelie,Torgersen,39.6,17.2,196,3550,female,2008
75
- Adelie,Torgersen,45.8,18.9,197,4150,male,2008
76
- Adelie,Torgersen,35.5,17.5,190,3700,female,2008
77
- Adelie,Torgersen,42.8,18.5,195,4250,male,2008
78
- Adelie,Torgersen,40.9,16.8,191,3700,female,2008
79
- Adelie,Torgersen,37.2,19.4,184,3900,male,2008
80
- Adelie,Torgersen,36.2,16.1,187,3550,female,2008
81
- Adelie,Torgersen,42.1,19.1,195,4000,male,2008
82
- Adelie,Torgersen,34.6,17.2,189,3200,female,2008
83
- Adelie,Torgersen,42.9,17.6,196,4700,male,2008
84
- Adelie,Torgersen,36.7,18.8,187,3800,female,2008
85
- Adelie,Torgersen,35.1,19.4,193,4200,male,2008
86
- Adelie,Dream,37.3,17.8,191,3350,female,2008
87
- Adelie,Dream,41.3,20.3,194,3550,male,2008
88
- Adelie,Dream,36.3,19.5,190,3800,male,2008
89
- Adelie,Dream,36.9,18.6,189,3500,female,2008
90
- Adelie,Dream,38.3,19.2,189,3950,male,2008
91
- Adelie,Dream,38.9,18.8,190,3600,female,2008
92
- Adelie,Dream,35.7,18,202,3550,female,2008
93
- Adelie,Dream,41.1,18.1,205,4300,male,2008
94
- Adelie,Dream,34,17.1,185,3400,female,2008
95
- Adelie,Dream,39.6,18.1,186,4450,male,2008
96
- Adelie,Dream,36.2,17.3,187,3300,female,2008
97
- Adelie,Dream,40.8,18.9,208,4300,male,2008
98
- Adelie,Dream,38.1,18.6,190,3700,female,2008
99
- Adelie,Dream,40.3,18.5,196,4350,male,2008
100
- Adelie,Dream,33.1,16.1,178,2900,female,2008
101
- Adelie,Dream,43.2,18.5,192,4100,male,2008
102
- Adelie,Biscoe,35,17.9,192,3725,female,2009
103
- Adelie,Biscoe,41,20,203,4725,male,2009
104
- Adelie,Biscoe,37.7,16,183,3075,female,2009
105
- Adelie,Biscoe,37.8,20,190,4250,male,2009
106
- Adelie,Biscoe,37.9,18.6,193,2925,female,2009
107
- Adelie,Biscoe,39.7,18.9,184,3550,male,2009
108
- Adelie,Biscoe,38.6,17.2,199,3750,female,2009
109
- Adelie,Biscoe,38.2,20,190,3900,male,2009
110
- Adelie,Biscoe,38.1,17,181,3175,female,2009
111
- Adelie,Biscoe,43.2,19,197,4775,male,2009
112
- Adelie,Biscoe,38.1,16.5,198,3825,female,2009
113
- Adelie,Biscoe,45.6,20.3,191,4600,male,2009
114
- Adelie,Biscoe,39.7,17.7,193,3200,female,2009
115
- Adelie,Biscoe,42.2,19.5,197,4275,male,2009
116
- Adelie,Biscoe,39.6,20.7,191,3900,female,2009
117
- Adelie,Biscoe,42.7,18.3,196,4075,male,2009
118
- Adelie,Torgersen,38.6,17,188,2900,female,2009
119
- Adelie,Torgersen,37.3,20.5,199,3775,male,2009
120
- Adelie,Torgersen,35.7,17,189,3350,female,2009
121
- Adelie,Torgersen,41.1,18.6,189,3325,male,2009
122
- Adelie,Torgersen,36.2,17.2,187,3150,female,2009
123
- Adelie,Torgersen,37.7,19.8,198,3500,male,2009
124
- Adelie,Torgersen,40.2,17,176,3450,female,2009
125
- Adelie,Torgersen,41.4,18.5,202,3875,male,2009
126
- Adelie,Torgersen,35.2,15.9,186,3050,female,2009
127
- Adelie,Torgersen,40.6,19,199,4000,male,2009
128
- Adelie,Torgersen,38.8,17.6,191,3275,female,2009
129
- Adelie,Torgersen,41.5,18.3,195,4300,male,2009
130
- Adelie,Torgersen,39,17.1,191,3050,female,2009
131
- Adelie,Torgersen,44.1,18,210,4000,male,2009
132
- Adelie,Torgersen,38.5,17.9,190,3325,female,2009
133
- Adelie,Torgersen,43.1,19.2,197,3500,male,2009
134
- Adelie,Dream,36.8,18.5,193,3500,female,2009
135
- Adelie,Dream,37.5,18.5,199,4475,male,2009
136
- Adelie,Dream,38.1,17.6,187,3425,female,2009
137
- Adelie,Dream,41.1,17.5,190,3900,male,2009
138
- Adelie,Dream,35.6,17.5,191,3175,female,2009
139
- Adelie,Dream,40.2,20.1,200,3975,male,2009
140
- Adelie,Dream,37,16.5,185,3400,female,2009
141
- Adelie,Dream,39.7,17.9,193,4250,male,2009
142
- Adelie,Dream,40.2,17.1,193,3400,female,2009
143
- Adelie,Dream,40.6,17.2,187,3475,male,2009
144
- Adelie,Dream,32.1,15.5,188,3050,female,2009
145
- Adelie,Dream,40.7,17,190,3725,male,2009
146
- Adelie,Dream,37.3,16.8,192,3000,female,2009
147
- Adelie,Dream,39,18.7,185,3650,male,2009
148
- Adelie,Dream,39.2,18.6,190,4250,male,2009
149
- Adelie,Dream,36.6,18.4,184,3475,female,2009
150
- Adelie,Dream,36,17.8,195,3450,female,2009
151
- Adelie,Dream,37.8,18.1,193,3750,male,2009
152
- Adelie,Dream,36,17.1,187,3700,female,2009
153
- Adelie,Dream,41.5,18.5,201,4000,male,2009
154
- Gentoo,Biscoe,46.1,13.2,211,4500,female,2007
155
- Gentoo,Biscoe,50,16.3,230,5700,male,2007
156
- Gentoo,Biscoe,48.7,14.1,210,4450,female,2007
157
- Gentoo,Biscoe,50,15.2,218,5700,male,2007
158
- Gentoo,Biscoe,47.6,14.5,215,5400,male,2007
159
- Gentoo,Biscoe,46.5,13.5,210,4550,female,2007
160
- Gentoo,Biscoe,45.4,14.6,211,4800,female,2007
161
- Gentoo,Biscoe,46.7,15.3,219,5200,male,2007
162
- Gentoo,Biscoe,43.3,13.4,209,4400,female,2007
163
- Gentoo,Biscoe,46.8,15.4,215,5150,male,2007
164
- Gentoo,Biscoe,40.9,13.7,214,4650,female,2007
165
- Gentoo,Biscoe,49,16.1,216,5550,male,2007
166
- Gentoo,Biscoe,45.5,13.7,214,4650,female,2007
167
- Gentoo,Biscoe,48.4,14.6,213,5850,male,2007
168
- Gentoo,Biscoe,45.8,14.6,210,4200,female,2007
169
- Gentoo,Biscoe,49.3,15.7,217,5850,male,2007
170
- Gentoo,Biscoe,42,13.5,210,4150,female,2007
171
- Gentoo,Biscoe,49.2,15.2,221,6300,male,2007
172
- Gentoo,Biscoe,46.2,14.5,209,4800,female,2007
173
- Gentoo,Biscoe,48.7,15.1,222,5350,male,2007
174
- Gentoo,Biscoe,50.2,14.3,218,5700,male,2007
175
- Gentoo,Biscoe,45.1,14.5,215,5000,female,2007
176
- Gentoo,Biscoe,46.5,14.5,213,4400,female,2007
177
- Gentoo,Biscoe,46.3,15.8,215,5050,male,2007
178
- Gentoo,Biscoe,42.9,13.1,215,5000,female,2007
179
- Gentoo,Biscoe,46.1,15.1,215,5100,male,2007
180
- Gentoo,Biscoe,44.5,14.3,216,4100,NA,2007
181
- Gentoo,Biscoe,47.8,15,215,5650,male,2007
182
- Gentoo,Biscoe,48.2,14.3,210,4600,female,2007
183
- Gentoo,Biscoe,50,15.3,220,5550,male,2007
184
- Gentoo,Biscoe,47.3,15.3,222,5250,male,2007
185
- Gentoo,Biscoe,42.8,14.2,209,4700,female,2007
186
- Gentoo,Biscoe,45.1,14.5,207,5050,female,2007
187
- Gentoo,Biscoe,59.6,17,230,6050,male,2007
188
- Gentoo,Biscoe,49.1,14.8,220,5150,female,2008
189
- Gentoo,Biscoe,48.4,16.3,220,5400,male,2008
190
- Gentoo,Biscoe,42.6,13.7,213,4950,female,2008
191
- Gentoo,Biscoe,44.4,17.3,219,5250,male,2008
192
- Gentoo,Biscoe,44,13.6,208,4350,female,2008
193
- Gentoo,Biscoe,48.7,15.7,208,5350,male,2008
194
- Gentoo,Biscoe,42.7,13.7,208,3950,female,2008
195
- Gentoo,Biscoe,49.6,16,225,5700,male,2008
196
- Gentoo,Biscoe,45.3,13.7,210,4300,female,2008
197
- Gentoo,Biscoe,49.6,15,216,4750,male,2008
198
- Gentoo,Biscoe,50.5,15.9,222,5550,male,2008
199
- Gentoo,Biscoe,43.6,13.9,217,4900,female,2008
200
- Gentoo,Biscoe,45.5,13.9,210,4200,female,2008
201
- Gentoo,Biscoe,50.5,15.9,225,5400,male,2008
202
- Gentoo,Biscoe,44.9,13.3,213,5100,female,2008
203
- Gentoo,Biscoe,45.2,15.8,215,5300,male,2008
204
- Gentoo,Biscoe,46.6,14.2,210,4850,female,2008
205
- Gentoo,Biscoe,48.5,14.1,220,5300,male,2008
206
- Gentoo,Biscoe,45.1,14.4,210,4400,female,2008
207
- Gentoo,Biscoe,50.1,15,225,5000,male,2008
208
- Gentoo,Biscoe,46.5,14.4,217,4900,female,2008
209
- Gentoo,Biscoe,45,15.4,220,5050,male,2008
210
- Gentoo,Biscoe,43.8,13.9,208,4300,female,2008
211
- Gentoo,Biscoe,45.5,15,220,5000,male,2008
212
- Gentoo,Biscoe,43.2,14.5,208,4450,female,2008
213
- Gentoo,Biscoe,50.4,15.3,224,5550,male,2008
214
- Gentoo,Biscoe,45.3,13.8,208,4200,female,2008
215
- Gentoo,Biscoe,46.2,14.9,221,5300,male,2008
216
- Gentoo,Biscoe,45.7,13.9,214,4400,female,2008
217
- Gentoo,Biscoe,54.3,15.7,231,5650,male,2008
218
- Gentoo,Biscoe,45.8,14.2,219,4700,female,2008
219
- Gentoo,Biscoe,49.8,16.8,230,5700,male,2008
220
- Gentoo,Biscoe,46.2,14.4,214,4650,NA,2008
221
- Gentoo,Biscoe,49.5,16.2,229,5800,male,2008
222
- Gentoo,Biscoe,43.5,14.2,220,4700,female,2008
223
- Gentoo,Biscoe,50.7,15,223,5550,male,2008
224
- Gentoo,Biscoe,47.7,15,216,4750,female,2008
225
- Gentoo,Biscoe,46.4,15.6,221,5000,male,2008
226
- Gentoo,Biscoe,48.2,15.6,221,5100,male,2008
227
- Gentoo,Biscoe,46.5,14.8,217,5200,female,2008
228
- Gentoo,Biscoe,46.4,15,216,4700,female,2008
229
- Gentoo,Biscoe,48.6,16,230,5800,male,2008
230
- Gentoo,Biscoe,47.5,14.2,209,4600,female,2008
231
- Gentoo,Biscoe,51.1,16.3,220,6000,male,2008
232
- Gentoo,Biscoe,45.2,13.8,215,4750,female,2008
233
- Gentoo,Biscoe,45.2,16.4,223,5950,male,2008
234
- Gentoo,Biscoe,49.1,14.5,212,4625,female,2009
235
- Gentoo,Biscoe,52.5,15.6,221,5450,male,2009
236
- Gentoo,Biscoe,47.4,14.6,212,4725,female,2009
237
- Gentoo,Biscoe,50,15.9,224,5350,male,2009
238
- Gentoo,Biscoe,44.9,13.8,212,4750,female,2009
239
- Gentoo,Biscoe,50.8,17.3,228,5600,male,2009
240
- Gentoo,Biscoe,43.4,14.4,218,4600,female,2009
241
- Gentoo,Biscoe,51.3,14.2,218,5300,male,2009
242
- Gentoo,Biscoe,47.5,14,212,4875,female,2009
243
- Gentoo,Biscoe,52.1,17,230,5550,male,2009
244
- Gentoo,Biscoe,47.5,15,218,4950,female,2009
245
- Gentoo,Biscoe,52.2,17.1,228,5400,male,2009
246
- Gentoo,Biscoe,45.5,14.5,212,4750,female,2009
247
- Gentoo,Biscoe,49.5,16.1,224,5650,male,2009
248
- Gentoo,Biscoe,44.5,14.7,214,4850,female,2009
249
- Gentoo,Biscoe,50.8,15.7,226,5200,male,2009
250
- Gentoo,Biscoe,49.4,15.8,216,4925,male,2009
251
- Gentoo,Biscoe,46.9,14.6,222,4875,female,2009
252
- Gentoo,Biscoe,48.4,14.4,203,4625,female,2009
253
- Gentoo,Biscoe,51.1,16.5,225,5250,male,2009
254
- Gentoo,Biscoe,48.5,15,219,4850,female,2009
255
- Gentoo,Biscoe,55.9,17,228,5600,male,2009
256
- Gentoo,Biscoe,47.2,15.5,215,4975,female,2009
257
- Gentoo,Biscoe,49.1,15,228,5500,male,2009
258
- Gentoo,Biscoe,47.3,13.8,216,4725,NA,2009
259
- Gentoo,Biscoe,46.8,16.1,215,5500,male,2009
260
- Gentoo,Biscoe,41.7,14.7,210,4700,female,2009
261
- Gentoo,Biscoe,53.4,15.8,219,5500,male,2009
262
- Gentoo,Biscoe,43.3,14,208,4575,female,2009
263
- Gentoo,Biscoe,48.1,15.1,209,5500,male,2009
264
- Gentoo,Biscoe,50.5,15.2,216,5000,female,2009
265
- Gentoo,Biscoe,49.8,15.9,229,5950,male,2009
266
- Gentoo,Biscoe,43.5,15.2,213,4650,female,2009
267
- Gentoo,Biscoe,51.5,16.3,230,5500,male,2009
268
- Gentoo,Biscoe,46.2,14.1,217,4375,female,2009
269
- Gentoo,Biscoe,55.1,16,230,5850,male,2009
270
- Gentoo,Biscoe,44.5,15.7,217,4875,NA,2009
271
- Gentoo,Biscoe,48.8,16.2,222,6000,male,2009
272
- Gentoo,Biscoe,47.2,13.7,214,4925,female,2009
273
- Gentoo,Biscoe,NA,NA,NA,NA,NA,2009
274
- Gentoo,Biscoe,46.8,14.3,215,4850,female,2009
275
- Gentoo,Biscoe,50.4,15.7,222,5750,male,2009
276
- Gentoo,Biscoe,45.2,14.8,212,5200,female,2009
277
- Gentoo,Biscoe,49.9,16.1,213,5400,male,2009
278
- Chinstrap,Dream,46.5,17.9,192,3500,female,2007
279
- Chinstrap,Dream,50,19.5,196,3900,male,2007
280
- Chinstrap,Dream,51.3,19.2,193,3650,male,2007
281
- Chinstrap,Dream,45.4,18.7,188,3525,female,2007
282
- Chinstrap,Dream,52.7,19.8,197,3725,male,2007
283
- Chinstrap,Dream,45.2,17.8,198,3950,female,2007
284
- Chinstrap,Dream,46.1,18.2,178,3250,female,2007
285
- Chinstrap,Dream,51.3,18.2,197,3750,male,2007
286
- Chinstrap,Dream,46,18.9,195,4150,female,2007
287
- Chinstrap,Dream,51.3,19.9,198,3700,male,2007
288
- Chinstrap,Dream,46.6,17.8,193,3800,female,2007
289
- Chinstrap,Dream,51.7,20.3,194,3775,male,2007
290
- Chinstrap,Dream,47,17.3,185,3700,female,2007
291
- Chinstrap,Dream,52,18.1,201,4050,male,2007
292
- Chinstrap,Dream,45.9,17.1,190,3575,female,2007
293
- Chinstrap,Dream,50.5,19.6,201,4050,male,2007
294
- Chinstrap,Dream,50.3,20,197,3300,male,2007
295
- Chinstrap,Dream,58,17.8,181,3700,female,2007
296
- Chinstrap,Dream,46.4,18.6,190,3450,female,2007
297
- Chinstrap,Dream,49.2,18.2,195,4400,male,2007
298
- Chinstrap,Dream,42.4,17.3,181,3600,female,2007
299
- Chinstrap,Dream,48.5,17.5,191,3400,male,2007
300
- Chinstrap,Dream,43.2,16.6,187,2900,female,2007
301
- Chinstrap,Dream,50.6,19.4,193,3800,male,2007
302
- Chinstrap,Dream,46.7,17.9,195,3300,female,2007
303
- Chinstrap,Dream,52,19,197,4150,male,2007
304
- Chinstrap,Dream,50.5,18.4,200,3400,female,2008
305
- Chinstrap,Dream,49.5,19,200,3800,male,2008
306
- Chinstrap,Dream,46.4,17.8,191,3700,female,2008
307
- Chinstrap,Dream,52.8,20,205,4550,male,2008
308
- Chinstrap,Dream,40.9,16.6,187,3200,female,2008
309
- Chinstrap,Dream,54.2,20.8,201,4300,male,2008
310
- Chinstrap,Dream,42.5,16.7,187,3350,female,2008
311
- Chinstrap,Dream,51,18.8,203,4100,male,2008
312
- Chinstrap,Dream,49.7,18.6,195,3600,male,2008
313
- Chinstrap,Dream,47.5,16.8,199,3900,female,2008
314
- Chinstrap,Dream,47.6,18.3,195,3850,female,2008
315
- Chinstrap,Dream,52,20.7,210,4800,male,2008
316
- Chinstrap,Dream,46.9,16.6,192,2700,female,2008
317
- Chinstrap,Dream,53.5,19.9,205,4500,male,2008
318
- Chinstrap,Dream,49,19.5,210,3950,male,2008
319
- Chinstrap,Dream,46.2,17.5,187,3650,female,2008
320
- Chinstrap,Dream,50.9,19.1,196,3550,male,2008
321
- Chinstrap,Dream,45.5,17,196,3500,female,2008
322
- Chinstrap,Dream,50.9,17.9,196,3675,female,2009
323
- Chinstrap,Dream,50.8,18.5,201,4450,male,2009
324
- Chinstrap,Dream,50.1,17.9,190,3400,female,2009
325
- Chinstrap,Dream,49,19.6,212,4300,male,2009
326
- Chinstrap,Dream,51.5,18.7,187,3250,male,2009
327
- Chinstrap,Dream,49.8,17.3,198,3675,female,2009
328
- Chinstrap,Dream,48.1,16.4,199,3325,female,2009
329
- Chinstrap,Dream,51.4,19,201,3950,male,2009
330
- Chinstrap,Dream,45.7,17.3,193,3600,female,2009
331
- Chinstrap,Dream,50.7,19.7,203,4050,male,2009
332
- Chinstrap,Dream,42.5,17.3,187,3350,female,2009
333
- Chinstrap,Dream,52.2,18.8,197,3450,male,2009
334
- Chinstrap,Dream,45.2,16.6,191,3250,female,2009
335
- Chinstrap,Dream,49.3,19.9,203,4050,male,2009
336
- Chinstrap,Dream,50.2,18.8,202,3800,male,2009
337
- Chinstrap,Dream,45.6,19.4,194,3525,female,2009
338
- Chinstrap,Dream,51.9,19.5,206,3950,male,2009
339
- Chinstrap,Dream,46.8,16.5,189,3650,female,2009
340
- Chinstrap,Dream,45.7,17,195,3650,female,2009
341
- Chinstrap,Dream,55.8,19.8,207,4000,male,2009
342
- Chinstrap,Dream,43.5,18.1,202,3400,female,2009
343
- Chinstrap,Dream,49.6,18.2,193,3775,male,2009
344
- Chinstrap,Dream,50.8,19,210,4100,male,2009
345
- Chinstrap,Dream,50.2,18.7,198,3775,female,2009
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
www/favicon.png ADDED
www/globals.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ // highlight object on load using CSS animation
2
+ // window.addEventListener("load", function () {
3
+ // const elementToHighlight = document.querySelector(".rthelp"); // Replace with your element's CSS selector
4
+
5
+ // if (elementToHighlight) {
6
+ // elementToHighlight.style.borderColor = "transparent"; // Set initial transparent border
7
+ // elementToHighlight.classList.add("highlight-animation"); // Add animation class
8
+ // }
9
+ // });
www/rtemis_gray.png ADDED
www/rtemisbio_gray.png ADDED
www/rtemislive.jpeg ADDED
www/rtemislive.scss ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* rtemislive.scss */
2
+
3
+ /* rthelp */
4
+ .rthelp {
5
+ position: fixed !important;
6
+ top: 33% !important;
7
+ left: 50% !important;
8
+ transform: translate(-50%, -50%);
9
+ color: $info !important;
10
+ margin: 11px;
11
+ border: 0.5px solid transparent;
12
+ border-radius: 10px;
13
+ padding: 11px;
14
+ }
15
+
16
+ .rthelp-inline {
17
+ display: inline-block;
18
+ color: $info !important;
19
+ margin: 11px;
20
+ border: 0.5px solid transparent;
21
+ border-radius: 10px;
22
+ padding: 11px;
23
+ text-align: left;
24
+ }
25
+
26
+ // modify bs link color only for body links
27
+ // card-body a {
28
+ // color: $primary !important;
29
+ // }
30
+
31
+ .rt-tooltip {
32
+ background-color: #282828aa;
33
+ color: orange;
34
+ border-radius: 10px;
35
+ }
36
+
37
+ // Border animation
38
+ .rthelp,
39
+ .rthelp-inline {
40
+ // animation: highlight-border 1s ease-in-out forwards;
41
+ animation-name: highlight-border;
42
+ animation-duration: 6s;
43
+ animation-timing-function: ease-in-out;
44
+ // animation-fill-mode: forwards;
45
+ animation-iteration-count: infinite;
46
+ }
47
+
48
+ @keyframes highlight-border {
49
+ 0% {
50
+ border-color: transparent;
51
+ }
52
+
53
+ 50% {
54
+ border-color: $info;
55
+ }
56
+
57
+ 100% {
58
+ border-color: transparent;
59
+ }
60
+ }
61
+
62
+ // theme switch
63
+ #lightson {
64
+ margin-top: auto;
65
+ margin-bottom: auto;
66
+ }
www/rtemislive_gray.png ADDED
www/rtemisxt_gray.png ADDED
www/rtemisxt_splash.png ADDED