@@ -91,10 +91,17 @@ export function initMenu() {
9191
9292 refresh ( ) ;
9393
94+ function updateBaudSelection ( rate ) {
95+ baudText . textContent = String ( rate ) ;
96+ baudDropdown . querySelectorAll ( '.cs-option' ) . forEach ( o => {
97+ o . classList . toggle ( 'selected' , parseInt ( o . dataset . value ) === rate ) ;
98+ } ) ;
99+ }
100+
94101 ( async ( ) => {
95102 const saved = await getSettings ( ) ;
96103 baudRate = saved . baudRate || 115200 ;
97- baudSelect . value = String ( baudRate ) ;
104+ updateBaudSelection ( baudRate ) ;
98105 charSize = saved . charSize || 8 ;
99106 stopBits = saved . stopBits || 1 ;
100107 parity = saved . parity || 'none' ;
@@ -136,12 +143,32 @@ export function initMenu() {
136143 if ( ! comEl . contains ( e . target ) ) {
137144 closeComDropdown ( ) ;
138145 }
146+ if ( ! baudSelect . contains ( e . target ) ) {
147+ closeBaudDropdown ( ) ;
148+ }
139149 } ) ;
140150
141- refreshBtn . addEventListener ( 'click' , refresh ) ;
151+ const BAUD_RATES = [ 300 , 1200 , 2400 , 4800 , 9600 , 14400 , 19200 , 28800 , 38400 , 56000 , 57600 , 115200 , 230400 , 460800 , 921600 ] ;
142152
143- baudSelect . addEventListener ( 'change' , async ( ) => {
144- baudRate = parseInt ( baudSelect . value ) ;
153+ const baudText = document . getElementById ( 'baud-select-text' ) ;
154+ const baudDropdown = document . getElementById ( 'baud-select-dropdown' ) ;
155+
156+ function closeBaudDropdown ( ) {
157+ baudSelect . classList . remove ( 'open' ) ;
158+ }
159+
160+ function toggleBaudDropdown ( ) {
161+ baudSelect . classList . toggle ( 'open' ) ;
162+ }
163+
164+ async function selectBaudOption ( el ) {
165+ if ( ! el ) return ;
166+ baudDropdown . querySelectorAll ( '.cs-option.selected' ) . forEach ( e => e . classList . remove ( 'selected' ) ) ;
167+ el . classList . add ( 'selected' ) ;
168+ const val = parseInt ( el . dataset . value ) ;
169+ baudRate = val ;
170+ baudText . textContent = String ( val ) ;
171+ closeBaudDropdown ( ) ;
145172 await patchSettings ( { baudRate } ) ;
146173
147174 if ( portOpen ) {
@@ -164,8 +191,50 @@ export function initMenu() {
164191 document . dispatchEvent ( new CustomEvent ( 'port-state-change' , { detail : { open : false } } ) ) ;
165192 }
166193 }
194+ }
195+
196+ BAUD_RATES . forEach ( rate => {
197+ const opt = document . createElement ( 'div' ) ;
198+ opt . className = 'cs-option' ;
199+ opt . textContent = String ( rate ) ;
200+ opt . dataset . value = String ( rate ) ;
201+ if ( rate === baudRate ) opt . classList . add ( 'selected' ) ;
202+ opt . addEventListener ( 'click' , ( ) => selectBaudOption ( opt ) ) ;
203+ baudDropdown . appendChild ( opt ) ;
204+ } ) ;
205+
206+ baudSelect . addEventListener ( 'click' , ( e ) => {
207+ if ( e . target . closest ( '.cs-dropdown' ) ) return ;
208+ toggleBaudDropdown ( ) ;
209+ } ) ;
210+
211+ baudSelect . addEventListener ( 'keydown' , ( e ) => {
212+ if ( e . key === 'Enter' || e . key === ' ' ) {
213+ e . preventDefault ( ) ;
214+ toggleBaudDropdown ( ) ;
215+ } else if ( e . key === 'Escape' ) {
216+ closeBaudDropdown ( ) ;
217+ } else if ( e . key === 'ArrowDown' || e . key === 'ArrowUp' ) {
218+ e . preventDefault ( ) ;
219+ if ( ! baudSelect . classList . contains ( 'open' ) ) {
220+ baudSelect . classList . add ( 'open' ) ;
221+ }
222+ const items = [ ...baudDropdown . querySelectorAll ( '.cs-option' ) ] ;
223+ if ( ! items . length ) return ;
224+ const sel = baudDropdown . querySelector ( '.cs-option.selected' ) ;
225+ const idx = items . indexOf ( sel ) ;
226+ const next = e . key === 'ArrowDown'
227+ ? Math . min ( idx + 1 , items . length - 1 )
228+ : Math . max ( idx - 1 , 0 ) ;
229+ items . forEach ( o => o . classList . remove ( 'selected' ) ) ;
230+ items [ next ] . classList . add ( 'selected' ) ;
231+ baudText . textContent = items [ next ] . textContent ;
232+ baudRate = parseInt ( items [ next ] . dataset . value ) ;
233+ }
167234 } ) ;
168235
236+ refreshBtn . addEventListener ( 'click' , refresh ) ;
237+
169238 toggleBtn . addEventListener ( 'click' , async ( ) => {
170239 if ( portOpen ) {
171240 try {
0 commit comments