diff --git a/apps/blog/src/assets/HOA_logo_blue.png b/apps/blog/src/assets/HOA_logo_blue.png
new file mode 100644
index 000000000..d1df0947f
Binary files /dev/null and b/apps/blog/src/assets/HOA_logo_blue.png differ
diff --git a/apps/blog/src/assets/HOA_logo_white.png b/apps/blog/src/assets/HOA_logo_white.png
new file mode 100644
index 000000000..7b55747c3
Binary files /dev/null and b/apps/blog/src/assets/HOA_logo_white.png differ
diff --git a/apps/blog/src/assets/i18n/en.json b/apps/blog/src/assets/i18n/en.json
index bf0e7d579..0521de88f 100644
--- a/apps/blog/src/assets/i18n/en.json
+++ b/apps/blog/src/assets/i18n/en.json
@@ -9,9 +9,8 @@
"recommended": "Recommended Articles",
"angularNews": "Angular News",
"guides": "Guides",
- "partners": "Community partners",
- "mainPartner": "Main partner",
"angularInDepth": "Angular In Depth",
+ "articleTypes": "Article types",
"categories": {
"all": "Latest",
"news": "News",
@@ -24,16 +23,27 @@
"home": "Home Page",
"about": "About us",
"meetups": "Angular Meetups",
+ "guides": "Angular Guides",
+ "news": "Angular News",
+ "in_depth": "In-Depth articles",
+ "partnership": "Let's discuss partnership",
"become_author": "Become an author",
"newsletter": "Angular.letter",
"navLinks": "Navigation links",
"roadmap": "Roadmap",
"toggle_theme": "Toggle theme",
+ "open_search_dialog": "Open search dialog",
"languagePicker": {
"pl": "Polish",
- "en": "English"
+ "en": "English",
+ "select_lang": "Select language"
}
},
+ "footer": {
+ "mainPartner": "Main partner",
+ "partners": "Community partners",
+ "al-description": "This is the place where you can learn Angular, discover best practices, and stay updated with the latest news and trends"
+ },
"authorPage": {
"posted_by": "Posted by {{name}}"
},
@@ -219,6 +229,7 @@
"changeLangToEnglish": "Change language to English"
},
"socialLinks": {
+ "title": "Social media",
"facebook": "Like our Facebook page",
"twitter-x": "Follow us on X (formerly Twitter)",
"linkedIn": "Follow us on LinkedIn",
diff --git a/apps/blog/src/assets/i18n/pl.json b/apps/blog/src/assets/i18n/pl.json
index 0e7fac24d..6e6d7a02d 100644
--- a/apps/blog/src/assets/i18n/pl.json
+++ b/apps/blog/src/assets/i18n/pl.json
@@ -9,9 +9,8 @@
"recommended": "Polecane Artykuły",
"angularNews": "Wiadomości ze świata Angulara",
"guides": "Poradniki",
- "partners": "Community partnerzy",
- "mainPartner": "Główny partner",
"angularInDepth": "Angular In Depth",
+ "articleTypes": "Typy artykułów",
"categories": {
"all": "Najnowsze",
"news": "Nowości",
@@ -24,16 +23,27 @@
"home": "Strona Główna",
"about": "O nas",
"meetups": "Angular Meetups",
+ "guides": "Angular Guides",
+ "news": "Angular News",
+ "in_depth": "Artykuły In-Depth",
+ "partnership": "Porozmawiajmy o partnerstwie",
"become_author": "Zostań autorem",
"newsletter": "Angular.letter",
"navLinks": "Menu",
"roadmap": "Roadmap",
"toggle_theme": "Przełącz motyw",
+ "open_search_dialog": "Otwórz okno wyszukiwania",
"languagePicker": {
"pl": "Polski",
- "en": "Angielski"
+ "en": "Angielski",
+ "select_lang": "Wybierz język"
}
},
+ "footer": {
+ "partners": "Community partnerzy",
+ "mainPartner": "Główny partner",
+ "al-description": "To jest miejsce, w którym możesz nauczyć się Angulara, odkrywać najlepsze praktyki i być na bieżąco z najnowszymi wiadomościami i trendami"
+ },
"home": {
"latest": "Latest articles"
},
@@ -222,6 +232,7 @@
"changeLangToEnglish": "Zmień język na angielski"
},
"socialLinks": {
+ "title": "Media społecznościowe",
"facebook": "Polub nas na Facebooku",
"twitter-x": "Obserwuj nas na X (dawniej Twitter)",
"linkedIn": "Obserwuj nas na LinkedInie",
diff --git a/libs/blog/articles/feature-article/src/lib/article-details/article-details.component.html b/libs/blog/articles/feature-article/src/lib/article-details/article-details.component.html
index 60b0596b2..2b62ea74b 100644
--- a/libs/blog/articles/feature-article/src/lib/article-details/article-details.component.html
+++ b/libs/blog/articles/feature-article/src/lib/article-details/article-details.component.html
@@ -15,7 +15,7 @@
/>
-
+
{{ articleDetails().readingTime }} min
diff --git a/libs/blog/articles/feature-article/src/lib/article-share-icons/article-share-icons.component.ts b/libs/blog/articles/feature-article/src/lib/article-share-icons/article-share-icons.component.ts
index 411c9aab2..3f271c5e9 100644
--- a/libs/blog/articles/feature-article/src/lib/article-share-icons/article-share-icons.component.ts
+++ b/libs/blog/articles/feature-article/src/lib/article-share-icons/article-share-icons.component.ts
@@ -29,11 +29,15 @@ type ShareItem = {
[href]="item.href"
target="_blank"
>
-
+
}
-
-
+
`,
})
diff --git a/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.html b/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.html
index 17802ad09..cd97e47b9 100644
--- a/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.html
+++ b/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.html
@@ -1,15 +1,23 @@
-
+
@for (category of categories(); track $index) {
}
-
+
+ @if (i === 1) {
+
+ }
}
} @else {
+
}
-
-
-
@@ -41,4 +47,13 @@
{{ t('categories.showAll', { category: t(selected().translationPath) }) }}
+
+
+
+
+
+
diff --git a/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.ts b/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.ts
index c49e13dae..0ffd14baa 100644
--- a/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.ts
+++ b/libs/blog/articles/feature-latest-articles/src/lib/feature-latest-articles/feature-latest-articles.component.ts
@@ -1,10 +1,14 @@
-import { NgClass } from '@angular/common';
+import { FocusKeyManager } from '@angular/cdk/a11y';
+import { NgClass, NgTemplateOutlet } from '@angular/common';
import {
+ AfterViewInit,
ChangeDetectionStrategy,
Component,
computed,
inject,
linkedSignal,
+ QueryList,
+ ViewChildren,
} from '@angular/core';
import { RouterLink } from '@angular/router';
import { TranslocoDirective } from '@jsverse/transloco';
@@ -22,6 +26,7 @@ import {
} from '@angular-love/blog/shared/ui-card';
import { PillDirective } from '@angular-love/blog/shared/ui-pill';
import { ArticleCategory } from '@angular-love/contracts/articles';
+import { FocusableItemDirective } from '@angular-love/ui-focusable';
import { RepeatDirective } from '@angular-love/utils';
import { CategoryListItem, injectCategories } from './categories.const';
@@ -36,19 +41,21 @@ import { CategoryListItem, injectCategories } from './categories.const';
CardComponent,
GradientCardDirective,
NgClass,
+ NgTemplateOutlet,
TranslocoDirective,
ArticleRegularCardSkeletonComponent,
RepeatDirective,
RouterLink,
ButtonComponent,
PillDirective,
+ FocusableItemDirective,
],
host: {
'data-testid': 'latest-articles-container',
},
providers: [ArticleListStore],
})
-export class FeatureLatestArticlesComponent {
+export class FeatureLatestArticlesComponent implements AfterViewInit {
readonly selectedCategorySlug = computed(
() => this.selected().slug,
);
@@ -57,6 +64,11 @@ export class FeatureLatestArticlesComponent {
() => this.categories()[0],
);
+ @ViewChildren(FocusableItemDirective)
+ private readonly _focusableItems!: QueryList;
+
+ private _keyManager!: FocusKeyManager;
+
readonly take = 8;
private readonly _articleListStore = inject(ArticleListStore);
@@ -80,4 +92,17 @@ export class FeatureLatestArticlesComponent {
this._articleListStore.fetchArticleList(query);
}
+
+ ngAfterViewInit(): void {
+ this._keyManager = new FocusKeyManager(this._focusableItems)
+ .withWrap()
+ .withHorizontalOrientation('ltr');
+
+ // Set initial active item
+ this._keyManager.setActiveItem(0);
+ }
+
+ onPillKeydown(event: KeyboardEvent) {
+ this._keyManager.onKeydown(event);
+ }
}
diff --git a/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.html b/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.html
index 7804c05b9..4301dc8e3 100644
--- a/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.html
+++ b/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.html
@@ -1,17 +1,16 @@
-
-
-
-
-
-
+
+
diff --git a/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.ts b/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.ts
index f3e345f17..f26d948f3 100644
--- a/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.ts
+++ b/libs/blog/articles/ui-article-card/src/lib/components/article-compact-card/article-compact-card.component.ts
@@ -1,4 +1,3 @@
-import { NgOptimizedImage } from '@angular/common';
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
import { RouterLink } from '@angular/router';
import { FastSvgComponent } from '@push-based/ngx-fast-svg';
@@ -10,13 +9,7 @@ import { AvatarComponent } from '@angular-love/blog/shared/ui-avatar';
@Component({
selector: 'al-article-compact-card',
changeDetection: ChangeDetectionStrategy.OnPush,
- imports: [
- AvatarComponent,
- RouterLink,
- AlLocalizePipe,
- FastSvgComponent,
- NgOptimizedImage,
- ],
+ imports: [AvatarComponent, RouterLink, AlLocalizePipe, FastSvgComponent],
templateUrl: './article-compact-card.component.html',
})
export class ArticleCompactCardComponent {
diff --git a/libs/blog/articles/ui-article-card/src/lib/components/article-hero-card/article-hero-card.component.html b/libs/blog/articles/ui-article-card/src/lib/components/article-hero-card/article-hero-card.component.html
index d6c4bfc76..69e7353f5 100644
--- a/libs/blog/articles/ui-article-card/src/lib/components/article-hero-card/article-hero-card.component.html
+++ b/libs/blog/articles/ui-article-card/src/lib/components/article-hero-card/article-hero-card.component.html
@@ -30,7 +30,7 @@
-
+
-
+