feat: chapter chevrons, sticky app frame, and focus mode (0.21.0)
Reader gets chapter-aware chevrons + a persistent app frame + distraction-free focus mode. - Single-mode chevrons (and ArrowLeft/Right + j/k) advance pages within the chapter and fall through to the adjacent chapter at the boundaries. Last page of last chapter / first page of first chapter disables the chevron and silent-no-ops on the keypress. - Continuous-mode gets a fixed bottom bar with prev/next chapter buttons; arrows + j/k jump chapters directly. - `?page=N` and `?page=last` URL query lets the prev-chapter jump land on the previous chapter's last page. - Layout header is fixed at the top; reader nav is sticky just below it; both stay visible while scrolling so reading settings are always reachable. - New "Focus" toggle in the reader nav hides the layout header, reader nav, and bottom chapter bar with smooth 220ms slide animations. Exit via Esc or a small floating Minimize2 button at the top-right (low resting opacity, full on hover). Reset on reader unmount so it doesn't leak to other pages. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -149,6 +149,24 @@
|
||||
font-size: var(--font-sm);
|
||||
}
|
||||
|
||||
/* App frame: header is fixed at the viewport top with a slide
|
||||
transition so reader fullscreen (set via `data-reader-fullscreen`
|
||||
on `<html>`) can hide it without jolting the layout. `main` pays
|
||||
the gap with a matching padding-top that animates in lockstep. */
|
||||
header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: var(--z-sticky);
|
||||
transform: translateY(0);
|
||||
transition: transform 220ms ease-out;
|
||||
}
|
||||
|
||||
:global(html[data-reader-fullscreen='true']) header {
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
|
||||
.session {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -186,7 +204,17 @@
|
||||
|
||||
main {
|
||||
padding: var(--space-4);
|
||||
/* Reserve room for the fixed header so its presence doesn't
|
||||
overlap content. The min-height is a fallback that matches
|
||||
the header at typical viewport sizes (60–72px); resize
|
||||
observers would be more accurate but the gap is forgiving. */
|
||||
padding-top: calc(var(--app-header-h) + var(--space-4));
|
||||
max-width: 64rem;
|
||||
margin: 0 auto;
|
||||
transition: padding-top 220ms ease-out;
|
||||
}
|
||||
|
||||
:global(html[data-reader-fullscreen='true']) main {
|
||||
padding-top: var(--space-4);
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user