Improved language picker
This commit is contained in:
@@ -7,17 +7,24 @@ export default function LanguagePicker() {
|
|||||||
const [language, setLanguage] = useAtom(languageState);
|
const [language, setLanguage] = useAtom(languageState);
|
||||||
const t = getTranslations(language);
|
const t = getTranslations(language);
|
||||||
|
|
||||||
const toggleLanguage = () => {
|
|
||||||
setLanguage(language === 'en' ? 'fi' : 'en');
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<div className={styles.picker}>
|
||||||
<button
|
<button
|
||||||
className={styles.picker}
|
className={styles.flag}
|
||||||
onClick={toggleLanguage}
|
onClick={() => setLanguage('fi')}
|
||||||
aria-label={`Switch to ${language === 'en' ? t.languages.fi : t.languages.en}`}
|
aria-label={`Switch to ${t.languages.fi}`}
|
||||||
|
aria-pressed={language === 'fi'}
|
||||||
>
|
>
|
||||||
<span className={styles.label}>{language === 'en' ? 'FI' : 'EN'}</span>
|
<span className={styles.flagIcon}>🇫🇮</span>
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
className={styles.flag}
|
||||||
|
onClick={() => setLanguage('en')}
|
||||||
|
aria-label={`Switch to ${t.languages.en}`}
|
||||||
|
aria-pressed={language === 'en'}
|
||||||
|
>
|
||||||
|
<span className={styles.flagIcon}>🇬🇧</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,4 +6,6 @@ export const activeSectionState = atom('home');
|
|||||||
|
|
||||||
export const themeState = atom('dark');
|
export const themeState = atom('dark');
|
||||||
|
|
||||||
export const languageState = atom('en');
|
export const languageState = atom(
|
||||||
|
typeof navigator !== 'undefined' && navigator.language?.startsWith('fi') ? 'fi' : 'en'
|
||||||
|
);
|
||||||
|
|||||||
@@ -1,27 +1,45 @@
|
|||||||
@use '../variables' as *;
|
@use '../variables' as *;
|
||||||
|
|
||||||
.picker {
|
.picker {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.25rem;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 1px solid var(--text-secondary);
|
border: 1px solid var(--text-secondary);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 0.4rem 0.8rem;
|
padding: 0.2rem;
|
||||||
color: var(--text-primary);
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
padding: 0.15rem;
|
||||||
|
gap: 0.15rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.flag {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 0.85rem;
|
padding: 0.2rem;
|
||||||
font-weight: 500;
|
border-radius: 2px;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&[aria-pressed='false'] {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: var(--accent);
|
opacity: 1;
|
||||||
color: var(--accent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
padding: 0.35rem 0.6rem;
|
padding: 0.15rem;
|
||||||
font-size: 0.8rem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.flagIcon {
|
||||||
|
font-size: 1.1rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user