doxa-maps/library/components/legends
Doxa Maps 3a4d4db48a Reserve room for the floating hamburger under a scrolled mobile legend
The Driver scrolls a legend to the end on a phone and the last rows sit under
the hamburger circle. The circle is .vtl-fab: 44px, pinned bottom-left, rendered
only when narrow and headerless with the drawer shut.

It wins on paint for a reason no z-index can fix. The FAB lives in the LAYOUT,
outside every plugin's shadow root, so it and the legend sheet are in different
stacking contexts; the sheet is z-index 1000 and still loses. Raising the sheet
would not have worked, which is why this reserves space instead.

The layout now publishes --map-fab-clearance, and only while the button is
actually on screen; custom properties inherit through the flattened tree, so it
reaches inside each plugin's shadow root. The mobile legend's scroll area adds
that to its bottom padding, defaulting to zero. No circle, no reserved space,
and a plugin used without this layout is unchanged. The padding is additive, so
nothing that works today moves.

The button's v-if and the clearance are now ONE computed rather than two copies
of the same condition. Two copies is the bug waiting to happen: drift one way
and the legend ends under the circle again, drift the other and there is a strip
of dead whitespace with no circle to justify it. Neither has a symptom any gate
can see, so disagreement is made impossible rather than tested for.

Measured, not guessed: the earlier reading of this card found the top-left map
control at top:8px and concluded the geometry did not match the report. It did
not — that is a second, real collision in two plugins, and a different bug.
2026-09-28 17:40:34 +00:00
..
ApproxPinNote.vue C4 wave 2: five library components share the guard, and keep their own English 2026-09-26 22:06:57 +00:00
LegendDesktop.vue legends: physical left/right -> logical, where the rule should mirror 2026-09-28 09:07:29 +00:00
LegendMobile.vue Reserve room for the floating hamburger under a scrolled mobile legend 2026-09-28 17:40:34 +00:00
LegendProgressBar.vue Legend progress bar draws no empty segments, so its left end is rounded again 2026-09-27 23:14:15 +00:00
LegendRows.vue The legend mirrors in Arabic: logical insets instead of left/right 2026-09-26 22:06:57 +00:00
LegendTools.vue The legend mirrors in Arabic: logical insets instead of left/right 2026-09-26 22:06:57 +00:00
listSelection.js Set an alarm on the zone/region id collision, which data currently hides 2026-09-28 15:01:19 +00:00
ListSelectorLegend.vue Vertical legend emits a zone id, and cannot drop a zone 2026-09-28 13:55:52 +00:00
SemanticTreeLegend.vue legends: physical left/right -> logical, where the rule should mirror 2026-09-28 09:07:29 +00:00