-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
93 lines (78 loc) · 3.04 KB
/
script.js
File metadata and controls
93 lines (78 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
const keys = document.querySelector('.keys');
let keyboardLayout = {};
let keysAttributes = {
standardKey: "justify-content: center;align-items: center;flex-grow: 0;width: 5rem;",
wideKey: "justify-content: end;width: 3rem;",
widerKey: "justify-content: start;align-items: start; width: 6rem;",
spaceKey: "justify-content: center;align-items: end; width: 30%;",
functionKey: "justify-content: end;align-items: center;font-size: 0.7rem;",
arrowKey: "justify-content: center;align-items: center;width: 2rem;",
combinedArrowKey: "justify-content: center;align-items: center;width: 6rem;height:fit-content;flex-grow: 2;",
}
let caps = false;
const getKeyboardLayout = async () => {
const response = await fetch('./data/keyboardLayout.json');
const data = await response.json();
keyboardLayout = data;
}
const renderKeys = async () => {
await getKeyboardLayout();
keyboardLayout.forEach((row, index) => {
const keyRow = document.querySelector(`.keys #key-row-${index}`);
row.forEach(key => {
const keyDiv = document.createElement('div');
if (key?.combined) {
keyDiv.classList.add('combined-key');
key.keys.forEach(k => {
const subKeyDiv = document.createElement('div');
subKeyDiv.classList.add('key');
subKeyDiv.id = k.code?.toLowerCase() || key.key.toLowerCase() || '';
subKeyDiv.style = `${keysAttributes[key.type] || ''}`;
subKeyDiv.innerHTML = k.sign ? `<p>${k.sign}</p><p>${k.key || ''}</p>` : `<p>${k.key || ''}</p>`;
keyDiv.appendChild(subKeyDiv);
});
}
else {
keyDiv.classList.add('key');
keyDiv.style = `${keysAttributes[key.type] || ''}`;
keyDiv.id = key?.code?.toLowerCase() || key.key.toLowerCase() || '';
keyDiv.innerHTML = key.sign ? `<p>${key.sign}</p><p>${key.key || ''}</p>` : `<p>${key.key || ''}</p>`;
}
keyRow.appendChild(keyDiv);
});
});
}
document.addEventListener('DOMContentLoaded', () => {
renderKeys();
});
const playClickSound = () => {
const audio = document.getElementById('clickSound')
audio.currentTime = 0
audio.play().catch((e) => console.log(e))
}
document.addEventListener('keydown', (event) => {
event.preventDefault()
let key
if (event.key == 'CapsLock') {
caps = !caps;
keys.classList.toggle("caps");
}
if (document.getElementById(event.key.toLowerCase())) key = document.getElementById(event.key.toLowerCase())
else if (document.getElementById(event.code.toLowerCase())) key = document.getElementById(event.code.toLowerCase())
else return
if (key) {
key.classList.add('active');
}
// playClickSound()
});
document.addEventListener('keyup', (event) => {
event.preventDefault()
let key
if (document.getElementById(event.key.toLowerCase())) key = document.getElementById(event.key.toLowerCase())
else if (document.getElementById(event.code.toLowerCase())) key = document.getElementById(event.code.toLowerCase())
else return
if (key) {
if (key.classList.contains('active'))
key.classList.remove('active');
}
});