Files
SocialPub/PrivaPub/Web/Pages/Shared/_Layout.cshtml
T
thepraandClaude Opus 5.5 9ec1f9930b Profile and post pages, NodeInfo 2.1, and FEDERATION.md
/@user and /@user/{id} are Razor pages showing an avatar's or community's
public and unlisted posts: no scripts, a strict CSP, no-referrer, noindex,
and an alternate link to the ActivityPub document. A client asking them
for activity+json is redirected to the actor or note, and the actor and
note redirect browsers here.

NodeInfo answers 2.1 as well as 2.0 (repository, homepage, a link to
FEDERATION.md) and counts only public local posts.

FEDERATION.md (FEP-67ff) lists the protocols, FEPs, route names,
activities and the security rules a peer will notice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
2026-10-01 11:23:03 +02:00

39 lines
1.5 KiB
Plaintext

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, noarchive, nofollow">
<title>@ViewData["Title"]</title>
@if (ViewData["Alternate"] is string alternate)
{
<link rel="alternate" type="application/activity+json" href="@alternate">
}
<style>
:root { --bg: #fafaf8; --fg: #1d1d1b; --muted: #6b6b66; --line: #deded8; --accent: #6b3fa0; }
@@media (prefers-color-scheme: dark) { :root { --bg: #17161a; --fg: #ecebe6; --muted: #9a99a2; --line: #2e2c33; --accent: #b794e6; } }
body { margin: 0; background: var(--bg); color: var(--fg); font: 16px/1.5 system-ui, sans-serif; }
main { max-width: 640px; margin: 0 auto; padding: 24px 16px; }
a { color: var(--accent); }
header h1 { margin: 0; font-size: 1.5rem; }
.handle, .meta { color: var(--muted); font-size: .9rem; }
.bio { margin: 12px 0; }
dl.fields { display: grid; grid-template-columns: max-content 1fr; gap: 4px 12px; margin: 12px 0; }
dl.fields dt { color: var(--muted); }
dl.fields dd { margin: 0; overflow-wrap: anywhere; }
article { border-top: 1px solid var(--line); padding: 16px 0; overflow-wrap: anywhere; }
article h2 { font-size: 1.1rem; margin: 0 0 8px; }
.invisible { display: none; }
.ellipsis::after { content: "…"; }
summary { cursor: pointer; }
footer { color: var(--muted); font-size: .8rem; margin-top: 32px; }
</style>
</head>
<body>
<main>
@RenderBody()
<footer>PrivaPub</footer>
</main>
</body>
</html>