From 30397cb9479fa7e0e7bbadf3b9d702af38028711 Mon Sep 17 00:00:00 2001 From: Mehul Kiran Chaudhari <55375534+MehulKChaudhari@users.noreply.github.com> Date: Thu, 20 Mar 2025 00:01:30 +0530 Subject: [PATCH 1/4] feat: add sidebar navigation --- app/components/sidebar-nav.css | 144 +++++++++++++++++++++++++++++++++ app/components/sidebar-nav.hbs | 68 ++++++++++++++++ app/components/sidebar-nav.js | 52 ++++++++++++ app/styles/application.css | 11 +++ app/templates/application.hbs | 40 ++++----- package-lock.json | 41 ++++++++-- package.json | 1 + 7 files changed, 333 insertions(+), 24 deletions(-) create mode 100644 app/components/sidebar-nav.css create mode 100644 app/components/sidebar-nav.hbs create mode 100644 app/components/sidebar-nav.js diff --git a/app/components/sidebar-nav.css b/app/components/sidebar-nav.css new file mode 100644 index 0000000..34a6d8d --- /dev/null +++ b/app/components/sidebar-nav.css @@ -0,0 +1,144 @@ +.sidebar { + position: sticky; + top: 0; + width: 20%; + height: 100vh; + background-color: #f8f9fa; + border-right: 1px solid #e9ecef; + padding: 1rem 1rem 1.5rem 1rem; + overflow-y: auto; +} + +.sidebar-content { + padding-top: 0.5rem; +} + +.sidebar-title { + font-size: 1.4rem; + font-weight: 600; + margin-bottom: 1rem; + color: #212529; +} + +.nav-list { + list-style: none; + padding: 0; + margin: 0; +} + +.nav-item { + display: block; + width: 90%; + text-align: left; + padding: 0.25rem 0.5rem; + margin-bottom: 0.1rem; + color: #212529; + text-decoration: none; + border-radius: 4px; + transition: all 0.2s ease; + font-size: 1.1rem; +} + +li > .nav-item { + color: #212529; + font-weight: 500; +} + +li > .nav-item:hover { + background-color: #f1f3f5; +} + +.sub-nav-list { + list-style: none; + padding-left: 1rem; + margin: 0.15rem 0; +} + +.sub-nav-item { + font-size: 1rem; + padding: 0.1rem 0; +} + +.sub-nav-item .nav-item { + color: #E04E39; + padding: 0.2rem 0.5rem; +} + +.sub-nav-item .nav-item:hover { + background-color: #fff1ef; +} + +.menu-toggle:focus { + outline: 2px solid #E04E39; + outline-offset: 2px; +} + +.sub-nav-item .nav-item { + color: #c43e2d; +} + +.nav-item[aria-current="true"] { + background-color: #f1f3f5; + font-weight: bold; +} + +.sub-nav-item .nav-item[aria-current="true"] { + background-color: #fff1ef; + font-weight: bold; +} + +@media (max-width: 768px) { + .sidebar { + position: fixed; + top: 0; + left: 0; + width: 85%; + height: 100vh; + z-index: 1000; + transform: translateX(-100%); + transition: transform 0.3s ease; + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); + } + + .sidebar.open { + transform: translateX(0); + } + + .menu-toggle { + position: fixed; + top: 1rem; + right: 1rem; + z-index: 1001; + width: 44px; + height: 44px; + border-radius: 50%; + background: #E04E39; + border: none; + color: white; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + + .menu-toggle:hover { + background: #c43e2d; + } + + .overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 999; + backdrop-filter: blur(2px); + } + + .overlay.open { + display: block; + } +} \ No newline at end of file diff --git a/app/components/sidebar-nav.hbs b/app/components/sidebar-nav.hbs new file mode 100644 index 0000000..b245140 --- /dev/null +++ b/app/components/sidebar-nav.hbs @@ -0,0 +1,68 @@ +{{#if this.isMobile}} + +
+{{/if}} + + \ No newline at end of file diff --git a/app/components/sidebar-nav.js b/app/components/sidebar-nav.js new file mode 100644 index 0000000..02140fd --- /dev/null +++ b/app/components/sidebar-nav.js @@ -0,0 +1,52 @@ +import Component from '@glimmer/component'; +import { tracked } from '@glimmer/tracking'; +import { inject as service } from '@ember/service'; +import { action } from '@ember/object'; + +export default class SidebarNavComponent extends Component { + @service scroll; + @service intl; + + @tracked activeSection = ''; + @tracked isMenuOpen = false; + @tracked isMobile = false; + + constructor() { + super(...arguments); + if (typeof window !== 'undefined') { + this.checkMobile(); + window.addEventListener('resize', this.checkMobile); + } + } + + willDestroy() { + super.willDestroy(); + if (typeof window !== 'undefined') { + window.removeEventListener('resize', this.checkMobile); + } + } + + get currentSection() { + return this.scroll?.activeSection || ''; + } + + @action + scrollToSection(sectionId) { + this.scroll.scrollToSection(sectionId); + } + + @action + checkMobile() { + this.isMobile = window.innerWidth <= 768; + } + + @action + toggleMenu() { + this.isMenuOpen = !this.isMenuOpen; + } + + @action + closeMenu() { + this.isMenuOpen = false; + } +} diff --git a/app/styles/application.css b/app/styles/application.css index 9867445..569b249 100644 --- a/app/styles/application.css +++ b/app/styles/application.css @@ -17,6 +17,17 @@ margin-top: 4rem; } +.content-wrapper { + display: flex; + width: 100%; +} + +.main-content { + flex: 1; + padding: 2rem; + overflow-y: auto; +} + @media screen and (min-width: 30rem) { .header, .main { diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 4de944e..015cded 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -12,24 +12,28 @@ -
-

- {{t "layout.application.title"}} -

+
+ -

- {{t "layout.application.description-1" htmlSafe=true}} -

+
+

+ {{t "layout.application.title"}} +

-

- {{t "layout.application.description-2" htmlSafe=true}} -

+

+ {{t "layout.application.description-1" htmlSafe=true}} +

- {{#each @model as |section|}} -
- -
- {{/each}} -
\ No newline at end of file +

+ {{t "layout.application.description-2" htmlSafe=true}} +

+ + {{#each @model as |section|}} +
+ +
+ {{/each}} +
+ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 21629fe..d1b6fc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "ember-source": "~4.4.0", "ember-template-lint": "^4.10.0", "ember-test-selectors": "^6.0.0", + "ember-truth-helpers": "^4.0.3", "eslint": "^8.17.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-ember": "^10.6.1", @@ -8566,9 +8567,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001355", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz", - "integrity": "sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g==", + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "dev": true, "funding": [ { @@ -8578,6 +8579,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "CC-BY-4.0" @@ -14677,6 +14682,20 @@ "node": "12.* || 14.* || >= 16.*" } }, + "node_modules/ember-truth-helpers": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ember-truth-helpers/-/ember-truth-helpers-4.0.3.tgz", + "integrity": "sha512-T6Ogd3pk9FxYiZfSxdjgn3Hb3Ksqgw7CD23V9qfig9jktNdkNEHo4+3PA3cSD/+3a2kdH3KmNvKyarVuzdtEkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@embroider/addon-shim": "^1.8.6", + "ember-functions-as-helper-polyfill": "^2.1.2" + }, + "peerDependencies": { + "ember-source": ">=3.28.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -33154,9 +33173,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001355", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz", - "integrity": "sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g==", + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "dev": true }, "capture-exit": { @@ -37781,6 +37800,16 @@ "ember-cli-version-checker": "^5.1.2" } }, + "ember-truth-helpers": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ember-truth-helpers/-/ember-truth-helpers-4.0.3.tgz", + "integrity": "sha512-T6Ogd3pk9FxYiZfSxdjgn3Hb3Ksqgw7CD23V9qfig9jktNdkNEHo4+3PA3cSD/+3a2kdH3KmNvKyarVuzdtEkA==", + "dev": true, + "requires": { + "@embroider/addon-shim": "^1.8.6", + "ember-functions-as-helper-polyfill": "^2.1.2" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", diff --git a/package.json b/package.json index 868e4f9..791b069 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "ember-source": "~4.4.0", "ember-template-lint": "^4.10.0", "ember-test-selectors": "^6.0.0", + "ember-truth-helpers": "^4.0.3", "eslint": "^8.17.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-ember": "^10.6.1", From 8f2b792d4b032beeb4539e7e143a7a0b3b32e053 Mon Sep 17 00:00:00 2001 From: Mehul Kiran Chaudhari <55375534+MehulKChaudhari@users.noreply.github.com> Date: Thu, 20 Mar 2025 00:08:30 +0530 Subject: [PATCH 2/4] fix: lint --- app/components/sidebar-nav.hbs | 8 ++++---- translations/en-us.yaml | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/components/sidebar-nav.hbs b/app/components/sidebar-nav.hbs index b245140..b87e372 100644 --- a/app/components/sidebar-nav.hbs +++ b/app/components/sidebar-nav.hbs @@ -3,7 +3,7 @@ type="button" local-class="menu-toggle" {{on "click" this.toggleMenu}} - aria-label="Toggle menu" + aria-label={{t "component.sidebar-nav.toggle-menu"}} > ≡ @@ -17,14 +17,14 @@