js_lis 2.0.8 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/layouts.js CHANGED
@@ -1,25 +1,113 @@
1
1
  export const layouts = {
2
2
  full: [
3
3
  // ["Esc", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "DEL⌦", "HOME", "END"],"ㅤ","ㅤ","ㅤ","ㅤ",
4
- ["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "Backspace"].concat(["+", "-", "*","/"]),
5
- ["Tab ↹", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\"].concat(["7", "8", "9", "%"]),
6
- ["Caps 🄰", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "Enter"].concat(["4", "5", "6", "_"]),
7
- ["Shift ⇧", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "Shift ⇧", "↑"].concat(["1", "2", "3", "="]),
4
+ [
5
+ "`",
6
+ "1",
7
+ "2",
8
+ "3",
9
+ "4",
10
+ "5",
11
+ "6",
12
+ "7",
13
+ "8",
14
+ "9",
15
+ "0",
16
+ "-",
17
+ "=",
18
+ "Backspace",
19
+ ].concat(["+", "-", "*", "/"]),
20
+ [
21
+ "Tab ↹",
22
+ "q",
23
+ "w",
24
+ "e",
25
+ "r",
26
+ "t",
27
+ "y",
28
+ "u",
29
+ "i",
30
+ "o",
31
+ "p",
32
+ "[",
33
+ "]",
34
+ "\\",
35
+ ].concat(["7", "8", "9", "%"]),
36
+ [
37
+ "Caps 🄰",
38
+ "a",
39
+ "s",
40
+ "d",
41
+ "f",
42
+ "g",
43
+ "h",
44
+ "j",
45
+ "k",
46
+ "l",
47
+ ";",
48
+ "'",
49
+ "Enter",
50
+ ].concat(["4", "5", "6", "_"]),
51
+ [
52
+ "Shift ⇧",
53
+ "z",
54
+ "x",
55
+ "c",
56
+ "v",
57
+ "b",
58
+ "n",
59
+ "m",
60
+ ",",
61
+ ".",
62
+ "/",
63
+ "Shift ⇧",
64
+ "↑",
65
+ ].concat(["1", "2", "3", "="]),
8
66
  ["scrambled", " ", "←", "↓", "→"].concat(["0", "."]),
9
67
  ],
10
68
  en: [
11
- ["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "Backspace"],
69
+ [
70
+ "`",
71
+ "1",
72
+ "2",
73
+ "3",
74
+ "4",
75
+ "5",
76
+ "6",
77
+ "7",
78
+ "8",
79
+ "9",
80
+ "0",
81
+ "-",
82
+ "=",
83
+ "Backspace",
84
+ ],
12
85
  ["Tab ↹", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\"],
13
86
  ["Caps 🄰", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "Enter"],
14
87
  ["Shift ⇧", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "Shift ⇧"],
15
88
  ["scrambled", " "],
16
89
  ],
17
90
  th: [
18
- ["_", "ๅ", "/", "-", "ภ", "ถ", "ุ", "ึ", "ค", "ต", "จ", "ข", "ช", "Backspace"],
91
+ [
92
+ "_",
93
+ "ๅ",
94
+ "/",
95
+ "-",
96
+ "ภ",
97
+ "ถ",
98
+ "ุ",
99
+ "ึ",
100
+ "ค",
101
+ "ต",
102
+ "จ",
103
+ "ข",
104
+ "ช",
105
+ "Backspace",
106
+ ],
19
107
  ["Tab ↹", "ๆ", "ไ", "ำ", "พ", "ะ", "ั", "ี", "ร", "น", "ย", "บ", "ล", "ฃ"],
20
108
  ["Caps 🄰", "ฟ", "ห", "ก", "ด", "เ", "้", "่", "า", "ส", "ว", "ง", "Enter"],
21
109
  ["Shift ⇧", "ผ", "ป", "แ", "อ", "ิ", "ื", "ท", "ม", "ใ", "ฝ", "Shift ⇧"],
22
- ["scrambled" ," "],
110
+ ["scrambled", " "],
23
111
  ],
24
112
  numpad: [
25
113
  ["scr", "+", "-", "*"],
@@ -27,13 +115,14 @@ export const layouts = {
27
115
  ["4", "5", "6", "%"],
28
116
  ["7", "8", "9", "."],
29
117
  ["(", "0", ")", "="],
30
- ["backspace"]
118
+ ["backspace"],
31
119
  ],
32
120
  symbols: [
33
- ['scr', '@', '#', '$', '%', '^', '&', '*', '(', ')'],
34
- ['_', '+', '~', '`', '{', '}', '|', '\\', ':', '!'],
35
- ["'", '<', '>', '?', '/', '[', ']', '±', '§', '¶'],
36
- ['', '£', '¥', '¢', '©', '®', '', '', '‰', '†'],
37
- ["backspace"]
38
- ]
39
- };
121
+ ['scr', '@', '#', '$', '%', '^', '&', '*'],
122
+ ['(', ')', '_', '+', '~', '`', '{', '}'],
123
+ ['|', '\\', ':', '!', "'", '<', '>', '?'],
124
+ ['/', '[', ']', '±', '§', '', '', '£'],
125
+ ['¥', '¢', '©', '®', '™', '℅', '‰', '†'],
126
+ ["backspace"],
127
+ ],
128
+ };
package/main.js CHANGED
@@ -1,43 +1,9 @@
1
- import { VirtualKeyboard } from './VirtualKeyboard.js';
1
+ import { VirtualKeyboard } from "./VirtualKeyboard.js";
2
2
 
3
- // Provide simple session-scoped AES crypto utilities backed by CryptoJS (loaded globally via CDN)
4
- function createSessionCrypto() {
5
- const sessionKey = CryptoJS.lib.WordArray.random(32); // 256-bit key
6
- return {
7
- encrypt(plaintext) {
8
- const iv = CryptoJS.lib.WordArray.random(16);
9
- const cipher = CryptoJS.AES.encrypt(plaintext, sessionKey, {
10
- iv,
11
- mode: CryptoJS.mode.CBC,
12
- padding: CryptoJS.pad.Pkcs7,
13
- });
14
- const ivHex = CryptoJS.enc.Hex.stringify(iv);
15
- const ctB64 = cipher.toString();
16
- return `${ivHex}:${ctB64}`;
17
- },
18
- decrypt(payload) {
19
- if (!payload) return "";
20
- const [ivHex, ctB64] = String(payload).split(":");
21
- if (!ivHex || !ctB64) return "";
22
- const iv = CryptoJS.enc.Hex.parse(ivHex);
23
- const decrypted = CryptoJS.AES.decrypt(ctB64, sessionKey, {
24
- iv,
25
- mode: CryptoJS.mode.CBC,
26
- padding: CryptoJS.pad.Pkcs7,
27
- });
28
- return decrypted.toString(CryptoJS.enc.Utf8);
29
- },
30
- };
31
- }
32
-
33
- window.onload = () => {
34
- try {
35
- // Initialize per-page crypto helper
36
- window.VKCrypto = createSessionCrypto();
37
-
38
- window.keyboard = new VirtualKeyboard();
39
- console.log("VirtualKeyboard initialized successfully.");
40
- } catch (error) {
41
- console.error("Error initializing VirtualKeyboard:", error);
42
- }
43
- };
3
+ window.addEventListener("DOMContentLoaded", () => {
4
+ try {
5
+ window.keyboard = new VirtualKeyboard();
6
+ } catch (error) {
7
+ console.error("Error initializing VirtualKeyboard:", error);
8
+ }
9
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js_lis",
3
- "version": "2.0.8",
3
+ "version": "3.0.1",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"
package/style/kbstyle.js CHANGED
@@ -1,10 +1,155 @@
1
- // CSS-in-JS version of kbstyle.css
1
+
2
+ const STYLE_TAG_ID = "vk-styles";
3
+
2
4
  export const css = `
3
- .keyboard-row,.virtual-keyboard{display:flex;display:flex}.keyb,.keyboard-key{cursor:pointer;font-size:16px;text-align:center}.virtual-keyboard{flex-direction:column;width:100%;max-width:800px;margin:0 auto;border:2px solid #333;border-radius:10px;padding:20px;background-color:#f5f5f5;box-shadow:0 4px 10px rgba(0,0,0,.1)}.keyboard-row{justify-content:space-between}.keyboard-key{flex:1;padding:10px 15px;margin:2px;border:1px solid #ccc;border-radius:5px;background-color:#fff;transition:background-color .2s}.keyboard-active,input:focus,textarea:focus{border-color:#007bff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.backspacew{flex:1.5;width:260px}.keyboard-key:hover{background:#e0e0e0}.keyboard-key:active{background:#d0d0d0;transform:translateY(1px)}.keyboard-row{display:flex;justify-content:flex-start;margin:5px 0}.controls{margin-bottom:20px}button,select{margin-right:10px;padding:8px 12px;border:1px solid #ccc;border-radius:4px;font-size:14px;cursor:pointer}button:hover{background:#f0f0f0}input:focus,textarea:focus{outline:0}#keyboard{position:absolute;cursor:move;top:80%;left:50%;transform:translate(-50%,-50%)}.keyb{color:#fff;border:#000;width:40px;height:25px;line-height:50px;margin:8px}.keyboard-row .active{background:#c7c7c7}body.dark-mode .virtual-keyboard{background-color:#333;box-shadow:0 4px 8px rgba(247,245,245,.1)}body.dark-mode{background-color:#333}body.dark-mode .login-container{background-color:#000;box-shadow:0 4px 8px rgba(247,245,245,.1);color:#fff}body.dark-mode .login-container input{background-color:#3333335d;color:#fff}body.dark-mode .login-container button{background-color:#005703;color:#fff}.fa-keyboard{color:#000}body.dark-mode .keyb .fa-keyboard{color:#ffffffde}body.dark-mode .keyboard-key.key{background-color:#222;color:#ffffffde}[data-key="Caps 🄰"],[data-key="Shift ⇧"],[data-key="Tab ↹"]{min-width:90px}.keyboard-key.key[data-key="Shift ⇧"]{color:#333}.virtual-keyboard.full [data-key=Enter]{min-width:95px}.virtual-keyboard.full [data-key="Shift ⇧"]{min-width:92px}.virtual-keyboard.full [data-key=" "]{min-width:563.8px}.virtual-keyboard.full .concat-keys[data-key="0"]{min-width:102px}.virtual-keyboard.full{min-width:1000px}.virtual-keyboard.Scnum,.virtual-keyboard.numpad{max-width:300px}.hidden{display:none!important}[data-key="Tab ↹"],[data-key=Backspace]{min-width:80px}[data-key="Shift ⇧"]{min-width:100px}[data-key=" "]{min-width:670px}
5
+ :host, .vk-root {
6
+ --vk-bg: #f5f5f5;
7
+ --vk-border:#333;
8
+ --vk-key-bg:#ffffff;
9
+ --vk-key-color: #111111;
10
+ --vk-key-border:#cccccc;
11
+ --vk-key-hover: #e0e0e0;
12
+ --vk-key-active:#d0d0d0;
13
+ --vk-key-pressed: #c7c7c7;
14
+ --vk-shadow:rgba(0, 0, 0, 0.1);
15
+ --vk-focus-ring:rgba(0, 123, 255, 0.25);
16
+ --vk-focus-border:#007bff;
17
+ --vk-icon-color:#000000;
18
+ }
19
+ @media (prefers-color-scheme: dark) {
20
+ :host, .vk-root {
21
+ --vk-bg:#333333;
22
+ --vk-border:#555555;
23
+ --vk-key-bg:#222222;
24
+ --vk-key-color: rgba(255, 255, 255, 0.87);
25
+ --vk-key-border:#444444;
26
+ --vk-key-hover: #2c2c2c;
27
+ --vk-key-active:#1a1a1a;
28
+ --vk-key-pressed: #383838;
29
+ --vk-shadow:rgba(247, 245, 245, 0.1);
30
+ --vk-icon-color:rgba(255, 255, 255, 0.87);
31
+ }
32
+ }
33
+ :host([data-theme="dark"]), [data-theme="dark"] .vk-root {
34
+ --vk-bg:#333333;
35
+ --vk-border:#555555;
36
+ --vk-key-bg:#222222;
37
+ --vk-key-color: rgba(255, 255, 255, 0.87);
38
+ --vk-key-border:#444444;
39
+ --vk-key-hover: #2c2c2c;
40
+ --vk-key-active:#1a1a1a;
41
+ --vk-key-pressed: #383838;
42
+ --vk-shadow:rgba(247, 245, 245, 0.1);
43
+ --vk-icon-color:rgba(255, 255, 255, 0.87);
44
+ }
45
+ .virtual-keyboard {
46
+ display:flex;
47
+ flex-direction: column;
48
+ width:100%;
49
+ max-width:800px;
50
+ margin: 0 auto;
51
+ border: 2px solid var(--vk-border);
52
+ border-radius:10px;
53
+ padding:20px;
54
+ background-color: var(--vk-bg);
55
+ box-shadow: 0 4px 10px var(--vk-shadow);
56
+ box-sizing: border-box;
57
+ }
58
+ .keyboard-row {
59
+ display:flex;
60
+ justify-content:flex-start;
61
+ margin: 5px 0;
62
+ }
63
+ .keyboard-key {
64
+ flex: 1;
65
+ cursor: pointer;
66
+ font-size:16px;
67
+ text-align: center;
68
+ padding:10px 15px;
69
+ margin: 2px;
70
+ border: 1px solid var(--vk-key-border);
71
+ border-radius:5px;
72
+ background-color: var(--vk-key-bg);
73
+ color:var(--vk-key-color);
74
+ transition: background-color 0.2s;
75
+ box-sizing: border-box;
76
+ user-select:none;
77
+ -webkit-user-select: none;
78
+ }
79
+ .keyboard-key:hover{ background: var(--vk-key-hover); }
80
+ .keyboard-key:active { background: var(--vk-key-active); transform: translateY(1px); }
81
+ .keyboard-row .active,
82
+ .keyboard-key.active { background: var(--vk-key-pressed); }
83
+ [data-key="Caps 🄰"],
84
+ [data-key="Shift ⇧"],
85
+ [data-key="Tab ↹"] { min-width: 90px; }
86
+ [data-key="Backspace"],
87
+ [data-key="backspace"] { min-width: 80px; }
88
+ // [data-key="Shift ⇧"]{ min-width: 100px; color: #333; }
89
+ .backspacew{ flex: 1.5; }
90
+ [data-key=" "] { flex: 8; }
91
+ .virtual-keyboard.full {
92
+ min-width: clamp(600px, 90vw, 1000px);
93
+ }
94
+ .virtual-keyboard.full [data-key="Enter"] { min-width: 95px; }
95
+ .virtual-keyboard.full [data-key="Shift ⇧"] { min-width: 92px; }
96
+ .virtual-keyboard.full .concat-keys[data-key="0"] { min-width: 100px; }
97
+ [data-key="←"],[data-key="↓"],[data-key="→"],.virtual-keyboard.full .concat-keys[data-key="."] { max-width: 46px; }
98
+ .virtual-keyboard.full [data-key=" "] { flex: 10; }
99
+ .virtual-keyboard.numpad,
100
+ .virtual-keyboard.Scnum{ max-width: 300px; }
101
+ .virtual-keyboard.symbols { max-width: 450px; }
102
+ #keyboard {
103
+ position:absolute;
104
+ cursor:move;
105
+ top: 80%;
106
+ left:50%;
107
+ transform: translate(-50%, -50%);
108
+ z-index: 9999;
109
+ }
110
+ .keyboard-active,
111
+ input:focus,
112
+ textarea:focus {
113
+ border-color: var(--vk-focus-border) !important;
114
+ box-shadow: 0 0 0 0.2rem var(--vk-focus-ring) !important;
115
+ outline:0;
116
+ }
117
+ .controls { margin-bottom: 20px; }
118
+ button,
119
+ select {
120
+ margin-right: 10px;
121
+ padding:8px 12px;
122
+ border: 1px solid var(--vk-key-border);
123
+ border-radius: 4px;
124
+ font-size:14px;
125
+ cursor: pointer;
126
+ background: var(--vk-key-bg);
127
+ color:var(--vk-key-color);
128
+ }
129
+ button:hover { background: var(--vk-key-hover); }
130
+ .fa-keyboard { color: var(--vk-icon-color); }
131
+ .keyb {
132
+ cursor:pointer;
133
+ font-size: 16px;
134
+ text-align:center;
135
+ color: #fff;
136
+ border:1px solid #000;
137
+ width: 40px;
138
+ height:25px;
139
+ line-height: 50px;
140
+ margin:8px;}.hidden { display: none !important; }
4
141
  `;
5
142
 
6
- export function injectCSS() {
7
- const style = document.createElement('style');
8
- style.textContent = css;
9
- document.head.appendChild(style);
143
+ export function getCSS() {
144
+ return css;
145
+ }
146
+
147
+ export function injectCSS() {
148
+ if (document.getElementById(STYLE_TAG_ID)) return;
149
+
150
+ const style = document.createElement("style");
151
+ style.id = STYLE_TAG_ID;
152
+ style.setAttribute("data-vk", "");
153
+ style.textContent = css;
154
+ document.head.appendChild(style);
10
155
  }