From 78d7aeba2c7ab1c01d82390327065e178142affb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sat, 14 Mar 2026 15:21:08 +0400 Subject: [PATCH] Refactor app menu sidebar * Rename to "app menu" across code * Move content to dedicated sections/components, introduce app menu links * Use CSS variable for hover background color across the app --- app/components/app-menu/about.gjs | 63 +++++++++++++ app/components/app-menu/home.gjs | 32 +++++++ app/components/app-menu/index.gjs | 38 ++++++++ app/components/app-menu/settings.gjs | 78 ++++++++++++++++ app/components/settings-pane.gjs | 128 --------------------------- app/styles/app.css | 54 ++++++++--- app/templates/application.gjs | 24 ++--- app/utils/icons.js | 2 + 8 files changed, 265 insertions(+), 154 deletions(-) create mode 100644 app/components/app-menu/about.gjs create mode 100644 app/components/app-menu/home.gjs create mode 100644 app/components/app-menu/index.gjs create mode 100644 app/components/app-menu/settings.gjs delete mode 100644 app/components/settings-pane.gjs diff --git a/app/components/app-menu/about.gjs b/app/components/app-menu/about.gjs new file mode 100644 index 0000000..b6d793e --- /dev/null +++ b/app/components/app-menu/about.gjs @@ -0,0 +1,63 @@ +import { on } from '@ember/modifier'; +import Icon from '#components/icon'; + + diff --git a/app/components/app-menu/home.gjs b/app/components/app-menu/home.gjs new file mode 100644 index 0000000..031980e --- /dev/null +++ b/app/components/app-menu/home.gjs @@ -0,0 +1,32 @@ +import { on } from '@ember/modifier'; +import { fn } from '@ember/helper'; +import Icon from '#components/icon'; + + diff --git a/app/components/app-menu/index.gjs b/app/components/app-menu/index.gjs new file mode 100644 index 0000000..2d60be8 --- /dev/null +++ b/app/components/app-menu/index.gjs @@ -0,0 +1,38 @@ +import Component from '@glimmer/component'; +import { action } from '@ember/object'; +import { tracked } from '@glimmer/tracking'; +import { fn } from '@ember/helper'; +import eq from 'ember-truth-helpers/helpers/eq'; + +import AppMenuHome from './home'; +import AppMenuSettings from './settings'; +import AppMenuAbout from './about'; + +export default class AppMenu extends Component { + @tracked currentView = 'menu'; // 'menu', 'settings', 'about' + + @action + setView(view) { + this.currentView = view; + } + + +} diff --git a/app/components/app-menu/settings.gjs b/app/components/app-menu/settings.gjs new file mode 100644 index 0000000..f85b7c7 --- /dev/null +++ b/app/components/app-menu/settings.gjs @@ -0,0 +1,78 @@ +import Component from '@glimmer/component'; +import { on } from '@ember/modifier'; +import { service } from '@ember/service'; +import { action } from '@ember/object'; +import Icon from '#components/icon'; +import eq from 'ember-truth-helpers/helpers/eq'; + +export default class AppMenuSettings extends Component { + @service settings; + + @action + updateApi(event) { + this.settings.updateOverpassApi(event.target.value); + } + + @action + toggleKinetic(event) { + this.settings.updateMapKinetic(event.target.value === 'true'); + } + + +} diff --git a/app/components/settings-pane.gjs b/app/components/settings-pane.gjs deleted file mode 100644 index c3230db..0000000 --- a/app/components/settings-pane.gjs +++ /dev/null @@ -1,128 +0,0 @@ -import Component from '@glimmer/component'; -import { on } from '@ember/modifier'; -import { service } from '@ember/service'; -import { action } from '@ember/object'; -import Icon from '#components/icon'; -import eq from 'ember-truth-helpers/helpers/eq'; - -export default class SettingsPane extends Component { - @service settings; - - @action - updateApi(event) { - this.settings.updateOverpassApi(event.target.value); - } - - @action - toggleKinetic(event) { - this.settings.updateMapKinetic(event.target.value === 'true'); - } - - -} diff --git a/app/styles/app.css b/app/styles/app.css index f7dcb77..94da2a3 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -2,6 +2,7 @@ :root { --default-list-color: #fc3; + --hover-bg: #f8f9fa; } html, @@ -251,10 +252,43 @@ body { overscroll-behavior: contain; } +.app-menu { + list-style: none; + padding: 0; + margin: 0 -1rem; +} + +.app-menu button { + width: 100%; + display: flex; + align-items: center; + gap: 0.8rem; + padding: 1rem; + padding-left: 1.4rem; + background: none; + border: none; + color: #333; + cursor: pointer; + text-align: left; + font-size: 0.95rem; + font-family: inherit; + transition: background-color 0.2s; +} + +.app-menu button:hover { + background-color: var(--hover-bg); +} + +.app-menu .icon { + color: #666; + width: 20px; + height: 20px; +} + .edit-form { margin: -1rem; margin-bottom: 1rem; - background: #f8f9fa; + background: var(--hover-bg); padding: 1rem; border-bottom: 1px solid #eee; } @@ -276,7 +310,7 @@ body { border: 1px solid #ddd; border-radius: 4px; font-family: inherit; - font-size: 1rem; + font-size: 0.95rem; box-sizing: border-box; /* Ensure padding doesn't overflow width */ } @@ -294,15 +328,7 @@ body { .settings-section { margin-bottom: 2rem; -} - -.settings-section h3 { - font-size: 1rem; - font-weight: bold; - color: #666; - margin: 0 0 0.5rem; - text-transform: uppercase; - letter-spacing: 0.5px; + font-size: 0.95rem; } .settings-section .form-group { @@ -400,7 +426,7 @@ body { } .place-item:hover { - background: #eee; + background: var(--hover-bg); } .place-name { @@ -946,7 +972,7 @@ button.create-place { .search-result-item:hover, .search-result-item:focus { - background: #f5f5f5; + background: var(--hover-bg); outline: none; } @@ -1011,7 +1037,7 @@ button.create-place { } .place-lists-manager .list-item:hover { - background: #f8f9fa; + background: var(--hover-bg); } .place-lists-manager label { diff --git a/app/templates/application.gjs b/app/templates/application.gjs index 1e99a01..8dae51b 100644 --- a/app/templates/application.gjs +++ b/app/templates/application.gjs @@ -2,7 +2,7 @@ import Component from '@glimmer/component'; import { pageTitle } from 'ember-page-title'; import Map from '#components/map'; import AppHeader from '#components/app-header'; -import SettingsPane from '#components/settings-pane'; +import AppMenu from '#components/app-menu/index'; import { service } from '@ember/service'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; @@ -14,7 +14,7 @@ export default class ApplicationComponent extends Component { @service mapUi; @service router; - @tracked isSettingsOpen = false; + @tracked isAppMenuOpen = false; get isSidebarOpen() { // We consider the sidebar "open" if we are in search or place routes. @@ -34,19 +34,19 @@ export default class ApplicationComponent extends Component { } @action - toggleSettings() { - this.isSettingsOpen = !this.isSettingsOpen; + toggleAppMenu() { + this.isAppMenuOpen = !this.isAppMenuOpen; } @action - closeSettings() { - this.isSettingsOpen = false; + closeAppMenu() { + this.isAppMenuOpen = false; } @action handleOutsideClick() { - if (this.isSettingsOpen) { - this.closeSettings(); + if (this.isAppMenuOpen) { + this.closeAppMenu(); } else if (this.router.currentRouteName === 'search') { this.router.transitionTo('index'); } else if (this.router.currentRouteName === 'place') { @@ -65,7 +65,7 @@ export default class ApplicationComponent extends Component {