LanguageSwitcher
languageswitcher-1779394643362.tsx
'use client'
import { useState } from 'react'
const LANGS = [
{ code:'en', label:'English', flag:'🇬🇧' },
{ code:'fr', label:'Français', flag:'🇫🇷' },
{ code:'de', label:'Deutsch', flag:'🇩🇪' },
{ code:'es', label:'Español', flag:'🇪🇸' },
{ code:'ja', label:'日本語', flag:'🇯🇵' },
{ code:'zh', label:'中文', flag:'🇨🇳' },
]
export default function LanguageSwitcher({ languages = LANGS }) {
const [selected, setSelected] = useState(languages[0])
const [open, setOpen] = useState(false)
return (
<div style={{ position:'relative', display:'inline-block' }}>
<button onClick={()=>setOpen(!open)} style={{
display:'flex', alignItems:'center', gap:'8px',
background:'#fff', border:'2px solid #e2e8f0', borderRadius:'10px',
padding:'8px 14px', cursor:'pointer', fontSize:'14px', fontWeight:600, color:'#374151',
}}>
<span style={{ fontSize:'20px' }}>{selected.flag}</span>
{selected.label}
<span style={{ color:'#94a3b8', fontSize:'12px', transition:'transform 0.2s', transform:open?'rotate(180deg)':'none', display:'inline-block' }}>▾</span>
</button>
{open && (
<div style={{
position:'absolute', top:'calc(100%+6px)', left:0,
background:'#fff', border:'1px solid #e2e8f0', borderRadius:'12px',
boxShadow:'0 8px 30px rgba(0,0,0,0.1)', zIndex:100, overflow:'hidden', minWidth:'160px',
animation:'drop 0.15s ease',
}}>
<style>{'@keyframes drop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}'}</style>
{languages.map(lang => (
<div key={lang.code} onClick={()=>{setSelected(lang);setOpen(false)}} style={{
display:'flex', alignItems:'center', gap:'10px', padding:'10px 14px',
cursor:'pointer', fontSize:'14px', fontWeight:selected.code===lang.code?700:400,
color:selected.code===lang.code?'#6d28d9':'#374151',
background:selected.code===lang.code?'#faf5ff':'transparent',
transition:'background 0.1s',
}}
onMouseEnter={e=>e.currentTarget.style.background=selected.code===lang.code?'#faf5ff':'#f8fafc'}
onMouseLeave={e=>e.currentTarget.style.background=selected.code===lang.code?'#faf5ff':'transparent'}
>
<span style={{ fontSize:'20px' }}>{lang.flag}</span>
{lang.label}
{selected.code===lang.code && <span style={{ marginLeft:'auto', color:'#6d28d9' }}>✓</span>}
</div>
))}
</div>
)}
</div>
)
}Component info
CategoryUtility
Frameworkreact
TierFREE
Views0
Copies0
About
Language/locale switcher dropdown with flag emojis
More from Utility
'use client'
import { useState, useCallback } from 'react'
interface UploadedFile {
id: number
name: string
size: number
type: string
progress: number
done: boolean
error?: string
}
const ALLOWED = ['image/png', 'image/jpeg', 'image/wFileUploadZone
Utility
'use client'
import { useState } from 'react'
interface ClipItem {
id: number
content: string
type: 'text' | 'code' | 'url' | 'email'
pinned: boolean
time: number
}
const INITIAL: ClipItem[] = [
{ id: 1, content: 'npx empire-ui-mcp --stClipboardManager
Utility
'use client';
import { useState } from 'react';
export default function NeonToggle({ label = "Enable AI Mode", defaultOn = false, color = "#6366f1" }) {
const [on, setOn] = useState(defaultOn);
const [pressing, setPressing] = useState(false);
NeonToggle
Utility
'use client'
import { useState } from 'react'
const PRESETS = [
{ name: 'Gold', primary: '#C9A84C', bg: '#0A0A0A', accent: '#6366f1' },
{ name: 'Neon', primary: '#22d3ee', bg: '#030712', accent: '#a78bfa' },
{ name: 'Crimson', primary: '#ef444ThemeCustomizer
Utility