diff --git a/src/app/app.html b/src/app/app.html
index d3f7994..be2cdf4 100644
--- a/src/app/app.html
+++ b/src/app/app.html
@@ -1,3 +1,7 @@
+
+ {{ translation.common.skipToContent }}
+
+
diff --git a/src/app/app.ts b/src/app/app.ts
index 48ff5bc..0f2e228 100644
--- a/src/app/app.ts
+++ b/src/app/app.ts
@@ -4,25 +4,28 @@ import { HeaderMenu } from './features/header-menu/header-menu';
import { PopupService } from './services/popup.service';
import { SettingsService } from './services/settings.service';
import { NgComponentOutlet, isPlatformBrowser, isPlatformServer, DOCUMENT } from '@angular/common';
+import { SkipLinks } from './components/skip-links/skip-links';
+import { TranslationService } from './services/translation.service';
@Component({
selector: 'app-root',
- imports: [RouterOutlet, HeaderMenu, NgComponentOutlet],
+ imports: [RouterOutlet, HeaderMenu, NgComponentOutlet, SkipLinks],
templateUrl: './app.html',
styleUrl: './app.scss',
})
export class App {
protected popupService = inject(PopupService);
protected settingsService = inject(SettingsService);
- private platformId = inject(PLATFORM_ID);
+ protected translation = inject(TranslationService).translation;
+ private platformID = inject(PLATFORM_ID);
private document = inject(DOCUMENT);
private rootHtmlElement!: HTMLElement;
constructor() {
- if (isPlatformServer(this.platformId)) {
+ if (isPlatformServer(this.platformID)) {
this.rootHtmlElement = this.document.documentElement;
- } else if (isPlatformBrowser(this.platformId)) {
+ } else if (isPlatformBrowser(this.platformID)) {
this.rootHtmlElement = document.documentElement;
}
@@ -38,9 +41,9 @@ export class App {
const lang = this.settingsService.language();
const langMap: Record = {
- 'KR': 'ko',
- 'JP': 'ja',
- 'EN': 'en'
+ KR: 'ko',
+ JP: 'ja',
+ EN: 'en',
};
this.rootHtmlElement.lang = langMap[lang] || 'en';
diff --git a/src/app/components/skip-links/skip-links.html b/src/app/components/skip-links/skip-links.html
new file mode 100644
index 0000000..6dbc743
--- /dev/null
+++ b/src/app/components/skip-links/skip-links.html
@@ -0,0 +1 @@
+
diff --git a/src/app/components/skip-links/skip-links.scss b/src/app/components/skip-links/skip-links.scss
new file mode 100644
index 0000000..b768a59
--- /dev/null
+++ b/src/app/components/skip-links/skip-links.scss
@@ -0,0 +1,48 @@
+$default_animation_duration: 0.4s;
+
+:host {
+ display: flex;
+ position: fixed;
+
+ align-items: center;
+ justify-content: center;
+
+ top: -140px;
+ left: 20px;
+
+ --animation-duration: calc(#{$default_animation_duration} * var(--motion-duration-multiplier));
+
+ background: light-dark(rgba(255, 255, 255, 0.9), rgba(15, 15, 15, 0.9));
+ padding: calc(40px + 12px) 24px 12px;
+ z-index: 20000;
+
+ transition: top var(--animation-duration) cubic-bezier(0.18, 0.89, 0.32, 1.28);
+ border-radius: 0 0 12px 12px;
+
+ box-shadow: 0 0 40px oklch(0 0 0 / 15%);
+ vertical-align: middle;
+ font-weight: 700;
+ font-size: 18px;
+ height: 40px;
+
+ &:focus-within {
+ top: -40px;
+ outline: 2px solid var(--selection-outline-color);
+ }
+
+ ::ng-deep a {
+ color: light-dark(black, white);
+ text-decoration: none;
+
+ outline: none;
+ width: 0;
+
+ opacity: 0;
+ overflow: hidden;
+
+ &:focus {
+ width: unset;
+ opacity: 1;
+ }
+ }
+}
diff --git a/src/app/components/skip-links/skip-links.ts b/src/app/components/skip-links/skip-links.ts
new file mode 100644
index 0000000..27a7abf
--- /dev/null
+++ b/src/app/components/skip-links/skip-links.ts
@@ -0,0 +1,12 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'skip-links',
+ imports: [],
+ templateUrl: './skip-links.html',
+ styleUrl: './skip-links.scss',
+ host: {
+ 'tabindex': '-1',
+ }
+})
+export class SkipLinks {}