refactor: do not display header in landing page and improve unlogged footerUnverified
0f3f03a parent: eaf506a modified
web/src/routes/+layout.svelte +121 -115 | @@ -130,127 +130,133 @@ | ||
| 130 | 130 | |
| 131 | 131 | <div class="min-h-screen flex flex-col"> |
| 132 | 132 | <!-- Top header bar --> |
| 133 | - <header | |
| 134 | - class="sticky top-0 z-30 border-b-2 border-[var(--border)] bg-[var(--bg)]" | |
| 135 | - > | |
| 136 | - <div class="mx-auto flex h-14 max-w-5xl items-center gap-4 px-4"> | |
| 137 | - <Logo /> | |
| 133 | + {#if page.url.pathname !== "/"} | |
| 134 | + <header | |
| 135 | + class="sticky top-0 z-30 border-b-2 border-[var(--border)] bg-[var(--bg)]" | |
| 136 | + > | |
| 137 | + <div class="mx-auto flex h-14 max-w-5xl items-center gap-4 px-4"> | |
| 138 | + <Logo /> | |
| 139 | + | |
| 140 | + {#if !chromeless} | |
| 141 | + <nav class="hidden items-center gap-1 md:flex"> | |
| 142 | + {#each navItems as item} | |
| 143 | + <a | |
| 144 | + href={item.href} | |
| 145 | + class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-bold uppercase tracking-wide transition {isActive( | |
| 146 | + item.match, | |
| 147 | + ) | |
| 148 | + ? 'bg-[var(--fg)] text-[var(--bg)]' | |
| 149 | + : 'text-[var(--muted)] hover:text-[var(--fg)] hover:bg-[var(--surface)]'}" | |
| 150 | + > | |
| 151 | + <Icon name={item.icon} class="h-3.5 w-3.5" /> | |
| 152 | + {item.label} | |
| 153 | + </a> | |
| 154 | + {/each} | |
| 155 | + </nav> | |
| 156 | + | |
| 157 | + <div class="ml-auto flex items-center gap-2"> | |
| 158 | + <button | |
| 159 | + class="btn btn-ghost px-2" | |
| 160 | + title="Search" | |
| 161 | + onclick={() => goto("/articles")} | |
| 162 | + aria-label="Search" | |
| 163 | + > | |
| 164 | + <Icon name="search" class="h-4 w-4" /> | |
| 165 | + </button> | |
| 166 | + <button | |
| 167 | + class="btn btn-ghost hidden px-2 sm:inline-flex" | |
| 168 | + onclick={() => (showShortcuts = true)} | |
| 169 | + title="Shortcuts" | |
| 170 | + aria-label="Shortcuts" | |
| 171 | + > | |
| 172 | + <Icon name="keyboard" class="h-4 w-4" /> | |
| 173 | + </button> | |
| 174 | + {#if data.user} | |
| 175 | + <div class="relative"> | |
| 176 | + <button | |
| 177 | + class="flex items-center gap-2 border-2 border-[var(--border)] px-2 py-1" | |
| 178 | + onclick={() => (menuOpen = !menuOpen)} | |
| 179 | + > | |
| 180 | + {#if data.user.avatar_url} | |
| 181 | + <img | |
| 182 | + src={data.user.avatar_url} | |
| 183 | + class="h-6 w-6 border border-[var(--border)] object-cover" | |
| 184 | + alt="" | |
| 185 | + /> | |
| 186 | + {/if} | |
| 187 | + <span class="text-xs font-bold" | |
| 188 | + >@{data.user.handle}</span | |
| 189 | + > | |
| 190 | + <Icon name="chevronDown" class="h-3 w-3" /> | |
| 191 | + </button> | |
| 192 | + {#if menuOpen} | |
| 193 | + <button | |
| 194 | + class="fixed inset-0 z-40 cursor-default" | |
| 195 | + onclick={() => (menuOpen = false)} | |
| 196 | + aria-label="Close menu" | |
| 197 | + tabindex="-1" | |
| 198 | + ></button> | |
| 199 | + <div | |
| 200 | + class="absolute right-0 top-full z-50 mt-1 w-48 border-2 border-[var(--border)] bg-[var(--bg)] shadow-[4px_4px_0_0_var(--border)]" | |
| 201 | + > | |
| 202 | + <a | |
| 203 | + href="/profile/{data.user.did}" | |
| 204 | + class="block border-b-2 border-[var(--border)] px-4 py-2.5 text-xs font-bold uppercase hover:bg-[var(--surface)]" | |
| 205 | + onclick={() => (menuOpen = false)} | |
| 206 | + >Profile</a | |
| 207 | + > | |
| 208 | + <button | |
| 209 | + class="block w-full px-4 py-2.5 text-left text-xs font-bold uppercase hover:bg-[var(--surface)]" | |
| 210 | + onclick={() => (showInstall = true)} | |
| 211 | + >Install App</button | |
| 212 | + > | |
| 213 | + <button | |
| 214 | + class="block w-full border-t-2 border-[var(--border)] px-4 py-2.5 text-left text-xs font-bold uppercase text-[var(--danger)] hover:bg-[var(--surface)]" | |
| 215 | + onclick={logout}>Sign out</button | |
| 216 | + > | |
| 217 | + </div> | |
| 218 | + {/if} | |
| 219 | + </div> | |
| 220 | + {:else} | |
| 221 | + <a href="/auth/login" class="btn btn-accent" | |
| 222 | + >Sign in</a | |
| 223 | + > | |
| 224 | + {/if} | |
| 225 | + </div> | |
| 226 | + {:else} | |
| 227 | + <div class="ml-auto flex items-center gap-2"> | |
| 228 | + <ThemeToggle /> | |
| 229 | + {#if !data.user} | |
| 230 | + <a href="/auth/login" class="btn btn-accent" | |
| 231 | + >Sign in</a | |
| 232 | + > | |
| 233 | + {/if} | |
| 234 | + </div> | |
| 235 | + {/if} | |
| 236 | + </div> | |
| 138 | 237 | |
| 238 | + <!-- Mobile nav row --> | |
| 139 | 239 | {#if !chromeless} |
| 140 | - <nav class="hidden items-center gap-1 md:flex"> | |
| 240 | + <nav | |
| 241 | + class="flex items-center gap-1 overflow-x-auto border-t-2 border-[var(--border)] px-2 py-1 md:hidden" | |
| 242 | + > | |
| 141 | 243 | {#each navItems as item} |
| 142 | 244 | <a |
| 143 | 245 | href={item.href} |
| 144 | - class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-bold uppercase tracking-wide transition {isActive( | |
| 246 | + class="inline-flex shrink-0 items-center gap-1.5 px-2.5 py-1.5 text-[0.7rem] font-bold uppercase {isActive( | |
| 145 | 247 | item.match, |
| 146 | 248 | ) |
| 147 | 249 | ? 'bg-[var(--fg)] text-[var(--bg)]' |
| 148 | - : 'text-[var(--muted)] hover:text-[var(--fg)] hover:bg-[var(--surface)]'}" | |
| 250 | + : 'text-[var(--muted)]'}" | |
| 149 | 251 | > |
| 150 | 252 | <Icon name={item.icon} class="h-3.5 w-3.5" /> |
| 151 | 253 | {item.label} |
| 152 | 254 | </a> |
| 153 | 255 | {/each} |
| 154 | 256 | </nav> |
| 155 | - | |
| 156 | - <div class="ml-auto flex items-center gap-2"> | |
| 157 | - <button | |
| 158 | - class="btn btn-ghost px-2" | |
| 159 | - title="Search" | |
| 160 | - onclick={() => goto("/articles")} | |
| 161 | - aria-label="Search" | |
| 162 | - > | |
| 163 | - <Icon name="search" class="h-4 w-4" /> | |
| 164 | - </button> | |
| 165 | - <button | |
| 166 | - class="btn btn-ghost hidden px-2 sm:inline-flex" | |
| 167 | - onclick={() => (showShortcuts = true)} | |
| 168 | - title="Shortcuts" | |
| 169 | - aria-label="Shortcuts" | |
| 170 | - > | |
| 171 | - <Icon name="keyboard" class="h-4 w-4" /> | |
| 172 | - </button> | |
| 173 | - {#if data.user} | |
| 174 | - <div class="relative"> | |
| 175 | - <button | |
| 176 | - class="flex items-center gap-2 border-2 border-[var(--border)] px-2 py-1" | |
| 177 | - onclick={() => (menuOpen = !menuOpen)} | |
| 178 | - > | |
| 179 | - {#if data.user.avatar_url} | |
| 180 | - <img | |
| 181 | - src={data.user.avatar_url} | |
| 182 | - class="h-6 w-6 border border-[var(--border)] object-cover" | |
| 183 | - alt="" | |
| 184 | - /> | |
| 185 | - {/if} | |
| 186 | - <span class="text-xs font-bold" | |
| 187 | - >@{data.user.handle}</span | |
| 188 | - > | |
| 189 | - <Icon name="chevronDown" class="h-3 w-3" /> | |
| 190 | - </button> | |
| 191 | - {#if menuOpen} | |
| 192 | - <button | |
| 193 | - class="fixed inset-0 z-40 cursor-default" | |
| 194 | - onclick={() => (menuOpen = false)} | |
| 195 | - aria-label="Close menu" | |
| 196 | - tabindex="-1" | |
| 197 | - ></button> | |
| 198 | - <div | |
| 199 | - class="absolute right-0 top-full z-50 mt-1 w-48 border-2 border-[var(--border)] bg-[var(--bg)] shadow-[4px_4px_0_0_var(--border)]" | |
| 200 | - > | |
| 201 | - <a | |
| 202 | - href="/profile/{data.user.did}" | |
| 203 | - class="block border-b-2 border-[var(--border)] px-4 py-2.5 text-xs font-bold uppercase hover:bg-[var(--surface)]" | |
| 204 | - onclick={() => (menuOpen = false)} | |
| 205 | - >Profile</a | |
| 206 | - > | |
| 207 | - <button | |
| 208 | - class="block w-full px-4 py-2.5 text-left text-xs font-bold uppercase hover:bg-[var(--surface)]" | |
| 209 | - onclick={() => (showInstall = true)} | |
| 210 | - >Install App</button | |
| 211 | - > | |
| 212 | - <button | |
| 213 | - class="block w-full border-t-2 border-[var(--border)] px-4 py-2.5 text-left text-xs font-bold uppercase text-[var(--danger)] hover:bg-[var(--surface)]" | |
| 214 | - onclick={logout}>Sign out</button | |
| 215 | - > | |
| 216 | - </div> | |
| 217 | - {/if} | |
| 218 | - </div> | |
| 219 | - {:else} | |
| 220 | - <a href="/auth/login" class="btn btn-accent">Sign in</a> | |
| 221 | - {/if} | |
| 222 | - </div> | |
| 223 | - {:else} | |
| 224 | - <div class="ml-auto flex items-center gap-2"> | |
| 225 | - <ThemeToggle /> | |
| 226 | - {#if !data.user} | |
| 227 | - <a href="/auth/login" class="btn btn-accent">Sign in</a> | |
| 228 | - {/if} | |
| 229 | - </div> | |
| 230 | 257 | {/if} |
| 231 | - </div> | |
| 232 | - | |
| 233 | - <!-- Mobile nav row --> | |
| 234 | - {#if !chromeless} | |
| 235 | - <nav | |
| 236 | - class="flex items-center gap-1 overflow-x-auto border-t-2 border-[var(--border)] px-2 py-1 md:hidden" | |
| 237 | - > | |
| 238 | - {#each navItems as item} | |
| 239 | - <a | |
| 240 | - href={item.href} | |
| 241 | - class="inline-flex shrink-0 items-center gap-1.5 px-2.5 py-1.5 text-[0.7rem] font-bold uppercase {isActive( | |
| 242 | - item.match, | |
| 243 | - ) | |
| 244 | - ? 'bg-[var(--fg)] text-[var(--bg)]' | |
| 245 | - : 'text-[var(--muted)]'}" | |
| 246 | - > | |
| 247 | - <Icon name={item.icon} class="h-3.5 w-3.5" /> | |
| 248 | - {item.label} | |
| 249 | - </a> | |
| 250 | - {/each} | |
| 251 | - </nav> | |
| 252 | - {/if} | |
| 253 | - </header> | |
| 258 | + </header> | |
| 259 | + {/if} | |
| 254 | 260 | |
| 255 | 261 | <!-- Content --> |
| 256 | 262 | <main class="mx-auto w-full max-w-5xl flex-1 px-4 py-8"> |
| @@ -291,13 +297,13 @@ | ||
| 291 | 297 | >Articles</a |
| 292 | 298 | > |
| 293 | 299 | </div> |
| 294 | - <div class="space-y-1.5"> | |
| 295 | - <p | |
| 296 | - class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" | |
| 297 | - > | |
| 298 | - Library | |
| 299 | - </p> | |
| 300 | - {#if data.user} | |
| 300 | + {#if data.user} | |
| 301 | + <div class="space-y-1.5"> | |
| 302 | + <p | |
| 303 | + class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" | |
| 304 | + > | |
| 305 | + Library | |
| 306 | + </p> | |
| 301 | 307 | <a |
| 302 | 308 | href="/feeds" |
| 303 | 309 | class="block font-bold uppercase hover:text-[var(--accent)]" |
| @@ -308,8 +314,8 @@ | ||
| 308 | 314 | class="block font-bold uppercase hover:text-[var(--accent)]" |
| 309 | 315 | >Annotations</a |
| 310 | 316 | > |
| 311 | - {/if} | |
| 312 | - </div> | |
| 317 | + </div> | |
| 318 | + {/if} | |
| 313 | 319 | <div class="space-y-1.5"> |
| 314 | 320 | <p |
| 315 | 321 | class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" |
| @@ -130,127 +130,133 @@ | |||
| 130 | 130 | ||
| 131 | <div class="min-h-screen flex flex-col"> | 131 | <div class="min-h-screen flex flex-col"> |
| 132 | <!-- Top header bar --> | 132 | <!-- Top header bar --> |
| 133 | - <header | 133 | + {#if page.url.pathname !== "/"} |
| 134 | - class="sticky top-0 z-30 border-b-2 border-[var(--border)] bg-[var(--bg)]" | 134 | + <header |
| 135 | - > | 135 | + class="sticky top-0 z-30 border-b-2 border-[var(--border)] bg-[var(--bg)]" |
| 136 | - <div class="mx-auto flex h-14 max-w-5xl items-center gap-4 px-4"> | 136 | + > |
| 137 | - <Logo /> | 137 | + <div class="mx-auto flex h-14 max-w-5xl items-center gap-4 px-4"> |
| 138 | + <Logo /> | ||
| 139 | + | ||
| 140 | + {#if !chromeless} | ||
| 141 | + <nav class="hidden items-center gap-1 md:flex"> | ||
| 142 | + {#each navItems as item} | ||
| 143 | + <a | ||
| 144 | + href={item.href} | ||
| 145 | + class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-bold uppercase tracking-wide transition {isActive( | ||
| 146 | + item.match, | ||
| 147 | + ) | ||
| 148 | + ? 'bg-[var(--fg)] text-[var(--bg)]' | ||
| 149 | + : 'text-[var(--muted)] hover:text-[var(--fg)] hover:bg-[var(--surface)]'}" | ||
| 150 | + > | ||
| 151 | + <Icon name={item.icon} class="h-3.5 w-3.5" /> | ||
| 152 | + {item.label} | ||
| 153 | + </a> | ||
| 154 | + {/each} | ||
| 155 | + </nav> | ||
| 156 | + | ||
| 157 | + <div class="ml-auto flex items-center gap-2"> | ||
| 158 | + <button | ||
| 159 | + class="btn btn-ghost px-2" | ||
| 160 | + title="Search" | ||
| 161 | + onclick={() => goto("/articles")} | ||
| 162 | + aria-label="Search" | ||
| 163 | + > | ||
| 164 | + <Icon name="search" class="h-4 w-4" /> | ||
| 165 | + </button> | ||
| 166 | + <button | ||
| 167 | + class="btn btn-ghost hidden px-2 sm:inline-flex" | ||
| 168 | + onclick={() => (showShortcuts = true)} | ||
| 169 | + title="Shortcuts" | ||
| 170 | + aria-label="Shortcuts" | ||
| 171 | + > | ||
| 172 | + <Icon name="keyboard" class="h-4 w-4" /> | ||
| 173 | + </button> | ||
| 174 | + {#if data.user} | ||
| 175 | + <div class="relative"> | ||
| 176 | + <button | ||
| 177 | + class="flex items-center gap-2 border-2 border-[var(--border)] px-2 py-1" | ||
| 178 | + onclick={() => (menuOpen = !menuOpen)} | ||
| 179 | + > | ||
| 180 | + {#if data.user.avatar_url} | ||
| 181 | + <img | ||
| 182 | + src={data.user.avatar_url} | ||
| 183 | + class="h-6 w-6 border border-[var(--border)] object-cover" | ||
| 184 | + alt="" | ||
| 185 | + /> | ||
| 186 | + {/if} | ||
| 187 | + <span class="text-xs font-bold" | ||
| 188 | + >@{data.user.handle}</span | ||
| 189 | + > | ||
| 190 | + <Icon name="chevronDown" class="h-3 w-3" /> | ||
| 191 | + </button> | ||
| 192 | + {#if menuOpen} | ||
| 193 | + <button | ||
| 194 | + class="fixed inset-0 z-40 cursor-default" | ||
| 195 | + onclick={() => (menuOpen = false)} | ||
| 196 | + aria-label="Close menu" | ||
| 197 | + tabindex="-1" | ||
| 198 | + ></button> | ||
| 199 | + <div | ||
| 200 | + class="absolute right-0 top-full z-50 mt-1 w-48 border-2 border-[var(--border)] bg-[var(--bg)] shadow-[4px_4px_0_0_var(--border)]" | ||
| 201 | + > | ||
| 202 | + <a | ||
| 203 | + href="/profile/{data.user.did}" | ||
| 204 | + class="block border-b-2 border-[var(--border)] px-4 py-2.5 text-xs font-bold uppercase hover:bg-[var(--surface)]" | ||
| 205 | + onclick={() => (menuOpen = false)} | ||
| 206 | + >Profile</a | ||
| 207 | + > | ||
| 208 | + <button | ||
| 209 | + class="block w-full px-4 py-2.5 text-left text-xs font-bold uppercase hover:bg-[var(--surface)]" | ||
| 210 | + onclick={() => (showInstall = true)} | ||
| 211 | + >Install App</button | ||
| 212 | + > | ||
| 213 | + <button | ||
| 214 | + class="block w-full border-t-2 border-[var(--border)] px-4 py-2.5 text-left text-xs font-bold uppercase text-[var(--danger)] hover:bg-[var(--surface)]" | ||
| 215 | + onclick={logout}>Sign out</button | ||
| 216 | + > | ||
| 217 | + </div> | ||
| 218 | + {/if} | ||
| 219 | + </div> | ||
| 220 | + {:else} | ||
| 221 | + <a href="/auth/login" class="btn btn-accent" | ||
| 222 | + >Sign in</a | ||
| 223 | + > | ||
| 224 | + {/if} | ||
| 225 | + </div> | ||
| 226 | + {:else} | ||
| 227 | + <div class="ml-auto flex items-center gap-2"> | ||
| 228 | + <ThemeToggle /> | ||
| 229 | + {#if !data.user} | ||
| 230 | + <a href="/auth/login" class="btn btn-accent" | ||
| 231 | + >Sign in</a | ||
| 232 | + > | ||
| 233 | + {/if} | ||
| 234 | + </div> | ||
| 235 | + {/if} | ||
| 236 | + </div> | ||
| 138 | 237 | ||
| 238 | + <!-- Mobile nav row --> | ||
| 139 | {#if !chromeless} | 239 | {#if !chromeless} |
| 140 | - <nav class="hidden items-center gap-1 md:flex"> | 240 | + <nav |
| 241 | + class="flex items-center gap-1 overflow-x-auto border-t-2 border-[var(--border)] px-2 py-1 md:hidden" | ||
| 242 | + > | ||
| 141 | {#each navItems as item} | 243 | {#each navItems as item} |
| 142 | <a | 244 | <a |
| 143 | href={item.href} | 245 | href={item.href} |
| 144 | - class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-bold uppercase tracking-wide transition {isActive( | 246 | + class="inline-flex shrink-0 items-center gap-1.5 px-2.5 py-1.5 text-[0.7rem] font-bold uppercase {isActive( |
| 145 | item.match, | 247 | item.match, |
| 146 | ) | 248 | ) |
| 147 | ? 'bg-[var(--fg)] text-[var(--bg)]' | 249 | ? 'bg-[var(--fg)] text-[var(--bg)]' |
| 148 | - : 'text-[var(--muted)] hover:text-[var(--fg)] hover:bg-[var(--surface)]'}" | 250 | + : 'text-[var(--muted)]'}" |
| 149 | > | 251 | > |
| 150 | <Icon name={item.icon} class="h-3.5 w-3.5" /> | 252 | <Icon name={item.icon} class="h-3.5 w-3.5" /> |
| 151 | {item.label} | 253 | {item.label} |
| 152 | </a> | 254 | </a> |
| 153 | {/each} | 255 | {/each} |
| 154 | </nav> | 256 | </nav> |
| 155 | - | ||
| 156 | - <div class="ml-auto flex items-center gap-2"> | ||
| 157 | - <button | ||
| 158 | - class="btn btn-ghost px-2" | ||
| 159 | - title="Search" | ||
| 160 | - onclick={() => goto("/articles")} | ||
| 161 | - aria-label="Search" | ||
| 162 | - > | ||
| 163 | - <Icon name="search" class="h-4 w-4" /> | ||
| 164 | - </button> | ||
| 165 | - <button | ||
| 166 | - class="btn btn-ghost hidden px-2 sm:inline-flex" | ||
| 167 | - onclick={() => (showShortcuts = true)} | ||
| 168 | - title="Shortcuts" | ||
| 169 | - aria-label="Shortcuts" | ||
| 170 | - > | ||
| 171 | - <Icon name="keyboard" class="h-4 w-4" /> | ||
| 172 | - </button> | ||
| 173 | - {#if data.user} | ||
| 174 | - <div class="relative"> | ||
| 175 | - <button | ||
| 176 | - class="flex items-center gap-2 border-2 border-[var(--border)] px-2 py-1" | ||
| 177 | - onclick={() => (menuOpen = !menuOpen)} | ||
| 178 | - > | ||
| 179 | - {#if data.user.avatar_url} | ||
| 180 | - <img | ||
| 181 | - src={data.user.avatar_url} | ||
| 182 | - class="h-6 w-6 border border-[var(--border)] object-cover" | ||
| 183 | - alt="" | ||
| 184 | - /> | ||
| 185 | - {/if} | ||
| 186 | - <span class="text-xs font-bold" | ||
| 187 | - >@{data.user.handle}</span | ||
| 188 | - > | ||
| 189 | - <Icon name="chevronDown" class="h-3 w-3" /> | ||
| 190 | - </button> | ||
| 191 | - {#if menuOpen} | ||
| 192 | - <button | ||
| 193 | - class="fixed inset-0 z-40 cursor-default" | ||
| 194 | - onclick={() => (menuOpen = false)} | ||
| 195 | - aria-label="Close menu" | ||
| 196 | - tabindex="-1" | ||
| 197 | - ></button> | ||
| 198 | - <div | ||
| 199 | - class="absolute right-0 top-full z-50 mt-1 w-48 border-2 border-[var(--border)] bg-[var(--bg)] shadow-[4px_4px_0_0_var(--border)]" | ||
| 200 | - > | ||
| 201 | - <a | ||
| 202 | - href="/profile/{data.user.did}" | ||
| 203 | - class="block border-b-2 border-[var(--border)] px-4 py-2.5 text-xs font-bold uppercase hover:bg-[var(--surface)]" | ||
| 204 | - onclick={() => (menuOpen = false)} | ||
| 205 | - >Profile</a | ||
| 206 | - > | ||
| 207 | - <button | ||
| 208 | - class="block w-full px-4 py-2.5 text-left text-xs font-bold uppercase hover:bg-[var(--surface)]" | ||
| 209 | - onclick={() => (showInstall = true)} | ||
| 210 | - >Install App</button | ||
| 211 | - > | ||
| 212 | - <button | ||
| 213 | - class="block w-full border-t-2 border-[var(--border)] px-4 py-2.5 text-left text-xs font-bold uppercase text-[var(--danger)] hover:bg-[var(--surface)]" | ||
| 214 | - onclick={logout}>Sign out</button | ||
| 215 | - > | ||
| 216 | - </div> | ||
| 217 | - {/if} | ||
| 218 | - </div> | ||
| 219 | - {:else} | ||
| 220 | - <a href="/auth/login" class="btn btn-accent">Sign in</a> | ||
| 221 | - {/if} | ||
| 222 | - </div> | ||
| 223 | - {:else} | ||
| 224 | - <div class="ml-auto flex items-center gap-2"> | ||
| 225 | - <ThemeToggle /> | ||
| 226 | - {#if !data.user} | ||
| 227 | - <a href="/auth/login" class="btn btn-accent">Sign in</a> | ||
| 228 | - {/if} | ||
| 229 | - </div> | ||
| 230 | {/if} | 257 | {/if} |
| 231 | - </div> | 258 | + </header> |
| 232 | - | 259 | + {/if} |
| 233 | - <!-- Mobile nav row --> | ||
| 234 | - {#if !chromeless} | ||
| 235 | - <nav | ||
| 236 | - class="flex items-center gap-1 overflow-x-auto border-t-2 border-[var(--border)] px-2 py-1 md:hidden" | ||
| 237 | - > | ||
| 238 | - {#each navItems as item} | ||
| 239 | - <a | ||
| 240 | - href={item.href} | ||
| 241 | - class="inline-flex shrink-0 items-center gap-1.5 px-2.5 py-1.5 text-[0.7rem] font-bold uppercase {isActive( | ||
| 242 | - item.match, | ||
| 243 | - ) | ||
| 244 | - ? 'bg-[var(--fg)] text-[var(--bg)]' | ||
| 245 | - : 'text-[var(--muted)]'}" | ||
| 246 | - > | ||
| 247 | - <Icon name={item.icon} class="h-3.5 w-3.5" /> | ||
| 248 | - {item.label} | ||
| 249 | - </a> | ||
| 250 | - {/each} | ||
| 251 | - </nav> | ||
| 252 | - {/if} | ||
| 253 | - </header> | ||
| 254 | 260 | ||
| 255 | <!-- Content --> | 261 | <!-- Content --> |
| 256 | <main class="mx-auto w-full max-w-5xl flex-1 px-4 py-8"> | 262 | <main class="mx-auto w-full max-w-5xl flex-1 px-4 py-8"> |
| @@ -291,13 +297,13 @@ | |||
| 291 | >Articles</a | 297 | >Articles</a |
| 292 | > | 298 | > |
| 293 | </div> | 299 | </div> |
| 294 | - <div class="space-y-1.5"> | 300 | + {#if data.user} |
| 295 | - <p | 301 | + <div class="space-y-1.5"> |
| 296 | - class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" | 302 | + <p |
| 297 | - > | 303 | + class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" |
| 298 | - Library | 304 | + > |
| 299 | - </p> | 305 | + Library |
| 300 | - {#if data.user} | 306 | + </p> |
| 301 | <a | 307 | <a |
| 302 | href="/feeds" | 308 | href="/feeds" |
| 303 | class="block font-bold uppercase hover:text-[var(--accent)]" | 309 | class="block font-bold uppercase hover:text-[var(--accent)]" |
| @@ -308,8 +314,8 @@ | |||
| 308 | class="block font-bold uppercase hover:text-[var(--accent)]" | 314 | class="block font-bold uppercase hover:text-[var(--accent)]" |
| 309 | >Annotations</a | 315 | >Annotations</a |
| 310 | > | 316 | > |
| 311 | - {/if} | 317 | + </div> |
| 312 | - </div> | 318 | + {/if} |
| 313 | <div class="space-y-1.5"> | 319 | <div class="space-y-1.5"> |
| 314 | <p | 320 | <p |
| 315 | class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" | 321 | class="text-[0.65rem] font-extrabold uppercase tracking-widest text-[var(--muted)]" |