1414 < div id ="status-bar ">
1515 < div id ="status-indicator ">
1616 < div class ="status-dot "> </ div >
17- < span class ="status-text "> Connecting...</ span >
17+ < span class ="status-text " data-i18n =" status.connecting " > Connecting...</ span >
1818 </ div >
1919 </ div >
2020
2525
2626 <!-- Function Keys Panel -->
2727 < div id ="fn-panel ">
28+ <!-- Floating Toolbar (Inside panel for relative positioning but absolutely floating above) -->
29+ < div id ="toolbar-fab ">
30+ < div class ="fab-capsule ">
31+ < button id ="btn-settings " class ="capsule-btn sub-action ">
32+ < svg width ="24 " height ="24 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < circle cx ="12 " cy ="12 " r ="3 "> </ circle > < path d ="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33-1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z "> </ path > </ svg >
33+ </ button >
34+ < div class ="capsule-divider "> </ div >
35+ < button id ="btn-keyboard " class ="capsule-btn main-action ">
36+ < svg width ="24 " height ="24 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < rect x ="2 " y ="4 " width ="20 " height ="16 " rx ="2 " ry ="2 "> </ rect > < line x1 ="6 " y1 ="8 " x2 ="6 " y2 ="8 "> </ line > < line x1 ="10 " y1 ="8 " x2 ="10 " y2 ="8 "> </ line > < line x1 ="14 " y1 ="8 " x2 ="14 " y2 ="8 "> </ line > < line x1 ="18 " y1 ="8 " x2 ="18 " y2 ="8 "> </ line > < line x1 ="6 " y1 ="12 " x2 ="6 " y2 ="12 "> </ line > < line x1 ="10 " y1 ="12 " x2 ="10 " y2 ="12 "> </ line > < line x1 ="14 " y1 ="12 " x2 ="14 " y2 ="12 "> </ line > < line x1 ="18 " y1 ="12 " x2 ="18 " y2 ="12 "> </ line > < line x1 ="6 " y1 ="16 " x2 ="6 " y2 ="16 "> </ line > < line x1 ="10 " y1 ="16 " x2 ="10 " y2 ="16 "> </ line > < line x1 ="14 " y1 ="16 " x2 ="14 " y2 ="16 "> </ line > </ svg >
37+ </ button >
38+ </ div >
39+ </ div >
2840 <!-- Row 1: System & Modifiers -->
2941 < button class ="fn-btn " data-key ="esc "> Esc</ button >
3042 < button class ="fn-btn " data-key ="tab "> ⇥</ button >
4456 < button class ="fn-btn nav-key " data-key ="right "> →</ button >
4557 </ div >
4658
47- <!-- Floating Toolbar -->
48- < div id ="toolbar-fab ">
49- < div class ="fab-capsule ">
50- < button id ="btn-settings " class ="capsule-btn sub-action ">
51- < svg width ="24 " height ="24 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < circle cx ="12 " cy ="12 " r ="3 "> </ circle > < path d ="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z "> </ path > </ svg >
52- </ button >
53- < div class ="capsule-divider "> </ div >
54- < button id ="btn-keyboard " class ="capsule-btn main-action ">
55- < svg width ="24 " height ="24 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < rect x ="2 " y ="4 " width ="20 " height ="16 " rx ="2 " ry ="2 "> </ rect > < line x1 ="6 " y1 ="8 " x2 ="6 " y2 ="8 "> </ line > < line x1 ="10 " y1 ="8 " x2 ="10 " y2 ="8 "> </ line > < line x1 ="14 " y1 ="8 " x2 ="14 " y2 ="8 "> </ line > < line x1 ="18 " y1 ="8 " x2 ="18 " y2 ="8 "> </ line > < line x1 ="6 " y1 ="12 " x2 ="6 " y2 ="12 "> </ line > < line x1 ="10 " y1 ="12 " x2 ="10 " y2 ="12 "> </ line > < line x1 ="14 " y1 ="12 " x2 ="14 " y2 ="12 "> </ line > < line x1 ="18 " y1 ="12 " x2 ="18 " y2 ="12 "> </ line > < line x1 ="6 " y1 ="16 " x2 ="6 " y2 ="16 "> </ line > < line x1 ="10 " y1 ="16 " x2 ="10 " y2 ="16 "> </ line > < line x1 ="14 " y1 ="16 " x2 ="14 " y2 ="16 "> </ line > </ svg >
56- </ button >
57- </ div >
58- </ div >
59-
6059 <!-- Settings Modal -->
6160 < div id ="settings-modal " class ="modal hidden ">
6261 < div class ="modal-content ">
6362 < div class ="modal-header ">
64- < h3 > Settings</ h3 >
63+ < h3 data-i18n =" settings.title " > Settings</ h3 >
6564 < button id ="btn-close-settings " class ="icon-btn ">
6665 < svg width ="20 " height ="20 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 "> < line x1 ="18 " y1 ="6 " x2 ="6 " y2 ="18 "> </ line > < line x1 ="6 " y1 ="6 " x2 ="18 " y2 ="18 "> </ line > </ svg >
6766 </ button >
6867 </ div >
6968 < div class ="modal-body ">
7069 < div class ="setting-item ">
7170 < div class ="setting-label ">
72- < span > Mouse Sensitivity</ span >
71+ < span data-i18n =" settings.mouse_sensitivity " > Mouse Sensitivity</ span >
7372 < span id ="sensitivity-value "> 2.0</ span >
7473 </ div >
7574 < input type ="range " id ="sensitivity-slider " min ="0.5 " max ="10.0 " step ="0.1 " value ="2.0 ">
7675 </ div >
7776
7877 < div class ="setting-item ">
7978 < div class ="setting-label ">
80- < span > Scroll Sensitivity</ span >
79+ < span data-i18n =" settings.scroll_sensitivity " > Scroll Sensitivity</ span >
8180 < span id ="scroll-sensitivity-value "> 1.0</ span >
8281 </ div >
8382 < input type ="range " id ="scroll-sensitivity-slider " min ="0.1 " max ="10.0 " step ="0.1 " value ="1.0 ">
8483 </ div >
8584
8685 < div class ="setting-item ">
8786 < div class ="setting-label " style ="align-items: center; ">
88- < span > Light Mode</ span >
87+ < span data-i18n =" settings.light_mode " > Light Mode</ span >
8988 < label class ="switch ">
9089 < input type ="checkbox " id ="theme-toggle ">
9190 < span class ="slider "> </ span >
@@ -95,7 +94,7 @@ <h3>Settings</h3>
9594
9695 < div class ="setting-item ">
9796 < div class ="setting-label " style ="align-items: center; ">
98- < span > Scroll Bar Right</ span >
97+ < span data-i18n =" settings.scroll_bar_right " > Scroll Bar Right</ span >
9998 < label class ="switch ">
10099 < input type ="checkbox " id ="scroll-pos-toggle ">
101100 < span class ="slider "> </ span >
@@ -105,13 +104,23 @@ <h3>Settings</h3>
105104
106105 < div class ="setting-item ">
107106 < div class ="setting-label " style ="align-items: center; ">
108- < span > Rate Monitor</ span >
107+ < span data-i18n =" settings.rate_monitor " > Rate Monitor</ span >
109108 < label class ="switch ">
110109 < input type ="checkbox " id ="rate-monitor-toggle ">
111110 < span class ="slider "> </ span >
112111 </ label >
113112 </ div >
114113 </ div >
114+
115+ < div class ="setting-item ">
116+ < div class ="setting-label " style ="align-items: center; ">
117+ < span data-i18n ="settings.language "> Language</ span >
118+ < select id ="lang-select ">
119+ < option value ="zh "> 中文</ option >
120+ < option value ="en "> English</ option >
121+ </ select >
122+ </ div >
123+ </ div >
115124 </ div >
116125 </ div >
117126 </ div >
@@ -121,7 +130,13 @@ <h3>Settings</h3>
121130 < div > BPS: < span id ="rate-bps "> 0</ span > </ div >
122131 </ div >
123132
124- < textarea id ="keyboard-input " autocomplete ="off " autocorrect ="off " autocapitalize ="off " spellcheck ="false "> </ textarea >
133+ < input type ="text " id ="keyboard-input "
134+ inputmode ="text "
135+ enterkeyhint ="done "
136+ autocomplete ="one-time-code "
137+ autocorrect ="off "
138+ autocapitalize ="off "
139+ spellcheck ="false ">
125140 </ div >
126141 < script type ="module " src ="/src/main.ts "> </ script >
127142 </ body >
0 commit comments