66 ChevronDown , Menu , X , Users , ChevronLeft ,
77 LayoutDashboard , Calendar , ArrowUpCircle ,
88 Cloud , Server , Sparkles , Radio , History ,
9- MessageCircle ,
9+ MessageCircle , MoreHorizontal ,
1010} from ' lucide-vue-next'
1111
1212const route = useRoute ()
@@ -20,6 +20,8 @@ const showFeedbackModal = ref(false)
2020const showUserMenu = ref (false )
2121const showMobileMenu = ref (false )
2222const showGetStartedMenu = ref (false )
23+ const showMoreNav = ref (false )
24+ const showMoreActions = ref (false )
2325
2426const config = useRuntimeConfig ()
2527const { activeOrg } = useCurrentOrg ()
@@ -162,6 +164,10 @@ function isActiveRoute(to: string, exact: boolean) {
162164 return route .path === localizedTo || route .path .startsWith (` ${localizedTo }/ ` )
163165}
164166
167+ const primaryNavLabels = [' Dashboard' , ' Jobs' , ' Candidates' , ' Applications' , ' Interviews' ]
168+ const primaryNavItems = computed (() => navItems .value .filter (i => primaryNavLabels .includes (i .label )))
169+ const moreNavItems = computed (() => navItems .value .filter (i => ! primaryNavLabels .includes (i .label )))
170+
165171// Close menus on route change
166172watch (() => route .path , () => {
167173 showUserMenu .value = false
@@ -221,23 +227,66 @@ onUnmounted(() => {
221227 <!-- Desktop nav links -->
222228 <nav class =" hidden md:flex items-center gap-0.5" >
223229 <NuxtLink
224- v-for =" item in navItems "
230+ v-for =" item in primaryNavItems "
225231 :key =" item .to "
226232 :to =" $localePath (item .to )"
227- class="relative flex items-center gap-2 px-3 py-1.5 rounded-lg text-[13px] font-medium transition-all duration-200 no-underline"
233+ class="relative flex items-center gap-1. 5 px-3 py-1.5 rounded-lg text-[13px] font-medium transition-all duration-200 no-underline"
228234 :class =" isActiveRoute (item .to , item .exact )
229235 ? ' text-brand-700 dark:text-brand-300 bg-brand-50/80 dark:bg-brand-950/40'
230236 : ' text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-surface-100 hover:bg-surface-100/80 dark:hover:bg-surface-800/60' "
231237 >
232238 <component :is =" item.icon" class =" size-4" />
233239 {{ item.label }}
234- <span
235- v-if =" item.comingSoon"
236- class =" ml-0.5 inline-flex items-center rounded-full bg-amber-50 dark:bg-amber-950/40 px-1.5 py-0.5 text-[9px] font-semibold leading-none text-amber-700 dark:text-amber-400 ring-1 ring-inset ring-amber-200/60 dark:ring-amber-800/40"
237- >
238- Soon
239- </span >
240240 </NuxtLink >
241+
242+ <!-- More nav dropdown -->
243+ <div
244+ v-if =" moreNavItems.length"
245+ class =" relative"
246+ @mouseenter =" showMoreNav = true"
247+ @mouseleave =" showMoreNav = false"
248+ >
249+ <button
250+ class =" relative flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-[13px] font-medium transition-all duration-200 cursor-pointer border-0 bg-transparent"
251+ :class =" moreNavItems.some(i => isActiveRoute(i.to, i.exact))
252+ ? 'text-brand-700 dark:text-brand-300 bg-brand-50/80 dark:bg-brand-950/40'
253+ : 'text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-surface-100 hover:bg-surface-100/80 dark:hover:bg-surface-800/60'"
254+ >
255+ More
256+ <ChevronDown
257+ class="size-3 opacity-60 transition-transform duration-200"
258+ :class =" showMoreNav ? ' rotate-180' : ' ' "
259+ />
260+ </button >
261+ <Transition
262+ enter-active-class="transition duration-150 ease-out"
263+ enter-from-class="opacity-0 scale-95 -translate-y-1"
264+ enter-to-class="opacity-100 scale-100 translate-y-0"
265+ leave-active-class="transition duration-100 ease-in"
266+ leave-from-class="opacity-100 scale-100 translate-y-0"
267+ leave-to-class="opacity-0 scale-95 -translate-y-1"
268+ >
269+ <div
270+ v-if =" showMoreNav"
271+ class =" absolute left-0 top-full z-50 pt-1.5"
272+ >
273+ <div class =" w-52 rounded-xl border border-surface-200 dark:border-surface-700 bg-white dark:bg-surface-900 shadow-xl shadow-surface-900/8 dark:shadow-surface-950/30 overflow-hidden py-1" >
274+ <NuxtLink
275+ v-for =" item in moreNavItems "
276+ :key =" item .to "
277+ :to =" $localePath (item .to )"
278+ class="flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium transition-colors no-underline"
279+ :class =" isActiveRoute (item .to , item .exact )
280+ ? ' text-brand-700 dark:text-brand-300 bg-brand-50 dark:bg-brand-950/40'
281+ : ' text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-800' "
282+ >
283+ <component :is =" item.icon" class =" size-4" />
284+ {{ item.label }}
285+ </NuxtLink >
286+ </div >
287+ </div >
288+ </Transition >
289+ </div >
241290 </nav >
242291 </div >
243292
@@ -325,39 +374,64 @@ onUnmounted(() => {
325374
326375 <!-- Color mode toggle -->
327376 <button
328- class =" flex items-center justify-center size-8 rounded-lg text-surface-500 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-200 hover:bg-surface-100 dark:hover:bg-surface-800 transition-all duration-200 cursor-pointer border-0 bg-transparent"
329- :title =" isDark ? 'Switch to light' : 'Switch to dark'"
377+ class =" inline- flex items-center justify-center size-8 rounded-lg text-surface-500 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-200 hover:bg-surface-100 dark:hover:bg-surface-800 transition-all duration-200 cursor-pointer border-0 bg-transparent"
378+ :title =" isDark ? 'Switch to light mode ' : 'Switch to dark mode '"
330379 @click =" toggleColorMode"
331380 >
332381 <Sun v-if =" isDark " class="size-4" />
333382 <Moon v-else class="size-4" />
334383 </button >
335384
336- <!-- Updates button -->
337- <NuxtLink
338- :to =" $localePath (' /dashboard/updates' )"
339- class="hidden sm:flex items-center justify-center size-8 rounded-lg transition-all duration-200 no-underline"
340- :class =" isActiveRoute (' /dashboard/updates' , false )
341- ? ' text-brand-600 dark:text-brand-400 bg-brand-50 dark:bg-brand-950/40'
342- : ' text-surface-500 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-200 hover:bg-surface-100 dark:hover:bg-surface-800' "
343- title="Updates & changelog"
344- aria-label="Updates & changelog"
385+ <!-- More actions dropdown -->
386+ <div
387+ class =" relative hidden sm:block"
388+ @mouseenter =" showMoreActions = true"
389+ @mouseleave =" showMoreActions = false"
345390 >
346- <ArrowUpCircle class="size-4" />
347- </NuxtLink >
348-
349- <!-- Feedback button -->
350- <button
351- v-if =" isFeedbackEnabled"
352- class =" flex items-center justify-center size-8 rounded-lg text-surface-500 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-200 hover:bg-surface-100 dark:hover:bg-surface-800 transition-all duration-200 cursor-pointer border-0 bg-transparent"
353- title =" Report issue"
354- @click =" showFeedbackModal = true"
355- >
356- <MessageSquarePlus class="size-4" />
357- </button >
391+ <button
392+ class =" inline-flex items-center justify-center size-8 rounded-lg text-surface-500 dark:text-surface-400 hover:text-surface-700 dark:hover:text-surface-200 hover:bg-surface-100 dark:hover:bg-surface-800 transition-all duration-200 cursor-pointer border-0 bg-transparent"
393+ title =" More options"
394+ >
395+ <MoreHorizontal class="size-4" />
396+ </button >
397+ <Transition
398+ enter-active-class="transition duration-150 ease-out"
399+ enter-from-class="opacity-0 scale-95 -translate-y-1"
400+ enter-to-class="opacity-100 scale-100 translate-y-0"
401+ leave-active-class="transition duration-100 ease-in"
402+ leave-from-class="opacity-100 scale-100 translate-y-0"
403+ leave-to-class="opacity-0 scale-95 -translate-y-1"
404+ >
405+ <div
406+ v-if =" showMoreActions"
407+ class =" absolute right-0 top-full z-50 pt-1.5"
408+ >
409+ <div class =" w-52 rounded-xl border border-surface-200 dark:border-surface-700 bg-white dark:bg-surface-900 shadow-xl shadow-surface-900/8 dark:shadow-surface-950/30 overflow-hidden py-1" >
410+ <NuxtLink
411+ :to =" $localePath (' /dashboard/updates' )"
412+ class="flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium transition-colors no-underline"
413+ :class =" isActiveRoute (' /dashboard/updates' , false )
414+ ? ' text-brand-700 dark:text-brand-300 bg-brand-50 dark:bg-brand-950/40'
415+ : ' text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-800' "
416+ >
417+ <ArrowUpCircle class="size-4" />
418+ Updates & changelog
419+ </NuxtLink >
420+ <button
421+ v-if =" isFeedbackEnabled"
422+ class =" flex items-center gap-2.5 w-full px-3 py-2 text-[13px] font-medium text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-surface-100 hover:bg-surface-100 dark:hover:bg-surface-800 transition-colors cursor-pointer border-0 bg-transparent text-left"
423+ @click =" showFeedbackModal = true; showMoreActions = false"
424+ >
425+ <MessageSquarePlus class="size-4" />
426+ Report issue
427+ </button >
428+ </div >
429+ </div >
430+ </Transition >
431+ </div >
358432
359433 <!-- Divider -->
360- <div class =" hidden sm:block w-px h-6 bg-surface-200 dark:bg-surface-700 mx-1 " />
434+ <div class =" hidden sm:block w-px h-6 bg-surface-200 dark:bg-surface-700 mx-0.5 " />
361435
362436 <!-- User menu -->
363437 <div ref =" userMenuRoot" class =" relative" >
0 commit comments