A back-to-top on mobile, next to the hamburger circle, for the people-group grid and the regions list. Both scroll their own container, so the container is a prop and this component owns only the affordance. It does not know where the circle is, and must not guess. .vtl-fab is 44px at a 12px inset today, and it lives in the layout outside every plugin's shadow root. Hardcoding 64px here would put the two on top of each other the day that changes, silently, on a phone. So the layout publishes --map-fab-beside alongside the clearance it already published, and this reads it — falling back to the plain inset when there is no circle, which is also the standalone case where nothing sets it. The circle's geometry is stated once, by the component that owns it. It also refuses to appear when it cannot work: visible tests that the container actually scrolls, not only that scrollTop is large. An arrow that does nothing when pressed is worse than no arrow, because the reader spends a tap finding out. And it honours prefers-reduced-motion, since a long list jumping is exactly the motion that rule exists for. The failure mode here is a var NAME drifting between publisher and consumer: nothing throws, the fallback applies, and the button quietly sits under the circle again. Checked rather than assumed — every published name is consumed and every consumed name is published. NEEDS EYES: I cannot see 44px or a hover state. The logic is small; whether it lands beside the circle rather than over it is a render question. |
||
|---|---|---|
| .. | ||
| app-wrapper-material | ||
| pane-wrapper | ||
| README.md | ||
| StackLayout.vue | ||
| VerticalTabsLayout.vue | ||
layouts/ — app wrappers
Each folder here is an app wrapper: a host shell that composes doxa-maps plugin-designs (the independently-built custom elements) into one application.
layouts/<wrapper>/ ← the HOST page (not a bundle)
┌──────────┬──────────────────────────────┐
│ sidebar │ mounts an app-profile here │
│ (nav.js) │ ┌──────────────┐ │
│ ├ item │ │ <doxa-map> │ ← a │
│ ├ section│ │ (a bundle) │ micro- │
│ └ folder │ └──────────────┘ frontend │
└──────────┴──────────────────────────────┘
- app-profile = a self-contained custom element (the micro-frontend). app wrapper = the host that mounts them and provides nav/chrome. A wrapper is a host page, not a bundle-in-a-bundle.
- Wrappers today:
app-wrapper-material/,pane-wrapper/. - Icons are inline SVG only (no CDN) — an F-Droid/offline hard requirement.
Sidebar contract, target filtering, sidebar modes, staging: ../documentation/architecture/app-wrappers.md.