Compare commits

..
21 Commits
Author SHA1 Message Date
eneller 8aca73cd9c doc: begin sweave 2026-01-26 12:59:36 +01:00
eneller e8bfcacacb doc: init R 2026-01-26 12:29:00 +01:00
eneller 86b67f36e4 refactor: enum for keyboards 2026-01-26 11:50:43 +01:00
eneller 93041a370e begin cli args 2026-01-26 11:14:28 +01:00
eneller 2b6ea24d5e chore: bump version 2026-01-25 20:12:29 +01:00
eneller 02e6b033c2 chore: remove demo 2026-01-25 20:00:23 +01:00
eneller 076816bd12 doc: readme 2026-01-24 18:52:01 +01:00
eneller 1ad2e8ad4c doc: readme 2026-01-24 18:38:37 +01:00
eneller 3b5d304845 feat: working osk 2026-01-24 18:11:33 +01:00
eneller cade0046bf doc: research 2025-12-17 20:18:51 +01:00
eneller 881a723f4e chore: update deps 2025-12-07 17:33:37 +01:00
eneller 673a71de43 Merge branch 'feature/keyboard-frontend' 2025-12-07 17:21:15 +01:00
eneller 6d16af7143 doc: README 2025-12-07 16:55:52 +01:00
lukasadrion 04a8a15f23 fix light and darkmode 2025-12-06 16:39:33 +01:00
lukasadrion 7744bcf67d remove german comments 2025-12-05 01:22:36 +01:00
lukasadrion 3512bf0fac finished circle keyboard implementation and update window size 2025-12-05 01:18:54 +01:00
lukasadrion ef740ca9dd add first implementation of circle keyboard and better switching of keyboards 2025-12-04 18:54:10 +01:00
lukasadrion 15cdc77eea add DVORAK keyboard 2025-12-01 16:53:52 +01:00
lukasadrion 2ad8b7fffb remove initial html code 2025-12-01 16:40:31 +01:00
lukasadrion 327608cc36 add normal layout keyboard 2025-11-29 23:09:58 +01:00
eneller 6c4235a52f fix: linux-specific build 2025-11-28 14:09:55 +01:00
24 changed files with 6194 additions and 1565 deletions

No files matched your search

+3
View File
@@ -40,3 +40,6 @@ testem.log
# System files # System files
.DS_Store .DS_Store
Thumbs.db Thumbs.db
TextTestExe/
data/
+14 -1
View File
@@ -1,7 +1,20 @@
# Tauri + Angular # Tauri + Angular
This template should help get you started developing with Tauri and Angular. On Windows, Tauri requires the the msvc toolchain:
```
rustup default stable-msvc
```
## Recommended IDE Setup ## Recommended IDE Setup
[VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) + [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=Angular.ng-template). [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) + [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=Angular.ng-template).
## Keyboard Emulation
Keyboard emulation on most systems requires workarounds for two issues:
- keeping the window with the keyboard on top while another (the input target) is in focus
- not receiving focus when clicked
- sending input
## Logging and Statistics
For logging, either use [TextTestExe](https://depts.washington.edu/acelab/proj/texttest/) (local program) or [TextTestPP](https://drustz.com/TextTestPP/) (online).
The theoretical framework is inspired by https://www.yorku.ca/mack/bit95.html.
+1
View File
@@ -0,0 +1 @@
source("renv/activate.R")
+374
View File
@@ -0,0 +1,374 @@
# Created by https://www.toptal.com/developers/gitignore/api/tex,r
# Edit at https://www.toptal.com/developers/gitignore?templates=tex,r
### R ###
# History files
.Rhistory
.Rapp.history
# Session Data files
.RData
.RDataTmp
# User-specific files
.Ruserdata
# Example code in package build process
*-Ex.R
# Output files from R CMD build
/*.tar.gz
# Output files from R CMD check
/*.Rcheck/
# RStudio files
.Rproj.user/
# produced vignettes
vignettes/*.html
vignettes/*.pdf
# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
.httr-oauth
# knitr and R markdown default cache directories
*_cache/
/cache/
# Temporary files created by R markdown
*.utf8.md
*.knit.md
# R Environment Variables
.Renviron
# pkgdown site
docs/
# translation temp files
po/*~
# RStudio Connect folder
rsconnect/
### R.Bookdown Stack ###
# R package: bookdown caching files
/*_files/
### TeX ###
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
*.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
*.lzo
*.lzs
*.slg
*.slo
*.sls
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplot
*.gnuplot
*.table
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.glog
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
# *.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# newpax
*.newpax
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# svg
svg-inkscape/
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# titletoc
*.ptc
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices and outlines
*.xyc
*.xyd
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# gummi
.*.swp
# KBibTeX
*~[0-9]*
# TeXnicCenter
*.tps
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
# Makeindex log files
*.lpz
# xwatermark package
*.xwm
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
# Uncomment the next line to have this generated file ignored.
#*Notes.bib
### TeX Patch ###
# LIPIcs / OASIcs
*.vtc
# glossaries
*.glstex
# End of https://www.toptal.com/developers/gitignore/api/tex,r
*.html
bib
# Sweave-specific
*.tex
+13
View File
@@ -0,0 +1,13 @@
Version: 1.0
RestoreWorkspace: Default
SaveWorkspace: Default
AlwaysSaveHistory: Default
EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8
RnwWeave: knitr
LaTeX: pdfLaTeX
+962
View File
@@ -0,0 +1,962 @@
{
"R": {
"Version": "4.5.2",
"Repositories": [
{
"Name": "CRAN",
"URL": "https://packagemanager.posit.co/cran/latest"
}
]
},
"Packages": {
"R6": {
"Package": "R6",
"Version": "2.6.1",
"Source": "Repository",
"Title": "Encapsulated Classes with Reference Semantics",
"Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.",
"License": "MIT + file LICENSE",
"URL": "https://r6.r-lib.org, https://github.com/r-lib/R6",
"BugReports": "https://github.com/r-lib/R6/issues",
"Depends": [
"R (>= 3.6)"
],
"Suggests": [
"lobstr",
"testthat (>= 3.0.0)"
],
"Config/Needs/website": "tidyverse/tidytemplate, ggplot2, microbenchmark, scales",
"Config/testthat/edition": "3",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"NeedsCompilation": "no",
"Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]",
"Maintainer": "Winston Chang <winston@posit.co>",
"Repository": "CRAN"
},
"base64enc": {
"Package": "base64enc",
"Version": "0.1-3",
"Source": "Repository",
"Title": "Tools for base64 encoding",
"Author": "Simon Urbanek <Simon.Urbanek@r-project.org>",
"Maintainer": "Simon Urbanek <Simon.Urbanek@r-project.org>",
"Depends": [
"R (>= 2.9.0)"
],
"Enhances": [
"png"
],
"Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.",
"License": "GPL-2 | GPL-3",
"URL": "http://www.rforge.net/base64enc",
"NeedsCompilation": "yes",
"Repository": "CRAN",
"Encoding": "UTF-8"
},
"bslib": {
"Package": "bslib",
"Version": "0.9.0",
"Source": "Repository",
"Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'",
"Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )",
"Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.",
"License": "MIT + file LICENSE",
"URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib",
"BugReports": "https://github.com/rstudio/bslib/issues",
"Depends": [
"R (>= 2.10)"
],
"Imports": [
"base64enc",
"cachem",
"fastmap (>= 1.1.1)",
"grDevices",
"htmltools (>= 0.5.8)",
"jquerylib (>= 0.1.3)",
"jsonlite",
"lifecycle",
"memoise (>= 2.0.1)",
"mime",
"rlang",
"sass (>= 0.4.9)"
],
"Suggests": [
"bsicons",
"curl",
"fontawesome",
"future",
"ggplot2",
"knitr",
"magrittr",
"rappdirs",
"rmarkdown (>= 2.7)",
"shiny (> 1.8.1)",
"testthat",
"thematic",
"tools",
"utils",
"withr",
"yaml"
],
"Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble",
"Config/Needs/routine": "chromote, desc, renv",
"Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2",
"Config/testthat/edition": "3",
"Config/testthat/parallel": "true",
"Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-dark-mode.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'",
"NeedsCompilation": "no",
"Author": "Carson Sievert [aut, cre] (<https://orcid.org/0000-0002-4958-2844>), Joe Cheng [aut], Garrick Aden-Buie [aut] (<https://orcid.org/0000-0002-7111-0077>), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)",
"Maintainer": "Carson Sievert <carson@posit.co>",
"Repository": "CRAN"
},
"cachem": {
"Package": "cachem",
"Version": "1.1.0",
"Source": "Repository",
"Title": "Cache R Objects with Automatic Pruning",
"Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.",
"Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))",
"License": "MIT + file LICENSE",
"Encoding": "UTF-8",
"ByteCompile": "true",
"URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem",
"Imports": [
"rlang",
"fastmap (>= 1.2.0)"
],
"Suggests": [
"testthat"
],
"RoxygenNote": "7.2.3",
"Config/Needs/routine": "lobstr",
"Config/Needs/website": "pkgdown",
"NeedsCompilation": "yes",
"Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]",
"Maintainer": "Winston Chang <winston@posit.co>",
"Repository": "CRAN"
},
"cli": {
"Package": "cli",
"Version": "3.6.5",
"Source": "Repository",
"Title": "Helpers for Developing Command Line Interfaces",
"Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"gabor@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.",
"License": "MIT + file LICENSE",
"URL": "https://cli.r-lib.org, https://github.com/r-lib/cli",
"BugReports": "https://github.com/r-lib/cli/issues",
"Depends": [
"R (>= 3.4)"
],
"Imports": [
"utils"
],
"Suggests": [
"callr",
"covr",
"crayon",
"digest",
"glue (>= 1.6.0)",
"grDevices",
"htmltools",
"htmlwidgets",
"knitr",
"methods",
"processx",
"ps (>= 1.3.4.9000)",
"rlang (>= 1.0.2.9003)",
"rmarkdown",
"rprojroot",
"rstudioapi",
"testthat (>= 3.2.0)",
"tibble",
"whoami",
"withr"
],
"Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs",
"Config/testthat/edition": "3",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"NeedsCompilation": "yes",
"Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (<https://orcid.org/0000-0002-5329-5987>), Posit Software, PBC [cph, fnd]",
"Maintainer": "Gábor Csárdi <gabor@posit.co>",
"Repository": "CRAN"
},
"digest": {
"Package": "digest",
"Version": "0.6.39",
"Source": "Repository",
"Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\", comment = c(ORCID = \"0000-0002-8059-9767\")), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8552-0029\")), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0492-6647\")), person(\"Ion\", \"Suruceanu\", role=\"ctb\", comment = c(ORCID = \"0009-0005-6446-4909\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\", comment = c(ORCID = \"0009-0008-8480-1329\")), person(\"Sergey\", \"Fedorov\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5970-7233\")), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\", comment = c(ORCID = \"0009-0000-5948-4503\")), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Carl\", \"Pearson\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0701-7860\")))",
"Date": "2025-11-19",
"Title": "Create Compact Hash Digests of R Objects",
"Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as 'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.",
"URL": "https://github.com/eddelbuettel/digest, https://eddelbuettel.github.io/digest/, https://dirk.eddelbuettel.com/code/digest.html",
"BugReports": "https://github.com/eddelbuettel/digest/issues",
"Depends": [
"R (>= 3.3.0)"
],
"Imports": [
"utils"
],
"License": "GPL (>= 2)",
"Suggests": [
"tinytest",
"simplermarkdown",
"rbenchmark"
],
"VignetteBuilder": "simplermarkdown",
"Encoding": "UTF-8",
"NeedsCompilation": "yes",
"Author": "Dirk Eddelbuettel [aut, cre] (ORCID: <https://orcid.org/0000-0001-6419-907X>), Antoine Lucas [ctb] (ORCID: <https://orcid.org/0000-0002-8059-9767>), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: <https://orcid.org/0000-0002-7579-5165>), Simon Urbanek [ctb] (ORCID: <https://orcid.org/0000-0003-2297-1732>), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: <https://orcid.org/0000-0001-8552-0029>), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: <https://orcid.org/0000-0002-2739-7082>), Wush Wu [ctb] (ORCID: <https://orcid.org/0000-0001-5180-0567>), Qiang Kou [ctb] (ORCID: <https://orcid.org/0000-0001-6786-5453>), Thierry Onkelinx [ctb] (ORCID: <https://orcid.org/0000-0001-8804-4216>), Michel Lang [ctb] (ORCID: <https://orcid.org/0000-0001-9754-0393>), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: <https://orcid.org/0000-0003-4198-9911>), Radford Neal [ctb] (ORCID: <https://orcid.org/0000-0002-2473-3407>), Kendon Bell [ctb] (ORCID: <https://orcid.org/0000-0002-9093-8312>), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: <https://orcid.org/0000-0003-0492-6647>), Ion Suruceanu [ctb] (ORCID: <https://orcid.org/0009-0005-6446-4909>), Bill Denney [ctb] (ORCID: <https://orcid.org/0000-0002-5759-428X>), Dirk Schumacher [ctb], András Svraka [ctb] (ORCID: <https://orcid.org/0009-0008-8480-1329>), Sergey Fedorov [ctb] (ORCID: <https://orcid.org/0000-0002-5970-7233>), Will Landau [ctb] (ORCID: <https://orcid.org/0000-0003-1878-3253>), Floris Vanderhaeghe [ctb] (ORCID: <https://orcid.org/0000-0002-6378-6229>), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: <https://orcid.org/0000-0001-7813-818X>), Mark van der Loo [ctb] (ORCID: <https://orcid.org/0000-0002-9807-4686>), Chris Muir [ctb] (ORCID: <https://orcid.org/0000-0003-2555-3878>), Moritz Beller [ctb] (ORCID: <https://orcid.org/0000-0003-4852-0526>), Sebastian Campbell [ctb] (ORCID: <https://orcid.org/0009-0000-5948-4503>), Winston Chang [ctb] (ORCID: <https://orcid.org/0000-0002-1576-2126>), Dean Attali [ctb] (ORCID: <https://orcid.org/0000-0002-5645-3493>), Michael Chirico [ctb] (ORCID: <https://orcid.org/0000-0003-0787-087X>), Kevin Ushey [ctb] (ORCID: <https://orcid.org/0000-0003-2880-7407>), Carl Pearson [ctb] (ORCID: <https://orcid.org/0000-0003-0701-7860>)",
"Maintainer": "Dirk Eddelbuettel <edd@debian.org>",
"Repository": "CRAN"
},
"evaluate": {
"Package": "evaluate",
"Version": "1.0.5",
"Source": "Repository",
"Type": "Package",
"Title": "Parsing and Evaluation Tools that Provide More Details than the Default",
"Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.",
"License": "MIT + file LICENSE",
"URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate",
"BugReports": "https://github.com/r-lib/evaluate/issues",
"Depends": [
"R (>= 3.6.0)"
],
"Suggests": [
"callr",
"covr",
"ggplot2 (>= 3.3.6)",
"lattice",
"methods",
"pkgload",
"ragg (>= 1.4.0)",
"rlang (>= 1.1.5)",
"knitr",
"testthat (>= 3.0.0)",
"withr"
],
"Config/Needs/website": "tidyverse/tidytemplate",
"Config/testthat/edition": "3",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"NeedsCompilation": "no",
"Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (ORCID: <https://orcid.org/0000-0003-0645-5666>), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]",
"Maintainer": "Hadley Wickham <hadley@posit.co>",
"Repository": "CRAN"
},
"fastmap": {
"Package": "fastmap",
"Version": "1.2.0",
"Source": "Repository",
"Title": "Fast Data Structures",
"Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )",
"Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.",
"License": "MIT + file LICENSE",
"Encoding": "UTF-8",
"RoxygenNote": "7.2.3",
"Suggests": [
"testthat (>= 2.1.1)"
],
"URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap",
"BugReports": "https://github.com/r-lib/fastmap/issues",
"NeedsCompilation": "yes",
"Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)",
"Maintainer": "Winston Chang <winston@posit.co>",
"Repository": "CRAN"
},
"fontawesome": {
"Package": "fontawesome",
"Version": "0.5.3",
"Source": "Repository",
"Type": "Package",
"Title": "Easily Work with 'Font Awesome' Icons",
"Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.",
"Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"License": "MIT + file LICENSE",
"URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/",
"BugReports": "https://github.com/rstudio/fontawesome/issues",
"Encoding": "UTF-8",
"ByteCompile": "true",
"RoxygenNote": "7.3.2",
"Depends": [
"R (>= 3.3.0)"
],
"Imports": [
"rlang (>= 1.0.6)",
"htmltools (>= 0.5.1.1)"
],
"Suggests": [
"covr",
"dplyr (>= 1.0.8)",
"gt (>= 0.9.0)",
"knitr (>= 1.31)",
"testthat (>= 3.0.0)",
"rsvg"
],
"Config/testthat/edition": "3",
"NeedsCompilation": "no",
"Author": "Richard Iannone [aut, cre] (<https://orcid.org/0000-0003-3925-190X>), Christophe Dervieux [ctb] (<https://orcid.org/0000-0003-4474-2498>), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]",
"Maintainer": "Richard Iannone <rich@posit.co>",
"Repository": "CRAN"
},
"fs": {
"Package": "fs",
"Version": "1.6.6",
"Source": "Repository",
"Title": "Cross-Platform File System Operations Based on 'libuv'",
"Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.",
"License": "MIT + file LICENSE",
"URL": "https://fs.r-lib.org, https://github.com/r-lib/fs",
"BugReports": "https://github.com/r-lib/fs/issues",
"Depends": [
"R (>= 3.6)"
],
"Imports": [
"methods"
],
"Suggests": [
"covr",
"crayon",
"knitr",
"pillar (>= 1.0.0)",
"rmarkdown",
"spelling",
"testthat (>= 3.0.0)",
"tibble (>= 1.1.0)",
"vctrs (>= 0.3.0)",
"withr"
],
"VignetteBuilder": "knitr",
"ByteCompile": "true",
"Config/Needs/website": "tidyverse/tidytemplate",
"Config/testthat/edition": "3",
"Copyright": "file COPYRIGHTS",
"Encoding": "UTF-8",
"Language": "en-US",
"RoxygenNote": "7.2.3",
"SystemRequirements": "GNU make",
"NeedsCompilation": "yes",
"Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]",
"Maintainer": "Gábor Csárdi <csardi.gabor@gmail.com>",
"Repository": "CRAN"
},
"highr": {
"Package": "highr",
"Version": "0.11",
"Source": "Repository",
"Type": "Package",
"Title": "Syntax Highlighting for R Source Code",
"Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )",
"Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package (<https://gitlab.com/saalen/highlight>).",
"Depends": [
"R (>= 3.3.0)"
],
"Imports": [
"xfun (>= 0.18)"
],
"Suggests": [
"knitr",
"markdown",
"testit"
],
"License": "GPL",
"URL": "https://github.com/yihui/highr",
"BugReports": "https://github.com/yihui/highr/issues",
"VignetteBuilder": "knitr",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.1",
"NeedsCompilation": "no",
"Author": "Yihui Xie [aut, cre] (<https://orcid.org/0000-0003-0645-5666>), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"htmltools": {
"Package": "htmltools",
"Version": "0.5.9",
"Source": "Repository",
"Type": "Package",
"Title": "Tools for HTML",
"Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "Tools for HTML generation and output.",
"License": "GPL (>= 2)",
"URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/",
"BugReports": "https://github.com/rstudio/htmltools/issues",
"Depends": [
"R (>= 2.14.1)"
],
"Imports": [
"base64enc",
"digest",
"fastmap (>= 1.1.0)",
"grDevices",
"rlang (>= 1.0.0)",
"utils"
],
"Suggests": [
"Cairo",
"markdown",
"ragg",
"shiny",
"testthat",
"withr"
],
"Enhances": [
"knitr"
],
"Config/Needs/check": "knitr",
"Config/Needs/website": "rstudio/quillt, bench",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'",
"NeedsCompilation": "yes",
"Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: <https://orcid.org/0000-0002-4958-2844>), Barret Schloerke [aut] (ORCID: <https://orcid.org/0000-0001-9986-114X>), Winston Chang [aut] (ORCID: <https://orcid.org/0000-0002-1576-2126>), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]",
"Maintainer": "Carson Sievert <carson@posit.co>",
"Repository": "CRAN"
},
"jquerylib": {
"Package": "jquerylib",
"Version": "0.1.4",
"Source": "Repository",
"Title": "Obtain 'jQuery' as an HTML Dependency Object",
"Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )",
"Description": "Obtain any major version of 'jQuery' (<https://code.jquery.com/>) and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.",
"License": "MIT + file LICENSE",
"Encoding": "UTF-8",
"Config/testthat/edition": "3",
"RoxygenNote": "7.0.2",
"Imports": [
"htmltools"
],
"Suggests": [
"testthat"
],
"NeedsCompilation": "no",
"Author": "Carson Sievert [aut, cre] (<https://orcid.org/0000-0002-4958-2844>), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)",
"Maintainer": "Carson Sievert <carson@rstudio.com>",
"Repository": "CRAN"
},
"jsonlite": {
"Package": "jsonlite",
"Version": "2.0.0",
"Source": "Repository",
"Title": "A Simple and Robust JSON Parser and Generator for R",
"License": "MIT + file LICENSE",
"Depends": [
"methods"
],
"Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))",
"URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805",
"BugReports": "https://github.com/jeroen/jsonlite/issues",
"Maintainer": "Jeroen Ooms <jeroenooms@gmail.com>",
"VignetteBuilder": "knitr, R.rsp",
"Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.",
"Suggests": [
"httr",
"vctrs",
"testthat",
"knitr",
"rmarkdown",
"R.rsp",
"sf"
],
"RoxygenNote": "7.3.2",
"Encoding": "UTF-8",
"NeedsCompilation": "yes",
"Author": "Jeroen Ooms [aut, cre] (<https://orcid.org/0000-0002-4035-0289>), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)",
"Repository": "CRAN"
},
"knitr": {
"Package": "knitr",
"Version": "1.51",
"Source": "Repository",
"Type": "Package",
"Title": "A General-Purpose Package for Dynamic Report Generation in R",
"Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"),Line truncated
"Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.",
"Depends": [
"R (>= 3.6.0)"
],
"Imports": [
"evaluate (>= 0.15)",
"highr (>= 0.11)",
"methods",
"tools",
"xfun (>= 0.52)",
"yaml (>= 2.1.19)"
],
"Suggests": [
"bslib",
"DBI (>= 0.4-1)",
"digest",
"formatR",
"gifski",
"gridSVG",
"htmlwidgets (>= 0.7)",
"jpeg",
"JuliaCall (>= 0.11.1)",
"magick",
"litedown",
"markdown (>= 1.3)",
"otel",
"otelsdk",
"png",
"ragg",
"reticulate (>= 1.4)",
"rgl (>= 0.95.1201)",
"rlang",
"rmarkdown",
"sass",
"showtext",
"styler (>= 1.2.0)",
"targets (>= 0.6.0)",
"testit",
"tibble",
"tikzDevice (>= 0.10)",
"tinytex (>= 0.56)",
"webshot",
"rstudioapi",
"svglite"
],
"License": "GPL",
"URL": "https://yihui.org/knitr/",
"BugReports": "https://github.com/yihui/knitr/issues",
"Encoding": "UTF-8",
"VignetteBuilder": "litedown, knitr",
"SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).",
"Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'",
"RoxygenNote": "7.3.3",
"NeedsCompilation": "no",
"Author": "Yihui Xie [aut, cre] (ORCID: <https://orcid.org/0000-0003-0645-5666>, URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: <https://orcid.org/0000-0002-8335-495X>), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: <https://orcid.org/0000-0002-9101-3362>), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: <https://orcid.org/0000-0003-1413-3974>), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: <https://orcid.org/0000-0003-1458-7108>), Posit Software, PBC [cph, fnd]",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"lifecycle": {
"Package": "lifecycle",
"Version": "1.0.5",
"Source": "Repository",
"Title": "Manage the Life Cycle of your Package Functions",
"Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.",
"License": "MIT + file LICENSE",
"URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle",
"BugReports": "https://github.com/r-lib/lifecycle/issues",
"Depends": [
"R (>= 3.6)"
],
"Imports": [
"cli (>= 3.4.0)",
"rlang (>= 1.1.0)"
],
"Suggests": [
"covr",
"knitr",
"lintr (>= 3.1.0)",
"rmarkdown",
"testthat (>= 3.0.1)",
"tibble",
"tidyverse",
"tools",
"vctrs",
"withr",
"xml2"
],
"VignetteBuilder": "knitr",
"Config/Needs/website": "tidyverse/tidytemplate, usethis",
"Config/testthat/edition": "3",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"NeedsCompilation": "no",
"Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: <https://orcid.org/0000-0003-4757-117X>), Posit Software, PBC [cph, fnd]",
"Maintainer": "Lionel Henry <lionel@posit.co>",
"Repository": "CRAN"
},
"memoise": {
"Package": "memoise",
"Version": "2.0.1",
"Source": "Repository",
"Title": "'Memoisation' of Functions",
"Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))",
"Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.",
"License": "MIT + file LICENSE",
"URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise",
"BugReports": "https://github.com/r-lib/memoise/issues",
"Imports": [
"rlang (>= 0.4.10)",
"cachem"
],
"Suggests": [
"digest",
"aws.s3",
"covr",
"googleAuthR",
"googleCloudStorageR",
"httr",
"testthat"
],
"Encoding": "UTF-8",
"RoxygenNote": "7.1.2",
"NeedsCompilation": "no",
"Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]",
"Maintainer": "Winston Chang <winston@rstudio.com>",
"Repository": "CRAN"
},
"mime": {
"Package": "mime",
"Version": "0.13",
"Source": "Repository",
"Type": "Package",
"Title": "Map Filenames to MIME Types",
"Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )",
"Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.",
"Imports": [
"tools"
],
"License": "GPL",
"URL": "https://github.com/yihui/mime",
"BugReports": "https://github.com/yihui/mime/issues",
"RoxygenNote": "7.3.2",
"Encoding": "UTF-8",
"NeedsCompilation": "yes",
"Author": "Yihui Xie [aut, cre] (<https://orcid.org/0000-0003-0645-5666>, https://yihui.org), Jeffrey Horner [ctb], Beilei Bian [ctb]",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"rappdirs": {
"Package": "rappdirs",
"Version": "0.3.4",
"Source": "Repository",
"Type": "Package",
"Title": "Application Directories: Determine Where to Save Data, Caches, and Logs",
"Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )",
"Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' (<https://github.com/ActiveState/appdirs>) to R.",
"License": "MIT + file LICENSE",
"URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs",
"BugReports": "https://github.com/r-lib/rappdirs/issues",
"Depends": [
"R (>= 4.1)"
],
"Suggests": [
"covr",
"roxygen2",
"testthat (>= 3.2.0)",
"withr"
],
"Config/Needs/website": "tidyverse/tidytemplate",
"Config/testthat/edition": "3",
"Config/usethis/last-upkeep": "2025-05-05",
"Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"NeedsCompilation": "yes",
"Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: <https://orcid.org/0000-0001-6341-4639>), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: <https://ror.org/03wc8by49>)",
"Maintainer": "Hadley Wickham <hadley@posit.co>",
"Repository": "CRAN"
},
"renv": {
"Package": "renv",
"Version": "1.1.6",
"Source": "Repository",
"Type": "Package",
"Title": "Project Environments",
"Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )",
"Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.",
"License": "MIT + file LICENSE",
"URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv",
"BugReports": "https://github.com/rstudio/renv/issues",
"Imports": [
"utils"
],
"Suggests": [
"BiocManager",
"cli",
"compiler",
"covr",
"cpp11",
"curl",
"devtools",
"generics",
"gitcreds",
"jsonlite",
"jsonvalidate",
"knitr",
"miniUI",
"modules",
"packrat",
"pak",
"R6",
"remotes",
"reticulate",
"rmarkdown",
"rstudioapi",
"shiny",
"testthat",
"uuid",
"waldo",
"yaml",
"webfakes"
],
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"VignetteBuilder": "knitr",
"Config/Needs/website": "tidyverse/tidytemplate",
"Config/testthat/edition": "3",
"Config/testthat/parallel": "true",
"Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes",
"NeedsCompilation": "no",
"Author": "Kevin Ushey [aut, cre] (ORCID: <https://orcid.org/0000-0003-2880-7407>), Hadley Wickham [aut] (ORCID: <https://orcid.org/0000-0003-4757-117X>), Posit Software, PBC [cph, fnd]",
"Maintainer": "Kevin Ushey <kevin@rstudio.com>",
"Repository": "CRAN"
},
"rlang": {
"Package": "rlang",
"Version": "1.1.7",
"Source": "Repository",
"Title": "Functions for Base Types and Core R and 'Tidyverse' Features",
"Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.",
"Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )",
"License": "MIT + file LICENSE",
"ByteCompile": "true",
"Biarch": "true",
"Depends": [
"R (>= 4.0.0)"
],
"Imports": [
"utils"
],
"Suggests": [
"cli (>= 3.1.0)",
"covr",
"crayon",
"desc",
"fs",
"glue",
"knitr",
"magrittr",
"methods",
"pillar",
"pkgload",
"rmarkdown",
"stats",
"testthat (>= 3.2.0)",
"tibble",
"usethis",
"vctrs (>= 0.2.3)",
"withr"
],
"Enhances": [
"winch"
],
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang",
"BugReports": "https://github.com/r-lib/rlang/issues",
"Config/build/compilation-database": "true",
"Config/testthat/edition": "3",
"Config/Needs/website": "dplyr, tidyverse/tidytemplate",
"NeedsCompilation": "yes",
"Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]",
"Maintainer": "Lionel Henry <lionel@posit.co>",
"Repository": "CRAN"
},
"rmarkdown": {
"Package": "rmarkdown",
"Version": "2.30",
"Source": "Repository",
"Type": "Package",
"Title": "Dynamic Documents for R",
"Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )",
"Description": "Convert R Markdown documents into a variety of formats.",
"License": "GPL-3",
"URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/",
"BugReports": "https://github.com/rstudio/rmarkdown/issues",
"Depends": [
"R (>= 3.0)"
],
"Imports": [
"bslib (>= 0.2.5.1)",
"evaluate (>= 0.13)",
"fontawesome (>= 0.5.0)",
"htmltools (>= 0.5.1)",
"jquerylib",
"jsonlite",
"knitr (>= 1.43)",
"methods",
"tinytex (>= 0.31)",
"tools",
"utils",
"xfun (>= 0.36)",
"yaml (>= 2.1.19)"
],
"Suggests": [
"digest",
"dygraphs",
"fs",
"rsconnect",
"downlit (>= 0.4.0)",
"katex (>= 1.4.0)",
"sass (>= 0.4.0)",
"shiny (>= 1.6.0)",
"testthat (>= 3.0.3)",
"tibble",
"vctrs",
"cleanrmd",
"withr (>= 2.4.2)",
"xml2"
],
"VignetteBuilder": "knitr",
"Config/Needs/website": "rstudio/quillt, pkgdown",
"Config/testthat/edition": "3",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org",
"NeedsCompilation": "no",
"Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: <https://orcid.org/0000-0003-0645-5666>), Christophe Dervieux [aut] (ORCID: <https://orcid.org/0000-0003-4474-2498>), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: <https://orcid.org/0000-0003-3925-190X>), Andrew Dunning [ctb] (ORCID: <https://orcid.org/0000-0003-0464-5036>), Atsushi Yasumoto [ctb, cph] (ORCID: <https://orcid.org/0000-0002-8335-495X>, cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: <https://orcid.org/0000-0002-4958-2844>), Devon Ryan [ctb] (ORCID: <https://orcid.org/0000-0002-8549-0971>), Frederik Aust [ctb] (ORCID: <https://orcid.org/0000-0003-4900-788X>), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: <https://orcid.org/0000-0002-4064-6012>), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"sass": {
"Package": "sass",
"Version": "0.4.10",
"Source": "Repository",
"Type": "Package",
"Title": "Syntactically Awesome Style Sheets ('Sass')",
"Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.",
"Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )",
"License": "MIT + file LICENSE",
"URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass",
"BugReports": "https://github.com/rstudio/sass/issues",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.2",
"SystemRequirements": "GNU make",
"Imports": [
"fs (>= 1.2.4)",
"rlang (>= 0.4.10)",
"htmltools (>= 0.5.1)",
"R6",
"rappdirs"
],
"Suggests": [
"testthat",
"knitr",
"rmarkdown",
"withr",
"shiny",
"curl"
],
"VignetteBuilder": "knitr",
"Config/testthat/edition": "3",
"NeedsCompilation": "yes",
"Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (<https://orcid.org/0000-0003-3925-190X>), Barret Schloerke [aut] (<https://orcid.org/0000-0001-9986-114X>), Carson Sievert [aut, cre] (<https://orcid.org/0000-0002-4958-2844>), Christophe Dervieux [ctb] (<https://orcid.org/0000-0003-4474-2498>), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)",
"Maintainer": "Carson Sievert <carson@rstudio.com>",
"Repository": "CRAN"
},
"tinytex": {
"Package": "tinytex",
"Version": "0.58",
"Source": "Repository",
"Type": "Package",
"Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents",
"Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )",
"Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (<https://yihui.org/tinytex/>), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.",
"Imports": [
"xfun (>= 0.48)"
],
"Suggests": [
"testit",
"rstudioapi"
],
"License": "MIT + file LICENSE",
"URL": "https://github.com/rstudio/tinytex",
"BugReports": "https://github.com/rstudio/tinytex/issues",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"NeedsCompilation": "no",
"Author": "Yihui Xie [aut, cre, cph] (ORCID: <https://orcid.org/0000-0003-0645-5666>), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: <https://orcid.org/0000-0003-4474-2498>), Devon Ryan [ctb] (ORCID: <https://orcid.org/0000-0002-8549-0971>), Ethan Heinzen [ctb], Fernando Cagua [ctb]",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"xfun": {
"Package": "xfun",
"Version": "0.56",
"Source": "Repository",
"Type": "Package",
"Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'",
"Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )",
"Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.",
"Depends": [
"R (>= 3.2.0)"
],
"Imports": [
"grDevices",
"stats",
"tools"
],
"Suggests": [
"testit",
"parallel",
"codetools",
"methods",
"rstudioapi",
"tinytex (>= 0.30)",
"mime",
"litedown (>= 0.6)",
"commonmark",
"knitr (>= 1.50)",
"remotes",
"pak",
"curl",
"xml2",
"jsonlite",
"magick",
"yaml",
"data.table",
"qs2"
],
"License": "MIT + file LICENSE",
"URL": "https://github.com/yihui/xfun",
"BugReports": "https://github.com/yihui/xfun/issues",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"VignetteBuilder": "litedown",
"NeedsCompilation": "yes",
"Author": "Yihui Xie [aut, cre, cph] (ORCID: <https://orcid.org/0000-0003-0645-5666>, URL: https://yihui.org), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (ORCID: <https://orcid.org/0000-0002-5329-5987>), Christophe Dervieux [ctb]",
"Maintainer": "Yihui Xie <xie@yihui.name>",
"Repository": "CRAN"
},
"yaml": {
"Package": "yaml",
"Version": "2.3.12",
"Source": "Repository",
"Type": "Package",
"Title": "Methods to Convert R Data to YAML and Back",
"Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )",
"Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter (<https://pyyaml.org/wiki/LibYAML>) for R.",
"License": "BSD_3_clause + file LICENSE",
"URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/",
"BugReports": "https://github.com/r-lib/yaml/issues",
"Suggests": [
"knitr",
"rmarkdown",
"testthat (>= 3.0.0)"
],
"Config/testthat/edition": "3",
"Config/Needs/website": "tidyverse/tidytemplate",
"Encoding": "UTF-8",
"RoxygenNote": "7.3.3",
"VignetteBuilder": "knitr",
"NeedsCompilation": "yes",
"Author": "Hadley Wickham [cre] (ORCID: <https://orcid.org/0000-0003-4757-117X>), Shawn Garbett [ctb] (ORCID: <https://orcid.org/0000-0003-4079-5621>), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: <https://orcid.org/0000-0003-0645-5666>), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: <https://orcid.org/0000-0002-5613-5006>), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]",
"Maintainer": "Hadley Wickham <hadley@posit.co>",
"Repository": "CRAN"
}
}
}
+7
View File
@@ -0,0 +1,7 @@
library/
local/
cellar/
lock/
python/
sandbox/
staging/
+1403
View File
File diff suppressed because it is too large. Load diff
+20
View File
@@ -0,0 +1,20 @@
{
"bioconductor.version": null,
"external.libraries": [],
"ignored.packages": [],
"package.dependency.fields": [
"Imports",
"Depends",
"LinkingTo"
],
"ppm.enabled": null,
"ppm.ignored.urls": [],
"r.version": null,
"snapshot.dev": false,
"snapshot.type": "implicit",
"use.cache": true,
"vcs.ignore.cellar": true,
"vcs.ignore.library": true,
"vcs.ignore.local": true,
"vcs.manage.ignores": true
}
+34
View File
@@ -0,0 +1,34 @@
\documentclass{article}
\begin{document}
\section{Abstract}\label{abstract}
\section{Introduction}\label{introduction}
\section{Keyboard Designs}\label{keyboard-designs}
\section{Experiment}\label{experiment}
\subsection{Participants}\label{participants}
\subsection{Apparatus}\label{apparatus}
\subsection{Procedure}\label{procedure}
\section{Results}\label{results}
\subsection{Descriptive Statistics}\label{descriptive-statistics}
\subsubsection{Objective Measures}\label{objective-measures}
\subsubsection{Subjective Measures}\label{subjective-measures}
\subsection{Inferential Statistics}\label{inferential-statistics}
\subsubsection{Objective Measures}\label{objective-measures-1}
\subsubsection{Subjective Measures}\label{subjective-measures-1}
\section{Discussion}\label{discussion}
\end{document}
+2490 -1492
View File
File diff suppressed because it is too large. Load diff
+18 -17
View File
@@ -1,6 +1,6 @@
{ {
"name": "keeb", "name": "keeb",
"version": "0.1.0", "version": "1.0.1",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
@@ -10,24 +10,26 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^17.0.0", "@angular/animations": "^18.2.14",
"@angular/common": "^17.0.0", "@angular/common": "^18.2.14",
"@angular/compiler": "^17.0.0", "@angular/compiler": "^18.2.14",
"@angular/core": "^17.0.0", "@angular/core": "^18.2.14",
"@angular/forms": "^17.0.0", "@angular/forms": "^18.2.14",
"@angular/platform-browser": "^17.0.0", "@angular/platform-browser": "^18.2.14",
"@angular/platform-browser-dynamic": "^17.0.0", "@angular/platform-browser-dynamic": "^18.2.14",
"@angular/router": "^17.0.0", "@angular/router": "^18.2.14",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-cli": "^2.4.1",
"@tauri-apps/plugin-opener": "^2",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"zone.js": "~0.14.2", "zone.js": "~0.14.2"
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-opener": "^2"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^17.0.0", "@angular-devkit/build-angular": "^18.2.21",
"@angular/cli": "^17.0.0", "@angular/cli": "^18.2.21",
"@angular/compiler-cli": "^17.0.0", "@angular/compiler-cli": "^18.2.14",
"@tauri-apps/cli": "^2",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"jasmine-core": "~5.1.0", "jasmine-core": "~5.1.0",
"karma": "~6.4.0", "karma": "~6.4.0",
@@ -35,7 +37,6 @@
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0", "karma-jasmine-html-reporter": "~2.1.0",
"typescript": "~5.4.0", "typescript": "~5.4.0"
"@tauri-apps/cli": "^2"
} }
} }
+182 -13
View File
@@ -41,6 +41,56 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "anstream"
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
[[package]]
name = "anstyle-parse"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
"anstyle",
"once_cell_polyfill",
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.100" version = "1.0.100"
@@ -456,6 +506,39 @@ dependencies = [
"windows-link 0.2.1", "windows-link 0.2.1",
] ]
[[package]]
name = "clap"
version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_lex"
version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"
[[package]]
name = "colorchoice"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]] [[package]]
name = "combine" name = "combine"
version = "4.6.7" version = "4.6.7"
@@ -840,7 +923,7 @@ dependencies = [
"objc2 0.6.3", "objc2 0.6.3",
"objc2-app-kit", "objc2-app-kit",
"objc2-foundation 0.3.2", "objc2-foundation 0.3.2",
"windows", "windows 0.61.3",
"x11rb", "x11rb",
"xkbcommon", "xkbcommon",
"xkeysym", "xkeysym",
@@ -1750,6 +1833,12 @@ dependencies = [
"once_cell", "once_cell",
] ]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.15"
@@ -1843,7 +1932,9 @@ dependencies = [
"serde_json", "serde_json",
"tauri", "tauri",
"tauri-build", "tauri-build",
"tauri-plugin-cli",
"tauri-plugin-opener", "tauri-plugin-opener",
"windows 0.62.2",
"x11", "x11",
] ]
@@ -2433,6 +2524,12 @@ version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "once_cell_polyfill"
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]] [[package]]
name = "open" name = "open"
version = "5.3.2" version = "5.3.2"
@@ -3598,7 +3695,7 @@ dependencies = [
"tao-macros", "tao-macros",
"unicode-segmentation", "unicode-segmentation",
"url", "url",
"windows", "windows 0.61.3",
"windows-core 0.61.2", "windows-core 0.61.2",
"windows-version", "windows-version",
"x11-dl", "x11-dl",
@@ -3670,7 +3767,7 @@ dependencies = [
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"window-vibrancy", "window-vibrancy",
"windows", "windows 0.61.3",
] ]
[[package]] [[package]]
@@ -3753,6 +3850,21 @@ dependencies = [
"walkdir", "walkdir",
] ]
[[package]]
name = "tauri-plugin-cli"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28e78fb2c09a81546bcd376d34db4bda5769270d00990daa9f0d6e7ac1107e25"
dependencies = [
"clap",
"log",
"serde",
"serde_json",
"tauri",
"tauri-plugin",
"thiserror 2.0.17",
]
[[package]] [[package]]
name = "tauri-plugin-opener" name = "tauri-plugin-opener"
version = "2.5.0" version = "2.5.0"
@@ -3771,7 +3883,7 @@ dependencies = [
"tauri-plugin", "tauri-plugin",
"thiserror 2.0.17", "thiserror 2.0.17",
"url", "url",
"windows", "windows 0.61.3",
"zbus", "zbus",
] ]
@@ -3797,7 +3909,7 @@ dependencies = [
"url", "url",
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"windows", "windows 0.61.3",
] ]
[[package]] [[package]]
@@ -3823,7 +3935,7 @@ dependencies = [
"url", "url",
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"windows", "windows 0.61.3",
"wry", "wry",
] ]
@@ -4319,6 +4431,12 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "utf8parse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.18.1" version = "1.18.1"
@@ -4550,7 +4668,7 @@ checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4"
dependencies = [ dependencies = [
"webview2-com-macros", "webview2-com-macros",
"webview2-com-sys", "webview2-com-sys",
"windows", "windows 0.61.3",
"windows-core 0.61.2", "windows-core 0.61.2",
"windows-implement", "windows-implement",
"windows-interface", "windows-interface",
@@ -4574,7 +4692,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c"
dependencies = [ dependencies = [
"thiserror 2.0.17", "thiserror 2.0.17",
"windows", "windows 0.61.3",
"windows-core 0.61.2", "windows-core 0.61.2",
] ]
@@ -4630,11 +4748,23 @@ version = "0.61.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
dependencies = [ dependencies = [
"windows-collections", "windows-collections 0.2.0",
"windows-core 0.61.2", "windows-core 0.61.2",
"windows-future", "windows-future 0.2.1",
"windows-link 0.1.3", "windows-link 0.1.3",
"windows-numerics", "windows-numerics 0.2.0",
]
[[package]]
name = "windows"
version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
dependencies = [
"windows-collections 0.3.2",
"windows-core 0.62.2",
"windows-future 0.3.2",
"windows-numerics 0.3.1",
] ]
[[package]] [[package]]
@@ -4646,6 +4776,15 @@ dependencies = [
"windows-core 0.61.2", "windows-core 0.61.2",
] ]
[[package]]
name = "windows-collections"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
dependencies = [
"windows-core 0.62.2",
]
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.61.2" version = "0.61.2"
@@ -4680,7 +4819,18 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
dependencies = [ dependencies = [
"windows-core 0.61.2", "windows-core 0.61.2",
"windows-link 0.1.3", "windows-link 0.1.3",
"windows-threading", "windows-threading 0.1.0",
]
[[package]]
name = "windows-future"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
dependencies = [
"windows-core 0.62.2",
"windows-link 0.2.1",
"windows-threading 0.2.1",
] ]
[[package]] [[package]]
@@ -4727,6 +4877,16 @@ dependencies = [
"windows-link 0.1.3", "windows-link 0.1.3",
] ]
[[package]]
name = "windows-numerics"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
dependencies = [
"windows-core 0.62.2",
"windows-link 0.2.1",
]
[[package]] [[package]]
name = "windows-result" name = "windows-result"
version = "0.3.4" version = "0.3.4"
@@ -4856,6 +5016,15 @@ dependencies = [
"windows-link 0.1.3", "windows-link 0.1.3",
] ]
[[package]]
name = "windows-threading"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
dependencies = [
"windows-link 0.2.1",
]
[[package]] [[package]]
name = "windows-version" name = "windows-version"
version = "0.1.7" version = "0.1.7"
@@ -5082,7 +5251,7 @@ dependencies = [
"webkit2gtk", "webkit2gtk",
"webkit2gtk-sys", "webkit2gtk-sys",
"webview2-com", "webview2-com",
"windows", "windows 0.61.3",
"windows-core 0.61.2", "windows-core 0.61.2",
"windows-version", "windows-version",
"x11-dl", "x11-dl",
+12 -1
View File
@@ -23,9 +23,20 @@ tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
enigo = "0.6.1" enigo = "0.6.1"
x11 = { version = "2.21.0", features = ["xlib"] }
raw-window-handle = "0.6.2" raw-window-handle = "0.6.2"
[target.'cfg(target_os = "windows")'.dependencies]
windows = { version = "0.62.2", features = [
"Win32_UI_WindowsAndMessaging",
"Win32_Foundation"
] }
[target.'cfg(target_os = "linux")'.dependencies]
x11 = { version = "2.21.0", features = ["xlib"] }
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-cli = "2"
[profile.dev] [profile.dev]
incremental = true # Compile your binary in smaller steps. incremental = true # Compile your binary in smaller steps.
+14
View File
@@ -0,0 +1,14 @@
{
"identifier": "desktop-capability",
"platforms": [
"macOS",
"windows",
"linux"
],
"windows": [
"main"
],
"permissions": [
"cli:default"
]
}
+85 -7
View File
@@ -1,25 +1,102 @@
use enigo::{Direction::Click, Enigo, Key, Keyboard, Settings}; use enigo::{Direction, Enigo, Key, Keyboard, Settings};
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle, WindowHandle}; #[cfg(target_os = "linux")]
use std::ptr; use std::ptr;
use tauri::Manager; use tauri::Manager;
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
#[tauri::command] #[tauri::command]
fn greet(name: &str) -> String { fn greet(name: &str) -> String {
let mut enigo = Enigo::new(&Settings::default()).unwrap();
enigo.key(Key::Unicode('a'), Click);
format!("Hello, {}! You've been greeted from Rust!", name) format!("Hello, {}! You've been greeted from Rust!", name)
} }
#[tauri::command]
fn send_key(key: String) -> Result<(), String> {
let mut enigo = Enigo::new(&Settings::default()).map_err(|e| format!("Enigo error: {}", e))?;
if key.len() == 1 {
let ch = key.chars().next().unwrap();
// Check if uppercase letter
if ch.is_uppercase() && ch.is_alphabetic() {
// Send Shift + lowercase letter
enigo
.key(Key::Shift, Direction::Press)
.map_err(|e| format!("Shift press error: {}", e))?;
enigo
.key(
Key::Unicode(ch.to_lowercase().next().unwrap()),
Direction::Click,
)
.map_err(|e| format!("Key error: {}", e))?;
enigo
.key(Key::Shift, Direction::Release)
.map_err(|e| format!("Shift release error: {}", e))?;
} else {
// Send character as-is (lowercase or non-letter)
enigo
.key(Key::Unicode(ch), Direction::Click)
.map_err(|e| format!("Key error: {}", e))?;
}
} else {
// Special keys
match key.as_str() {
"Enter" => enigo
.key(Key::Return, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
"Space" => enigo
.key(Key::Space, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
"Backspace" => enigo
.key(Key::Backspace, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
_ => return Err("Unknown key".to_string()),
}
}
Ok(())
}
#[cfg_attr(mobile, tauri::mobile_entry_point)] #[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() { pub fn run() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_cli::init())
.setup(|app| { .setup(|app| {
let window = app.get_webview_window("main").unwrap(); let window = app.get_webview_window("main").unwrap();
#[cfg(target_os = "windows")]
{
#![allow(deprecated)]
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
use windows::Win32::Foundation::HWND;
use windows::Win32::UI::WindowsAndMessaging::{GetWindowLongPtrW, SetWindowLongPtrW, GWL_EXSTYLE, WS_EX_NOACTIVATE,};
unsafe {
if let Ok(RawWindowHandle::Win32(handle)) = window.raw_window_handle() {
let hwnd = HWND(handle.hwnd.get() as *mut core::ffi::c_void);
// Get current extended window style
let ex_style = GetWindowLongPtrW(hwnd, GWL_EXSTYLE) as u32;
// Add WS_EX_NOACTIVATE flag
let new_style = ex_style | WS_EX_NOACTIVATE.0;
SetWindowLongPtrW(hwnd, GWL_EXSTYLE, new_style as isize);
// Position window as topmost without activating
/*
SetWindowPos(
hwnd,
Some(HWND_TOPMOST),
0, 0, 0, 0,
SWP_NOACTIVATE
); */
}
}
}
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{ {
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
use x11::xlib; use x11::xlib;
// raw X11 pointers here
unsafe { unsafe {
let handle = window.raw_window_handle(); let handle = window.raw_window_handle();
if let Ok(RawWindowHandle::Xlib(h)) = handle { if let Ok(RawWindowHandle::Xlib(h)) = handle {
@@ -28,7 +105,7 @@ pub fn run() {
let hints = xlib::XAllocWMHints(); let hints = xlib::XAllocWMHints();
if !hints.is_null() { if !hints.is_null() {
(*hints).flags = xlib::InputHint; (*hints).flags = xlib::InputHint;
(*hints).input = 0; // Set input hint to False (*hints).input = 0;
xlib::XSetWMHints(display, h.window, hints); xlib::XSetWMHints(display, h.window, hints);
xlib::XFree(hints as *mut _); xlib::XFree(hints as *mut _);
} }
@@ -37,10 +114,11 @@ pub fn run() {
} }
} }
} }
Ok(()) Ok(())
}) })
.plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![greet]) .invoke_handler(tauri::generate_handler![greet, send_key])
.run(tauri::generate_context!()) .run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }
+29 -1
View File
@@ -14,13 +14,41 @@
{ {
"title": "keeb", "title": "keeb",
"width": 800, "width": 800,
"height": 600 "height": 700,
"minWidth": 800,
"minHeight": 700,
"resizable": true,
"center": true,
"alwaysOnTop": true
} }
], ],
"security": { "security": {
"csp": null "csp": null
} }
}, },
"plugins": {
"cli":{
"description": "On-Screen keyboard for Human-Computer Interface studies",
"args": [
{
"name": "order",
"short": "o",
"takesValue": true,
"multiple": true
},
{
"name": "limit",
"short": "l",
"takesValue": true
},
{
"name": "demo",
"short": "d",
"takesValue": true
}
]
}
},
"bundle": { "bundle": {
"active": true, "active": true,
"targets": "all", "targets": "all",
+53 -7
View File
@@ -1,6 +1,4 @@
.logo.angular:hover {
filter: drop-shadow(0 0 2em #e32727);
}
:root { :root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif; font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px; font-size: 16px;
@@ -33,10 +31,6 @@
transition: 0.75s; transition: 0.75s;
} }
.logo.tauri:hover {
filter: drop-shadow(0 0 2em #24c8db);
}
.row { .row {
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -109,4 +103,56 @@ button {
button:active { button:active {
background-color: #0f0f0f69; background-color: #0f0f0f69;
} }
.key-button {
background: rgb(58, 56, 56);
color: white;
}
}
.keyboard {
display: flex;
flex-direction: column;
gap: 8px;
padding: 20px;
background: #f5f5f5;
border-radius: 10px;
margin: 20px auto;
}
.keyboard-row {
display: flex;
gap: 6px;
justify-content: center;
}
.key-button {
min-width: 60px;
height: 60px;
font-size: 20px;
font-weight: bold;
border: 2px solid #ddd;
border-radius: 8px;
cursor: pointer;
transition: all 0.1s;
}
.key-button:hover {
background: #b1b1b1;
border-color: #3d3d3d;
}
.key-button:active {
background: #d0d0d0;
transform: scale(0.95);
}
.shift-key.active {
background: #4CAF50;
color: white;
border-color: #45a049;
}
.space-key {
min-width: 300px;
} }
+26 -15
View File
@@ -1,19 +1,30 @@
<main class="container"> <main class="container">
<h1>Welcome to Tauri + Angular!</h1> <!-- Layout Switcher -->
<div class="layout-controls">
<div class="row"> <button (click)="switchLayout()" class="layout-button">
<a href="https://tauri.app" target="_blank"> Switch Layout: {{ currentLayout.toString() }}
<img src="/assets/tauri.svg" class="logo tauri" alt="Tauri logo" /> </button>
</a>
<a href="https://angular.io" target="_blank">
<img src="/assets/angular.svg" class="logo angular" alt="Angular logo" />
</a>
</div> </div>
<p>Click on the logos to learn more about the frameworks</p>
<form class="row" (submit)="greet($event, greetInput.value)"> <!-- Conditional Rendering basierend auf currentLayout -->
<input #greetInput id="greet-input" placeholder="Enter a name..." /> <app-qwerty-keyboard
<button type="submit">Greet</button> *ngIf="currentLayout === Keyboards.QWERTY"
</form> [shiftActive]="shiftActive"
<p>{{ greetingMessage }}</p> (keyPressed)="handleKeyPress($event)"
(shiftToggled)="toggleShift()">
</app-qwerty-keyboard>
<app-dvorak-keyboard
*ngIf="currentLayout === Keyboards.DVORAK"
[shiftActive]="shiftActive"
(keyPressed)="handleKeyPress($event)"
(shiftToggled)="toggleShift()">
</app-dvorak-keyboard>
<app-circle-keyboard
*ngIf="currentLayout === Keyboards.CIRCLE"
[shiftActive]="shiftActive"
(keyPressed)="handleKeyPress($event)"
(shiftToggled)="toggleShift()">
</app-circle-keyboard>
</main> </main>
+53 -11
View File
@@ -1,24 +1,66 @@
import { Component } from '@angular/core'; import { Component, ViewChild, ElementRef, AfterViewInit, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterOutlet } from '@angular/router'; import { RouterOutlet } from '@angular/router';
import { invoke } from "@tauri-apps/api/core"; import { invoke } from "@tauri-apps/api/core";
import { getMatches } from '@tauri-apps/plugin-cli';
import { QwertyKeyboardComponent } from './keyboards/qwerty-keyboard.component';
import { DvorakKeyboardComponent } from './keyboards/dvorak-keyboard.component';
import { CircleKeyboardComponent } from './keyboards/circle-keyboard.component';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
standalone: true, standalone: true,
imports: [CommonModule, RouterOutlet], imports: [
CommonModule,
RouterOutlet,
QwertyKeyboardComponent,
DvorakKeyboardComponent,
CircleKeyboardComponent
],
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrl: './app.component.css' styleUrl: './app.component.css',
}) })
export class AppComponent { export class AppComponent implements OnInit {
greetingMessage = ""; Keyboards = Keyboards;
currentLayout: Keyboards = Keyboards.QWERTY;
shiftActive = false;
async ngOnInit() {
greet(event: SubmitEvent, name: string): void { const cli = await getMatches();
event.preventDefault(); }
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ @ViewChild('greetInput') inputElement!: ElementRef;
invoke<string>("greet", { name }).then((text) => {
this.greetingMessage = text; toggleShift(): void {
}); this.shiftActive = !this.shiftActive;
}
switchLayout(): void {
if (this.currentLayout === Keyboards.QWERTY){
this.currentLayout = Keyboards.DVORAK;
} else if (this.currentLayout === Keyboards.DVORAK){
this.currentLayout = Keyboards.CIRCLE;
} else if (this.currentLayout === Keyboards.CIRCLE){
this.currentLayout = Keyboards.QWERTY;
}
}
async handleKeyPress(key: string): Promise<void> {
let finalKey = key;
if (key.length === 1) {
finalKey = this.shiftActive ? key.toUpperCase() : key.toLowerCase();
}
await invoke("send_key", { key: finalKey });
if (this.shiftActive && key.length === 1) {
this.shiftActive = false;
}
} }
} }
enum Keyboards{
QWERTY,
DVORAK,
CIRCLE
}
@@ -0,0 +1,161 @@
.circle-keyboard-container {
position: relative;
width: 400px;
height: 400px;
margin: 50px auto;
background: #f5f5f5;
}
/* Center Button Container */
.center-button-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 140px;
height: 140px;
z-index: 1;
}
/* Center Button Sections */
.center-section {
position: absolute;
background: white;
color: #0f0f0f;
font-size: 20px;
font-weight: bold;
cursor: pointer;
transition: background 0.2s;
border: 2px solid #ddd;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* Top-left: Backspace (triangle) */
.top-left{
top: 0;
left: 0;
width: 70px;
height: 70px;
border-radius: 70px 0 0 0;
}
/* Top-right: Enter*/
.top-right {
top: 0;
right: 0;
width: 70px;
height: 70px;
border-radius: 0 70px 0 0;
}
/* Bottom: Space */
.bottom-left {
bottom: 0;
left: 0;
width: 70px;
height: 70px;
border-radius: 0 0 0 70px;
}
.bottom-left.active {
background: #4CAF50 !important;
color: white;
border-color: #45a049;
}
.bottom-right {
bottom: 0;
right: 0;
width: 70px;
height: 70px;
border-radius: 0 0 70px 0;
}
.middle-left {
top: 50%;
left: 50%;
transform: translate(-100%, -50%);
width: 30px;
height: 55px;
border-radius: 35px 0 0 35px;
z-index: 15;
}
.middle-right {
top: 50%;
left: 50%;
transform: translate(0%, -50%);
width: 30px;
height: 55px;
border-radius: 0 35px 35px 0;
z-index: 15;
}
/* 8 Circle Buttons */
.circle-button {
position: absolute;
top: 50%;
left: 50%;
width: 70px;
height: 70px;
margin: -35px 0 0 -35px;
border-radius: 50%;
border: 2px solid #ddd;
background: white;
color: #0f0f0f;
font-size: 24px;
font-weight: bold;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
box-shadow: 0 2px 2px rgba(0,0,0,0.2);
z-index: 1;
}
.second-ring {
width: 50px;
height: 50px;
font-size: 20px;
font-weight: normal;
margin: -25px 0 0 -25px;
}
.third-ring {
width: 40px;
height: 40px;
font-size: 18px;
font-weight: normal;
margin: -20px 0 0 -20px;
}
.fourth-ring {
width: 30px;
height: 30px;
font-size: 16px;
font-weight: lighter;
margin: -20px 0 0 -20px;
}
.circle-button:hover, .center-section:hover {
background: #b1b1b1;
border-color: #3d3d3d;
}
.circle-button:active, .center-section:active {
background: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
.center-section {
background: rgb(58, 56, 56);
color: white;
}
.circle-button {
background: rgb(58, 56, 56);
color: white;
}
}
@@ -0,0 +1,104 @@
import { Component, Output, EventEmitter, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
//TODO: Second and fourth ring of keys
@Component({
selector: 'app-circle-keyboard',
standalone: true,
imports: [CommonModule],
template: `
<div class="circle-keyboard-container">
<!-- Center Button - Large with 3 sections -->
<div class="center-button-container">
<!-- Top half split: Backspace left, Enter right -->
<button class="center-section top-left"
(click)="keyPressed.emit('Backspace')"
title="Backspace">
⌫
</button>
<button class="center-section top-right"
(click)="keyPressed.emit('Enter')"
title="Enter">
↵
</button>
<!-- Bottom half: Space -->
<button class="center-section bottom-right"
(click)="keyPressed.emit('Space')"
title="Space">
␣
</button>
<button (click)="shiftToggled.emit()"
[class.active]="shiftActive"
class="center-section bottom-left">
⇧
</button>
<button class="center-section middle-left"
(click)="keyPressed.emit('.')"
title="Period">
.
</button>
<button class="center-section middle-right"
(click)="keyPressed.emit(',')"
title="Comma">
,
</button>
</div>
<!-- 8 Surrounding Buttons in Circle -->
<button *ngFor="let key of circleKeysFirst; let i = index"
class="circle-button"
[style.transform]="getCirclePositionFromTop(i, 110)"
(click)="keyPressed.emit(key)">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
<button *ngFor="let key of circleKeysSecond; let i = index"
class="circle-button second-ring"
[style.transform]="getCirclePositionFromTop(i, 150, 22.5)"
(click)="keyPressed.emit(key)">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
<button *ngFor="let key of circleKeysThird; let i = index"
class="circle-button third-ring"
[style.transform]="getCirclePositionFromTop(i, 170)"
(click)="keyPressed.emit(key)">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
<button class="circle-button fourth-ring"
[style.transform]="getCirclePositionFromTop(0, 182, -12)"
(click)="keyPressed.emit(circleKeysFourth[0])">
{{ shiftActive ? circleKeysFourth[0] : circleKeysFourth[0].toLowerCase() }}
</button>
<button class="circle-button fourth-ring"
[style.transform]="getCirclePositionFromTop(0, 182, 14)"
(click)="keyPressed.emit(circleKeysFourth[1])">
{{ shiftActive ? circleKeysFourth[1] : circleKeysFourth[1].toLowerCase() }}
</button>
</div>
`,
styleUrl: './circle-keyboard.component.css'
})
export class CircleKeyboardComponent {
@Input() shiftActive = false;
@Output() keyPressed = new EventEmitter<string>();
@Output() shiftToggled = new EventEmitter<void>();
// 8 keys arranged in circle
circleKeysFirst = ['E', 'T', 'A', 'O', 'N', 'I', 'H', 'S'];
circleKeysSecond = ['R', 'L', 'D', 'U', 'C', 'M', 'W', 'Y'];
circleKeysThird = ['F', 'G', 'P', 'B', 'V', 'K', 'J', 'X'];
circleKeysFourth = ['Q', 'Z'];
// Calculate position for each button in circle
getCirclePositionFromTop(index: number, radius: number, offset: number = 0): string {
const angle = ((index * 45) - 90) + offset; // Start from top (0°), 45° apart
const angleRad = (angle * Math.PI) / 180;
const x = Math.cos(angleRad) * radius;
const y = Math.sin(angleRad) * radius;
return `translate(${x}px, ${y}px)`;
}
}
@@ -0,0 +1,68 @@
import { Component, Output, EventEmitter, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-dvorak-keyboard',
standalone: true,
imports: [CommonModule],
template: `
<div class="keyboard">
<div class="keyboard-row">
<button *ngFor="let key of row1"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row">
<button *ngFor="let key of row2"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row">
<button *ngFor="let key of row3"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row special-keys">
<button (click)="shiftToggled.emit()"
[class.active]="shiftActive"
class="key-button shift-key">
⇧ Shift
</button>
<button (click)="keyPressed.emit('Space')"
class="key-button space-key">
Leertaste
</button>
<button (click)="keyPressed.emit('Backspace')"
class="key-button">
⌫ Delete
</button>
<button (click)="keyPressed.emit('Enter')"
class="key-button">
↵ Enter
</button>
</div>
</div>
`,
styleUrl: '../app.component.css'
})
export class DvorakKeyboardComponent {
@Input() shiftActive = false;
@Output() keyPressed = new EventEmitter<string>();
@Output() shiftToggled = new EventEmitter<void>();
row1 = [',', '.', 'P', 'Y', 'F', 'G', 'C', 'R', 'L'];
row2 = ['A', 'O', 'E', 'U', 'I', 'D', 'H', 'T', 'N', 'S'];
row3 = ['Q', 'J', 'K', 'X', 'B', 'M', 'W', 'V', 'Z'];
}
@@ -0,0 +1,68 @@
import { Component, Output, EventEmitter, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-qwerty-keyboard',
standalone: true,
imports: [CommonModule],
template: `
<div class="keyboard">
<div class="keyboard-row">
<button *ngFor="let key of row1"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row">
<button *ngFor="let key of row2"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row">
<button *ngFor="let key of row3"
(click)="keyPressed.emit(key)"
class="key-button">
{{ shiftActive ? key : key.toLowerCase() }}
</button>
</div>
<div class="keyboard-row special-keys">
<button (click)="shiftToggled.emit()"
[class.active]="shiftActive"
class="key-button shift-key">
⇧ Shift
</button>
<button (click)="keyPressed.emit('Space')"
class="key-button space-key">
Leertaste
</button>
<button (click)="keyPressed.emit('Backspace')"
class="key-button">
⌫ Delete
</button>
<button (click)="keyPressed.emit('Enter')"
class="key-button">
↵ Enter
</button>
</div>
</div>
`,
styleUrl: '../app.component.css'
})
export class QwertyKeyboardComponent {
@Input() shiftActive = false;
@Output() keyPressed = new EventEmitter<string>();
@Output() shiftToggled = new EventEmitter<void>();
row1 = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'];
row2 = ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'];
row3 = ['Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.'];
}