aboutsummaryrefslogtreecommitdiffstats
path: root/internal/web/templates
diff options
context:
space:
mode:
authorgrm <grm@eyesin.space>2026-09-12 12:21:10 +0300
committergrm <grm@eyesin.space>2026-09-12 12:21:10 +0300
commit336199c65d910bbd45a9c5dcbc3beae214d75b98 (patch)
tree914b9259f96f21939305f9b4990b725cea72ca47 /internal/web/templates
parente0768c2aacd72bd4e62d0847dc2231644664d08d (diff)
downloadblogspace-336199c65d910bbd45a9c5dcbc3beae214d75b98.tar.gz
blogspace-336199c65d910bbd45a9c5dcbc3beae214d75b98.tar.bz2
blogspace-336199c65d910bbd45a9c5dcbc3beae214d75b98.zip
Redesign the dashboard: paper & ink
Flat colours, 2px rules, hard offset shadows and square corners; mono headings and labels; the blog nav is a tab strip that scrolls sideways on phones instead of stacking; list pages get a page header with the primary action on the right; the Markdown cheat-sheet collapses into a details element so forms stay calm. Plain CSS only, no variables or flex, so it still renders on old browsers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sd8UPWrvyYCLj97JexNw3A
Diffstat (limited to 'internal/web/templates')
-rw-r--r--internal/web/templates/admin/delete_user.html4
-rw-r--r--internal/web/templates/admin/index.html5
-rw-r--r--internal/web/templates/admin/new_user.html4
-rw-r--r--internal/web/templates/auth/login.html5
-rw-r--r--internal/web/templates/dashboard/confirm.html4
-rw-r--r--internal/web/templates/dashboard/design.html2
-rw-r--r--internal/web/templates/dashboard/images.html8
-rw-r--r--internal/web/templates/dashboard/page_form.html2
-rw-r--r--internal/web/templates/dashboard/pages.html7
-rw-r--r--internal/web/templates/dashboard/password.html2
-rw-r--r--internal/web/templates/dashboard/post_form.html2
-rw-r--r--internal/web/templates/dashboard/posts.html5
-rw-r--r--internal/web/templates/dashboard/settings.html2
-rw-r--r--internal/web/templates/partials/mdhelp.html10
14 files changed, 37 insertions, 25 deletions
diff --git a/internal/web/templates/admin/delete_user.html b/internal/web/templates/admin/delete_user.html
index 34d3fb9..e673b64 100644
--- a/internal/web/templates/admin/delete_user.html
+++ b/internal/web/templates/admin/delete_user.html
@@ -5,8 +5,8 @@
<p>This permanently deletes the user <strong>{{.Data.target.Username}}</strong>, their blog, and every page, post and image in it.</p>
<form method="post" action="/admin/users/{{.Data.target.ID}}/delete">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
- <button type="submit" class="danger">Yes, delete everything</button>
- <a class="btn secondary" href="/admin/">Cancel</a>
+ <p class="actionrow"><button type="submit" class="danger">Yes, delete everything</button>
+ <a class="btn secondary" href="/admin/">Cancel</a></p>
</form>
</div>
{{end}}
diff --git a/internal/web/templates/admin/index.html b/internal/web/templates/admin/index.html
index bea9266..ecb0112 100644
--- a/internal/web/templates/admin/index.html
+++ b/internal/web/templates/admin/index.html
@@ -1,6 +1,9 @@
{{define "title"}}Admin · Blogspace{{end}}
{{define "content"}}
-<h1>Users &amp; blogs <a class="btn small" href="/admin/users/new">+ New blogger</a></h1>
+<div class="pagehead">
+ <h1>Users &amp; blogs</h1>
+ <div class="actions"><a class="btn" href="/admin/users/new">+ New blogger</a></div>
+</div>
<div class="card">
<table>
<tr><th>User</th><th>Role</th><th>Blog</th><th>Since</th><th>Actions</th></tr>
diff --git a/internal/web/templates/admin/new_user.html b/internal/web/templates/admin/new_user.html
index 87d1186..3d93dbd 100644
--- a/internal/web/templates/admin/new_user.html
+++ b/internal/web/templates/admin/new_user.html
@@ -7,9 +7,9 @@
<label>Username<br><input name="username" value="{{.Data.username}}" required pattern="[a-zA-Z0-9_.-]{2,40}" autofocus></label>
<label>Password <span class="muted">(min 8 characters; they can change it later)</span><br><input type="password" name="password" required minlength="8"></label>
<label>Subdomain <span class="muted">(defaults to the username)</span><br>
- <span class="nowrap"><input name="subdomain" value="{{.Data.subdomain}}" pattern="[a-z0-9]([a-z0-9-]*[a-z0-9])?" maxlength="63" size="14">.{{.Data.cfg.BaseDomain}}</span></label>
+ <span class="nowrap"><input name="subdomain" value="{{.Data.subdomain}}" pattern="[a-z0-9]([a-z0-9-]*[a-z0-9])?" maxlength="63" size="14" style="width:auto">.{{.Data.cfg.BaseDomain}}</span></label>
<label>Blog title<br><input name="title" value="{{.Data.title}}" maxlength="120"></label>
- <button type="submit">Create</button> <a href="/admin/">Cancel</a>
+ <p class="actionrow"><button type="submit">Create</button> <a href="/admin/">Cancel</a></p>
</form>
</div>
{{end}}
diff --git a/internal/web/templates/auth/login.html b/internal/web/templates/auth/login.html
index 2aec3b1..3f66f3f 100644
--- a/internal/web/templates/auth/login.html
+++ b/internal/web/templates/auth/login.html
@@ -1,12 +1,13 @@
{{define "title"}}Log in · Blogspace{{end}}
{{define "content"}}
-<div class="card narrow">
+<p class="login-brand">Blogspace</p>
+<div class="card narrow center">
<h1>Log in</h1>
<form method="post" action="/webadmin">
<input type="hidden" name="next" value="{{.Data.next}}">
<label>Username<br><input name="username" value="{{.Data.username}}" required autofocus autocomplete="username"></label>
<label>Password<br><input type="password" name="password" required autocomplete="current-password"></label>
- <button type="submit">Log in</button>
+ <p class="actionrow"><button type="submit">Log in</button></p>
</form>
</div>
{{end}}
diff --git a/internal/web/templates/dashboard/confirm.html b/internal/web/templates/dashboard/confirm.html
index eefa1da..8dd0b3a 100644
--- a/internal/web/templates/dashboard/confirm.html
+++ b/internal/web/templates/dashboard/confirm.html
@@ -9,8 +9,8 @@
<p>You are about to permanently delete {{.Data.what}}. This cannot be undone.</p>
<form method="post" action="{{.Data.action}}">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
- <button type="submit" class="danger">Yes, delete</button>
- <a class="btn secondary" href="{{.Data.back}}">Cancel</a>
+ <p class="actionrow"><button type="submit" class="danger">Yes, delete</button>
+ <a class="btn secondary" href="{{.Data.back}}">Cancel</a></p>
</form>
{{end}}
</div>
diff --git a/internal/web/templates/dashboard/design.html b/internal/web/templates/dashboard/design.html
index 27ce3c7..09ea1fe 100644
--- a/internal/web/templates/dashboard/design.html
+++ b/internal/web/templates/dashboard/design.html
@@ -82,6 +82,6 @@
</div>
</div>
-<p><button type="submit">Save design</button></p>
+<p class="actionrow"><button type="submit">Save design</button></p>
</form>
{{end}}
diff --git a/internal/web/templates/dashboard/images.html b/internal/web/templates/dashboard/images.html
index 5383e73..b44289e 100644
--- a/internal/web/templates/dashboard/images.html
+++ b/internal/web/templates/dashboard/images.html
@@ -1,14 +1,16 @@
{{define "title"}}Images · {{.Blog.Title}}{{end}}
{{define "content"}}
-<h1>Images</h1>
+<div class="pagehead">
+ <h1>Images</h1>
+ <p class="lead muted">Images are stored with your blog. Put one in a post with <em>Insert image</em> in the editor, or copy its line from below.</p>
+</div>
<div class="card">
<form method="post" action="/b/{{.Blog.Subdomain}}/images/upload" enctype="multipart/form-data">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
<label>Upload an image <span class="muted">(PNG, JPEG, GIF or WebP)</span><br><input type="file" name="file" accept="image/*" required></label>
- <button type="submit">Upload</button>
+ <p class="actionrow"><button type="submit">Upload</button></p>
</form>
</div>
-<p class="muted">To put an image in a post, copy its Markdown line into the post text.</p>
<div class="gallery">
{{range .Data.images}}
<div class="card thumb">
diff --git a/internal/web/templates/dashboard/page_form.html b/internal/web/templates/dashboard/page_form.html
index df94c7e..38aac71 100644
--- a/internal/web/templates/dashboard/page_form.html
+++ b/internal/web/templates/dashboard/page_form.html
@@ -10,7 +10,7 @@
<label>Intro text <span class="muted">(Markdown, shown above the posts; optional)</span><br>
<textarea name="intro" rows="8">{{.Data.page.IntroMD}}</textarea></label>
<label class="check"><input type="checkbox" name="show_in_nav"{{if .Data.page.ShowInNav}} checked{{end}}> Show in menu</label>
- <p>
+ <p class="actionrow">
<button type="submit">Save</button>
{{if .Data.page.ID}}<a class="btn secondary" href="{{.BlogURL}}{{if .Data.page.IsHome}}/{{else}}/{{.Data.page.Slug}}{{end}}" target="_blank">View page &#8599;</a>{{end}}
<a href="/b/{{.Blog.Subdomain}}/pages">Back to pages</a>
diff --git a/internal/web/templates/dashboard/pages.html b/internal/web/templates/dashboard/pages.html
index 6703e7f..5e9aca5 100644
--- a/internal/web/templates/dashboard/pages.html
+++ b/internal/web/templates/dashboard/pages.html
@@ -1,7 +1,10 @@
{{define "title"}}Pages · {{.Blog.Title}}{{end}}
{{define "content"}}
-<h1>Pages <a class="btn small" href="/b/{{.Blog.Subdomain}}/pages/new">+ New page</a></h1>
-<p class="muted">Pages appear in your blog's menu in this order. Each page holds its own list of posts.</p>
+<div class="pagehead">
+ <h1>Pages</h1>
+ <div class="actions"><a class="btn" href="/b/{{.Blog.Subdomain}}/pages/new">+ New page</a></div>
+ <p class="lead muted">Pages appear in your blog's menu in this order. Each page holds its own list of posts.</p>
+</div>
<div class="card">
<table>
<tr><th>Menu order</th><th>Title</th><th>Address</th><th>Posts</th><th></th></tr>
diff --git a/internal/web/templates/dashboard/password.html b/internal/web/templates/dashboard/password.html
index f333bd7..3e28744 100644
--- a/internal/web/templates/dashboard/password.html
+++ b/internal/web/templates/dashboard/password.html
@@ -7,7 +7,7 @@
<label>Current password<br><input type="password" name="current" required autocomplete="current-password"></label>
<label>New password<br><input type="password" name="password" required minlength="8" autocomplete="new-password"></label>
<label>Repeat new password<br><input type="password" name="password2" required minlength="8" autocomplete="new-password"></label>
- <button type="submit">Change password</button>
+ <p class="actionrow"><button type="submit">Change password</button></p>
</form>
</div>
{{end}}
diff --git a/internal/web/templates/dashboard/post_form.html b/internal/web/templates/dashboard/post_form.html
index 520b9e6..7e6f00f 100644
--- a/internal/web/templates/dashboard/post_form.html
+++ b/internal/web/templates/dashboard/post_form.html
@@ -15,7 +15,7 @@
<label>Content <span class="muted">(Markdown)</span><br>
<textarea name="body" rows="24" class="editor">{{.Data.post.BodyMD}}</textarea></label>
<label class="check"><input type="checkbox" name="published"{{if .Data.post.Published}} checked{{end}}> Visible on the blog</label>
- <p>
+ <p class="actionrow">
<button type="submit">Save</button>
{{if .Data.post.ID}}<a class="btn secondary" href="{{.BlogURL}}/{{.Data.post.PageSlug}}/{{.Data.post.Slug}}" target="_blank">View post &#8599;</a>{{end}}
<a href="/b/{{.Blog.Subdomain}}/posts">Back to posts</a>
diff --git a/internal/web/templates/dashboard/posts.html b/internal/web/templates/dashboard/posts.html
index 24e86bb..c0b7112 100644
--- a/internal/web/templates/dashboard/posts.html
+++ b/internal/web/templates/dashboard/posts.html
@@ -1,6 +1,9 @@
{{define "title"}}Posts · {{.Blog.Title}}{{end}}
{{define "content"}}
-<h1>Posts <a class="btn small" href="/b/{{.Blog.Subdomain}}/posts/new{{if .Data.pageID}}?page={{.Data.pageID}}{{end}}">+ New post</a></h1>
+<div class="pagehead">
+ <h1>Posts</h1>
+ <div class="actions"><a class="btn" href="/b/{{.Blog.Subdomain}}/posts/new{{if .Data.pageID}}?page={{.Data.pageID}}{{end}}">+ New post</a></div>
+</div>
<form method="get" class="filter">
<label>Page:
<select name="page" onchange="this.form.submit()">
diff --git a/internal/web/templates/dashboard/settings.html b/internal/web/templates/dashboard/settings.html
index 9b2b325..53a24c4 100644
--- a/internal/web/templates/dashboard/settings.html
+++ b/internal/web/templates/dashboard/settings.html
@@ -7,7 +7,7 @@
<label>Blog title<br><input name="title" value="{{.Blog.Title}}" required maxlength="120"></label>
<label>Tagline <span class="muted">(shown under the title)</span><br><input name="tagline" value="{{.Blog.Tagline}}" maxlength="300"></label>
<p class="muted">Address: <code>{{.BlogURL}}</code>{{if ne .Blog.Subdomain "www"}} — only the administrator can change this{{end}}.</p>
- <button type="submit">Save</button>
+ <p class="actionrow"><button type="submit">Save</button></p>
</form>
</div>
{{end}}
diff --git a/internal/web/templates/partials/mdhelp.html b/internal/web/templates/partials/mdhelp.html
index 878130e..4623c07 100644
--- a/internal/web/templates/partials/mdhelp.html
+++ b/internal/web/templates/partials/mdhelp.html
@@ -1,9 +1,9 @@
-{{define "mdhelp"}}<div class="card help">
- <h3>Formatting cheat-sheet</h3>
+{{define "mdhelp"}}<details class="help">
+ <summary>Formatting cheat-sheet</summary>
<table class="cheat">
<tr><td><code># Heading</code>, <code>## Smaller heading</code></td><td><code>**bold**</code>, <code>*italic*</code></td></tr>
- <tr><td><code>[link text](https://example.org)</code></td><td><code>![description](/media/…)</code> — copy the address from <em>Images</em></td></tr>
+ <tr><td><code>[link text](https://example.org)</code></td><td><code>![description](/media/…)</code> — or use <em>Insert image</em></td></tr>
<tr><td><code>- list item</code> / <code>1. numbered</code></td><td><code>&gt; quote</code>, <code>`code`</code>, <code>---</code> for a line</td></tr>
</table>
- <p class="muted">Blank line = new paragraph. Press Enter once for a line break.</p>
-</div>{{end}}
+ <p class="muted small">Blank line = new paragraph. Press Enter once for a line break.</p>
+</details>{{end}}