katja's git: oeffisearch

fast and simple tripplanner

commit 6dea25dbdb15a434eeaae45f0f21ed04fb166383
parent a92903f06d463b795e66d39b35113a3cb467025d
Author: Katja (ctucx) <git@ctu.cx>
Date: Sun, 20 Apr 2025 14:34:25 +0200

searchView: improve keyboard navigation
3 files changed, 31 insertions(+), 12 deletions(-)
M
src/baseView.js
|
8
+++++++-
M
src/searchView.js
|
31
++++++++++++++++++++++---------
M
src/styles/buttonInput.css
|
4
++--
diff --git a/src/baseView.js b/src/baseView.js
@@ -63,7 +63,13 @@ export class BaseView extends LitElement {
 		}
 	};
 
-	overlayHandler = event => event.target === event.currentTarget && this.overlayState.type !== 'loader' ? this.hideOverlay() : true;
+	overlayHandler  = event => event.target === event.currentTarget && this.overlayState.type !== 'loader' ? this.hideOverlay() : true;
+	keyClickHandler = event => {
+		if ([ 'Enter', 'Space' ].includes(event.code)) {
+			event.preventDefault();
+			event.target.click();
+		}
+	};
 
 	render () {
 		let overlayContent;
diff --git a/src/searchView.js b/src/searchView.js
@@ -122,12 +122,24 @@ class SearchView extends BaseView {
 						@input=${this.inputHandler} 
 						autocomplete="off"  ?required=${name !== 'via'}>
 
-						${name !== 'from' ? nothing : html`
-							<div class="button icon-arrow ${classMap({ flipped: this.settingsState.showVia })}" tabindex="0" title="${t('via')}"
-							@click=${this.settingsState.toggleShowVia}></div>
-						`}
-						${name !== 'via' ? nothing : html`<div class="button icon-arrow invisible"></div>`}
-						${name !== 'to' ? nothing : html`<div class="button icon-swap" tabindex="0" title=${t('swap')} @click=${this.swapFromTo}></div>`}
+						${when(
+							name === 'from',
+							() => html`
+								<div class="button icon-arrow ${classMap({ flipped: this.settingsState.showVia })}" tabindex="0" title="${t('via')}"
+								@keydown=${this.keyClickHandler} @click=${this.settingsState.toggleShowVia}></div>
+							`
+						)}
+						${when(
+							name === 'via',
+							() => html`<div class="button icon-arrow invisible"></div>`
+						)}
+						${when(
+							name === 'to',
+							() => html`
+								<div class="button icon-swap" tabindex="0" title=${t('swap')}
+								@keydown=${this.keyClickHandler} @click=${this.swapFromTo}></div>
+							`
+						)}
 					</div>
 
 					<div class="suggestions ${this.location[name].suggestionsVisible ? '' : 'hidden'}">

@@ -143,12 +155,13 @@ class SearchView extends BaseView {
 					<div class="flex-row">
 						<div class="selector">
 							<input type="radio" id="departure" name="isArrival" value="0" @change=${this.changeHandler} .checked=${!this.isArrival}>
-							<label for="departure" tabindex="0">${t('departure')}</label>
+							<label for="departure" tabindex=0 @keydown=${this.keyClickHandler}>${t('departure')}</label>
 							<input type="radio" id="arrival" name="isArrival" value="1" @change=${this.changeHandler} .checked=${this.isArrival}>
-							<label for="arrival" tabindex="0">${t('arrival')}</label>
+							<label for="arrival" tabindex=0 @keydown=${this.keyClickHandler}>${t('arrival')}</label>
 						</div>
 
-						<div class="button now" tabindex="0" title="${t('titleSetDateTimeNow')}" @click=${this.resetDate}>${t('now')}</div>
+						<div class="button now" tabindex=0 title="${t('titleSetDateTimeNow')}"
+						@keydown=${this.keyClickHandler} @click=${this.resetDate}>${t('now')}</div>
 						${!this.settingsState.combineDateTime ? html`
 						<input type="time" name="time" title="${t('time')}" class="flex-grow" @change=${this.changeHandler} .value=${this.date.formatTime()} required>
 						<input type="date" name="date" title="${t('date')}" class="flex-grow" @change=${this.changeHandler} .value=${this.date.formatISODate()} required>
diff --git a/src/styles/buttonInput.css b/src/styles/buttonInput.css
@@ -10,7 +10,7 @@ input {
 
 input[type="number"] {
 	outline: none;
-	border: 1px solid gray;
+	border: .1em solid gray;
 	border-radius: 5px;
 }
 

@@ -19,7 +19,7 @@ button:focus,
 .selector label:focus,
 .arrowButton:focus,
 input:not([type="checkbox"]):focus {
-	outline: .1em solid gray;
+	outline: .2em solid #43a047;
 }
 
 button,