Who is here on the wordmark's line; every form carries a signed-in person's name and address
Test / test (pull_request) Successful in 1m6s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
This commit is contained in:
Bendik Aagaard Lynghaug
2026-10-01 11:40:27 +02:00
co-authored by Claude Opus 5.5
parent 9b50c9cab8
commit 78f42e6f8a
4 changed files with 59 additions and 14 deletions
+5
View File
@@ -4,6 +4,11 @@ One line per change, grouped by the release that shipped it. Newest
first. A release is a Cargo.toml bump plus a `v<version>` tag; the first. A release is a Cargo.toml bump plus a `v<version>` tag; the
content repos pin the tag they run (see the end of this file). content repos pin the tag they run (see the end of this file).
## 0.6.13 (2026-10-01)
- Who is here (the name and "sign out", or "sign in") sits on the wordmark's own line instead of being pinned to the corner of the page, where it read as a row of its own. With a picture strip it is in the wordmark's bar; without, it is level with the mark at the right edge. On a narrow screen it drops under the mark.
- Trainer: every form, public ones included, carries a signed-in person's name and address from the login instead of asking for them; a visitor still sees the fields. Only the inside forms did before, so someone signed in filled in their own name and address again on a public form.
## 0.6.12 (2026-10-01) ## 0.6.12 (2026-10-01)
- Trainer: the words model is told who opens each mail: the person who sent the case, the person who posted the record an answer is about, or someone at the business. Mails to the business about another person's case used to be written as if to that person ("you will hear from us"); on Gullberg, three of nine were. - Trainer: the words model is told who opens each mail: the person who sent the case, the person who posted the record an answer is about, or someone at the business. Mails to the business about another person's case used to be written as if to that person ("you will hear from us"); on Gullberg, three of nine were.
+7 -3
View File
@@ -998,10 +998,12 @@ fn Hero(
} }
}; };
let top = view! { <div class="hero-top">{mark()}{session}</div> };
let (bar_top, copy_top) = if has_slides { (Some(top), None) } else { (None, Some(top)) };
view! { view! {
<header class="hero" class:hero-module=has_module class:hero-slides=has_slides> <header class="hero" class:hero-module=has_module class:hero-slides=has_slides>
<Announcements current_id=current_id/> <Announcements current_id=current_id/>
{session}
{has_module {has_module
.then(|| { .then(|| {
view! { view! {
@@ -1012,10 +1014,12 @@ fn Hero(
// With pictures, the wordmark is a bar of its own above // With pictures, the wordmark is a bar of its own above
// them and the question comes under; without, the wordmark // them and the question comes under; without, the wordmark
// heads the copy as it always has. // heads the copy as it always has.
{has_slides.then(|| view! { <div class="hero-bar">{mark()}</div> })} // Who is here sits on the wordmark's own line, not on a row
// of its own above it.
{bar_top.map(|top| view! { <div class="hero-bar">{top}</div> })}
{slideshow.map(|show| view! { <SlideStrip show=show/> })} {slideshow.map(|show| view! { <SlideStrip show=show/> })}
<div class="hero-copy"> <div class="hero-copy">
{(!has_slides).then(|| mark())} {copy_top}
<h1>{title}</h1> <h1>{title}</h1>
<p inner_html=render_inline_markdown(&description)></p> <p inner_html=render_inline_markdown(&description)></p>
</div> </div>
+6 -7
View File
@@ -1953,13 +1953,12 @@ fn form_alternative(plan: &Plan, need: &PlanNeed, w: &Value, action: &str) -> Va
if f.multiple { r["multiple"] = json!(true); } if f.multiple { r["multiple"] = json!(true); }
let hint = s(&w["hints"][&f.name]).trim(); let hint = s(&w["hints"][&f.name]).trim();
if !hint.is_empty() && f.kind != "select" { r["placeholder"] = json!(hint); } if !hint.is_empty() && f.kind != "select" { r["placeholder"] = json!(hint); }
// Someone signed in is not asked for what the site knows: on a // Someone signed in is not asked for what the site knows, on any
// group's page they always are, and answering a record they // form: portal carries their name and address and the fields take
// may be. // no room (`content::fill_from_user`). A visitor sees the fields
if parent.is_some() || need.enters_as.is_some() { // as usual, so a public form loses nothing by it.
if f.kind == "email" && matches!(f.name.as_str(), "email" | "epost" | "e-post") { r["value"] = json!("{user.email}"); } if f.kind == "email" && matches!(f.name.as_str(), "email" | "epost" | "e-post") { r["value"] = json!("{user.email}"); }
if f.kind == "text" && matches!(f.name.as_str(), "name" | "navn") { r["value"] = json!("{user.name}"); } if f.kind == "text" && matches!(f.name.as_str(), "name" | "navn") { r["value"] = json!("{user.name}"); }
}
r r
}).collect(); }).collect();
// The record this answer is about, carried in from the page's own // The record this answer is about, carried in from the page's own
+41 -4
View File
@@ -176,10 +176,6 @@ main.not-found {
/* Who is here and the way in or out: top right of every page, on a /* Who is here and the way in or out: top right of every page, on a
site that has sign-in. */ site that has sign-in. */
.session { .session {
position: absolute;
top: 1rem;
right: 1.5rem;
z-index: 5;
display: flex; display: flex;
gap: 0.9rem; gap: 0.9rem;
align-items: baseline; align-items: baseline;
@@ -201,6 +197,47 @@ main.not-found {
color: var(--ink-dim); color: var(--ink-dim);
} }
/* The wordmark's line, with who is here on it: the mark centred and the
session at the right edge, level with the mark. A skin that sets
everything on one left edge spreads the two apart instead (see
Klingenberg Bygg's and Gullberg's). On a narrow screen the session
drops under the mark rather than over it. */
.hero-top {
position: relative;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
}
.hero-top .session {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
.hero-bar .hero-top {
justify-content: space-between;
}
.hero-bar .hero-top .session {
position: static;
transform: none;
}
@media (max-width: 34rem) {
.hero-top {
flex-wrap: wrap;
}
.hero-top .session {
position: static;
transform: none;
}
}
/* A page with pictures: the wordmark is a bar of its own, the strip /* A page with pictures: the wordmark is a bar of its own, the strip
runs the full width under it, and the question follows. */ runs the full width under it, and the question follows. */
.hero-slides { .hero-slides {