Livrare Lot 3 (Frontend): aplicație web, aplicație mobilă Android, extensie browser
- Surse complete web (React/Vite) + mobil (React Native/Expo) + extensie (MV3) - Documentație de livrare: ghid utilizare, matrice trasabilitate cerințe, raport testare furnizor - Artefacte binare: imagine Docker didi-frontend:lot3-1.0, APK, extensie v3.2.6 + SHA256SUMS - Configurare adresă platformă externalizată (build args / .env / config.js) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
commit
cec967f953
321 changed files with 80506 additions and 0 deletions
61
web/src/components/LanguageSwitcher/LanguageSwitcher.tsx
Normal file
61
web/src/components/LanguageSwitcher/LanguageSwitcher.tsx
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import React from 'react';
|
||||
import styled from '@emotion/styled';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { spacing, borderRadius, animation, sizing } from '../../theme';
|
||||
|
||||
export const LanguageSwitcher: React.FC = () => {
|
||||
const { i18n } = useTranslation();
|
||||
|
||||
const currentLang = i18n.language?.startsWith('ro') ? 'ro' : 'en';
|
||||
|
||||
const handleToggle = () => {
|
||||
const next = currentLang === 'en' ? 'ro' : 'en';
|
||||
i18n.changeLanguage(next);
|
||||
};
|
||||
|
||||
return (
|
||||
<SwitchButton
|
||||
onClick={handleToggle}
|
||||
aria-label={`Switch language to ${currentLang === 'en' ? 'Romanian' : 'English'}`}
|
||||
title={currentLang === 'en' ? 'Switch to Romanian' : 'Switch to English'}
|
||||
>
|
||||
<LangCode>{currentLang.toUpperCase()}</LangCode>
|
||||
</SwitchButton>
|
||||
);
|
||||
};
|
||||
|
||||
const SwitchButton = styled.button`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: ${sizing.button.lg}px;
|
||||
height: ${sizing.button.lg}px;
|
||||
background: var(--bg-surface);
|
||||
border: 1px solid var(--border-default);
|
||||
border-radius: ${borderRadius.md}px;
|
||||
cursor: pointer;
|
||||
color: var(--fg-primary);
|
||||
transition: all ${animation.duration.normal} ${animation.easing.default};
|
||||
|
||||
&:hover {
|
||||
background: var(--accent-subtle);
|
||||
border-color: var(--accent-border);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
box-shadow: 0 0 0 2px rgba(0, 145, 152, 0.3);
|
||||
}
|
||||
|
||||
&:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
`;
|
||||
|
||||
const LangCode = styled.span`
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.5px;
|
||||
user-select: none;
|
||||
`;
|
||||
Loading…
Add table
Add a link
Reference in a new issue