The way down the tree is the link at the foot, not an arrow that follows
Test / test (pull_request) Successful in 56s
Test / test (pull_request) Successful in 56s
0.5.3 put the same link in two places: in words at the foot of the page, and as an arrow fixed at the left edge half-way up the screen. The arrow stayed with the reader the whole way down a page to offer what the foot offers where they end up anyway. It is removed; the foot link and where it leads are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
48a1a58d01
commit
86ec51012e
@@ -4,6 +4,10 @@ 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).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
- The way down the tree is the line at the foot of the page and nothing else. The arrow fixed at the left edge, which 0.5.3 added beside it, is gone: it followed the reader down every page to offer something the foot already does.
|
||||||
|
|
||||||
## 0.5.4 (2026-09-29)
|
## 0.5.4 (2026-09-29)
|
||||||
|
|
||||||
- Accounts the content mandates, made at start (`src/seed.rs`). Every person a page names as `responsible` gets a Kanidm account if they have none, and a mail in the site's language saying they are listed as responsible for asking that question, with the link to sign in; `RESPONSIBLE_GROUP` puts them all in one group (people who already had an account are added without a mail). `SEED_ADMIN_EMAIL` (and `SEED_ADMIN_NAME`, `SEED_GROUP`) invites the first person into the site's most privileged group - the group whose desk may invite into the most groups - so a site with its own Kanidm has someone to invite everyone else. Both happen once per address and group (`portal_seed`), side by side, and each tries again a minute apart, twenty times, while Kanidm comes up. The responsible are gone over again whenever the content changes (`portal.content.reloaded`, published once new content is in place), so a new page's person is set up without a restart - and someone the content has stopped naming leaves `RESPONSIBLE_GROUP` in the same pass, if portal is who put them there.
|
- Accounts the content mandates, made at start (`src/seed.rs`). Every person a page names as `responsible` gets a Kanidm account if they have none, and a mail in the site's language saying they are listed as responsible for asking that question, with the link to sign in; `RESPONSIBLE_GROUP` puts them all in one group (people who already had an account are added without a mail). `SEED_ADMIN_EMAIL` (and `SEED_ADMIN_NAME`, `SEED_GROUP`) invites the first person into the site's most privileged group - the group whose desk may invite into the most groups - so a site with its own Kanidm has someone to invite everyone else. Both happen once per address and group (`portal_seed`), side by side, and each tries again a minute apart, twenty times, while Kanidm comes up. The responsible are gone over again whenever the content changes (`portal.content.reloaded`, published once new content is in place), so a new page's person is set up without a restart - and someone the content has stopped naming leaves `RESPONSIBLE_GROUP` in the same pass, if portal is who put them there.
|
||||||
|
|||||||
+5
-19
@@ -477,7 +477,7 @@ fn QuestionView(
|
|||||||
/// Every other question the visitor currently qualifies for, as a
|
/// Every other question the visitor currently qualifies for, as a
|
||||||
/// small nav - how a concern reaches the people it speaks to without
|
/// small nav - how a concern reaches the people it speaks to without
|
||||||
/// claiming front-page space (an owner also sees the gated desks here).
|
/// claiming front-page space (an owner also sees the gated desks here).
|
||||||
/// Where the arrow on the left takes a visitor: the nearest page below
|
/// Where the link at the foot of a page takes a visitor: the nearest page below
|
||||||
/// the current one in the tree that they may open, found by taking the
|
/// the current one in the tree that they may open, found by taking the
|
||||||
/// path apart one segment at a time (`/a/b/c`, then `/a/b`, then `/a`),
|
/// path apart one segment at a time (`/a/b/c`, then `/a/b`, then `/a`),
|
||||||
/// and the front door when none of those is a page. `None` on the front
|
/// and the front door when none of those is a page. `None` on the front
|
||||||
@@ -523,24 +523,10 @@ fn QuestionNav(current_id: String) -> impl IntoView {
|
|||||||
let NavRes(nav) = expect_context();
|
let NavRes(nav) = expect_context();
|
||||||
let location = leptos_router::hooks::use_location();
|
let location = leptos_router::hooks::use_location();
|
||||||
view! {
|
view! {
|
||||||
// The way down the tree: fixed at the left edge, half-way up the
|
// The way down the tree, at the foot of the page, in words:
|
||||||
// screen, small enough never to cover what a visitor is reading.
|
// where a reader who has read to the end looks for where to go
|
||||||
// It replaces a "back" alternative on every page that had one.
|
// next. It replaces a "back" alternative on every page that had
|
||||||
<Suspense fallback=|| ()>
|
// one.
|
||||||
{move || {
|
|
||||||
let path = location.pathname.get();
|
|
||||||
nav.get().and_then(|res| res.ok()).and_then(|items| down_the_tree(&path, &items)).map(|(href, name)| {
|
|
||||||
let label = down_the_tree_label(&lang().get(), &href, &name);
|
|
||||||
view! {
|
|
||||||
<a class="down-the-tree" href=href aria-label=label.clone() title=label>
|
|
||||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5 8 12l7 7" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
||||||
</a>
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
</Suspense>
|
|
||||||
// The same way down, at the foot of the page, in words: where a
|
|
||||||
// reader who has read to the end looks for where to go next.
|
|
||||||
<Suspense fallback=|| ()>
|
<Suspense fallback=|| ()>
|
||||||
{move || {
|
{move || {
|
||||||
let path = location.pathname.get();
|
let path = location.pathname.get();
|
||||||
|
|||||||
+1
-41
@@ -298,47 +298,7 @@ main.not-found {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* The way down the tree: one level toward the front door, from any
|
/* The way down the tree: one level toward the front door, from any
|
||||||
page. Fixed at the left edge, half-way up, over the margin rather
|
page, as a line at the foot of it. */
|
||||||
than the text; small, and half-faded until touched, so it never
|
|
||||||
covers what a visitor is reading. */
|
|
||||||
.down-the-tree {
|
|
||||||
position: fixed;
|
|
||||||
left: 0.6rem;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
z-index: 20;
|
|
||||||
width: 2.6rem;
|
|
||||||
height: 2.6rem;
|
|
||||||
display: grid;
|
|
||||||
place-items: center;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: var(--card-bg-opaque);
|
|
||||||
color: var(--ink);
|
|
||||||
box-shadow: 0 0.2rem 0.8rem var(--card-shadow);
|
|
||||||
opacity: 0.7;
|
|
||||||
transition: opacity 120ms, transform 120ms;
|
|
||||||
}
|
|
||||||
|
|
||||||
.down-the-tree:hover,
|
|
||||||
.down-the-tree:focus-visible {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(-50%) translateX(-0.12rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
.down-the-tree svg {
|
|
||||||
width: 1.3rem;
|
|
||||||
height: 1.3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 43.75rem) {
|
|
||||||
.down-the-tree {
|
|
||||||
left: 0.25rem;
|
|
||||||
width: 2.2rem;
|
|
||||||
height: 2.2rem;
|
|
||||||
opacity: 0.55;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.down-the-tree-foot {
|
.down-the-tree-foot {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user