···
.hidden { display: none; }
.loading { color: rgba(255, 255, 255, 0.5); font-size: 0.9rem; }
174
+
font-family: inherit;
176
+
padding: 0.75rem 2rem;
178
+
background: transparent;
179
+
border: 1px solid rgba(255, 255, 255, 0.15);
180
+
border-radius: 4px;
181
+
color: rgba(255, 255, 255, 0.6);
182
+
transition: all 0.2s;
184
+
margin-top: 0.75rem;
188
+
background: rgba(10, 10, 15, 0.5);
189
+
border-color: rgba(255, 255, 255, 0.3);
190
+
color: rgba(255, 255, 255, 0.8);
195
+
align-items: center;
197
+
margin: 1.5rem 0 1rem;
198
+
color: rgba(255, 255, 255, 0.3);
207
+
background: rgba(255, 255, 255, 0.1);
211
+
margin-top: 1.5rem;
212
+
color: rgba(255, 255, 255, 0.5);
213
+
font-size: 0.75rem;
218
+
transition: color 0.2s;
219
+
text-decoration: underline;
220
+
text-underline-offset: 2px;
223
+
.info-toggle:hover {
224
+
color: rgba(255, 255, 255, 0.8);
230
+
transition: max-height 0.3s ease;
234
+
.info-content.expanded {
239
+
background: rgba(10, 10, 15, 0.6);
240
+
border: 1px solid rgba(255, 255, 255, 0.1);
241
+
border-radius: 4px;
247
+
font-size: 0.85rem;
249
+
margin-bottom: 0.75rem;
250
+
color: rgba(255, 255, 255, 0.9);
256
+
color: rgba(255, 255, 255, 0.6);
257
+
margin-bottom: 1rem;
260
+
.info-section p:last-child {
264
+
.info-section strong {
265
+
color: rgba(255, 255, 255, 0.85);
269
+
color: rgba(255, 255, 255, 0.8);
270
+
text-decoration: underline;
271
+
text-underline-offset: 2px;
274
+
.info-section a:hover {
275
+
color: rgba(255, 255, 255, 1);
···
<div class="subtitle">explore the atmosphere</div>
<input type="text" name="handle" placeholder="handle.bsky.social" required autofocus>
<button type="submit">enter</button>
311
+
<div class="divider">or</div>
312
+
<button type="button" class="demo-btn" id="demoBtn">explore demo</button>
314
+
<button type="button" class="info-toggle" id="infoToggle">what is this?</button>
316
+
<div class="info-content" id="infoContent">
317
+
<div class="info-section">
318
+
<h3>visualize your atproto identity</h3>
319
+
<p>see all the apps writing to your <strong>Personal Data Server</strong> and explore the records they've created. your content, your server, your control.</p>
321
+
<h3>the problem with silos</h3>
322
+
<p>traditional social platforms lock your content in. switching means starting over, losing your network and history. you build their platform, they control everything.</p>
324
+
<h3>the atproto solution</h3>
325
+
<p>on <a href="https://atproto.com" target="_blank" rel="noopener noreferrer">atproto</a>, you own your data. it lives on <strong>your</strong> server. apps like bluesky, whitewind, and frontpage just read and write to your space. switch apps anytime, take everything with you.</p>
327
+
<h3>see it yourself</h3>
328
+
<p>this isn't just theory. click "explore demo" to see a real atproto account, or log in to visualize your own identity.</p>
···
219
-
pub fn app_page(did: &str) -> String {
345
+
pub fn app_page(did: &str, demo_mode: bool, demo_handle: Option<&str>) -> String {
346
+
let demo_banner = if demo_mode && demo_handle.is_some() {
348
+
<div class="demo-banner" id="demoBanner">
349
+
<span>demo mode - viewing <strong>{}</strong></span>
350
+
<a href="/demo/exit" class="demo-exit">exit demo</a>
351
+
</div>"#, demo_handle.unwrap())
···
1449
+
background: rgba(255, 165, 0, 0.15);
1450
+
border-bottom: 1px solid rgba(255, 165, 0, 0.3);
1451
+
padding: 0.5rem 1rem;
1453
+
align-items: center;
1454
+
justify-content: center;
1457
+
font-size: 0.7rem;
1458
+
color: var(--text);
1461
+
.demo-banner strong {{
1462
+
color: var(--text);
1467
+
color: var(--text-light);
1468
+
text-decoration: none;
1469
+
border: 1px solid var(--border);
1470
+
padding: 0.25rem 0.75rem;
1471
+
border-radius: 2px;
1472
+
transition: all 0.2s ease;
1473
+
font-size: 0.65rem;
1476
+
.demo-exit:hover {{
1477
+
background: var(--surface);
1478
+
border-color: var(--text-light);
1479
+
color: var(--text);
1482
+
@media (prefers-color-scheme: dark) {{
1484
+
background: rgba(255, 165, 0, 0.1);
1485
+
border-bottom-color: rgba(255, 165, 0, 0.25);
1489
+
/* Adjust elements when demo banner is present */
1490
+
.demo-banner ~ .info {{
1491
+
top: calc(clamp(1rem, 2vmin, 1.5rem) + 2.5rem);
1494
+
.demo-banner ~ .watch-live-btn {{
1495
+
top: calc(clamp(1rem, 2vmin, 1.5rem) + 2.5rem);
1498
+
.demo-banner ~ .logout {{
1499
+
top: calc(clamp(1rem, 2vmin, 1.5rem) + 2.5rem);
1502
+
@media (max-width: 768px) {{
1503
+
.demo-banner ~ .watch-live-btn {{
1504
+
top: calc(clamp(4rem, 8vmin, 5rem) + 2.5rem);
<div class="info" id="infoBtn">?</div>
<button class="watch-live-btn" id="watchLiveBtn">
<span class="watch-indicator"></span>
···
<script src="/static/onboarding.js"></script>
1560
+
"#, demo_banner, did)