├── .Rbuildignore ├── .bumpversion.cfg ├── .editorconfig ├── .gitattributes ├── .github ├── release-drafter.yml └── workflows │ ├── ci.yml │ ├── create_release.yml │ └── release_main.yml ├── .gitignore ├── .lintr ├── CRAN-SUBMISSION ├── DESCRIPTION ├── LICENSE ├── NAMESPACE ├── R ├── lineup.R └── lineupjs-package.R ├── README.md ├── cran-comments.md ├── examples └── shiny │ └── app.R ├── inst └── htmlwidgets │ ├── lineup.js │ └── lineup.yaml ├── lineupjs.Rproj ├── package-lock.json ├── package.json └── vignettes ├── crosstalk.Rmd └── lineupjs.Rmd /.Rbuildignore: -------------------------------------------------------------------------------- 1 | ^.*\.Rproj$ 2 | ^\.Rproj\.user$ 3 | .editorconfig 4 | examples 5 | package-lock.json 6 | package.json 7 | node_modules 8 | ^_pkgdown\.yml$ 9 | ^pkgdown$ 10 | ^data-raw$ 11 | ^cran-comments.md$ 12 | ^\.github$ 13 | ^\.bumpversion\.cfg$ 14 | ^\.editorconfig$ 15 | ^\.lintr$ 16 | ^docs$ 17 | ^Makefile$ 18 | ^CRAN-SUBMISSION$ 19 | -------------------------------------------------------------------------------- /.bumpversion.cfg: -------------------------------------------------------------------------------- 1 | [bumpversion] 2 | current_version = 4.2.0 3 | commit = False 4 | tag = False 5 | 6 | [bumpversion:file:DESCRIPTION] 7 | [bumpversion:file:inst/htmlwidgets/lineup.yaml] 8 | [bumpversion:file:package.json] 9 | 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # These settings are for any web project 2 | 3 | # Handle line endings automatically for files detected as text 4 | # and leave all files detected as binary untouched. 5 | * text=auto 6 | 7 | # 8 | # The above will handle all files NOT found below 9 | # 10 | 11 | # 12 | ## These files are text and should be normalized (Convert crlf => lf) 13 | # 14 | 15 | # source code 16 | *.php text 17 | *.css text 18 | *.sass text 19 | *.scss text 20 | *.less text 21 | *.styl text 22 | *.js text 23 | *.ts text 24 | *.coffee text 25 | *.json text 26 | *.htm text 27 | *.html text 28 | *.xml text 29 | *.txt text 30 | *.ini text 31 | *.inc text 32 | *.pl text 33 | *.rb text 34 | *.py text 35 | *.scm text 36 | *.sql text 37 | *.sh text eof=LF 38 | *.bat text 39 | 40 | # templates 41 | *.hbt text 42 | *.jade text 43 | *.haml text 44 | *.hbs text 45 | *.dot text 46 | *.tmpl text 47 | *.phtml text 48 | 49 | # server config 50 | .htaccess text 51 | 52 | # git config 53 | .gitattributes text 54 | .gitignore text 55 | 56 | # code analysis config 57 | .jshintrc text 58 | .jscsrc text 59 | .jshintignore text 60 | .csslintrc text 61 | 62 | # misc config 63 | *.yaml text 64 | *.yml text 65 | .editorconfig text 66 | 67 | # build config 68 | *.npmignore text 69 | *.bowerrc text 70 | Dockerfile text eof=LF 71 | 72 | # Heroku 73 | Procfile text 74 | .slugignore text 75 | 76 | # Documentation 77 | *.md text 78 | LICENSE text 79 | AUTHORS text 80 | 81 | 82 | # 83 | ## These files are binary and should be left untouched 84 | # 85 | 86 | # (binary is a macro for -text -diff) 87 | *.png binary 88 | *.jpg binary 89 | *.jpeg binary 90 | *.gif binary 91 | *.ico binary 92 | *.mov binary 93 | *.mp4 binary 94 | *.mp3 binary 95 | *.flv binary 96 | *.fla binary 97 | *.swf binary 98 | *.gz binary 99 | *.zip binary 100 | *.7z binary 101 | *.ttf binary 102 | *.pyc binary 103 | *.pdf binary 104 | 105 | # Source files 106 | # ============ 107 | *.pxd text 108 | *.py text 109 | *.py3 text 110 | *.pyw text 111 | *.pyx text 112 | *.sh text eol=lf 113 | *.json text 114 | 115 | # Binary files 116 | # ============ 117 | *.db binary 118 | *.p binary 119 | *.pkl binary 120 | *.pyc binary 121 | *.pyd binary 122 | *.pyo binary 123 | 124 | # Note: .db, .p, and .pkl files are associated 125 | # with the python modules ``pickle``, ``dbm.*``, 126 | # ``shelve``, ``marshal``, ``anydbm``, & ``bsddb`` 127 | # (among others). 128 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name-template: "v$RESOLVED_VERSION" 2 | tag-template: "v$RESOLVED_VERSION" 3 | categories: 4 | - title: "📚 Content Changes" 5 | labels: 6 | - "blog" 7 | - "content" 8 | - title: "🚀 Features" 9 | labels: 10 | - "enhancement" 11 | - "feature" 12 | - title: "🐛 Bugs Fixes" 13 | labels: 14 | - "bug" 15 | - title: "📕 Documentation" 16 | labels: 17 | - "documentation" 18 | - title: "🧰 Development" 19 | labels: 20 | - "chore" 21 | - "documentation" 22 | - "dependencies" 23 | change-template: "- #$NUMBER $TITLE" 24 | change-title-escapes: '\<*_&`#@' 25 | template: | 26 | $CHANGES 27 | 28 | Thanks to $CONTRIBUTORS 29 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-20.04 8 | env: 9 | R_REMOTES_NO_ERRORS_FROM_WARNINGS: true 10 | RSPM: https://packagemanager.rstudio.com/cran/__linux__/focal/latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v3 14 | - uses: r-lib/actions/setup-r@v1 15 | with: 16 | r-version: 4.2 17 | - uses: r-lib/actions/setup-pandoc@v1 18 | - name: Cache R packages 19 | uses: actions/cache@v2 20 | with: 21 | path: ${{ env.R_LIBS_USER }} 22 | key: ${{ runner.os }}-r-v1-${{ hashFiles('DESCRIPTION')}} 23 | restore-keys: ${{ runner.os }}-r-v1- 24 | 25 | # - name: Install system dependencies 26 | # env: 27 | # RHUB_PLATFORM: linux-x86_64-ubuntu-gcc 28 | # run: | 29 | # Rscript -e "remotes::install_github('r-hub/sysreqs')" 30 | # sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") 31 | # sudo -s eval "$sysreqs" 32 | 33 | - name: Install dependencies 34 | shell: Rscript {0} 35 | run: | 36 | install.packages(c('devtools', 'pkgdown', 'webshot', 'textshaping', 'styler', 'lintr')) 37 | devtools::install_deps(dependencies = TRUE) 38 | 39 | - name: Install LineUp 40 | run: npm install 41 | 42 | - name: Style / Format 43 | shell: Rscript {0} 44 | run: styler::style_dir(filetype=c('R', 'Rmd'), dry="fail") 45 | 46 | - name: Build Package 47 | shell: Rscript {0} 48 | run: | 49 | devtools::document() 50 | devtools::build() 51 | 52 | - name: Lint 53 | shell: Rscript {0} 54 | run: | 55 | devtools::load_all() 56 | lintr::lint_package('.') 57 | 58 | - name: Check 59 | env: 60 | _R_CHECK_CRAN_INCOMING_REMOTE_: false 61 | shell: Rscript {0} 62 | run: devtools::check(args = c("--no-manual", "--as-cran"), error_on = "error", check_dir = "check") 63 | 64 | - name: Upload check results 65 | if: failure() 66 | uses: actions/upload-artifact@master 67 | with: 68 | name: ${{ runner.os }}-results 69 | path: r_package/check 70 | 71 | - name: Test 72 | shell: Rscript {0} 73 | run: devtools::test() 74 | -------------------------------------------------------------------------------- /.github/workflows/create_release.yml: -------------------------------------------------------------------------------- 1 | name: Create Release 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | versionName: 7 | description: 'Semantic Version Number (i.e., 5.5.0 or patch, minor, major, prepatch, preminor, premajor, prerelease)' 8 | required: true 9 | default: patch 10 | preid: 11 | description: 'Pre Release Identifier (i.e., alpha, beta)' 12 | required: true 13 | default: alpha 14 | 15 | jobs: 16 | create_release: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: Check out code 20 | uses: actions/checkout@v3 21 | with: 22 | ref: main 23 | ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} 24 | - name: Reset main branch 25 | run: | 26 | git fetch origin develop:develop 27 | git reset --hard develop 28 | - name: Change version number 29 | id: version 30 | run: | 31 | echo -n "::set-output name=next_tag::" 32 | npm version --no-git-tag-version ${{ github.event.inputs.versionName }} --preid ${{ github.event.inputs.preid }} 33 | - name: Create pull request into main 34 | uses: peter-evans/create-pull-request@v4 35 | with: 36 | branch: release/${{ steps.version.outputs.next_tag }} 37 | commit-message: 'chore: release ${{ steps.version.outputs.next_tag }}' 38 | base: main 39 | title: Release ${{ steps.version.outputs.next_tag }} 40 | labels: chore 41 | reviewers: sgratzl 42 | assignees: sgratzl 43 | body: | 44 | Releasing ${{ steps.version.outputs.next_tag }}. 45 | -------------------------------------------------------------------------------- /.github/workflows/release_main.yml: -------------------------------------------------------------------------------- 1 | name: Release Main 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | correct_repository: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: fail on fork 13 | if: github.repository_owner != 'lineupjs' 14 | run: exit 1 15 | 16 | create_release: 17 | needs: correct_repository 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Check out code 21 | uses: actions/checkout@v3 22 | - uses: actions/setup-node@v3 23 | with: 24 | node-version: 16 25 | - name: Extract version 26 | id: extract_version 27 | run: | 28 | node -pe "'::set-output name=version::' + require('./package.json').version" 29 | node -pe "'::set-output name=npm_tag::' + (require('./package.json').version.includes('-') ? 'next' : 'latest')" 30 | - name: Print version 31 | run: | 32 | echo "releasing ${{ steps.extract_version.outputs.version }} with tag ${{ steps.extract_version.outputs.npm_tag }}" 33 | - name: Create Release 34 | id: create_release 35 | uses: release-drafter/release-drafter@v5 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.PRIVATE_GITHUB_TOKEN }} 38 | with: 39 | name: v${{ steps.extract_version.outputs.version }} 40 | tag: v${{ steps.extract_version.outputs.version }} 41 | version: ${{ steps.extract_version.outputs.version }} 42 | prerelease: ${{ needs.create_release.outputs.tag_name == 'next' }} 43 | publish: true 44 | outputs: 45 | version: ${{ steps.extract_version.outputs.version }} 46 | npm_tag: ${{ steps.extract_version.outputs.npm_tag }} 47 | upload_url: ${{ steps.create_release.outputs.upload_url }} 48 | tag_name: ${{ steps.create_release.outputs.tag_name }} 49 | 50 | release_package: 51 | needs: create_release 52 | runs-on: ubuntu-latest 53 | steps: 54 | - name: Check out code 55 | uses: actions/checkout@v2 56 | # TODO 57 | 58 | sync_dev: 59 | needs: correct_repository 60 | runs-on: ubuntu-latest 61 | steps: 62 | - name: Check out code 63 | uses: actions/checkout@v3 64 | with: 65 | ref: develop 66 | ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} 67 | - name: Reset dev branch 68 | run: | 69 | git fetch origin main:main 70 | git merge main 71 | git push 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .Rproj.user 3 | .Rhistory 4 | .RData 5 | .Ruserdata 6 | docs 7 | inst/htmlwidgets/dist 8 | /man 9 | /NAMESPACE 10 | /check 11 | /vignettes/*.R 12 | /check -------------------------------------------------------------------------------- /.lintr: -------------------------------------------------------------------------------- 1 | linters: linters_with_defaults( 2 | line_length_linter(200), 3 | cyclocomp_linter = NULL, 4 | commented_code_linter = NULL, 5 | object_name_linter('camelCase') 6 | ) 7 | -------------------------------------------------------------------------------- /CRAN-SUBMISSION: -------------------------------------------------------------------------------- 1 | Version: 4.6.0 2 | Date: 2022-08-12 00:38:58 UTC 3 | SHA: 1fec4f1a3a68b4b88da3b637ebaaf62b30d9b5da 4 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: lineupjs 2 | Type: Package 3 | Title: 'HTMLWidget' Wrapper of 'LineUp' for Visual Analysis of Multi-Attribute Rankings 4 | Description: 'LineUp' is an interactive technique designed to create, visualize and explore rankings of items based on a set of heterogeneous attributes. 5 | This is a 'htmlwidget' wrapper around the JavaScript library 'LineUp.js'. 6 | It is designed to be used in 'R Shiny' apps and 'R Markddown' files. 7 | Due to an outdated 'webkit' version of 'RStudio' it won't work in the integrated viewer. 8 | Version: 4.6.0 9 | Date: 2022-08-10 10 | Authors@R: person("Samuel", "Gratzl", email = "sam@sgratzl.com", role = c("aut", "cre")) 11 | Maintainer: Samuel Gratzl 12 | URL: https://github.com/lineupjs/lineup_htmlwidget/ 13 | BugReports: https://github.com/lineupjs/lineup_htmlwidget/issues 14 | Depends: R (>= 3.5.0) 15 | License: MIT + file LICENSE 16 | Encoding: UTF-8 17 | Roxygen: list(markdown = TRUE) 18 | Imports: 19 | htmlwidgets 20 | Suggests: 21 | crosstalk, 22 | knitr, 23 | rmarkdown, 24 | testthat, 25 | lintr, 26 | remotes, 27 | styler, 28 | shiny 29 | RoxygenNote: 7.2.0 30 | VignetteBuilder: knitr 31 | Language: en-US 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | YEAR: 2018 2 | COPYRIGHT HOLDER: Samuel Gratzl -------------------------------------------------------------------------------- /NAMESPACE: -------------------------------------------------------------------------------- 1 | # Generated by roxygen2: do not edit by hand 2 | 3 | export(buildLineUp) 4 | export(buildTaggle) 5 | export(lineup) 6 | export(lineupBuilder) 7 | export(lineupOutput) 8 | export(lineupRanking) 9 | export(renderLineup) 10 | export(renderTaggle) 11 | export(taggle) 12 | export(taggleOutput) 13 | -------------------------------------------------------------------------------- /R/lineup.R: -------------------------------------------------------------------------------- 1 | 2 | .lineupDefaultOptions <- list( 3 | filterGlobally = TRUE, 4 | singleSelection = FALSE, 5 | animated = TRUE, 6 | sidePanel = "collapsed", 7 | hierarchyIndicator = TRUE, 8 | labelRotation = 0, 9 | rowHeight = 18, 10 | rowPadding = 2, 11 | groupHeight = 40, 12 | groupPadding = 5, 13 | summaryHeader = TRUE, 14 | overviewMode = FALSE, 15 | expandLineOnHover = FALSE, 16 | defaultSlopeGraphMode = "item", 17 | ignoreUnsupportedBrowser = FALSE 18 | ) 19 | 20 | #' lineup builder pattern function 21 | #' 22 | #' @param data data frame like object i.e. also crosstalk shared data frame 23 | #' @param options LineUp options 24 | #' @param ranking ranking definition created using \code{\link{lineupRanking}} 25 | #' @param ... additional ranking definitions like 'ranking1=...' due to restrictions in converting parameters 26 | #' 27 | #' @section LineUp options: 28 | #' \describe{ 29 | #' \item{filterGlobally}{whether filter within one ranking applies to all rankings (default: TRUE)} 30 | #' \item{singleSelection}{restrict to single item selection (default: FALSE} 31 | #' \item{noCriteriaLimits}{allow more than one sort and grouping criteria (default: FALSE)} 32 | #' \item{animated}{use animated transitions (default: TRUE)} 33 | #' \item{sidePanel}{show side panel (TRUE, FALSE, 'collapsed') (default: 'collapsed')} 34 | #' \item{hierarchyIndicator}{show sorting and grouping hierarchy indicator (TRUE, FALSE) (default: TRUE)} 35 | #' \item{labelRotation}{how many degrees should a label be rotated in case of narrow columns (default: 0)} 36 | #' \item{summaryHeader}{show summary histograms in the header (default: TRUE)} 37 | #' \item{overviewMode}{show overview mode in Taggle by default (default: FALSE)} 38 | #' \item{expandLineOnHover}{expand to full row height on mouse over (default: FALSE)} 39 | #' \item{defaultSlopeGraphMode}{default slope graph mode: item,band (default: 'item')} 40 | #' \item{ignoreUnsupportedBrowser}{ignore unsupported browser detection at own risk (default: FALSE)} 41 | #' \item{rowHeight}{height of a row in pixel (default: 18)} 42 | #' \item{rowPadding}{padding between two rows in pixel (default: 2)} 43 | #' \item{groupHeight}{height of an aggregated group in pixel (default: 40)} 44 | #' \item{groupPadding}{padding between two groups in pixel (default: 5)} 45 | #' } 46 | #' 47 | #' @return lineup builder object 48 | #' 49 | #' @examples 50 | #' \dontrun{ 51 | #' lineupBuilder(iris) |> buildLineUp() 52 | #' } 53 | #' 54 | #' @export 55 | lineupBuilder <- function(data, 56 | options = c(.lineupDefaultOptions), 57 | ranking = NULL, 58 | ...) { 59 | # extend with all the default options 60 | options <- c(options, .lineupDefaultOptions[!(names(.lineupDefaultOptions) %in% names(options))]) 61 | 62 | if (requireNamespace("crosstalk") && crosstalk::is.SharedData(data)) { 63 | # using Crosstalk 64 | key <- data$key() 65 | group <- data$groupName() 66 | data <- data$origData() 67 | } else { 68 | # Not using Crosstalk 69 | key <- NULL 70 | group <- NULL 71 | } 72 | 73 | # escape remove . 74 | colnames(data) <- gsub("[.]", "_", colnames(data)) 75 | 76 | toDescription <- function(col, colname) { 77 | clazz <- class(col) 78 | if (clazz == "numeric") { 79 | list( 80 | type = "number", 81 | column = colname, 82 | domain = c(min(col, na.rm = TRUE), max(col, na.rm = TRUE)) 83 | ) 84 | } else if (clazz == "factor") { 85 | list( 86 | type = "categorical", 87 | column = colname, 88 | categories = levels(col) 89 | ) 90 | } else if (clazz == "logical") { 91 | list(type = "boolean", column = colname) 92 | } else { 93 | list(type = "string", column = colname) 94 | } 95 | } 96 | # convert columns 97 | cols <- mapply(toDescription, data, colnames(data), SIMPLIFY = FALSE) 98 | # insert id column 99 | cols[["rowname"]] <- list(type = "string", column = "rowname", frozen = TRUE) 100 | 101 | # forward options using x 102 | structure(list( 103 | data = cbind(rowname = rownames(data), data), 104 | colnames = c("rowname", colnames(data)), 105 | cols = cols, 106 | crosstalk = list(key = key, group = group), 107 | options = options, 108 | rankings = list(ranking = ranking, ...) 109 | ), class = "LineUpBuilder") 110 | } 111 | 112 | .buildLineUpWidget <- function(x, width, height, elementId, dependencies, lineupType) { 113 | # create widget 114 | htmlwidgets::createWidget( 115 | name = lineupType, 116 | x, 117 | width = width, 118 | height = height, 119 | package = "lineupjs", 120 | elementId = elementId, 121 | dependencies = dependencies 122 | ) 123 | } 124 | 125 | .crosstalkLineUpLibs <- function() { 126 | if (requireNamespace("crosstalk")) { 127 | crosstalk::crosstalkLibs() 128 | } else { 129 | c() 130 | } 131 | } 132 | 133 | #' factory for LineUp HTMLWidget based on a LineUpBuilder 134 | #' 135 | #' @param x LineUpBuilder object 136 | #' @param width width of the element 137 | #' @param height height of the element 138 | #' @param elementId unique element id 139 | #' @param dependencies include crosstalk dependencies 140 | #' 141 | #' @return lineup html widget 142 | #' 143 | #' @examples 144 | #' \dontrun{ 145 | #' lineupBuilder(iris) |> buildLineUp() 146 | #' } 147 | #' @export 148 | buildLineUp <- function(x, width = "100%", 149 | height = NULL, 150 | elementId = NULL, 151 | dependencies = .crosstalkLineUpLibs()) { 152 | .buildLineUpWidget(x, width, height, elementId, dependencies, lineupType = "lineup") 153 | } 154 | 155 | #' factory for LineUp HTMLWidget based on a LineUpBuilder 156 | #' @inheritParams buildLineUp 157 | #' 158 | #' @return taggle html widget 159 | #' 160 | #' @examples 161 | #' \dontrun{ 162 | #' lineupBuilder(iris) |> buildTaggle() 163 | #' } 164 | #' @export 165 | buildTaggle <- function(x, width = "100%", 166 | height = NULL, 167 | elementId = NULL, 168 | dependencies = .crosstalkLineUpLibs()) { 169 | .buildLineUpWidget(x, width, height, elementId, dependencies, lineupType = "taggle") 170 | } 171 | 172 | 173 | #' lineup - factory for LineUp HTMLWidget 174 | #' 175 | #' @inheritParams lineupBuilder 176 | #' @param width width of the element 177 | #' @param height height of the element 178 | #' @param elementId unique element id 179 | #' @param dependencies include crosstalk dependencies 180 | #' @param ... additional ranking definitions like 'ranking1=...' due to restrictions in converting parameters 181 | #' 182 | #' @inheritSection lineupBuilder LineUp options 183 | #' @return lineup html widget 184 | #' 185 | #' @examples 186 | #' \dontrun{ 187 | #' lineup(iris) 188 | #' } 189 | #' 190 | #' @export 191 | lineup <- function(data, 192 | width = "100%", 193 | height = NULL, 194 | elementId = NULL, 195 | options = c(.lineupDefaultOptions), 196 | ranking = NULL, 197 | dependencies = .crosstalkLineUpLibs(), 198 | ...) { 199 | x <- lineupBuilder(data, options, ranking, ...) 200 | buildLineUp(x, width, height, elementId, dependencies) 201 | } 202 | 203 | 204 | #' taggle - factory for Taggle HTMLWidget 205 | #' 206 | #' @inheritParams lineup 207 | #' @param ... additional ranking definitions like 'ranking1=...' due to restrictions in converting parameters 208 | #' @inheritSection lineup LineUp options 209 | #' 210 | #' @return taggle html widget 211 | #' 212 | #' @examples 213 | #' \dontrun{ 214 | #' taggle(iris) 215 | #' } 216 | #' 217 | #' @export 218 | taggle <- function(data, 219 | width = "100%", 220 | height = NULL, 221 | elementId = NULL, 222 | options = c(.lineupDefaultOptions), 223 | ranking = NULL, 224 | dependencies = .crosstalkLineUpLibs(), 225 | ...) { 226 | x <- lineupBuilder(data, options, ranking, ...) 227 | buildTaggle(x, width, height, elementId, dependencies) 228 | } 229 | 230 | #' helper function for creating a LineUp ranking definition as used by \code{\link{lineup}} 231 | #' 232 | #' @param columns list of columns shown in this ranking, besides \emph{column names of the given data frame} following special columns are available 233 | #' @param sortBy list of columns to sort this ranking by, grammar: \code{"[:desc]"} 234 | #' @param groupBy list of columns to group this ranking by 235 | #' @param ... additional ranking combination definitions as lists (\code{list(type = 'min', columns = c('a', 'b'), label = NULL)}), possible types 236 | #' @return a configured lineup ranking config 237 | #' 238 | #' @section Special columns: 239 | #' 240 | #' \describe{ 241 | #' \item{'* '}{include all data frame columns} 242 | #' \item{'_* '}{add multiple support columns (_aggregate, _rank, _selection)} 243 | #' \item{'_aggregate'}{add a column for collapsing groups} 244 | #' \item{'_rank'}{add a column for showing the rank of the item} 245 | #' \item{'_selection'}{add a column with checkboxes for selecting items} 246 | #' \item{'_group'}{add a column showing the current grouping title} 247 | #' \item{'$data.frame column$'}{add the specific column} 248 | #' \item{'$def column$'}{add defined column given as additional parameter to this function, see below} 249 | #' } 250 | #' 251 | #' @section Ranking definition types: 252 | #' \describe{ 253 | #' \item{weightedSum}{a weighted sum of multiple numeric columns, extras \code{list(weights = c(0.4, 0.6))}} 254 | #' \item{min}{minimum of multiple numeric columns} 255 | #' \item{max}{maximum of multiple numeric columns} 256 | #' \item{mean}{mean of multiple numeric columns} 257 | #' \item{median}{median of multiple numeric columns} 258 | #' \item{nested}{group multiple columns} 259 | #' \item{script}{scripted (JS code) combination of multiple numeric columns, extras \code{list(code = '...')}} 260 | #' \item{impose}{color a numerical column (column) with the color of a categorical column (categoricalColumn), changed \code{list(column = 'a', categoricalColumn = 'b')}} 261 | #' } 262 | #' 263 | #' @examples 264 | #' lineupRanking(columns = c("*")) 265 | #' lineupRanking(columns = c("*"), sortBy = c("hp")) 266 | #' lineupRanking( 267 | #' columns = c("*", "sum"), 268 | #' sum = list(type = "weightedSum", columns = c("hp", "wt"), weights = c(0.7, 0.3)) 269 | #' ) 270 | #' @export 271 | lineupRanking <- function(columns = c("_*", "*"), 272 | sortBy = c(), 273 | groupBy = c(), 274 | ...) { 275 | list( 276 | columns = columns, 277 | sortBy = sortBy, 278 | groupBy = groupBy, 279 | defs = list(...) 280 | ) 281 | } 282 | 283 | #' Shiny bindings for lineup 284 | #' 285 | #' Output and render functions for using lineup within Shiny 286 | #' applications and interactive Rmd documents. 287 | #' 288 | #' @param outputId output variable to read from 289 | #' @param width,height Must be a valid CSS unit (like \code{'100\%'}, 290 | #' \code{'800px'}, \code{'auto'}) or a number, which will be coerced to a 291 | #' string and have \code{'px'} appended. 292 | #' @rdname lineup-shiny 293 | #' @return An output or render function that enables the use of the widget within Shiny applications. 294 | #' @examples # !formatR 295 | #' library(shiny) 296 | #' app <- shinyApp( 297 | #' ui = fluidPage(lineupOutput("lineup")), 298 | #' server = function(input, output) { 299 | #' lineup <- lineupBuilder(iris) |> buildLineUp() 300 | #' output$lineup <- renderLineup(lineup) 301 | #' } 302 | #' ) 303 | #' 304 | #' \donttest{ 305 | #' if (interactive()) app 306 | #' } 307 | #' @export 308 | lineupOutput <- function(outputId, 309 | width = "100%", 310 | height = "800px") { 311 | htmlwidgets::shinyWidgetOutput(outputId, "lineup", width, height, package = "lineupjs") 312 | } 313 | 314 | #' Shiny render bindings for lineup 315 | #' 316 | #' @param expr An expression that generates a taggle 317 | #' @param env The environment in which to evaluate \code{expr}. 318 | #' @param quoted Is \code{expr} a quoted expression (with \code{quote()})? This 319 | #' is useful if you want to save an expression in a variable. 320 | #' @rdname lineup-shiny 321 | #' @export 322 | renderLineup <- function(expr, 323 | env = parent.frame(), 324 | quoted = FALSE) { 325 | if (!quoted) { 326 | expr <- substitute(expr) 327 | } # force quoted 328 | htmlwidgets::shinyRenderWidget(expr, lineupOutput, env, quoted = TRUE) 329 | } 330 | 331 | #' Shiny bindings for taggle 332 | #' 333 | #' Output and render functions for using taggle within Shiny 334 | #' applications and interactive Rmd documents. 335 | #' 336 | #' @inheritParams lineupOutput 337 | #' @rdname taggle-shiny 338 | #' @return An output or render function that enables the use of the widget within Shiny applications. 339 | #' @examples # !formatR 340 | #' library(shiny) 341 | #' app <- shinyApp( 342 | #' ui = fluidPage(taggleOutput("taggle")), 343 | #' server = function(input, output) { 344 | #' taggle <- lineupBuilder(iris) |> buildTaggle() 345 | #' output$taggle <- renderTaggle(taggle) 346 | #' } 347 | #' ) 348 | #' 349 | #' \donttest{ 350 | #' if (interactive()) app 351 | #' } 352 | #' @export 353 | taggleOutput <- function(outputId, 354 | width = "100%", 355 | height = "800px") { 356 | htmlwidgets::shinyWidgetOutput(outputId, "taggle", width, height, package = "lineupjs") 357 | } 358 | 359 | #' Shiny render bindings for taggle 360 | #' 361 | #' @inheritParams renderLineup 362 | #' @rdname taggle-shiny 363 | #' 364 | #' @export 365 | renderTaggle <- function(expr, 366 | env = parent.frame(), 367 | quoted = FALSE) { 368 | if (!quoted) { 369 | expr <- substitute(expr) 370 | } # force quoted 371 | htmlwidgets::shinyRenderWidget(expr, taggleOutput, env, quoted = TRUE) 372 | } 373 | -------------------------------------------------------------------------------- /R/lineupjs-package.R: -------------------------------------------------------------------------------- 1 | #' LineUpjs module 2 | #' 3 | #' a htmlwidget wrapper around LineUpJS (\url{https://lineup.js.org}) 4 | #' 5 | #' @docType package 6 | #' @name lineupjs 7 | NULL 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | LineUp.js as HTMLWidget 2 | ======================= 3 | 4 | [![License: MIT][mit-image]][mit-url] [![Github Actions][github-actions-image]][github-actions-url] 5 | 6 | LineUp is an interactive technique designed to create, visualize and explore rankings of items based on a set of heterogeneous attributes. 7 | This is a [HTMLWidget](http://www.htmlwidgets.org/) wrapper around the JavaScript library [LineUp.js](https://github.com/lineupjs/lineupjs). Details about the LineUp visualization technique can be found at [ https://jku-vds-lab.at/tools/lineup/](https://jku-vds-lab.at/tools/lineup/). 8 | 9 | It can be used within standalone [R Shiny](https://shiny.rstudio.com/) apps or [R Markdown](https://rmarkdown.rstudio.com/) files. 10 | [Crosstalk](https://rstudio.github.io/crosstalk/) is supported for synching selections and filtering among widgets. 11 | 12 | Installation 13 | ------------ 14 | 15 | ```R 16 | install.packages('lineupjs') 17 | library(lineupjs) 18 | ``` 19 | 20 | Examples 21 | -------- 22 | 23 | ```R 24 | lineup(mtcars) 25 | ``` 26 | 27 | ```R 28 | lineup(iris) 29 | ``` 30 | 31 | ![iris output](https://user-images.githubusercontent.com/4129778/34919941-fec50232-f96a-11e7-95be-9eefb213e3d6.png) 32 | 33 | 34 | Advanced Example 35 | ---------------- 36 | 37 | ```R 38 | lineup(iris, 39 | ranking=lineupRanking(columns=c('_*', '*', 'impose'), 40 | sortBy=c('Sepal_Length:desc'), groupBy=c('Species'), 41 | impose=list(type='impose', column='Sepal_Length', categoricalColumn='Species'))) 42 | ``` 43 | 44 | ![iris advanced output](https://user-images.githubusercontent.com/4129778/48187839-898c0d00-e33c-11e8-9d4a-360bc35741f4.png) 45 | 46 | 47 | Crosstalk Example 48 | ------------- 49 | 50 | ```R 51 | devtools::install_github("jcheng5/d3scatter") 52 | library(d3scatter) 53 | library(crosstalk) 54 | 55 | shared_iris = SharedData$new(iris) 56 | 57 | d3scatter(shared_iris, ~Petal.Length, ~Petal.Width, ~Species, width="100%") 58 | ``` 59 | 60 | ```R 61 | lineup(shared_iris, width="100%") 62 | ``` 63 | 64 | ![crosstalk output](https://user-images.githubusercontent.com/4129778/34919938-fb7166de-f96a-11e7-8ea1-443e0923b160.png) 65 | 66 | 67 | 68 | Shiny Example 69 | ------------- 70 | ```R 71 | library(shiny) 72 | library(crosstalk) 73 | library(lineupjs) 74 | library(d3scatter) 75 | 76 | # Define UI for application that draws a histogram 77 | ui <- fluidPage( 78 | titlePanel("LineUp Shiny Example"), 79 | 80 | fluidRow( 81 | column(5, d3scatterOutput("scatter1")), 82 | column(7, lineupOutput("lineup1")) 83 | ) 84 | ) 85 | 86 | # Define server logic required to draw a histogram 87 | server <- function(input, output) { 88 | shared_iris <- SharedData$new(iris) 89 | 90 | output$scatter1 <- renderD3scatter({ 91 | d3scatter(shared_iris, ~Petal.Length, ~Petal.Width, ~Species, width = "100%") 92 | }) 93 | 94 | output$lineup1 <- renderLineup({ 95 | lineup(shared_iris, width = "100%") 96 | }) 97 | } 98 | 99 | # Run the application 100 | shinyApp(ui = ui, server = server) 101 | ``` 102 | 103 | Hint: 104 | 105 | In case you see scrollbars in each cell it is because of the font the cells are too narrow, you can specify a larger row height using 106 | 107 | ```R 108 | lineup(iris, options=list(rowHeight=20)) 109 | ``` 110 | 111 | Authors 112 | ------- 113 | 114 | * Samuel Gratzl (@sgratzl) 115 | * Datavisyn GmbH (@datavisyn) 116 | 117 | 118 | [mit-image]: https://img.shields.io/badge/License-MIT-yellow.svg 119 | [mit-url]: https://opensource.org/licenses/MIT 120 | [github-actions-image]: https://github.com/lineupjs/lineup_htmlwidget/workflows/ci/badge.svg 121 | [github-actions-url]: https://github.com/lineupjs/lineup_htmlwidget/actions 122 | -------------------------------------------------------------------------------- /cran-comments.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lineupjs/lineup_htmlwidget/0faade2a28a9b378b7693775d4d2622cfeb87ead/cran-comments.md -------------------------------------------------------------------------------- /examples/shiny/app.R: -------------------------------------------------------------------------------- 1 | # 2 | # This is a Shiny web application. You can run the application by clicking 3 | # the 'Run App' button above. 4 | # 5 | # Find out more about building applications with Shiny here: 6 | # 7 | # http://shiny.rstudio.com/ 8 | # 9 | 10 | library(shiny) 11 | library(crosstalk) 12 | library(lineupjs) 13 | library(magrittr) 14 | 15 | # Define UI for application that draws a histogram 16 | ui <- fluidPage( 17 | titlePanel("LineUp Shiny Example"), 18 | fluidRow( 19 | column(7, lineupOutput("lineup1")) 20 | ) 21 | ) 22 | 23 | # Define server logic required to draw a histogram 24 | server <- function(input, output) { 25 | shared_iris <- SharedData$new(iris) 26 | 27 | 28 | output$lineup1 <- renderLineup({ 29 | # lineupBuilder(shared_iris) %>% buildLineUp(width = "100%") 30 | lineup(shared_iris, width = "100%") 31 | }) 32 | } 33 | 34 | # Run the application 35 | shinyApp(ui = ui, server = server) 36 | -------------------------------------------------------------------------------- /inst/htmlwidgets/lineup.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | function assign(target, source1, source2) { 3 | for (var key in source1) { 4 | target[key] = source1[key]; 5 | } 6 | if (source2) { 7 | return assign(target, source2); 8 | } 9 | return target; 10 | } 11 | 12 | const lineup = { 13 | name: 'lineup', 14 | type: 'output', 15 | 16 | crossTalk: function(data) { 17 | const key2index = new Map(); 18 | const index2key = new Map(); 19 | 20 | const selectionHandle = new crosstalk.SelectionHandle(); 21 | selectionHandle.on('change', function (e) { 22 | if (e.sender === selectionHandle) { 23 | return; // ignore self 24 | } 25 | if (!e.value) { 26 | data.clearSelection(); 27 | return; 28 | } 29 | const indices = []; 30 | e.value.forEach(function(key) { 31 | if (key2index.has(key)) { 32 | indices.push(key2index.get(key)); 33 | } 34 | }); 35 | data.setSelection(indices); 36 | }); 37 | 38 | const arrayEquals = function(a, b) { 39 | if (a.length !== b.length) { 40 | return false; 41 | } 42 | return a.every(function(ai, i) { 43 | return ai === b[i]; 44 | }); 45 | }; 46 | 47 | data.on('selectionChanged.crosstalk', function(indices) { 48 | const keys = indices.map(function(index) { 49 | return index2key.get(index); 50 | }).sort(); 51 | const old = (selectionHandle.value || []).sort(); 52 | if (arrayEquals(keys, old)) { 53 | return; 54 | } 55 | if (keys.length === 0) { 56 | selectionHandle.clear(); 57 | } else { 58 | selectionHandle.set(keys); 59 | } 60 | }); 61 | 62 | const filterHandle = new crosstalk.FilterHandle(); 63 | filterHandle.on('change', function (e) { 64 | if (e.sender === filterHandle) { 65 | return; 66 | } 67 | if (!e.value) { 68 | data.setFilter(null); 69 | } else { 70 | const included = new Set(e.value.map(function(d) { 71 | return key2index.get(d); 72 | })); 73 | data.setFilter(function(d) { 74 | return included.has(d.i); 75 | }); 76 | } 77 | }); 78 | data.on('orderChanged.crosstalk', function(_oldOrder, newOrder) { 79 | const keys = newOrder.length === data.getTotalNumberOfRows() ? [] : newOrder.map(function(d) { 80 | return index2key.get(d); 81 | }).sort(); 82 | const old = (filterHandle.filteredKeys || []).sort(); 83 | if (arrayEquals(keys, old)) { 84 | return; 85 | } 86 | if (keys.length === 0) { 87 | // all visible 88 | filterHandle.clear(); 89 | } else { 90 | filterHandle.set(keys); 91 | } 92 | }); 93 | 94 | return function(group, key) { 95 | selectionHandle.setGroup(group); 96 | filterHandle.setGroup(group); 97 | key2index.clear(); 98 | index2key.clear(); 99 | 100 | key.forEach(function(k, i) { 101 | key2index.set(k, i); 102 | index2key.set(i, k); 103 | }); 104 | }; 105 | }, 106 | 107 | toCols: function(names, descs) { 108 | const cols = names.map(function(d) { 109 | const desc = descs[d]; 110 | // R Shiny transform 1 element arrays to primitive values 111 | if (desc.type === 'categorical' && typeof desc.categories === 'string') { 112 | desc.categories = [desc.categories]; 113 | } 114 | return desc; 115 | }); 116 | LineUpJS.deriveColors(cols); 117 | return cols; 118 | }, 119 | 120 | pushRanking: function(data, ranking) { 121 | const r = LineUpJS.buildRanking(); 122 | const asArray = function(v) { 123 | return Array.isArray(v) ? v : (v ? [v] : []); 124 | }; 125 | const defs = ranking.defs; 126 | asArray(ranking.columns).forEach(function(col) { 127 | if (defs.hasOwnProperty(col)) { 128 | r.column(defs[col]); 129 | } else { 130 | r.column(col); 131 | } 132 | }); 133 | asArray(ranking.sortBy).forEach(function(s) { 134 | return r.sortBy(s); 135 | }); 136 | asArray(ranking.groupBy).forEach(function(s) { 137 | return r.groupBy(s); 138 | }); 139 | return r.build(data); 140 | }, 141 | 142 | factory: function(el, width, height) { 143 | const that = this; 144 | el.style.width = width; 145 | el.style.height = height; 146 | el.style.position = 'relative'; 147 | el.style.overflow = 'auto'; 148 | el.style.lineHeight = 'normal'; // for bootstrap 149 | 150 | const unsupportedBrowser = !window.LineUpJS || (LineUpJS.isBrowserSupported === 'function' && !LineUpJS.isBrowserSupported()); 151 | 152 | if (unsupportedBrowser) { 153 | el.classList.add('lu-unsupported-browser'); 154 | el.innerHTML = 'unsupported browser detected' + 155 | '
' + 156 | '' + 157 | '' + 158 | '' + 159 | '
use the ignoreUnsupportedBrowser=true option to ignore this error at your own risk'; 160 | } 161 | 162 | 163 | var data = null; 164 | var lineup = null; 165 | var crossTalk = null; 166 | 167 | return { 168 | renderValue: function(x) { 169 | if (unsupportedBrowser) { 170 | return; 171 | } 172 | const rows = HTMLWidgets.dataframeToD3(x.data); 173 | 174 | // update data 175 | if (!data) { 176 | data = new LineUpJS.LocalDataProvider(rows, that.toCols(x.colnames, x.cols), { 177 | filterGlobally: x.options.filterGlobally, 178 | multiSelection: !x.options.singleSelection, 179 | }); 180 | } else { 181 | data.clearColumns(); 182 | that.toCols(x.colnames, x.cols).forEach(function(desc) { 183 | return data.pushDesc(desc); 184 | }); 185 | data.setData(rows); 186 | } 187 | 188 | const rankings = Object.keys(x.rankings).sort(); 189 | if (rankings.length === 0 || (rankings.length === 1 && !x.rankings[rankings[0]])) { 190 | data.deriveDefault(); 191 | } else { 192 | rankings.forEach(function(ranking) { 193 | return that.pushRanking(data, x.rankings[ranking]); 194 | }); 195 | } 196 | 197 | // update cross talk 198 | if (x.crosstalk.group && x.crosstalk.key && window.crosstalk != null) { 199 | if (!crossTalk) { 200 | crossTalk = that.crossTalk(data); 201 | } 202 | crossTalk(x.crosstalk.group, x.crosstalk.key); 203 | } 204 | 205 | if (lineup) { 206 | lineup.destroy(); 207 | } 208 | const options = assign({}, x.options, { 209 | sidePanel: x.options.sidePanel !== false, 210 | sidePanelCollapsed: x.options.sidePanel === 'collapsed' 211 | }); 212 | if (that.name === 'taggle') { 213 | lineup = new LineUpJS.Taggle(el, data, options); 214 | } else { 215 | lineup = new LineUpJS.LineUp(el, data, options); 216 | } 217 | }, 218 | 219 | resize: function(width, height) { 220 | el.style.width = width; 221 | el.style.height = height; 222 | if (lineup) { 223 | lineup.update(); 224 | } 225 | } 226 | 227 | }; 228 | } 229 | }; 230 | 231 | HTMLWidgets.widget(lineup); 232 | HTMLWidgets.widget(assign({}, lineup, {name: 'taggle'})); 233 | })(); 234 | 235 | -------------------------------------------------------------------------------- /inst/htmlwidgets/lineup.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | - name: lineupjs 3 | version: 4.6.2 4 | src: htmlwidgets/dist 5 | script: 6 | - LineUpJS.js 7 | stylesheet: 8 | - LineUpJS.css 9 | -------------------------------------------------------------------------------- /lineupjs.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: No 4 | SaveWorkspace: No 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | AutoAppendNewline: Yes 16 | StripTrailingWhitespace: Yes 17 | 18 | BuildType: Package 19 | PackageUseDevtools: Yes 20 | PackageInstallArgs: --no-multiarch --with-keep.source 21 | PackageRoxygenize: rd,collate,namespace 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lineup_htmlwidget", 3 | "version": "4.6.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "lineup_htmlwidget", 9 | "version": "4.6.0", 10 | "hasInstallScript": true, 11 | "dependencies": { 12 | "lineupjs": "4.6.2" 13 | }, 14 | "devDependencies": { 15 | "shx": "^0.3.4" 16 | } 17 | }, 18 | "node_modules/@popperjs/core": { 19 | "version": "2.11.5", 20 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", 21 | "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", 22 | "funding": { 23 | "type": "opencollective", 24 | "url": "https://opencollective.com/popperjs" 25 | } 26 | }, 27 | "node_modules/@types/d3-color": { 28 | "version": "2.0.3", 29 | "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", 30 | "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==" 31 | }, 32 | "node_modules/@types/d3-dispatch": { 33 | "version": "2.0.1", 34 | "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-2.0.1.tgz", 35 | "integrity": "sha512-eT2K8uG3rXkmRiCpPn0rNrekuSLdBfV83vbTvfZliA5K7dbeaqWS/CBHtJ9SQoF8aDTsWSY4A0RU67U/HcKdJQ==" 36 | }, 37 | "node_modules/@types/d3-format": { 38 | "version": "2.0.2", 39 | "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-2.0.2.tgz", 40 | "integrity": "sha512-OhQPuTeeMhD9A0Ksqo4q1S9Z1Q57O/t4tTPBxBQxRB4IERnxeoEYLPe72fA/GYpPSUrfKZVOgLHidkxwbzLdJA==" 41 | }, 42 | "node_modules/@types/d3-scale": { 43 | "version": "3.3.2", 44 | "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", 45 | "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", 46 | "dependencies": { 47 | "@types/d3-time": "^2" 48 | } 49 | }, 50 | "node_modules/@types/d3-scale-chromatic": { 51 | "version": "2.0.1", 52 | "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz", 53 | "integrity": "sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ==" 54 | }, 55 | "node_modules/@types/d3-time": { 56 | "version": "2.1.1", 57 | "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", 58 | "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" 59 | }, 60 | "node_modules/@types/d3-time-format": { 61 | "version": "3.0.1", 62 | "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-3.0.1.tgz", 63 | "integrity": "sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA==" 64 | }, 65 | "node_modules/@types/lodash": { 66 | "version": "4.14.182", 67 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 68 | "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" 69 | }, 70 | "node_modules/@types/lodash.get": { 71 | "version": "4.4.7", 72 | "resolved": "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.7.tgz", 73 | "integrity": "sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q==", 74 | "dependencies": { 75 | "@types/lodash": "*" 76 | } 77 | }, 78 | "node_modules/balanced-match": { 79 | "version": "1.0.2", 80 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 81 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 82 | "dev": true 83 | }, 84 | "node_modules/brace-expansion": { 85 | "version": "1.1.11", 86 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 87 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 88 | "dev": true, 89 | "dependencies": { 90 | "balanced-match": "^1.0.0", 91 | "concat-map": "0.0.1" 92 | } 93 | }, 94 | "node_modules/concat-map": { 95 | "version": "0.0.1", 96 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 97 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 98 | "dev": true 99 | }, 100 | "node_modules/d3-array": { 101 | "version": "2.12.1", 102 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", 103 | "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", 104 | "dependencies": { 105 | "internmap": "^1.0.0" 106 | } 107 | }, 108 | "node_modules/d3-color": { 109 | "version": "2.0.0", 110 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", 111 | "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" 112 | }, 113 | "node_modules/d3-dispatch": { 114 | "version": "2.0.0", 115 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", 116 | "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" 117 | }, 118 | "node_modules/d3-format": { 119 | "version": "2.0.0", 120 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", 121 | "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" 122 | }, 123 | "node_modules/d3-interpolate": { 124 | "version": "2.0.1", 125 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", 126 | "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", 127 | "dependencies": { 128 | "d3-color": "1 - 2" 129 | } 130 | }, 131 | "node_modules/d3-scale": { 132 | "version": "3.3.0", 133 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", 134 | "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", 135 | "dependencies": { 136 | "d3-array": "^2.3.0", 137 | "d3-format": "1 - 2", 138 | "d3-interpolate": "1.2.0 - 2", 139 | "d3-time": "^2.1.1", 140 | "d3-time-format": "2 - 3" 141 | } 142 | }, 143 | "node_modules/d3-scale-chromatic": { 144 | "version": "2.0.0", 145 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", 146 | "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", 147 | "dependencies": { 148 | "d3-color": "1 - 2", 149 | "d3-interpolate": "1 - 2" 150 | } 151 | }, 152 | "node_modules/d3-time": { 153 | "version": "2.1.1", 154 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", 155 | "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", 156 | "dependencies": { 157 | "d3-array": "2" 158 | } 159 | }, 160 | "node_modules/d3-time-format": { 161 | "version": "3.0.0", 162 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", 163 | "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", 164 | "dependencies": { 165 | "d3-time": "1 - 2" 166 | } 167 | }, 168 | "node_modules/detect-browser": { 169 | "version": "5.3.0", 170 | "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", 171 | "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" 172 | }, 173 | "node_modules/fast-deep-equal": { 174 | "version": "3.1.3", 175 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 176 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 177 | }, 178 | "node_modules/fs.realpath": { 179 | "version": "1.0.0", 180 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 181 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 182 | "dev": true 183 | }, 184 | "node_modules/function-bind": { 185 | "version": "1.1.1", 186 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 187 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 188 | "dev": true 189 | }, 190 | "node_modules/glob": { 191 | "version": "7.2.3", 192 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 193 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 194 | "dev": true, 195 | "dependencies": { 196 | "fs.realpath": "^1.0.0", 197 | "inflight": "^1.0.4", 198 | "inherits": "2", 199 | "minimatch": "^3.1.1", 200 | "once": "^1.3.0", 201 | "path-is-absolute": "^1.0.0" 202 | }, 203 | "engines": { 204 | "node": "*" 205 | }, 206 | "funding": { 207 | "url": "https://github.com/sponsors/isaacs" 208 | } 209 | }, 210 | "node_modules/has": { 211 | "version": "1.0.3", 212 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 213 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 214 | "dev": true, 215 | "dependencies": { 216 | "function-bind": "^1.1.1" 217 | }, 218 | "engines": { 219 | "node": ">= 0.4.0" 220 | } 221 | }, 222 | "node_modules/inflight": { 223 | "version": "1.0.6", 224 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 225 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 226 | "dev": true, 227 | "dependencies": { 228 | "once": "^1.3.0", 229 | "wrappy": "1" 230 | } 231 | }, 232 | "node_modules/inherits": { 233 | "version": "2.0.4", 234 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 235 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 236 | "dev": true 237 | }, 238 | "node_modules/internmap": { 239 | "version": "1.0.1", 240 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", 241 | "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" 242 | }, 243 | "node_modules/interpret": { 244 | "version": "1.4.0", 245 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 246 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 247 | "dev": true, 248 | "engines": { 249 | "node": ">= 0.10" 250 | } 251 | }, 252 | "node_modules/is-core-module": { 253 | "version": "2.9.0", 254 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 255 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 256 | "dev": true, 257 | "dependencies": { 258 | "has": "^1.0.3" 259 | }, 260 | "funding": { 261 | "url": "https://github.com/sponsors/ljharb" 262 | } 263 | }, 264 | "node_modules/lineupengine": { 265 | "version": "2.4.2", 266 | "resolved": "https://registry.npmjs.org/lineupengine/-/lineupengine-2.4.2.tgz", 267 | "integrity": "sha512-ANDEmtpg0JnHJ1Yj/sQ6VNIvxxmwI950z3EQfgud0N/jUYNqOdTUCfyh8DJQVLMJxNQH4Bi/XT+h91zzYJtqag==", 268 | "dependencies": { 269 | "tslib": "^2.3.1" 270 | } 271 | }, 272 | "node_modules/lineupjs": { 273 | "version": "4.6.2", 274 | "resolved": "https://registry.npmjs.org/lineupjs/-/lineupjs-4.6.2.tgz", 275 | "integrity": "sha512-q8OGX+BCDIN46sbOCbQ5SnG7/hp0da4DLXejmRIfpozsUP7G5mQQYLv4lJFiIS8EdwJ5eEWaAf3xzt+4eW/ERg==", 276 | "dependencies": { 277 | "@popperjs/core": "^2.11.5", 278 | "@types/d3-color": "^2.0.1", 279 | "@types/d3-dispatch": "^2.0.0", 280 | "@types/d3-format": "^2.0.0", 281 | "@types/d3-scale": "^3.2.3", 282 | "@types/d3-scale-chromatic": "^2.0.0", 283 | "@types/d3-time": "^2.0.0", 284 | "@types/d3-time-format": "^3.0.0", 285 | "@types/lodash.get": "4.4.7", 286 | "d3-color": "^2.0.0", 287 | "d3-dispatch": "^2.0.0", 288 | "d3-format": "^2.0.0", 289 | "d3-scale": "^3.3.0", 290 | "d3-scale-chromatic": "^2.0.0", 291 | "d3-time": "^2.1.1", 292 | "d3-time-format": "^3.0.0", 293 | "detect-browser": "^5.3.0", 294 | "fast-deep-equal": "^3.1.3", 295 | "lineupengine": "^2.4.2", 296 | "lodash.get": "^4.4.2", 297 | "reflect-metadata": "^0.1.13" 298 | } 299 | }, 300 | "node_modules/lodash.get": { 301 | "version": "4.4.2", 302 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 303 | "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" 304 | }, 305 | "node_modules/minimatch": { 306 | "version": "3.1.2", 307 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 308 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 309 | "dev": true, 310 | "dependencies": { 311 | "brace-expansion": "^1.1.7" 312 | }, 313 | "engines": { 314 | "node": "*" 315 | } 316 | }, 317 | "node_modules/minimist": { 318 | "version": "1.2.6", 319 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 320 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 321 | "dev": true 322 | }, 323 | "node_modules/once": { 324 | "version": "1.4.0", 325 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 326 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 327 | "dev": true, 328 | "dependencies": { 329 | "wrappy": "1" 330 | } 331 | }, 332 | "node_modules/path-is-absolute": { 333 | "version": "1.0.1", 334 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 335 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 336 | "dev": true, 337 | "engines": { 338 | "node": ">=0.10.0" 339 | } 340 | }, 341 | "node_modules/path-parse": { 342 | "version": "1.0.7", 343 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 344 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 345 | "dev": true 346 | }, 347 | "node_modules/rechoir": { 348 | "version": "0.6.2", 349 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 350 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 351 | "dev": true, 352 | "dependencies": { 353 | "resolve": "^1.1.6" 354 | }, 355 | "engines": { 356 | "node": ">= 0.10" 357 | } 358 | }, 359 | "node_modules/reflect-metadata": { 360 | "version": "0.1.13", 361 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 362 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" 363 | }, 364 | "node_modules/resolve": { 365 | "version": "1.22.1", 366 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 367 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 368 | "dev": true, 369 | "dependencies": { 370 | "is-core-module": "^2.9.0", 371 | "path-parse": "^1.0.7", 372 | "supports-preserve-symlinks-flag": "^1.0.0" 373 | }, 374 | "bin": { 375 | "resolve": "bin/resolve" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/sponsors/ljharb" 379 | } 380 | }, 381 | "node_modules/shelljs": { 382 | "version": "0.8.5", 383 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 384 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 385 | "dev": true, 386 | "dependencies": { 387 | "glob": "^7.0.0", 388 | "interpret": "^1.0.0", 389 | "rechoir": "^0.6.2" 390 | }, 391 | "bin": { 392 | "shjs": "bin/shjs" 393 | }, 394 | "engines": { 395 | "node": ">=4" 396 | } 397 | }, 398 | "node_modules/shx": { 399 | "version": "0.3.4", 400 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", 401 | "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", 402 | "dev": true, 403 | "dependencies": { 404 | "minimist": "^1.2.3", 405 | "shelljs": "^0.8.5" 406 | }, 407 | "bin": { 408 | "shx": "lib/cli.js" 409 | }, 410 | "engines": { 411 | "node": ">=6" 412 | } 413 | }, 414 | "node_modules/supports-preserve-symlinks-flag": { 415 | "version": "1.0.0", 416 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 417 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 418 | "dev": true, 419 | "engines": { 420 | "node": ">= 0.4" 421 | }, 422 | "funding": { 423 | "url": "https://github.com/sponsors/ljharb" 424 | } 425 | }, 426 | "node_modules/tslib": { 427 | "version": "2.4.0", 428 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 429 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 430 | }, 431 | "node_modules/wrappy": { 432 | "version": "1.0.2", 433 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 434 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 435 | "dev": true 436 | } 437 | }, 438 | "dependencies": { 439 | "@popperjs/core": { 440 | "version": "2.11.5", 441 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", 442 | "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" 443 | }, 444 | "@types/d3-color": { 445 | "version": "2.0.3", 446 | "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", 447 | "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==" 448 | }, 449 | "@types/d3-dispatch": { 450 | "version": "2.0.1", 451 | "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-2.0.1.tgz", 452 | "integrity": "sha512-eT2K8uG3rXkmRiCpPn0rNrekuSLdBfV83vbTvfZliA5K7dbeaqWS/CBHtJ9SQoF8aDTsWSY4A0RU67U/HcKdJQ==" 453 | }, 454 | "@types/d3-format": { 455 | "version": "2.0.2", 456 | "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-2.0.2.tgz", 457 | "integrity": "sha512-OhQPuTeeMhD9A0Ksqo4q1S9Z1Q57O/t4tTPBxBQxRB4IERnxeoEYLPe72fA/GYpPSUrfKZVOgLHidkxwbzLdJA==" 458 | }, 459 | "@types/d3-scale": { 460 | "version": "3.3.2", 461 | "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", 462 | "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", 463 | "requires": { 464 | "@types/d3-time": "^2" 465 | } 466 | }, 467 | "@types/d3-scale-chromatic": { 468 | "version": "2.0.1", 469 | "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz", 470 | "integrity": "sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ==" 471 | }, 472 | "@types/d3-time": { 473 | "version": "2.1.1", 474 | "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", 475 | "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" 476 | }, 477 | "@types/d3-time-format": { 478 | "version": "3.0.1", 479 | "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-3.0.1.tgz", 480 | "integrity": "sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA==" 481 | }, 482 | "@types/lodash": { 483 | "version": "4.14.182", 484 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 485 | "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" 486 | }, 487 | "@types/lodash.get": { 488 | "version": "4.4.7", 489 | "resolved": "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.7.tgz", 490 | "integrity": "sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q==", 491 | "requires": { 492 | "@types/lodash": "*" 493 | } 494 | }, 495 | "balanced-match": { 496 | "version": "1.0.2", 497 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 498 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 499 | "dev": true 500 | }, 501 | "brace-expansion": { 502 | "version": "1.1.11", 503 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 504 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 505 | "dev": true, 506 | "requires": { 507 | "balanced-match": "^1.0.0", 508 | "concat-map": "0.0.1" 509 | } 510 | }, 511 | "concat-map": { 512 | "version": "0.0.1", 513 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 514 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 515 | "dev": true 516 | }, 517 | "d3-array": { 518 | "version": "2.12.1", 519 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", 520 | "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", 521 | "requires": { 522 | "internmap": "^1.0.0" 523 | } 524 | }, 525 | "d3-color": { 526 | "version": "2.0.0", 527 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", 528 | "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" 529 | }, 530 | "d3-dispatch": { 531 | "version": "2.0.0", 532 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", 533 | "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" 534 | }, 535 | "d3-format": { 536 | "version": "2.0.0", 537 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", 538 | "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" 539 | }, 540 | "d3-interpolate": { 541 | "version": "2.0.1", 542 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", 543 | "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", 544 | "requires": { 545 | "d3-color": "1 - 2" 546 | } 547 | }, 548 | "d3-scale": { 549 | "version": "3.3.0", 550 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", 551 | "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", 552 | "requires": { 553 | "d3-array": "^2.3.0", 554 | "d3-format": "1 - 2", 555 | "d3-interpolate": "1.2.0 - 2", 556 | "d3-time": "^2.1.1", 557 | "d3-time-format": "2 - 3" 558 | } 559 | }, 560 | "d3-scale-chromatic": { 561 | "version": "2.0.0", 562 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", 563 | "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", 564 | "requires": { 565 | "d3-color": "1 - 2", 566 | "d3-interpolate": "1 - 2" 567 | } 568 | }, 569 | "d3-time": { 570 | "version": "2.1.1", 571 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", 572 | "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", 573 | "requires": { 574 | "d3-array": "2" 575 | } 576 | }, 577 | "d3-time-format": { 578 | "version": "3.0.0", 579 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", 580 | "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", 581 | "requires": { 582 | "d3-time": "1 - 2" 583 | } 584 | }, 585 | "detect-browser": { 586 | "version": "5.3.0", 587 | "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", 588 | "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" 589 | }, 590 | "fast-deep-equal": { 591 | "version": "3.1.3", 592 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 593 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 594 | }, 595 | "fs.realpath": { 596 | "version": "1.0.0", 597 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 598 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 599 | "dev": true 600 | }, 601 | "function-bind": { 602 | "version": "1.1.1", 603 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 604 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 605 | "dev": true 606 | }, 607 | "glob": { 608 | "version": "7.2.3", 609 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 610 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 611 | "dev": true, 612 | "requires": { 613 | "fs.realpath": "^1.0.0", 614 | "inflight": "^1.0.4", 615 | "inherits": "2", 616 | "minimatch": "^3.1.1", 617 | "once": "^1.3.0", 618 | "path-is-absolute": "^1.0.0" 619 | } 620 | }, 621 | "has": { 622 | "version": "1.0.3", 623 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 624 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 625 | "dev": true, 626 | "requires": { 627 | "function-bind": "^1.1.1" 628 | } 629 | }, 630 | "inflight": { 631 | "version": "1.0.6", 632 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 633 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 634 | "dev": true, 635 | "requires": { 636 | "once": "^1.3.0", 637 | "wrappy": "1" 638 | } 639 | }, 640 | "inherits": { 641 | "version": "2.0.4", 642 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 643 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 644 | "dev": true 645 | }, 646 | "internmap": { 647 | "version": "1.0.1", 648 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", 649 | "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" 650 | }, 651 | "interpret": { 652 | "version": "1.4.0", 653 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 654 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 655 | "dev": true 656 | }, 657 | "is-core-module": { 658 | "version": "2.9.0", 659 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 660 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 661 | "dev": true, 662 | "requires": { 663 | "has": "^1.0.3" 664 | } 665 | }, 666 | "lineupengine": { 667 | "version": "2.4.2", 668 | "resolved": "https://registry.npmjs.org/lineupengine/-/lineupengine-2.4.2.tgz", 669 | "integrity": "sha512-ANDEmtpg0JnHJ1Yj/sQ6VNIvxxmwI950z3EQfgud0N/jUYNqOdTUCfyh8DJQVLMJxNQH4Bi/XT+h91zzYJtqag==", 670 | "requires": { 671 | "tslib": "^2.3.1" 672 | } 673 | }, 674 | "lineupjs": { 675 | "version": "4.6.2", 676 | "resolved": "https://registry.npmjs.org/lineupjs/-/lineupjs-4.6.2.tgz", 677 | "integrity": "sha512-q8OGX+BCDIN46sbOCbQ5SnG7/hp0da4DLXejmRIfpozsUP7G5mQQYLv4lJFiIS8EdwJ5eEWaAf3xzt+4eW/ERg==", 678 | "requires": { 679 | "@popperjs/core": "^2.11.5", 680 | "@types/d3-color": "^2.0.1", 681 | "@types/d3-dispatch": "^2.0.0", 682 | "@types/d3-format": "^2.0.0", 683 | "@types/d3-scale": "^3.2.3", 684 | "@types/d3-scale-chromatic": "^2.0.0", 685 | "@types/d3-time": "^2.0.0", 686 | "@types/d3-time-format": "^3.0.0", 687 | "@types/lodash.get": "4.4.7", 688 | "d3-color": "^2.0.0", 689 | "d3-dispatch": "^2.0.0", 690 | "d3-format": "^2.0.0", 691 | "d3-scale": "^3.3.0", 692 | "d3-scale-chromatic": "^2.0.0", 693 | "d3-time": "^2.1.1", 694 | "d3-time-format": "^3.0.0", 695 | "detect-browser": "^5.3.0", 696 | "fast-deep-equal": "^3.1.3", 697 | "lineupengine": "^2.4.2", 698 | "lodash.get": "^4.4.2", 699 | "reflect-metadata": "^0.1.13" 700 | } 701 | }, 702 | "lodash.get": { 703 | "version": "4.4.2", 704 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 705 | "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" 706 | }, 707 | "minimatch": { 708 | "version": "3.1.2", 709 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 710 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 711 | "dev": true, 712 | "requires": { 713 | "brace-expansion": "^1.1.7" 714 | } 715 | }, 716 | "minimist": { 717 | "version": "1.2.6", 718 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 719 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 720 | "dev": true 721 | }, 722 | "once": { 723 | "version": "1.4.0", 724 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 725 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 726 | "dev": true, 727 | "requires": { 728 | "wrappy": "1" 729 | } 730 | }, 731 | "path-is-absolute": { 732 | "version": "1.0.1", 733 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 734 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 735 | "dev": true 736 | }, 737 | "path-parse": { 738 | "version": "1.0.7", 739 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 740 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 741 | "dev": true 742 | }, 743 | "rechoir": { 744 | "version": "0.6.2", 745 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 746 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 747 | "dev": true, 748 | "requires": { 749 | "resolve": "^1.1.6" 750 | } 751 | }, 752 | "reflect-metadata": { 753 | "version": "0.1.13", 754 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 755 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" 756 | }, 757 | "resolve": { 758 | "version": "1.22.1", 759 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 760 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 761 | "dev": true, 762 | "requires": { 763 | "is-core-module": "^2.9.0", 764 | "path-parse": "^1.0.7", 765 | "supports-preserve-symlinks-flag": "^1.0.0" 766 | } 767 | }, 768 | "shelljs": { 769 | "version": "0.8.5", 770 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 771 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 772 | "dev": true, 773 | "requires": { 774 | "glob": "^7.0.0", 775 | "interpret": "^1.0.0", 776 | "rechoir": "^0.6.2" 777 | } 778 | }, 779 | "shx": { 780 | "version": "0.3.4", 781 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", 782 | "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", 783 | "dev": true, 784 | "requires": { 785 | "minimist": "^1.2.3", 786 | "shelljs": "^0.8.5" 787 | } 788 | }, 789 | "supports-preserve-symlinks-flag": { 790 | "version": "1.0.0", 791 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 792 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 793 | "dev": true 794 | }, 795 | "tslib": { 796 | "version": "2.4.0", 797 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 798 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 799 | }, 800 | "wrappy": { 801 | "version": "1.0.2", 802 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 803 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 804 | "dev": true 805 | } 806 | } 807 | } 808 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lineup_htmlwidget", 3 | "version": "4.6.0", 4 | "description": "LineUp.js as HTMLWidget", 5 | "bugs": { 6 | "url": "https://github.com/lineupjs/lineup_htmlwidget/issues" 7 | }, 8 | "homepage": "https://github.com/lineupjs/lineup_htmlwidget#readme", 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/lineupjs/lineup_htmlwidget.git" 12 | }, 13 | "dependencies": { 14 | "lineupjs": "4.6.2" 15 | }, 16 | "scripts": { 17 | "postinstall": "shx rm -f inst/htmlwidgets/dist/* && shx mkdir -p inst/htmlwidgets/dist && shx cp -r \"node_modules/lineupjs/build/LineUp*\" \"node_modules/lineupjs/build/*.eot\" \"node_modules/lineupjs/build/*.svg\" \"node_modules/lineupjs/build/*.ttf\" \"node_modules/lineupjs/build/*.woff\" inst/htmlwidgets/dist && shx rm inst/htmlwidgets/dist/*.map" 18 | }, 19 | "devDependencies": { 20 | "shx": "^0.3.4" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /vignettes/crosstalk.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "LineUp.js Crosstalk Example" 3 | author: "Samuel Gratzl" 4 | date: "`r Sys.Date()`" 5 | output: rmarkdown::html_vignette 6 | vignette: > 7 | %\VignetteIndexEntry{LineUp.js Crosstalk Example} 8 | %\VignetteEngine{knitr::rmarkdown} 9 | \usepackage[utf8]{inputenc} 10 | --- 11 | --- 12 | 13 | ```{r setup, include=FALSE} 14 | knitr::opts_chunk$set(echo = TRUE) 15 | ``` 16 | 17 | ## Cross Talk 18 | 19 | The LineUp HTMLWidget supports [Crosstalk](https://rstudio.github.io/crosstalk/) to sync selection and filtering among widgets. 20 | 21 | 22 | ```{r crosstalk_iris} 23 | library(crosstalk) 24 | library(lineupjs) 25 | 26 | sharedIris <- SharedData$new(iris) 27 | ``` 28 | 29 | ```{r crosstalk_iris_lineup1} 30 | lineup(sharedIris, width = "100%") 31 | ``` 32 | 33 | ```{r crosstalk_iris_lineup2} 34 | lineup(sharedIris, width = "100%") 35 | ``` 36 | -------------------------------------------------------------------------------- /vignettes/lineupjs.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "LineUp.js HTMLWidget" 3 | author: "Samuel Gratzl" 4 | date: "`r Sys.Date()`" 5 | output: rmarkdown::html_vignette 6 | vignette: > 7 | %\VignetteIndexEntry{LineUp.js HTMLWidget} 8 | %\VignetteEngine{knitr::rmarkdown} 9 | \usepackage[utf8]{inputenc} 10 | --- 11 | --- 12 | 13 | ```{r setup, include=FALSE} 14 | knitr::opts_chunk$set(echo = TRUE) 15 | ``` 16 | 17 | ## LineUp HTMLWidget in R Markdown 18 | 19 | This is a simple example how to include the LineUp [HTMLWidget](http://www.htmlwidgets.org/) in your R Markdown file 20 | 21 | ```{r libraries} 22 | # devtools::install_github("lineupjs/lineup_htmlwidget") 23 | 24 | library(lineupjs) 25 | ``` 26 | 27 | ## Simple Example 28 | 29 | ```{r lineup} 30 | 31 | lineup(iris) 32 | ``` 33 | --------------------------------------------------------------------------------