An event companion and onboarding experience for the ATmosphere (alpha) atmo.quest
6

Configure Feed

Select the types of activity you want to include in your feed.

Add c2a banner for unclaimed accounts

authored by

Will Garrison and committed by
Tangled
(May 27, 2026, 3:04 AM UTC) 704ed5d6 bcbfe3a7

+294 -210
+1 -1
features/auth/link.go
··· 25 25 26 26 did, sess, err := h.ResumeSession(r) 27 27 if err != nil { 28 - http.Redirect(w, r, "/signin", http.StatusFound) 28 + http.Redirect(w, r, "/signin/atproto", http.StatusFound) 29 29 return 30 30 } 31 31
+4 -7
features/auth/pages/signin.templ
··· 33 33 <div class="auth-card-desc">already have a handle like <code>you.bsky.social</code> or any ATProto PDS? Go this way.</div> 34 34 <div class="auth-card-cta">▸ continue <span class="shortcut">↵</span></div> 35 35 </a> 36 - <a href="https://bsky.app/notifications" target="_blank" rel="noreferrer" class="auth-card"> 36 + <a href="/auth/local/continue" class="auth-card"> 37 37 <div class="auth-card-tag">option b</div> 38 - <div class="auth-card-title">create an <span class="kw2">Atmosphere</span> account</div> 39 - <div class="auth-card-desc">new to the open social web? We'll help you pick a host and get a handle.</div> 40 - <div class="auth-card-cta">▸ continue ↗</div> 38 + <div class="auth-card-title">Continue without an <span class="kw2">Atmosphere</span> account</div> 39 + <div class="auth-card-desc">use atmo.quest locally — link an Atmosphere account later in Settings to claim your data.</div> 40 + <div class="auth-card-cta">▸ continue</div> 41 41 </a> 42 - </div> 43 - <div class="auth-local-continue"> 44 - <a href="/auth/local/continue" class="btn-ghost">continue without atmosphere account</a> 45 42 </div> 46 43 </div> 47 44 <div class="statusbar">
+1 -1
features/auth/pages/signin_templ.go
··· 58 58 if templ_7745c5c3_Err != nil { 59 59 return templ_7745c5c3_Err 60 60 } 61 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">auth --pick</span></div><div class=\"output indent\">choose how to start your quest.</div><div class=\"hero-block\"><span class=\"hero-tag\">step 1 of 1 · pick a path</span><h1>sign <span class=\"quest\">in</span></h1><p class=\"lede\">atmo.quest is built on <span class=\"kw\">ATProto</span>. Your records live in <span class=\"kw2\">your repo</span>, not ours. You'll sign in with the same identity you use anywhere on the open social web.</p></div><div class=\"auth-choices\"><a href=\"/signin/atproto\" class=\"auth-card\"><div class=\"auth-card-tag\">option a</div><div class=\"auth-card-title\">sign in with your <span class=\"kw2\">Atmosphere</span> account</div><div class=\"auth-card-desc\">already have a handle like <code>you.bsky.social</code> or any ATProto PDS? Go this way.</div><div class=\"auth-card-cta\">▸ continue <span class=\"shortcut\">↵</span></div></a> <a href=\"https://bsky.app/notifications\" target=\"_blank\" rel=\"noreferrer\" class=\"auth-card\"><div class=\"auth-card-tag\">option b</div><div class=\"auth-card-title\">create an <span class=\"kw2\">Atmosphere</span> account</div><div class=\"auth-card-desc\">new to the open social web? We'll help you pick a host and get a handle.</div><div class=\"auth-card-cta\">▸ continue ↗</div></a></div><div class=\"auth-local-continue\"><a href=\"/auth/local/continue\" class=\"btn-ghost\">continue without atmosphere account</a></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div>") 61 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">auth --pick</span></div><div class=\"output indent\">choose how to start your quest.</div><div class=\"hero-block\"><span class=\"hero-tag\">step 1 of 1 · pick a path</span><h1>sign <span class=\"quest\">in</span></h1><p class=\"lede\">atmo.quest is built on <span class=\"kw\">ATProto</span>. Your records live in <span class=\"kw2\">your repo</span>, not ours. You'll sign in with the same identity you use anywhere on the open social web.</p></div><div class=\"auth-choices\"><a href=\"/signin/atproto\" class=\"auth-card\"><div class=\"auth-card-tag\">option a</div><div class=\"auth-card-title\">sign in with your <span class=\"kw2\">Atmosphere</span> account</div><div class=\"auth-card-desc\">already have a handle like <code>you.bsky.social</code> or any ATProto PDS? Go this way.</div><div class=\"auth-card-cta\">▸ continue <span class=\"shortcut\">↵</span></div></a> <a href=\"/auth/local/continue\" class=\"auth-card\"><div class=\"auth-card-tag\">option b</div><div class=\"auth-card-title\">Continue without an <span class=\"kw2\">Atmosphere</span> account</div><div class=\"auth-card-desc\">use atmo.quest locally — link an Atmosphere account later in Settings to claim your data.</div><div class=\"auth-card-cta\">▸ continue</div></a></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div>") 62 62 if templ_7745c5c3_Err != nil { 63 63 return templ_7745c5c3_Err 64 64 }
+1
features/index/handlers.go
··· 77 77 identity := h.Auth.ResolveIdentity(r) 78 78 if identity.IsAuth { 79 79 view.LoggedIn = true 80 + view.IsLocal = identity.IsLocal 80 81 view.Handle = identity.DID 81 82 view.QRURL = "/profile/qr.svg" 82 83
+7
features/index/pages/index.templ
··· 10 10 // are empty and the page falls back to "guest mode" copy. 11 11 type IndexView struct { 12 12 LoggedIn bool 13 + IsLocal bool 13 14 Handle string 14 15 15 16 // --- Fields below only populated when LoggedIn=true --- ··· 85 86 <div class="window-title">home</div> 86 87 @layouts.TopNav("home") 87 88 </div> 89 + if v.IsLocal { 90 + <div class="local-banner" role="status"> 91 + <span class="local-banner-icon">ℹ</span> 92 + <span class="local-banner-text">This account is unclaimed. Link your <a href="https://atmosphereaccount.com" target="_blank" rel="noopener noreferrer">Atmosphere account</a> in <a href="/settings">Settings</a>!</span> 93 + </div> 94 + } 88 95 <div class="window-body"> 89 96 <div class="prompt-line"> 90 97 <span class="user">you</span><span class="at">{ "@" }</span><span class="path">atmo.quest</span><span class="sep">:~$</span>
+82 -71
features/index/pages/index_templ.go
··· 18 18 // are empty and the page falls back to "guest mode" copy. 19 19 type IndexView struct { 20 20 LoggedIn bool 21 + IsLocal bool 21 22 Handle string 22 23 23 24 // --- Fields below only populated when LoggedIn=true --- ··· 152 153 if templ_7745c5c3_Err != nil { 153 154 return templ_7745c5c3_Err 154 155 } 155 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div><div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 156 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div>") 157 + if templ_7745c5c3_Err != nil { 158 + return templ_7745c5c3_Err 159 + } 160 + if v.IsLocal { 161 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"local-banner\" role=\"status\"><span class=\"local-banner-icon\">ℹ</span> <span class=\"local-banner-text\">This account is unclaimed. Link your <a href=\"https://atmosphereaccount.com\" target=\"_blank\" rel=\"noopener noreferrer\">Atmosphere account</a> in <a href=\"/settings\">Settings</a>!</span></div>") 162 + if templ_7745c5c3_Err != nil { 163 + return templ_7745c5c3_Err 164 + } 165 + } 166 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 156 167 if templ_7745c5c3_Err != nil { 157 168 return templ_7745c5c3_Err 158 169 } 159 170 var templ_7745c5c3_Var4 string 160 171 templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs("@") 161 172 if templ_7745c5c3_Err != nil { 162 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 90, Col: 56} 173 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 97, Col: 56} 163 174 } 164 175 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) 165 176 if templ_7745c5c3_Err != nil { 166 177 return templ_7745c5c3_Err 167 178 } 168 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami</span></div><div class=\"home-dashboard\"><div class=\"home-identity\"><div class=\"profile-flip-wrap\"><div class=\"profile-flip\" data-flip=\"0\"><button type=\"button\" class=\"profile-flip-inner\" aria-label=\"show your QR code\" aria-pressed=\"false\" data-flip-toggle><div class=\"profile-flip-face profile-flip-front\">") 179 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami</span></div><div class=\"home-dashboard\"><div class=\"home-identity\"><div class=\"profile-flip-wrap\"><div class=\"profile-flip\" data-flip=\"0\"><button type=\"button\" class=\"profile-flip-inner\" aria-label=\"show your QR code\" aria-pressed=\"false\" data-flip-toggle><div class=\"profile-flip-face profile-flip-front\">") 169 180 if templ_7745c5c3_Err != nil { 170 181 return templ_7745c5c3_Err 171 182 } 172 183 if v.AvatarURL != "" { 173 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<img class=\"profile-avatar\" src=\"") 184 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<img class=\"profile-avatar\" src=\"") 174 185 if templ_7745c5c3_Err != nil { 175 186 return templ_7745c5c3_Err 176 187 } 177 188 var templ_7745c5c3_Var5 string 178 189 templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.AvatarURL) 179 190 if templ_7745c5c3_Err != nil { 180 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 101, Col: 56} 191 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 108, Col: 56} 181 192 } 182 193 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5) 183 194 if templ_7745c5c3_Err != nil { 184 195 return templ_7745c5c3_Err 185 196 } 186 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\" alt=\"") 197 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" alt=\"") 187 198 if templ_7745c5c3_Err != nil { 188 199 return templ_7745c5c3_Err 189 200 } 190 201 var templ_7745c5c3_Var6 string 191 202 templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.ResolveAttributeValue(indexAvatarAlt(v.DisplayName)) 192 203 if templ_7745c5c3_Err != nil { 193 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 101, Col: 94} 204 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 108, Col: 94} 194 205 } 195 206 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var6) 196 207 if templ_7745c5c3_Err != nil { 197 208 return templ_7745c5c3_Err 198 209 } 199 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" loading=\"lazy\">") 210 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "\" loading=\"lazy\">") 200 211 if templ_7745c5c3_Err != nil { 201 212 return templ_7745c5c3_Err 202 213 } 203 214 } else { 204 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<div class=\"profile-avatar profile-avatar-empty\" aria-hidden=\"true\"><span>?</span></div>") 215 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<div class=\"profile-avatar profile-avatar-empty\" aria-hidden=\"true\"><span>?</span></div>") 205 216 if templ_7745c5c3_Err != nil { 206 217 return templ_7745c5c3_Err 207 218 } 208 219 } 209 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</div><div class=\"profile-flip-face profile-flip-back\">") 220 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</div><div class=\"profile-flip-face profile-flip-back\">") 210 221 if templ_7745c5c3_Err != nil { 211 222 return templ_7745c5c3_Err 212 223 } 213 224 if v.QRURL != "" { 214 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<img class=\"profile-qr\" src=\"") 225 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "<img class=\"profile-qr\" src=\"") 215 226 if templ_7745c5c3_Err != nil { 216 227 return templ_7745c5c3_Err 217 228 } 218 229 var templ_7745c5c3_Var7 string 219 230 templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.QRURL) 220 231 if templ_7745c5c3_Err != nil { 221 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 108, Col: 48} 232 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 115, Col: 48} 222 233 } 223 234 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7) 224 235 if templ_7745c5c3_Err != nil { 225 236 return templ_7745c5c3_Err 226 237 } 227 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "\" alt=\"QR code that links to your atmo.quest connect page\" loading=\"lazy\">") 238 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "\" alt=\"QR code that links to your atmo.quest connect page\" loading=\"lazy\">") 228 239 if templ_7745c5c3_Err != nil { 229 240 return templ_7745c5c3_Err 230 241 } 231 242 } 232 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</div></button></div><p class=\"profile-flip-hint\">▸ tap to flip</p>") 243 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</div></button></div><p class=\"profile-flip-hint\">▸ tap to flip</p>") 233 244 if templ_7745c5c3_Err != nil { 234 245 return templ_7745c5c3_Err 235 246 } 236 247 if v.QRConnectURL != "" { 237 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<button type=\"button\" class=\"btn btn-ghost btn-sm qr-copy-link\" id=\"qr-copy-btn\" style=\"display:none\" data-url=\"") 248 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<button type=\"button\" class=\"btn btn-ghost btn-sm qr-copy-link\" id=\"qr-copy-btn\" style=\"display:none\" data-url=\"") 238 249 if templ_7745c5c3_Err != nil { 239 250 return templ_7745c5c3_Err 240 251 } 241 252 var templ_7745c5c3_Var8 string 242 253 templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.QRConnectURL) 243 254 if templ_7745c5c3_Err != nil { 244 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 120, Col: 34} 255 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 127, Col: 34} 245 256 } 246 257 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8) 247 258 if templ_7745c5c3_Err != nil { 248 259 return templ_7745c5c3_Err 249 260 } 250 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "\" onclick=\"navigator.clipboard.writeText(this.dataset.url).then(()=>{this.textContent='copied!'});setTimeout(()=>{this.textContent='copy link'},1500)\">copy link</button>") 261 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "\" onclick=\"navigator.clipboard.writeText(this.dataset.url).then(()=>{this.textContent='copied!'});setTimeout(()=>{this.textContent='copy link'},1500)\">copy link</button>") 251 262 if templ_7745c5c3_Err != nil { 252 263 return templ_7745c5c3_Err 253 264 } 254 265 } 255 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</div><div class=\"home-identity-text\">") 266 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</div><div class=\"home-identity-text\">") 256 267 if templ_7745c5c3_Err != nil { 257 268 return templ_7745c5c3_Err 258 269 } 259 270 if v.DisplayName != "" { 260 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<h1 class=\"home-name\">") 271 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<h1 class=\"home-name\">") 261 272 if templ_7745c5c3_Err != nil { 262 273 return templ_7745c5c3_Err 263 274 } 264 275 var templ_7745c5c3_Var9 string 265 276 templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(v.DisplayName) 266 277 if templ_7745c5c3_Err != nil { 267 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 127, Col: 45} 278 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 134, Col: 45} 268 279 } 269 280 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) 270 281 if templ_7745c5c3_Err != nil { 271 282 return templ_7745c5c3_Err 272 283 } 273 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</h1>") 284 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</h1>") 274 285 if templ_7745c5c3_Err != nil { 275 286 return templ_7745c5c3_Err 276 287 } 277 288 } else { 278 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<h1 class=\"home-name home-name-muted\">(no display name)</h1>") 289 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<h1 class=\"home-name home-name-muted\">(no display name)</h1>") 279 290 if templ_7745c5c3_Err != nil { 280 291 return templ_7745c5c3_Err 281 292 } 282 293 } 283 294 if v.Handle != "" { 284 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<p class=\"home-handle\">") 295 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<p class=\"home-handle\">") 285 296 if templ_7745c5c3_Err != nil { 286 297 return templ_7745c5c3_Err 287 298 } 288 299 var templ_7745c5c3_Var10 string 289 300 templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("@" + v.Handle) 290 301 if templ_7745c5c3_Err != nil { 291 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 132, Col: 47} 302 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 139, Col: 47} 292 303 } 293 304 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) 294 305 if templ_7745c5c3_Err != nil { 295 306 return templ_7745c5c3_Err 296 307 } 297 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</p>") 308 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</p>") 298 309 if templ_7745c5c3_Err != nil { 299 310 return templ_7745c5c3_Err 300 311 } 301 312 } 302 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<div class=\"home-identity-ctas\"><a href=\"/profile\" class=\"btn btn-ghost btn-sm\">view profile →</a> <a href=\"/settings\" class=\"btn btn-ghost btn-sm\">settings →</a></div>") 313 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<div class=\"home-identity-ctas\"><a href=\"/profile\" class=\"btn btn-ghost btn-sm\">view profile →</a> <a href=\"/settings\" class=\"btn btn-ghost btn-sm\">settings →</a></div>") 303 314 if templ_7745c5c3_Err != nil { 304 315 return templ_7745c5c3_Err 305 316 } 306 317 if v.ConnectURL != "" { 307 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<div class=\"connect-url-debug\"><span class=\"connect-url-label\">connect link (for testing):</span> <code class=\"connect-url-value break\" id=\"connect-url\">") 318 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<div class=\"connect-url-debug\"><span class=\"connect-url-label\">connect link (for testing):</span> <code class=\"connect-url-value break\" id=\"connect-url\">") 308 319 if templ_7745c5c3_Err != nil { 309 320 return templ_7745c5c3_Err 310 321 } 311 322 var templ_7745c5c3_Var11 string 312 323 templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(v.ConnectURL) 313 324 if templ_7745c5c3_Err != nil { 314 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 140, Col: 77} 325 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 147, Col: 77} 315 326 } 316 327 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) 317 328 if templ_7745c5c3_Err != nil { 318 329 return templ_7745c5c3_Err 319 330 } 320 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "</code> <button type=\"button\" class=\"btn btn-ghost btn-sm\" onclick=\"navigator.clipboard.writeText(document.getElementById('connect-url').textContent).then(()=>{this.textContent='copied!'});setTimeout(()=>{this.textContent='copy'},1500)\">copy</button></div>") 331 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</code> <button type=\"button\" class=\"btn btn-ghost btn-sm\" onclick=\"navigator.clipboard.writeText(document.getElementById('connect-url').textContent).then(()=>{this.textContent='copied!'});setTimeout(()=>{this.textContent='copy'},1500)\">copy</button></div>") 321 332 if templ_7745c5c3_Err != nil { 322 333 return templ_7745c5c3_Err 323 334 } 324 335 } 325 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</div></div>") 336 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</div></div>") 326 337 if templ_7745c5c3_Err != nil { 327 338 return templ_7745c5c3_Err 328 339 } ··· 334 345 if templ_7745c5c3_Err != nil { 335 346 return templ_7745c5c3_Err 336 347 } 337 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 348 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 338 349 if templ_7745c5c3_Err != nil { 339 350 return templ_7745c5c3_Err 340 351 } ··· 342 353 if templ_7745c5c3_Err != nil { 343 354 return templ_7745c5c3_Err 344 355 } 345 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, " <script src=\"/static/js/profile.js\" defer></script>") 356 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, " <script src=\"/static/js/profile.js\" defer></script>") 346 357 if templ_7745c5c3_Err != nil { 347 358 return templ_7745c5c3_Err 348 359 } ··· 381 392 } 382 393 ctx = templ.ClearChildren(ctx) 383 394 if ev != nil { 384 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<a href=\"") 395 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<a href=\"") 385 396 if templ_7745c5c3_Err != nil { 386 397 return templ_7745c5c3_Err 387 398 } 388 399 var templ_7745c5c3_Var13 templ.SafeURL 389 400 templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/events/" + ev.QRToken)) 390 401 if templ_7745c5c3_Err != nil { 391 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 168, Col: 50} 402 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 175, Col: 50} 392 403 } 393 404 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) 394 405 if templ_7745c5c3_Err != nil { 395 406 return templ_7745c5c3_Err 396 407 } 397 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "\" class=\"home-event-card\" aria-label=\"current event\" style=\"text-decoration:none;color:inherit\"><div class=\"home-event-banner-row\"><div class=\"home-event-banner-body\"><div class=\"home-event-label\">checked in · live now</div><h2 class=\"home-event-name\">") 408 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "\" class=\"home-event-card\" aria-label=\"current event\" style=\"text-decoration:none;color:inherit\"><div class=\"home-event-banner-row\"><div class=\"home-event-banner-body\"><div class=\"home-event-label\">checked in · live now</div><h2 class=\"home-event-name\">") 398 409 if templ_7745c5c3_Err != nil { 399 410 return templ_7745c5c3_Err 400 411 } 401 412 var templ_7745c5c3_Var14 string 402 413 templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(ev.Name) 403 414 if templ_7745c5c3_Err != nil { 404 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 172, Col: 42} 415 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 179, Col: 42} 405 416 } 406 417 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) 407 418 if templ_7745c5c3_Err != nil { 408 419 return templ_7745c5c3_Err 409 420 } 410 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</h2><p class=\"home-event-meta\">") 421 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</h2><p class=\"home-event-meta\">") 411 422 if templ_7745c5c3_Err != nil { 412 423 return templ_7745c5c3_Err 413 424 } ··· 415 426 var templ_7745c5c3_Var15 string 416 427 templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(ev.Location) 417 428 if templ_7745c5c3_Err != nil { 418 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 175, Col: 20} 429 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 182, Col: 20} 419 430 } 420 431 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) 421 432 if templ_7745c5c3_Err != nil { 422 433 return templ_7745c5c3_Err 423 434 } 424 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, " ·&nbsp; ") 435 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, " ·&nbsp; ") 425 436 if templ_7745c5c3_Err != nil { 426 437 return templ_7745c5c3_Err 427 438 } ··· 429 440 var templ_7745c5c3_Var16 string 430 441 templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(ev.StartTime) 431 442 if templ_7745c5c3_Err != nil { 432 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 177, Col: 20} 443 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 184, Col: 20} 433 444 } 434 445 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) 435 446 if templ_7745c5c3_Err != nil { 436 447 return templ_7745c5c3_Err 437 448 } 438 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, " → ") 449 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, " → ") 439 450 if templ_7745c5c3_Err != nil { 440 451 return templ_7745c5c3_Err 441 452 } 442 453 var templ_7745c5c3_Var17 string 443 454 templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(ev.EndTime) 444 455 if templ_7745c5c3_Err != nil { 445 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 177, Col: 39} 456 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 184, Col: 39} 446 457 } 447 458 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) 448 459 if templ_7745c5c3_Err != nil { 449 460 return templ_7745c5c3_Err 450 461 } 451 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</p></div><span class=\"home-event-arrow\">→</span></div></a>") 462 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</p></div><span class=\"home-event-arrow\">→</span></div></a>") 452 463 if templ_7745c5c3_Err != nil { 453 464 return templ_7745c5c3_Err 454 465 } 455 466 } else { 456 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<aside class=\"home-event-card is-empty\" aria-label=\"current event\"><div class=\"home-event-label\">current event</div><p class=\"home-event-empty\">you're not checked into an event right now.</p><p class=\"home-event-empty-hint\">scan someone's QR at an event to join, or wait for an organizer to create one nearby.</p></aside>") 467 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<aside class=\"home-event-card is-empty\" aria-label=\"current event\"><div class=\"home-event-label\">current event</div><p class=\"home-event-empty\">you're not checked into an event right now.</p><p class=\"home-event-empty-hint\">scan someone's QR at an event to join, or wait for an organizer to create one nearby.</p></aside>") 457 468 if templ_7745c5c3_Err != nil { 458 469 return templ_7745c5c3_Err 459 470 } ··· 484 495 templ_7745c5c3_Var18 = templ.NopComponent 485 496 } 486 497 ctx = templ.ClearChildren(ctx) 487 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<aside class=\"home-recent-connections\" aria-label=\"recent connections\"><div class=\"home-event-label\">recent connections</div>") 498 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<aside class=\"home-recent-connections\" aria-label=\"recent connections\"><div class=\"home-event-label\">recent connections</div>") 488 499 if templ_7745c5c3_Err != nil { 489 500 return templ_7745c5c3_Err 490 501 } 491 502 if len(conns) > 0 { 492 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div class=\"recent-connections-grid\">") 503 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<div class=\"recent-connections-grid\">") 493 504 if templ_7745c5c3_Err != nil { 494 505 return templ_7745c5c3_Err 495 506 } 496 507 for _, c := range conns { 497 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<a href=\"") 508 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<a href=\"") 498 509 if templ_7745c5c3_Err != nil { 499 510 return templ_7745c5c3_Err 500 511 } 501 512 var templ_7745c5c3_Var19 templ.SafeURL 502 513 templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/connections/" + c.DID)) 503 514 if templ_7745c5c3_Err != nil { 504 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 204, Col: 53} 515 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 211, Col: 53} 505 516 } 506 517 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) 507 518 if templ_7745c5c3_Err != nil { 508 519 return templ_7745c5c3_Err 509 520 } 510 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "\" class=\"recent-conn-card\" title=\"") 521 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "\" class=\"recent-conn-card\" title=\"") 511 522 if templ_7745c5c3_Err != nil { 512 523 return templ_7745c5c3_Err 513 524 } 514 525 var templ_7745c5c3_Var20 string 515 526 templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.DisplayName) 516 527 if templ_7745c5c3_Err != nil { 517 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 204, Col: 102} 528 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 211, Col: 102} 518 529 } 519 530 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20) 520 531 if templ_7745c5c3_Err != nil { 521 532 return templ_7745c5c3_Err 522 533 } 523 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "\">") 534 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "\">") 524 535 if templ_7745c5c3_Err != nil { 525 536 return templ_7745c5c3_Err 526 537 } 527 538 if c.AvatarURL != "" { 528 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<img class=\"recent-conn-avatar\" src=\"") 539 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<img class=\"recent-conn-avatar\" src=\"") 529 540 if templ_7745c5c3_Err != nil { 530 541 return templ_7745c5c3_Err 531 542 } 532 543 var templ_7745c5c3_Var21 string 533 544 templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.AvatarURL) 534 545 if templ_7745c5c3_Err != nil { 535 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 206, Col: 56} 546 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 213, Col: 56} 536 547 } 537 548 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21) 538 549 if templ_7745c5c3_Err != nil { 539 550 return templ_7745c5c3_Err 540 551 } 541 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "\" alt=\"") 552 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "\" alt=\"") 542 553 if templ_7745c5c3_Err != nil { 543 554 return templ_7745c5c3_Err 544 555 } 545 556 var templ_7745c5c3_Var22 string 546 557 templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.DisplayName) 547 558 if templ_7745c5c3_Err != nil { 548 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 206, Col: 78} 559 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 213, Col: 78} 549 560 } 550 561 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22) 551 562 if templ_7745c5c3_Err != nil { 552 563 return templ_7745c5c3_Err 553 564 } 554 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "\" loading=\"lazy\"> ") 565 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\" loading=\"lazy\"> ") 555 566 if templ_7745c5c3_Err != nil { 556 567 return templ_7745c5c3_Err 557 568 } 558 569 } else { 559 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<div class=\"recent-conn-avatar recent-conn-avatar-empty\" aria-hidden=\"true\">?</div>") 570 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<div class=\"recent-conn-avatar recent-conn-avatar-empty\" aria-hidden=\"true\">?</div>") 560 571 if templ_7745c5c3_Err != nil { 561 572 return templ_7745c5c3_Err 562 573 } 563 574 } 564 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<span class=\"recent-conn-name\">") 575 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<span class=\"recent-conn-name\">") 565 576 if templ_7745c5c3_Err != nil { 566 577 return templ_7745c5c3_Err 567 578 } ··· 569 580 var templ_7745c5c3_Var23 string 570 581 templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(c.DisplayName) 571 582 if templ_7745c5c3_Err != nil { 572 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 212, Col: 23} 583 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 219, Col: 23} 573 584 } 574 585 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) 575 586 if templ_7745c5c3_Err != nil { ··· 579 590 var templ_7745c5c3_Var24 string 580 591 templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(shortDID(c.DID)) 581 592 if templ_7745c5c3_Err != nil { 582 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 214, Col: 25} 593 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 221, Col: 25} 583 594 } 584 595 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) 585 596 if templ_7745c5c3_Err != nil { 586 597 return templ_7745c5c3_Err 587 598 } 588 599 } 589 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</span></a>") 600 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</span></a>") 590 601 if templ_7745c5c3_Err != nil { 591 602 return templ_7745c5c3_Err 592 603 } 593 604 } 594 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</div><a href=\"/connections\" class=\"btn btn-ghost btn-sm\" style=\"margin-top:0.5rem\">view all →</a>") 605 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</div><a href=\"/connections\" class=\"btn btn-ghost btn-sm\" style=\"margin-top:0.5rem\">view all →</a>") 595 606 if templ_7745c5c3_Err != nil { 596 607 return templ_7745c5c3_Err 597 608 } 598 609 } else { 599 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<p class=\"home-event-empty\">no connections yet, go meet someone!</p>") 610 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<p class=\"home-event-empty\">no connections yet, go meet someone!</p>") 600 611 if templ_7745c5c3_Err != nil { 601 612 return templ_7745c5c3_Err 602 613 } 603 614 } 604 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</aside>") 615 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</aside>") 605 616 if templ_7745c5c3_Err != nil { 606 617 return templ_7745c5c3_Err 607 618 } ··· 650 661 }() 651 662 } 652 663 ctx = templ.InitializeContext(ctx) 653 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<div class=\"window\"><div class=\"window-bar\"><div class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div><div class=\"window-title\">zsh</div></div><div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 664 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<div class=\"window\"><div class=\"window-bar\"><div class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div><div class=\"window-title\">zsh</div></div><div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 654 665 if templ_7745c5c3_Err != nil { 655 666 return templ_7745c5c3_Err 656 667 } 657 668 var templ_7745c5c3_Var27 string 658 669 templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs("@") 659 670 if templ_7745c5c3_Err != nil { 660 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 248, Col: 56} 671 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 255, Col: 56} 661 672 } 662 673 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27)) 663 674 if templ_7745c5c3_Err != nil { 664 675 return templ_7745c5c3_Err 665 676 } 666 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</span><span class=\"path\">cascadiajs</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami</span></div><div class=\"output indent\">a person at a conference. you just met someone interesting and now their handle is gone.</div><div class=\"hero-block\"><span class=\"hero-tag\">Find your people in the Atmosphere.</span><h1>atmo<span class=\"quest\">.quest</span><span class=\"cursor\">&nbsp;</span></h1><p class=\"lede\">An <span class=\"kw\">event companion</span> ") 677 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</span><span class=\"path\">cascadiajs</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami</span></div><div class=\"output indent\">a person at a conference. you just met someone interesting and now their handle is gone.</div><div class=\"hero-block\"><span class=\"hero-tag\">Find your people in the Atmosphere.</span><h1>atmo<span class=\"quest\">.quest</span><span class=\"cursor\">&nbsp;</span></h1><p class=\"lede\">An <span class=\"kw\">event companion</span> ") 667 678 if templ_7745c5c3_Err != nil { 668 679 return templ_7745c5c3_Err 669 680 } 670 681 var templ_7745c5c3_Var28 string 671 682 templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs("for") 672 683 if templ_7745c5c3_Err != nil { 673 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 259, Col: 56} 684 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 266, Col: 56} 674 685 } 675 686 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28)) 676 687 if templ_7745c5c3_Err != nil { 677 688 return templ_7745c5c3_Err 678 689 } 679 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, " the open social web. Scan a QR, write a note, leave with a real follow-up list. Your data goes to <span class=\"kw2\">your repo</span>, not ours.</p><div class=\"ctas\"><a href=\"/signin\" class=\"btn btn-primary\">▸ start quest <span class=\"shortcut\">↵</span></a> <a href=\"/about-atproto\" class=\"btn btn-ghost\">? what's ATProto <span class=\"shortcut\">?</span></a></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><div class=\"window\"><div class=\"window-bar\"><div class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div><div class=\"window-title\">quest_log.md</div></div><div class=\"window-body\"><div class=\"quest-log\"><h2>Side Quests <span class=\"count\">") 690 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, " the open social web. Scan a QR, write a note, leave with a real follow-up list. Your data goes to <span class=\"kw2\">your repo</span>, not ours.</p><div class=\"ctas\"><a href=\"/signin\" class=\"btn btn-primary\">▸ start quest <span class=\"shortcut\">↵</span></a> <a href=\"/about-atproto\" class=\"btn btn-ghost\">? what's ATProto <span class=\"shortcut\">?</span></a></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><div class=\"window\"><div class=\"window-bar\"><div class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div><div class=\"window-title\">quest_log.md</div></div><div class=\"window-body\"><div class=\"quest-log\"><h2>Side Quests <span class=\"count\">") 680 691 if templ_7745c5c3_Err != nil { 681 692 return templ_7745c5c3_Err 682 693 } 683 694 var templ_7745c5c3_Var29 string 684 695 templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs("// available") 685 696 if templ_7745c5c3_Err != nil { 686 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 281, Col: 57} 697 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/index/pages/index.templ`, Line: 288, Col: 57} 687 698 } 688 699 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29)) 689 700 if templ_7745c5c3_Err != nil { 690 701 return templ_7745c5c3_Err 691 702 } 692 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</span></h2><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Make your first connection</div><div class=\"quest-desc\">Scan someone's QR code. A <code>quest.atmo.connection</code> record gets written to your PDS. They get one too. That's the protocol bit.</div><div class=\"quest-meta\"><span class=\"badge\">+1 badge</span> first connect</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Check in to an event</div><div class=\"quest-desc\">Drops a checkin record dated June 1–2, 2026. You'll find it in your repo forever.</div><div class=\"quest-meta\"><span class=\"badge\">+1 badge</span> attendee</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Take a note while it's fresh</div><div class=\"quest-desc\">Private notes, attached to each connection. Read them Monday morning when you forget who Sarah was.</div><div class=\"quest-meta\"><span class=\"badge locked\">unlocks</span> with first connection</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Help unlock the conference rewards</div><div class=\"quest-desc\">As more people join, new things appear — leaderboard, interest matching, end-of-conf stats. Earned together.</div><div class=\"quest-meta\"><span class=\"badge locked\">group quest</span> see /unlocks</div></div></div></div></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 703 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</span></h2><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Make your first connection</div><div class=\"quest-desc\">Scan someone's QR code. A <code>quest.atmo.connection</code> record gets written to your PDS. They get one too. That's the protocol bit.</div><div class=\"quest-meta\"><span class=\"badge\">+1 badge</span> first connect</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Check in to an event</div><div class=\"quest-desc\">Drops a checkin record dated June 1–2, 2026. You'll find it in your repo forever.</div><div class=\"quest-meta\"><span class=\"badge\">+1 badge</span> attendee</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Take a note while it's fresh</div><div class=\"quest-desc\">Private notes, attached to each connection. Read them Monday morning when you forget who Sarah was.</div><div class=\"quest-meta\"><span class=\"badge locked\">unlocks</span> with first connection</div></div></div><div class=\"quest\"><div class=\"quest-icon\">◆</div><div><div class=\"quest-title\">Help unlock the conference rewards</div><div class=\"quest-desc\">As more people join, new things appear — leaderboard, interest matching, end-of-conf stats. Earned together.</div><div class=\"quest-meta\"><span class=\"badge locked\">group quest</span> see /unlocks</div></div></div></div></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 693 704 if templ_7745c5c3_Err != nil { 694 705 return templ_7745c5c3_Err 695 706 }
+1
features/profile/handlers.go
··· 124 124 125 125 // Build profile view 126 126 view := pages.ProfileView{ 127 + IsLocal: true, 127 128 QRURL: "/profile/qr.svg", 128 129 ConnectedDID: strings.TrimSpace(r.URL.Query().Get("connected")), 129 130 DisplayName: displayName,
+8
features/profile/pages/profile.templ
··· 41 41 ConnectedDID string 42 42 // Badges earned by this user (from local cache). 43 43 Badges []ProfileBadge 44 + // IsLocal is true when this is a local-only account. 45 + IsLocal bool 44 46 } 45 47 46 48 // ProfileBadge is a badge to display on the profile. ··· 67 69 <div class="window-title">profile</div> 68 70 @layouts.TopNav("home") 69 71 </div> 72 + if v.IsLocal { 73 + <div class="local-banner" role="status"> 74 + <span class="local-banner-icon">ℹ</span> 75 + <span class="local-banner-text">This account is unclaimed. Link your <a href="https://atmosphereaccount.com" target="_blank" rel="noopener noreferrer">Atmosphere account</a> in <a href="/settings">Settings</a>!</span> 76 + </div> 77 + } 70 78 <div class="window-body"> 71 79 <div class="prompt-line"> 72 80 <span class="user">you</span><span class="at">{ "@" }</span><span class="path">atmo.quest</span><span class="sep">:~$</span>
+82 -70
features/profile/pages/profile_templ.go
··· 49 49 ConnectedDID string 50 50 // Badges earned by this user (from local cache). 51 51 Badges []ProfileBadge 52 + // IsLocal is true when this is a local-only account. 53 + IsLocal bool 52 54 } 53 55 54 56 // ProfileBadge is a badge to display on the profile. ··· 106 108 if templ_7745c5c3_Err != nil { 107 109 return templ_7745c5c3_Err 108 110 } 109 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div><div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 111 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div>") 112 + if templ_7745c5c3_Err != nil { 113 + return templ_7745c5c3_Err 114 + } 115 + if v.IsLocal { 116 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"local-banner\" role=\"status\"><span class=\"local-banner-icon\">ℹ</span> <span class=\"local-banner-text\">This account is unclaimed. Link your <a href=\"https://atmosphereaccount.com\" target=\"_blank\" rel=\"noopener noreferrer\">Atmosphere account</a> in <a href=\"/settings\">Settings</a>!</span></div>") 117 + if templ_7745c5c3_Err != nil { 118 + return templ_7745c5c3_Err 119 + } 120 + } 121 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"window-body\"><div class=\"prompt-line\"><span class=\"user\">you</span><span class=\"at\">") 110 122 if templ_7745c5c3_Err != nil { 111 123 return templ_7745c5c3_Err 112 124 } 113 125 var templ_7745c5c3_Var3 string 114 126 templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs("@") 115 127 if templ_7745c5c3_Err != nil { 116 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 72, Col: 56} 128 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 80, Col: 56} 117 129 } 118 130 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) 119 131 if templ_7745c5c3_Err != nil { 120 132 return templ_7745c5c3_Err 121 133 } 122 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami --verbose</span></div><div class=\"profile-card\">") 134 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</span><span class=\"path\">atmo.quest</span><span class=\"sep\">:~$</span> <span class=\"cmd\">whoami --verbose</span></div><div class=\"profile-card\">") 123 135 if templ_7745c5c3_Err != nil { 124 136 return templ_7745c5c3_Err 125 137 } 126 138 if v.ConnectedDID != "" { 127 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"connected-banner\" role=\"status\"><span class=\"connected-tick\">✓</span> ") 139 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<div class=\"connected-banner\" role=\"status\"><span class=\"connected-tick\">✓</span> ") 128 140 if templ_7745c5c3_Err != nil { 129 141 return templ_7745c5c3_Err 130 142 } 131 143 if v.ConnectedDID == "self" { 132 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<span>you can't connect with yourself.</span>") 144 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<span>you can't connect with yourself.</span>") 133 145 if templ_7745c5c3_Err != nil { 134 146 return templ_7745c5c3_Err 135 147 } 136 148 } else { 137 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<span>connected · <code class=\"break\">") 149 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<span>connected · <code class=\"break\">") 138 150 if templ_7745c5c3_Err != nil { 139 151 return templ_7745c5c3_Err 140 152 } 141 153 var templ_7745c5c3_Var4 string 142 154 templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(v.ConnectedDID) 143 155 if templ_7745c5c3_Err != nil { 144 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 83, Col: 63} 156 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 91, Col: 63} 145 157 } 146 158 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) 147 159 if templ_7745c5c3_Err != nil { 148 160 return templ_7745c5c3_Err 149 161 } 150 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</code></span>") 162 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</code></span>") 151 163 if templ_7745c5c3_Err != nil { 152 164 return templ_7745c5c3_Err 153 165 } 154 166 } 155 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</div>") 167 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</div>") 156 168 if templ_7745c5c3_Err != nil { 157 169 return templ_7745c5c3_Err 158 170 } 159 171 } 160 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<div class=\"profile-flip\" data-flip=\"0\"><button type=\"button\" class=\"profile-flip-inner\" aria-label=\"show QR code to connect\" aria-pressed=\"false\" data-flip-toggle><div class=\"profile-flip-face profile-flip-front\">") 172 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "<div class=\"profile-flip\" data-flip=\"0\"><button type=\"button\" class=\"profile-flip-inner\" aria-label=\"show QR code to connect\" aria-pressed=\"false\" data-flip-toggle><div class=\"profile-flip-face profile-flip-front\">") 161 173 if templ_7745c5c3_Err != nil { 162 174 return templ_7745c5c3_Err 163 175 } 164 176 if v.AvatarURL != "" { 165 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<img class=\"profile-avatar\" src=\"") 177 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<img class=\"profile-avatar\" src=\"") 166 178 if templ_7745c5c3_Err != nil { 167 179 return templ_7745c5c3_Err 168 180 } 169 181 var templ_7745c5c3_Var5 string 170 182 templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.AvatarURL) 171 183 if templ_7745c5c3_Err != nil { 172 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 91, Col: 54} 184 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 99, Col: 54} 173 185 } 174 186 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5) 175 187 if templ_7745c5c3_Err != nil { 176 188 return templ_7745c5c3_Err 177 189 } 178 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "\" alt=\"") 190 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "\" alt=\"") 179 191 if templ_7745c5c3_Err != nil { 180 192 return templ_7745c5c3_Err 181 193 } 182 194 var templ_7745c5c3_Var6 string 183 195 templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.ResolveAttributeValue(avatarAlt(v.DisplayName)) 184 196 if templ_7745c5c3_Err != nil { 185 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 91, Col: 87} 197 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 99, Col: 87} 186 198 } 187 199 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var6) 188 200 if templ_7745c5c3_Err != nil { 189 201 return templ_7745c5c3_Err 190 202 } 191 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "\" loading=\"lazy\">") 203 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "\" loading=\"lazy\">") 192 204 if templ_7745c5c3_Err != nil { 193 205 return templ_7745c5c3_Err 194 206 } 195 207 } else { 196 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<div class=\"profile-avatar profile-avatar-empty\" aria-hidden=\"true\"><span>?</span></div>") 208 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<div class=\"profile-avatar profile-avatar-empty\" aria-hidden=\"true\"><span>?</span></div>") 197 209 if templ_7745c5c3_Err != nil { 198 210 return templ_7745c5c3_Err 199 211 } 200 212 } 201 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</div><div class=\"profile-flip-face profile-flip-back\">") 213 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</div><div class=\"profile-flip-face profile-flip-back\">") 202 214 if templ_7745c5c3_Err != nil { 203 215 return templ_7745c5c3_Err 204 216 } 205 217 if v.QRURL != "" { 206 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<img class=\"profile-qr\" src=\"") 218 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<img class=\"profile-qr\" src=\"") 207 219 if templ_7745c5c3_Err != nil { 208 220 return templ_7745c5c3_Err 209 221 } 210 222 var templ_7745c5c3_Var7 string 211 223 templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.QRURL) 212 224 if templ_7745c5c3_Err != nil { 213 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 100, Col: 46} 225 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 108, Col: 46} 214 226 } 215 227 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7) 216 228 if templ_7745c5c3_Err != nil { 217 229 return templ_7745c5c3_Err 218 230 } 219 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\" alt=\"QR code that links to your atmo.quest connect page\" loading=\"lazy\">") 231 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "\" alt=\"QR code that links to your atmo.quest connect page\" loading=\"lazy\">") 220 232 if templ_7745c5c3_Err != nil { 221 233 return templ_7745c5c3_Err 222 234 } 223 235 } 224 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</div></button><p class=\"profile-flip-hint\">▸ tap to flip</p></div>") 236 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</div></button><p class=\"profile-flip-hint\">▸ tap to flip</p></div>") 225 237 if templ_7745c5c3_Err != nil { 226 238 return templ_7745c5c3_Err 227 239 } 228 240 if v.DisplayName != "" { 229 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<h1 class=\"profile-name\">") 241 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<h1 class=\"profile-name\">") 230 242 if templ_7745c5c3_Err != nil { 231 243 return templ_7745c5c3_Err 232 244 } 233 245 var templ_7745c5c3_Var8 string 234 246 templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(v.DisplayName) 235 247 if templ_7745c5c3_Err != nil { 236 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 108, Col: 46} 248 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 116, Col: 46} 237 249 } 238 250 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) 239 251 if templ_7745c5c3_Err != nil { 240 252 return templ_7745c5c3_Err 241 253 } 242 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</h1>") 254 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</h1>") 243 255 if templ_7745c5c3_Err != nil { 244 256 return templ_7745c5c3_Err 245 257 } 246 258 } else { 247 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<h1 class=\"profile-name profile-name-muted\">(no display name)</h1>") 259 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<h1 class=\"profile-name profile-name-muted\">(no display name)</h1>") 248 260 if templ_7745c5c3_Err != nil { 249 261 return templ_7745c5c3_Err 250 262 } 251 263 } 252 264 if v.Hiring || v.Looking { 253 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<div class=\"profile-status-pills\">") 265 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<div class=\"profile-status-pills\">") 254 266 if templ_7745c5c3_Err != nil { 255 267 return templ_7745c5c3_Err 256 268 } 257 269 if v.Hiring { 258 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<span class=\"pill pill-hiring\" title=\"open roles on my team\"><span class=\"pill-status-dot\" aria-hidden=\"true\">●</span> hiring</span> ") 270 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<span class=\"pill pill-hiring\" title=\"open roles on my team\"><span class=\"pill-status-dot\" aria-hidden=\"true\">●</span> hiring</span> ") 259 271 if templ_7745c5c3_Err != nil { 260 272 return templ_7745c5c3_Err 261 273 } 262 274 } 263 275 if v.Looking { 264 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<span class=\"pill pill-looking\" title=\"open to new opportunities\"><span class=\"pill-status-dot\" aria-hidden=\"true\">●</span> looking for work</span>") 276 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<span class=\"pill pill-looking\" title=\"open to new opportunities\"><span class=\"pill-status-dot\" aria-hidden=\"true\">●</span> looking for work</span>") 265 277 if templ_7745c5c3_Err != nil { 266 278 return templ_7745c5c3_Err 267 279 } 268 280 } 269 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</div>") 281 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</div>") 270 282 if templ_7745c5c3_Err != nil { 271 283 return templ_7745c5c3_Err 272 284 } 273 285 } 274 286 if v.Bio != "" || v.WorksAt != "" || v.Location != "" || v.ContactMethod != "" { 275 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<div class=\"profile-details\">") 287 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<div class=\"profile-details\">") 276 288 if templ_7745c5c3_Err != nil { 277 289 return templ_7745c5c3_Err 278 290 } 279 291 if v.Bio != "" { 280 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<div class=\"detail-row\"><div class=\"detail-k\">bio</div><div class=\"detail-v detail-v-bio\">") 292 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<div class=\"detail-row\"><div class=\"detail-k\">bio</div><div class=\"detail-v detail-v-bio\">") 281 293 if templ_7745c5c3_Err != nil { 282 294 return templ_7745c5c3_Err 283 295 } 284 296 var templ_7745c5c3_Var9 string 285 297 templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(v.Bio) 286 298 if templ_7745c5c3_Err != nil { 287 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 135, Col: 51} 299 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 143, Col: 51} 288 300 } 289 301 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) 290 302 if templ_7745c5c3_Err != nil { 291 303 return templ_7745c5c3_Err 292 304 } 293 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</div></div>") 305 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div></div>") 294 306 if templ_7745c5c3_Err != nil { 295 307 return templ_7745c5c3_Err 296 308 } 297 309 } 298 310 if v.WorksAt != "" { 299 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<div class=\"detail-row\"><div class=\"detail-k\">works at</div><div class=\"detail-v\">") 311 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<div class=\"detail-row\"><div class=\"detail-k\">works at</div><div class=\"detail-v\">") 300 312 if templ_7745c5c3_Err != nil { 301 313 return templ_7745c5c3_Err 302 314 } 303 315 var templ_7745c5c3_Var10 string 304 316 templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(v.WorksAt) 305 317 if templ_7745c5c3_Err != nil { 306 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 141, Col: 42} 318 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 149, Col: 42} 307 319 } 308 320 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) 309 321 if templ_7745c5c3_Err != nil { 310 322 return templ_7745c5c3_Err 311 323 } 312 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div></div>") 324 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</div></div>") 313 325 if templ_7745c5c3_Err != nil { 314 326 return templ_7745c5c3_Err 315 327 } 316 328 } 317 329 if v.Location != "" { 318 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<div class=\"detail-row\"><div class=\"detail-k\">based in</div><div class=\"detail-v\">") 330 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<div class=\"detail-row\"><div class=\"detail-k\">based in</div><div class=\"detail-v\">") 319 331 if templ_7745c5c3_Err != nil { 320 332 return templ_7745c5c3_Err 321 333 } 322 334 var templ_7745c5c3_Var11 string 323 335 templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(v.Location) 324 336 if templ_7745c5c3_Err != nil { 325 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 147, Col: 43} 337 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 155, Col: 43} 326 338 } 327 339 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) 328 340 if templ_7745c5c3_Err != nil { 329 341 return templ_7745c5c3_Err 330 342 } 331 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</div></div>") 343 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</div></div>") 332 344 if templ_7745c5c3_Err != nil { 333 345 return templ_7745c5c3_Err 334 346 } 335 347 } 336 348 if v.ContactMethod != "" { 337 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<div class=\"detail-row\"><div class=\"detail-k\">contact</div><div class=\"detail-v\">") 349 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div class=\"detail-row\"><div class=\"detail-k\">contact</div><div class=\"detail-v\">") 338 350 if templ_7745c5c3_Err != nil { 339 351 return templ_7745c5c3_Err 340 352 } 341 353 var templ_7745c5c3_Var12 string 342 354 templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(v.ContactMethod) 343 355 if templ_7745c5c3_Err != nil { 344 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 153, Col: 48} 356 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 161, Col: 48} 345 357 } 346 358 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) 347 359 if templ_7745c5c3_Err != nil { 348 360 return templ_7745c5c3_Err 349 361 } 350 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</div></div>") 362 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</div></div>") 351 363 if templ_7745c5c3_Err != nil { 352 364 return templ_7745c5c3_Err 353 365 } 354 366 } 355 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</div>") 367 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</div>") 356 368 if templ_7745c5c3_Err != nil { 357 369 return templ_7745c5c3_Err 358 370 } 359 371 if v.Bio != "" && v.BioFromBsky { 360 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<p class=\"profile-bio-source\">▸ bio from <span class=\"kw2\">bluesky</span> · <a href=\"/profile/edit\" class=\"muted-link\">override on atmo.quest</a></p>") 372 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<p class=\"profile-bio-source\">▸ bio from <span class=\"kw2\">bluesky</span> · <a href=\"/profile/edit\" class=\"muted-link\">override on atmo.quest</a></p>") 361 373 if templ_7745c5c3_Err != nil { 362 374 return templ_7745c5c3_Err 363 375 } 364 376 } 365 377 } else { 366 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<p class=\"profile-bio profile-bio-empty\">no bio yet — <a href=\"/profile/edit\" class=\"muted-link\">add one</a></p>") 378 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<p class=\"profile-bio profile-bio-empty\">no bio yet — <a href=\"/profile/edit\" class=\"muted-link\">add one</a></p>") 367 379 if templ_7745c5c3_Err != nil { 368 380 return templ_7745c5c3_Err 369 381 } 370 382 } 371 383 if len(v.Interests) > 0 { 372 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<div class=\"profile-section\"><div class=\"profile-section-label\">interests</div><div class=\"profile-pills\">") 384 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<div class=\"profile-section\"><div class=\"profile-section-label\">interests</div><div class=\"profile-pills\">") 373 385 if templ_7745c5c3_Err != nil { 374 386 return templ_7745c5c3_Err 375 387 } 376 388 for _, t := range v.Interests { 377 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<span class=\"pill pill-interest\">") 389 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<span class=\"pill pill-interest\">") 378 390 if templ_7745c5c3_Err != nil { 379 391 return templ_7745c5c3_Err 380 392 } 381 393 var templ_7745c5c3_Var13 string 382 394 templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(t) 383 395 if templ_7745c5c3_Err != nil { 384 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 171, Col: 45} 396 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 179, Col: 45} 385 397 } 386 398 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) 387 399 if templ_7745c5c3_Err != nil { 388 400 return templ_7745c5c3_Err 389 401 } 390 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</span>") 402 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</span>") 391 403 if templ_7745c5c3_Err != nil { 392 404 return templ_7745c5c3_Err 393 405 } 394 406 } 395 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</div></div>") 407 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</div></div>") 396 408 if templ_7745c5c3_Err != nil { 397 409 return templ_7745c5c3_Err 398 410 } 399 411 } 400 412 if len(v.Links) > 0 { 401 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<div class=\"profile-section\"><div class=\"profile-section-label\">links</div><div class=\"profile-links\">") 413 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<div class=\"profile-section\"><div class=\"profile-section-label\">links</div><div class=\"profile-links\">") 402 414 if templ_7745c5c3_Err != nil { 403 415 return templ_7745c5c3_Err 404 416 } 405 417 for _, l := range v.Links { 406 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<a class=\"pill pill-link\" href=\"") 418 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<a class=\"pill pill-link\" href=\"") 407 419 if templ_7745c5c3_Err != nil { 408 420 return templ_7745c5c3_Err 409 421 } 410 422 var templ_7745c5c3_Var14 templ.SafeURL 411 423 templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinURLErrs(templ.URL(l.URL)) 412 424 if templ_7745c5c3_Err != nil { 413 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 182, Col: 58} 425 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 190, Col: 58} 414 426 } 415 427 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) 416 428 if templ_7745c5c3_Err != nil { 417 429 return templ_7745c5c3_Err 418 430 } 419 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\" rel=\"noopener noreferrer\" target=\"_blank\"><span class=\"pill-link-label\">") 431 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\" rel=\"noopener noreferrer\" target=\"_blank\"><span class=\"pill-link-label\">") 420 432 if templ_7745c5c3_Err != nil { 421 433 return templ_7745c5c3_Err 422 434 } 423 435 var templ_7745c5c3_Var15 string 424 436 templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(l.Label) 425 437 if templ_7745c5c3_Err != nil { 426 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 183, Col: 49} 438 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 191, Col: 49} 427 439 } 428 440 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) 429 441 if templ_7745c5c3_Err != nil { 430 442 return templ_7745c5c3_Err 431 443 } 432 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</span> <span class=\"pill-link-arrow\" aria-hidden=\"true\">↗</span></a>") 444 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</span> <span class=\"pill-link-arrow\" aria-hidden=\"true\">↗</span></a>") 433 445 if templ_7745c5c3_Err != nil { 434 446 return templ_7745c5c3_Err 435 447 } 436 448 } 437 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</div></div>") 449 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</div></div>") 438 450 if templ_7745c5c3_Err != nil { 439 451 return templ_7745c5c3_Err 440 452 } 441 453 } 442 454 if len(v.Badges) > 0 { 443 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<div class=\"profile-section\"><div class=\"profile-section-label\">badges</div><div class=\"profile-badges-grid\">") 455 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<div class=\"profile-section\"><div class=\"profile-section-label\">badges</div><div class=\"profile-badges-grid\">") 444 456 if templ_7745c5c3_Err != nil { 445 457 return templ_7745c5c3_Err 446 458 } ··· 450 462 return templ_7745c5c3_Err 451 463 } 452 464 } 453 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</div></div>") 465 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</div></div>") 454 466 if templ_7745c5c3_Err != nil { 455 467 return templ_7745c5c3_Err 456 468 } 457 469 } 458 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<div class=\"ctas\"><a href=\"/profile/edit\" class=\"btn btn-primary\">▸ edit profile</a> <a href=\"/\" class=\"btn btn-ghost\">← home</a></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div> <div id=\"badge-modal-overlay\" class=\"badge-modal-overlay\" style=\"display:none\" onclick=\"if(event.target===this)this.style.display='none'\"><div class=\"badge-modal\"><button type=\"button\" class=\"badge-modal-close\" onclick=\"document.getElementById('badge-modal-overlay').style.display='none'\" aria-label=\"Close\">✕</button><div class=\"badge-modal-svg\" id=\"badge-modal-svg\"></div><div class=\"badge-modal-name\" id=\"badge-modal-name\"></div><div class=\"badge-modal-desc\" id=\"badge-modal-desc\"></div><div class=\"badge-modal-date muted\" id=\"badge-modal-date\"></div><div class=\"badge-modal-message\" id=\"badge-modal-message\"></div></div></div><script src=\"/static/js/profile.js\" defer></script> ") 470 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "<div class=\"ctas\"><a href=\"/profile/edit\" class=\"btn btn-primary\">▸ edit profile</a> <a href=\"/\" class=\"btn btn-ghost\">← home</a></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div> <div id=\"badge-modal-overlay\" class=\"badge-modal-overlay\" style=\"display:none\" onclick=\"if(event.target===this)this.style.display='none'\"><div class=\"badge-modal\"><button type=\"button\" class=\"badge-modal-close\" onclick=\"document.getElementById('badge-modal-overlay').style.display='none'\" aria-label=\"Close\">✕</button><div class=\"badge-modal-svg\" id=\"badge-modal-svg\"></div><div class=\"badge-modal-name\" id=\"badge-modal-name\"></div><div class=\"badge-modal-desc\" id=\"badge-modal-desc\"></div><div class=\"badge-modal-date muted\" id=\"badge-modal-date\"></div><div class=\"badge-modal-message\" id=\"badge-modal-message\"></div></div></div><script src=\"/static/js/profile.js\" defer></script> ") 459 471 if templ_7745c5c3_Err != nil { 460 472 return templ_7745c5c3_Err 461 473 } ··· 506 518 if templ_7745c5c3_Err != nil { 507 519 return templ_7745c5c3_Err 508 520 } 509 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<button type=\"button\" class=\"profile-badge\" title=\"") 521 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<button type=\"button\" class=\"profile-badge\" title=\"") 510 522 if templ_7745c5c3_Err != nil { 511 523 return templ_7745c5c3_Err 512 524 } 513 525 var templ_7745c5c3_Var17 string 514 526 templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue(b.Name) 515 527 if templ_7745c5c3_Err != nil { 516 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 239, Col: 59} 528 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 247, Col: 59} 517 529 } 518 530 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17) 519 531 if templ_7745c5c3_Err != nil { 520 532 return templ_7745c5c3_Err 521 533 } 522 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "\" onclick=\"") 534 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "\" onclick=\"") 523 535 if templ_7745c5c3_Err != nil { 524 536 return templ_7745c5c3_Err 525 537 } ··· 528 540 if templ_7745c5c3_Err != nil { 529 541 return templ_7745c5c3_Err 530 542 } 531 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "\"><div class=\"profile-badge-icon\" style=\"") 543 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\"><div class=\"profile-badge-icon\" style=\"") 532 544 if templ_7745c5c3_Err != nil { 533 545 return templ_7745c5c3_Err 534 546 } 535 547 var templ_7745c5c3_Var19 string 536 548 templ_7745c5c3_Var19, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues("background:" + b.PrimaryColor + ";border-color:" + b.RibbonColor) 537 549 if templ_7745c5c3_Err != nil { 538 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 240, Col: 107} 550 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 248, Col: 107} 539 551 } 540 552 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) 541 553 if templ_7745c5c3_Err != nil { 542 554 return templ_7745c5c3_Err 543 555 } 544 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "\"><span class=\"profile-badge-label\">") 556 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\"><span class=\"profile-badge-label\">") 545 557 if templ_7745c5c3_Err != nil { 546 558 return templ_7745c5c3_Err 547 559 } 548 560 var templ_7745c5c3_Var20 string 549 561 templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label) 550 562 if templ_7745c5c3_Err != nil { 551 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 241, Col: 46} 563 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 249, Col: 46} 552 564 } 553 565 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) 554 566 if templ_7745c5c3_Err != nil { 555 567 return templ_7745c5c3_Err 556 568 } 557 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</span></div><span class=\"profile-badge-name\">") 569 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</span></div><span class=\"profile-badge-name\">") 558 570 if templ_7745c5c3_Err != nil { 559 571 return templ_7745c5c3_Err 560 572 } 561 573 var templ_7745c5c3_Var21 string 562 574 templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(b.Name) 563 575 if templ_7745c5c3_Err != nil { 564 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 243, Col: 43} 576 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/profile/pages/profile.templ`, Line: 251, Col: 43} 565 577 } 566 578 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) 567 579 if templ_7745c5c3_Err != nil { 568 580 return templ_7745c5c3_Err 569 581 } 570 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</span></button>") 582 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</span></button>") 571 583 if templ_7745c5c3_Err != nil { 572 584 return templ_7745c5c3_Err 573 585 }
+6
features/settings/pages/settings.templ
··· 43 43 <div class="window-title">settings</div> 44 44 @layouts.TopNav("settings") 45 45 </div> 46 + if v.IsLocal { 47 + <div class="local-banner" role="status"> 48 + <span class="local-banner-icon">ℹ</span> 49 + <span class="local-banner-text">This account is unclaimed. Link your <a href="https://atmosphereaccount.com" target="_blank" rel="noopener noreferrer">Atmosphere account</a> in <a href="/settings">Settings</a>!</span> 50 + </div> 51 + } 46 52 <div class="window-body"> 47 53 <div class="settings-content"> 48 54 <div class="settings-title">Settings</div>
+70 -60
features/settings/pages/settings_templ.go
··· 82 82 if templ_7745c5c3_Err != nil { 83 83 return templ_7745c5c3_Err 84 84 } 85 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div><div class=\"window-body\"><div class=\"settings-content\"><div class=\"settings-title\">Settings</div><div class=\"settings-sub\">atmo.quest</div>") 85 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div>") 86 + if templ_7745c5c3_Err != nil { 87 + return templ_7745c5c3_Err 88 + } 89 + if v.IsLocal { 90 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"local-banner\" role=\"status\"><span class=\"local-banner-icon\">ℹ</span> <span class=\"local-banner-text\">This account is unclaimed. Link your <a href=\"https://atmosphereaccount.com\" target=\"_blank\" rel=\"noopener noreferrer\">Atmosphere account</a> in <a href=\"/settings\">Settings</a>!</span></div>") 91 + if templ_7745c5c3_Err != nil { 92 + return templ_7745c5c3_Err 93 + } 94 + } 95 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"window-body\"><div class=\"settings-content\"><div class=\"settings-title\">Settings</div><div class=\"settings-sub\">atmo.quest</div>") 86 96 if templ_7745c5c3_Err != nil { 87 97 return templ_7745c5c3_Err 88 98 } 89 99 if v.Deleted { 90 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"settings-success\" role=\"status\"><span class=\"settings-success-icon\">✓</span> your atmo.quest data has been deleted.</div>") 100 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<div class=\"settings-success\" role=\"status\"><span class=\"settings-success-icon\">✓</span> your atmo.quest data has been deleted.</div>") 91 101 if templ_7745c5c3_Err != nil { 92 102 return templ_7745c5c3_Err 93 103 } 94 104 } 95 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"settings-account-card\">") 105 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<div class=\"settings-account-card\">") 96 106 if templ_7745c5c3_Err != nil { 97 107 return templ_7745c5c3_Err 98 108 } 99 109 if v.AvatarURL != "" { 100 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<img class=\"settings-account-avatar-img\" src=\"") 110 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<img class=\"settings-account-avatar-img\" src=\"") 101 111 if templ_7745c5c3_Err != nil { 102 112 return templ_7745c5c3_Err 103 113 } 104 114 var templ_7745c5c3_Var3 string 105 115 templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.AvatarURL) 106 116 if templ_7745c5c3_Err != nil { 107 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 61, Col: 65} 117 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 67, Col: 65} 108 118 } 109 119 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var3) 110 120 if templ_7745c5c3_Err != nil { 111 121 return templ_7745c5c3_Err 112 122 } 113 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" alt=\"") 123 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "\" alt=\"") 114 124 if templ_7745c5c3_Err != nil { 115 125 return templ_7745c5c3_Err 116 126 } 117 127 var templ_7745c5c3_Var4 string 118 128 templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.ResolveAttributeValue(v.DisplayName) 119 129 if templ_7745c5c3_Err != nil { 120 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 61, Col: 87} 130 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 67, Col: 87} 121 131 } 122 132 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var4) 123 133 if templ_7745c5c3_Err != nil { 124 134 return templ_7745c5c3_Err 125 135 } 126 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\" loading=\"lazy\">") 136 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\" loading=\"lazy\">") 127 137 if templ_7745c5c3_Err != nil { 128 138 return templ_7745c5c3_Err 129 139 } 130 140 } else { 131 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<div class=\"settings-account-avatar\">") 141 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<div class=\"settings-account-avatar\">") 132 142 if templ_7745c5c3_Err != nil { 133 143 return templ_7745c5c3_Err 134 144 } 135 145 var templ_7745c5c3_Var5 string 136 146 templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(v.AvatarInitial) 137 147 if templ_7745c5c3_Err != nil { 138 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 63, Col: 61} 148 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 69, Col: 61} 139 149 } 140 150 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) 141 151 if templ_7745c5c3_Err != nil { 142 152 return templ_7745c5c3_Err 143 153 } 144 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</div>") 154 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</div>") 145 155 if templ_7745c5c3_Err != nil { 146 156 return templ_7745c5c3_Err 147 157 } 148 158 } 149 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<div><div class=\"settings-account-name\">") 159 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<div><div class=\"settings-account-name\">") 150 160 if templ_7745c5c3_Err != nil { 151 161 return templ_7745c5c3_Err 152 162 } ··· 154 164 var templ_7745c5c3_Var6 string 155 165 templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(v.DisplayName) 156 166 if templ_7745c5c3_Err != nil { 157 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 68, Col: 24} 167 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 74, Col: 24} 158 168 } 159 169 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) 160 170 if templ_7745c5c3_Err != nil { ··· 164 174 var templ_7745c5c3_Var7 string 165 175 templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(v.Handle) 166 176 if templ_7745c5c3_Err != nil { 167 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 70, Col: 19} 177 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 76, Col: 19} 168 178 } 169 179 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) 170 180 if templ_7745c5c3_Err != nil { 171 181 return templ_7745c5c3_Err 172 182 } 173 183 } 174 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</div>") 184 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</div>") 175 185 if templ_7745c5c3_Err != nil { 176 186 return templ_7745c5c3_Err 177 187 } 178 188 if v.IsLocal { 179 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<div class=\"settings-account-handle\"><span class=\"at\">") 189 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<div class=\"settings-account-handle\"><span class=\"at\">") 180 190 if templ_7745c5c3_Err != nil { 181 191 return templ_7745c5c3_Err 182 192 } 183 193 var templ_7745c5c3_Var8 string 184 194 templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs("local") 185 195 if templ_7745c5c3_Err != nil { 186 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 74, Col: 71} 196 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 80, Col: 71} 187 197 } 188 198 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) 189 199 if templ_7745c5c3_Err != nil { 190 200 return templ_7745c5c3_Err 191 201 } 192 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</span><span class=\"muted\" style=\"font-size:0.75rem\">") 202 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</span><span class=\"muted\" style=\"font-size:0.75rem\">") 193 203 if templ_7745c5c3_Err != nil { 194 204 return templ_7745c5c3_Err 195 205 } 196 206 var templ_7745c5c3_Var9 string 197 207 templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(" — signed in without an Atmosphere account") 198 208 if templ_7745c5c3_Err != nil { 199 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 74, Col: 174} 209 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 80, Col: 174} 200 210 } 201 211 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) 202 212 if templ_7745c5c3_Err != nil { 203 213 return templ_7745c5c3_Err 204 214 } 205 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</span></div>") 215 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</span></div>") 206 216 if templ_7745c5c3_Err != nil { 207 217 return templ_7745c5c3_Err 208 218 } 209 219 } else { 210 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<div class=\"settings-account-handle\"><span class=\"at\">") 220 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<div class=\"settings-account-handle\"><span class=\"at\">") 211 221 if templ_7745c5c3_Err != nil { 212 222 return templ_7745c5c3_Err 213 223 } 214 224 var templ_7745c5c3_Var10 string 215 225 templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("@") 216 226 if templ_7745c5c3_Err != nil { 217 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 76, Col: 67} 227 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 82, Col: 67} 218 228 } 219 229 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) 220 230 if templ_7745c5c3_Err != nil { 221 231 return templ_7745c5c3_Err 222 232 } 223 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</span>") 233 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</span>") 224 234 if templ_7745c5c3_Err != nil { 225 235 return templ_7745c5c3_Err 226 236 } 227 237 var templ_7745c5c3_Var11 string 228 238 templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(v.Handle) 229 239 if templ_7745c5c3_Err != nil { 230 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 76, Col: 86} 240 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 82, Col: 86} 231 241 } 232 242 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) 233 243 if templ_7745c5c3_Err != nil { 234 244 return templ_7745c5c3_Err 235 245 } 236 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</div>") 246 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</div>") 237 247 if templ_7745c5c3_Err != nil { 238 248 return templ_7745c5c3_Err 239 249 } 240 250 if v.PDS != "" { 241 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<div class=\"settings-account-pds\">PDS · <span class=\"pds-name\">") 251 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<div class=\"settings-account-pds\">PDS · <span class=\"pds-name\">") 242 252 if templ_7745c5c3_Err != nil { 243 253 return templ_7745c5c3_Err 244 254 } 245 255 var templ_7745c5c3_Var12 string 246 256 templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(v.PDS) 247 257 if templ_7745c5c3_Err != nil { 248 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 78, Col: 80} 258 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 84, Col: 80} 249 259 } 250 260 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) 251 261 if templ_7745c5c3_Err != nil { 252 262 return templ_7745c5c3_Err 253 263 } 254 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</span></div>") 264 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</span></div>") 255 265 if templ_7745c5c3_Err != nil { 256 266 return templ_7745c5c3_Err 257 267 } 258 268 } 259 269 } 260 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Privacy</div><div class=\"settings-list\"><form method=\"POST\" action=\"/settings/privacy\" class=\"settings-row\" style=\"display:flex;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;padding:0;margin:0;\"><input type=\"hidden\" name=\"field\" value=\"hide_from_attendees\"> ") 270 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "</div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Privacy</div><div class=\"settings-list\"><form method=\"POST\" action=\"/settings/privacy\" class=\"settings-row\" style=\"display:flex;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;padding:0;margin:0;\"><input type=\"hidden\" name=\"field\" value=\"hide_from_attendees\"> ") 261 271 if templ_7745c5c3_Err != nil { 262 272 return templ_7745c5c3_Err 263 273 } 264 274 if v.ShowAttendees { 265 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<input type=\"hidden\" name=\"value\" value=\"1\"> ") 275 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<input type=\"hidden\" name=\"value\" value=\"1\"> ") 266 276 if templ_7745c5c3_Err != nil { 267 277 return templ_7745c5c3_Err 268 278 } 269 279 } else { 270 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<input type=\"hidden\" name=\"value\" value=\"0\"> ") 280 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<input type=\"hidden\" name=\"value\" value=\"0\"> ") 271 281 if templ_7745c5c3_Err != nil { 272 282 return templ_7745c5c3_Err 273 283 } 274 284 } 275 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "<button type=\"submit\" class=\"settings-row\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Show me on event attendee lists</div><div class=\"settings-row-desc\">when off, you can still scan and connect</div></div>") 285 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<button type=\"submit\" class=\"settings-row\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Show me on event attendee lists</div><div class=\"settings-row-desc\">when off, you can still scan and connect</div></div>") 276 286 if templ_7745c5c3_Err != nil { 277 287 return templ_7745c5c3_Err 278 288 } 279 289 if v.ShowAttendees { 280 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<div class=\"toggle on\"></div>") 290 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<div class=\"toggle on\"></div>") 281 291 if templ_7745c5c3_Err != nil { 282 292 return templ_7745c5c3_Err 283 293 } 284 294 } else { 285 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<div class=\"toggle off\"></div>") 295 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<div class=\"toggle off\"></div>") 286 296 if templ_7745c5c3_Err != nil { 287 297 return templ_7745c5c3_Err 288 298 } 289 299 } 290 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</button></form><form method=\"POST\" action=\"/settings/privacy\" class=\"settings-row\" style=\"display:flex;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;padding:0;margin:0;\"><input type=\"hidden\" name=\"field\" value=\"hide_from_leaderboard\"> ") 300 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</button></form><form method=\"POST\" action=\"/settings/privacy\" class=\"settings-row\" style=\"display:flex;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;padding:0;margin:0;\"><input type=\"hidden\" name=\"field\" value=\"hide_from_leaderboard\"> ") 291 301 if templ_7745c5c3_Err != nil { 292 302 return templ_7745c5c3_Err 293 303 } 294 304 if v.ShowLeaderboard { 295 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<input type=\"hidden\" name=\"value\" value=\"1\"> ") 305 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<input type=\"hidden\" name=\"value\" value=\"1\"> ") 296 306 if templ_7745c5c3_Err != nil { 297 307 return templ_7745c5c3_Err 298 308 } 299 309 } else { 300 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<input type=\"hidden\" name=\"value\" value=\"0\"> ") 310 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<input type=\"hidden\" name=\"value\" value=\"0\"> ") 301 311 if templ_7745c5c3_Err != nil { 302 312 return templ_7745c5c3_Err 303 313 } 304 314 } 305 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<button type=\"submit\" class=\"settings-row\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Appear on the leaderboard</div><div class=\"settings-row-desc\">opt out anytime</div></div>") 315 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<button type=\"submit\" class=\"settings-row\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Appear on the leaderboard</div><div class=\"settings-row-desc\">opt out anytime</div></div>") 306 316 if templ_7745c5c3_Err != nil { 307 317 return templ_7745c5c3_Err 308 318 } 309 319 if v.ShowLeaderboard { 310 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<div class=\"toggle on\"></div>") 320 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<div class=\"toggle on\"></div>") 311 321 if templ_7745c5c3_Err != nil { 312 322 return templ_7745c5c3_Err 313 323 } 314 324 } else { 315 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<div class=\"toggle off\"></div>") 325 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<div class=\"toggle off\"></div>") 316 326 if templ_7745c5c3_Err != nil { 317 327 return templ_7745c5c3_Err 318 328 } 319 329 } 320 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</button></form></div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Your data</div><div class=\"settings-list\"><a href=\"/settings/export\" class=\"settings-row\" download><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Export connections & notes</div><div class=\"settings-row-desc\">download a CSV summary</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> <a href=\"/settings/notes\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Local notes</div><div class=\"settings-row-desc\">stored in the app's database (private)</div></div><div class=\"settings-row-value\">") 330 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</button></form></div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Your data</div><div class=\"settings-list\"><a href=\"/settings/export\" class=\"settings-row\" download><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Export connections & notes</div><div class=\"settings-row-desc\">download a CSV summary</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> <a href=\"/settings/notes\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Local notes</div><div class=\"settings-row-desc\">stored in the app's database (private)</div></div><div class=\"settings-row-value\">") 321 331 if templ_7745c5c3_Err != nil { 322 332 return templ_7745c5c3_Err 323 333 } 324 334 var templ_7745c5c3_Var13 string 325 335 templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(settingsItoa(v.NoteCount)) 326 336 if templ_7745c5c3_Err != nil { 327 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 149, Col: 67} 337 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 155, Col: 67} 328 338 } 329 339 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) 330 340 if templ_7745c5c3_Err != nil { 331 341 return templ_7745c5c3_Err 332 342 } 333 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " notes <span class=\"arrow\">›</span></div></a> ") 343 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, " notes <span class=\"arrow\">›</span></div></a> ") 334 344 if templ_7745c5c3_Err != nil { 335 345 return templ_7745c5c3_Err 336 346 } 337 347 if !v.IsLocal { 338 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<a href=\"/settings/pds\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">PDS data</div><div class=\"settings-row-desc\">stored in your ATProto PDS</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> ") 348 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<a href=\"/settings/pds\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">PDS data</div><div class=\"settings-row-desc\">stored in your ATProto PDS</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> ") 339 349 if templ_7745c5c3_Err != nil { 340 350 return templ_7745c5c3_Err 341 351 } 342 352 } 343 353 if v.IsLocal { 344 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<a href=\"/auth/link\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Link to Atmosphere account</div><div class=\"settings-row-desc\">migrate your data to an ATProto account</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a>") 354 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<a href=\"/auth/link\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Link to Atmosphere account</div><div class=\"settings-row-desc\">migrate your data to an ATProto account</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a>") 345 355 if templ_7745c5c3_Err != nil { 346 356 return templ_7745c5c3_Err 347 357 } 348 358 } 349 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</div></div><div class=\"settings-group\"><div class=\"settings-group-label\">About</div><div class=\"settings-list\"><a href=\"/about-atproto\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">What's ATProto?</div><div class=\"settings-row-desc\">the protocol atmo.quest is built on</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> <a href=\"https://tangled.org/vvill.dev/atmoquest\" class=\"settings-row\" target=\"_blank\" rel=\"noopener noreferrer\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Open source</div><div class=\"settings-row-desc\">contribute, file issues, fork</div></div><div class=\"settings-row-value\"><span class=\"arrow\">↗</span></div></a> <a href=\"https://tangled.org/vvill.dev/atmoquest/issues\" class=\"settings-row\" target=\"_blank\" rel=\"noopener noreferrer\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Send feedback</div><div class=\"settings-row-desc\">tell us what's broken or missing</div></div><div class=\"settings-row-value\"><span class=\"arrow\">↗</span></div></a></div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Danger zone</div><div class=\"settings-list\">") 359 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</div></div><div class=\"settings-group\"><div class=\"settings-group-label\">About</div><div class=\"settings-list\"><a href=\"/about-atproto\" class=\"settings-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">What's ATProto?</div><div class=\"settings-row-desc\">the protocol atmo.quest is built on</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a> <a href=\"https://tangled.org/vvill.dev/atmoquest\" class=\"settings-row\" target=\"_blank\" rel=\"noopener noreferrer\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Open source</div><div class=\"settings-row-desc\">contribute, file issues, fork</div></div><div class=\"settings-row-value\"><span class=\"arrow\">↗</span></div></a> <a href=\"https://tangled.org/vvill.dev/atmoquest/issues\" class=\"settings-row\" target=\"_blank\" rel=\"noopener noreferrer\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Send feedback</div><div class=\"settings-row-desc\">tell us what's broken or missing</div></div><div class=\"settings-row-value\"><span class=\"arrow\">↗</span></div></a></div></div><div class=\"settings-group\"><div class=\"settings-group-label\">Danger zone</div><div class=\"settings-list\">") 350 360 if templ_7745c5c3_Err != nil { 351 361 return templ_7745c5c3_Err 352 362 } 353 363 if v.IsLocal { 354 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<form method=\"POST\" action=\"/auth/local/logout\" style=\"display:contents\"><button type=\"submit\" class=\"settings-row danger\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Sign out</div><div class=\"settings-row-desc\">you can recover your account on next sign-in</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></button></form>") 364 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<form method=\"POST\" action=\"/auth/local/logout\" style=\"display:contents\"><button type=\"submit\" class=\"settings-row danger\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Sign out</div><div class=\"settings-row-desc\">you can recover your account on next sign-in</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></button></form>") 355 365 if templ_7745c5c3_Err != nil { 356 366 return templ_7745c5c3_Err 357 367 } 358 368 } else { 359 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<form method=\"POST\" action=\"/oauth/logout\" style=\"display:contents\"><button type=\"submit\" class=\"settings-row danger\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Sign out</div><div class=\"settings-row-desc\">your records stay in your PDS</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></button></form>") 369 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<form method=\"POST\" action=\"/oauth/logout\" style=\"display:contents\"><button type=\"submit\" class=\"settings-row danger\" style=\"width:100%;text-align:left;background:none;border:none;font-family:inherit;cursor:pointer;color:inherit;\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Sign out</div><div class=\"settings-row-desc\">your records stay in your PDS</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></button></form>") 360 370 if templ_7745c5c3_Err != nil { 361 371 return templ_7745c5c3_Err 362 372 } ··· 365 375 if templ_7745c5c3_Err != nil { 366 376 return templ_7745c5c3_Err 367 377 } 368 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</div></div>") 378 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</div></div>") 369 379 if templ_7745c5c3_Err != nil { 370 380 return templ_7745c5c3_Err 371 381 } 372 382 if v.IsAdmin { 373 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<div class=\"settings-group\"><div class=\"settings-group-label\">Admin</div><div class=\"settings-list\"><a href=\"/admin\" class=\"settings-row\"><div class=\"settings-row-icon\">⚙</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Admin console</div><div class=\"settings-row-desc\">manage events and users</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a></div></div>") 383 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<div class=\"settings-group\"><div class=\"settings-group-label\">Admin</div><div class=\"settings-list\"><a href=\"/admin\" class=\"settings-row\"><div class=\"settings-row-icon\">⚙</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Admin console</div><div class=\"settings-row-desc\">manage events and users</div></div><div class=\"settings-row-value\"><span class=\"arrow\">›</span></div></a></div></div>") 374 384 if templ_7745c5c3_Err != nil { 375 385 return templ_7745c5c3_Err 376 386 } 377 387 } 378 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<div class=\"settings-footer\">built on <a href=\"https://atproto.com\" target=\"_blank\" rel=\"noopener noreferrer\">ATProto</a> · open source · made for connecting<div class=\"version\">atmo.quest</div></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 388 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<div class=\"settings-footer\">built on <a href=\"https://atproto.com\" target=\"_blank\" rel=\"noopener noreferrer\">ATProto</a> · open source · made for connecting<div class=\"version\">atmo.quest</div></div></div></div><div class=\"statusbar\"><a href=\"/\" class=\"statusbar-brand\">atmo.quest</a></div></div><footer><a href=\"https://tangled.org/vvill.dev/atmoquest\" rel=\"noopener noreferrer\" target=\"_blank\">source on tangled</a></footer>") 379 389 if templ_7745c5c3_Err != nil { 380 390 return templ_7745c5c3_Err 381 391 } ··· 414 424 templ_7745c5c3_Var14 = templ.NopComponent 415 425 } 416 426 ctx = templ.ClearChildren(ctx) 417 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<div class=\"settings-row danger\" id=\"delete-data-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Delete atmo.quest data</div><div class=\"settings-row-desc\">removes local notes and flags</div>") 427 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<div class=\"settings-row danger\" id=\"delete-data-row\"><div class=\"settings-row-icon\">◆</div><div class=\"settings-row-body\"><div class=\"settings-row-title\">Delete atmo.quest data</div><div class=\"settings-row-desc\">removes local notes and flags</div>") 418 428 if templ_7745c5c3_Err != nil { 419 429 return templ_7745c5c3_Err 420 430 } 421 431 if v.DeleteError != "" { 422 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<div class=\"settings-error\" role=\"alert\" style=\"margin-top:8px;\">") 432 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<div class=\"settings-error\" role=\"alert\" style=\"margin-top:8px;\">") 423 433 if templ_7745c5c3_Err != nil { 424 434 return templ_7745c5c3_Err 425 435 } 426 436 var templ_7745c5c3_Var15 string 427 437 templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(v.DeleteError) 428 438 if templ_7745c5c3_Err != nil { 429 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 278, Col: 20} 439 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 284, Col: 20} 430 440 } 431 441 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) 432 442 if templ_7745c5c3_Err != nil { 433 443 return templ_7745c5c3_Err 434 444 } 435 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</div>") 445 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</div>") 436 446 if templ_7745c5c3_Err != nil { 437 447 return templ_7745c5c3_Err 438 448 } 439 449 } 440 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<div class=\"settings-delete-confirm\" id=\"delete-confirm\" style=\"") 450 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<div class=\"settings-delete-confirm\" id=\"delete-confirm\" style=\"") 441 451 if templ_7745c5c3_Err != nil { 442 452 return templ_7745c5c3_Err 443 453 } 444 454 var templ_7745c5c3_Var16 string 445 455 templ_7745c5c3_Var16, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(deleteConfirmStyle(v.DeleteError)) 446 456 if templ_7745c5c3_Err != nil { 447 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 281, Col: 101} 457 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 287, Col: 101} 448 458 } 449 459 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) 450 460 if templ_7745c5c3_Err != nil { 451 461 return templ_7745c5c3_Err 452 462 } 453 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\"><form method=\"POST\" action=\"/settings/delete\" class=\"settings-delete-form\"><label class=\"pv-followup-toggle\" style=\"margin-bottom:8px;display:flex;align-items:center;gap:8px;cursor:pointer;\"><input type=\"checkbox\" name=\"purge_pds\" value=\"1\"> <span class=\"settings-row-desc\" style=\"margin:0;\">also delete all quest.atmo.* records from my PDS</span></label><div style=\"display:flex;gap:8px;align-items:center;\"><input type=\"text\" name=\"confirm_handle\" placeholder=\"") 463 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\"><form method=\"POST\" action=\"/settings/delete\" class=\"settings-delete-form\"><label class=\"pv-followup-toggle\" style=\"margin-bottom:8px;display:flex;align-items:center;gap:8px;cursor:pointer;\"><input type=\"checkbox\" name=\"purge_pds\" value=\"1\"> <span class=\"settings-row-desc\" style=\"margin:0;\">also delete all quest.atmo.* records from my PDS</span></label><div style=\"display:flex;gap:8px;align-items:center;\"><input type=\"text\" name=\"confirm_handle\" placeholder=\"") 454 464 if templ_7745c5c3_Err != nil { 455 465 return templ_7745c5c3_Err 456 466 } 457 467 var templ_7745c5c3_Var17 string 458 468 templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.ResolveAttributeValue("type " + v.Handle + " to confirm") 459 469 if templ_7745c5c3_Err != nil { 460 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 291, Col: 55} 470 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `features/settings/pages/settings.templ`, Line: 297, Col: 55} 461 471 } 462 472 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var17) 463 473 if templ_7745c5c3_Err != nil { 464 474 return templ_7745c5c3_Err 465 475 } 466 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\" class=\"settings-confirm-input\" autocomplete=\"off\" required aria-label=\"Type your handle to confirm deletion\"> <button type=\"submit\" class=\"btn btn-danger btn-sm\">confirm</button> <button type=\"button\" class=\"btn btn-ghost btn-sm\" onclick=\"document.getElementById('delete-confirm').style.display='none'\">cancel</button></div></form></div></div><div class=\"settings-row-value\"><button type=\"button\" class=\"btn btn-danger btn-sm\" onclick=\"document.getElementById('delete-confirm').style.display='block'\">delete</button></div></div>") 476 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\" class=\"settings-confirm-input\" autocomplete=\"off\" required aria-label=\"Type your handle to confirm deletion\"> <button type=\"submit\" class=\"btn btn-danger btn-sm\">confirm</button> <button type=\"button\" class=\"btn btn-ghost btn-sm\" onclick=\"document.getElementById('delete-confirm').style.display='none'\">cancel</button></div></form></div></div><div class=\"settings-row-value\"><button type=\"button\" class=\"btn btn-danger btn-sm\" onclick=\"document.getElementById('delete-confirm').style.display='block'\">delete</button></div></div>") 467 477 if templ_7745c5c3_Err != nil { 468 478 return templ_7745c5c3_Err 469 479 }
+31
web/resources/static/css/terminal.css
··· 509 509 padding: 0; 510 510 } 511 511 512 + /* local-account banner — orange accent bar below window-bar */ 513 + .local-banner { 514 + display: flex; 515 + align-items: center; 516 + padding: 8px 14px; 517 + background: var(--peach); 518 + color: var(--base); 519 + font-size: 12px; 520 + width: 100%; 521 + justify-content: center; 522 + } 523 + .local-banner a, 524 + .local-banner a:visited { 525 + color: var(--base); 526 + text-decoration: none; 527 + display: inline-flex; 528 + align-items: center; 529 + gap: 8px; 530 + } 531 + .local-banner a:hover { 532 + text-decoration: underline; 533 + } 534 + .local-banner-icon { 535 + font-weight: 700; 536 + font-size: 14px; 537 + margin-right: 8px; 538 + border: 1px solid var(--base); 539 + border-radius: 100%; 540 + padding: 0px 4px; 541 + } 542 + 512 543 /* avatar flip card */ 513 544 .profile-flip { 514 545 perspective: 1000px;