Skip to content

Commit f418c02

Browse files
committed
Less obvious language picker
1 parent 77c43c5 commit f418c02

File tree

2 files changed

+35
-119
lines changed

2 files changed

+35
-119
lines changed

vue3-dashboard/src/components/TheNav.vue

Lines changed: 17 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -148,41 +148,14 @@
148148

149149
<div class="flex justify-end items-center gap-2">
150150
<div class="language-selector">
151-
<button
152-
@click="showLanguageMenu = !showLanguageMenu"
153-
class="nav-button-base language-select-button"
154-
type="button"
155-
>
156-
{{ currentLanguageLabel }}
157-
<svg
158-
class="language-select-arrow"
159-
:class="{ 'rotate-180': showLanguageMenu }"
160-
xmlns="http://www.w3.org/2000/svg"
161-
viewBox="0 0 20 20"
162-
fill="currentColor"
163-
>
164-
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
165-
</svg>
166-
</button>
167-
<div
168-
v-if="showLanguageMenu"
169-
class="language-menu"
151+
<select
152+
v-model="selectedLanguage"
153+
@change="onLanguageChange"
154+
class="language-select nav-button-base"
170155
>
171-
<button
172-
@click="changeLanguage('en')"
173-
class="language-menu-item"
174-
:class="{ 'language-menu-item-active': locale.value === 'en' }"
175-
>
176-
{{ $t('nav.english') }}
177-
</button>
178-
<button
179-
@click="changeLanguage('id')"
180-
class="language-menu-item"
181-
:class="{ 'language-menu-item-active': locale.value === 'id' }"
182-
>
183-
{{ $t('nav.indonesian') }}
184-
</button>
185-
</div>
156+
<option value="en">{{ $t('nav.english') }}</option>
157+
<option value="id">{{ $t('nav.indonesian') }}</option>
158+
</select>
186159
</div>
187160
<a
188161
class="nav-button-base"
@@ -460,7 +433,16 @@ const selectedMonth = computed({
460433
set: (value) => { store.setSelectedMonth(value) }
461434
})
462435
463-
const showLanguageMenu = ref(false)
436+
// Language selection
437+
const selectedLanguage = computed({
438+
get: () => locale.value,
439+
set: (value) => { locale.value = value }
440+
})
441+
442+
const onLanguageChange = () => {
443+
// Save to localStorage for persistence
444+
localStorage.setItem('preferred-language', selectedLanguage.value)
445+
}
464446
465447
// Generate month options: current month + past 6 months
466448
const generateMonthOptions = () => {
@@ -486,23 +468,6 @@ const onMonthChange = () => {
486468
console.log('Selected month:', selectedMonth.value)
487469
}
488470
489-
const currentLanguageLabel = computed(() => {
490-
// Show language name in its own language
491-
if (locale.value === 'en') {
492-
return 'English'
493-
} else {
494-
// Use Indonesian translation for Indonesian
495-
return t('nav.indonesian')
496-
}
497-
})
498-
499-
const changeLanguage = (lang) => {
500-
locale.value = lang
501-
showLanguageMenu.value = false
502-
// Save to localStorage for persistence
503-
localStorage.setItem('preferred-language', lang)
504-
}
505-
506471
// Navigate to upload page
507472
const navigateToUpload = () => {
508473
emit('navigate', 'upload')
@@ -513,13 +478,6 @@ const navigateToDashboard = () => {
513478
emit('navigate', 'dashboard')
514479
}
515480
516-
// Close menu when clicking outside
517-
const handleClickOutside = (event) => {
518-
if (!event.target.closest('.language-selector')) {
519-
showLanguageMenu.value = false
520-
}
521-
}
522-
523481
// Initialize expanded state based on current selection
524482
const initializeExpandedState = () => {
525483
if (store.currentLevel === 'facility' && store.currentId) {
@@ -542,11 +500,6 @@ const initializeExpandedState = () => {
542500
}
543501
544502
onMounted(() => {
545-
document.addEventListener('click', handleClickOutside)
546503
initializeExpandedState()
547504
})
548-
549-
onUnmounted(() => {
550-
document.removeEventListener('click', handleClickOutside)
551-
})
552505
</script>

vue3-dashboard/src/style.css

Lines changed: 18 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@
11851185
appearance: none;
11861186
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="white"><path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" /></svg>');
11871187
background-repeat: no-repeat;
1188-
background-position: right 8px center;
1188+
background-position: right 10px center;
11891189
background-size: 16px;
11901190

11911191
@media screen and (min-width: 660px) {
@@ -1212,65 +1212,28 @@
12121212
}
12131213
}
12141214

1215-
/* Language selector button - uses nav-button-base design with flex layout */
1216-
.language-select-button {
1217-
display: flex;
1218-
align-items: center;
1219-
justify-content: center;
1220-
gap: 0.5rem;
1215+
/* Language selector - standard dropdown using nav-button-base design */
1216+
.language-select {
1217+
--nav-btn-padding-x: 40px; /* Extra padding for dropdown arrow */
1218+
padding-right: 40px;
1219+
padding-left: 20px;
1220+
display: block;
12211221
width: 100%;
1222-
1222+
appearance: none;
1223+
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="white"><path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" /></svg>');
1224+
background-repeat: no-repeat;
1225+
background-position: right 12px center;
1226+
background-size: 16px;
1227+
background-color: transparent;
1228+
outline: 1px solid #ffffff60;
1229+
outline-offset: -1px;
12231230
@media screen and (min-width: 660px) {
12241231
width: auto;
12251232
}
1226-
}
1227-
1228-
.language-select-arrow {
1229-
width: 16px;
1230-
height: 16px;
1231-
transition: transform 0.2s ease;
1232-
}
12331233

1234-
.language-menu {
1235-
position: absolute;
1236-
right: 0;
1237-
top: 100%;
1238-
margin-top: 0.25rem;
1239-
background: white;
1240-
border-radius: 4px;
1241-
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
1242-
border: 1px solid #e5e7eb;
1243-
min-width: 150px;
1244-
z-index: 50;
1245-
overflow: hidden;
1246-
}
1247-
1248-
.language-menu-item {
1249-
width: 100%;
1250-
text-align: left;
1251-
padding: 0.5rem 1rem;
1252-
background: none;
1253-
border: none;
1254-
cursor: pointer;
1255-
font-size: 0.875rem;
1256-
color: #333;
1257-
transition: background-color 0.2s ease;
1258-
1259-
&:first-child {
1260-
border-radius: 4px 4px 0 0;
1261-
}
1262-
1263-
&:last-child {
1264-
border-radius: 0 0 4px 4px;
1265-
}
1266-
1267-
&:hover {
1268-
background-color: #f3f4f6;
1269-
}
1270-
1271-
&.language-menu-item-active {
1272-
background-color: #eff6ff;
1273-
font-weight: 600;
1234+
option {
1235+
background: #fff;
1236+
color: #333;
12741237
}
12751238
}
12761239

0 commit comments

Comments
 (0)