doxa-maps/library/components/map-controls
Doxa Maps 1b2c596011 The share menu's tabs mirrored the wrong way, and the check could not see them
Five physical CSS declarations in the chrome every production map renders, so
under Arabic each of them lands on the wrong side for every map at once:
SemanticTreeLegend's active tab chip drew its border on the left, the share
menu's step list padded from the left, its tab spacing and its auto-spacer both
pushed from the right, and the geocoder's search icon sat at left:7px inside an
input that mirrors. All five become logical properties, which in a left-to-right
reading resolve to exactly what they resolved to before: four insertions against
four deletions in the components, one property each, and the English view cannot
move.

The reason they survived is the more useful half. check-legend-logical-insets
existed and passed, but it read only library/components/legends -- the share menu
is one directory away, and a reader in Arabic does not know which folder a control
came from. So the scan now covers map-controls as well.

Widening it was not enough. It still passed, because its CSS extractor matched a
template literal with the pattern `([^`]*\{[^`]*\}[^`]*)`, which describes a
literal containing ONE brace pair. ShareButton keeps its styles in a 600-line
useShadowStyles literal with hundreds, so the scan captured seven fragments
totalling 7,003 characters of a 629-line file and never saw .share-tab at all. It
was reporting PASS on a directory it was barely reading, which is worse than
having no check: a green gate is read as evidence. Template literals are now
taken whole and kept only when they look like CSS -- 2 blocks, 8,462 characters,
and the rule is finally in scope.

The self-test poisons BOTH directories. Poisoning only a legend would have proved
the check works on the half it always covered, and passed unchanged the day the
wider scan silently narrowed again. Its map-controls arm puts back the exact
declaration this commit removes, and its failure message says what a failure
means.
2026-09-29 03:46:37 +00:00
..
FullscreenButton.vue A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00
GeocoderComponent.vue The share menu's tabs mirrored the wrong way, and the check could not see them 2026-09-29 03:46:37 +00:00
HamburgerButton.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
HelpButton.vue A map's own ? can ask its host for help: HelpButton and useHostedHelp send doxa:help 2026-09-29 02:35:35 +00:00
index.js doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
LocationButton.vue A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00
MapControlButton.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
MapControlMenu.vue Every animating library component now honours prefers-reduced-motion itself 2026-09-29 01:38:07 +00:00
MapToolbar.vue The map controls and the pin hint printed; the attribution stays 2026-09-28 21:59:29 +00:00
README.md consolidate docs into documentation/ and deployment shells into deployment/ 2026-09-21 23:23:23 +00:00
ShareButton.vue The share menu's tabs mirrored the wrong way, and the check could not see them 2026-09-29 03:46:37 +00:00
ThemeToggleButton.vue A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00
ZoomInButton.vue A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00
ZoomOutButton.vue A lazy view that fails to load says so and offers Retry; map controls carry data-control 2026-09-28 11:42:54 +00:00

library/components/map-controls/ — toolbar buttons

Each file is a single, focused button or input that mounts inside the map's control area. Replaces the older monolithic MapControlsComponent.vue.

  MapToolbar.vue  (container)
   ├─ ZoomInButton · ZoomOutButton · LocationButton
   ├─ FullscreenButton · HamburgerButton · ThemeToggleButton
   ├─ HelpButton · ShareButton
   └─ GeocoderComponent   (all built on MapControlButton.vue)
  • Every button takes a size prop (sm | md | lg) and follows the MapControlButton shape.
  • Click handlers go through inject('mapStore') or getMap() — never a captured Mapbox instance.
  • To add one: copy ZoomInButton.vue and register it in MapToolbar.vue.

Full conventions + catalog: ../../../documentation/architecture/components.md.