From 6d29b544155ebaad72d3d0b694b7bc7ab42fa1e9 Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Wed, 5 Jan 2022 18:05:49 +0100 Subject: [PATCH 01/18] Initial pkgdown keywords and settings. --- DESCRIPTION | 2 +- R/breakpoints.R | 4 ++++ R/flex.R | 3 ++- R/generators.R | 5 +++++ R/grid.R | 2 ++ R/normalize.R | 2 ++ R/templates.R | 4 ++++ R/utils.R | 7 +++++++ _pkgdown.yml | 34 ++++++++++++++++++++++++++++++++ examples/fluent.R | 23 +++++++++++++++++++++ man/activeBreakpoints.Rd | 1 + man/applyTemplate.Rd | 1 + man/flexPage.Rd | 3 ++- man/flexPanel.Rd | 2 ++ man/generateCSSPropertyStyles.Rd | 2 ++ man/generateFlexCSS.Rd | 2 ++ man/generateFlexChildrenCSS.Rd | 2 ++ man/generateGridAreaCSS.Rd | 2 ++ man/generateGridCSS.Rd | 2 ++ man/generateID.Rd | 2 ++ man/gridPage.Rd | 2 ++ man/gridPanel.Rd | 2 ++ man/listTemplates.Rd | 1 + man/mediaRuleTemplate.Rd | 2 ++ man/normalizeAttribute.Rd | 2 ++ man/normalizeAttributes.Rd | 2 ++ man/processContent.Rd | 2 ++ man/readSettingsFile.Rd | 2 ++ man/registerBreakpoint.Rd | 1 + man/registerTemplate.Rd | 1 + man/setBreakpointSystem.Rd | 1 + man/stringCSSRule.Rd | 2 ++ man/stringTemplate.Rd | 2 ++ man/unregisterBreakpoint.Rd | 1 + man/unregisterTemplate.Rd | 1 + man/valueToCSS.Rd | 2 ++ 36 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 _pkgdown.yml create mode 100644 examples/fluent.R diff --git a/DESCRIPTION b/DESCRIPTION index 9fb4af3..318e558 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: imola Type: Package Title: CSS Layouts (Grid and Flexbox) Implementation for R/Shiny -Version: 0.3.2 +Version: 0.4.0 Authors@R: person("Pedro", "Silva", email = "pedrocoutinhosilva@gmail.com", role = c("aut", "cre")) Description: Allows easy creation of CSS layouts (grid and flexbox) diff --git a/R/breakpoints.R b/R/breakpoints.R index 7049347..945c6d5 100644 --- a/R/breakpoints.R +++ b/R/breakpoints.R @@ -6,6 +6,7 @@ #' systems can be found under getOption("imola.breakpoints") #' #' @return A named list of media breakpoints options. +#' @keywords breakpoints #' @export setBreakpointSystem <- function(system) { options(imola.mediarules = getOption("imola.breakpoints")[[system]]) @@ -16,6 +17,7 @@ setBreakpointSystem <- function(system) { #' registerBreakpoint() and unregisterBreakpoint() functions. #' #' @return A named list of media breakpoints options. +#' @keywords breakpoints #' @export activeBreakpoints <- function() { getOption("imola.mediarules") @@ -28,6 +30,7 @@ activeBreakpoints <- function() { #' @param max The maximum screen width (in pixels) when the rule is active #' #' @return No return value, called for side effects +#' @keywords breakpoints #' @export registerBreakpoint <- function(name, min = NULL, max = NULL) { rules <- getOption("imola.mediarules") @@ -41,6 +44,7 @@ registerBreakpoint <- function(name, min = NULL, max = NULL) { #' @param name The name of the entry to remove #' #' @return No return value, called for side effects +#' @keywords breakpoints #' @export unregisterBreakpoint <- function(name) { rules <- getOption("imola.mediarules") diff --git a/R/flex.R b/R/flex.R index 89979dd..720cf7e 100644 --- a/R/flex.R +++ b/R/flex.R @@ -105,6 +105,7 @@ #' @importFrom htmltools HTML #' #' @return An HTML tagList. +#' @keywords flex panel #' @export flexPanel <- function(..., template = NULL, @@ -183,11 +184,11 @@ flexPanel <- function(..., #' div(class = "area-3") #' ) #' } -#' #' @importFrom shiny tagList tags bootstrapLib #' @importFrom magrittr "%>%" #' #' @return A UI definition that can be passed to the [shinyUI] function. +#' @keywords flex page #' @export flexPage <- function(..., title = NULL, diff --git a/R/generators.R b/R/generators.R index 282e0d0..beb3aa9 100644 --- a/R/generators.R +++ b/R/generators.R @@ -8,6 +8,7 @@ #' @importFrom magrittr "%>%" #' @importFrom magrittr "%<>%" #' +#' @keywords internal generators #' @return A string with all placeholders replaced. generateGridCSS <- function(attributes, id, unique_areas, breakpoint_system) { mapping <- getOption("imola.settings")$property_mapping @@ -40,6 +41,7 @@ generateGridCSS <- function(attributes, id, unique_areas, breakpoint_system) { #' #' @importFrom magrittr "%<>%" #' +#' @keywords internal generators #' @return A vector of valid css strings. generateGridAreaCSS <- function(areas, id) { styles <- c() @@ -68,6 +70,7 @@ generateGridAreaCSS <- function(areas, id) { #' #' @importFrom magrittr "%>%" #' +#' @keywords internal generators #' @return A string with all placeholders replaced. generateFlexCSS <- function(attributes, id, @@ -118,6 +121,7 @@ generateFlexCSS <- function(attributes, #' @importFrom magrittr "%>%" #' @importFrom magrittr "%<>%" #' +#' @keywords internal generators #' @return A string with all placeholders replaced. generateFlexChildrenCSS <- function(attributes, id, @@ -175,6 +179,7 @@ generateFlexChildrenCSS <- function(attributes, #' #' @importFrom magrittr "%<>%" #' +#' @keywords internal generators #' @return A vector of valid css strings. generateCSSPropertyStyles <- function(value, property, id, breakpoint_system) { if (is.null(value)) { diff --git a/R/grid.R b/R/grid.R index 8ebe278..52aa688 100644 --- a/R/grid.R +++ b/R/grid.R @@ -85,6 +85,7 @@ #' @importFrom shiny tagAppendAttributes tagAppendChild #' #' @return An HTML tagList. +#' @keywords grid panel #' @export gridPanel <- function(..., template = NULL, @@ -163,6 +164,7 @@ gridPanel <- function(..., #' @importFrom magrittr "%>%" #' #' @return A UI definition that can be passed to the [shinyUI] function. +#' @keywords grid page #' @export gridPage <- function(..., title = NULL, diff --git a/R/normalize.R b/R/normalize.R index fd96bfc..2910087 100644 --- a/R/normalize.R +++ b/R/normalize.R @@ -2,6 +2,7 @@ #' #' @param attributes The values to process #' +#' @keywords internal normalizer #' @return A named list. normalizeAttributes <- function(attributes) { for (attribute in names(attributes)) { @@ -18,6 +19,7 @@ normalizeAttributes <- function(attributes) { #' @param simplify Boolean flag if the attribute should be simplified into #' single strings. #' +#' @keywords internal normalizer #' @return A named list. normalizeAttribute <- function(attribute, simplify = TRUE) { if (is.null(attribute)) { diff --git a/R/templates.R b/R/templates.R index ab48cc4..c1ba675 100644 --- a/R/templates.R +++ b/R/templates.R @@ -8,6 +8,7 @@ #' of all types are returned, #' #' @return A named list of css templates and specific values. +#' @keywords templates #' @export listTemplates <- function(type = NULL) { if (is.null(type)) { @@ -39,6 +40,7 @@ listTemplates <- function(type = NULL) { #' @importFrom yaml write_yaml #' #' @return No return value, called for side effects +#' @keywords templates #' @export registerTemplate <- function(type, name, ..., breakpoint_system = activeBreakpoints(), export = NULL) { listTemplates <- listTemplates() @@ -63,6 +65,7 @@ registerTemplate <- function(type, name, ..., breakpoint_system = activeBreakpoi #' @param name The name of the tempalte to remove. #' #' @return No return value, called for side effects +#' @keywords templates #' @export unregisterTemplate <- function(type, name) { listTemplates <- listTemplates() @@ -84,6 +87,7 @@ unregisterTemplate <- function(type, name) { #' #' @return A named list of css attributes that can be used to generate a html #' element style rules of the given type. +#' @keywords templates #' @export applyTemplate <- function(attributes, template, defaults, type) { if (is.null(template)) { diff --git a/R/utils.R b/R/utils.R index 2b5a4b4..1dd0d61 100644 --- a/R/utils.R +++ b/R/utils.R @@ -9,6 +9,7 @@ #' @importFrom stringi stri_rand_strings #' #' @return A valid CSS id. +#' @keywords internal utils generateID <- function() { generated_id <- Sys.time() %>% as.integer() %>% @@ -32,6 +33,7 @@ generateID <- function() { #' @importFrom shiny htmlTemplate #' #' @return A string with all placeholders replaced. +#' @keywords internal utils stringTemplate <- function(string, ...) { string %>% htmlTemplate(text_ = ., ...) %>% @@ -54,6 +56,7 @@ stringTemplate <- function(string, ...) { #' @importFrom magrittr "%>%" #' #' @return A valid CSS string. +#' @keywords internal utils stringCSSRule <- function(template, ...) { getOption("imola.settings")$string_templates[[template]] %>% stringTemplate(...) @@ -72,6 +75,7 @@ stringCSSRule <- function(template, ...) { #' @importFrom shiny tagAppendAttributes #' #' @return A list of HTML elements. +#' @keywords internal utils processContent <- function(content, areas) { for (name in stri_remove_empty(names(content))) { if (name %in% areas) { @@ -89,6 +93,7 @@ processContent <- function(content, areas) { #' @param property The target css property for which the value will be used. #' #' @return string containing a valid css value. +#' @keywords internal utils valueToCSS <- function(value, property) { if (property == "grid-template-areas") { value %<>% @@ -109,6 +114,7 @@ valueToCSS <- function(value, property) { #' @importFrom glue glue #' #' @return A valid glue::glue template string to be processed later. +#' @keywords internal utils mediaRuleTemplate <- function(options) { if (is.null(options$min) && is.null(options$max)) { return("{{rules}}") @@ -134,6 +140,7 @@ mediaRuleTemplate <- function(options) { #' @importFrom yaml read_yaml #' #' @return A list object containing the content of the settings YAML file +#' @keywords internal utils readSettingsFile <- function(file) { file %>% paste0("settings/", ., ".yml") %>% diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..9bb23df --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,34 @@ +home: + title: Imola - CSS layouts for R/Shiny + +template: + bootstrap: 5 + bslib: + primary: "#50014E" + border-radius: 0.5rem + btn-border-radius: 0.25rem + +authors: + Pedro Silva: + href: https://pedrocsilva.com + +code: + width: 72 + +reference: +- title: Flex + desc: Flex. + contents: + - has_keyword("flex") +- title: Grid + desc: Grid. + contents: + - has_keyword("grid") +- title: Templates + desc: Templates. + contents: + - has_keyword("templates") +- title: Breakpoints + desc: Breakpoints. + contents: + - has_keyword("breakpoints") diff --git a/examples/fluent.R b/examples/fluent.R new file mode 100644 index 0000000..afd3246 --- /dev/null +++ b/examples/fluent.R @@ -0,0 +1,23 @@ +library(shiny) +library(shiny.fluent) +library(imola) + +shinyApp( + ui = ActivityItem( + activityDescription = tagList( + Link(key = 1, "Philippe Lampros"), + tags$span(key = 2, " commented") + ), + activityIcon = Icon(iconName = "Message"), + comments = gridPanel( + columns = c("2fr", "1fr"), + rows = c("1fr", "1fr"), + tags$span(key = 1, "Hello! I am making a comment."), + tags$span(key = 2, "Hello! I am making a comment 2."), + tags$span(key = 3, "Hello! I am making a comment 3."), + tags$span(key = 4, "Hello! I am making a comment 4.") + ), + timeStamp = "Just now" + ), + server = function(input, output) {} +) diff --git a/man/activeBreakpoints.Rd b/man/activeBreakpoints.Rd index 84206ed..4fce8b8 100644 --- a/man/activeBreakpoints.Rd +++ b/man/activeBreakpoints.Rd @@ -16,3 +16,4 @@ Current active media breakpoints. By default the default_system setting values are used, but the list can be customized by using the registerBreakpoint() and unregisterBreakpoint() functions. } +\keyword{breakpoints} diff --git a/man/applyTemplate.Rd b/man/applyTemplate.Rd index ff579d0..3de7ff9 100644 --- a/man/applyTemplate.Rd +++ b/man/applyTemplate.Rd @@ -29,3 +29,4 @@ Merges a set of attributes with a given template. To avoid redundanct of the specific panel creation callback formals) is used to validate the need of the argument value in the final list. } +\keyword{templates} diff --git a/man/flexPage.Rd b/man/flexPage.Rd index f611e3a..806ef1d 100644 --- a/man/flexPage.Rd +++ b/man/flexPage.Rd @@ -39,9 +39,10 @@ flexPage( div(class = "area-3") ) } - } \seealso{ [flexPanel()] } \concept{flex functions} +\keyword{flex} +\keyword{page} diff --git a/man/flexPanel.Rd b/man/flexPanel.Rd index b707ec6..76c1127 100644 --- a/man/flexPanel.Rd +++ b/man/flexPanel.Rd @@ -146,3 +146,5 @@ flexPanel( [flexPage()] } \concept{flexbox functions} +\keyword{flex} +\keyword{panel} diff --git a/man/generateCSSPropertyStyles.Rd b/man/generateCSSPropertyStyles.Rd index 4305cbf..1406bca 100644 --- a/man/generateCSSPropertyStyles.Rd +++ b/man/generateCSSPropertyStyles.Rd @@ -25,3 +25,5 @@ Generates the requires css statements for a specific css property. It will iterated over all breakpoints in the given value and return all statements for all breakpoints in a vector format. } +\keyword{generators} +\keyword{internal} diff --git a/man/generateFlexCSS.Rd b/man/generateFlexCSS.Rd index 7d37092..2090eb9 100644 --- a/man/generateFlexCSS.Rd +++ b/man/generateFlexCSS.Rd @@ -22,3 +22,5 @@ A string with all placeholders replaced. \description{ Generates all required css for a set of attributes, for a flex wrapper. } +\keyword{generators} +\keyword{internal} diff --git a/man/generateFlexChildrenCSS.Rd b/man/generateFlexChildrenCSS.Rd index 7312e81..9e653aa 100644 --- a/man/generateFlexChildrenCSS.Rd +++ b/man/generateFlexChildrenCSS.Rd @@ -24,3 +24,5 @@ A string with all placeholders replaced. Generates all required css for a set of children attributes, for a flex wrapper. } +\keyword{generators} +\keyword{internal} diff --git a/man/generateGridAreaCSS.Rd b/man/generateGridAreaCSS.Rd index 4f864c2..ffaacc1 100644 --- a/man/generateGridAreaCSS.Rd +++ b/man/generateGridAreaCSS.Rd @@ -21,3 +21,5 @@ Generates the requires css statements for a specific set of grid areas. This includes the css required to position each child element into each of the named grid area. } +\keyword{generators} +\keyword{internal} diff --git a/man/generateGridCSS.Rd b/man/generateGridCSS.Rd index a3cf602..5916f35 100644 --- a/man/generateGridCSS.Rd +++ b/man/generateGridCSS.Rd @@ -21,3 +21,5 @@ A string with all placeholders replaced. \description{ Generates all required css for a set of attributes, for a grid wrapper. } +\keyword{generators} +\keyword{internal} diff --git a/man/generateID.Rd b/man/generateID.Rd index 7741967..11f5baa 100644 --- a/man/generateID.Rd +++ b/man/generateID.Rd @@ -22,3 +22,5 @@ HTML IDs should follow specific standards: underscores (_), colons (:), and periods (.). - Each ID must be unique within the document. } +\keyword{internal} +\keyword{utils} diff --git a/man/gridPage.Rd b/man/gridPage.Rd index 9718daf..a322533 100644 --- a/man/gridPage.Rd +++ b/man/gridPage.Rd @@ -49,3 +49,5 @@ Other grid functions: \code{\link{gridPanel}()} } \concept{grid functions} +\keyword{grid} +\keyword{page} diff --git a/man/gridPanel.Rd b/man/gridPanel.Rd index c130666..525baff 100644 --- a/man/gridPanel.Rd +++ b/man/gridPanel.Rd @@ -123,3 +123,5 @@ Other grid functions: \code{\link{gridPage}()} } \concept{grid functions} +\keyword{grid} +\keyword{panel} diff --git a/man/listTemplates.Rd b/man/listTemplates.Rd index 46b7af6..cd65112 100644 --- a/man/listTemplates.Rd +++ b/man/listTemplates.Rd @@ -23,3 +23,4 @@ Lists all available grid and flex templates. If type is given, returns only arguments that can be grouped and stored for later usage via the "template" argument of panel and page functions. } +\keyword{templates} diff --git a/man/mediaRuleTemplate.Rd b/man/mediaRuleTemplate.Rd index 3832d23..c06861f 100644 --- a/man/mediaRuleTemplate.Rd +++ b/man/mediaRuleTemplate.Rd @@ -18,3 +18,5 @@ A valid glue::glue template string to be processed later. Generates a valid glue::glue string template for a css media query. Used internally to generate a breakpoint specific wrapper. } +\keyword{internal} +\keyword{utils} diff --git a/man/normalizeAttribute.Rd b/man/normalizeAttribute.Rd index 768fe36..e2fbe77 100644 --- a/man/normalizeAttribute.Rd +++ b/man/normalizeAttribute.Rd @@ -20,3 +20,5 @@ A named list. Converts non named list attributes into a named list. Does nothing if the attribute is already a list in the correct format. } +\keyword{internal} +\keyword{normalizer} diff --git a/man/normalizeAttributes.Rd b/man/normalizeAttributes.Rd index 52e9ded..8f841d5 100644 --- a/man/normalizeAttributes.Rd +++ b/man/normalizeAttributes.Rd @@ -15,3 +15,5 @@ A named list. \description{ Applies the normalizeAttribute() function to a full attribute list. } +\keyword{internal} +\keyword{normalizer} diff --git a/man/processContent.Rd b/man/processContent.Rd index db00ed5..81e2898 100644 --- a/man/processContent.Rd +++ b/man/processContent.Rd @@ -23,3 +23,5 @@ Adds a css class to any HTML elements from the content that are named and assigned to the grid areas via named argument while still allowing other generic HTML tag attributes to be used. } +\keyword{internal} +\keyword{utils} diff --git a/man/readSettingsFile.Rd b/man/readSettingsFile.Rd index 64f238c..c6e628a 100644 --- a/man/readSettingsFile.Rd +++ b/man/readSettingsFile.Rd @@ -16,3 +16,5 @@ A list object containing the content of the settings YAML file \description{ Reads the content of a YAML settings file from the package directory. } +\keyword{internal} +\keyword{utils} diff --git a/man/registerBreakpoint.Rd b/man/registerBreakpoint.Rd index e068de4..53d11d7 100644 --- a/man/registerBreakpoint.Rd +++ b/man/registerBreakpoint.Rd @@ -19,3 +19,4 @@ No return value, called for side effects \description{ Adds a new breakpoint entry to the currelty active media breakpoints. } +\keyword{breakpoints} diff --git a/man/registerTemplate.Rd b/man/registerTemplate.Rd index 6e0472a..8e66715 100644 --- a/man/registerTemplate.Rd +++ b/man/registerTemplate.Rd @@ -43,3 +43,4 @@ Registers a new css template for future use. Depending on the given type, arguments that can be grouped and stored for later usage via the "template" argument of panel and page functions. } +\keyword{templates} diff --git a/man/setBreakpointSystem.Rd b/man/setBreakpointSystem.Rd index 6d0820c..bff0e18 100644 --- a/man/setBreakpointSystem.Rd +++ b/man/setBreakpointSystem.Rd @@ -20,3 +20,4 @@ Sets the current active media breakpoints. By default the default_system setting values are used, but the list can be customized by using the registerBreakpoint() and unregisterBreakpoint() functions. } +\keyword{breakpoints} diff --git a/man/stringCSSRule.Rd b/man/stringCSSRule.Rd index 629705c..15b2664 100644 --- a/man/stringCSSRule.Rd +++ b/man/stringCSSRule.Rd @@ -31,3 +31,5 @@ Applies a CSS statement template stored in the package settings. These as a name. Used primarily as a shorthand to stringTemplate() for stored templates. } +\keyword{internal} +\keyword{utils} diff --git a/man/stringTemplate.Rd b/man/stringTemplate.Rd index 135570f..082e3d8 100644 --- a/man/stringTemplate.Rd +++ b/man/stringTemplate.Rd @@ -24,3 +24,5 @@ Processes a string template in the htmlTemplate format into a valid string with no placeholders. The string must use the htmlTemplate format, meaning placeholders are marked using the {{placeholder}} convention. } +\keyword{internal} +\keyword{utils} diff --git a/man/unregisterBreakpoint.Rd b/man/unregisterBreakpoint.Rd index 4bad34b..279f429 100644 --- a/man/unregisterBreakpoint.Rd +++ b/man/unregisterBreakpoint.Rd @@ -15,3 +15,4 @@ No return value, called for side effects \description{ Allows removing an entry from the current activeBreakpoints. } +\keyword{breakpoints} diff --git a/man/unregisterTemplate.Rd b/man/unregisterTemplate.Rd index 8257390..ed82842 100644 --- a/man/unregisterTemplate.Rd +++ b/man/unregisterTemplate.Rd @@ -23,3 +23,4 @@ Deletes an existing css template from the available list of templates for the that can be grouped and stored for later usage via the "template" argument of panel and page functions. } +\keyword{templates} diff --git a/man/valueToCSS.Rd b/man/valueToCSS.Rd index 733eb46..35e19f4 100644 --- a/man/valueToCSS.Rd +++ b/man/valueToCSS.Rd @@ -19,3 +19,5 @@ string containing a valid css value. Converts a R List or vector object into a valid css string. Used primarily to convert normalized attribute values into css values during processing. } +\keyword{internal} +\keyword{utils} From 6b9a57d87cb231772c0d270ddb042731a498f9c8 Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Wed, 5 Jan 2022 18:34:06 +0100 Subject: [PATCH 02/18] Feat: Add makeTemplate as a function. Allow existing fuctions to consume a template object. --- NAMESPACE | 1 + R/flex.R | 5 +-- R/grid.R | 5 +-- R/templates.R | 50 ++++++++++++++++++++++++++-- examples/example_3_flex_attributes.R | 4 ++- inst/settings/config.yml | 6 ++++ man/applyTemplate.Rd | 3 +- man/flexPanel.Rd | 5 +-- man/gridPanel.Rd | 5 +-- man/makeTemplate.Rd | 37 ++++++++++++++++++++ 10 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 man/makeTemplate.Rd diff --git a/NAMESPACE b/NAMESPACE index 9e49b75..62d65af 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ export(flexPanel) export(gridPage) export(gridPanel) export(listTemplates) +export(makeTemplate) export(registerBreakpoint) export(registerTemplate) export(setBreakpointSystem) diff --git a/R/flex.R b/R/flex.R index 720cf7e..16962ec 100644 --- a/R/flex.R +++ b/R/flex.R @@ -1,8 +1,9 @@ #' Create a panel with a CSS flexbox layout #' #' @param ... Elements to include within the panel -#' @param template The name of the template to use as a base for the grid. -#' See listTemplates() and registerTemplate() for more information. +#' @param template The name of the template to use as a base for the grid, or +#' the resulting value from using makeTemplate() to generate a template +#' object. See listTemplates() and registerTemplate() for more information. #' @param direction Direction of the flow of elements in the panel. Accepts a #' valid css 'flex-direction' value (row | row-reverse | column | #' column-reverse) By default the 'row' value is used. diff --git a/R/grid.R b/R/grid.R index 52aa688..477c9c5 100644 --- a/R/grid.R +++ b/R/grid.R @@ -4,8 +4,9 @@ #' named arguments using the grid area name will be added to that grid area. #' If no named arguments or areas are used, non attribute elements will be #' added to existing grid cells based on their order. -#' @param template The name of the template to use as a base for the grid. -#' See listTemplates() and registerTemplate() for more information. +#' @param template The name of the template to use as a base for the grid, or +#' the resulting value from using makeTemplate() to generate a template +#' object. See listTemplates() and registerTemplate() for more information. #' @param areas A list of vectors with area names, or a vector or strings #' representing each row of the grid. Each element should contain #' the names, per row, of each area of the grid. Expected values follow the diff --git a/R/templates.R b/R/templates.R index c1ba675..fd718e1 100644 --- a/R/templates.R +++ b/R/templates.R @@ -56,6 +56,37 @@ registerTemplate <- function(type, name, ..., breakpoint_system = activeBreakpoi options(imola.templates = listTemplates) } +#' Returns a imola template as an object for future use. Depending on the +#' given type, the template will then be available to be passed as an +#' argument to a panel or page function of that specific type. Templates are +#' collections of arguments that can be grouped and stored for later usage +#' via the "template" argument of panel and page functions. +#' +#' @param type The type of css grid for which the template can be used +#' @param ... Collection of valid arguments that can be passed to a panel of +#' the given type (see gridPanel() and FlexPanel() for all options) +#' @param breakpoint_system Optional breakpoint system to use in the template. +#' by default it will simply use the current active system but a built in +#' or custom system can also be passed. You ca find built in breakpoint +#' systems under getOption("imola.breakpoints") +#' @param export A file name to export the template to. Allows exporting +#' templates as a yaml file for future usage. +#' +#' @importFrom utils modifyList +#' +#' @return No return value, called for side effects +#' @keywords templates +#' @export +makeTemplate <- function(type, ..., breakpoint_system = activeBreakpoints()) { + modifyList( + list(...), + list( + type = type, + breakpoint_system = breakpoint_system + ) + ) +} + #' Deletes an existing css template from the available list of templates for the #' given grid type. Templates are collections of arguments #' that can be grouped and stored for later usage via the "template" @@ -81,7 +112,8 @@ unregisterTemplate <- function(type, name) { #' #' @param attributes The manually given attribute values that will take priority #' during the merge. -#' @param template The name of the template to merge. +#' @param template The name of the template to merge, or the resulting value +#' from using makeTemplate() to generate a template object. #' @param defaults The default values of the grid callback. #' @param type The type of css grid of the template. #' @@ -94,13 +126,25 @@ applyTemplate <- function(attributes, template, defaults, type) { return(attributes) } - if (is.null(getOption("imola.templates")[[type]][[template]])) { + if (!is.list(template) && + is.null(getOption("imola.templates")[[type]][[template]])) { + messages <- getOption("imola.settings")$string_templates$messages stop(messages$missing_template %>% stringTemplate(template = template, type = type)) } - options <- getOption("imola.templates")[[type]][[template]] + if (is.list(template)) { + if(!identical(template$type, type)) { + messages <- getOption("imola.settings")$string_templates$messages + stop(messages$wrong_template_type %>% + stringTemplate(template_type = template$type, type = type)) + } + + options <- template + } else { + options <- getOption("imola.templates")[[type]][[template]] + } for (name in names(options)) { manual_value <- attributes[[name]] diff --git a/examples/example_3_flex_attributes.R b/examples/example_3_flex_attributes.R index 53260b3..86dcbff 100644 --- a/examples/example_3_flex_attributes.R +++ b/examples/example_3_flex_attributes.R @@ -5,6 +5,8 @@ library(magrittr) registerTemplate("flex", "mycustom", direction = "column") +custom_template <- makeTemplate("grid", direction = "column") + exampleDiv <- function(color, border, ...) { div( style = paste0( @@ -46,7 +48,7 @@ ui <- gridPage( ), flexPanel( - template = "mycustom", + template = custom_template, flex = c("auto", 1), exampleTitle("Gap only"), diff --git a/inst/settings/config.yml b/inst/settings/config.yml index c7ae0e0..bbec0a8 100644 --- a/inst/settings/config.yml +++ b/inst/settings/config.yml @@ -43,9 +43,15 @@ string_templates: # Messages messages: + wrong_template_type: " + Given template has the wrong type for the panel. + Expected {{type}} but provided template is {{template_type}}. + (Have you used makeTemplate() to create your template?) + " missing_template: " The grid template {{template}} for {{type}} does not exist. Check listTemplates() to see available templates. + (Is the template you're looking for registered for {{type}} panels?) " # argument name to css property equivalents diff --git a/man/applyTemplate.Rd b/man/applyTemplate.Rd index 3de7ff9..b05631c 100644 --- a/man/applyTemplate.Rd +++ b/man/applyTemplate.Rd @@ -13,7 +13,8 @@ applyTemplate(attributes, template, defaults, type) \item{attributes}{The manually given attribute values that will take priority during the merge.} -\item{template}{The name of the template to merge.} +\item{template}{The name of the template to merge, or the resulting value +from using makeTemplate() to generate a template object.} \item{defaults}{The default values of the grid callback.} diff --git a/man/flexPanel.Rd b/man/flexPanel.Rd index 76c1127..7dafbab 100644 --- a/man/flexPanel.Rd +++ b/man/flexPanel.Rd @@ -24,8 +24,9 @@ flexPanel( \arguments{ \item{...}{Elements to include within the panel} -\item{template}{The name of the template to use as a base for the grid. -See listTemplates() and registerTemplate() for more information.} +\item{template}{The name of the template to use as a base for the grid, or +the resulting value from using makeTemplate() to generate a template +object. See listTemplates() and registerTemplate() for more information.} \item{direction}{Direction of the flow of elements in the panel. Accepts a valid css 'flex-direction' value (row | row-reverse | column | diff --git a/man/gridPanel.Rd b/man/gridPanel.Rd index 525baff..ecf5383 100644 --- a/man/gridPanel.Rd +++ b/man/gridPanel.Rd @@ -24,8 +24,9 @@ named arguments using the grid area name will be added to that grid area. If no named arguments or areas are used, non attribute elements will be added to existing grid cells based on their order.} -\item{template}{The name of the template to use as a base for the grid. -See listTemplates() and registerTemplate() for more information.} +\item{template}{The name of the template to use as a base for the grid, or +the resulting value from using makeTemplate() to generate a template +object. See listTemplates() and registerTemplate() for more information.} \item{areas}{A list of vectors with area names, or a vector or strings representing each row of the grid. Each element should contain diff --git a/man/makeTemplate.Rd b/man/makeTemplate.Rd new file mode 100644 index 0000000..3f8a0b8 --- /dev/null +++ b/man/makeTemplate.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/templates.R +\name{makeTemplate} +\alias{makeTemplate} +\title{Returns a imola template as an object for future use. Depending on the + given type, the template will then be available to be passed as an + argument to a panel or page function of that specific type. Templates are + collections of arguments that can be grouped and stored for later usage + via the "template" argument of panel and page functions.} +\usage{ +makeTemplate(type, ..., breakpoint_system = activeBreakpoints()) +} +\arguments{ +\item{type}{The type of css grid for which the template can be used} + +\item{...}{Collection of valid arguments that can be passed to a panel of +the given type (see gridPanel() and FlexPanel() for all options)} + +\item{breakpoint_system}{Optional breakpoint system to use in the template. +by default it will simply use the current active system but a built in +or custom system can also be passed. You ca find built in breakpoint +systems under getOption("imola.breakpoints")} + +\item{export}{A file name to export the template to. Allows exporting +templates as a yaml file for future usage.} +} +\value{ +No return value, called for side effects +} +\description{ +Returns a imola template as an object for future use. Depending on the + given type, the template will then be available to be passed as an + argument to a panel or page function of that specific type. Templates are + collections of arguments that can be grouped and stored for later usage + via the "template" argument of panel and page functions. +} +\keyword{templates} From 9c8227d1ee62208d2577b33a4e3e05bca3fef51b Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Thu, 6 Jan 2022 10:29:51 +0100 Subject: [PATCH 03/18] Additional icons. --- index.md | 162 +++++++++++++++++++ man/figures/logo.svg | 1 + _pkgdown.yml => pkgdown/_pkgdown.yml | 0 pkgdown/favicon/apple-touch-icon-120x120.png | Bin 0 -> 15262 bytes pkgdown/favicon/apple-touch-icon-152x152.png | Bin 0 -> 21397 bytes pkgdown/favicon/apple-touch-icon-180x180.png | Bin 0 -> 27360 bytes pkgdown/favicon/apple-touch-icon-60x60.png | Bin 0 -> 5553 bytes pkgdown/favicon/apple-touch-icon-76x76.png | Bin 0 -> 7833 bytes pkgdown/favicon/apple-touch-icon.png | Bin 0 -> 27360 bytes pkgdown/favicon/favicon-16x16.png | Bin 0 -> 1323 bytes pkgdown/favicon/favicon-32x32.png | Bin 0 -> 2496 bytes pkgdown/favicon/favicon.ico | Bin 0 -> 15086 bytes 12 files changed, 163 insertions(+) create mode 100644 index.md create mode 100644 man/figures/logo.svg rename _pkgdown.yml => pkgdown/_pkgdown.yml (100%) create mode 100644 pkgdown/favicon/apple-touch-icon-120x120.png create mode 100644 pkgdown/favicon/apple-touch-icon-152x152.png create mode 100644 pkgdown/favicon/apple-touch-icon-180x180.png create mode 100644 pkgdown/favicon/apple-touch-icon-60x60.png create mode 100644 pkgdown/favicon/apple-touch-icon-76x76.png create mode 100644 pkgdown/favicon/apple-touch-icon.png create mode 100644 pkgdown/favicon/favicon-16x16.png create mode 100644 pkgdown/favicon/favicon-32x32.png create mode 100644 pkgdown/favicon/favicon.ico diff --git a/index.md b/index.md new file mode 100644 index 0000000..278376f --- /dev/null +++ b/index.md @@ -0,0 +1,162 @@ +# imola + +[![R-CMD-check](https://github.com/pedrocoutinhosilva/imola/workflows/R-CMD-check/badge.svg)](https://CRAN.R-project.org/package=imola) +[![cranlogs](https://www.r-pkg.org/badges/version/imola)](https://CRAN.R-project.org/package=imola) +[![cranlogs](https://cranlogs.r-pkg.org/badges/imola)](https://CRAN.R-project.org/package=imola) +[![total](https://cranlogs.r-pkg.org/badges/grand-total/imola)](https://CRAN.R-project.org/package=imola) + + +Bridging the gap between R/shiny and CSS layouts (grid and flexbox)! + +Demo (and example layouts): https://sparktuga.shinyapps.io/imolatemplates/ + +If you're familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up. + +While R/shiny does give you access to bootstrap's row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI. As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling. + +Imola (named after the first city ever to be given a technical blueprint by Leonardo da Vinci) aims at giving you more layout creation options directly in R/shiny, without the hassle of having to create custom CSS every time. + +With imola you can easily leverage typical CSS layouts (grid and Flexbox) directly in your UI functions, including media breakpoints to fit different screen sizes and devices. + +You can also save your favorite layouts to use later via a templating system that allows you to define a layout, name it, and simply use it in as many elements as you need. If creating isn't your thing, imola also comes with a built in collection of templates traditionally used web layouts, making it even easier to spice up your dashboards! + +# installation +1 - Install the package: + +from CRAN: +```R +install.packages('imola') +``` + +from github: +```R +devtools::install_github('pedrocoutinhosilva/imola') +``` + +2 - Include the library into your project: +```R +# global.R +library(imola) +``` + +You are now ready to go! Check the usage section for some examples and more information on how to use the diferent grid and flex functions to get started! + +# Usage + +The bread and butter of imola are the `gridPanel()` and `flexPanel()` functions. These allow you to replace any HTML tag that serves as a container (`div`, `section`, `main`, `nav`, ...) with a tag that uses one of the specific css layout systems (grid or flexbox). + +If you are not familiar with these layout systems, I definitely recommend [this article](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Relationship_of_Grid_Layout) to get you up to speed. + +The basic difference between CSS Grid Layout and CSS Flexbox Layout is that flexbox was designed for layout in one dimension - either a row or a column. Grid was designed for two-dimensional layout - rows, and columns at the same time. This means if you want fine control over columns and rows, you should aim at using grid, if you only care about one of the dimensions, flex will most likely work just fine. + +## Grid +The grid family focuses on providing support for the CSS Grid standard. In imola you can find 2 functions that allow you to create a new grid component. `gridPanel()` and `gridPage()`. `gridPage()` is simply a wrapper for `gridPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. + +If you're interested in more information about the full array of options in the CSS grid standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/complete-guide-grid/) to get you started. + +## Flex +The flex family focuses on providing support for the CSS flexbox standard. In imola you can find 2 functions that allow you to create a new grid component. `flexPanel()` and `flexPage()`. Similar to what happens in the grid family, `flexPage()` is simply a wrapper for `flexPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. + +If you're interested in more information about the full array of options in the CSS flexbox standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) to get you started. + +# Breakpoints +Breakpoints are a way to adjust your layouts to different screen sizes. As the screen size gets larger or smaller, it is often required to adjust the position or size of the different elements in a page to make sure things dont appear broken or out of place. + +Depending on the CSS framework that is being used in your project, different systems are in place to allow this to be a bit more automated, if you are familiar with base shiny, you might have even used these systems without realizing, by using the `fluidRow()` function. `fluidRow()` will trigger layout changes to your `columns` at specific screen sizes, based on [bootstrap 3](https://shiny.rstudio.com/articles/layout-guide.html) breakpoints (The base CSS framework in shiny). + +While the `fluidRow()` solution is quite easy to use, it also comes with many constrains and does not allow for a very fine control of these layout changes. If complex enough layouts, you might even be required to write additional CSS to add new behavior or specific elements or screen sizes. + +Imola takes a slightly different approach to breakpoints; Out of the box it uses the same breakpoints as base shiny (bootstrap 3) and for each function named attribute you are able to pass either a value for that attribute or a named list of different values for different breakpoints. + +As a practical example, lets say we have the following grid areas in a gridPanel(): + +```R +# as a gridPanel() argument +areas = c( + "area1 area1 area1", + "area2 area3 area3", + "area2 area3 area3" +) +# or +areas = list( + c("area1", "area1", "area1"), + c("area2", "area3", "area3"), + c("area2", "area3", "area3") +) +``` +This grid contains 3 areas (`area1`, `area2`, `area3`), with `area2` clearly serving a sidebar. Viewing this grid on a small screen could lead to a very small sidebar, so one solution is to modify this grid specifically for a breakpoint that targets mobile. + +As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint system, that contains a few different breakpoints: + +![Screenshot](man/figures/bootstrap3-breakpoints.png) + +We can see what names imola expects for each of these using either `activeBreakpoints()` or checking the option directly with `getOption("imola.breakpoints")$bootstrap` + +In out case, we want to target small devices, so we target these via `xs`, and build our grid argument as a named list instead. +```R +# as a gridPanel() argument +areas = list( + default = c( + "area1 area1 area1", + "area2 area3 area3", + "area2 area3 area3" + ), + xs = c( + "area1", + "area2", + "area3" + ) +) +``` +NOTE: Imola reserves the special `default` name for values that are used by default, outside of any given breakpoint boundaries (`default` is the rule, breakpoints overwrite `default` for specific screen sizes). + +# Templates +Very often during development it is also common that multiple elements share the same layout. In order to easily reuse any layout you create, imola also includes a simple template engine. + +In order to save a template you can use the `registerTemplate()` function. This function requires a 'type' of template (grid or flex), a name to identify the template later, any named arguments that can be passed to the gridPanel or flexPanel function (depending on the type) and, optionally, a breakpoint_system to use if you plan on adding any responsive attributes to the template (If no breakpoint_system is given, the current active system is used to register the template). + +After a template being registered, you can then simple fill in the `template` argument on any of the panel or page functions with the name of the template. You can also adjust the template for a specific panel by providing any named arguments in addition to the template name. Any named argument that exists in the template will be orewriten by the named argument on the function call. + +Lets say we would like to save our previous areas as a template, and use it. We could use registerTemplate(): + +```R +#in global.R +registerTemplate("grid", "mytemplate", + areas = list( + default = c( + "area1 area1 area1", + "area2 area3 area3", + "area2 area3 area3" + ), + xs = c( + "area1", + "area2", + "area3" + ) + ) +) +``` + +We can then use this template to create multiple grid panels in our application: +```R +#in ui.R +gridPanel( + id = "somePanel" + template = "mytemplate" + area1 = div("area 1 content"), + area2 = div("area 2 content"), + area3 = div("area 3 content"), +) + +gridPanel( + id = "anotherPanel" + template = "mytemplate" + area1 = div("different area 1 content"), + area2 = div("different area 2 content"), + area3 = div("different area 3 content"), +) +``` + +You can register as many templates as you want, but keep in mind that each type + name combo must be unique. You can also remove templates using `unregisterTemplate()` if needed. For a full list of registered templates, you can use `listTemplates()`. + +By default imola also includes some ready to use templates these will also be listed under `listTemplates()` diff --git a/man/figures/logo.svg b/man/figures/logo.svg new file mode 100644 index 0000000..b22d510 --- /dev/null +++ b/man/figures/logo.svg @@ -0,0 +1 @@ +www.pedrocsilva.comimolaweb layouts for \ No newline at end of file diff --git a/_pkgdown.yml b/pkgdown/_pkgdown.yml similarity index 100% rename from _pkgdown.yml rename to pkgdown/_pkgdown.yml diff --git a/pkgdown/favicon/apple-touch-icon-120x120.png b/pkgdown/favicon/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..2237a94cefb8e753c3263707d4873db1a2762c31 GIT binary patch literal 15262 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 N6$MTCN?EHn{|Dx@gGm4Y literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon-152x152.png b/pkgdown/favicon/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..f9855f53df810893b1e726b97473cc0c84a37be2 GIT binary patch literal 21397 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 RY;XyPu9lHzt-53U{{Xz->dgQE literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon-180x180.png b/pkgdown/favicon/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..821006c785767281ec3a70fe36ff8be53036f5e1 GIT binary patch literal 27360 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 b9dXbu6Ak)E^?nBM3Xt|gef4@(+sOX`$Kqf= literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon-76x76.png b/pkgdown/favicon/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..b0655e26232a847c026967251a29b0550458a86c GIT binary patch literal 7833 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 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon.png b/pkgdown/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a13fb781d435a2149215ce2e48352468a15e3533 GIT binary patch literal 27360 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

=I0Uh>uM>$+1ZrcM2r#!SvEpUCXlhPs z%Xa(wrnFt6NVGPrc9N0SW_BFO&k)4vtafjgLZ>1mbNeL`Sy&)B2tte0n4jTAXn)b@ ztY0-zu#e=U!a>tE{Oi`D4B$$-GHVPs7gwJ7LY~?r(bN6EV%PdkdD*=07?W5t?ex9M z*j#5oE7J2`t%txh3uK1`d1)CN>0>B^?#Ze=nucWj`T03<)T^c7q#Z@zL&%jDInyuu zE?(8=5q+o1QJq4m5D}h~qAVa*by3mvCiz8WpRFZ}9}(Q%$LE`5t~i9G4>+qB{y3K} z{&C9U#=JAceDt z3Kya<8yZ*7V5)TwYpxe5UTNcbah`?2G48FEqwIfP8*T=>4Sa`cqWrW=L04Tamcj|< zL6$;&sam|RtSc|jRG$0LY5zP4OXNjF2%krtEF^Q2!-k0KKWGJ@{SO*L7sjL>PMn5V zga(8}`>#&pdy)Q3d3r5=)|au9b93?*7WpH1SQn|88Dnr@VpLq)D#F;D5TJ7D$4o&s zQkSG$P}-@`gK%+i_3r#I4rB}xri#a!7#{Zu=G5q>ex^wKT$L;BuB>T%5>|vNi<$N8 zX&MhySz)V9E5<;p4ez?k-F{ygumFN%o|)P_G5HBK$;d;oiS(b|Yu2b~aOeUXW1$AI zgW&xxN!Du}Mf^5}0oAdKry&vshK6=dPLegK^eaO$ z4Q7RPjck$wMI(W{Hf*4hWF?6Kz?qnr(5QT40H}qNlgO_uOUq$f8UfJ$7*eKpc?1BR zy6~5mXJ-p26;FW|r+6el^NiTb$``x4KPk3Gnk%vze*ao9r&*HhCqjl($~-(Y6!}-g z(k3BjOCr_F%nj_sUU8nep z7_oWomqJGb(!v8HG!ayXl` zJ!2P=Xq50(U6@LDp07CNIS`-Q`n3h2I?vHNs>1XFf?u0so(sJ4L-D$I2QU}xWh@l* z5D6JdVsx$E;Lnaw;x~C$1Os)Dk1pyUUCpaTX$@5}+?llut45dZYt*_AOVQvL`Qz)i zfd)mUAkh;BNLgH5mh!5>9#4ip!#b*4<;1C(3b2SvjS?G`T+oQ~dtX3KNg+rMi}VZa zR9$RDSU5O1@AXqZPl__r>m)$yr#uA^O?%8<@6rUxX zUi;TKHE{z5XMFr?UNKgJLNwu7gkpIWev ztC@-dn3e7#cA2_Y1sLnoL(8UQ#1ygN%2TGyOy-q3gSVEgZXGFpIv*EOU|xQ=pb-G% z#N_z+cc*XsPUeLkGa1a4{GOkg`U$3IXLX+?WyJvg9y6j3IOY4tQe@mu-fViZa6Yrq zqDGtJZv#GIfbxKE2kZjSae=N#>z5#?9<2rL1fS@2LbbNM+O*$A1JaJTmx7X#A@et= zTtFNmmU*`3(rj)sp)_!IRX@srP9#vO2blya(@`rw)NgXcF8!Rxoi&%R%XF+X=|h4( zE(Y4?i$+GWca1(Zf&{@|&6Pw-X?_V^(`8{RD8&P6fSh`U9$4xM>I)Z@sBmb|hP^6^ zhZ#Z`A^bHbeSLkzQf>u$O+bS%uaO5Gkx7-V74=p}Y;5dEs{)y-`9v!Uvl<}AN?x$l zp2|0>y$=(PtR>$e<|Ih`b4{m#k)X^-JWUN%1t|0n3N4z9XkSzWbjxMht0`R)7Y>-K z6~1ywxn5r0)an=CBSroA)B~Q2P~oq+=rO2;60s*>x#BUb)5K--XWYa-hpVv`7v3g9 zz&VF97vA%^n$dm24`RH$MT#+JZX7LfK)NGln$?^VTvRO7h@PU1l?9ep`=)5weBw8L zzB@9xKzB-4mVNOgU?xgh187b24yn1hG@!!L!wI-*crtz)>z zy*RTHSy$7@=EXd2@%X{9qlS6I%^YUW4`dq4TOtOML163##}f)%@;u%lYe94A?L7*K zuyd3dQ_DAkeI(c7aDR(F7M z=LMM-YhZ7dk)UP8Aqxe0_qhxB2a1Vy#V>c7{3iyjkE8)p^@#aijm`5l@tp*`nz_8U zqf``bSq@cz>R3XGVw7)wSKdnX)YT;Or@zee&(MutRD0X7m2;8@4NU-Z@QJDkmVJP z%0KZdfP!%kDHPVgWq;ZL?i$=a=uZE*sQhp+r-Os8gw>EG3csht@Ar43x;Tp`(+Wcy z$3W=KC$jSJ(85JaM1WCB(>@1dN$v+^BH+fjIXTsGEd?#q#wrE4gOM35XD7wpWr?!f zPkuzf`ZZ4Xg5Vf9J55Ut^n;NU>Sh2Ll70(dz(l(4b^R-f<9+b zlPGO-Z=tC1QI`2auR;H)ScWDdQ5eKG{{&!p6%`dQx!@fJ`9PKS{H2^B9Qd91W%oZ< z!uY}IMh-r0mkj0>hmJ{fDeCZ_Kz+ze(FWi+DHS9iFvfoup9L6bz{#WLt5KQS{1>TFM8xP6c53`H& zaPxe2Jq%>n3#!FA8;;r;xabS*Z@$GU)Bd(~`qJt{xu&L9ILhFbOr_#(J!t0^pub%S zeb-luHd0ty+Y4kguy?^Z3XpJE>6vGYAWh{>;tWw&Lm_M~vT%=;NUqmdj_(0U_k!xB zPLjlVd9u&dB=h+2@wD$Rf>weL5UBil9+I!|DUtXk0A&qFr228y3H8;8=F z3H}xO#%+TamWLa25+*F#h5yCXpvY=Gs5X96JkbiDeUOW3zy{25u6!i6&8WNEr2@%v z6Gr^3W&&ICW{ll@RID;@NL1JgyzgIamxW*wbiFtD7fA72~#c1m>jtRln4I99w5?)AO6<0v=9z!KCfg z#*jZevifef8lQuyQ3h}9zReDGhdlwOZ7fi6PNW1#mRr8|>Lqka1#EH)oakhCZUlT| zNHXt~W+uoxlol(#gwj64tzPd*`NQ`oNwq+r+EEOc&mRcy>lY^#H$KbCaDZ*f`h-z| zl(Kawj#`oJs87MYBjfEAE_nnm%&L0d`b(nm6ejO_0Y;3nu5?fT`nbHkq012v!ArCh zaVtF5`7wnQbQx=IqAWjudj5W)sp(ixSe}}|a>2Aib-e}^+gX3;;MHNTn?5~yQgWTu zU)=_G2gIB3QQX?&%U4LGMspv7eUvErEUNz@s_KsMsot+aV~7Ul!(t9LmYO@*m6g5j z|FQoiY2sSs?qzyhdAEk?>w8&<(taJX?~UE=A_b^-&7)IW)0= zQ(MnbgQBcS`dK+Md}0`!7Y^2Q|Dq-psU*j~hJ9p;Wv)qJ%VNrdU6t^Qxh%bu9K znJ%Bt@|vio9XWhmO%Z2m85%XxuyvAy`$<1Y+7i(g)U>@XPl&W^9LlkoAD}ICPkLi( zC>rrgJUk&770CL8A62W(H?UeSjenBX=QG7W99x9$^-IH)%7qc)R=Ydf=5m z6gQ_W9ye!6+@7<4Ht4ZRpaD)F9FAnt6>;0uo}iXVNm;9mJ;llNGoQhWW3-@PlL3oP z=sjDZ7ao&em6Z;(*T1uSXUA3sT_b0#SkTJ4PM^4v5U$|-mpPRdNI7_UwYZHy&l(>W z=SsJ?qYo?_EIiMN*`lq08SV;9N->kHUx34o`wKQcmklV%(G0>8_!d%jUXLzm zu>mSEwwj^Jf8!hnw|_FHGnCiL6tLMlA6sdL-OJv{@}KR|$ll5-WRc~5V95N-jT-SMNAswc18|6*NQyT+*9a;R8dFAU` z@~5Pjo(d2h5|zAH1RPFwcIr_fYinkJs%Ct9pX5;w+se~puC+Zk54=W@V$M9(zx*R8 zi!L{Rxi7j6fl4*=DF2}OxwoRPVj)K;T1Dx65$2zDl5JUS^VK{zau9Cj@IG11SUw<4 zoU^;7Y0TArP(eqy_VcuR#m@2J* zPLm1xt)J#z``QsN*WW7cwQE5pYOB*Va^>H^bIqLSJWuy_1l-cW*~^ro!rwo)fBM|Y zIoF+aTB&{Z7aWA#JzH5obD~##rp2g{>6?PN@}2-F#=vnm z5=Hv5qAtC?@{ga{z{iR|+|h~NFJMoo(0KQ%4E5^S95*fo52*db%t{>>`$I$+xa zEj{$&j5*vTIZTcQn{mN_HUao*ODo3Ts)WHj10&9IlIRtc46)B0aUm@qS&n^OC&S*J zrg0S9$9Vx)GdOK8$71-uy3R5x>M!p0v=Sm9L$`DcA=2@elJ4#fLAsHYlI{*c0Rf2t z6p*2tk(QD!>F$0G&t2=@SND~!rQ_gl;GFZ_`?L2kU;2a82xG5M_-kwYCkC-avq5LAOQXJ5|w@oQ$M|q;F%2O+m7$on;gHlvO4D~8wuY=(__dy zrUEk@lLd|3WY50J8Y@?O-w~ua7{2SwiW6|`R9cY;Q8mc$vELY*-H7?!rLmr~}#*AX0LEa%J`oH+yyzEf8U!Ey%-^+*DFKFASYuG*^ zFq#vcAtn+m)*ZHhNaLC!{-i%lw0+zw6!J$HhRfEQxCMDLIqotsh^0Sy$rSURU$a)I zp9G*~^a_Y^Q06wv)m({)HjA?A(|!!1UuUz^?eE+ALTkx=YV2OBS!RBlq5G`aJ`v9k zNQsa;jhw8+#Kfp?eS7iqxNZMEAdU72X$ROrfW6L;-A~|%Q+r+dTDLe1;UBivvRi58 z4fmW4v89g^U+Ueffwb?rB+Jsv7ALX8ZScv(eDYl@Wx{0|J{%G}0eR~6=N`+?Z?<;! zIyDZ~hlUreyykdK9o%DddBfG5@O(P>(EOYI8|Kb&wOG?^cN{E?r$m~tHD)Z^%fcFr zJW=eOZ4*?vLZ@sZ#!!}#%BhUPhId{P{4gK|tr!KVwE7$Mtd-Ft4j^g8`tgNA*^Q_< zFVOxAIiEh4Qa@Mkqk&xgDhd#;X?qsTnPf#lN@@mxK`_m4@9bz<0*$$BcNVMZ zM^*>4fS0vO-2C))Vzs0m7>a?A!d9c8pb#AuBzu4(iot4-rpk;S5uH5!=g(IRpJH_u zpgcnU00&%6K3~4*Pv;0&(S&j<+m1SBCozSGhNS2^W&xfA>`&&%moxGz)17L4lOZU%T2cT}7)6`c9Tbou4lKh1>6uK8WS3Ya4a>Vqq$JN|}v?b((=E3t%6O zJBhU$g)ynPso~t=jnp?uYTgq6u)-t&5oiTJ9a8zV85JPPeYP9>l|;uFTLEG{FbGVV zPzhQH8KA?|v<+C3iyp!bMNb`beocL^mr1C+k$?kb9_Tp0Z2rHfr34Vx246@P-~q+X zU8tf`u0zor=ANd%ZUh^@?O&j`!OicXeuifs&GL3?;{+coT;O;cKdvPp)K(#-Nj&g* z_=EfdUb7sa_nPP&`#Zn9LSoRT&v9x_&=p{CttiYudBToRXV6ujehh@uC7SNfHI@|= zwP6KQ6{euv(K}%2U`Wcj%P$p$>K2_U-7=I&v=Z}_Yb}n-g0_p)R|U}t=3fI;IDe!& zCx}IA^eMQ$%B`r7f}LSNLskJa05lCS0RXWMEQq{(e5}~acJ|E+s-Eaq4l~9cR?vS@ zySK}@xNz4XL#P6+hUrk5r{mS0!KeD3e&S>J*$My5Rdep#O{U+L;H0D^9NDR_-1?U+ zAyfV^8%7~>1HJtkGK5Z*F0l=eZSTk$q0M?tL$P@FY+Q2stg>NoyxrgVIMu&>E!-7K z)$-Jm^OgIi<@u@~M+Ji^hsE_S7+yg5_tgTmkV&6PorB@Bo$Qo9?ck=z`w*5e!$-YT zqtr`ejGSj%Tc-YB2NYq+13ujeB$-O-LzuB98~@uVZ#KfeA@kx3-IGr5mtleD0>S4< zOeW&}aZWA4!#k_}fsL68y_~Q;gR0t<;M9f>P?TrLhsJi~*7}Sv?-)%UEquomH6nud z3AyxSu_!vep^?dK90R8d?kMD;ldOZ#_H*%2CFVb9YC<+TFV!^FtX=+e591>^q}$DD zPN5~Q*4=+I=H+Si0fdt!Eh?&l!9wE(*r{zQzS z`g};K(zvCq?YF`nX!fA8Z7@T%Yz_^JIRwF>Dy@$bWQ0ThN$N0cH>EcJt~{YWAVkp z(0fPZBh!=3hWF5yHgCPJR06|3$*rh|7%eV#3s=D<=jTYmhiL>e)?yDFH4TQ@{~V2t;X3Z} zNj3WK0IBF9(dg|nj@Jk3NignguCLm~1H-{70(MrF-QzJw=@J_K)PtTQP0%#&C65*H&{0rWESj#nlZcPr~O6yt6WQ zGw=Glijzma)E0fC2mhITBjzUFt)3{!*{lFYl&tuw?sXTnKH|z0&)CjqcF>pjn0l`O zXH?b@hN;I)s7a2g=j1<7E<(~FN{qi9tf+$b*68_+5~E{$wmaQmOa6fcqTYCQY}Aq6 zZA?C$)cy*@X$5J}|7eZA!!fPn>;}-*%I~=G?{~Svjq5N2JG=L^sftP&Pnc)3mQ2*t z+Y#4483mL!cA~<@$_)Wb0bnm6+^*U*1O(~;=4>_ z@yCf(0imz_RL1>&rRRN2*Mon+w^HddfDBUys zh5PPVLowIPp=Sz_KYE!7vDYf#@-?#ChV1Ulgyy!kPygGC2@3H9Y)08toFztg|G52| z_66FaC0!xI{yPxlg}kTA(Ni!obR_QnkoeNz`N=kaz#xo2ZpJRaVhqm&Qvmfhv#kGX zth@R)hNXPu=SVN~x4>{rbeg-ln)-0fL%ay@d;75T1?*FaMt&Gwk2$y@_Jb(irAHe87;axXNQV@y|C}w~cm*leBkuN~s|KN5GJ^ zg$C6nLpAv&<+b!A=$*V+1jbkb2D;co)ZkAqO2d+N1}m5Qe$N`2TQ zs3(rJF0i5T2s`&}ZkU5&44v0Lq~F--{V8jh zD00QDUwj6&)gSr2C0bHyU;1UI1+wfUr-KFsErbfY<%CN zkmJ9>9z6xM9^H#(j#+<{rEbP>|3R~QC!JblpqUmxKEf(O;k=7CaXHU@1?Er7eGWIE z7JG~e{rJ+S$yGH~?rVtX+|Q9@PSaFz*=eo~dxz~Asre1t9M7_Z5F6Sf^*Q#Wh5WId zt8@3ZUHPYYZEkxsDhWw43s0NXlHF3EzVi^tRAXje%$0wyzz}!bxRv`lJEC=%YoHaa zrj39`e~+Y-i`f!8N7y;8vx<^YFsaMrpqKi5^~@WBt&#&VMd8<}(od|=M!6ofO$iUj zfJh`6QxTA*j5@FEZYuo=lV{1$9DH-s&|mBdzv~dIDaA3msH(R6T;l6;+fV{d$$)^)~+g-Taxms4ZJmuv&Xz`Q)~i$u58(ve*WQSeN;)MB4jVl#57osHi#P$I;&oT>mKbBw|MclDBIg#Ec#5a2V?(Qg5%yibs zfE93)rSaAHo{+gVQbd>tD;g=_)H;CDINhr@`40iq)-&IObX_Zabro0c0LR_V>yomw zvjfqQ)DOfYOvEc0-q3h~lj9LAgsp}XA|~`plikI93e)(mr%DjMju&QVCM4kV~B7PBr8wXoDM-N>!iwdK=31~@oD;XMX`T5aVGQ-^@D}lc+r_!_fa{`;G5BtBt z?6)Q+)ROa(eDRI6ZJF~Wg3YVEMTYpbwypsWKL5TuY-l_zdp(ufjnJkexsD;mSL3ZN z-(_e713JJo*-7#%Y25X4T|e8f6ty?C;n{6NzZ`u1NI0!JvT-r)R}(Rnzc7#;SRXOE zJX-oW3_S;_CH#HjlPax58>0ebzFN7VX|xYimv7r@`o((d6v0N~cr(2>chPh)+VcHN zh%@~sWZ2&!ZW|##w)|lb6#a5&3}AXw)6XGFO#GTrC|&mHgq3+z=_hC*o*cQk9m51< zi`V{QP2))mTKyd>Aa(FH$&=}k)7&QC=0+5ERD(cYS{l(%zIeRdOjXG*4ft(I>&pJ{ zLTAS;(ec0d1T+GidKfoCK&bto8`V+>$nl#LYVc|=fZ zWCc`#Ll_nlofc7`2~FIjTs~BYn7R6mdp&d>{F=e!3-u+{A*hXnljVqH{(d)cQF}|l zKJDN@hPKMtcFh1GTl4i$(PHe@E(4kNp z=hc#sD11Q@qccph=H~M_YLEM=xD2Q77wz0bJ^TsMl6PLTgafQDkVd)gR5o$9z$8UooST^W7&R3*`Z77=A2sGu` z;#Rr|q3J*E!2r`E#9K8d+gZS{0A7=e&G)Bi-A{z7yVg?~cci;!7v+fyv}mg4cBtk% zR=5clNtaav5V(1N+tauRB10S2E$YX7RG5}!Gh9nuDQZTZtSu+6g&Xr0sHiy;DLl1M z0gUDsVtXhADnYM-stShJmzc^eK1n+Fy9}NmY@T$^cakXnZG+>$F>e>!0#TGv|2gPe z8CBXtR=MLkqt>m*X^4YNka~j}+bB#?`Useu4_9d3{-iKlnnQy96o5@;F)3$6_-^NUjDYHxk=Dw* zYk*zb!r#AT?4H%MeK`;}TfH%fZ}$TiBiXv!XCHhGjkoXJOO*0wzS(G4ahwKxRL}UZ zIYJBOZ=i}nVhP=@DEw`%y-zYl;ny2gBmUpW%SEijn_jgABHweG^6PfnRBTkS`npIm z^R_L0eqWJZ3*U5gu{DH61a<%C|HFbl!2fERA@04XJY#BsOTdd@+aN`uFYM)tA5*11 zno5hlq1)0^Lve|e(nA~QQ<_?>M=?Wdjh4Wk*OUkyTQd|BCipZ0fJDG;mHGxFk7>Ro zQ;|Q{p#EeC1UwJH&wm+Zmp>W@k^=UOM~)=iJdpvHb4IP%U7kAWogUFa%MH}2_3o$9 zeia(AL#)I@!$I92C2)5)eU+WEpeS%!}PZzvuQsr;; z8CB&-Q;a(}qiA50-gA!50)VWiOH^ImKBfGR>sMEE=W;a`r+!)ySq=6%H90wGsr+US zIfnDvCYGY`2qFMqH2)tv%+j!^k|!Mj@&T;B!sQjrFbz;3i3tF(H_KvVQpvMy4?%bL z@~Ulc<2H^@KmX|&*XoiZy0|#F#jm0UO)IJC6I_~_7Vsfgg&U6)rolI2U+{hqHEl

z#J*|zSiG!0l#X^;lq1JgknGAD1s(XJ5;TTr zS`*mnVL5o=nW^0QhiL|D$HCcI)y$XnW>Z(YPxV?v(&ZLS29RLmfDn_Pq>rnNAPYNS z-}&77*10-wF!{+9h=sjFc@NX=I=HB{>?bhy;QqbL!}&0SaJafIKh53GW%V^fIY4^A zy?oxr%~eURoTs=@e}w|hNE|(`;~}+e*waHDD4$cw?A#G`B)8uvw_R*T1>9@|By-YV3qsx{BJ(N~kKcCUWcP6&RHV4ldlTPwhZNt4ue#T{U6oDmQ1&H7Wn@CjWSdbAgsWE1MOO zjusGglWmE#pLJeoNe5=Q{KPd**4BM zB6aKzj0+_7wSN7U(pRYtt?DfdbH@FVTNPDk3elZK!^Cp*1Q1P)Pj#}x34qIfs%>s} z)=*E84(Pa(!JV@tS^7V>#QtQ+pDQ&Yq*f>fs%e}3VPg7#Om*8DV>mxpQ~?DPl$4Yp z&8nPJtruYLXd-zok!EtcLF|3E#SwEFqX-FSi&@MMM7~8IiA7ZByy z2B+_coqUEgW%))aI}e3Y4fUejYUBUPR9qm_bbqG6`H@V0dzISKF^a12Pp9i~n_Tl} zRgvLb;oi13B;elf?>h>&#B~p(vSF^>!EcEZTk z7%0v7@5lYva)Q`~VNDLu{XiIhVop7a$J5Je{Lfq$_-ov*7*C9+hg`0UA<0JF$K&$Z;Mw^a zb472c@-{J(JcY0e0eZXwTHD46OHFe11U(-+-W%JT70m&Af>k0z&Lc-T!RQx$;4_|3 z8`wExwHaAG`qsjjWQE2WW!%k4LPDZyaiE+lByDfchGukCH$IncRr4^}$OO!!rS!U=Ps-;#v-VxJ0z=WW5 zeujNX43ER;P8cUA-{#lZ-UzkfkS-Wg(IbGEXRaeBDt;EB_YGI|lBk{e{;ry0Q)>e{A+`+1KBd-7-w(dOJ#KC7>y{)g zme(<8lUsT~y?<6c9P}6!5)42!urdkK16H0gIDRIF)xW7dj zzKh6rvD`7kn(5FyT0>rPsve)THSSuBF4`Z4vYuh-Y?;6i!~59 zwUyJ+Ifq>_;XjwF29{e{UvRD5S6z+&&aOb@i|&5|7T?UfT$KxaLnzaStZM;+hzF#8 zdV(^#*^LtykWU2Pcpy3kVx7Q*)&21f0`~l`<%m3jw#Y{_XuYlKJXy&GZ1Yy8oQF1T zCv6$%AMl)yEsqOSZG#4TY)CleqLH$L0bpt2V4#3@&0hP^!I zi!mOJwl~O_vD8Njc>mJSWhWw~pa4eE81OrJVvogW3Hz04k`2R3(}y><_V%TdZmbaNpo+zrfjsI1>#t4&T~DXoKRO{TBKt1&JnJ0P6ywF> zsG0F5$Y!(njogBBE9NQnwG1@pg-LhjVC-N0Zg#kw!yxD)QvR6z^yBBxm6Iz_?!XJ0dQ|s(4n-jGK>oP1jk=73(}nQMtyg!lB%GqFGvG}@y@4#~iU8aw|jcNX{2QR{;p zO2>iPGrdF{Lrek^5E=P@`eGNFQa~>#4PuhBm-y67AWeQCg+74&p zfB55KVvxQ8?D8n-zJG}Jz<26{5inc9H2S#A09Op?<`c|Ovb++2k*W_kW^}sue%_g0 z@_iL`6Qc$FRtX4-zUeA7b ze}gkV3HG7a!+nXv!#-bA#POPTV`Oan1Nu)M6JCz=GYW8Z3F1C)z$qonb3mX47m2!? zacNE^l@A-Fl$X!^^gaxm?_ci<{aX-wp5BW-nQFZ^#;yas*2-{>n)MZJIH!}?`FJFGb2SHNi z_|)l>WYOKbeuKxG1C&WBi7%mt9@tZ)s0wEkw@Rst-eCZcbm*wT!Rg#ayGK4`*j))J zqq93rljivTaEmeNpf5>7)x}eRRrc+__*XVV3Cbm;WMmz@N-}TXf^H~Wg*0dZ_hetY z&Vtp=_^iOq&^Ffm)D;{YKzf0k-|=gGReGhB5vacm<_J6?17ouG zybx0&LG_btuOqqyShe>MxOT?)C%KFxtNSxjon5>`?%m6?dBrj8kvheYWg2_2pW(d^ zN4>hPQv|>aSXa+{tiS>dWh+Mlz&)6QUE|6?{nOx0Ccc~5qpQTyEJmoMKs_@^Z6c&}Z-N4f#aUe$!OPf;R-y*JCB z*E*gEeV`S8TTit-WfB->(G;h|WR#0;+@q{>u;#xhary>4M^RL;q;Pt^x)8^pvSQ6D z8}2;zOM4L$CICOfn;Eqm6Jt{Sr>DcVio|Pk-#K!Ae1cn73R4a_iE$_ge zPBD|Uw1lzoPF(UnC)VG{H!oQhud5rnkbk^2=#z|wKOVV>xZ?Y)vQP6qo5NSn3OrhL zz}-1EYGosu4^JCX<+I90gjzqD8Mf6pvL3S!D227)7Is%{SZHXrhKQ2i*-TsB+}(zQ z{{h?MyQxvwoyzPY%g^N8h_td&dbe^ONU}VLXY)=ZA@uZu!Tn4O?$WyMmS&)`!@|`H z{DQ;-xPA^UZVs;3nmk-WTzo>jJZxOxH(btRdXLvZ{l6Eyce1pz_WA$606BiS5xhXh zS5wzr-OP)|+11I~&cTYt-N)IA#?IN@0tv}GXZ0B8sf#u<^MDHCx7@lq66#BAs0H?m zmoF5O2~l6rNCokBTB5$J)ucg8|LN=c-9^#$1Q8_rSsseCO^ok;Eb%%Oyake+w6avC IglWkC09R)W(EtDd literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon-16x16.png b/pkgdown/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..51da567320b1d1bec24fd2e3ec114765e7734f63 GIT binary patch literal 1323 zcmZ`%e^AnA7=MDorectAVG!a6OI?93SEnlga40}+hm35XqX9*O z)C@>p0^a&X+8N(pR)GH+SRDajSnx=lPc0>J4n=cl3sSwoD*-kY1+i)mUac>?zV8Dz z88*j2RE{5m&p6X5dhoEh^IR@J7srSJ(t3!=_RKn#R3)hww>GpMryfJXc!-UJ2wvLp zlj*!@AR=8|VqUz=zC?iVBdJ`ZS_G`)=bhzHK28EkB!r*dU2~Cnfd~X7;d936x{}&3 z2t^t@n|J2gfjSaIRwY-Q-d=;$L>PB?(yNjxT5h(8Z-`H&pWL-58=)WpF>iU!xjeo? zsA#_3T%E8De&PFjDL_W1l!i&+#+GqN2Wj(>&tjDw%DxAE zW|Mi$GB!RwJ~}#TGMa35o7HNy+wJ4Fanq1V->0*VTP;?L&1Q2r91{~0CX>lA=`g4b z6ZVNGPoDJm_p4MYi^ZZ=s|^N&R4Uc$_3D1L-DYoUYHDn3ymRM{P$(3ML}Ia6AP^`N zitE>|n?_9C-QABKJ(5Ty_wL@)tb#_old9M=~aCy?V#46Hw+IATgEJ- z=Fv&V8r_SKL*~Zz~;o`+8isIe7&aJ2=DvhtN*09X5Y|j2empoSc&fC=X_H73lh0WK^ z&Kj6r0Vf2vyx$g!di>R>6(O3pH#LdU?Nea;0}0%?R9d2&bKU}94Dr;^5kKVF zi%LnL<9=l318Qr*;*7{c?*(BN=CiNVexX&>Ua4cU&}HV>r%Qe7T3Qa5)n(C#*2{3l zXp(eh#>3tHFrP0i=l+KK6`PWxao1=J`re6g3`#0QV>>f)SoP&GBr3S~E)Z4kZ9IG>;p|$Dixns~-D=?D&>9k7*6GGKs)C|6?t_R7`v*e z{c8oq&&l{0ke_D=f*DnF>%4}WxRYC0z-7fT%UFm5B7sN@BSeM~qUl6J93dtynh;7r z4usID5$uv`Ax3jt(T(06h(3qHY@mT}m{2UvLS(NY$^xRlET`1ID~ zjOW5bJA#ANA87`t&oTiW=n>BJ@Co!uz3Pkh!Bco7Wg$ASm5$e#jH=#&-W9!W8ea0< ZlyI2#Tg;syN7o?~Kut`id{54={u|K+L^c2b literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon-32x32.png b/pkgdown/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4535d5e16019ac00f498473970bad0d9015a03 GIT binary patch literal 2496 zcmV;x2|xCUP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 KMNUMnLSTYzIh=q1 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon.ico b/pkgdown/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fdbc1bb93ad5ecbefed769ea8b0cfbfb8444e5c7 GIT binary patch literal 15086 zcmdU$33S)Rwa0$}5v@zDrB4_F46{ylRUqNm!I6>;b`IWfPPoVJi?6 z!k&bLK=zevBq95rkUeB2KnSa{c|do%?;8tR;_ze zsn6Ap|4sE*Y`vBGzw8Xk9@NwI^EZDvQxZ2PNyw@Yd86;2WpFRIFLW-7w2iycjo%cG zD;-y{^iX<2u?4H1|K{<7v9fW-CaEj0lSA!?BsVWtV!~p?XXMuTX7#7e%q_EYP63O?=F$n{jGA~zyWD$YLbSA1}P{kkkqtP3GoXR zuc6*D;=3b7`+T5%SLzu5b}cb=XDsD;tI{~dQ0vxv$k})PYrbSfW=Y$@Hran*zrkEp zRV9^`mD1eYEG;c9Mwa4|Vu^`~kr3ZddFyxc#Qnyh_(qeC^_tRmy2JZw+9;1+O8t~) z>VO`DK6~wvX%guZCAC$x2KV8^ho!NxQNRw>)@uF!{bnvGc~?|* zUVChs;4eC6wvOFjsrS`jyjWiy(?#hKo$oEm=dT`jkCk<=ub1MS5@~K}mc4uT8vVAl zwHeHN_Uth@!F%xFL7^V}*i(6Vxl~tIOKEATv8jmQ2wCOnBV+FwCj(pt{Y`lUE3YS% zdRz?4mDcGvcj~xv75AZ`HxCzY*Ts^PkYn&*E3K`q#yb}0d-qc(CU_X51 zu+-JnnKsBqUt}pLD3CC}a9QN)CBtrg1>ZP^Un%cYY8AscrCTko%az*pI;Ce-{&>~rLnF_jvYTH zAAInE96NT**aA8R2l#nzsMfNoUJf=Ll&a!tNsUXB^1^bdD5;R}H4zdpf2-71)*9S) zZDJm*e5_)m|WSpF+u!h`Afu#NO{+Djck5%i$uR0BfeAD$$JylNLF-~ z@pa}0!oHXX?9SR8GC<8W%@QzstKe^n>94BKEsBrO=z@P*?=sLC?C;vkUEY529f=8u zF+Nt`P~Yi$=&7crM)LCV1Ru423xA$#D{5uyyg=FJ9W1_6)=TKBFxk2=P=e+MNyze0 ziCr5jF&ko}vZB(ALmzN6Ci*}Zj7y0Po;Y#B%y)TKxhxyHTy(7##Tc$wFWC3MuQG-s zYhGHuR8&?-adENnFZ6<+Sv!G;#Sb6qE2}D{wyaJWIcBDn3QFfNlN4{Nsr!bsHV0?s;aA`yrSHc zWqZn`Zf{+uAEST9D=RBA`yFF~ojGNVz~4SN`GM?j+%J4QC?y83+5PtFTR1lq5n?&4_+Ss=)1>APHL`>Q`M<=@UjOn zugnSd1kZ?fBaFSTo4!s07YB;}q5#>Yc$0#XW#zb4;{SGl1S|-Uprt_)y)j0Dmjz4Y z`bb$fbG?Kt4wbZ^bO~P_A=zm;W?aTb_v|CsKG==@oIKf~|8C$P`@`{4mRn}#7rlcO z+~|XN#@Y_{TAW)f`I-5~-mvw!t#MLXR4T<8#gec+L2@&5b&m3+y0lvAs_G;+Iaku- zc1vnhs>E%HH@dGWt&y7Yn$CTiIX-^;c!%9!J4z?75Px<`wv?2XNJ&YF(F-vPvREI$ z#~{0RTA$-Lav?8sMm_R&-Nzc6G^S`fC{2w`W{p8F_$kCQx;Hj+4*Qki9~9PMKRL$V zz}f`bQ4%Ghg&!j{+k;L}`is zJX_3PExXFFuYO;*@#m-K8~x|z=9<_Fom#)OI>%P1V}8I)$^6^(5I?l*2(qvig4NE0 z-Os_?)mOhNgZo1ebp5}K{b063ydBa8v+Y@Ubk+Y%$qmQ@CEDGv184?%RA(oG-;Bgq@);~p+he(FWIzd zlhGqKHhJ=7dF!pWWa-kSGG@#e*}i?d!A#!?6DFATnR%K!cdksEHcfnde9ZHxQKRJD zzq}`}Jv{BQ{@W2h6dL?i_tp>Bu3am0=FBlX(Y=RX5AW>H93c<;3v0p1kt0oc`t)hzPs4@}6Q89%-Ns**x5uo}V6ucQ z`TF{H;?K#+G5Tj+Lf005Vq#+FdIJ9S>(?91=pM}0#_^vKBSsi|WNy#}*zx)C^SAYRRf@;UD*-2~ty1BYZdEkJt|-I^Mi_vzbr)4SPjr@W8&YS!^IaKHm5# zZNQJr=-kuOQz9ZFOk3Jp{OEx-i?NV{ce{4&lG(Fo%ZwQ_OzGzCCaagP?l%6~(%R0o zj&%+!=*`d1&)5LJ*_T{hU5(G8e{9&@-CfqKS!4Pl^YrP{B_JTc^k1-Gfh=0I$gH2V zkBf^lc7hzlp6DMtLQkx<5OdC&H+AY%@mufLE&Rkkm4%gZ;&&#lRvoZ*q2tAi7n?Z&FXJ&j`}FA1qYZxM3Yk}| zSYgWf^XD7!V?q6@~S1T*__c6PS$Uv!m_kYMIvsH+ZbJ$kgfSx4c?yRP^xF6wAY z8#@R5W{!Wa1F|+}F&i1wZYT?q3uWQUi^TPMck(CEit~c}3E2p(e@tnI z`tjdKd{^^VlYFHjztZR&zRb7PH9V=aHp*}22EBIGKW)H(%~8^hKD6Q4j)UBcZE)*2 ztl#XT8(!ZiqwerP?;k6+D5YPVpE)`Im%is5Xn@9|xtj0#$HeA?Qd6_rgAqA zy3Y0NjHmTH%U|=iO&$5$t}@s;0W&_1F2MwL+VO1h+q$kY@ZRJL8=ECy#eqKGI9K)Ny($J)`p&tz&;Y>iZtDe%c19 zD5&Vbujc^B01ogo2VexZ)i>|?R;Gl|KWjAklPxp-Y>xI5M_;StJrki*G{P=-ueO<>^zCm3#nq3h*zQ((N3piE-=DMbV_LUZ>4#U(;hP^papD_&l@c^w;q2|# zO4sB(_p9hd&Mp#h9FZ@c?2PfPD|U5kIiU0!kdqx165`a1(6)E{E?`AIjIA^(zlSjzJbo;@0ND54r)_tv-CnymA+W$nXjFg62jfI+>sT{Xj?2c{s;?Wg?Z833T=Vq1;2(*8Nphf7zxVabpYcr$t@k{* z>v3Se%3ND#>PzxU%y%qj`m~`f`Y0+ak|ezwqIX2TP`fEo`*ByF|WUz5FvT*l+amzBwBr!NqQo~cFvb<8NtE$c1!;2UjJAiE7 znV667{L>$vmb7i@qIWS0)gErLIl9!S% zDLYamWJRdN`03pX{}^+Q9_t?~yTf-&W^9&}7MB_f;KxSEmz_FuN>T&UF3CSs$HRu` z!yKXmBTr?O?2gNjWaSyZHC}ed>sfJFs>BDzOL|ng6r|}rK-C5Bk^+;YAf-U6%d3qo z@NGw4m^}08Gp8@fe{fH?tl*`=QeN3{W`~~9Im9z|P+e1PFrnAxCOubGJK+w5{f@y8 z(HAA(#qcKYX3qvLCqMd!KlTPs^neZ^ivvHfz7H?-!}lS)$c6B&1)*x#z%{ zy7gahkekMq(Ft}89-iTi9?%W^n3L4hRD&Bli~;e^=C@gsqJ5*q?fM~?w13XanNN6y zh3P#b%~O-3CqK))?%cW40!i*rWu<(%noc7T342P7xY87g^W&O12&;e6-A4?i?@K|w(V zJ3Oi9e35zcS?we9CoGVmHx56Kzpe#l{fYIBGj|EGC+3r}$@!yi>OK*#PH<*fj5A zV`B{-^m69R8KZ-3+qM~b(I57~`51bfJ!iIfP4>DZ|L8R_=6nL5!EWFc92{)U4LG+% zALx=ZAI9bkgt;aE&zWdsWTbhA{+S!vBe$K4B}1xz`Gz+(2Y>7VU2-M@hO+W9N%Bj+r2j>|8zqO29ya{J zz*#Cf;2A#F&(JA0YS$Qx*XH-B2Oo0-7Tb=qpNsLg^B<$%r0qvK_<);z09&L#zgfq@ zVAnh9EGF9qy9FP5r$6=f9l7_Nn-eaOU-#eM8t3iu8t5(Mx#cFe-L5f*!Biq~Lo_TMb!d0rf%bx&*jv2)^&JwMsDFjyLD&fQVf_<`{t z#s>?fedaggcg1Dfk{5z+^WJ8?mleV}(WlBMS^50N?!8@0#dMR#U$1KXRsQBvGrmMu zHZN<(gdaMFEUvEnsW*Dk^8xy%Y)z4wzn=Z2=Ci7FY!BseOIMy3d)9d1PHj7H$j!sr z7Y*>1+?}~*Ok{?qU0cCoalzA&>Wi`2I?^F0Q>4e?R^H zNYiu5&$ch#Veb7Br{Eh9eCuoKC3Jb1OnG?f=h`+?`@Ez!ea-SvI&Zh?nBz3}Qv2s$ zy?HivQ=BwwUcIrQ(c~yKw|-V*>;`S)sco;(m+pnLqw{!=^6=8{ild8Nm&g*$jceZU zxYjMxclTb{Y?T6aUy%=Hx;xb}28y^vCFs_YTH*eZ3v-;1ed%^i_XaB?PhmHK; zhqz+{vE~ymF)v^uPA}h6E^9p3)~W99&^fq$;mclSHF^h#^^)&$_DuE=sOuh%4%j#O zTQ!XdDs=w)JmoyyL;p^u-~1OBWF~A${Jf>%{PRl2LT_z{^vqiS<{>#C`SS&TSeUJS ze*cW~Y^P8B!g=bpk>4NXxnkt1hOC(Evz*&tyYyu(&yLGEtAB6SH1f{Tuc^&m@^7!6 zcmDI2`BhCHhX$vpi(Y}soL)%Za4}Jd^*sq7a literal 0 HcmV?d00001 From 4f4a037dc8cd8ed077db43864ab6175d41307fd5 Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Thu, 6 Jan 2022 22:26:42 +0100 Subject: [PATCH 04/18] Organize vignette structure, clean up readme. --- .Rbuildignore | 2 + .gitignore | 2 + DESCRIPTION | 2 + README.md | 155 +++++--------------------------- imola.Rproj | 1 + pkgdown/_pkgdown.yml | 25 +++++- vignettes/.gitignore | 3 + vignettes/imola-breakpoints.Rmd | 19 ++++ vignettes/imola-flexbox.Rmd | 19 ++++ vignettes/imola-grid.Rmd | 19 ++++ vignettes/imola-templates.Rmd | 19 ++++ index.md => vignettes/imola.Rmd | 60 +++++-------- 12 files changed, 152 insertions(+), 174 deletions(-) create mode 100644 vignettes/.gitignore create mode 100644 vignettes/imola-breakpoints.Rmd create mode 100644 vignettes/imola-flexbox.Rmd create mode 100644 vignettes/imola-grid.Rmd create mode 100644 vignettes/imola-templates.Rmd rename index.md => vignettes/imola.Rmd (76%) diff --git a/.Rbuildignore b/.Rbuildignore index 9afffbe..c07705e 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -11,3 +11,5 @@ tests ^_pkgdown\.yml$ ^docs$ ^pkgdown$ +^doc$ +^Meta$ diff --git a/.gitignore b/.gitignore index 1955b11..9e5a026 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ .Ruserdata docs **/rsconnect +/doc/ +/Meta/ diff --git a/DESCRIPTION b/DESCRIPTION index 318e558..172bf0f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -10,6 +10,8 @@ License: MIT + file LICENSE URL: https://github.com/pedrocoutinhosilva/imola Encoding: UTF-8 LazyData: true +VignetteBuilder: + knitr Imports: shiny, htmltools, diff --git a/README.md b/README.md index a60fd10..46f749b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ - - -# imola +# imola [![R-CMD-check](https://github.com/pedrocoutinhosilva/imola/workflows/R-CMD-check/badge.svg)](https://CRAN.R-project.org/package=imola) [![cranlogs](https://www.r-pkg.org/badges/version/imola)](https://CRAN.R-project.org/package=imola) @@ -8,157 +6,48 @@ [![total](https://cranlogs.r-pkg.org/badges/grand-total/imola)](https://CRAN.R-project.org/package=imola) -Bridging the gap between R/shiny and CSS layouts (grid and flexbox)! +An interface to create grid and flexbox CSS layouts for your R/Shiny dashboards directly in R. -Demo (and example layouts): https://sparktuga.shinyapps.io/imolatemplates/ +Imola (named after the first city ever to be given a technical blueprint by Leonardo da Vinci) aims at giving you more layout creation options directly in R/shiny, without the hassle of having to create custom CSS every time. -If you're familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up. +###### CSS Layouts in shiny made easy +You can now easily leverage typical CSS layouts (grid and Flexbox) directly in your UI functions, including support for media breakpoints to fit different screen sizes and devices. -While R/shiny does give you access to bootstrap's row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI. As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling. +###### Use built in templates, or create your own +Save your favorite layouts for later use via the existing templating system and simply use it in as many elements as you need. -Imola (named after the first city ever to be given a technical blueprint by Leonardo da Vinci) aims at giving you more layout creation options directly in R/shiny, without the hassle of having to create custom CSS every time. +If layout creation isn't your thing, imola also comes with a built in collection of templates for traditionally used web layouts, making it even easier to spice up your dashboards! -With imola you can easily leverage typical CSS layouts (grid and Flexbox) directly in your UI functions, including media breakpoints to fit different screen sizes and devices. - -You can also save your favorite layouts to use later via a templating system that allows you to define a layout, name it, and simply use it in as many elements as you need. If creating isn't your thing, imola also comes with a built in collection of templates traditionally used web layouts, making it even easier to spice up your dashboards! +###### Live Demo +See it in action (and browse the built in template layouts) at: https://sparktuga.shinyapps.io/imolatemplates/ # installation -1 - Install the package: +###### 1 - Install the package: -from CRAN: ```R +# Install released version from CRAN install.packages('imola') -``` -from github: -```R +# Or the most recent development version from github: devtools::install_github('pedrocoutinhosilva/imola') ``` -2 - Include the library into your project: +###### 2 - Include the library into your project: ```R # global.R library(imola) ``` +You are now ready to go! -You are now ready to go! Check the usage section for some examples and more information on how to use the diferent grid and flex functions to get started! +Looking for help on how to start? Make sure to check the built in examples and vignettes for help and usage examples. # Usage -The bread and butter of imola are the `gridPanel()` and `flexPanel()` functions. These allow you to replace any HTML tag that serves as a container (`div`, `section`, `main`, `nav`, ...) with a tag that uses one of the specific css layout systems (grid or flexbox). - -If you are not familiar with these layout systems, I definitely recommend [this article](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Relationship_of_Grid_Layout) to get you up to speed. - -The basic difference between CSS Grid Layout and CSS Flexbox Layout is that flexbox was designed for layout in one dimension - either a row or a column. Grid was designed for two-dimensional layout - rows, and columns at the same time. This means if you want fine control over columns and rows, you should aim at using grid, if you only care about one of the dimensions, flex will most likely work just fine. - -## Grid -The grid family focuses on providing support for the CSS Grid standard. In imola you can find 2 functions that allow you to create a new grid component. `gridPanel()` and `gridPage()`. `gridPage()` is simply a wrapper for `gridPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. - -If you're interested in more information about the full array of options in the CSS grid standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/complete-guide-grid/) to get you started. - -## Flex -The flex family focuses on providing support for the CSS flexbox standard. In imola you can find 2 functions that allow you to create a new grid component. `flexPanel()` and `flexPage()`. Similar to what happens in the grid family, `flexPage()` is simply a wrapper for `flexPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. - -If you're interested in more information about the full array of options in the CSS flexbox standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) to get you started. - -# Breakpoints -Breakpoints are a way to adjust your layouts to different screen sizes. As the screen size gets larger or smaller, it is often required to adjust the position or size of the different elements in a page to make sure things dont appear broken or out of place. - -Depending on the CSS framework that is being used in your project, different systems are in place to allow this to be a bit more automated, if you are familiar with base shiny, you might have even used these systems without realizing, by using the `fluidRow()` function. `fluidRow()` will trigger layout changes to your `columns` at specific screen sizes, based on [bootstrap 3](https://shiny.rstudio.com/articles/layout-guide.html) breakpoints (The base CSS framework in shiny). - -While the `fluidRow()` solution is quite easy to use, it also comes with many constrains and does not allow for a very fine control of these layout changes. If complex enough layouts, you might even be required to write additional CSS to add new behavior or specific elements or screen sizes. - -Imola takes a slightly different approach to breakpoints; Out of the box it uses the same breakpoints as base shiny (bootstrap 3) and for each function named attribute you are able to pass either a value for that attribute or a named list of different values for different breakpoints. - -As a practical example, lets say we have the following grid areas in a gridPanel(): - -```R -# as a gridPanel() argument -areas = c( - "area1 area1 area1", - "area2 area3 area3", - "area2 area3 area3" -) -# or -areas = list( - c("area1", "area1", "area1"), - c("area2", "area3", "area3"), - c("area2", "area3", "area3") -) -``` -This grid contains 3 areas (`area1`, `area2`, `area3`), with `area2` clearly serving a sidebar. Viewing this grid on a small screen could lead to a very small sidebar, so one solution is to modify this grid specifically for a breakpoint that targets mobile. - -As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint system, that contains a few different breakpoints: - -![Screenshot](man/figures/bootstrap3-breakpoints.png) - -We can see what names imola expects for each of these using either `activeBreakpoints()` or checking the option directly with `getOption("imola.breakpoints")$bootstrap` - -In out case, we want to target small devices, so we target these via `xs`, and build our grid argument as a named list instead. -```R -# as a gridPanel() argument -areas = list( - default = c( - "area1 area1 area1", - "area2 area3 area3", - "area2 area3 area3" - ), - xs = c( - "area1", - "area2", - "area3" - ) -) -``` -NOTE: Imola reserves the special `default` name for values that are used by default, outside of any given breakpoint boundaries (`default` is the rule, breakpoints overwrite `default` for specific screen sizes). - -# Templates -Very often during development it is also common that multiple elements share the same layout. In order to easily reuse any layout you create, imola also includes a simple template engine. - -In order to save a template you can use the `registerTemplate()` function. This function requires a 'type' of template (grid or flex), a name to identify the template later, any named arguments that can be passed to the gridPanel or flexPanel function (depending on the type) and, optionally, a breakpoint_system to use if you plan on adding any responsive attributes to the template (If no breakpoint_system is given, the current active system is used to register the template). - -After a template being registered, you can then simple fill in the `template` argument on any of the panel or page functions with the name of the template. You can also adjust the template for a specific panel by providing any named arguments in addition to the template name. Any named argument that exists in the template will be orewriten by the named argument on the function call. - -Lets say we would like to save our previous areas as a template, and use it. We could use registerTemplate(): - -```R -#in global.R -registerTemplate("grid", "mytemplate", - areas = list( - default = c( - "area1 area1 area1", - "area2 area3 area3", - "area2 area3 area3" - ), - xs = c( - "area1", - "area2", - "area3" - ) - ) -) -``` - -We can then use this template to create multiple grid panels in our application: -```R -#in ui.R -gridPanel( - id = "somePanel" - template = "mytemplate" - area1 = div("area 1 content"), - area2 = div("area 2 content"), - area3 = div("area 3 content"), -) - -gridPanel( - id = "anotherPanel" - template = "mytemplate" - area1 = div("different area 1 content"), - area2 = div("different area 2 content"), - area3 = div("different area 3 content"), -) -``` +Check `vignette("imola")` on how to get started, and other follow up vignettes for even more information regarding css flexbox and grid and their imola counterparts. -You can register as many templates as you want, but keep in mind that each type + name combo must be unique. You can also remove templates using `unregisterTemplate()` if needed. For a full list of registered templates, you can use `listTemplates()`. +Looking for a specific topic to jump into? You can use the following vignettes for a quick start: -By default imola also includes some ready to use templates these will also be listed under `listTemplates()` +- `vignette("imola-flexbox")` for details on `flexPanel()` and `flexPage()`. +- `vignette("imola-grid")` for details on `gridPanel()` and `gridPage()`. +- `vignette("imola-templates")` for information on using imola's templating engine. +- `vignette("imola-breakpoints")` for information on using imola's breakpoint systems. diff --git a/imola.Rproj b/imola.Rproj index 497f8bf..f0d6187 100644 --- a/imola.Rproj +++ b/imola.Rproj @@ -18,3 +18,4 @@ StripTrailingWhitespace: Yes BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace,vignette diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index 9bb23df..9b93ace 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -3,8 +3,10 @@ home: template: bootstrap: 5 + bootswatch: superhero + theme: arrow-dark bslib: - primary: "#50014E" + # primary: "#50014E" border-radius: 0.5rem btn-border-radius: 0.25rem @@ -12,9 +14,30 @@ authors: Pedro Silva: href: https://pedrocsilva.com +navbar: + right: + - icon: fa-github fa-lg + href: https://github.com/pedrocoutinhosilva/imola + - icon: fa-twitter fa-lg + href: https://twitter.com/sparktuga + code: width: 72 +articles: +- title: Quick start guides + navbar: ~ + contents: + - imola + - imola-flexbox + - imola-grid +- title: Templates + contents: + - imola-templates +- title: Breakpoint systems + contents: + - imola-breakpoints + reference: - title: Flex desc: Flex. diff --git a/vignettes/.gitignore b/vignettes/.gitignore new file mode 100644 index 0000000..08975e1 --- /dev/null +++ b/vignettes/.gitignore @@ -0,0 +1,3 @@ +*.html +*.R +*.log diff --git a/vignettes/imola-breakpoints.Rmd b/vignettes/imola-breakpoints.Rmd new file mode 100644 index 0000000..f4673a6 --- /dev/null +++ b/vignettes/imola-breakpoints.Rmd @@ -0,0 +1,19 @@ +--- +title: "Tutorial: Using breakpoint systems" +output: rmarkdown::html_vignette +description: > + Getting started with imola breakpoint systems. +vignette: > + %\VignetteIndexEntry{Tutorial: Using breakpoint systems} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# flex diff --git a/vignettes/imola-flexbox.Rmd b/vignettes/imola-flexbox.Rmd new file mode 100644 index 0000000..a997a18 --- /dev/null +++ b/vignettes/imola-flexbox.Rmd @@ -0,0 +1,19 @@ +--- +title: "Tutorial: CSS Flexbox and imola" +output: rmarkdown::html_vignette +description: > + Getting started with CSS Flexbox and imola. +vignette: > + %\VignetteIndexEntry{Tutorial: CSS Flexbox and imola} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# flex diff --git a/vignettes/imola-grid.Rmd b/vignettes/imola-grid.Rmd new file mode 100644 index 0000000..f6113a6 --- /dev/null +++ b/vignettes/imola-grid.Rmd @@ -0,0 +1,19 @@ +--- +title: "Tutorial: CSS grid and imola" +output: rmarkdown::html_vignette +description: > + Getting started with CSS grid and imola. +vignette: > + %\VignetteIndexEntry{Tutorial: CSS grid and imola} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# flex diff --git a/vignettes/imola-templates.Rmd b/vignettes/imola-templates.Rmd new file mode 100644 index 0000000..22826ce --- /dev/null +++ b/vignettes/imola-templates.Rmd @@ -0,0 +1,19 @@ +--- +title: "Tutorial: Templates" +output: rmarkdown::html_vignette +description: > + Getting started with imola layout templates. +vignette: > + %\VignetteIndexEntry{Tutorial: Templates} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# flex diff --git a/index.md b/vignettes/imola.Rmd similarity index 76% rename from index.md rename to vignettes/imola.Rmd index 278376f..ae5bc48 100644 --- a/index.md +++ b/vignettes/imola.Rmd @@ -1,45 +1,25 @@ -# imola - -[![R-CMD-check](https://github.com/pedrocoutinhosilva/imola/workflows/R-CMD-check/badge.svg)](https://CRAN.R-project.org/package=imola) -[![cranlogs](https://www.r-pkg.org/badges/version/imola)](https://CRAN.R-project.org/package=imola) -[![cranlogs](https://cranlogs.r-pkg.org/badges/imola)](https://CRAN.R-project.org/package=imola) -[![total](https://cranlogs.r-pkg.org/badges/grand-total/imola)](https://CRAN.R-project.org/package=imola) - - -Bridging the gap between R/shiny and CSS layouts (grid and flexbox)! - -Demo (and example layouts): https://sparktuga.shinyapps.io/imolatemplates/ - -If you're familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up. - -While R/shiny does give you access to bootstrap's row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI. As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling. - -Imola (named after the first city ever to be given a technical blueprint by Leonardo da Vinci) aims at giving you more layout creation options directly in R/shiny, without the hassle of having to create custom CSS every time. - -With imola you can easily leverage typical CSS layouts (grid and Flexbox) directly in your UI functions, including media breakpoints to fit different screen sizes and devices. - -You can also save your favorite layouts to use later via a templating system that allows you to define a layout, name it, and simply use it in as many elements as you need. If creating isn't your thing, imola also comes with a built in collection of templates traditionally used web layouts, making it even easier to spice up your dashboards! - -# installation -1 - Install the package: - -from CRAN: -```R -install.packages('imola') -``` - -from github: -```R -devtools::install_github('pedrocoutinhosilva/imola') +--- +title: "Tutorial: Getting started with imola" +output: rmarkdown::html_vignette +description: > + Learn how to get started with imola. +vignette: > + %\VignetteIndexEntry{Tutorial: Getting started with imola} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) ``` +If you're familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up. -2 - Include the library into your project: -```R -# global.R -library(imola) -``` +While R/shiny does give you direct access to bootstrap's row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI. -You are now ready to go! Check the usage section for some examples and more information on how to use the diferent grid and flex functions to get started! +As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling. # Usage @@ -88,7 +68,7 @@ This grid contains 3 areas (`area1`, `area2`, `area3`), with `area2` clearly ser As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint system, that contains a few different breakpoints: -![Screenshot](man/figures/bootstrap3-breakpoints.png) +![Screenshot](../reference/figures/bootstrap3-breakpoints.png) We can see what names imola expects for each of these using either `activeBreakpoints()` or checking the option directly with `getOption("imola.breakpoints")$bootstrap` From 7482997514550bb63b3d19b64283f072dbd7970b Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Fri, 7 Jan 2022 16:21:55 +0100 Subject: [PATCH 05/18] Vignette: History of layouts. --- README.md | 8 +-- man/figures/tables.png | Bin 0 -> 7575 bytes pkgdown/_pkgdown.yml | 7 +- vignettes/imola-demos.Rmd | 19 ++++++ vignettes/imola-why-flex-and-grid.Rmd | 91 ++++++++++++++++++++++++++ vignettes/imola.Rmd | 27 +++++--- 6 files changed, 137 insertions(+), 15 deletions(-) create mode 100644 man/figures/tables.png create mode 100644 vignettes/imola-demos.Rmd create mode 100644 vignettes/imola-why-flex-and-grid.Rmd diff --git a/README.md b/README.md index 46f749b..d1772a4 100644 --- a/README.md +++ b/README.md @@ -10,16 +10,16 @@ An interface to create grid and flexbox CSS layouts for your R/Shiny dashboards Imola (named after the first city ever to be given a technical blueprint by Leonardo da Vinci) aims at giving you more layout creation options directly in R/shiny, without the hassle of having to create custom CSS every time. -###### CSS Layouts in shiny made easy +##### CSS Layouts in shiny made easy You can now easily leverage typical CSS layouts (grid and Flexbox) directly in your UI functions, including support for media breakpoints to fit different screen sizes and devices. -###### Use built in templates, or create your own +##### Use built in templates, or create your own Save your favorite layouts for later use via the existing templating system and simply use it in as many elements as you need. If layout creation isn't your thing, imola also comes with a built in collection of templates for traditionally used web layouts, making it even easier to spice up your dashboards! -###### Live Demo -See it in action (and browse the built in template layouts) at: https://sparktuga.shinyapps.io/imolatemplates/ +##### Demos +- Built in template layouts: https://sparktuga.shinyapps.io/imolatemplates/ # installation ###### 1 - Install the package: diff --git a/man/figures/tables.png b/man/figures/tables.png new file mode 100644 index 0000000000000000000000000000000000000000..a9670f946b0d3fcb4a8aa79621e6f6a8d67b6f6e GIT binary patch literal 7575 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 + Demos +vignette: > + %\VignetteIndexEntry{Demos} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +# demos diff --git a/vignettes/imola-why-flex-and-grid.Rmd b/vignettes/imola-why-flex-and-grid.Rmd new file mode 100644 index 0000000..881abb7 --- /dev/null +++ b/vignettes/imola-why-flex-and-grid.Rmd @@ -0,0 +1,91 @@ +--- +title: "Why CSS grid and flexbox matter" +output: rmarkdown::html_vignette +description: > + As the web evolved, so did its layout solutions. This article explores what came before and why flexbox and grid became the current defacto solutions for layout generation. +vignette: > + %\VignetteIndexEntry{Why CSS grid and flexbox matter} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Introduction +If you're been around web development since the 90s, you might remember how different web design used to look. Solutions were often complicated, hacky and unintuitive work arounds were common place, and often considered best practices. As the web evolved, so did the layout (and styling) options available, maturing and changing to make what used to be convoluted solutions into simpler and more straightforward approaches. + +So how was life before CSS we know now came to be? How were page layouts setup? Why is grid and flexbox considered so much better than the previous solutions, and why are both currently used side by side instead of one over the other? + +Join me for a trip though time as we look into how web layouts evolved since the beginning of the web into the current state of the art solutions we now use. + +## The early days of HTML +The original proposals for HTML started in 1989, and lasted until about February 1997, the practical realisation of HTML was about presentation on screens. This included published recommendations, browsers & development tools, and actual web sites. At this point web developers where mostly focused on document sharing, so elements focused much more on document requirements such as headers, fonts and paragraphs. In 1993, some style sheet control of layout was proposed, but it would still take some time for it to become mainstream. + +Around this time (as well as during the reign of tables for layout purposes) the HTML document structure dictated the page layout, and the though that you would need more that sequencial content, was barely even considered. Early HTML specs state that "The elements within the BODY element are in the order in which they should be presented to the reader". + +## HTML Tables +In 1991 ViolaWWW grew into the most sophisticated of the early Web browsers. It is claimed to have been the first browser with support for style sheets, tables, and nest-able HTML elements. +Followed in 1993 a proposal was made for "columns" in a presentation language for the web. This proposal did not directly turn into CSS. "The styles defined specify the recommended behaviour of HTML objects in terms of: .... page layout ... column ....". + +These were the initial works of tables in HMTL, and finally in 1997, HTML 3.2 was finally released as a W3C Recommendation. It stated that tables "can be used to markup tabular material or for layout purposes"... And oh boy did people took it literally. Tables became the base for most web pages and considered the go to when structuring content. It was a wild time of invisible gifs used for spacing, convoluted markup and many more terrifying things. + +## Floats and the first layout frameworks +Eventually a new CSS property made its way to the top, `float`. The idea of float was simply, you have an element and need text to wrap around it, float that element and you get exactly that! Simple right? Well... + +If you couple this with fixed size for each floated element, a large dose of space clearing techniques, and the CSS position property one could achieve A LOT. This was the conclusion that some clever developers reached in the early 2000's, allowing multi-column layouts to be created and becoming the go to for these times. Eventually even frameworks started poping out that would hide these hacks behind a css classes and HTML structures, making life even easier. Bootstrap 3 is a great example of such framework that, even now, can be found in millions of websites (even though its newest iteration, bootstrap 4, no longer uses this approach and instead relies on flexbox for its layout system). + +## CSS Flex (flexbox) +The introduction of the display: flex; property around 2012 was a real step forward, solving many existing layout problems and making web developers and designers generally quite happy. + +This was the true first CSS property to be 100% developed to be focused on layouts, making its way into modern web development quite fast. + +It is specially powerful for page layouts that can defined primarily in terms of either columns or rows. for instance, if we want to align a few elements in a single row, display: flex; provide us with a modern and easy way to do so. + +Not only that, flex has built in control of other properties such as alignment and viual order of the elements without having to change the HTML markup directly. As HTML becomes more and more semantic based, specially with the release of HTML 5, this becomes even more important since it allows us to fully decomple the presentation layer from the content. + +## CSS Grid +At this moment in time `display: grid;` is the only CSS property intended for building flexible responsive grid layouts. This sort of layout requires a layout area which can be manipulated in two dimensions – both horizontally and vertically – and this is exactly what CSS Grid does. + +While `display: flex;` gives you full control over either columns or rows, Grid goes one step forward and can handle both rows and columns, meaning that it will always align items to the horizontal and vertical tracks you have set up. Grid is mostly defined on the container, not the children as it is with flexbox. + +## New is always better... Right? +So Grid wins! + +Well, No. + +Flexbox and Grid serve different purposes and are both incredibly useful. Sometimes flex is the best solution, sometimes grid makes it simpler, sometimes any of them works. + +Flex and Grid also work very well together, you can easily put a Flex element within a Grid element and vice versa. The important thing to decide in each case is which layout system is best suited for your case. + +When it comes to which approach to use, there are some general rules to make life easier: + +### Use Flex when: +- Content is priority +- Need horizontal or vertical alignment +- Layout is one-dimensional +- Need better older browser support + +### Use Grid when: +- Things need a set width regardless of content +- Need two-dimensional layout (items in one row or column need to align with the item in the previous row or column) +- Elements need to overlap + +A common rule of thumb here is to use Grid for full page layouts and Flex for everything else, or to consider whether the component you plan to build is one-dimensional (Flex) or two-dimensional (Grid). + +For a more in depth dive into Grid and Flex, make sure to check the vignettes for each for them: + +- `vignette("imola-flexbox")` for details on Flex. +- `vignette("imola-grid")` for details on Grid. + +## References + +If you're interested in more details regarding the story of HTML and CSS, make sure to check: + +- http://www.barrypearson.co.uk/articles/layout_tables/history.htm +- https://joom.team/en/a-brief-history-of-html-css-layouting +- https://code-literacy.medium.com/css-layout-evolution-detailed-by-example-579b31475392 diff --git a/vignettes/imola.Rmd b/vignettes/imola.Rmd index ae5bc48..3a0ce3c 100644 --- a/vignettes/imola.Rmd +++ b/vignettes/imola.Rmd @@ -15,13 +15,14 @@ knitr::opts_chunk$set( comment = "#>" ) ``` + If you're familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up. While R/shiny does give you direct access to bootstrap's row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI. As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling. -# Usage +## Usage The bread and butter of imola are the `gridPanel()` and `flexPanel()` functions. These allow you to replace any HTML tag that serves as a container (`div`, `section`, `main`, `nav`, ...) with a tag that uses one of the specific css layout systems (grid or flexbox). @@ -29,17 +30,20 @@ If you are not familiar with these layout systems, I definitely recommend [this The basic difference between CSS Grid Layout and CSS Flexbox Layout is that flexbox was designed for layout in one dimension - either a row or a column. Grid was designed for two-dimensional layout - rows, and columns at the same time. This means if you want fine control over columns and rows, you should aim at using grid, if you only care about one of the dimensions, flex will most likely work just fine. -## Grid +### Grid + The grid family focuses on providing support for the CSS Grid standard. In imola you can find 2 functions that allow you to create a new grid component. `gridPanel()` and `gridPage()`. `gridPage()` is simply a wrapper for `gridPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. If you're interested in more information about the full array of options in the CSS grid standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/complete-guide-grid/) to get you started. -## Flex +### Flex + The flex family focuses on providing support for the CSS flexbox standard. In imola you can find 2 functions that allow you to create a new grid component. `flexPanel()` and `flexPage()`. Similar to what happens in the grid family, `flexPage()` is simply a wrapper for `flexPanel()` that allows you to create a page UI element without the need of using any of the built in shiny functions. If you're interested in more information about the full array of options in the CSS flexbox standard from the CSS side, I recommend [this article](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) to get you started. -# Breakpoints +## Breakpoints + Breakpoints are a way to adjust your layouts to different screen sizes. As the screen size gets larger or smaller, it is often required to adjust the position or size of the different elements in a page to make sure things dont appear broken or out of place. Depending on the CSS framework that is being used in your project, different systems are in place to allow this to be a bit more automated, if you are familiar with base shiny, you might have even used these systems without realizing, by using the `fluidRow()` function. `fluidRow()` will trigger layout changes to your `columns` at specific screen sizes, based on [bootstrap 3](https://shiny.rstudio.com/articles/layout-guide.html) breakpoints (The base CSS framework in shiny). @@ -50,7 +54,7 @@ Imola takes a slightly different approach to breakpoints; Out of the box it uses As a practical example, lets say we have the following grid areas in a gridPanel(): -```R +``` r # as a gridPanel() argument areas = c( "area1 area1 area1", @@ -64,6 +68,7 @@ areas = list( c("area2", "area3", "area3") ) ``` + This grid contains 3 areas (`area1`, `area2`, `area3`), with `area2` clearly serving a sidebar. Viewing this grid on a small screen could lead to a very small sidebar, so one solution is to modify this grid specifically for a breakpoint that targets mobile. As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint system, that contains a few different breakpoints: @@ -73,7 +78,8 @@ As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint We can see what names imola expects for each of these using either `activeBreakpoints()` or checking the option directly with `getOption("imola.breakpoints")$bootstrap` In out case, we want to target small devices, so we target these via `xs`, and build our grid argument as a named list instead. -```R + +``` r # as a gridPanel() argument areas = list( default = c( @@ -88,9 +94,11 @@ areas = list( ) ) ``` + NOTE: Imola reserves the special `default` name for values that are used by default, outside of any given breakpoint boundaries (`default` is the rule, breakpoints overwrite `default` for specific screen sizes). -# Templates +## Templates + Very often during development it is also common that multiple elements share the same layout. In order to easily reuse any layout you create, imola also includes a simple template engine. In order to save a template you can use the `registerTemplate()` function. This function requires a 'type' of template (grid or flex), a name to identify the template later, any named arguments that can be passed to the gridPanel or flexPanel function (depending on the type) and, optionally, a breakpoint_system to use if you plan on adding any responsive attributes to the template (If no breakpoint_system is given, the current active system is used to register the template). @@ -99,7 +107,7 @@ After a template being registered, you can then simple fill in the `template` ar Lets say we would like to save our previous areas as a template, and use it. We could use registerTemplate(): -```R +``` r #in global.R registerTemplate("grid", "mytemplate", areas = list( @@ -118,7 +126,8 @@ registerTemplate("grid", "mytemplate", ``` We can then use this template to create multiple grid panels in our application: -```R + +``` r #in ui.R gridPanel( id = "somePanel" From c2e98e75c1c6e01c26d796bc645826d316618c19 Mon Sep 17 00:00:00 2001 From: Pedro Silva Date: Fri, 7 Jan 2022 22:42:16 +0100 Subject: [PATCH 06/18] Action for docs deployment. --- .github/workflows/deploy-docs.yaml | 25 + .gitignore | 1 - docs/404.html | 116 + docs/LICENSE-text.html | 88 + docs/apple-touch-icon-120x120.png | Bin 0 -> 15262 bytes docs/apple-touch-icon-152x152.png | Bin 0 -> 21397 bytes docs/apple-touch-icon-180x180.png | Bin 0 -> 27360 bytes docs/apple-touch-icon-60x60.png | Bin 0 -> 5553 bytes docs/apple-touch-icon-76x76.png | Bin 0 -> 7833 bytes docs/apple-touch-icon.png | Bin 0 -> 27360 bytes docs/articles/flexbox/flexbox.html | 109 + docs/articles/getting-started.html | 111 + docs/articles/imola-breakpoints.html | 129 + docs/articles/imola-demos.html | 129 + docs/articles/imola-flexbox.html | 129 + docs/articles/imola-getting-started.html | 110 + docs/articles/imola-grid.html | 129 + docs/articles/imola-templates.html | 129 + docs/articles/imola-why-flex-and-grid.html | 211 + docs/articles/imola.html | 235 + docs/articles/index.html | 111 + docs/authors.html | 109 + docs/bootstrap-toc.css | 60 + docs/bootstrap-toc.js | 159 + .../bootstrap-5.1.0/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + docs/deps/bootstrap-5.1.0/bootstrap.min.css | 1 + docs/deps/data-deps.txt | 4 + docs/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 + docs/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 + docs/docsearch.css | 148 + docs/docsearch.js | 85 + docs/favicon-16x16.png | Bin 0 -> 1323 bytes docs/favicon-32x32.png | Bin 0 -> 2496 bytes docs/favicon.ico | Bin 0 -> 15086 bytes docs/index.html | 225 + docs/link.svg | 12 + docs/logo.svg | 1 + docs/pkgdown.css | 384 + docs/pkgdown.js | 154 + docs/pkgdown.yml | 13 + docs/reference/Rplot001.png | Bin 0 -> 1011 bytes docs/reference/activeBreakpoints.html | 112 + docs/reference/activeMediaRules.html | 164 + docs/reference/applyTemplate.html | 132 + docs/reference/areaBasedRules.html | 180 + docs/reference/coalesceTypes.html | 162 + docs/reference/collapseValues.html | 162 + .../figures/bootstrap3-breakpoints.png | Bin 0 -> 103427 bytes docs/reference/figures/flex-direction.svg | 39 + docs/reference/figures/hexsticker.svg | 1 + docs/reference/figures/logo.svg | 1 + docs/reference/figures/tables.png | Bin 0 -> 7575 bytes docs/reference/flexPage.html | 137 + docs/reference/flexPanel.html | 240 + docs/reference/generateCSSPropertyStyles.html | 123 + docs/reference/generateFlexCSS.html | 112 + docs/reference/generateFlexChildrenCSS.html | 118 + docs/reference/generateGridAreaCSS.html | 119 + docs/reference/generateGridCSS.html | 111 + docs/reference/generateID.html | 130 + docs/reference/generateRandomID.html | 154 + docs/reference/generateRule.html | 167 + docs/reference/getAreaStyle.html | 170 + docs/reference/getAttributeStyle.html | 195 + docs/reference/gridPage.html | 141 + docs/reference/gridPanel.html | 216 + docs/reference/index.html | 215 + docs/reference/listTemplates.html | 124 + docs/reference/makeTemplate.html | 140 + docs/reference/mediaRuleTemplate.html | 112 + docs/reference/normalizeAttribute.html | 114 + docs/reference/normalizeAttributes.html | 105 + docs/reference/preprocessAttribute.html | 167 + docs/reference/preprocessAttributes.html | 162 + docs/reference/preprocessGridContent.html | 171 + docs/reference/processContent.html | 125 + .../reference/processFlexChildAttributes.html | 175 + .../processFlexParentAttributes.html | 171 + docs/reference/processGridAttributes.html | 179 + docs/reference/readSettingsFile.html | 106 + docs/reference/registerBreakpoint.html | 109 + docs/reference/registerMediaRule.html | 167 + docs/reference/registerTemplate.html | 148 + docs/reference/setBreakpointSystem.html | 118 + docs/reference/stringCSSRule.html | 145 + docs/reference/stringTemplate.html | 122 + docs/reference/unregisterBreakpoint.html | 105 + docs/reference/unregisterMediaRule.html | 159 + docs/reference/unregisterTemplate.html | 124 + docs/reference/valueToCSS.html | 113 + docs/search.json | 1 + docs/sitemap.xml | 180 + 94 files changed, 20651 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy-docs.yaml create mode 100644 docs/404.html create mode 100644 docs/LICENSE-text.html create mode 100644 docs/apple-touch-icon-120x120.png create mode 100644 docs/apple-touch-icon-152x152.png create mode 100644 docs/apple-touch-icon-180x180.png create mode 100644 docs/apple-touch-icon-60x60.png create mode 100644 docs/apple-touch-icon-76x76.png create mode 100644 docs/apple-touch-icon.png create mode 100644 docs/articles/flexbox/flexbox.html create mode 100644 docs/articles/getting-started.html create mode 100644 docs/articles/imola-breakpoints.html create mode 100644 docs/articles/imola-demos.html create mode 100644 docs/articles/imola-flexbox.html create mode 100644 docs/articles/imola-getting-started.html create mode 100644 docs/articles/imola-grid.html create mode 100644 docs/articles/imola-templates.html create mode 100644 docs/articles/imola-why-flex-and-grid.html create mode 100644 docs/articles/imola.html create mode 100644 docs/articles/index.html create mode 100644 docs/authors.html create mode 100644 docs/bootstrap-toc.css create mode 100644 docs/bootstrap-toc.js create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.min.css create mode 100644 docs/deps/data-deps.txt create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.map create mode 100644 docs/docsearch.css create mode 100644 docs/docsearch.js create mode 100644 docs/favicon-16x16.png create mode 100644 docs/favicon-32x32.png create mode 100644 docs/favicon.ico create mode 100644 docs/index.html create mode 100644 docs/link.svg create mode 100644 docs/logo.svg create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/pkgdown.yml create mode 100644 docs/reference/Rplot001.png create mode 100644 docs/reference/activeBreakpoints.html create mode 100644 docs/reference/activeMediaRules.html create mode 100644 docs/reference/applyTemplate.html create mode 100644 docs/reference/areaBasedRules.html create mode 100644 docs/reference/coalesceTypes.html create mode 100644 docs/reference/collapseValues.html create mode 100644 docs/reference/figures/bootstrap3-breakpoints.png create mode 100644 docs/reference/figures/flex-direction.svg create mode 100644 docs/reference/figures/hexsticker.svg create mode 100644 docs/reference/figures/logo.svg create mode 100644 docs/reference/figures/tables.png create mode 100644 docs/reference/flexPage.html create mode 100644 docs/reference/flexPanel.html create mode 100644 docs/reference/generateCSSPropertyStyles.html create mode 100644 docs/reference/generateFlexCSS.html create mode 100644 docs/reference/generateFlexChildrenCSS.html create mode 100644 docs/reference/generateGridAreaCSS.html create mode 100644 docs/reference/generateGridCSS.html create mode 100644 docs/reference/generateID.html create mode 100644 docs/reference/generateRandomID.html create mode 100644 docs/reference/generateRule.html create mode 100644 docs/reference/getAreaStyle.html create mode 100644 docs/reference/getAttributeStyle.html create mode 100644 docs/reference/gridPage.html create mode 100644 docs/reference/gridPanel.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/listTemplates.html create mode 100644 docs/reference/makeTemplate.html create mode 100644 docs/reference/mediaRuleTemplate.html create mode 100644 docs/reference/normalizeAttribute.html create mode 100644 docs/reference/normalizeAttributes.html create mode 100644 docs/reference/preprocessAttribute.html create mode 100644 docs/reference/preprocessAttributes.html create mode 100644 docs/reference/preprocessGridContent.html create mode 100644 docs/reference/processContent.html create mode 100644 docs/reference/processFlexChildAttributes.html create mode 100644 docs/reference/processFlexParentAttributes.html create mode 100644 docs/reference/processGridAttributes.html create mode 100644 docs/reference/readSettingsFile.html create mode 100644 docs/reference/registerBreakpoint.html create mode 100644 docs/reference/registerMediaRule.html create mode 100644 docs/reference/registerTemplate.html create mode 100644 docs/reference/setBreakpointSystem.html create mode 100644 docs/reference/stringCSSRule.html create mode 100644 docs/reference/stringTemplate.html create mode 100644 docs/reference/unregisterBreakpoint.html create mode 100644 docs/reference/unregisterMediaRule.html create mode 100644 docs/reference/unregisterTemplate.html create mode 100644 docs/reference/valueToCSS.html create mode 100644 docs/search.json create mode 100644 docs/sitemap.xml diff --git a/.github/workflows/deploy-docs.yaml b/.github/workflows/deploy-docs.yaml new file mode 100644 index 0000000..ad70a3b --- /dev/null +++ b/.github/workflows/deploy-docs.yaml @@ -0,0 +1,25 @@ +name: Upload Docs Website + +on: + push: + branches: + - main + - master + paths: + - docs/** + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET_DOCS }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: 'us-west-1' + SOURCE_DIR: 'docs' + DEST_DIR: 'imola' diff --git a/.gitignore b/.gitignore index 9e5a026..8585f4f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .Rhistory .RData .Ruserdata -docs **/rsconnect /doc/ /Meta/ diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..008635b --- /dev/null +++ b/docs/404.html @@ -0,0 +1,116 @@ + + + + + + + +Page not found (404) • imola + + + + + + + + + + + + + + + + Skip to contents + + +

+
+
+ +Content not found. Please use links in the navbar. + +
+
+ + + +
+ + + + + + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html new file mode 100644 index 0000000..45b94b6 --- /dev/null +++ b/docs/LICENSE-text.html @@ -0,0 +1,88 @@ + +License • imola + Skip to contents + + +
+
+
+ +
YEAR: 2021
+COPYRIGHT HOLDER: Pedro Coutinho Silva
+
+ +
+ + +
+ + + + + + + diff --git a/docs/apple-touch-icon-120x120.png b/docs/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..2237a94cefb8e753c3263707d4873db1a2762c31 GIT binary patch literal 15262 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 N6$MTCN?EHn{|Dx@gGm4Y literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-152x152.png b/docs/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..f9855f53df810893b1e726b97473cc0c84a37be2 GIT binary patch literal 21397 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 RY;XyPu9lHzt-53U{{Xz->dgQE literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-180x180.png b/docs/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..821006c785767281ec3a70fe36ff8be53036f5e1 GIT binary patch literal 27360 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 b9dXbu6Ak)E^?nBM3Xt|gef4@(+sOX`$Kqf= literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-76x76.png b/docs/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..b0655e26232a847c026967251a29b0550458a86c GIT binary patch literal 7833 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 literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon.png b/docs/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a13fb781d435a2149215ce2e48352468a15e3533 GIT binary patch literal 27360 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

=I0Uh>uM>$+1ZrcM2r#!SvEpUCXlhPs z%Xa(wrnFt6NVGPrc9N0SW_BFO&k)4vtafjgLZ>1mbNeL`Sy&)B2tte0n4jTAXn)b@ ztY0-zu#e=U!a>tE{Oi`D4B$$-GHVPs7gwJ7LY~?r(bN6EV%PdkdD*=07?W5t?ex9M z*j#5oE7J2`t%txh3uK1`d1)CN>0>B^?#Ze=nucWj`T03<)T^c7q#Z@zL&%jDInyuu zE?(8=5q+o1QJq4m5D}h~qAVa*by3mvCiz8WpRFZ}9}(Q%$LE`5t~i9G4>+qB{y3K} z{&C9U#=JAceDt z3Kya<8yZ*7V5)TwYpxe5UTNcbah`?2G48FEqwIfP8*T=>4Sa`cqWrW=L04Tamcj|< zL6$;&sam|RtSc|jRG$0LY5zP4OXNjF2%krtEF^Q2!-k0KKWGJ@{SO*L7sjL>PMn5V zga(8}`>#&pdy)Q3d3r5=)|au9b93?*7WpH1SQn|88Dnr@VpLq)D#F;D5TJ7D$4o&s zQkSG$P}-@`gK%+i_3r#I4rB}xri#a!7#{Zu=G5q>ex^wKT$L;BuB>T%5>|vNi<$N8 zX&MhySz)V9E5<;p4ez?k-F{ygumFN%o|)P_G5HBK$;d;oiS(b|Yu2b~aOeUXW1$AI zgW&xxN!Du}Mf^5}0oAdKry&vshK6=dPLegK^eaO$ z4Q7RPjck$wMI(W{Hf*4hWF?6Kz?qnr(5QT40H}qNlgO_uOUq$f8UfJ$7*eKpc?1BR zy6~5mXJ-p26;FW|r+6el^NiTb$``x4KPk3Gnk%vze*ao9r&*HhCqjl($~-(Y6!}-g z(k3BjOCr_F%nj_sUU8nep z7_oWomqJGb(!v8HG!ayXl` zJ!2P=Xq50(U6@LDp07CNIS`-Q`n3h2I?vHNs>1XFf?u0so(sJ4L-D$I2QU}xWh@l* z5D6JdVsx$E;Lnaw;x~C$1Os)Dk1pyUUCpaTX$@5}+?llut45dZYt*_AOVQvL`Qz)i zfd)mUAkh;BNLgH5mh!5>9#4ip!#b*4<;1C(3b2SvjS?G`T+oQ~dtX3KNg+rMi}VZa zR9$RDSU5O1@AXqZPl__r>m)$yr#uA^O?%8<@6rUxX zUi;TKHE{z5XMFr?UNKgJLNwu7gkpIWev ztC@-dn3e7#cA2_Y1sLnoL(8UQ#1ygN%2TGyOy-q3gSVEgZXGFpIv*EOU|xQ=pb-G% z#N_z+cc*XsPUeLkGa1a4{GOkg`U$3IXLX+?WyJvg9y6j3IOY4tQe@mu-fViZa6Yrq zqDGtJZv#GIfbxKE2kZjSae=N#>z5#?9<2rL1fS@2LbbNM+O*$A1JaJTmx7X#A@et= zTtFNmmU*`3(rj)sp)_!IRX@srP9#vO2blya(@`rw)NgXcF8!Rxoi&%R%XF+X=|h4( zE(Y4?i$+GWca1(Zf&{@|&6Pw-X?_V^(`8{RD8&P6fSh`U9$4xM>I)Z@sBmb|hP^6^ zhZ#Z`A^bHbeSLkzQf>u$O+bS%uaO5Gkx7-V74=p}Y;5dEs{)y-`9v!Uvl<}AN?x$l zp2|0>y$=(PtR>$e<|Ih`b4{m#k)X^-JWUN%1t|0n3N4z9XkSzWbjxMht0`R)7Y>-K z6~1ywxn5r0)an=CBSroA)B~Q2P~oq+=rO2;60s*>x#BUb)5K--XWYa-hpVv`7v3g9 zz&VF97vA%^n$dm24`RH$MT#+JZX7LfK)NGln$?^VTvRO7h@PU1l?9ep`=)5weBw8L zzB@9xKzB-4mVNOgU?xgh187b24yn1hG@!!L!wI-*crtz)>z zy*RTHSy$7@=EXd2@%X{9qlS6I%^YUW4`dq4TOtOML163##}f)%@;u%lYe94A?L7*K zuyd3dQ_DAkeI(c7aDR(F7M z=LMM-YhZ7dk)UP8Aqxe0_qhxB2a1Vy#V>c7{3iyjkE8)p^@#aijm`5l@tp*`nz_8U zqf``bSq@cz>R3XGVw7)wSKdnX)YT;Or@zee&(MutRD0X7m2;8@4NU-Z@QJDkmVJP z%0KZdfP!%kDHPVgWq;ZL?i$=a=uZE*sQhp+r-Os8gw>EG3csht@Ar43x;Tp`(+Wcy z$3W=KC$jSJ(85JaM1WCB(>@1dN$v+^BH+fjIXTsGEd?#q#wrE4gOM35XD7wpWr?!f zPkuzf`ZZ4Xg5Vf9J55Ut^n;NU>Sh2Ll70(dz(l(4b^R-f<9+b zlPGO-Z=tC1QI`2auR;H)ScWDdQ5eKG{{&!p6%`dQx!@fJ`9PKS{H2^B9Qd91W%oZ< z!uY}IMh-r0mkj0>hmJ{fDeCZ_Kz+ze(FWi+DHS9iFvfoup9L6bz{#WLt5KQS{1>TFM8xP6c53`H& zaPxe2Jq%>n3#!FA8;;r;xabS*Z@$GU)Bd(~`qJt{xu&L9ILhFbOr_#(J!t0^pub%S zeb-luHd0ty+Y4kguy?^Z3XpJE>6vGYAWh{>;tWw&Lm_M~vT%=;NUqmdj_(0U_k!xB zPLjlVd9u&dB=h+2@wD$Rf>weL5UBil9+I!|DUtXk0A&qFr228y3H8;8=F z3H}xO#%+TamWLa25+*F#h5yCXpvY=Gs5X96JkbiDeUOW3zy{25u6!i6&8WNEr2@%v z6Gr^3W&&ICW{ll@RID;@NL1JgyzgIamxW*wbiFtD7fA72~#c1m>jtRln4I99w5?)AO6<0v=9z!KCfg z#*jZevifef8lQuyQ3h}9zReDGhdlwOZ7fi6PNW1#mRr8|>Lqka1#EH)oakhCZUlT| zNHXt~W+uoxlol(#gwj64tzPd*`NQ`oNwq+r+EEOc&mRcy>lY^#H$KbCaDZ*f`h-z| zl(Kawj#`oJs87MYBjfEAE_nnm%&L0d`b(nm6ejO_0Y;3nu5?fT`nbHkq012v!ArCh zaVtF5`7wnQbQx=IqAWjudj5W)sp(ixSe}}|a>2Aib-e}^+gX3;;MHNTn?5~yQgWTu zU)=_G2gIB3QQX?&%U4LGMspv7eUvErEUNz@s_KsMsot+aV~7Ul!(t9LmYO@*m6g5j z|FQoiY2sSs?qzyhdAEk?>w8&<(taJX?~UE=A_b^-&7)IW)0= zQ(MnbgQBcS`dK+Md}0`!7Y^2Q|Dq-psU*j~hJ9p;Wv)qJ%VNrdU6t^Qxh%bu9K znJ%Bt@|vio9XWhmO%Z2m85%XxuyvAy`$<1Y+7i(g)U>@XPl&W^9LlkoAD}ICPkLi( zC>rrgJUk&770CL8A62W(H?UeSjenBX=QG7W99x9$^-IH)%7qc)R=Ydf=5m z6gQ_W9ye!6+@7<4Ht4ZRpaD)F9FAnt6>;0uo}iXVNm;9mJ;llNGoQhWW3-@PlL3oP z=sjDZ7ao&em6Z;(*T1uSXUA3sT_b0#SkTJ4PM^4v5U$|-mpPRdNI7_UwYZHy&l(>W z=SsJ?qYo?_EIiMN*`lq08SV;9N->kHUx34o`wKQcmklV%(G0>8_!d%jUXLzm zu>mSEwwj^Jf8!hnw|_FHGnCiL6tLMlA6sdL-OJv{@}KR|$ll5-WRc~5V95N-jT-SMNAswc18|6*NQyT+*9a;R8dFAU` z@~5Pjo(d2h5|zAH1RPFwcIr_fYinkJs%Ct9pX5;w+se~puC+Zk54=W@V$M9(zx*R8 zi!L{Rxi7j6fl4*=DF2}OxwoRPVj)K;T1Dx65$2zDl5JUS^VK{zau9Cj@IG11SUw<4 zoU^;7Y0TArP(eqy_VcuR#m@2J* zPLm1xt)J#z``QsN*WW7cwQE5pYOB*Va^>H^bIqLSJWuy_1l-cW*~^ro!rwo)fBM|Y zIoF+aTB&{Z7aWA#JzH5obD~##rp2g{>6?PN@}2-F#=vnm z5=Hv5qAtC?@{ga{z{iR|+|h~NFJMoo(0KQ%4E5^S95*fo52*db%t{>>`$I$+xa zEj{$&j5*vTIZTcQn{mN_HUao*ODo3Ts)WHj10&9IlIRtc46)B0aUm@qS&n^OC&S*J zrg0S9$9Vx)GdOK8$71-uy3R5x>M!p0v=Sm9L$`DcA=2@elJ4#fLAsHYlI{*c0Rf2t z6p*2tk(QD!>F$0G&t2=@SND~!rQ_gl;GFZ_`?L2kU;2a82xG5M_-kwYCkC-avq5LAOQXJ5|w@oQ$M|q;F%2O+m7$on;gHlvO4D~8wuY=(__dy zrUEk@lLd|3WY50J8Y@?O-w~ua7{2SwiW6|`R9cY;Q8mc$vELY*-H7?!rLmr~}#*AX0LEa%J`oH+yyzEf8U!Ey%-^+*DFKFASYuG*^ zFq#vcAtn+m)*ZHhNaLC!{-i%lw0+zw6!J$HhRfEQxCMDLIqotsh^0Sy$rSURU$a)I zp9G*~^a_Y^Q06wv)m({)HjA?A(|!!1UuUz^?eE+ALTkx=YV2OBS!RBlq5G`aJ`v9k zNQsa;jhw8+#Kfp?eS7iqxNZMEAdU72X$ROrfW6L;-A~|%Q+r+dTDLe1;UBivvRi58 z4fmW4v89g^U+Ueffwb?rB+Jsv7ALX8ZScv(eDYl@Wx{0|J{%G}0eR~6=N`+?Z?<;! zIyDZ~hlUreyykdK9o%DddBfG5@O(P>(EOYI8|Kb&wOG?^cN{E?r$m~tHD)Z^%fcFr zJW=eOZ4*?vLZ@sZ#!!}#%BhUPhId{P{4gK|tr!KVwE7$Mtd-Ft4j^g8`tgNA*^Q_< zFVOxAIiEh4Qa@Mkqk&xgDhd#;X?qsTnPf#lN@@mxK`_m4@9bz<0*$$BcNVMZ zM^*>4fS0vO-2C))Vzs0m7>a?A!d9c8pb#AuBzu4(iot4-rpk;S5uH5!=g(IRpJH_u zpgcnU00&%6K3~4*Pv;0&(S&j<+m1SBCozSGhNS2^W&xfA>`&&%moxGz)17L4lOZU%T2cT}7)6`c9Tbou4lKh1>6uK8WS3Ya4a>Vqq$JN|}v?b((=E3t%6O zJBhU$g)ynPso~t=jnp?uYTgq6u)-t&5oiTJ9a8zV85JPPeYP9>l|;uFTLEG{FbGVV zPzhQH8KA?|v<+C3iyp!bMNb`beocL^mr1C+k$?kb9_Tp0Z2rHfr34Vx246@P-~q+X zU8tf`u0zor=ANd%ZUh^@?O&j`!OicXeuifs&GL3?;{+coT;O;cKdvPp)K(#-Nj&g* z_=EfdUb7sa_nPP&`#Zn9LSoRT&v9x_&=p{CttiYudBToRXV6ujehh@uC7SNfHI@|= zwP6KQ6{euv(K}%2U`Wcj%P$p$>K2_U-7=I&v=Z}_Yb}n-g0_p)R|U}t=3fI;IDe!& zCx}IA^eMQ$%B`r7f}LSNLskJa05lCS0RXWMEQq{(e5}~acJ|E+s-Eaq4l~9cR?vS@ zySK}@xNz4XL#P6+hUrk5r{mS0!KeD3e&S>J*$My5Rdep#O{U+L;H0D^9NDR_-1?U+ zAyfV^8%7~>1HJtkGK5Z*F0l=eZSTk$q0M?tL$P@FY+Q2stg>NoyxrgVIMu&>E!-7K z)$-Jm^OgIi<@u@~M+Ji^hsE_S7+yg5_tgTmkV&6PorB@Bo$Qo9?ck=z`w*5e!$-YT zqtr`ejGSj%Tc-YB2NYq+13ujeB$-O-LzuB98~@uVZ#KfeA@kx3-IGr5mtleD0>S4< zOeW&}aZWA4!#k_}fsL68y_~Q;gR0t<;M9f>P?TrLhsJi~*7}Sv?-)%UEquomH6nud z3AyxSu_!vep^?dK90R8d?kMD;ldOZ#_H*%2CFVb9YC<+TFV!^FtX=+e591>^q}$DD zPN5~Q*4=+I=H+Si0fdt!Eh?&l!9wE(*r{zQzS z`g};K(zvCq?YF`nX!fA8Z7@T%Yz_^JIRwF>Dy@$bWQ0ThN$N0cH>EcJt~{YWAVkp z(0fPZBh!=3hWF5yHgCPJR06|3$*rh|7%eV#3s=D<=jTYmhiL>e)?yDFH4TQ@{~V2t;X3Z} zNj3WK0IBF9(dg|nj@Jk3NignguCLm~1H-{70(MrF-QzJw=@J_K)PtTQP0%#&C65*H&{0rWESj#nlZcPr~O6yt6WQ zGw=Glijzma)E0fC2mhITBjzUFt)3{!*{lFYl&tuw?sXTnKH|z0&)CjqcF>pjn0l`O zXH?b@hN;I)s7a2g=j1<7E<(~FN{qi9tf+$b*68_+5~E{$wmaQmOa6fcqTYCQY}Aq6 zZA?C$)cy*@X$5J}|7eZA!!fPn>;}-*%I~=G?{~Svjq5N2JG=L^sftP&Pnc)3mQ2*t z+Y#4483mL!cA~<@$_)Wb0bnm6+^*U*1O(~;=4>_ z@yCf(0imz_RL1>&rRRN2*Mon+w^HddfDBUys zh5PPVLowIPp=Sz_KYE!7vDYf#@-?#ChV1Ulgyy!kPygGC2@3H9Y)08toFztg|G52| z_66FaC0!xI{yPxlg}kTA(Ni!obR_QnkoeNz`N=kaz#xo2ZpJRaVhqm&Qvmfhv#kGX zth@R)hNXPu=SVN~x4>{rbeg-ln)-0fL%ay@d;75T1?*FaMt&Gwk2$y@_Jb(irAHe87;axXNQV@y|C}w~cm*leBkuN~s|KN5GJ^ zg$C6nLpAv&<+b!A=$*V+1jbkb2D;co)ZkAqO2d+N1}m5Qe$N`2TQ zs3(rJF0i5T2s`&}ZkU5&44v0Lq~F--{V8jh zD00QDUwj6&)gSr2C0bHyU;1UI1+wfUr-KFsErbfY<%CN zkmJ9>9z6xM9^H#(j#+<{rEbP>|3R~QC!JblpqUmxKEf(O;k=7CaXHU@1?Er7eGWIE z7JG~e{rJ+S$yGH~?rVtX+|Q9@PSaFz*=eo~dxz~Asre1t9M7_Z5F6Sf^*Q#Wh5WId zt8@3ZUHPYYZEkxsDhWw43s0NXlHF3EzVi^tRAXje%$0wyzz}!bxRv`lJEC=%YoHaa zrj39`e~+Y-i`f!8N7y;8vx<^YFsaMrpqKi5^~@WBt&#&VMd8<}(od|=M!6ofO$iUj zfJh`6QxTA*j5@FEZYuo=lV{1$9DH-s&|mBdzv~dIDaA3msH(R6T;l6;+fV{d$$)^)~+g-Taxms4ZJmuv&Xz`Q)~i$u58(ve*WQSeN;)MB4jVl#57osHi#P$I;&oT>mKbBw|MclDBIg#Ec#5a2V?(Qg5%yibs zfE93)rSaAHo{+gVQbd>tD;g=_)H;CDINhr@`40iq)-&IObX_Zabro0c0LR_V>yomw zvjfqQ)DOfYOvEc0-q3h~lj9LAgsp}XA|~`plikI93e)(mr%DjMju&QVCM4kV~B7PBr8wXoDM-N>!iwdK=31~@oD;XMX`T5aVGQ-^@D}lc+r_!_fa{`;G5BtBt z?6)Q+)ROa(eDRI6ZJF~Wg3YVEMTYpbwypsWKL5TuY-l_zdp(ufjnJkexsD;mSL3ZN z-(_e713JJo*-7#%Y25X4T|e8f6ty?C;n{6NzZ`u1NI0!JvT-r)R}(Rnzc7#;SRXOE zJX-oW3_S;_CH#HjlPax58>0ebzFN7VX|xYimv7r@`o((d6v0N~cr(2>chPh)+VcHN zh%@~sWZ2&!ZW|##w)|lb6#a5&3}AXw)6XGFO#GTrC|&mHgq3+z=_hC*o*cQk9m51< zi`V{QP2))mTKyd>Aa(FH$&=}k)7&QC=0+5ERD(cYS{l(%zIeRdOjXG*4ft(I>&pJ{ zLTAS;(ec0d1T+GidKfoCK&bto8`V+>$nl#LYVc|=fZ zWCc`#Ll_nlofc7`2~FIjTs~BYn7R6mdp&d>{F=e!3-u+{A*hXnljVqH{(d)cQF}|l zKJDN@hPKMtcFh1GTl4i$(PHe@E(4kNp z=hc#sD11Q@qccph=H~M_YLEM=xD2Q77wz0bJ^TsMl6PLTgafQDkVd)gR5o$9z$8UooST^W7&R3*`Z77=A2sGu` z;#Rr|q3J*E!2r`E#9K8d+gZS{0A7=e&G)Bi-A{z7yVg?~cci;!7v+fyv}mg4cBtk% zR=5clNtaav5V(1N+tauRB10S2E$YX7RG5}!Gh9nuDQZTZtSu+6g&Xr0sHiy;DLl1M z0gUDsVtXhADnYM-stShJmzc^eK1n+Fy9}NmY@T$^cakXnZG+>$F>e>!0#TGv|2gPe z8CBXtR=MLkqt>m*X^4YNka~j}+bB#?`Useu4_9d3{-iKlnnQy96o5@;F)3$6_-^NUjDYHxk=Dw* zYk*zb!r#AT?4H%MeK`;}TfH%fZ}$TiBiXv!XCHhGjkoXJOO*0wzS(G4ahwKxRL}UZ zIYJBOZ=i}nVhP=@DEw`%y-zYl;ny2gBmUpW%SEijn_jgABHweG^6PfnRBTkS`npIm z^R_L0eqWJZ3*U5gu{DH61a<%C|HFbl!2fERA@04XJY#BsOTdd@+aN`uFYM)tA5*11 zno5hlq1)0^Lve|e(nA~QQ<_?>M=?Wdjh4Wk*OUkyTQd|BCipZ0fJDG;mHGxFk7>Ro zQ;|Q{p#EeC1UwJH&wm+Zmp>W@k^=UOM~)=iJdpvHb4IP%U7kAWogUFa%MH}2_3o$9 zeia(AL#)I@!$I92C2)5)eU+WEpeS%!}PZzvuQsr;; z8CB&-Q;a(}qiA50-gA!50)VWiOH^ImKBfGR>sMEE=W;a`r+!)ySq=6%H90wGsr+US zIfnDvCYGY`2qFMqH2)tv%+j!^k|!Mj@&T;B!sQjrFbz;3i3tF(H_KvVQpvMy4?%bL z@~Ulc<2H^@KmX|&*XoiZy0|#F#jm0UO)IJC6I_~_7Vsfgg&U6)rolI2U+{hqHEl

z#J*|zSiG!0l#X^;lq1JgknGAD1s(XJ5;TTr zS`*mnVL5o=nW^0QhiL|D$HCcI)y$XnW>Z(YPxV?v(&ZLS29RLmfDn_Pq>rnNAPYNS z-}&77*10-wF!{+9h=sjFc@NX=I=HB{>?bhy;QqbL!}&0SaJafIKh53GW%V^fIY4^A zy?oxr%~eURoTs=@e}w|hNE|(`;~}+e*waHDD4$cw?A#G`B)8uvw_R*T1>9@|By-YV3qsx{BJ(N~kKcCUWcP6&RHV4ldlTPwhZNt4ue#T{U6oDmQ1&H7Wn@CjWSdbAgsWE1MOO zjusGglWmE#pLJeoNe5=Q{KPd**4BM zB6aKzj0+_7wSN7U(pRYtt?DfdbH@FVTNPDk3elZK!^Cp*1Q1P)Pj#}x34qIfs%>s} z)=*E84(Pa(!JV@tS^7V>#QtQ+pDQ&Yq*f>fs%e}3VPg7#Om*8DV>mxpQ~?DPl$4Yp z&8nPJtruYLXd-zok!EtcLF|3E#SwEFqX-FSi&@MMM7~8IiA7ZByy z2B+_coqUEgW%))aI}e3Y4fUejYUBUPR9qm_bbqG6`H@V0dzISKF^a12Pp9i~n_Tl} zRgvLb;oi13B;elf?>h>&#B~p(vSF^>!EcEZTk z7%0v7@5lYva)Q`~VNDLu{XiIhVop7a$J5Je{Lfq$_-ov*7*C9+hg`0UA<0JF$K&$Z;Mw^a zb472c@-{J(JcY0e0eZXwTHD46OHFe11U(-+-W%JT70m&Af>k0z&Lc-T!RQx$;4_|3 z8`wExwHaAG`qsjjWQE2WW!%k4LPDZyaiE+lByDfchGukCH$IncRr4^}$OO!!rS!U=Ps-;#v-VxJ0z=WW5 zeujNX43ER;P8cUA-{#lZ-UzkfkS-Wg(IbGEXRaeBDt;EB_YGI|lBk{e{;ry0Q)>e{A+`+1KBd-7-w(dOJ#KC7>y{)g zme(<8lUsT~y?<6c9P}6!5)42!urdkK16H0gIDRIF)xW7dj zzKh6rvD`7kn(5FyT0>rPsve)THSSuBF4`Z4vYuh-Y?;6i!~59 zwUyJ+Ifq>_;XjwF29{e{UvRD5S6z+&&aOb@i|&5|7T?UfT$KxaLnzaStZM;+hzF#8 zdV(^#*^LtykWU2Pcpy3kVx7Q*)&21f0`~l`<%m3jw#Y{_XuYlKJXy&GZ1Yy8oQF1T zCv6$%AMl)yEsqOSZG#4TY)CleqLH$L0bpt2V4#3@&0hP^!I zi!mOJwl~O_vD8Njc>mJSWhWw~pa4eE81OrJVvogW3Hz04k`2R3(}y><_V%TdZmbaNpo+zrfjsI1>#t4&T~DXoKRO{TBKt1&JnJ0P6ywF> zsG0F5$Y!(njogBBE9NQnwG1@pg-LhjVC-N0Zg#kw!yxD)QvR6z^yBBxm6Iz_?!XJ0dQ|s(4n-jGK>oP1jk=73(}nQMtyg!lB%GqFGvG}@y@4#~iU8aw|jcNX{2QR{;p zO2>iPGrdF{Lrek^5E=P@`eGNFQa~>#4PuhBm-y67AWeQCg+74&p zfB55KVvxQ8?D8n-zJG}Jz<26{5inc9H2S#A09Op?<`c|Ovb++2k*W_kW^}sue%_g0 z@_iL`6Qc$FRtX4-zUeA7b ze}gkV3HG7a!+nXv!#-bA#POPTV`Oan1Nu)M6JCz=GYW8Z3F1C)z$qonb3mX47m2!? zacNE^l@A-Fl$X!^^gaxm?_ci<{aX-wp5BW-nQFZ^#;yas*2-{>n)MZJIH!}?`FJFGb2SHNi z_|)l>WYOKbeuKxG1C&WBi7%mt9@tZ)s0wEkw@Rst-eCZcbm*wT!Rg#ayGK4`*j))J zqq93rljivTaEmeNpf5>7)x}eRRrc+__*XVV3Cbm;WMmz@N-}TXf^H~Wg*0dZ_hetY z&Vtp=_^iOq&^Ffm)D;{YKzf0k-|=gGReGhB5vacm<_J6?17ouG zybx0&LG_btuOqqyShe>MxOT?)C%KFxtNSxjon5>`?%m6?dBrj8kvheYWg2_2pW(d^ zN4>hPQv|>aSXa+{tiS>dWh+Mlz&)6QUE|6?{nOx0Ccc~5qpQTyEJmoMKs_@^Z6c&}Z-N4f#aUe$!OPf;R-y*JCB z*E*gEeV`S8TTit-WfB->(G;h|WR#0;+@q{>u;#xhary>4M^RL;q;Pt^x)8^pvSQ6D z8}2;zOM4L$CICOfn;Eqm6Jt{Sr>DcVio|Pk-#K!Ae1cn73R4a_iE$_ge zPBD|Uw1lzoPF(UnC)VG{H!oQhud5rnkbk^2=#z|wKOVV>xZ?Y)vQP6qo5NSn3OrhL zz}-1EYGosu4^JCX<+I90gjzqD8Mf6pvL3S!D227)7Is%{SZHXrhKQ2i*-TsB+}(zQ z{{h?MyQxvwoyzPY%g^N8h_td&dbe^ONU}VLXY)=ZA@uZu!Tn4O?$WyMmS&)`!@|`H z{DQ;-xPA^UZVs;3nmk-WTzo>jJZxOxH(btRdXLvZ{l6Eyce1pz_WA$606BiS5xhXh zS5wzr-OP)|+11I~&cTYt-N)IA#?IN@0tv}GXZ0B8sf#u<^MDHCx7@lq66#BAs0H?m zmoF5O2~l6rNCokBTB5$J)ucg8|LN=c-9^#$1Q8_rSsseCO^ok;Eb%%Oyake+w6avC IglWkC09R)W(EtDd literal 0 HcmV?d00001 diff --git a/docs/articles/flexbox/flexbox.html b/docs/articles/flexbox/flexbox.html new file mode 100644 index 0000000..c01e90b --- /dev/null +++ b/docs/articles/flexbox/flexbox.html @@ -0,0 +1,109 @@ + + + + + + + + +Long TOC • imola + + + + + + + + + + + + + + + + + Skip to contents + + +

+ +
+
+ + + +

test

+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/getting-started.html b/docs/articles/getting-started.html new file mode 100644 index 0000000..360a071 --- /dev/null +++ b/docs/articles/getting-started.html @@ -0,0 +1,111 @@ + + + + + + + + +Tutorial: Getting started with imola • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + + +
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-breakpoints.html b/docs/articles/imola-breakpoints.html new file mode 100644 index 0000000..8235d55 --- /dev/null +++ b/docs/articles/imola-breakpoints.html @@ -0,0 +1,129 @@ + + + + + + + + +Tutorial: Using breakpoint systems • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

flex +

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-demos.html b/docs/articles/imola-demos.html new file mode 100644 index 0000000..3269738 --- /dev/null +++ b/docs/articles/imola-demos.html @@ -0,0 +1,129 @@ + + + + + + + + +Demos • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

demos +

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-flexbox.html b/docs/articles/imola-flexbox.html new file mode 100644 index 0000000..5341b4f --- /dev/null +++ b/docs/articles/imola-flexbox.html @@ -0,0 +1,129 @@ + + + + + + + + +Tutorial: CSS Flexbox and imola • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

flex +

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-getting-started.html b/docs/articles/imola-getting-started.html new file mode 100644 index 0000000..b619429 --- /dev/null +++ b/docs/articles/imola-getting-started.html @@ -0,0 +1,110 @@ + + + + + + + + +Tutorial: Getting started with imola • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + + +
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-grid.html b/docs/articles/imola-grid.html new file mode 100644 index 0000000..fbc81e2 --- /dev/null +++ b/docs/articles/imola-grid.html @@ -0,0 +1,129 @@ + + + + + + + + +Tutorial: CSS grid and imola • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

flex +

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-templates.html b/docs/articles/imola-templates.html new file mode 100644 index 0000000..7b5c11f --- /dev/null +++ b/docs/articles/imola-templates.html @@ -0,0 +1,129 @@ + + + + + + + + +Tutorial: Templates • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

flex +

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola-why-flex-and-grid.html b/docs/articles/imola-why-flex-and-grid.html new file mode 100644 index 0000000..b7fa9dc --- /dev/null +++ b/docs/articles/imola-why-flex-and-grid.html @@ -0,0 +1,211 @@ + + + + + + + + +Why CSS grid and flexbox matter • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +
+

Introduction +

+

If you’re been around web development since the 90s, you might remember how different web design used to look. Solutions were often complicated, hacky and unintuitive work arounds were common place, and often considered best practices. As the web evolved, so did the layout (and styling) options available, maturing and changing to make what used to be convoluted solutions into simpler and more straightforward approaches.

+

So how was life before CSS we know now came to be? How were page layouts setup? Why is grid and flexbox considered so much better than the previous solutions, and why are both currently used side by side instead of one over the other?

+

Join me for a trip though time as we look into how web layouts evolved since the beginning of the web into the current state of the art solutions we now use.

+
+
+

The early days of HTML +

+

The original proposals for HTML started in 1989, and lasted until about February 1997, the practical realisation of HTML was about presentation on screens. This included published recommendations, browsers & development tools, and actual web sites. At this point web developers where mostly focused on document sharing, so elements focused much more on document requirements such as headers, fonts and paragraphs. In 1993, some style sheet control of layout was proposed, but it would still take some time for it to become mainstream.

+

Around this time (as well as during the reign of tables for layout purposes) the HTML document structure dictated the page layout, and the though that you would need more that sequencial content, was barely even considered. Early HTML specs state that “The elements within the BODY element are in the order in which they should be presented to the reader”.

+
+
+

HTML Tables +

+

In 1991 ViolaWWW grew into the most sophisticated of the early Web browsers. It is claimed to have been the first browser with support for style sheets, tables, and nest-able HTML elements. Followed in 1993 a proposal was made for “columns” in a presentation language for the web. This proposal did not directly turn into CSS. “The styles defined specify the recommended behaviour of HTML objects in terms of: …. page layout … column ….”.

+

These were the initial works of tables in HMTL, and finally in 1997, HTML 3.2 was finally released as a W3C Recommendation. It stated that tables “can be used to markup tabular material or for layout purposes”… And oh boy did people took it literally. Tables became the base for most web pages and considered the go to when structuring content. It was a wild time of invisible gifs used for spacing, convoluted markup and many more terrifying things.

+
+
+

Floats and the first layout frameworks +

+

Eventually a new CSS property made its way to the top, float. The idea of float was simply, you have an element and need text to wrap around it, float that element and you get exactly that! Simple right? Well…

+

If you couple this with fixed size for each floated element, a large dose of space clearing techniques, and the CSS position property one could achieve A LOT. This was the conclusion that some clever developers reached in the early 2000’s, allowing multi-column layouts to be created and becoming the go to for these times. Eventually even frameworks started poping out that would hide these hacks behind a css classes and HTML structures, making life even easier. Bootstrap 3 is a great example of such framework that, even now, can be found in millions of websites (even though its newest iteration, bootstrap 4, no longer uses this approach and instead relies on flexbox for its layout system).

+
+
+

CSS Flex (flexbox) +

+

The introduction of the display: flex; property around 2012 was a real step forward, solving many existing layout problems and making web developers and designers generally quite happy.

+

This was the true first CSS property to be 100% developed to be focused on layouts, making its way into modern web development quite fast.

+

It is specially powerful for page layouts that can defined primarily in terms of either columns or rows. for instance, if we want to align a few elements in a single row, display: flex; provide us with a modern and easy way to do so.

+

Not only that, flex has built in control of other properties such as alignment and viual order of the elements without having to change the HTML markup directly. As HTML becomes more and more semantic based, specially with the release of HTML 5, this becomes even more important since it allows us to fully decomple the presentation layer from the content.

+
+
+

CSS Grid +

+

At this moment in time display: grid; is the only CSS property intended for building flexible responsive grid layouts. This sort of layout requires a layout area which can be manipulated in two dimensions – both horizontally and vertically – and this is exactly what CSS Grid does.

+

While display: flex; gives you full control over either columns or rows, Grid goes one step forward and can handle both rows and columns, meaning that it will always align items to the horizontal and vertical tracks you have set up. Grid is mostly defined on the container, not the children as it is with flexbox.

+
+
+

New is always better… Right? +

+

So Grid wins!

+

Well, No.

+

Flexbox and Grid serve different purposes and are both incredibly useful. Sometimes flex is the best solution, sometimes grid makes it simpler, sometimes any of them works.

+

Flex and Grid also work very well together, you can easily put a Flex element within a Grid element and vice versa. The important thing to decide in each case is which layout system is best suited for your case.

+

When it comes to which approach to use, there are some general rules to make life easier:

+
+

Use Flex when: +

+
    +
  • Content is priority
  • +
  • Need horizontal or vertical alignment
  • +
  • Layout is one-dimensional
  • +
  • Need better older browser support
  • +
+
+
+

Use Grid when: +

+
    +
  • Things need a set width regardless of content
  • +
  • Need two-dimensional layout (items in one row or column need to align with the item in the previous row or column)
  • +
  • Elements need to overlap
  • +
+

A common rule of thumb here is to use Grid for full page layouts and Flex for everything else, or to consider whether the component you plan to build is one-dimensional (Flex) or two-dimensional (Grid).

+

For a more in depth dive into Grid and Flex, make sure to check the vignettes for each for them:

+ +
+
+ +
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/imola.html b/docs/articles/imola.html new file mode 100644 index 0000000..2be1553 --- /dev/null +++ b/docs/articles/imola.html @@ -0,0 +1,235 @@ + + + + + + + + +Tutorial: Getting started with imola • imola + + + + + + + + + + + + + + + + + Skip to contents + + +
+ +
+
+ + + +

If you’re familiar with CSS, you might have felt by now that layouts in shiny can be very awkward to set up.

+

While R/shiny does give you direct access to bootstrap’s row and column system, these do have some limitation and changing layouts usually requires having to rebuild a large portion of the UI.

+

As web development improved, this system also showed to not always be the most flexible, specially when trying to replicate a design or mockup not using this 12 column system, making it challenging to achieve without a lot of additional custom styling.

+
+

Usage +

+

The bread and butter of imola are the gridPanel() and flexPanel() functions. These allow you to replace any HTML tag that serves as a container (div, section, main, nav, …) with a tag that uses one of the specific css layout systems (grid or flexbox).

+

If you are not familiar with these layout systems, I definitely recommend this article to get you up to speed.

+

The basic difference between CSS Grid Layout and CSS Flexbox Layout is that flexbox was designed for layout in one dimension - either a row or a column. Grid was designed for two-dimensional layout - rows, and columns at the same time. This means if you want fine control over columns and rows, you should aim at using grid, if you only care about one of the dimensions, flex will most likely work just fine.

+
+

Grid +

+

The grid family focuses on providing support for the CSS Grid standard. In imola you can find 2 functions that allow you to create a new grid component. gridPanel() and gridPage(). gridPage() is simply a wrapper for gridPanel() that allows you to create a page UI element without the need of using any of the built in shiny functions.

+

If you’re interested in more information about the full array of options in the CSS grid standard from the CSS side, I recommend this article to get you started.

+
+
+

Flex +

+

The flex family focuses on providing support for the CSS flexbox standard. In imola you can find 2 functions that allow you to create a new grid component. flexPanel() and flexPage(). Similar to what happens in the grid family, flexPage() is simply a wrapper for flexPanel() that allows you to create a page UI element without the need of using any of the built in shiny functions.

+

If you’re interested in more information about the full array of options in the CSS flexbox standard from the CSS side, I recommend this article to get you started.

+
+
+
+

Breakpoints +

+

Breakpoints are a way to adjust your layouts to different screen sizes. As the screen size gets larger or smaller, it is often required to adjust the position or size of the different elements in a page to make sure things dont appear broken or out of place.

+

Depending on the CSS framework that is being used in your project, different systems are in place to allow this to be a bit more automated, if you are familiar with base shiny, you might have even used these systems without realizing, by using the fluidRow() function. fluidRow() will trigger layout changes to your columns at specific screen sizes, based on bootstrap 3 breakpoints (The base CSS framework in shiny).

+

While the fluidRow() solution is quite easy to use, it also comes with many constrains and does not allow for a very fine control of these layout changes. If complex enough layouts, you might even be required to write additional CSS to add new behavior or specific elements or screen sizes.

+

Imola takes a slightly different approach to breakpoints; Out of the box it uses the same breakpoints as base shiny (bootstrap 3) and for each function named attribute you are able to pass either a value for that attribute or a named list of different values for different breakpoints.

+

As a practical example, lets say we have the following grid areas in a gridPanel():

+
+# as a gridPanel() argument
+areas = c(
+  "area1 area1 area1",
+  "area2 area3 area3",
+  "area2 area3 area3"
+)
+# or
+areas = list(
+  c("area1", "area1", "area1"),
+  c("area2", "area3", "area3"),
+  c("area2", "area3", "area3")
+)
+

This grid contains 3 areas (area1, area2, area3), with area2 clearly serving a sidebar. Viewing this grid on a small screen could lead to a very small sidebar, so one solution is to modify this grid specifically for a breakpoint that targets mobile.

+

As mentioned before, shiny and imola, by default use the bootstrap 3 breakpoint system, that contains a few different breakpoints:

+
+

Screenshot

+
+

We can see what names imola expects for each of these using either activeBreakpoints() or checking the option directly with getOption("imola.breakpoints")$bootstrap

+

In out case, we want to target small devices, so we target these via xs, and build our grid argument as a named list instead.

+
+# as a gridPanel() argument
+areas = list(
+  default = c(
+    "area1 area1 area1",
+    "area2 area3 area3",
+    "area2 area3 area3"
+  ),
+  xs = c(
+    "area1",
+    "area2",
+    "area3"
+  )
+)
+

NOTE: Imola reserves the special default name for values that are used by default, outside of any given breakpoint boundaries (default is the rule, breakpoints overwrite default for specific screen sizes).

+
+
+

Templates +

+

Very often during development it is also common that multiple elements share the same layout. In order to easily reuse any layout you create, imola also includes a simple template engine.

+

In order to save a template you can use the registerTemplate() function. This function requires a ‘type’ of template (grid or flex), a name to identify the template later, any named arguments that can be passed to the gridPanel or flexPanel function (depending on the type) and, optionally, a breakpoint_system to use if you plan on adding any responsive attributes to the template (If no breakpoint_system is given, the current active system is used to register the template).

+

After a template being registered, you can then simple fill in the template argument on any of the panel or page functions with the name of the template. You can also adjust the template for a specific panel by providing any named arguments in addition to the template name. Any named argument that exists in the template will be orewriten by the named argument on the function call.

+

Lets say we would like to save our previous areas as a template, and use it. We could use registerTemplate():

+
+#in global.R
+registerTemplate("grid", "mytemplate",
+  areas = list(
+    default = c(
+      "area1 area1 area1",
+      "area2 area3 area3",
+      "area2 area3 area3"
+    ),
+    xs = c(
+      "area1",
+      "area2",
+      "area3"
+    )
+  )
+)
+

We can then use this template to create multiple grid panels in our application:

+
#in ui.R
+gridPanel(
+  id = "somePanel"
+  template = "mytemplate"
+  area1 = div("area 1 content"),
+  area2 = div("area 2 content"),
+  area3 = div("area 3 content"),
+)
+
+gridPanel(
+  id = "anotherPanel"
+  template = "mytemplate"
+  area1 = div("different area 1 content"),
+  area2 = div("different area 2 content"),
+  area3 = div("different area 3 content"),
+)
+

You can register as many templates as you want, but keep in mind that each type + name combo must be unique. You can also remove templates using unregisterTemplate() if needed. For a full list of registered templates, you can use listTemplates().

+

By default imola also includes some ready to use templates these will also be listed under listTemplates()

+
+
+
+ + + + +
+ + + + + + + diff --git a/docs/articles/index.html b/docs/articles/index.html new file mode 100644 index 0000000..2784b55 --- /dev/null +++ b/docs/articles/index.html @@ -0,0 +1,111 @@ + +Articles • imola + Skip to contents + + +
+
+
+ +
+

Quick start guides

+

+ +
Tutorial: Getting started with imola
+

Learn how to get started with imola.

+
Why CSS grid and flexbox matter
+

As the web evolved, so did its layout solutions. This article explores what came before and why flexbox and grid became the current defacto solutions for layout generation.

+
Tutorial: CSS Flexbox and imola
+

Getting started with CSS Flexbox and imola.

+
Tutorial: CSS grid and imola
+

Getting started with CSS grid and imola.

+
+
+

Templates

+

+ +
Tutorial: Templates
+

Getting started with imola layout templates.

+
+
+

Breakpoint systems

+

+ +
Tutorial: Using breakpoint systems
+

Getting started with imola breakpoint systems.

+
+
+ + +
+ + + + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..73598bf --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,109 @@ + +Authors and Citation • imola + Skip to contents + + +
+
+
+ +
+

Authors

+ +
+ +
+

Citation

+

Source: DESCRIPTION

+ +

Silva P (2022). +imola: CSS Layouts (Grid and Flexbox) Implementation for R/Shiny. +R package version 0.4.0, https://github.com/pedrocoutinhosilva/imola. +

+
@Manual{,
+  title = {imola: CSS Layouts (Grid and Flexbox) Implementation for R/Shiny},
+  author = {Pedro Silva},
+  year = {2022},
+  note = {R package version 0.4.0},
+  url = {https://github.com/pedrocoutinhosilva/imola},
+}
+
+
+ + +
+ + + + + + + diff --git a/docs/bootstrap-toc.css b/docs/bootstrap-toc.css new file mode 100644 index 0000000..5a85941 --- /dev/null +++ b/docs/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ +nav[data-toggle='toc'] .nav > .active > ul { + display: block; +} diff --git a/docs/bootstrap-toc.js b/docs/bootstrap-toc.js new file mode 100644 index 0000000..1cdd573 --- /dev/null +++ b/docs/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function() { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function(el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function(el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function(el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function() { + return $(''); + }, + + createChildNavList: function($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function(anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function(headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function(el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function(i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function(arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function(opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function() { + $('nav[data-toggle="toc"]').each(function(i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(); diff --git a/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js new file mode 100644 index 0000000..b65b161 --- /dev/null +++ b/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i="#"+i.split("#")[1]),e=i&&"#"!==i?i.trim():null}return e},e=e=>{const i=t(e);return i&&document.querySelector(i)?i:null},i=e=>{const i=t(e);return i?document.querySelector(i):null},n=t=>{t.dispatchEvent(new Event("transitionend"))},s=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),o=t=>s(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,r=(t,e,i)=>{Object.keys(i).forEach(n=>{const o=i[n],r=e[n],a=r&&s(r)?"element":null==(l=r)?""+l:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(o).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${o}".`)})},a=t=>!(!s(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",()=>{f.forEach(t=>t())}),f.push(e)):e()},g=t=>{"function"==typeof t&&t()},_=(t,e,i=!0)=>{if(!i)return void g(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let o=!1;const r=({target:i})=>{i===e&&(o=!0,e.removeEventListener("transitionend",r),g(t))};e.addEventListener("transitionend",r),setTimeout(()=>{o||n(e)},s)},b=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,E={};let A=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},O=/^(mouseenter|mouseleave)/i,C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function k(t,e){return e&&`${e}::${A++}`||t.uidEvent||A++}function L(t){const e=k(t);return t.uidEvent=e,E[e]=E[e]||{},E[e]}function x(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=D(e,i,n),l=L(t),c=l[a]||(l[a]={}),h=x(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=k(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function N(t,e,i,n,s){const o=x(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=D(e,i,n),a=r!==e,l=L(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void N(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach(i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach(o=>{if(o.includes(n)){const n=s[o];N(t,e,i,n.originalHandler,n.delegationSelector)}})}(t,l,i,e.slice(1))});const h=l[r]||{};Object.keys(h).forEach(i=>{const n=i.replace(w,"");if(!a||e.includes(n)){const e=h[i];N(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u(),s=I(e),o=e!==s,r=C.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach(t=>{Object.defineProperty(d,t,{get:()=>i[t]})}),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},j=new Map;var M={set(t,e,i){j.has(t)||j.set(t,new Map);const n=j.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>j.has(t)&&j.get(t).get(e)||null,remove(t,e){if(!j.has(t))return;const i=j.get(t);i.delete(e),0===i.size&&j.delete(t)}};class H{constructor(t){(t=o(t))&&(this._element=t,M.set(this._element,this.constructor.DATA_KEY,this))}dispose(){M.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,i=!0){_(t,e,i)}static getInstance(t){return M.get(o(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.0"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}const B=(t,e="hide")=>{const n="click.dismiss"+t.EVENT_KEY,s=t.NAME;P.on(document,n,`[data-bs-dismiss="${s}"]`,(function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),l(this))return;const o=i(this)||this.closest("."+s);t.getOrCreateInstance(o)[e]()}))};class R extends H{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=R.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}B(R,"close"),m(R);class W extends H{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function z(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function q(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}P.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');W.getOrCreateInstance(e).toggle()}),m(W);const F={setDataAttribute(t,e,i){t.setAttribute("data-bs-"+q(e),i)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+q(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=z(t.dataset[i])}),e},getDataAttribute:(t,e)=>z(t.getAttribute("data-bs-"+q(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},U={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>t+':not([tabindex^="-"])').join(", ");return this.find(e,t).filter(t=>!l(t)&&a(t))}},$={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",X="prev",Y="left",Q="right",G={ArrowLeft:Q,ArrowRight:Y};class Z extends H{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=U.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return $}static get NAME(){return"carousel"}next(){this._slide(K)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(X)}pause(t){t||(this._isPaused=!0),U.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(n(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=U.findOne(".active.carousel-item",this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,"slid.bs.carousel",()=>this.to(t));if(e===t)return this.pause(),void this.cycle();const i=t>e?K:X;this._slide(i,this._items[t])}_getConfig(t){return t={...$,...F.getDataAttributes(this._element),..."object"==typeof t?t:{}},r("carousel",t,V),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?Q:Y)}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),P.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},e=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},i=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};U.find(".carousel-item img",this._element).forEach(t=>{P.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(P.on(this._element,"pointerdown.bs.carousel",e=>t(e)),P.on(this._element,"pointerup.bs.carousel",t=>i(t)),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.carousel",e=>t(e)),P.on(this._element,"touchmove.bs.carousel",t=>e(t)),P.on(this._element,"touchend.bs.carousel",t=>i(t)))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=G[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?U.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===K;return b(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(U.findOne(".active.carousel-item",this._element));return P.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=U.findOne(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");const i=U.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{P.trigger(this._element,"slid.bs.carousel",{relatedTarget:o,direction:u,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),d(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add("active"),n.classList.remove("active",h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove("active"),o.classList.add("active"),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[Q,Y].includes(t)?p()?t===Y?X:K:t===Y?K:X:t}_orderToDirection(t){return[K,X].includes(t)?p()?t===X?Y:Q:t===X?Q:Y:t}static carouselInterface(t,e){const i=Z.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){Z.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=i(this);if(!e||!e.classList.contains("carousel"))return;const n={...F.getDataAttributes(e),...F.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(n.interval=!1),Z.carouselInterface(e,n),s&&Z.getInstance(e).to(s),t.preventDefault()}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",Z.dataApiClickHandler),P.on(window,"load.bs.carousel.data-api",()=>{const t=U.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;et===this._element);null!==s&&o.length&&(this._selector=s,this._triggerArray.push(i))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return J}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=U.find(".collapse .collapse",this._config.parent);e=U.find(".show, .collapsing",this._config.parent).filter(e=>!t.includes(e))}const i=U.findOne(this._selector);if(e.length){const n=e.find(t=>i!==t);if(t=n?et.getInstance(n):null,t&&t._isTransitioning)return}if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach(e=>{i!==e&&et.getOrCreateInstance(e,{toggle:!1}).hide(),t||M.set(e,"bs.collapse",null)});const n=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s="scroll"+(n[0].toUpperCase()+n.slice(1));this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[n]="",P.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[n]=this._element[s]+"px"}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",d(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;for(let t=0;t{this._isTransitioning=!1,this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),P.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}_isShown(t=this._element){return t.classList.contains("show")}_getConfig(t){return(t={...J,...F.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=o(t.parent),r("collapse",t,tt),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=U.find(".collapse .collapse",this._config.parent);U.find('[data-bs-toggle="collapse"]',this._config.parent).filter(e=>!t.includes(e)).forEach(t=>{const e=i(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))})}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach(t=>{e?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",e)})}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=et.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const i=e(this);U.find(i).forEach(t=>{et.getOrCreateInstance(t,{toggle:!1}).toggle()})})),m(et);var it="top",nt="bottom",st="right",ot="left",rt=[it,nt,st,ot],at=rt.reduce((function(t,e){return t.concat([e+"-start",e+"-end"])}),[]),lt=[].concat(rt,["auto"]).reduce((function(t,e){return t.concat([e,e+"-start",e+"-end"])}),[]),ct=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function ht(t){return t?(t.nodeName||"").toLowerCase():null}function dt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function ut(t){return t instanceof dt(t).Element||t instanceof Element}function ft(t){return t instanceof dt(t).HTMLElement||t instanceof HTMLElement}function pt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof dt(t).ShadowRoot||t instanceof ShadowRoot)}var mt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];ft(s)&&ht(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});ft(n)&&ht(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function gt(t){return t.split("-")[0]}var _t=Math.round;function bt(t,e){void 0===e&&(e=!1);var i=t.getBoundingClientRect(),n=1,s=1;return ft(t)&&e&&(n=i.width/t.offsetWidth||1,s=i.height/t.offsetHeight||1),{width:_t(i.width/n),height:_t(i.height/s),top:_t(i.top/s),right:_t(i.right/n),bottom:_t(i.bottom/s),left:_t(i.left/n),x:_t(i.left/n),y:_t(i.top/s)}}function vt(t){var e=bt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function yt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&pt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function wt(t){return dt(t).getComputedStyle(t)}function Et(t){return["table","td","th"].indexOf(ht(t))>=0}function At(t){return((ut(t)?t.ownerDocument:t.document)||window.document).documentElement}function Tt(t){return"html"===ht(t)?t:t.assignedSlot||t.parentNode||(pt(t)?t.host:null)||At(t)}function Ot(t){return ft(t)&&"fixed"!==wt(t).position?t.offsetParent:null}function Ct(t){for(var e=dt(t),i=Ot(t);i&&Et(i)&&"static"===wt(i).position;)i=Ot(i);return i&&("html"===ht(i)||"body"===ht(i)&&"static"===wt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&ft(t)&&"fixed"===wt(t).position)return null;for(var i=Tt(t);ft(i)&&["html","body"].indexOf(ht(i))<0;){var n=wt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function kt(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var Lt=Math.max,xt=Math.min,Dt=Math.round;function St(t,e,i){return Lt(t,xt(e,i))}function Nt(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function It(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Pt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=gt(i.placement),l=kt(a),c=[ot,st].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Nt("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:It(t,rt))}(s.padding,i),d=vt(o),u="y"===l?it:ot,f="y"===l?nt:st,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=Ct(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=St(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&yt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},jt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Mt(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.offsets,r=t.position,a=t.gpuAcceleration,l=t.adaptive,c=t.roundOffsets,h=!0===c?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Dt(Dt(e*n)/n)||0,y:Dt(Dt(i*n)/n)||0}}(o):"function"==typeof c?c(o):o,d=h.x,u=void 0===d?0:d,f=h.y,p=void 0===f?0:f,m=o.hasOwnProperty("x"),g=o.hasOwnProperty("y"),_=ot,b=it,v=window;if(l){var y=Ct(i),w="clientHeight",E="clientWidth";y===dt(i)&&"static"!==wt(y=At(i)).position&&(w="scrollHeight",E="scrollWidth"),y=y,s===it&&(b=nt,p-=y[w]-n.height,p*=a?1:-1),s===ot&&(_=st,u-=y[E]-n.width,u*=a?1:-1)}var A,T=Object.assign({position:r},l&&jt);return a?Object.assign({},T,((A={})[b]=g?"0":"",A[_]=m?"0":"",A.transform=(v.devicePixelRatio||1)<2?"translate("+u+"px, "+p+"px)":"translate3d("+u+"px, "+p+"px, 0)",A)):Object.assign({},T,((e={})[b]=g?p+"px":"",e[_]=m?u+"px":"",e.transform="",e))}var Ht={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:gt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,Mt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,Mt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},Bt={passive:!0},Rt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=dt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,Bt)})),a&&l.addEventListener("resize",i.update,Bt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,Bt)})),a&&l.removeEventListener("resize",i.update,Bt)}},data:{}},Wt={left:"right",right:"left",bottom:"top",top:"bottom"};function zt(t){return t.replace(/left|right|bottom|top/g,(function(t){return Wt[t]}))}var qt={start:"end",end:"start"};function Ft(t){return t.replace(/start|end/g,(function(t){return qt[t]}))}function Ut(t){var e=dt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function $t(t){return bt(At(t)).left+Ut(t).scrollLeft}function Vt(t){var e=wt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Kt(t,e){var i;void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(ht(e))>=0?e.ownerDocument.body:ft(e)&&Vt(e)?e:t(Tt(e))}(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=dt(n),r=s?[o].concat(o.visualViewport||[],Vt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Kt(Tt(r)))}function Xt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Yt(t,e){return"viewport"===e?Xt(function(t){var e=dt(t),i=At(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+$t(t),y:a}}(t)):ft(e)?function(t){var e=bt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Xt(function(t){var e,i=At(t),n=Ut(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Lt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Lt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+$t(t),l=-n.scrollTop;return"rtl"===wt(s||i).direction&&(a+=Lt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(At(t)))}function Qt(t){return t.split("-")[1]}function Gt(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?gt(s):null,r=s?Qt(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case it:e={x:a,y:i.y-n.height};break;case nt:e={x:a,y:i.y+i.height};break;case st:e={x:i.x+i.width,y:l};break;case ot:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?kt(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case"start":e[c]=e[c]-(i[h]/2-n[h]/2);break;case"end":e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function Zt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?"clippingParents":o,a=i.rootBoundary,l=void 0===a?"viewport":a,c=i.elementContext,h=void 0===c?"popper":c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=Nt("number"!=typeof p?p:It(p,rt)),g="popper"===h?"reference":"popper",_=t.elements.reference,b=t.rects.popper,v=t.elements[u?g:h],y=function(t,e,i){var n="clippingParents"===e?function(t){var e=Kt(Tt(t)),i=["absolute","fixed"].indexOf(wt(t).position)>=0&&ft(t)?Ct(t):t;return ut(i)?e.filter((function(t){return ut(t)&&yt(t,i)&&"body"!==ht(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Yt(t,i);return e.top=Lt(n.top,e.top),e.right=xt(n.right,e.right),e.bottom=xt(n.bottom,e.bottom),e.left=Lt(n.left,e.left),e}),Yt(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}(ut(v)?v:v.contextElement||At(t.elements.popper),r,l),w=bt(_),E=Gt({reference:w,element:b,strategy:"absolute",placement:s}),A=Xt(Object.assign({},b,E)),T="popper"===h?A:w,O={top:y.top-T.top+m.top,bottom:T.bottom-y.bottom+m.bottom,left:y.left-T.left+m.left,right:T.right-y.right+m.right},C=t.modifiersData.offset;if("popper"===h&&C){var k=C[s];Object.keys(O).forEach((function(t){var e=[st,nt].indexOf(t)>=0?1:-1,i=[it,nt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function Jt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?lt:l,h=Qt(n),d=h?a?at:at.filter((function(t){return Qt(t)===h})):rt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=Zt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[gt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}var te={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=gt(g),b=l||(_!==g&&p?function(t){if("auto"===gt(t))return[];var e=zt(t);return[Ft(t),e,Ft(e)]}(g):[zt(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat("auto"===gt(i)?Jt(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O=0,D=x?"width":"height",S=Zt(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?st:ot:L?nt:it;y[D]>w[D]&&(N=zt(N));var I=zt(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function ee(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ie(t){return[it,st,nt,ot].some((function(e){return t[e]>=0}))}var ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Zt(e,{elementContext:"reference"}),a=Zt(e,{altBoundary:!0}),l=ee(r,n),c=ee(a,s,o),h=ie(l),d=ie(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},se={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=gt(t),s=[ot,it].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[ot,st].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},oe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},re={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=Zt(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=gt(e.placement),b=Qt(e.placement),v=!b,y=kt(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?it:ot,L="y"===y?nt:st,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P="start"===b?A[x]:T[x],j="start"===b?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?vt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],z=St(0,A[x],H[x]),q=v?A[x]/2-I-z-R-O:P-z-R-O,F=v?-A[x]/2+I+z+W+O:j+z+W+O,U=e.elements.arrow&&Ct(e.elements.arrow),$=U?"y"===y?U.clientTop||0:U.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+q-V-$,X=E[y]+F-V;if(o){var Y=St(f?xt(S,K):S,D,f?Lt(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?it:ot,G="x"===y?nt:st,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=St(f?xt(J,K):J,Z,f?Lt(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function ae(t,e,i){void 0===i&&(i=!1);var n,s,o=ft(e),r=ft(e)&&function(t){var e=t.getBoundingClientRect(),i=e.width/t.offsetWidth||1,n=e.height/t.offsetHeight||1;return 1!==i||1!==n}(e),a=At(e),l=bt(t,r),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ht(e)||Vt(a))&&(c=(n=e)!==dt(n)&&ft(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Ut(n)),ft(e)?((h=bt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=$t(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}var le={placement:"bottom",modifiers:[],strategy:"absolute"};function ce(){for(var t=arguments.length,e=new Array(t),i=0;iP.on(t,"mouseover",h)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add("show"),this._element.classList.add("show"),P.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(l(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){P.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>P.off(t,"mouseover",h)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),F.removeDataAttribute(this._menu,"popper"),P.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...F.getDataAttributes(this._element),...t},r("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!s(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_createPopper(t){if(void 0===pe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:s(this._config.reference)?e=o(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find(t=>"applyStyles"===t.name&&!1===t.enabled);this._popper=fe(e,this._menu,i),n&&F.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains("show")}_getMenuElement(){return U.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ye;if(t.classList.contains("dropstart"))return we;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?_e:ge:e?ve:be}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=U.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(a);i.length&&b(i,e,"ArrowDown"===t,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Te.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=U.find('[data-bs-toggle="dropdown"]');for(let i=0,n=e.length;ie+t),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),this._setElementAttributes(".sticky-top","marginRight",e=>e-t)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=i(Number.parseFloat(s))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=F.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(F.removeDataAttribute(t,e),t.style[e]=i)})}_applyManipulationCallback(t,e){s(t)?e(t):U.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const Ce={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},ke={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class Le{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&d(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{g(t)})):g(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),g(t)})):g(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...Ce,..."object"==typeof t?t:{}}).rootElement=o(t.rootElement),r("backdrop",t,ke),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),P.on(this._getElement(),"mousedown.bs.backdrop",()=>{g(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(P.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const xe={trapElement:null,autofocus:!0},De={trapElement:"element",autofocus:"boolean"};class Se{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),P.off(document,".bs.focustrap"),P.on(document,"focusin.bs.focustrap",t=>this._handleFocusin(t)),P.on(document,"keydown.tab.bs.focustrap",t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,".bs.focustrap"))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=U.focusableChildren(i);0===n.length?i.focus():"backward"===this._lastTabNavDirection?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?"backward":"forward")}_getConfig(t){return t={...xe,..."object"==typeof t?t:{}},r("focustrap",t,De),t}}const Ne={backdrop:!0,keyboard:!0,focus:!0},Ie={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class Pe extends H{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=U.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new Oe}static get Default(){return Ne}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,"show.bs.modal",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),P.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{P.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(){if(!this._isShown||this._isTransitioning)return;if(P.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove("show"),P.off(this._element,"click.dismiss.bs.modal"),P.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(t=>P.off(t,".bs.modal")),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Le({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_getConfig(t){return t={...Ne,...F.getDataAttributes(this._element),..."object"==typeof t?t:{}},r("modal",t,Ie),t}_showElement(t){const e=this._isAnimated(),i=U.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),e&&d(this._element),this._element.classList.add("show"),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})},this._dialog,e)}_setEscapeEvent(){this._isShown?P.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):P.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?P.on(window,"resize.bs.modal",()=>this._adjustDialog()):P.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){P.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains("modal-static")||(n||(i.overflowY="hidden"),t.add("modal-static"),this._queueCallback(()=>{t.remove("modal-static"),n||this._queueCallback(()=>{i.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!p()||i&&!t&&p())&&(this._element.style.paddingLeft=e+"px"),(i&&!t&&!p()||!i&&t&&p())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Pe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=i(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,"show.bs.modal",t=>{t.defaultPrevented||P.one(e,"hidden.bs.modal",()=>{a(this)&&this.focus()})}),Pe.getOrCreateInstance(e).toggle(this)})),B(Pe),m(Pe);const je={backdrop:!0,keyboard:!0,scroll:!1},Me={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class He extends H{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return je}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new Oe).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{this._config.scroll||this._focustrap.activate(),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new Oe).reset(),P.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...je,...F.getDataAttributes(this._element),..."object"==typeof t?t:{}},r("offcanvas",t,Me),t}_initializeBackDrop(){return new Le({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=He.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=i(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,"hidden.bs.offcanvas",()=>{a(this)&&this.focus()});const n=U.findOne(".offcanvas.show");n&&n!==e&&He.getInstance(n).hide(),He.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",()=>U.find(".offcanvas.show").forEach(t=>He.getOrCreateInstance(t).show())),B(He),m(He);const Be=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Re=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,We=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ze=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Be.has(i)||Boolean(Re.test(t.nodeValue)||We.test(t.nodeValue));const n=e.filter(t=>t instanceof RegExp);for(let t=0,e=n.length;t{ze(t,a)||i.removeAttribute(t.nodeName)})}return n.body.innerHTML}const Fe=new Set(["sanitize","allowList","sanitizeFn"]),Ue={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},$e={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},Ve={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ke={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Xe extends H{constructor(t,e){if(void 0===pe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Ve}static get NAME(){return"tooltip"}static get Event(){return Ke}static get DefaultType(){return Ue}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.Event.SHOW),e=c(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add("fade");const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;M.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),P.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=fe(this._element,n,this._getPopperConfig(r)),n.classList.add("show");const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{P.on(t,"mouseover",h)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,P.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const t=this.getTipElement();if(P.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>P.off(t,"mouseover",h)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove("fade","show"),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".tooltip-inner")}_sanitizeAndSetContent(t,e,i){const n=U.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return s(e)?(e=o(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=qe(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return $e[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)P.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;P.on(this._element,e,this._config.selector,t=>this._enter(t)),P.on(this._element,i,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=F.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Fe.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:o(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),r("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=qe(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){const e=Xe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(Xe);const Ye={...Xe.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Qe={...Xe.DefaultType,content:"(string|element|function)"},Ge={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Ze extends Xe{static get Default(){return Ye}static get NAME(){return"popover"}static get Event(){return Ge}static get DefaultType(){return Qe}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=Ze.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(Ze);const Je={offset:10,method:"auto",target:""},ti={offset:"number",method:"string",target:"(string|element)"},ei=".nav-link, .list-group-item, .dropdown-item";class ii extends H{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,P.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return Je}static get NAME(){return"scrollspy"}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?t:this._config.method,n="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),U.find(ei,this._config.target).map(t=>{const s=e(t),o=s?U.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[F[i](o).top+n,s]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){P.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...Je,...F.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=o(t.target)||document.documentElement,r("scrollspy",t,ti),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`),i=U.findOne(e.join(","),this._config.target);i.classList.add("active"),i.classList.contains("dropdown-item")?U.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add("active"):U.parents(i,".nav, .list-group").forEach(t=>{U.prev(t,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),U.prev(t,".nav-item").forEach(t=>{U.children(t,".nav-link").forEach(t=>t.classList.add("active"))})}),P.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){U.find(ei,this._config.target).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=ii.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",()=>{U.find('[data-bs-spy="scroll"]').forEach(t=>new ii(t))}),m(ii);class ni extends H{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let t;const e=i(this._element),n=this._element.closest(".nav, .list-group");if(n){const e="UL"===n.nodeName||"OL"===n.nodeName?":scope > li > .active":".active";t=U.find(e,n),t=t[t.length-1]}const s=t?P.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(P.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,n);const o=()=>{P.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),P.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?U.children(e,".active"):U.find(":scope > li > .active",e))[0],s=i&&n&&n.classList.contains("fade"),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove("show"),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove("active");const t=U.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d(t),t.classList.contains("fade")&&t.classList.add("show");let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&U.find(".dropdown-toggle",e).forEach(t=>t.classList.add("active")),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=ni.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||ni.getOrCreateInstance(this).show()})),m(ni);const si={animation:"boolean",autohide:"boolean",delay:"number"},oi={animation:!0,autohide:!0,delay:5e3};class ri extends H{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return si}static get Default(){return oi}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),d(this._element),this._element.classList.add("show"),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.add("hide"),this._element.classList.remove("showing"),this._element.classList.remove("show"),P.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...oi,...F.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},r("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),P.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),P.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),P.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ri.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return B(ri),m(ri),{Alert:R,Button:W,Carousel:Z,Collapse:et,Dropdown:Te,Modal:Pe,Offcanvas:He,Popover:Ze,ScrollSpy:ii,Tab:ni,Toast:ri,Tooltip:Xe}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map new file mode 100644 index 0000000..a59a60b --- /dev/null +++ b/docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","[object Object]","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","start","pointerType","touches","clientX","move","end","clearTimeout","itemImg","e","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","bottom","right","basePlacements","variationPlacements","reduce","acc","placement","placements","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","popper","options","strategy","margin","arrow","reference","hasOwnProperty","attribute","requires","getBasePlacement","round","includeScale","scaleX","scaleY","width","offsetWidth","height","x","y","getLayoutRect","clientRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","unsetSides","mapToStyles","_Object$assign2","popperRect","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","data-popper-placement","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","listScrollParents","_element$ownerDocumen","getScrollParent","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","getVariation","computeOffsets","variation","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","referenceElement","clippingClientRect","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","data-popper-reference-hidden","data-popper-escaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","DEFAULT_OPTIONS","modifiers","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","cleanupModifierEffects","merged","visited","result","modifier","dep","depModifier","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","REGEXP_KEYDOWN","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","Popper","_getPopperConfig","isDisplayStatic","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","Offcanvas","visibility","blur","allReadyOpen","uriAttrs","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","attr","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","allowlistKeys","elName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","*","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","getTitle","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","_handlePopperPlacementChange","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","Popover","_getContent","SELECTOR_LINK_ITEMS","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","spy","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n // eslint-disable-next-line unicorn/consistent-destructuring\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.0'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const start = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","import { isHTMLElement } from \"./instanceOf.js\";\nvar round = Math.round;\nexport default function getBoundingClientRect(element, includeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (isHTMLElement(element) && includeScale) {\n // Fallback to 1 in case both values are `0`\n scaleX = rect.width / element.offsetWidth || 1;\n scaleY = rect.height / element.offsetHeight || 1;\n }\n\n return {\n width: round(rect.width / scaleX),\n height: round(rect.height / scaleY),\n top: round(rect.top / scaleY),\n right: round(rect.right / scaleX),\n bottom: round(rect.bottom / scaleY),\n left: round(rect.left / scaleX),\n x: round(rect.left / scaleX),\n y: round(rect.top / scaleY)\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, left, right, bottom } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var referenceElement = state.elements.reference;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(referenceElement);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = rect.width / element.offsetWidth || 1;\n var scaleY = rect.height / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(options) {\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (\n target === document ||\n target === trapElement ||\n trapElement.contains(target)\n ) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attr, allowedAttributeList) => {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attrName)) {\n if (uriAttrs.has(attrName)) {\n return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attrName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const allowlistKeys = Object.keys(allowList)\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (!allowlistKeys.includes(elName)) {\n el.remove()\n\n continue\n }\n\n const attributeList = [].concat(...el.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || [])\n\n attributeList.forEach(attr => {\n if (!allowedAttribute(attr, allowedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '
    ' +\n '
    ' +\n '

    ' +\n '
    ' +\n '
    '\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both