very first commit

This commit is contained in:
sdarbinyan
2026-01-18 18:57:06 +04:00
commit bd80896886
152 changed files with 28211 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
<div class="language-selector">
<button class="language-button" (click)="toggleDropdown()">
<img [src]="languageService.getCurrentLanguage()?.flagSvg"
[alt]="languageService.getCurrentLanguage()?.name"
class="language-flag">
<span class="language-code">{{ languageService.getCurrentLanguage()?.code?.toUpperCase() }}</span>
<svg class="dropdown-arrow" [class.rotated]="dropdownOpen" width="12" height="12" viewBox="0 0 12 12" fill="none">
<path d="M2.5 4.5L6 8L9.5 4.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="language-dropdown" [class.open]="dropdownOpen">
@for (lang of languageService.languages; track lang.code) {
<button
class="language-option"
[class.active]="languageService.currentLanguage() === lang.code"
[class.disabled]="!lang.enabled"
[disabled]="!lang.enabled"
(click)="selectLanguage(lang)">
<img [src]="lang.flagSvg" [alt]="lang.name" class="option-flag">
<span class="option-name">{{ lang.name }}</span>
</button>
}
</div>
</div>

View File

@@ -0,0 +1,180 @@
.language-selector {
position: relative;
display: inline-block;
}
.language-button {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 8px;
color: #ffffff;
cursor: pointer;
transition: all 0.3s ease;
font-size: 14px;
font-weight: 500;
&:hover {
background: rgba(255, 255, 255, 0.05);
border-color: rgba(255, 255, 255, 0.3);
}
.language-flag {
width: 20px;
height: 20px;
display: inline-block;
border-radius: 2px;
}
.language-code {
text-transform: uppercase;
letter-spacing: 0.5px;
}
.dropdown-arrow {
transition: transform 0.3s ease;
opacity: 0.7;
&.rotated {
transform: rotate(180deg);
}
}
}
.language-dropdown {
position: absolute;
top: calc(100% + 8px);
right: 0;
min-width: 180px;
background: var(--card-bg, #1a1a1a);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
z-index: 1000;
overflow: hidden;
&.open {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
}
.language-option {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 12px 16px;
background: transparent;
border: none;
color: #ffffff;
cursor: pointer;
transition: background 0.2s ease;
font-size: 14px;
text-align: left;
&:hover:not(.disabled) {
background: rgba(255, 255, 255, 0.05);
}
&.active {
background: rgba(255, 255, 255, 0.1);
font-weight: 600;
}
&.disabled {
opacity: 0.5;
cursor: not-allowed;
position: relative;
}
.option-flag {
width: 24px;
height: 24px;
display: inline-block;
border-radius: 3px;
}
.option-name {
flex: 1;
}
}
// Light theme adjustments
:host-context(.novo-header),
:host-context(.header) {
.language-button {
border-color: rgba(0, 0, 0, 0.2);
color: #333333;
&:hover {
background: rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.3);
}
}
}
:host-context(.light-theme) {
.language-button {
border-color: rgba(0, 0, 0, 0.2);
color: #333333;
&:hover {
background: rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.3);
}
}
.language-dropdown {
background: #ffffff;
border-color: rgba(0, 0, 0, 0.1);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}
.language-option {
color: #333333;
&:hover:not(.disabled) {
background: rgba(0, 0, 0, 0.05);
}
&.active {
background: rgba(0, 0, 0, 0.1);
}
}
}
// Mobile responsiveness
@media (max-width: 768px) {
.language-button {
padding: 6px 10px;
font-size: 13px;
.language-flag {
width: 18px;
height: 18px;
}
}
.language-dropdown {
min-width: 160px;
}
.language-option {
padding: 10px 14px;
font-size: 13px;
.option-flag {
width: 20px;
height: 20px;
}
}
}

View File

@@ -0,0 +1,41 @@
import { Component, HostListener, ElementRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LanguageService, Language } from '../../services/language.service';
@Component({
selector: 'app-language-selector',
standalone: true,
imports: [CommonModule],
templateUrl: './language-selector.component.html',
styleUrls: ['./language-selector.component.scss']
})
export class LanguageSelectorComponent {
dropdownOpen = false;
constructor(
public languageService: LanguageService,
private elementRef: ElementRef
) {}
toggleDropdown(): void {
this.dropdownOpen = !this.dropdownOpen;
}
selectLanguage(lang: Language): void {
if (lang.enabled) {
this.languageService.setLanguage(lang.code);
this.dropdownOpen = false;
}
}
closeDropdown(): void {
this.dropdownOpen = false;
}
@HostListener('document:click', ['$event'])
onClickOutside(event: Event): void {
if (!this.elementRef.nativeElement.contains(event.target)) {
this.dropdownOpen = false;
}
}
}