diff options
| author | grm <grm@eyesin.space> | 2026-09-12 12:21:10 +0300 |
|---|---|---|
| committer | grm <grm@eyesin.space> | 2026-09-12 12:21:10 +0300 |
| commit | 336199c65d910bbd45a9c5dcbc3beae214d75b98 (patch) | |
| tree | 914b9259f96f21939305f9b4990b725cea72ca47 /internal/web/templates | |
| parent | e0768c2aacd72bd4e62d0847dc2231644664d08d (diff) | |
| download | blogspace-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.html | 4 | ||||
| -rw-r--r-- | internal/web/templates/admin/index.html | 5 | ||||
| -rw-r--r-- | internal/web/templates/admin/new_user.html | 4 | ||||
| -rw-r--r-- | internal/web/templates/auth/login.html | 5 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/confirm.html | 4 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/design.html | 2 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/images.html | 8 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/page_form.html | 2 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/pages.html | 7 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/password.html | 2 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/post_form.html | 2 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/posts.html | 5 | ||||
| -rw-r--r-- | internal/web/templates/dashboard/settings.html | 2 | ||||
| -rw-r--r-- | internal/web/templates/partials/mdhelp.html | 10 |
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 & blogs <a class="btn small" href="/admin/users/new">+ New blogger</a></h1> +<div class="pagehead"> + <h1>Users & 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 ↗</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 ↗</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></code> — copy the address from <em>Images</em></td></tr> + <tr><td><code>[link text](https://example.org)</code></td><td><code></code> — or use <em>Insert image</em></td></tr> <tr><td><code>- list item</code> / <code>1. numbered</code></td><td><code>> 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}} |
