The root of the paint-over and of the keyboard regression rega's A/B found. ProfileLoader's wrapper is min-height: var(--profile-min-h, 100dvh), and a host that already sizes the element sets --profile-min-h:0 (the Gallery's .dms-pane, VerticalTabs, plugin-studio). The pane column sizes each element (inset:0 in its pane) but never set it, so on the standalone leaf each pane's wrapper was 100dvh = 900 px inside an 843 px pane: the wall's scroller ran 57 px past its pane, its first row's tapes painted over the map, and Tab into those tapes scrolled the pane COLUMN (and, with the clip, onto an invisible control). The Gallery was pane-sized only because its own host set the variable. The clip stays as belt and braces. |
||
|---|---|---|
| .. | ||
| 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.