Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions src/app/components/theme-selector/theme-selector.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<div class="fixed top-4 right-4 z-50">
<div class="relative group">
<div class="relative">
<!-- Theme Toggle Button -->
<button
class="p-3 bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-white/20 hover:bg-white/90 transition-all duration-200 group-hover:shadow-xl"
class="p-3 bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-white/20 hover:bg-white/90 transition-all duration-200"
[class.shadow-xl]="isDropdownOpen()"
(click)="toggleDropdown()"
#dropdownButton
>
Expand All @@ -13,7 +14,13 @@

<!-- Dropdown Menu -->
<div
class="absolute top-full right-0 mt-2 w-72 bg-white/95 backdrop-blur-md rounded-2xl shadow-2xl border border-white/20 opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-300 transform scale-95 group-hover:scale-100"
class="absolute top-full right-0 mt-2 w-72 bg-white/95 backdrop-blur-md rounded-2xl shadow-2xl border border-white/20 transition-all duration-300 transform"
[class.opacity-100]="isDropdownOpen()"
[class.opacity-0]="!isDropdownOpen()"
[class.visible]="isDropdownOpen()"
[class.invisible]="!isDropdownOpen()"
[class.scale-100]="isDropdownOpen()"
[class.scale-95]="!isDropdownOpen()"
#dropdown
>
<div class="p-4">
Expand Down
16 changes: 14 additions & 2 deletions src/app/components/theme-selector/theme-selector.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, ChangeDetectionStrategy, inject } from '@angular/core';
import { Component, ChangeDetectionStrategy, inject, signal, HostListener } from '@angular/core';
import { ThemeService } from '../../services/theme.service';

@Component({
Expand All @@ -12,13 +12,25 @@ export class ThemeSelector {

protected readonly availableThemes = this.themeService.availableThemes;
protected readonly currentTheme = this.themeService.currentTheme;
protected readonly isDropdownOpen = signal(false);

protected selectTheme(themeId: string): void {
this.themeService.setTheme(themeId);
this.isDropdownOpen.set(false); // Close dropdown after selection
}

protected toggleDropdown(): void {
// This will be handled by CSS hover states
this.isDropdownOpen.set(!this.isDropdownOpen());
}

@HostListener('document:click', ['$event'])
protected onDocumentClick(event: Event): void {
const target = event.target as HTMLElement;
const themeSelector = target.closest('app-theme-selector');

if (!themeSelector && this.isDropdownOpen()) {
this.isDropdownOpen.set(false);
}
}

protected getThemePreviewClass(themeId: string, colorType: 'primary' | 'secondary' | 'accent'): string {
Expand Down