Adopt nldd-app-view as the application shell #203
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Waggle has never used
nldd-app-view. That was not a decision, it just grew that way: every route hand-rolls a<div class="page-shell">(routes/Inbox.vue,ReadingList.vue,Settings.vue). The NLDD skill calls it "de buitenste schil" and assumes it is present.Two things during the typography work turned this from cosmetic into something with consequences.
What we are missing
nldd-pagerenders<main>,<header>and<footer>in its shadow DOM. We have no<main>anywhere in the app.app-viewforces its surface colour ontodocument.body, so iOS overscroll bounce and the status bar blend with the app instead of flashing the UA default white.overscroll-behaviorondocumentElementandbody; we set neither.reset.cssscopes its margin reset tohtml:has(nldd-app-view). Because we do not use the shell, that reset never applies, which is why #201 had to add anldd-container > * { margin: 0 }rule of its own.The part that needs care
nldd-pagedefaults to nested scroll mode: the page owns a scroller. Waggle scrolls the document today (useScrollLocklocksdocument.body;TopNavandSearchRowareposition: stickyagainst the viewport). Adopting the shell naively would change the scroll model.app-viewonly derives a mode when a horizontal split view is present (_evaluateScrollMode), and Waggle is a bare-page app, so it defers to the inherited value - which defaults to nested. Keeping today's behaviour therefore means setting--context-scroll-mode: rootourselves.Touches
App.vue, the three route shells,useScrollLock, the sticky TopNav offset (--topnav-height) and the card-list scroll. Worth doing, but as its own change with a keyboard and mobile pass.One correction, found while closing the skip-link gap in #223 (PR #224).
This issue says nldd-page defaults to nested scroll for a bare-page app, and that keeping today's document scroll "means setting
--context-scroll-mode: rootourselves". On 0.8.77 that is no longer true:_evaluateScrollModeinapp-view.jsresolves the absence of a split view toroot, not to the inherited default.Measured in the running app (0.8.77),
nldd-app-view>nldd-page[sticky-header]with no split view:So the scroll model does not change and we would not have to set the variable.
page.styles.js:118-127is the branch that does it: in root mode the sticky header becomes a realposition: stickylayer in normal flow, offset by--context-layer-top, and reserves its own space (no ResizeObserver padding). That also gives--topnav-heighta DS-native replacement:SearchRowcould publish itself as a layer instead of hardcoding the offset.That removes what reads as the most expensive part of this issue. The rest still stands - App.vue, the route shells,
useScrollLockand the card-list scroll, plus the keyboard and mobile pass.Two things worth knowing before picking this up:
sticky-headeron nldd-page covers it.<main>landed already. #224 added it via a sharedPageShell.vueplusnldd-skip-link, without the shell, so the landmark and WCAG 2.4.1 are no longer arguments for adopting app-view - they are done. What is left here is the body background, the overscroll policy, NLDD'shtml:has(nldd-app-view)resets, and getting the sticky layer out of our own CSS (PageShell currently carries oneposition: stickyrule, moved off TopNav).Related: the decision note from 2026-08-05 argued against adopting the shell partly on the scroll-mode cost. That part of the reasoning no longer holds.