|
14 | 14 | // Detects page change |
15 | 15 | $: if ($navigating) cleanupModalBackdrop(); |
16 | 16 |
|
17 | | - $: adminArea = $page.url.pathname.startsWith('/admin'); |
| 17 | + $: selectedSection = getSelectedSection($page.url.pathname); |
18 | 18 |
|
19 | 19 | /** |
20 | 20 | * Removes the modal backdrop that remains stuck at page change. |
|
40 | 40 | }; |
41 | 41 | } |
42 | 42 |
|
| 43 | + /** |
| 44 | + * @param {string} pathname |
| 45 | + */ |
| 46 | + function getSelectedSection(pathname) { |
| 47 | + if (pathname === '/') { |
| 48 | + return 'home'; |
| 49 | + } |
| 50 | + for (const section of ['projects', 'tasks', 'jobs', 'admin', 'auth']) { |
| 51 | + if (pathname.startsWith(`/${section}`)) { |
| 52 | + return section; |
| 53 | + } |
| 54 | + } |
| 55 | + } |
| 56 | +
|
43 | 57 | let loading = true; |
44 | 58 |
|
45 | 59 | onMount(() => { |
|
55 | 69 | <div class="container d-flex flex-wrap"> |
56 | 70 | <ul class="nav me-auto"> |
57 | 71 | <li class="nav-item"> |
58 | | - <a href="/" class="nav-link">Home</a> |
| 72 | + <a href="/" class="nav-link" class:active={selectedSection === 'home'}> Home </a> |
59 | 73 | </li> |
60 | 74 | {#if userLoggedIn} |
61 | 75 | <li class="nav-item"> |
62 | | - <a href="/projects" class="nav-link">Projects</a> |
| 76 | + <a href="/projects" class="nav-link" class:active={selectedSection === 'projects'}> |
| 77 | + Projects |
| 78 | + </a> |
63 | 79 | </li> |
64 | 80 | <li class="nav-item"> |
65 | | - <a href="/tasks" class="nav-link">Tasks</a> |
| 81 | + <a href="/tasks" class="nav-link" class:active={selectedSection === 'tasks'}> Tasks </a> |
66 | 82 | </li> |
67 | 83 | <li class="nav-item"> |
68 | | - <a href="/jobs" class="nav-link">Jobs</a> |
| 84 | + <a href="/jobs" class="nav-link" class:active={selectedSection === 'jobs'}> Jobs </a> |
69 | 85 | </li> |
70 | 86 | {#if isAdmin} |
71 | 87 | <li class="nav-item"> |
72 | | - <a href="/admin" class="nav-link">Admin area</a> |
| 88 | + <a href="/admin" class="nav-link" class:admin-active={selectedSection === 'admin'}> |
| 89 | + Admin area |
| 90 | + </a> |
73 | 91 | </li> |
74 | 92 | {/if} |
75 | 93 | {/if} |
|
94 | 112 | </li> |
95 | 113 | {:else} |
96 | 114 | <li class="nav-item"> |
97 | | - <a href="/auth/login" class="nav-link">Login</a> |
| 115 | + <a href="/auth/login" class="nav-link" class:active={selectedSection === 'auth'}> |
| 116 | + Login |
| 117 | + </a> |
98 | 118 | </li> |
99 | 119 | {/if} |
100 | 120 | </ul> |
101 | 121 | </div> |
102 | 122 | </nav> |
103 | | - {#if adminArea} |
| 123 | + {#if selectedSection === 'admin'} |
104 | 124 | <div class="admin-border" /> |
105 | 125 | {/if} |
106 | 126 | <div class="container p-4"> |
|
129 | 149 | </main> |
130 | 150 |
|
131 | 151 | <style> |
| 152 | + .nav-link.active { |
| 153 | + background-color: #eee; |
| 154 | + border-bottom-width: 3px; |
| 155 | + border-bottom-style: solid; |
| 156 | + } |
| 157 | +
|
| 158 | + .nav-link.admin-active { |
| 159 | + background-color: #eee; |
| 160 | + } |
| 161 | +
|
132 | 162 | .admin-border { |
133 | 163 | height: 8px; |
134 | 164 | background-color: #dc3545; |
|
0 commit comments