added live keymaps. Needs some styling but fully functional

This commit is contained in:
Christopher Sarmiento 2020-07-27 20:59:06 -04:00
parent 56eb72ff58
commit a8b083dde0
7 changed files with 652 additions and 122 deletions

1
.prettierignore Normal file
View file

@ -0,0 +1 @@
layouts.js

View file

@ -1,7 +1,7 @@
@import url("https://fonts.googleapis.com/css?family=Roboto+Mono&display=swap");
:root {
--roundness: .25rem;
--roundness: 0.25rem;
}
::placeholder {
@ -23,9 +23,9 @@ input {
outline: none;
border: none;
border-radius: var(--roundness);
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
color: var(--text-color);
padding: .5rem;
padding: 0.5rem;
font-size: 1rem;
line-height: 1rem;
font-family: "Roboto Mono";
@ -52,7 +52,7 @@ input[type="color"]::-webkit-color-swatch {
.colorPicker {
text-align: center;
will-change: transform;
transition: transform .2s ease-in-out;
transition: transform 0.2s ease-in-out;
overflow: hidden;
border-radius: var(--roundness);
@ -105,7 +105,7 @@ html {
/* Handle */
::-webkit-scrollbar-thumb {
background: var(--sub-color);
transition: .25s;
transition: 0.25s;
border-radius: 2px !important;
}
@ -127,7 +127,7 @@ a:hover {
position: fixed;
background: var(--main-color);
color: var(--bg-color);
padding: .5rem 1rem;
padding: 0.5rem 1rem;
border-radius: var(--roundness);
left: 50%;
z-index: 9999;
@ -186,7 +186,8 @@ a:hover {
display: grid;
gap: 2rem;
grid-template-rows: 3rem auto;
grid-template-areas: "title buttons"
grid-template-areas:
"title buttons"
"tables tables";
grid-template-columns: 1fr 1fr;
@ -199,7 +200,7 @@ a:hover {
.title {
font-size: 2rem;
line-height: 2rem;
margin-bottom: .5rem;
margin-bottom: 0.5rem;
}
.tables {
@ -208,7 +209,7 @@ a:hover {
gap: 1rem;
grid-template-columns: 1fr 1fr;
margin-bottom: 2rem;
font-size: .8rem;
font-size: 0.8rem;
.titleAndTable {
display: grid;
@ -243,7 +244,7 @@ a:hover {
}
td {
padding: .25rem .5rem;
padding: 0.25rem 0.5rem;
&.me {
color: var(--main-color);
@ -253,7 +254,7 @@ a:hover {
thead {
color: var(--sub-color);
font-size: .75rem;
font-size: 0.75rem;
td {
background: var(--bg-color);
@ -267,7 +268,7 @@ a:hover {
color: var(--text-color);
tr:nth-child(odd) td {
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
}
}
@ -302,7 +303,6 @@ a:hover {
}
}
#tagsWrapper {
width: 100%;
height: 100%;
@ -380,7 +380,6 @@ a:hover {
}
}
#versionHistoryWrapper {
width: 100%;
height: 100%;
@ -416,7 +415,8 @@ a:hover {
.release {
display: grid;
grid-template-areas: "title date"
grid-template-areas:
"title date"
"body body";
.title {
@ -531,7 +531,7 @@ a:hover {
color: var(--sub-color);
.fas {
margin-right: .5rem;
margin-right: 0.5rem;
}
&:last-child {
@ -576,7 +576,7 @@ a:hover {
background: black;
/* background: #0f0f0f; */
/* background: red; */
// transition: 1s linear;
// transition: 1s linear;
z-index: -1;
}
@ -662,15 +662,14 @@ a:hover {
}
&.block {
width: .7em;
width: 0.7em;
margin-left: 0.25em;
border-radius: 0;
z-index: -1;
}
&.outline {
@extend #caret,
.block;
@extend #caret, .block;
background: transparent;
border: 1px solid var(--caret-color);
}
@ -708,7 +707,6 @@ a:hover {
}
@keyframes caretFlash {
0%,
100% {
opacity: 0;
@ -725,7 +723,7 @@ a:hover {
color: var(--sub-color);
display: grid;
grid-auto-flow: column;
gap: .5rem;
gap: 0.5rem;
// margin-bottom: -0.4rem;
width: fit-content;
width: -moz-fit-content;
@ -736,15 +734,15 @@ a:hover {
position: relative;
&::after {
transition: .25s;
width: .5rem;
height: .5rem;
transition: 0.25s;
width: 0.5rem;
height: 0.5rem;
content: "";
position: absolute;
background: var(--main-color);
border-radius: 1rem;
top: .25rem;
right: .25rem;
top: 0.25rem;
right: 0.25rem;
border: 2px solid var(--bg-color);
}
@ -766,10 +764,10 @@ a:hover {
}
.text {
font-size: .65rem;
line-height: .65rem;
font-size: 0.65rem;
line-height: 0.65rem;
align-self: center;
margin-left: .25rem;
margin-left: 0.25rem;
}
&:hover {
@ -798,8 +796,7 @@ a:hover {
}
#top {
grid-template-areas:
"logo menu config";
grid-template-areas: "logo menu config";
line-height: 2.3rem;
font-size: 2.3rem;
/* text-align: center; */
@ -827,7 +824,7 @@ a:hover {
.bottom {
margin-left: -0.15rem;
color: var(--main-color);
transition: .25s;
transition: 0.25s;
cursor: pointer;
}
}
@ -927,12 +924,12 @@ key {
color: var(--bg-color);
background-color: var(--sub-color);
/* font-weight: bold; */
padding: .1rem .3rem;
padding: 0.1rem 0.3rem;
margin: 3px 0;
border-radius: 0.1rem;
display: inline-block;
font-size: .7rem;
line-height: .7rem;
font-size: 0.7rem;
line-height: 0.7rem;
}
#bottom {
@ -949,7 +946,7 @@ key {
.version {
opacity: 0;
transition: .25s;
transition: 0.25s;
&:hover {
cursor: pointer;
@ -993,7 +990,7 @@ key {
.stats {
display: grid;
column-gap: .5rem;
column-gap: 0.5rem;
justify-content: center;
align-items: center;
grid-template-areas:
@ -1004,9 +1001,8 @@ key {
"leaderboards leaderboards"
"testType infoAndTags";
.group {
margin-bottom: .5rem;
margin-bottom: 0.5rem;
.top {
color: var(--sub-color);
@ -1072,7 +1068,7 @@ key {
.infoAndTags {
display: grid;
gap: .5rem;
gap: 0.5rem;
align-self: baseline;
grid-area: infoAndTags;
color: var(--sub-color);
@ -1095,21 +1091,21 @@ key {
font-size: 3rem;
line-height: 3rem;
display: flex;
margin-top: -.5rem;
margin-top: -0.5rem;
.crownWrapper {
width: 1.7rem;
overflow: hidden;
height: 1.7rem;
margin-left: .5rem;
margin-top: .98rem;
margin-left: 0.5rem;
margin-top: 0.98rem;
.crown {
font-size: .7rem;
font-size: 0.7rem;
line-height: 1.7rem;
background: var(--main-color);
color: var(--bg-color);
border-radius: .6rem;
border-radius: 0.6rem;
text-align: center;
align-self: center;
width: 1.7rem;
@ -1142,7 +1138,6 @@ key {
}
}
#wordsInput {
height: 0;
padding: 0;
@ -1154,7 +1149,7 @@ key {
#wordsTitle {
color: var(--sub-color);
margin-left: .25rem;
margin-left: 0.25rem;
margin-top: 1rem;
display: none;
}
@ -1212,7 +1207,6 @@ key {
}
}
#words.flipped.colorfulMode .word.error,
#words.colorfulMode .word.error {
border-bottom: 2px solid var(--colorful-error-color);
@ -1250,7 +1244,6 @@ key {
}
}
#middle {
.pageTest {
#testModesNotice {
@ -1262,11 +1255,11 @@ key {
margin-bottom: 1.25rem;
height: 1rem;
line-height: 1rem;
transition: .125s;
transition: 0.125s;
justify-content: center;
.fas {
margin-right: .5rem;
margin-right: 0.5rem;
}
}
}
@ -1283,7 +1276,7 @@ key {
}
.word {
margin: .25rem;
margin: 0.25rem;
color: var(--sub-color);
display: flex;
// transition: 0.25s;
@ -1298,13 +1291,13 @@ key {
background: var(--sub-color);
color: var(--bg-color);
/* background: red; */
padding: .5rem;
padding: 0.5rem;
/* left: .5rem; */
margin-left: -.5rem;
margin-top: -.5rem;
margin-left: -0.5rem;
margin-top: -0.5rem;
border-radius: var(--roundness);
// box-shadow: 0 0 10px rgba(0,0,0,.25);
transition: .25s;
transition: 0.25s;
text-shadow: none;
}
}
@ -1312,19 +1305,19 @@ key {
#words.size125 .word {
line-height: 1.25rem;
font-size: 1.25rem;
margin: .31rem;
margin: 0.31rem;
}
#words.size15 .word {
line-height: 1.5rem;
font-size: 1.5rem;
margin: .37rem;
margin: 0.37rem;
}
#words.size2 .word {
line-height: 2rem;
font-size: 2rem;
margin: .5rem;
margin: 0.5rem;
}
.word.error {
@ -1332,11 +1325,10 @@ key {
border-bottom: 2px solid var(--error-color);
text-shadow: 1px 0px 0px var(--bg-color),
// 2px 0px 0px var(--bg-color),
-1px 0px 0px var(--bg-color),
-1px 0px 0px var(--bg-color),
// -2px 0px 0px var(--bg-color),
0px 1px 0px var(--bg-color),
1px 1px 0px var(--bg-color),
-1px 1px 0px var(--bg-color);
0px 1px 0px var(--bg-color),
1px 1px 0px var(--bg-color), -1px 1px 0px var(--bg-color);
}
// .word letter {
@ -1380,11 +1372,12 @@ key {
.side {
display: grid;
gap: .5rem;
gap: 0.5rem;
justify-content: center;
&.login {
grid-template-areas: "title forgotButton"
grid-template-areas:
"title forgotButton"
"form form";
.title {
@ -1393,15 +1386,15 @@ key {
#forgotPasswordButton {
grid-area: forgotButton;
font-size: .5rem;
line-height: .5rem;
font-size: 0.5rem;
line-height: 0.5rem;
height: fit-content;
align-self: center;
justify-self: right;
padding: .25rem 0;
padding: 0.25rem 0;
color: var(--sub-color);
cursor: pointer;
transition: .25s;
transition: 0.25s;
&:hover {
color: var(--main-color);
@ -1424,18 +1417,18 @@ key {
height: 0;
display: none;
&~.customCheckbox {
& ~ .customCheckbox {
width: 12px;
height: 12px;
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
border-radius: 2px;
box-shadow: 0 0 0 4px rgba(0, 0, 0, .1);
box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1);
display: inline-block;
margin: 0 .5rem 0 .25rem;
transition: .25s;
margin: 0 0.5rem 0 0.25rem;
transition: 0.25s;
}
&:checked~.customCheckbox {
&:checked ~ .customCheckbox {
background: var(--main-color);
}
}
@ -1446,7 +1439,7 @@ key {
form {
display: grid;
gap: .5rem;
gap: 0.5rem;
width: 100%;
}
@ -1457,7 +1450,7 @@ key {
font-size: 2rem;
transform: translate(-50%, -50%);
color: var(--main-color);
transition: .25s;
transition: 0.25s;
}
}
@ -1467,7 +1460,7 @@ key {
.section {
display: grid;
gap: .5rem;
gap: 0.5rem;
h1 {
font-size: 1rem;
@ -1507,7 +1500,8 @@ key {
.section {
display: grid;
// gap: .5rem;
grid-template-areas: "title title"
grid-template-areas:
"title title"
"text buttons";
grid-template-columns: 2fr 1fr;
column-gap: 2rem;
@ -1516,7 +1510,7 @@ key {
&.customTheme {
grid-template-columns: 1fr 1fr 1fr 1fr;
justify-items: stretch;
gap: .5rem 2rem;
gap: 0.5rem 2rem;
& p {
grid-area: unset;
@ -1552,7 +1546,7 @@ key {
display: grid;
grid-auto-flow: column;
grid-auto-columns: 1fr;
gap: .5rem;
gap: 0.5rem;
grid-area: buttons;
}
@ -1592,7 +1586,7 @@ key {
.tagsList {
display: grid;
gap: .5rem;
gap: 0.5rem;
.tag {
display: grid;
@ -1631,14 +1625,14 @@ key {
}
.addTagButton {
margin-top: .5rem;
margin-top: 0.5rem;
color: var(--text-color);
cursor: pointer;
transition: .25s;
padding: .2rem .5rem;
transition: 0.25s;
padding: 0.2rem 0.5rem;
border-radius: var(--roundness);
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
text-align: center;
-webkit-user-select: none;
display: grid;
@ -1668,10 +1662,11 @@ key {
&.languages,
&.layouts {
grid-template-columns: 1fr;
grid-template-areas: "title"
grid-template-areas:
"title"
"tabs"
"buttons";
gap: .5rem;
gap: 0.5rem;
.tabs {
grid-area: tabs;
@ -1681,7 +1676,7 @@ key {
.tab {
will-change: color;
transition: .2s ease-in-out color;
transition: 0.2s ease-in-out color;
outline: 0;
cursor: pointer;
padding: 0;
@ -1693,7 +1688,7 @@ key {
font-family: "Roboto Mono";
&:first-child {
margin-right: .5rem;
margin-right: 0.5rem;
}
&.active,
@ -1708,7 +1703,7 @@ key {
grid-auto-flow: dense;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
gap: .5rem;
gap: 0.5rem;
}
}
}
@ -1744,10 +1739,10 @@ key {
// background: var(--sub-color);
color: var(--sub-color);
width: fit-content;
padding: .5rem;
padding: 0.5rem;
border-radius: var(--roundness);
cursor: pointer;
transition: .25s;
transition: 0.25s;
float: right;
&:hover {
@ -1755,7 +1750,7 @@ key {
}
.fas {
margin-right: .5rem;
margin-right: 0.5rem;
}
}
@ -1794,14 +1789,14 @@ key {
&.history {
.loadMoreButton {
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
color: var(--text-color);
text-align: center;
padding: .5rem;
padding: 0.5rem;
border-radius: var(--roundness);
cursor: pointer;
-webkit-transition: .25s;
transition: .25s;
-webkit-transition: 0.25s;
transition: 0.25s;
-webkit-user-select: none;
display: -ms-grid;
display: grid;
@ -1849,12 +1844,12 @@ key {
color: var(--text-color);
td {
padding: .5rem .25rem;
padding: 0.5rem 0.25rem;
}
thead {
color: var(--sub-color);
font-size: .75rem;
font-size: 0.75rem;
}
tbody tr:nth-child(odd) td {
@ -1862,12 +1857,12 @@ key {
}
td.infoIcons span {
margin: 0 .1rem;
margin: 0 0.1rem;
}
}
#resultEditTags {
transition: .25s;
transition: 0.25s;
}
#resultEditTags:hover {
@ -1887,7 +1882,7 @@ key {
height: fit-content;
height: -moz-fit-content;
display: grid;
gap: .25rem;
gap: 0.25rem;
color: var(--sub-color);
line-height: 1rem;
font-size: 1rem;
@ -1899,13 +1894,13 @@ key {
gap: 1rem;
.button {
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
color: var(--text-color);
text-align: center;
padding: .5rem;
padding: 0.5rem;
border-radius: var(--roundness);
cursor: pointer;
transition: .25s;
transition: 0.25s;
-webkit-user-select: none;
display: grid;
align-content: center;
@ -1934,7 +1929,7 @@ key {
position: fixed;
font-size: 3rem;
color: var(--sub-color);
opacity: .25;
opacity: 0.25;
z-index: -1;
&.tl {
@ -1969,11 +1964,11 @@ key {
.button {
color: var(--text-color);
cursor: pointer;
transition: .25s;
padding: .4rem;
transition: 0.25s;
padding: 0.4rem;
border-radius: var(--roundness);
background: rgba(0, 0, 0, .1);
background: rgba(0, 0, 0, 0.1);
text-align: center;
-webkit-user-select: none;
// display: grid;
@ -1984,7 +1979,7 @@ key {
.fas,
.far {
margin-right: .5rem;
margin-right: 0.5rem;
}
&.active {
@ -2035,20 +2030,20 @@ key {
}
@media only screen and (max-width: 800px) {
#centerContent {
#top {
grid-template-areas: "logo config"
grid-template-areas:
"logo config"
"menu config";
}
#menu {
gap: .5rem;
font-size: .8rem;
line-height: .8rem;
gap: 0.5rem;
font-size: 0.8rem;
line-height: 0.8rem;
.icon-button {
padding: .25rem;
padding: 0.25rem;
}
}
}
@ -2057,10 +2052,8 @@ key {
#commandLineInput {
width: 500px !important;
}
}
@media only screen and (max-width: 650px) {
.pageSettings .section {
grid-template-columns: 1fr;
@ -2078,4 +2071,65 @@ key {
#commandLineInput {
width: 400px !important;
}
}
}
.keymap {
display: grid;
grid-template-rows: 1fr 1fr 1fr 1fr;
justify-content: center;
white-space: nowrap;
height: 140px;
}
.row {
height: 2rem;
}
.keymap-key {
display: flex;
background-color: var(--bg-color);
color: var(--sub-color);
border-radius: 0.25rem;
border: 0.1rem solid var(--sub-color);
text-align: center;
justify-content: center;
align-items: center;
margin: 0.1rem;
}
.hidden-key {
opacity: 0;
}
.r1 {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 2fr;
opacity: 0;
}
.r2 {
display: grid;
grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1.5fr;
}
.r3 {
display: grid;
grid-template-columns: 1.75fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1.75fr;
}
.r4 {
display: grid;
grid-template-columns: 2.25fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 2.75fr;
}
.r5 {
display: grid;
grid-template-columns: 1.25fr 1.25fr 1.25fr 6.25fr 1.25fr 1.25fr 1.25fr 1.25fr;
}
.active-key {
color: var(--bg-color);
background-color: var(--main-color);
border-radius: 0.25rem;
border: 0.1rem solid var(--main-color);
}

View file

@ -700,6 +700,204 @@
<div id="timerNumber">60</div>
<div id="words" class=""></div>
<div id="liveWpm">123</div>
<div class="keymap">
<div class="row r1">
<div class="keymap-key inactive hidden-key">
<span class="letter">`</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key1">
<span class="letter">1</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key2">
<span class="letter">2</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key3">
<span class="letter">3</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key4">
<span class="letter">4</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key5">
<span class="letter">5</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key6">
<span class="letter">6</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key7">
<span class="letter">7</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key8">
<span class="letter">8</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key9">
<span class="letter">9</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key0">
<span class="letter">0</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key-">
<span class="letter">-</span>
</div>
<div class="keymap-key inactive hidden-key" id="Key=">
<span class="letter">=</span>
</div>
<div class="keymap-key inactive hidden-key">
<span class="letter">delete</span>
</div>
</div>
<div class="row r2">
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key" id="KeyQ">
<span class="letter">q</span>
</div>
<div class="keymap-key" id="KeyW">
<span class="letter">w</span>
</div>
<div class="keymap-key" id="KeyE">
<span class="letter">e</span>
</div>
<div class="keymap-key" id="KeyR">
<span class="letter">r</span>
</div>
<div class="keymap-key" id="KeyT">
<span class="letter">t</span>
</div>
<div class="keymap-key" id="KeyY">
<span class="letter">y</span>
</div>
<div class="keymap-key" id="KeyU">
<span class="letter">u</span>
</div>
<div class="keymap-key" id="KeyI">
<span class="letter">i</span>
</div>
<div class="keymap-key" id="KeyO">
<span class="letter">o</span>
</div>
<div class="keymap-key" id="KeyP">
<span class="letter">p</span>
</div>
<div class="keymap-key" id="KeyLeftBracket">
<span class="letter">[</span>
</div>
<div class="keymap-key" id="KeyRightBracket">
<span class="letter">]</span>
</div>
<div class="keymap-key hidden-key" id="Backslash">
<span class="letter">\</span>
</div>
</div>
<div class="row r3">
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key" id="KeyA">
<span class="letter">a</span>
</div>
<div class="keymap-key" id="KeyS">
<span class="letter">s</span>
</div>
<div class="keymap-key" id="KeyD">
<span class="letter">d</span>
</div>
<div class="keymap-key" id="KeyF">
<span class="letter">f</span>
</div>
<div class="keymap-key" id="KeyG">
<span class="letter">g</span>
</div>
<div class="keymap-key" id="KeyH">
<span class="letter">h</span>
</div>
<div class="keymap-key" id="KeyJ">
<span class="letter">j</span>
</div>
<div class="keymap-key" id="KeyK">
<span class="letter">k</span>
</div>
<div class="keymap-key" id="KeyL">
<span class="letter">l</span>
</div>
<div class="keymap-key" id="KeySemicolon">
<span class="letter">;</span>
</div>
<div class="keymap-key" id="KeyQuote">
<span class="letter">'</span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
</div>
<div class="row r4">
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key" id="KeyZ">
<span class="letter">z</span>
</div>
<div class="keymap-key" id="KeyX">
<span class="letter">x</span>
</div>
<div class="keymap-key" id="KeyC">
<span class="letter">c</span>
</div>
<div class="keymap-key" id="KeyV">
<span class="letter">v</span>
</div>
<div class="keymap-key" id="KeyB">
<span class="letter">b</span>
</div>
<div class="keymap-key" id="KeyN">
<span class="letter">n</span>
</div>
<div class="keymap-key" id="KeyM">
<span class="letter">m</span>
</div>
<div class="keymap-key" id="KeyComma">
<span class="letter">,</span>
</div>
<div class="keymap-key" id="KeyPeriod">
<span class="letter">.</span>
</div>
<div class="keymap-key" id="KeySlash">
<span class="letter">/</span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
</div>
<div class="row r5">
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key" id="KeySpace">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
<div class="keymap-key hidden-key">
<span class="letter"></span>
</div>
</div>
</div>
<div class="buttons">
<div id="restartTestButton" aria-label="Restart test" data-balloon-pos="down" class="" tabindex="0"
onclick="this.blur();"><i class="fas fa-fw fa-redo-alt"></i></div>
@ -873,7 +1071,7 @@
</div>
</div>
<div class="section layouts">
<h1>layout override</h1>
<h1>layout</h1>
<div class="buttons">
</div>
</div>
@ -1077,6 +1275,19 @@
<div class="button off" tabindex="0" onclick="this.blur();">hide</div>
</div>
</div>
<div class="section keymap-toggle">
<h1>keymap</h1>
<div class="text">Displays your current layout while taking a test.</div>
<div class="buttons">
<div class="button on" tabindex="0" onclick="this.blur();">show</div>
<div class="button off" tabindex="0" onclick="this.blur();">hide</div>
</div>
</div>
<div class="section keymap-layouts hidden">
<h1>keymap layout</h1>
<div class="buttons">
</div>
</div>
<div class="section keyTips">
<h1>key tips</h1>
<div class="text">Shows the keybind tips at the bottom of the page.</div>

View file

@ -73,6 +73,29 @@ let commands = {
saveConfigToCookie();
},
},
{
id: "toggleKeymap",
display: "Toggle keymap display",
exec: () => {
config.keymap = !config.keymap;
console.log(`keymap ${config.keymap}`);
if (config.keymap) {
showKeymap();
} else {
hideKeymap();
}
saveConfigToCookie();
},
},
{
id: "changeKeymapLayout",
display: "Change keymap layout...",
subgroup: true,
exec: () => {
currentCommands.push(commandsKeymapLayouts);
showCommandLine();
},
},
{
id: "toggleTimerBar",
display: "Toggle timer display",
@ -686,6 +709,33 @@ if (Object.keys(layouts).length > 0) {
});
}
let commandsKeymapLayouts = {
title: "Change keymap layout...",
list: [
{
id: "couldnotload",
display: "Could not load the layouts list :(",
},
],
};
if (Object.keys(layouts).length > 0) {
commandsKeymapLayouts.list = [];
Object.keys(layouts).forEach((layout) => {
if (layout.toString() != "default") {
commandsKeymapLayouts.list.push({
id: "changeLayout" + capitalizeFirstLetter(layout),
display: layout.replace("_", " "),
exec: () => {
changeKeymapLayout(layout);
restartTest();
saveConfigToCookie();
},
});
}
});
}
$("#commandLine input").keyup((e) => {
if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13) return;
updateSuggestedCommands();

View file

@ -522,8 +522,24 @@ function showWords() {
.css("overflow", "hidden");
}
if ($(".active-key") != undefined) {
$(".active-key").removeClass("active-key");
}
var currentKey = wordsList[currentWordIndex]
.substring(currentInput.length, currentInput.length + 1)
.toString()
.toUpperCase();
var highlightKey = `#Key${currentKey}`;
$(highlightKey).addClass("active-key");
updateActiveElement();
updateCaretPosition();
if (config.keymap) {
changeKeymapLayout(config.keymapLayout);
}
}
function updateActiveElement() {
@ -544,6 +560,7 @@ function updateActiveElement() {
// activeWordTop = $("#words .word.active").position().top;
activeWordTop = document.querySelector("#words .active").offsetTop;
updateHighlightedKey();
} catch (e) {}
}
@ -805,6 +822,67 @@ function startCaretAnimation() {
$("#caret").css("animation-name", "caretFlash");
}
function hideKeymap() {
$(".keymap").addClass("hidden");
}
function showKeymap() {
$(".keymap").removeClass("hidden");
}
function updateHighlightedKey() {
if ($(".active-key") != undefined) {
$(".active-key").removeClass("active-key");
}
var currentKey = wordsList[currentWordIndex]
.substring(currentInput.length, currentInput.length + 1)
.toString()
.toUpperCase();
switch (currentKey) {
case "\\":
case "|":
var highlightKey = "#KeyBackslash";
break;
case "}":
case "]":
var highlightKey = "#KeyRightBracket";
break;
case "{":
case "[":
var highlightKey = "#KeyLeftBracket";
break;
case '"':
case "'":
var highlightKey = "#KeyQuote";
break;
case ":":
case ";":
var highlightKey = "#KeySemicolon";
break;
case "<":
case ",":
var highlightKey = "#KeyComma";
break;
case ">":
case ".":
var highlightKey = "#KeyPeriod";
break;
case "?":
case "/":
var highlightKey = "#KeySlash";
break;
case "":
var highlightKey = "#KeySpace";
break;
default:
var highlightKey = `#Key${currentKey}`;
}
$(highlightKey).addClass("active-key");
}
function updateCaretPosition() {
// return;
if ($("#words").hasClass("hidden")) return;
@ -996,6 +1074,7 @@ function showResult(difficultyFailed = false) {
hideCaret();
hideLiveWpm();
hideTimer();
hideKeymap();
testInvalid = false;
let stats = calculateStats();
if (stats === undefined) {
@ -1520,6 +1599,7 @@ function restartTest(withSameWordset = false) {
testActive = false;
hideLiveWpm();
hideTimer();
hideKeymap();
keypressPerSecond = [];
currentKeypressCount = 0;
errorsPerSecond = [];
@ -1605,6 +1685,9 @@ function restartTest(withSameWordset = false) {
currentInput = "";
showWords();
}
if (config.keymap) {
showKeymap();
}
$("#result").addClass("hidden");
$("#testModesNotice").css({
opacity: 1,
@ -1657,6 +1740,7 @@ function restartTest(withSameWordset = false) {
);
}
);
// $(".active-key").classList.remove("active-key");
}
function focusWords() {
@ -2522,6 +2606,8 @@ $(document).keypress(function (event) {
activeWordJumped = true;
}
// console.timeEnd("offcheck2");
updateHighlightedKey();
updateCaretPosition();
});
@ -2603,6 +2689,7 @@ $(document).keydown((event) => {
compareInput(null, currentInput, !config.blindMode);
}
// currentKeypressCount++;
updateHighlightedKey();
updateCaretPosition();
}
//space
@ -2662,6 +2749,7 @@ $(document).keydown((event) => {
inputHistory.push(currentInput);
currentInput = "";
currentWordIndex++;
updateHighlightedKey();
updateActiveElement();
updateCaretPosition();
currentKeypressCount++;

View file

@ -34,12 +34,25 @@ function updateSettingsPage() {
);
});
let keymapEl = $(".pageSettings .section.keymap-layouts .buttons").empty();
Object.keys(layouts).forEach((layout) => {
if (layout.toString() != "default") {
keymapEl.append(
`<div class="layout button" layout='${layout}'>${layout.replace(
"_",
" "
)}</div>`
);
}
});
refreshTagsSettingsSection();
setSettingsButton("smoothCaret", config.smoothCaret);
setSettingsButton("quickTab", config.quickTab);
setSettingsButton("liveWpm", config.showLiveWpm);
setSettingsButton("timerBar", config.showTimerBar);
setSettingsButton("keymap-toggle", config.keymap);
setSettingsButton("keyTips", config.showKeyTips);
setSettingsButton("freedomMode", config.freedomMode);
setSettingsButton("blindMode", config.blindMode);
@ -55,6 +68,7 @@ function updateSettingsPage() {
setActiveThemeButton();
setActiveLanguageButton();
setActiveLayoutButton();
setActiveKeymapLayoutButton();
setActiveFontSizeButton();
setActiveDifficultyButton();
setActiveCaretStyleButton();
@ -208,6 +222,13 @@ function setActiveLayoutButton() {
);
}
function setActiveKeymapLayoutButton() {
$(`.pageSettings .section.keymap-layouts .layout`).removeClass("active");
$(
`.pageSettings .section.keymap-layouts .layout[layout=${config.keymapLayout}]`
).addClass("active");
}
function setActiveFontSizeButton() {
$(`.pageSettings .section.fontSize .buttons .button`).removeClass("active");
$(
@ -447,6 +468,37 @@ $(".pageSettings .section.timerBar .buttons .button.off").click((e) => {
setSettingsButton("timerBar", config.showTimerBar);
});
//keymap
$(".pageSettings .section.keymap-toggle .buttons .button.on").click((e) => {
config.keymap = true;
saveConfigToCookie();
// showNotification('Keymap on', 1000);
setSettingsButton("keymap-toggle", config.keymap);
$(".keymap-layouts").removeClass("hidden");
});
$(".pageSettings .section.keymap-toggle .buttons .button.off").click((e) => {
config.keymap = false;
saveConfigToCookie();
// showNotification('Keymap off', 1000);
setSettingsButton("keymap-toggle", config.keymap);
$(".keymap-layouts").addClass("hidden");
});
if (config.keymap) $(".keymap-layouts").removeClass("hidden");
//keymap layouts
$(document).on(
"click",
".pageSettings .section.keymap-layouts .layout",
(e) => {
let layout = $(e.currentTarget).attr("layout");
changeKeymapLayout(layout);
// showNotification('Keymap Layout changed', 1000);
restartTest();
setActiveKeymapLayoutButton();
}
);
//freedom mode
$(".pageSettings .section.freedomMode .buttons .button.on").click((e) => {
setFreedomMode(true);

View file

@ -40,6 +40,8 @@ let defaultConfig = {
timerOpacity: "0.25",
stopOnError: false,
showAllLines: false,
keymap: false,
keymapLayout: "qwerty",
};
let cookieConfig = null;
@ -669,6 +671,78 @@ function changeLayout(layout, nosave) {
if (!nosave) saveConfigToCookie();
}
function changeKeymapLayout(layout, nosave) {
if (layout == null || layout == undefined) {
layout = "qwerty";
}
config.keymapLayout = layout;
if (!nosave) saveConfigToCookie();
// layouts[layout].forEach((x) => {
// console.log(x);
// });
var toReplace = layouts[layout].slice(13, 47);
var _ = toReplace.splice(12, 1);
var count = 0;
$(".letter")
.map(function () {
if (
!this.parentElement.classList.contains("hidden-key") &&
!this.classList.contains("hidden-key")
) {
if (count < toReplace.length) {
var key = toReplace[count].charAt(0);
this.innerHTML = key;
switch (key) {
case "\\":
case "|":
this.parentElement.id = "KeyBackslash";
break;
case "}":
case "]":
this.parentElement.id = "KeyRightBracket";
break;
case "{":
case "[":
this.parentElement.id = "KeyLeftBracket";
break;
case '"':
case "'":
this.parentElement.id = "KeyQuote";
break;
case ":":
case ";":
this.parentElement.id = "KeySemicolon";
break;
case "<":
case ",":
this.parentElement.id = "KeyComma";
break;
case ">":
case ".":
this.parentElement.id = "KeyPeriod";
break;
case "?":
case "/":
this.parentElement.id = "KeySlash";
break;
case "":
this.parentElement.id = "KeySpace";
break;
default:
this.parentElement.id = `Key${key.toUpperCase()}`;
}
}
count++;
}
})
.get();
// console.log(all.join());
}
function changeFontSize(fontSize, nosave) {
if (fontSize == null || fontSize == undefined) {
fontSize = 1;