nandi/gleanpublic Fork 0
0f3f03a
Commits
Clone
git clone https://git.rickub.com/nandi/glean.git
git clone ssh://git@rickub.com/nandi/glean.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

refactor: do not display header in landing page and improve unlogged footerUnverified

Julien Robert committed 2026-07-03T08:57:41+02:00 Browse files
0f3f03a parent: eaf506a
modified web/src/routes/+layout.svelte +121 -115
@@ -130,127 +130,133 @@
130130
131131 <div class="min-h-screen flex flex-col">
132132 <!-- 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>
138237
238+ <!-- Mobile nav row -->
139239 {#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+ >
141243 {#each navItems as item}
142244 <a
143245 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(
145247 item.match,
146248 )
147249 ? 'bg-[var(--fg)] text-[var(--bg)]'
148- : 'text-[var(--muted)] hover:text-[var(--fg)] hover:bg-[var(--surface)]'}"
250+ : 'text-[var(--muted)]'}"
149251 >
150252 <Icon name={item.icon} class="h-3.5 w-3.5" />
151253 {item.label}
152254 </a>
153255 {/each}
154256 </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>
230257 {/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}
254260
255261 <!-- Content -->
256262 <main class="mx-auto w-full max-w-5xl flex-1 px-4 py-8">
@@ -291,13 +297,13 @@
291297 >Articles</a
292298 >
293299 </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>
301307 <a
302308 href="/feeds"
303309 class="block font-bold uppercase hover:text-[var(--accent)]"
@@ -308,8 +314,8 @@
308314 class="block font-bold uppercase hover:text-[var(--accent)]"
309315 >Annotations</a
310316 >
311- {/if}
312- </div>
317+ </div>
318+ {/if}
313319 <div class="space-y-1.5">
314320 <p
315321 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- <header133+ {#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 <a244 <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</a297 >Articles</a
292 >298 >
293 </div>299 </div>
294- <div class="space-y-1.5">300+ {#if data.user}
295- <p301+ <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- Library304+ >
299- </p>305+ Library
300- {#if data.user}306+ </p>
301 <a307 <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</a315 >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 <p320 <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)]"