@fieldia/map 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +75 -10
  2. package/package.json +4 -4
  3. package/src/index.d.mts +5 -0
  4. package/src/index.d.ts +5 -0
  5. package/src/index.js +4 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +2 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/address-labels.d.mts +21 -0
  10. package/src/lib/address-labels.d.ts +21 -0
  11. package/src/lib/address-labels.js +16 -0
  12. package/src/lib/address-labels.js.map +1 -0
  13. package/src/lib/address-labels.mjs +12 -0
  14. package/src/lib/address-labels.mjs.map +1 -0
  15. package/src/lib/address-line.d.mts +2 -0
  16. package/src/lib/address-line.d.ts +2 -0
  17. package/src/lib/address-line.js +34 -0
  18. package/src/lib/address-line.js.map +1 -0
  19. package/src/lib/address-line.mjs +31 -0
  20. package/src/lib/address-line.mjs.map +1 -0
  21. package/src/lib/address-parts.d.mts +28 -0
  22. package/src/lib/address-parts.d.ts +28 -0
  23. package/src/lib/address-parts.js +47 -0
  24. package/src/lib/address-parts.js.map +1 -0
  25. package/src/lib/address-parts.mjs +38 -0
  26. package/src/lib/address-parts.mjs.map +1 -0
  27. package/src/lib/address-search.d.mts +21 -0
  28. package/src/lib/address-search.d.ts +21 -0
  29. package/src/lib/address-search.js +52 -0
  30. package/src/lib/address-search.js.map +1 -0
  31. package/src/lib/address-search.mjs +49 -0
  32. package/src/lib/address-search.mjs.map +1 -0
  33. package/src/lib/address-suggest.d.mts +18 -0
  34. package/src/lib/address-suggest.d.ts +18 -0
  35. package/src/lib/address-suggest.js +140 -0
  36. package/src/lib/address-suggest.js.map +1 -0
  37. package/src/lib/address-suggest.mjs +137 -0
  38. package/src/lib/address-suggest.mjs.map +1 -0
  39. package/src/lib/area-count.d.mts +47 -0
  40. package/src/lib/area-count.d.ts +47 -0
  41. package/src/lib/area-count.js +123 -0
  42. package/src/lib/area-count.js.map +1 -0
  43. package/src/lib/area-count.mjs +116 -0
  44. package/src/lib/area-count.mjs.map +1 -0
  45. package/src/lib/card.d.mts +16 -6
  46. package/src/lib/card.d.ts +16 -6
  47. package/src/lib/card.js +71 -14
  48. package/src/lib/card.js.map +1 -1
  49. package/src/lib/card.mjs +70 -14
  50. package/src/lib/card.mjs.map +1 -1
  51. package/src/lib/cluster.d.mts +6 -1
  52. package/src/lib/cluster.d.ts +6 -1
  53. package/src/lib/cluster.js +11 -5
  54. package/src/lib/cluster.js.map +1 -1
  55. package/src/lib/cluster.mjs +11 -5
  56. package/src/lib/cluster.mjs.map +1 -1
  57. package/src/lib/embed.d.mts +86 -0
  58. package/src/lib/embed.d.ts +86 -0
  59. package/src/lib/embed.js +96 -0
  60. package/src/lib/embed.js.map +1 -0
  61. package/src/lib/embed.mjs +93 -0
  62. package/src/lib/embed.mjs.map +1 -0
  63. package/src/lib/form-map.d.mts +2 -1
  64. package/src/lib/form-map.d.ts +2 -1
  65. package/src/lib/form-map.js +159 -20
  66. package/src/lib/form-map.js.map +1 -1
  67. package/src/lib/form-map.mjs +161 -22
  68. package/src/lib/form-map.mjs.map +1 -1
  69. package/src/lib/kinds.d.mts +6 -4
  70. package/src/lib/kinds.d.ts +6 -4
  71. package/src/lib/kinds.js +49 -2
  72. package/src/lib/kinds.js.map +1 -1
  73. package/src/lib/kinds.mjs +49 -2
  74. package/src/lib/kinds.mjs.map +1 -1
  75. package/src/lib/labels.d.mts +5 -0
  76. package/src/lib/labels.d.ts +5 -0
  77. package/src/lib/labels.js +12 -4
  78. package/src/lib/labels.js.map +1 -1
  79. package/src/lib/labels.mjs +12 -4
  80. package/src/lib/labels.mjs.map +1 -1
  81. package/src/lib/leaflet.js +1 -0
  82. package/src/lib/leaflet.js.map +1 -1
  83. package/src/lib/leaflet.mjs +1 -0
  84. package/src/lib/leaflet.mjs.map +1 -1
  85. package/src/lib/list-view.d.mts +37 -1
  86. package/src/lib/list-view.d.ts +37 -1
  87. package/src/lib/list-view.js +103 -50
  88. package/src/lib/list-view.js.map +1 -1
  89. package/src/lib/list-view.mjs +103 -51
  90. package/src/lib/list-view.mjs.map +1 -1
  91. package/src/lib/map-core.d.mts +8 -3
  92. package/src/lib/map-core.d.ts +8 -3
  93. package/src/lib/map-core.js +21 -10
  94. package/src/lib/map-core.js.map +1 -1
  95. package/src/lib/map-core.mjs +21 -10
  96. package/src/lib/map-core.mjs.map +1 -1
  97. package/src/lib/marks.d.mts +11 -0
  98. package/src/lib/marks.d.ts +11 -0
  99. package/src/lib/marks.js +26 -1
  100. package/src/lib/marks.js.map +1 -1
  101. package/src/lib/marks.mjs +23 -0
  102. package/src/lib/marks.mjs.map +1 -1
  103. package/src/lib/pins.d.mts +20 -8
  104. package/src/lib/pins.d.ts +20 -8
  105. package/src/lib/pins.js +60 -15
  106. package/src/lib/pins.js.map +1 -1
  107. package/src/lib/pins.mjs +60 -17
  108. package/src/lib/pins.mjs.map +1 -1
  109. package/src/lib/place.js +2 -1
  110. package/src/lib/place.js.map +1 -1
  111. package/src/lib/place.mjs +2 -1
  112. package/src/lib/place.mjs.map +1 -1
  113. package/src/lib/providers.d.mts +31 -5
  114. package/src/lib/providers.d.ts +31 -5
  115. package/src/lib/providers.js +80 -58
  116. package/src/lib/providers.js.map +1 -1
  117. package/src/lib/providers.mjs +80 -58
  118. package/src/lib/providers.mjs.map +1 -1
  119. package/src/lib/regions.js +18 -1
  120. package/src/lib/regions.js.map +1 -1
  121. package/src/lib/regions.mjs +18 -1
  122. package/src/lib/regions.mjs.map +1 -1
  123. package/src/lib/search-box.d.mts +7 -1
  124. package/src/lib/search-box.d.ts +7 -1
  125. package/src/lib/search-box.js +15 -10
  126. package/src/lib/search-box.js.map +1 -1
  127. package/src/lib/search-box.mjs +15 -10
  128. package/src/lib/search-box.mjs.map +1 -1
  129. package/src/lib/settings.d.mts +19 -2
  130. package/src/lib/settings.d.ts +19 -2
  131. package/src/lib/styles.d.mts +13 -2
  132. package/src/lib/styles.d.ts +13 -2
  133. package/src/lib/styles.js +69 -4
  134. package/src/lib/styles.js.map +1 -1
  135. package/src/lib/styles.mjs +67 -3
  136. package/src/lib/styles.mjs.map +1 -1
  137. package/src/lib/tools.d.mts +6 -3
  138. package/src/lib/tools.d.ts +6 -3
  139. package/src/lib/tools.js +52 -1
  140. package/src/lib/tools.js.map +1 -1
  141. package/src/lib/tools.mjs +52 -1
  142. package/src/lib/tools.mjs.map +1 -1
  143. package/src/lib/view-box.d.mts +18 -0
  144. package/src/lib/view-box.d.ts +18 -0
  145. package/src/lib/view-box.js +31 -0
  146. package/src/lib/view-box.js.map +1 -0
  147. package/src/lib/view-box.mjs +25 -0
  148. package/src/lib/view-box.mjs.map +1 -0
  149. package/src/lib/widgets.d.mts +3 -0
  150. package/src/lib/widgets.d.ts +3 -0
  151. package/src/lib/widgets.js +10 -1
  152. package/src/lib/widgets.js.map +1 -1
  153. package/src/lib/widgets.mjs +10 -1
  154. package/src/lib/widgets.mjs.map +1 -1
@@ -14,14 +14,25 @@ export declare function installLeafletStyles(doc: Document, css: string): void;
14
14
  * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
15
15
  * Its own stylesheet, so a form with only a place or an area never carries it.
16
16
  */
17
- export declare const LIST_MAP_CSS = "\n.fd-map-list { min-width: 0; }\n.fd-map-mark { overflow: visible; }\n.fd-map-mark:focus { outline: none; }\n/* Each mark is as large as its face, stood on its point by its foot, its middle, or the tip of a label's tail. */\n.fd-map-mark.fd-map-foot { translate: -50% -100%; }\n.fd-map-mark.fd-map-middle { translate: -50% -50%; }\n.fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }\n.fd-map-face {\n --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);\n position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;\n}\n.fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }\n.fd-map-face[data-tone=\"info\"] { --fd-map-tone: var(--fd-info); }\n.fd-map-face[data-tone=\"success\"] { --fd-map-tone: var(--fd-success); }\n.fd-map-face[data-tone=\"warning\"] { --fd-map-tone: var(--fd-warning); }\n.fd-map-face[data-tone=\"danger\"] { --fd-map-tone: var(--fd-error); }\n.fd-map-face[data-tone=\"muted\"] { --fd-map-tone: var(--fd-muted); }\n.fd-map-face[data-stands=\"foot\"] { transform-origin: 50% 100%; }\n.fd-map-face[data-stands=\"middle\"] { transform-origin: 50% 50%; }\n.fd-map-face[data-hot], .fd-map-mark:hover .fd-map-face, .fd-map-bubble[data-hot], .fd-map-mark:hover .fd-map-bubble { scale: 1.12; }\n.fd-map-mark:focus-visible .fd-map-face, .fd-map-mark:focus-visible .fd-map-bubble { outline: 2px solid var(--fd-focus); outline-offset: 3px; }\n.fd-map-face-icon { display: block; }\n.fd-map-face-icon svg { display: block; width: 100%; height: 100%; }\n.fd-map-face[data-look=\"label\"] {\n padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;\n background: var(--fd-surface); color: var(--fd-text); border: 1.5px solid color-mix(in srgb, var(--fd-text) 20%, transparent); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);\n}\n.fd-map-face[data-look=\"label\"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }\n.fd-map-face[data-look=\"label\"]::after {\n content: \"\"; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);\n background: inherit; border: inherit; border-top: 0; border-left: 0;\n}\n.fd-map-face[data-look=\"label\"]:is([data-hot], [data-chosen]), .fd-map-mark:hover .fd-map-face[data-look=\"label\"] { background: var(--fd-map-tone); color: var(--fd-map-on); border-color: var(--fd-map-tone); }\n.fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-map-face[data-look=\"pin\"] { width: 30px; height: 40px; }\n.fd-map-face[data-look=\"pin\"] > svg { display: block; width: 30px; height: 40px; filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.3)); }\n.fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon { position: absolute; left: 7px; top: 6px; width: 16px; height: 16px; color: var(--fd-map-on); }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon:empty { left: 10px; top: 9px; width: 10px; height: 10px; border-radius: 50%; background: var(--fd-map-on); }\n.fd-map-face[data-look=\"icon\"] {\n width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;\n background: var(--fd-map-tone); color: var(--fd-map-on); border: 2px solid var(--fd-surface); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\n.fd-map-face[data-look=\"icon\"] .fd-map-face-icon { width: 20px; height: 20px; }\n.fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }\n.fd-map-face-turn::before { content: \"\"; position: absolute; left: 50%; top: 0; margin-left: -5px; border: 5px solid transparent; border-top: 0; border-bottom: 7px solid var(--fd-map-tone); }\n.fd-map-face-photo {\n display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;\n border: 3px solid var(--fd-map-tone); background: var(--fd-fill); color: var(--fd-muted); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\nspan.fd-map-face-photo svg { width: 22px; height: 22px; }\n.fd-map-face[data-look=\"photo\"] .fd-map-face-text {\n position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;\n font-size: 12px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"dot\"] { width: 16px; height: 16px; border-radius: 50%; background: var(--fd-map-tone); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }\n.fd-map-face:is([data-look=\"icon\"], [data-look=\"dot\"])[data-chosen], .fd-map-face[data-chosen] .fd-map-face-photo { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-map-tone); }\n.fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {\n content: \"\u2713\"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;\n display: grid; place-items: center; font: 700 10px/1 system-ui, sans-serif; background: var(--fd-accent); color: var(--fd-accent-text); border: 1.5px solid var(--fd-surface);\n}\n.fd-map-bubble {\n position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;\n background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.fd-map-bubble[data-size=\"m\"] { width: 40px; height: 40px; }\n.fd-map-bubble[data-size=\"l\"] { width: 48px; height: 48px; }\n.fd-map-card-popup .leaflet-popup-content-wrapper { padding: 0; border-radius: 10px; overflow: hidden; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.24); }\n.fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }\n.fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }\n.fd-map-card { display: grid; }\n.fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }\n.fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }\n.fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }\n.fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }\n.fd-map-card-close {\n flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;\n background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;\n}\n.fd-map-card[dir=\"rtl\"] .fd-map-card-close { margin: -4px 0 -4px -6px; }\n.fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }\n.fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }\n.fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }\n.fd-map-card-fields dt { color: var(--fd-muted); }\n.fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n.fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }\n.fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }\n.fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }\n.fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }\n.fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }\n.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }\n.fd-map-here {\n position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;\n border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n/* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */\n@container fd-list (max-width: 860px) { .fd-list[data-view=\"both\"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }\n.fd-map-ghost .fd-map-face { pointer-events: none; }\n/* The tools that draw an area to search in: at the map's start, the zoom at its end. */\n.fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }\n.fd-map-box[data-side=\"left\"] .fd-map-draw { left: auto; right: 8px; }\n.fd-map-draw button {\n width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-draw button svg { width: 18px; height: 18px; }\n.fd-map-draw button:hover, .fd-map-draw button[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-draw button[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n/* While an area is drawn, the pins let every press through to the map. */\n.fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }\n/* The drawing's bar starts after the tools. */\n.fd-map-list .fd-map-hint { left: 48px; }\n.fd-map-list .fd-map-box[data-side=\"left\"] .fd-map-hint { left: 52px; right: 48px; }\n.fd-map-list-note {\n position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;\n background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);\n}\n";
17
+ export declare const LIST_MAP_CSS = "\n.fd-map-list { min-width: 0; }\n.fd-map-mark { overflow: visible; }\n.fd-map-mark:focus { outline: none; }\n/* Each mark is as large as its face, stood on its point by its foot, its middle, or the tip of a label's tail. */\n.fd-map-mark.fd-map-foot { translate: -50% -100%; }\n.fd-map-mark.fd-map-middle { translate: -50% -50%; }\n.fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }\n.fd-map-face {\n --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);\n position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;\n}\n.fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }\n.fd-map-face[data-tone=\"info\"] { --fd-map-tone: var(--fd-info); }\n.fd-map-face[data-tone=\"success\"] { --fd-map-tone: var(--fd-success); }\n.fd-map-face[data-tone=\"warning\"] { --fd-map-tone: var(--fd-warning); }\n.fd-map-face[data-tone=\"danger\"] { --fd-map-tone: var(--fd-error); }\n.fd-map-face[data-tone=\"muted\"] { --fd-map-tone: var(--fd-muted); }\n.fd-map-face[data-stands=\"foot\"] { transform-origin: 50% 100%; }\n.fd-map-face[data-stands=\"middle\"] { transform-origin: 50% 50%; }\n.fd-map-face[data-hot], .fd-map-mark:hover .fd-map-face, .fd-map-bubble[data-hot], .fd-map-mark:hover .fd-map-bubble { scale: 1.12; }\n.fd-map-mark:focus-visible .fd-map-face, .fd-map-mark:focus-visible .fd-map-bubble { outline: 2px solid var(--fd-focus); outline-offset: 3px; }\n.fd-map-face-icon { display: block; }\n.fd-map-face-icon svg { display: block; width: 100%; height: 100%; }\n.fd-map-face[data-look=\"label\"] {\n padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;\n background: var(--fd-surface); color: var(--fd-text); border: 1.5px solid color-mix(in srgb, var(--fd-text) 20%, transparent); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);\n}\n.fd-map-face[data-look=\"label\"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }\n.fd-map-face[data-look=\"label\"]::after {\n content: \"\"; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);\n background: inherit; border: inherit; border-top: 0; border-left: 0;\n}\n.fd-map-face[data-look=\"label\"]:is([data-hot], [data-chosen]), .fd-map-mark:hover .fd-map-face[data-look=\"label\"] { background: var(--fd-map-tone); color: var(--fd-map-on); border-color: var(--fd-map-tone); }\n.fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-map-face[data-look=\"pin\"] { width: 30px; height: 40px; }\n.fd-map-face[data-look=\"pin\"] > svg { display: block; width: 30px; height: 40px; filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.3)); }\n.fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon { position: absolute; left: 7px; top: 6px; width: 16px; height: 16px; color: var(--fd-map-on); }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon:empty { left: 10px; top: 9px; width: 10px; height: 10px; border-radius: 50%; background: var(--fd-map-on); }\n.fd-map-face[data-look=\"icon\"] {\n width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;\n background: var(--fd-map-tone); color: var(--fd-map-on); border: 2px solid var(--fd-surface); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\n.fd-map-face[data-look=\"icon\"] .fd-map-face-icon { width: 20px; height: 20px; }\n.fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }\n.fd-map-face-turn::before { content: \"\"; position: absolute; left: 50%; top: 0; margin-left: -5px; border: 5px solid transparent; border-top: 0; border-bottom: 7px solid var(--fd-map-tone); }\n.fd-map-face-photo {\n display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;\n border: 3px solid var(--fd-map-tone); background: var(--fd-fill); color: var(--fd-muted); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\nspan.fd-map-face-photo svg { width: 22px; height: 22px; }\n.fd-map-face[data-look=\"photo\"] .fd-map-face-text {\n position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;\n font-size: 12px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"dot\"] { width: 16px; height: 16px; border-radius: 50%; background: var(--fd-map-tone); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }\n.fd-map-face:is([data-look=\"icon\"], [data-look=\"dot\"])[data-chosen], .fd-map-face[data-chosen] .fd-map-face-photo { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-map-tone); }\n.fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {\n content: \"\u2713\"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;\n display: grid; place-items: center; font: 700 10px/1 system-ui, sans-serif; background: var(--fd-accent); color: var(--fd-accent-text); border: 1.5px solid var(--fd-surface);\n}\n.fd-map-bubble {\n position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;\n background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.fd-map-bubble[data-size=\"m\"] { width: 40px; height: 40px; }\n.fd-map-bubble[data-size=\"l\"] { width: 48px; height: 48px; }\n.fd-map-card-popup .leaflet-popup-content-wrapper { padding: 0; border-radius: 10px; overflow: hidden; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.24); }\n.fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }\n.fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }\n.fd-map-card { display: grid; }\n.fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }\n.fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }\n.fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }\n.fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }\n.fd-map-card-close {\n flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;\n background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;\n}\n.fd-map-card[dir=\"rtl\"] .fd-map-card-close { margin: -4px 0 -4px -6px; }\n.fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }\n.fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }\n.fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }\n.fd-map-card-fields dt { color: var(--fd-muted); }\n.fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n/* A title linking to the record's page; bare lines, their labels for a screen reader alone; the first line leading. */\n.fd-map-card .fd-map-card-link { color: inherit; text-decoration: none; }\n.fd-map-card .fd-map-card-link:hover { color: var(--fd-accent); text-decoration: underline; }\n.fd-map-card-picture { display: block; }\n.fd-map-card-fields[data-labels] div { display: block; }\n.fd-map-card-fields[data-labels] dt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-map-card-fields[data-labels] dd { text-align: start; font-weight: 400; }\n.fd-map-card-fields[data-lead] > div:first-child dd { font-size: 15.5px; font-weight: 700; color: var(--fd-text); }\n.fd-map-card-fields[data-lead][data-labels] > div + div dd { color: var(--fd-muted); }\n.fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }\n.fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }\n.fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }\n.fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }\n.fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }\nbutton.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }\nspan.fd-map-crowd-item { display: block; cursor: default; }\n.fd-map-here {\n position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;\n border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n.fd-map-box[data-card] > .fd-map-here { visibility: hidden; }\n/* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach (unless the page says how tall). */\n@container fd-list (max-width: 860px) { .fd-list[data-view=\"both\"] .fd-map-list:not([data-height]) .fd-map-box { height: clamp(260px, 46vh, 420px); } }\n.fd-map-ghost .fd-map-face { pointer-events: none; }\n/* The tools that draw an area to search in: at the map's start, the zoom at its end. */\n.fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }\n.fd-map-box[data-side=\"left\"] .fd-map-draw { left: auto; right: 8px; }\n.fd-map-draw button {\n width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-draw button svg { width: 18px; height: 18px; }\n.fd-map-draw button:hover, .fd-map-draw button[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-draw button[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n/* While an area is drawn, the pins let every press through to the map. */\n.fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }\n/* The drawing's bar starts after the tools. */\n.fd-map-list .fd-map-hint { left: 48px; }\n.fd-map-list .fd-map-box[data-side=\"left\"] .fd-map-hint { left: 52px; right: 48px; }\n.fd-map-list-note {\n position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;\n background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);\n}\n/* As tall as the element it is put in; in the viewer's list, which gives it no height to fill, as tall as a list's map is. */\n.fd-map-list[data-height=\"fill\"] { height: 100%; }\n.fd-list-map .fd-map-list[data-height=\"fill\"] { height: auto; }\n.fd-list-map .fd-map-list[data-height=\"fill\"] .fd-map-box { height: clamp(320px, 64vh, 640px); }\n/* A map that takes every gesture: one finger pans it, the page does not scroll under it. */\n.fd-map-box.leaflet-container[data-gestures=\"all\"] { touch-action: none; }\n";
18
18
  /** The list map's stylesheet, once per document, after the maps' own. */
19
19
  export declare function installListMapStyles(doc: Document): void;
20
+ /**
21
+ * A list's map in a page of its own (`mountListMap`), outside the viewer:
22
+ * what the viewer's form gives its map — a part hidden stays hidden, words
23
+ * for a screen reader alone, its buttons, its sizes — on the map's element
24
+ * alone, so none of it reaches the page round it. Its colours are Fieldia's
25
+ * tokens, light and dark by the page's colour scheme, in Fieldia's tokens'
26
+ * layer: a page's own rule for `.fd-map-embed`, of any weight, sets them.
27
+ */
28
+ export declare const EMBED_CSS = "\n@layer fieldia-tokens {\n.fd-map-embed {\n --fd-text: light-dark(#1f2328, #e8eaed); --fd-muted: light-dark(#59636e, #a3a9b2); --fd-surface: light-dark(#fff, #1f2329); --fd-border: light-dark(#d0d7de, #3a4048);\n --fd-accent: light-dark(#1365d9, #5aa2ff); --fd-accent-text: light-dark(#fff, #0b1220); --fd-accent-soft: light-dark(#e6f4ff, #1d2c42); --fd-focus: var(--fd-accent);\n --fd-info: light-dark(#0b5cad, #7db7ff); --fd-success: light-dark(#2e7d32, #6fd08e); --fd-warning: light-dark(#8a5300, #f2b55c); --fd-error: light-dark(#c62828, #ff8a7a);\n --fd-control-radius: 6px;\n}\n}\n.fd-map-embed { position: relative; color: var(--fd-text); font-size: 14px; line-height: 1.45; }\n.fd-map-embed *, .fd-map-embed ::before, .fd-map-embed ::after { box-sizing: border-box; }\n.fd-map-embed [hidden] { display: none !important; }\n.fd-map-embed .fd-sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-map-embed .fd-button {\n font: inherit; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 4px 14px;\n border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); color: var(--fd-text);\n}\n.fd-map-embed .fd-button:hover { border-color: var(--fd-accent); color: var(--fd-accent); }\n.fd-map-embed .fd-button-primary { background: var(--fd-accent); border-color: var(--fd-accent); color: var(--fd-accent-text); }\n.fd-map-embed .fd-button-primary:hover { color: var(--fd-accent-text); filter: brightness(1.12); }\n.fd-map-embed .fd-button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n.fd-map-embed .fd-button[aria-busy=\"true\"] { cursor: progress; opacity: 0.7; }\n";
29
+ /** A list's map's own base, once per document, after the list map's stylesheet: a page of its own carries it, the viewer never does. */
30
+ export declare function installEmbedStyles(doc: Document): void;
20
31
  /**
21
32
  * A form's map, on top of a list map's pins and cards: its label, a route
22
33
  * (the part travelled faded), a place whose news is old, the Follow button,
23
34
  * and the reader's own place with its button.
24
35
  */
25
- export declare const FORM_MAP_CSS = "\n.fd-map-form { display: grid; gap: 6px; min-width: 0; }\n.fd-map-form-label { margin: 0; font-weight: 600; color: var(--fd-text); }\npath.fd-map-route { stroke: var(--fd-accent); stroke-width: 5; stroke-opacity: 0.85; fill: none; stroke-linecap: round; stroke-linejoin: round; }\npath.fd-map-route-done { stroke: var(--fd-muted); stroke-width: 4; stroke-opacity: 0.55; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 8; }\npath.fd-map-reach { stroke: var(--fd-accent); stroke-width: 2; stroke-dasharray: 6 5; fill: var(--fd-accent); fill-opacity: 0.1; }\npath.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharray: 2 5; stroke-linecap: round; fill: var(--fd-warning); fill-opacity: 0.12; }\n.fd-map-face[data-stale] { filter: grayscale(1); opacity: 0.75; }\n.fd-map-face-stale {\n position: absolute; top: calc(100% + 4px); left: 50%; translate: -50% 0; z-index: 1; padding: 1px 6px; border-radius: 999px; white-space: nowrap;\n font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"photo\"] .fd-map-face-stale { top: calc(100% + 26px); }\n.fd-map-here.fd-map-follow { top: auto; bottom: 28px; }\n.fd-map-locate {\n position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-box[data-side=\"left\"] .fd-map-locate { left: auto; right: 8px; }\n.fd-map-locate svg { width: 18px; height: 18px; }\n.fd-map-locate:hover, .fd-map-locate[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-locate[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-locate:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-me { box-sizing: border-box; border-radius: 50%; background: var(--fd-info); border: 3px solid var(--fd-surface); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25), 0 1px 4px rgba(0, 0, 0, 0.3); }\n";
36
+ export declare const FORM_MAP_CSS = "\n.fd-map-form { display: grid; gap: 6px; min-width: 0; }\n.fd-map-form-label { margin: 0; font-weight: 600; color: var(--fd-text); }\npath.fd-map-route { stroke: var(--fd-accent); stroke-width: 5; stroke-opacity: 0.85; fill: none; stroke-linecap: round; stroke-linejoin: round; }\npath.fd-map-route-done { stroke: var(--fd-muted); stroke-width: 4; stroke-opacity: 0.55; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 8; }\npath.fd-map-reach { stroke: var(--fd-accent); stroke-width: 2; stroke-dasharray: 6 5; fill: var(--fd-accent); fill-opacity: 0.1; }\npath.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharray: 2 5; stroke-linecap: round; fill: var(--fd-warning); fill-opacity: 0.12; }\n.fd-map-face[data-stale] { filter: grayscale(1); opacity: 0.75; }\n.fd-map-face-stale {\n position: absolute; top: calc(100% + 4px); left: 50%; translate: -50% 0; z-index: 1; padding: 1px 6px; border-radius: 999px; white-space: nowrap;\n font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"photo\"] .fd-map-face-stale { top: calc(100% + 26px); }\n/* A place that moves, with pins that crowd it gathered under it: their count, itself among them, at its shoulder. */\n.fd-map-count {\n position: absolute; top: -8px; right: -10px; z-index: 2; min-width: 20px; height: 20px; padding: 0 5px; box-sizing: border-box; border-radius: 999px;\n display: grid; place-items: center; font: 700 11.5px/1 system-ui, sans-serif; font-variant-numeric: tabular-nums; pointer-events: none;\n background: var(--fd-accent); color: var(--fd-accent-text); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n}\n.fd-map-here.fd-map-follow { top: auto; bottom: 28px; }\n.fd-map-locate {\n position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-box[data-side=\"left\"] .fd-map-locate { left: auto; right: 8px; }\n.fd-map-locate svg { width: 18px; height: 18px; }\n.fd-map-locate:hover, .fd-map-locate[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-locate[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-locate:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-me { box-sizing: border-box; border-radius: 50%; background: var(--fd-info); border: 3px solid var(--fd-surface); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25), 0 1px 4px rgba(0, 0, 0, 0.3); }\n";
26
37
  /** A form's map's stylesheet, once per document, after a list map's. */
27
38
  export declare function installFormMapStyles(doc: Document): void;
@@ -14,14 +14,25 @@ export declare function installLeafletStyles(doc: Document, css: string): void;
14
14
  * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
15
15
  * Its own stylesheet, so a form with only a place or an area never carries it.
16
16
  */
17
- export declare const LIST_MAP_CSS = "\n.fd-map-list { min-width: 0; }\n.fd-map-mark { overflow: visible; }\n.fd-map-mark:focus { outline: none; }\n/* Each mark is as large as its face, stood on its point by its foot, its middle, or the tip of a label's tail. */\n.fd-map-mark.fd-map-foot { translate: -50% -100%; }\n.fd-map-mark.fd-map-middle { translate: -50% -50%; }\n.fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }\n.fd-map-face {\n --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);\n position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;\n}\n.fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }\n.fd-map-face[data-tone=\"info\"] { --fd-map-tone: var(--fd-info); }\n.fd-map-face[data-tone=\"success\"] { --fd-map-tone: var(--fd-success); }\n.fd-map-face[data-tone=\"warning\"] { --fd-map-tone: var(--fd-warning); }\n.fd-map-face[data-tone=\"danger\"] { --fd-map-tone: var(--fd-error); }\n.fd-map-face[data-tone=\"muted\"] { --fd-map-tone: var(--fd-muted); }\n.fd-map-face[data-stands=\"foot\"] { transform-origin: 50% 100%; }\n.fd-map-face[data-stands=\"middle\"] { transform-origin: 50% 50%; }\n.fd-map-face[data-hot], .fd-map-mark:hover .fd-map-face, .fd-map-bubble[data-hot], .fd-map-mark:hover .fd-map-bubble { scale: 1.12; }\n.fd-map-mark:focus-visible .fd-map-face, .fd-map-mark:focus-visible .fd-map-bubble { outline: 2px solid var(--fd-focus); outline-offset: 3px; }\n.fd-map-face-icon { display: block; }\n.fd-map-face-icon svg { display: block; width: 100%; height: 100%; }\n.fd-map-face[data-look=\"label\"] {\n padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;\n background: var(--fd-surface); color: var(--fd-text); border: 1.5px solid color-mix(in srgb, var(--fd-text) 20%, transparent); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);\n}\n.fd-map-face[data-look=\"label\"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }\n.fd-map-face[data-look=\"label\"]::after {\n content: \"\"; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);\n background: inherit; border: inherit; border-top: 0; border-left: 0;\n}\n.fd-map-face[data-look=\"label\"]:is([data-hot], [data-chosen]), .fd-map-mark:hover .fd-map-face[data-look=\"label\"] { background: var(--fd-map-tone); color: var(--fd-map-on); border-color: var(--fd-map-tone); }\n.fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-map-face[data-look=\"pin\"] { width: 30px; height: 40px; }\n.fd-map-face[data-look=\"pin\"] > svg { display: block; width: 30px; height: 40px; filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.3)); }\n.fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon { position: absolute; left: 7px; top: 6px; width: 16px; height: 16px; color: var(--fd-map-on); }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon:empty { left: 10px; top: 9px; width: 10px; height: 10px; border-radius: 50%; background: var(--fd-map-on); }\n.fd-map-face[data-look=\"icon\"] {\n width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;\n background: var(--fd-map-tone); color: var(--fd-map-on); border: 2px solid var(--fd-surface); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\n.fd-map-face[data-look=\"icon\"] .fd-map-face-icon { width: 20px; height: 20px; }\n.fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }\n.fd-map-face-turn::before { content: \"\"; position: absolute; left: 50%; top: 0; margin-left: -5px; border: 5px solid transparent; border-top: 0; border-bottom: 7px solid var(--fd-map-tone); }\n.fd-map-face-photo {\n display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;\n border: 3px solid var(--fd-map-tone); background: var(--fd-fill); color: var(--fd-muted); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\nspan.fd-map-face-photo svg { width: 22px; height: 22px; }\n.fd-map-face[data-look=\"photo\"] .fd-map-face-text {\n position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;\n font-size: 12px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"dot\"] { width: 16px; height: 16px; border-radius: 50%; background: var(--fd-map-tone); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }\n.fd-map-face:is([data-look=\"icon\"], [data-look=\"dot\"])[data-chosen], .fd-map-face[data-chosen] .fd-map-face-photo { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-map-tone); }\n.fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {\n content: \"\u2713\"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;\n display: grid; place-items: center; font: 700 10px/1 system-ui, sans-serif; background: var(--fd-accent); color: var(--fd-accent-text); border: 1.5px solid var(--fd-surface);\n}\n.fd-map-bubble {\n position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;\n background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.fd-map-bubble[data-size=\"m\"] { width: 40px; height: 40px; }\n.fd-map-bubble[data-size=\"l\"] { width: 48px; height: 48px; }\n.fd-map-card-popup .leaflet-popup-content-wrapper { padding: 0; border-radius: 10px; overflow: hidden; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.24); }\n.fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }\n.fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }\n.fd-map-card { display: grid; }\n.fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }\n.fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }\n.fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }\n.fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }\n.fd-map-card-close {\n flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;\n background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;\n}\n.fd-map-card[dir=\"rtl\"] .fd-map-card-close { margin: -4px 0 -4px -6px; }\n.fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }\n.fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }\n.fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }\n.fd-map-card-fields dt { color: var(--fd-muted); }\n.fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n.fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }\n.fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }\n.fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }\n.fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }\n.fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }\n.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }\n.fd-map-here {\n position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;\n border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n/* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */\n@container fd-list (max-width: 860px) { .fd-list[data-view=\"both\"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }\n.fd-map-ghost .fd-map-face { pointer-events: none; }\n/* The tools that draw an area to search in: at the map's start, the zoom at its end. */\n.fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }\n.fd-map-box[data-side=\"left\"] .fd-map-draw { left: auto; right: 8px; }\n.fd-map-draw button {\n width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-draw button svg { width: 18px; height: 18px; }\n.fd-map-draw button:hover, .fd-map-draw button[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-draw button[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n/* While an area is drawn, the pins let every press through to the map. */\n.fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }\n/* The drawing's bar starts after the tools. */\n.fd-map-list .fd-map-hint { left: 48px; }\n.fd-map-list .fd-map-box[data-side=\"left\"] .fd-map-hint { left: 52px; right: 48px; }\n.fd-map-list-note {\n position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;\n background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);\n}\n";
17
+ export declare const LIST_MAP_CSS = "\n.fd-map-list { min-width: 0; }\n.fd-map-mark { overflow: visible; }\n.fd-map-mark:focus { outline: none; }\n/* Each mark is as large as its face, stood on its point by its foot, its middle, or the tip of a label's tail. */\n.fd-map-mark.fd-map-foot { translate: -50% -100%; }\n.fd-map-mark.fd-map-middle { translate: -50% -50%; }\n.fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }\n.fd-map-face {\n --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);\n position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;\n}\n.fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }\n.fd-map-face[data-tone=\"info\"] { --fd-map-tone: var(--fd-info); }\n.fd-map-face[data-tone=\"success\"] { --fd-map-tone: var(--fd-success); }\n.fd-map-face[data-tone=\"warning\"] { --fd-map-tone: var(--fd-warning); }\n.fd-map-face[data-tone=\"danger\"] { --fd-map-tone: var(--fd-error); }\n.fd-map-face[data-tone=\"muted\"] { --fd-map-tone: var(--fd-muted); }\n.fd-map-face[data-stands=\"foot\"] { transform-origin: 50% 100%; }\n.fd-map-face[data-stands=\"middle\"] { transform-origin: 50% 50%; }\n.fd-map-face[data-hot], .fd-map-mark:hover .fd-map-face, .fd-map-bubble[data-hot], .fd-map-mark:hover .fd-map-bubble { scale: 1.12; }\n.fd-map-mark:focus-visible .fd-map-face, .fd-map-mark:focus-visible .fd-map-bubble { outline: 2px solid var(--fd-focus); outline-offset: 3px; }\n.fd-map-face-icon { display: block; }\n.fd-map-face-icon svg { display: block; width: 100%; height: 100%; }\n.fd-map-face[data-look=\"label\"] {\n padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;\n background: var(--fd-surface); color: var(--fd-text); border: 1.5px solid color-mix(in srgb, var(--fd-text) 20%, transparent); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);\n}\n.fd-map-face[data-look=\"label\"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }\n.fd-map-face[data-look=\"label\"]::after {\n content: \"\"; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);\n background: inherit; border: inherit; border-top: 0; border-left: 0;\n}\n.fd-map-face[data-look=\"label\"]:is([data-hot], [data-chosen]), .fd-map-mark:hover .fd-map-face[data-look=\"label\"] { background: var(--fd-map-tone); color: var(--fd-map-on); border-color: var(--fd-map-tone); }\n.fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-map-face[data-look=\"pin\"] { width: 30px; height: 40px; }\n.fd-map-face[data-look=\"pin\"] > svg { display: block; width: 30px; height: 40px; filter: drop-shadow(0 2px 2px rgba(0, 0, 0, 0.3)); }\n.fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon { position: absolute; left: 7px; top: 6px; width: 16px; height: 16px; color: var(--fd-map-on); }\n.fd-map-face[data-look=\"pin\"] .fd-map-face-icon:empty { left: 10px; top: 9px; width: 10px; height: 10px; border-radius: 50%; background: var(--fd-map-on); }\n.fd-map-face[data-look=\"icon\"] {\n width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;\n background: var(--fd-map-tone); color: var(--fd-map-on); border: 2px solid var(--fd-surface); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\n.fd-map-face[data-look=\"icon\"] .fd-map-face-icon { width: 20px; height: 20px; }\n.fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }\n.fd-map-face-turn::before { content: \"\"; position: absolute; left: 50%; top: 0; margin-left: -5px; border: 5px solid transparent; border-top: 0; border-bottom: 7px solid var(--fd-map-tone); }\n.fd-map-face-photo {\n display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;\n border: 3px solid var(--fd-map-tone); background: var(--fd-fill); color: var(--fd-muted); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);\n}\nspan.fd-map-face-photo svg { width: 22px; height: 22px; }\n.fd-map-face[data-look=\"photo\"] .fd-map-face-text {\n position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;\n font-size: 12px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"dot\"] { width: 16px; height: 16px; border-radius: 50%; background: var(--fd-map-tone); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }\n.fd-map-face:is([data-look=\"icon\"], [data-look=\"dot\"])[data-chosen], .fd-map-face[data-chosen] .fd-map-face-photo { box-shadow: 0 0 0 2px var(--fd-surface), 0 0 0 4px var(--fd-map-tone); }\n.fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {\n content: \"\u2713\"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;\n display: grid; place-items: center; font: 700 10px/1 system-ui, sans-serif; background: var(--fd-accent); color: var(--fd-accent-text); border: 1.5px solid var(--fd-surface);\n}\n.fd-map-bubble {\n position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;\n background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.fd-map-bubble[data-size=\"m\"] { width: 40px; height: 40px; }\n.fd-map-bubble[data-size=\"l\"] { width: 48px; height: 48px; }\n.fd-map-card-popup .leaflet-popup-content-wrapper { padding: 0; border-radius: 10px; overflow: hidden; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.24); }\n.fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }\n.fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }\n.fd-map-card { display: grid; }\n.fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }\n.fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }\n.fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }\n.fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }\n.fd-map-card-close {\n flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;\n background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;\n}\n.fd-map-card[dir=\"rtl\"] .fd-map-card-close { margin: -4px 0 -4px -6px; }\n.fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }\n.fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }\n.fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }\n.fd-map-card-fields dt { color: var(--fd-muted); }\n.fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n/* A title linking to the record's page; bare lines, their labels for a screen reader alone; the first line leading. */\n.fd-map-card .fd-map-card-link { color: inherit; text-decoration: none; }\n.fd-map-card .fd-map-card-link:hover { color: var(--fd-accent); text-decoration: underline; }\n.fd-map-card-picture { display: block; }\n.fd-map-card-fields[data-labels] div { display: block; }\n.fd-map-card-fields[data-labels] dt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-map-card-fields[data-labels] dd { text-align: start; font-weight: 400; }\n.fd-map-card-fields[data-lead] > div:first-child dd { font-size: 15.5px; font-weight: 700; color: var(--fd-text); }\n.fd-map-card-fields[data-lead][data-labels] > div + div dd { color: var(--fd-muted); }\n.fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }\n.fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }\n.fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }\n.fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }\n.fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }\nbutton.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }\nspan.fd-map-crowd-item { display: block; cursor: default; }\n.fd-map-here {\n position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;\n border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n.fd-map-box[data-card] > .fd-map-here { visibility: hidden; }\n/* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach (unless the page says how tall). */\n@container fd-list (max-width: 860px) { .fd-list[data-view=\"both\"] .fd-map-list:not([data-height]) .fd-map-box { height: clamp(260px, 46vh, 420px); } }\n.fd-map-ghost .fd-map-face { pointer-events: none; }\n/* The tools that draw an area to search in: at the map's start, the zoom at its end. */\n.fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }\n.fd-map-box[data-side=\"left\"] .fd-map-draw { left: auto; right: 8px; }\n.fd-map-draw button {\n width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-draw button svg { width: 18px; height: 18px; }\n.fd-map-draw button:hover, .fd-map-draw button[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-draw button[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n/* While an area is drawn, the pins let every press through to the map. */\n.fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }\n/* The drawing's bar starts after the tools. */\n.fd-map-list .fd-map-hint { left: 48px; }\n.fd-map-list .fd-map-box[data-side=\"left\"] .fd-map-hint { left: 52px; right: 48px; }\n.fd-map-list-note {\n position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;\n background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);\n}\n/* As tall as the element it is put in; in the viewer's list, which gives it no height to fill, as tall as a list's map is. */\n.fd-map-list[data-height=\"fill\"] { height: 100%; }\n.fd-list-map .fd-map-list[data-height=\"fill\"] { height: auto; }\n.fd-list-map .fd-map-list[data-height=\"fill\"] .fd-map-box { height: clamp(320px, 64vh, 640px); }\n/* A map that takes every gesture: one finger pans it, the page does not scroll under it. */\n.fd-map-box.leaflet-container[data-gestures=\"all\"] { touch-action: none; }\n";
18
18
  /** The list map's stylesheet, once per document, after the maps' own. */
19
19
  export declare function installListMapStyles(doc: Document): void;
20
+ /**
21
+ * A list's map in a page of its own (`mountListMap`), outside the viewer:
22
+ * what the viewer's form gives its map — a part hidden stays hidden, words
23
+ * for a screen reader alone, its buttons, its sizes — on the map's element
24
+ * alone, so none of it reaches the page round it. Its colours are Fieldia's
25
+ * tokens, light and dark by the page's colour scheme, in Fieldia's tokens'
26
+ * layer: a page's own rule for `.fd-map-embed`, of any weight, sets them.
27
+ */
28
+ export declare const EMBED_CSS = "\n@layer fieldia-tokens {\n.fd-map-embed {\n --fd-text: light-dark(#1f2328, #e8eaed); --fd-muted: light-dark(#59636e, #a3a9b2); --fd-surface: light-dark(#fff, #1f2329); --fd-border: light-dark(#d0d7de, #3a4048);\n --fd-accent: light-dark(#1365d9, #5aa2ff); --fd-accent-text: light-dark(#fff, #0b1220); --fd-accent-soft: light-dark(#e6f4ff, #1d2c42); --fd-focus: var(--fd-accent);\n --fd-info: light-dark(#0b5cad, #7db7ff); --fd-success: light-dark(#2e7d32, #6fd08e); --fd-warning: light-dark(#8a5300, #f2b55c); --fd-error: light-dark(#c62828, #ff8a7a);\n --fd-control-radius: 6px;\n}\n}\n.fd-map-embed { position: relative; color: var(--fd-text); font-size: 14px; line-height: 1.45; }\n.fd-map-embed *, .fd-map-embed ::before, .fd-map-embed ::after { box-sizing: border-box; }\n.fd-map-embed [hidden] { display: none !important; }\n.fd-map-embed .fd-sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n.fd-map-embed .fd-button {\n font: inherit; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 4px 14px;\n border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); color: var(--fd-text);\n}\n.fd-map-embed .fd-button:hover { border-color: var(--fd-accent); color: var(--fd-accent); }\n.fd-map-embed .fd-button-primary { background: var(--fd-accent); border-color: var(--fd-accent); color: var(--fd-accent-text); }\n.fd-map-embed .fd-button-primary:hover { color: var(--fd-accent-text); filter: brightness(1.12); }\n.fd-map-embed .fd-button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }\n.fd-map-embed .fd-button[aria-busy=\"true\"] { cursor: progress; opacity: 0.7; }\n";
29
+ /** A list's map's own base, once per document, after the list map's stylesheet: a page of its own carries it, the viewer never does. */
30
+ export declare function installEmbedStyles(doc: Document): void;
20
31
  /**
21
32
  * A form's map, on top of a list map's pins and cards: its label, a route
22
33
  * (the part travelled faded), a place whose news is old, the Follow button,
23
34
  * and the reader's own place with its button.
24
35
  */
25
- export declare const FORM_MAP_CSS = "\n.fd-map-form { display: grid; gap: 6px; min-width: 0; }\n.fd-map-form-label { margin: 0; font-weight: 600; color: var(--fd-text); }\npath.fd-map-route { stroke: var(--fd-accent); stroke-width: 5; stroke-opacity: 0.85; fill: none; stroke-linecap: round; stroke-linejoin: round; }\npath.fd-map-route-done { stroke: var(--fd-muted); stroke-width: 4; stroke-opacity: 0.55; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 8; }\npath.fd-map-reach { stroke: var(--fd-accent); stroke-width: 2; stroke-dasharray: 6 5; fill: var(--fd-accent); fill-opacity: 0.1; }\npath.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharray: 2 5; stroke-linecap: round; fill: var(--fd-warning); fill-opacity: 0.12; }\n.fd-map-face[data-stale] { filter: grayscale(1); opacity: 0.75; }\n.fd-map-face-stale {\n position: absolute; top: calc(100% + 4px); left: 50%; translate: -50% 0; z-index: 1; padding: 1px 6px; border-radius: 999px; white-space: nowrap;\n font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"photo\"] .fd-map-face-stale { top: calc(100% + 26px); }\n.fd-map-here.fd-map-follow { top: auto; bottom: 28px; }\n.fd-map-locate {\n position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-box[data-side=\"left\"] .fd-map-locate { left: auto; right: 8px; }\n.fd-map-locate svg { width: 18px; height: 18px; }\n.fd-map-locate:hover, .fd-map-locate[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-locate[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-locate:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-me { box-sizing: border-box; border-radius: 50%; background: var(--fd-info); border: 3px solid var(--fd-surface); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25), 0 1px 4px rgba(0, 0, 0, 0.3); }\n";
36
+ export declare const FORM_MAP_CSS = "\n.fd-map-form { display: grid; gap: 6px; min-width: 0; }\n.fd-map-form-label { margin: 0; font-weight: 600; color: var(--fd-text); }\npath.fd-map-route { stroke: var(--fd-accent); stroke-width: 5; stroke-opacity: 0.85; fill: none; stroke-linecap: round; stroke-linejoin: round; }\npath.fd-map-route-done { stroke: var(--fd-muted); stroke-width: 4; stroke-opacity: 0.55; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1 8; }\npath.fd-map-reach { stroke: var(--fd-accent); stroke-width: 2; stroke-dasharray: 6 5; fill: var(--fd-accent); fill-opacity: 0.1; }\npath.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharray: 2 5; stroke-linecap: round; fill: var(--fd-warning); fill-opacity: 0.12; }\n.fd-map-face[data-stale] { filter: grayscale(1); opacity: 0.75; }\n.fd-map-face-stale {\n position: absolute; top: calc(100% + 4px); left: 50%; translate: -50% 0; z-index: 1; padding: 1px 6px; border-radius: 999px; white-space: nowrap;\n font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n.fd-map-face[data-look=\"photo\"] .fd-map-face-stale { top: calc(100% + 26px); }\n/* A place that moves, with pins that crowd it gathered under it: their count, itself among them, at its shoulder. */\n.fd-map-count {\n position: absolute; top: -8px; right: -10px; z-index: 2; min-width: 20px; height: 20px; padding: 0 5px; box-sizing: border-box; border-radius: 999px;\n display: grid; place-items: center; font: 700 11.5px/1 system-ui, sans-serif; font-variant-numeric: tabular-nums; pointer-events: none;\n background: var(--fd-accent); color: var(--fd-accent-text); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n}\n.fd-map-here.fd-map-follow { top: auto; bottom: 28px; }\n.fd-map-locate {\n position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;\n background: var(--fd-surface); color: var(--fd-text); border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n}\n.fd-map-box[data-side=\"left\"] .fd-map-locate { left: auto; right: 8px; }\n.fd-map-locate svg { width: 18px; height: 18px; }\n.fd-map-locate:hover, .fd-map-locate[aria-pressed=\"true\"] { color: var(--fd-accent); border-color: var(--fd-accent); }\n.fd-map-locate[aria-pressed=\"true\"] { background: var(--fd-accent-soft); }\n.fd-map-locate:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }\n.fd-map-me { box-sizing: border-box; border-radius: 50%; background: var(--fd-info); border: 3px solid var(--fd-surface); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25), 0 1px 4px rgba(0, 0, 0, 0.3); }\n";
26
37
  /** A form's map's stylesheet, once per document, after a list map's. */
27
38
  export declare function installFormMapStyles(doc: Document): void;
package/src/lib/styles.js CHANGED
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FORM_MAP_CSS = exports.LIST_MAP_CSS = exports.MAP_CSS = void 0;
3
+ exports.FORM_MAP_CSS = exports.EMBED_CSS = exports.LIST_MAP_CSS = exports.MAP_CSS = void 0;
4
4
  exports.installMapStyles = installMapStyles;
5
5
  exports.installLeafletStyles = installLeafletStyles;
6
6
  exports.installListMapStyles = installListMapStyles;
7
+ exports.installEmbedStyles = installEmbedStyles;
7
8
  exports.installFormMapStyles = installFormMapStyles;
8
9
  /**
9
10
  * The maps in Fieldia's colours: every colour a token, so a theme, a host's
@@ -229,6 +230,15 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
229
230
  .fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }
230
231
  .fd-map-card-fields dt { color: var(--fd-muted); }
231
232
  .fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
233
+ /* A title linking to the record's page; bare lines, their labels for a screen reader alone; the first line leading. */
234
+ .fd-map-card .fd-map-card-link { color: inherit; text-decoration: none; }
235
+ .fd-map-card .fd-map-card-link:hover { color: var(--fd-accent); text-decoration: underline; }
236
+ .fd-map-card-picture { display: block; }
237
+ .fd-map-card-fields[data-labels] div { display: block; }
238
+ .fd-map-card-fields[data-labels] dt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
239
+ .fd-map-card-fields[data-labels] dd { text-align: start; font-weight: 400; }
240
+ .fd-map-card-fields[data-lead] > div:first-child dd { font-size: 15.5px; font-weight: 700; color: var(--fd-text); }
241
+ .fd-map-card-fields[data-lead][data-labels] > div + div dd { color: var(--fd-muted); }
232
242
  .fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
233
243
  .fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }
234
244
  .fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }
@@ -236,15 +246,17 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
236
246
  .fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
237
247
  .fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }
238
248
  .fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }
239
- .fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
249
+ button.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
250
+ span.fd-map-crowd-item { display: block; cursor: default; }
240
251
  .fd-map-here {
241
252
  position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;
242
253
  border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
243
254
  }
244
255
  .fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }
245
256
  .fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
246
- /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */
247
- @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }
257
+ .fd-map-box[data-card] > .fd-map-here { visibility: hidden; }
258
+ /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach (unless the page says how tall). */
259
+ @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list:not([data-height]) .fd-map-box { height: clamp(260px, 46vh, 420px); } }
248
260
  .fd-map-ghost .fd-map-face { pointer-events: none; }
249
261
  /* The tools that draw an area to search in: at the map's start, the zoom at its end. */
250
262
  .fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }
@@ -266,6 +278,12 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
266
278
  position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;
267
279
  background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
268
280
  }
281
+ /* As tall as the element it is put in; in the viewer's list, which gives it no height to fill, as tall as a list's map is. */
282
+ .fd-map-list[data-height="fill"] { height: 100%; }
283
+ .fd-list-map .fd-map-list[data-height="fill"] { height: auto; }
284
+ .fd-list-map .fd-map-list[data-height="fill"] .fd-map-box { height: clamp(320px, 64vh, 640px); }
285
+ /* A map that takes every gesture: one finger pans it, the page does not scroll under it. */
286
+ .fd-map-box.leaflet-container[data-gestures="all"] { touch-action: none; }
269
287
  `;
270
288
  /** The list map's stylesheet, once per document, after the maps' own. */
271
289
  function installListMapStyles(doc) {
@@ -277,6 +295,47 @@ function installListMapStyles(doc) {
277
295
  own.textContent = exports.LIST_MAP_CSS;
278
296
  doc.getElementById('fieldia-map-styles')?.after(own);
279
297
  }
298
+ /**
299
+ * A list's map in a page of its own (`mountListMap`), outside the viewer:
300
+ * what the viewer's form gives its map — a part hidden stays hidden, words
301
+ * for a screen reader alone, its buttons, its sizes — on the map's element
302
+ * alone, so none of it reaches the page round it. Its colours are Fieldia's
303
+ * tokens, light and dark by the page's colour scheme, in Fieldia's tokens'
304
+ * layer: a page's own rule for `.fd-map-embed`, of any weight, sets them.
305
+ */
306
+ exports.EMBED_CSS = `
307
+ @layer fieldia-tokens {
308
+ .fd-map-embed {
309
+ --fd-text: light-dark(#1f2328, #e8eaed); --fd-muted: light-dark(#59636e, #a3a9b2); --fd-surface: light-dark(#fff, #1f2329); --fd-border: light-dark(#d0d7de, #3a4048);
310
+ --fd-accent: light-dark(#1365d9, #5aa2ff); --fd-accent-text: light-dark(#fff, #0b1220); --fd-accent-soft: light-dark(#e6f4ff, #1d2c42); --fd-focus: var(--fd-accent);
311
+ --fd-info: light-dark(#0b5cad, #7db7ff); --fd-success: light-dark(#2e7d32, #6fd08e); --fd-warning: light-dark(#8a5300, #f2b55c); --fd-error: light-dark(#c62828, #ff8a7a);
312
+ --fd-control-radius: 6px;
313
+ }
314
+ }
315
+ .fd-map-embed { position: relative; color: var(--fd-text); font-size: 14px; line-height: 1.45; }
316
+ .fd-map-embed *, .fd-map-embed ::before, .fd-map-embed ::after { box-sizing: border-box; }
317
+ .fd-map-embed [hidden] { display: none !important; }
318
+ .fd-map-embed .fd-sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
319
+ .fd-map-embed .fd-button {
320
+ font: inherit; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 4px 14px;
321
+ border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); color: var(--fd-text);
322
+ }
323
+ .fd-map-embed .fd-button:hover { border-color: var(--fd-accent); color: var(--fd-accent); }
324
+ .fd-map-embed .fd-button-primary { background: var(--fd-accent); border-color: var(--fd-accent); color: var(--fd-accent-text); }
325
+ .fd-map-embed .fd-button-primary:hover { color: var(--fd-accent-text); filter: brightness(1.12); }
326
+ .fd-map-embed .fd-button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
327
+ .fd-map-embed .fd-button[aria-busy="true"] { cursor: progress; opacity: 0.7; }
328
+ `;
329
+ /** A list's map's own base, once per document, after the list map's stylesheet: a page of its own carries it, the viewer never does. */
330
+ function installEmbedStyles(doc) {
331
+ installListMapStyles(doc);
332
+ if (doc.getElementById('fieldia-map-embed-styles'))
333
+ return;
334
+ const own = doc.createElement('style');
335
+ own.id = 'fieldia-map-embed-styles';
336
+ own.textContent = exports.EMBED_CSS;
337
+ doc.getElementById('fieldia-list-map-styles')?.after(own);
338
+ }
280
339
  /**
281
340
  * A form's map, on top of a list map's pins and cards: its label, a route
282
341
  * (the part travelled faded), a place whose news is old, the Follow button,
@@ -295,6 +354,12 @@ path.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharr
295
354
  font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
296
355
  }
297
356
  .fd-map-face[data-look="photo"] .fd-map-face-stale { top: calc(100% + 26px); }
357
+ /* A place that moves, with pins that crowd it gathered under it: their count, itself among them, at its shoulder. */
358
+ .fd-map-count {
359
+ position: absolute; top: -8px; right: -10px; z-index: 2; min-width: 20px; height: 20px; padding: 0 5px; box-sizing: border-box; border-radius: 999px;
360
+ display: grid; place-items: center; font: 700 11.5px/1 system-ui, sans-serif; font-variant-numeric: tabular-nums; pointer-events: none;
361
+ background: var(--fd-accent); color: var(--fd-accent-text); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
362
+ }
298
363
  .fd-map-here.fd-map-follow { top: auto; bottom: 28px; }
299
364
  .fd-map-locate {
300
365
  position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":";;;AA+GA,4CAOC;AAGD,oDAQC;AAsID,oDAOC;AAkCD,oDAOC;AAvTD;;;;;GAKG;AACU,QAAA,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGtB,CAAC;AAEF,0HAA0H;AAC1H,SAAgB,gBAAgB,CAAC,GAAa;IAC5C,IAAI,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAAE,OAAO;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAC9B,GAAG,CAAC,WAAW,GAAG,eAAO,CAAC;IAC1B,4EAA4E;IAC5E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,8GAA8G;AAC9G,SAAgB,oBAAoB,CAAC,GAAa,EAAE,GAAW;IAC7D,IAAI,GAAG,CAAC,cAAc,CAAC,wBAAwB,CAAC;QAAE,OAAO;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,GAAG,wBAAwB,CAAC;IACtC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACrD,IAAI,GAAG;QAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;QACxB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACU,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4H3B,CAAC;AAEF,yEAAyE;AACzE,SAAgB,oBAAoB,CAAC,GAAa;IAChD,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC;QAAE,OAAO;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,yBAAyB,CAAC;IACnC,GAAG,CAAC,WAAW,GAAG,oBAAY,CAAC;IAC/B,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACU,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB3B,CAAC;AAEF,wEAAwE;AACxE,SAAgB,oBAAoB,CAAC,GAAa;IAChD,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC;QAAE,OAAO;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,yBAAyB,CAAC;IACnC,GAAG,CAAC,WAAW,GAAG,oBAAY,CAAC;IAC/B,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":"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"}
@@ -222,6 +222,15 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
222
222
  .fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }
223
223
  .fd-map-card-fields dt { color: var(--fd-muted); }
224
224
  .fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
225
+ /* A title linking to the record's page; bare lines, their labels for a screen reader alone; the first line leading. */
226
+ .fd-map-card .fd-map-card-link { color: inherit; text-decoration: none; }
227
+ .fd-map-card .fd-map-card-link:hover { color: var(--fd-accent); text-decoration: underline; }
228
+ .fd-map-card-picture { display: block; }
229
+ .fd-map-card-fields[data-labels] div { display: block; }
230
+ .fd-map-card-fields[data-labels] dt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
231
+ .fd-map-card-fields[data-labels] dd { text-align: start; font-weight: 400; }
232
+ .fd-map-card-fields[data-lead] > div:first-child dd { font-size: 15.5px; font-weight: 700; color: var(--fd-text); }
233
+ .fd-map-card-fields[data-lead][data-labels] > div + div dd { color: var(--fd-muted); }
225
234
  .fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
226
235
  .fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; margin-inline-end: auto; }
227
236
  .fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }
@@ -229,15 +238,17 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
229
238
  .fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
230
239
  .fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }
231
240
  .fd-map-crowd-item { width: 100%; padding: 6px 8px; border: 0; border-radius: 6px; text-align: start; background: transparent; color: var(--fd-text); font: inherit; font-size: 13px; cursor: pointer; }
232
- .fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
241
+ button.fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
242
+ span.fd-map-crowd-item { display: block; cursor: default; }
233
243
  .fd-map-here {
234
244
  position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;
235
245
  border: 1px solid var(--fd-border); background: var(--fd-surface); color: var(--fd-text); font: inherit; font-size: 13.5px; font-weight: 600; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
236
246
  }
237
247
  .fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }
238
248
  .fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
239
- /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */
240
- @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }
249
+ .fd-map-box[data-card] > .fd-map-here { visibility: hidden; }
250
+ /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach (unless the page says how tall). */
251
+ @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list:not([data-height]) .fd-map-box { height: clamp(260px, 46vh, 420px); } }
241
252
  .fd-map-ghost .fd-map-face { pointer-events: none; }
242
253
  /* The tools that draw an area to search in: at the map's start, the zoom at its end. */
243
254
  .fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }
@@ -259,6 +270,12 @@ span.fd-map-face-photo svg { width: 22px; height: 22px; }
259
270
  position: absolute; left: 8px; bottom: 28px; z-index: 1000; max-width: calc(100% - 64px); margin: 0; padding: 4px 8px; border-radius: 6px; font-size: 12.5px; line-height: 1.4;
260
271
  background: color-mix(in srgb, var(--fd-surface) 92%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
261
272
  }
273
+ /* As tall as the element it is put in; in the viewer's list, which gives it no height to fill, as tall as a list's map is. */
274
+ .fd-map-list[data-height="fill"] { height: 100%; }
275
+ .fd-list-map .fd-map-list[data-height="fill"] { height: auto; }
276
+ .fd-list-map .fd-map-list[data-height="fill"] .fd-map-box { height: clamp(320px, 64vh, 640px); }
277
+ /* A map that takes every gesture: one finger pans it, the page does not scroll under it. */
278
+ .fd-map-box.leaflet-container[data-gestures="all"] { touch-action: none; }
262
279
  `;
263
280
  /** The list map's stylesheet, once per document, after the maps' own. */
264
281
  export function installListMapStyles(doc) {
@@ -270,6 +287,47 @@ export function installListMapStyles(doc) {
270
287
  own.textContent = LIST_MAP_CSS;
271
288
  doc.getElementById('fieldia-map-styles')?.after(own);
272
289
  }
290
+ /**
291
+ * A list's map in a page of its own (`mountListMap`), outside the viewer:
292
+ * what the viewer's form gives its map — a part hidden stays hidden, words
293
+ * for a screen reader alone, its buttons, its sizes — on the map's element
294
+ * alone, so none of it reaches the page round it. Its colours are Fieldia's
295
+ * tokens, light and dark by the page's colour scheme, in Fieldia's tokens'
296
+ * layer: a page's own rule for `.fd-map-embed`, of any weight, sets them.
297
+ */
298
+ export const EMBED_CSS = `
299
+ @layer fieldia-tokens {
300
+ .fd-map-embed {
301
+ --fd-text: light-dark(#1f2328, #e8eaed); --fd-muted: light-dark(#59636e, #a3a9b2); --fd-surface: light-dark(#fff, #1f2329); --fd-border: light-dark(#d0d7de, #3a4048);
302
+ --fd-accent: light-dark(#1365d9, #5aa2ff); --fd-accent-text: light-dark(#fff, #0b1220); --fd-accent-soft: light-dark(#e6f4ff, #1d2c42); --fd-focus: var(--fd-accent);
303
+ --fd-info: light-dark(#0b5cad, #7db7ff); --fd-success: light-dark(#2e7d32, #6fd08e); --fd-warning: light-dark(#8a5300, #f2b55c); --fd-error: light-dark(#c62828, #ff8a7a);
304
+ --fd-control-radius: 6px;
305
+ }
306
+ }
307
+ .fd-map-embed { position: relative; color: var(--fd-text); font-size: 14px; line-height: 1.45; }
308
+ .fd-map-embed *, .fd-map-embed ::before, .fd-map-embed ::after { box-sizing: border-box; }
309
+ .fd-map-embed [hidden] { display: none !important; }
310
+ .fd-map-embed .fd-sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
311
+ .fd-map-embed .fd-button {
312
+ font: inherit; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 4px 14px;
313
+ border: 1px solid var(--fd-border); border-radius: var(--fd-control-radius); background: var(--fd-surface); color: var(--fd-text);
314
+ }
315
+ .fd-map-embed .fd-button:hover { border-color: var(--fd-accent); color: var(--fd-accent); }
316
+ .fd-map-embed .fd-button-primary { background: var(--fd-accent); border-color: var(--fd-accent); color: var(--fd-accent-text); }
317
+ .fd-map-embed .fd-button-primary:hover { color: var(--fd-accent-text); filter: brightness(1.12); }
318
+ .fd-map-embed .fd-button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
319
+ .fd-map-embed .fd-button[aria-busy="true"] { cursor: progress; opacity: 0.7; }
320
+ `;
321
+ /** A list's map's own base, once per document, after the list map's stylesheet: a page of its own carries it, the viewer never does. */
322
+ export function installEmbedStyles(doc) {
323
+ installListMapStyles(doc);
324
+ if (doc.getElementById('fieldia-map-embed-styles'))
325
+ return;
326
+ const own = doc.createElement('style');
327
+ own.id = 'fieldia-map-embed-styles';
328
+ own.textContent = EMBED_CSS;
329
+ doc.getElementById('fieldia-list-map-styles')?.after(own);
330
+ }
273
331
  /**
274
332
  * A form's map, on top of a list map's pins and cards: its label, a route
275
333
  * (the part travelled faded), a place whose news is old, the Follow button,
@@ -288,6 +346,12 @@ path.fd-map-fence { stroke: var(--fd-warning); stroke-width: 2.5; stroke-dasharr
288
346
  font-size: 11.5px; font-weight: 600; background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
289
347
  }
290
348
  .fd-map-face[data-look="photo"] .fd-map-face-stale { top: calc(100% + 26px); }
349
+ /* A place that moves, with pins that crowd it gathered under it: their count, itself among them, at its shoulder. */
350
+ .fd-map-count {
351
+ position: absolute; top: -8px; right: -10px; z-index: 2; min-width: 20px; height: 20px; padding: 0 5px; box-sizing: border-box; border-radius: 999px;
352
+ display: grid; place-items: center; font: 700 11.5px/1 system-ui, sans-serif; font-variant-numeric: tabular-nums; pointer-events: none;
353
+ background: var(--fd-accent); color: var(--fd-accent-text); border: 2px solid var(--fd-surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
354
+ }
291
355
  .fd-map-here.fd-map-follow { top: auto; bottom: 28px; }
292
356
  .fd-map-locate {
293
357
  position: absolute; top: 8px; left: 8px; z-index: 1000; width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGtB,CAAC;AAEF,0HAA0H;AAC1H,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC5C,IAAI,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAAE,OAAO;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAC9B,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,oBAAoB,CAAC,GAAa,EAAE,GAAW;IAC7D,IAAI,GAAG,CAAC,cAAc,CAAC,wBAAwB,CAAC;QAAE,OAAO;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,GAAG,wBAAwB,CAAC;IACtC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACrD,IAAI,GAAG;QAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;QACxB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4H3B,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,GAAa;IAChD,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC;QAAE,OAAO;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,yBAAyB,CAAC;IACnC,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC;IAC/B,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB3B,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,GAAa;IAChD,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC;QAAE,OAAO;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,yBAAyB,CAAC;IACnC,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC;IAC/B,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"styles.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import type * as Leaflet from 'leaflet';
2
2
  import type { Locale } from '@fieldia/core';
3
3
  import type { MapLabels } from './labels.mjs';
4
- import type { LeafletModule } from './leaflet.mjs';
5
- import type { MapBox, MapTool } from './map-core.mjs';
4
+ import { type LeafletModule } from './leaflet.mjs';
5
+ import { type MapBox, type MapTool } from './map-core.mjs';
6
6
  import type { MapProvider } from './providers.mjs';
7
7
  /**
8
8
  * The tools under a map's zoom, those its page asks for: the satellite's
9
- * images (no button where the provider has none), full screen (filling the
9
+ * images (no button where the provider has none), the provider's live
10
+ * traffic over the map (no button where it has none), full screen (filling the
10
11
  * window where the browser refuses the screen, as a frame may), and measuring
11
12
  * a way (its drawing asked for as the tools come, so a key pressed straight
12
13
  * after its press is not lost). Loaded with the first map that has any.
@@ -22,6 +23,8 @@ export declare function wireTools(options: {
22
23
  provider: MapProvider;
23
24
  /** The satellite's images on or off: the map draws them. */
24
25
  satellite(on: boolean): void;
26
+ /** Traffic on or off: the map says its credits. */
27
+ traffic(on: boolean): void;
25
28
  /** What to undo when the map goes. */
26
29
  cleanup(done: () => void): void;
27
30
  }): void;
@@ -1,12 +1,13 @@
1
1
  import type * as Leaflet from 'leaflet';
2
2
  import type { Locale } from '@fieldia/core';
3
3
  import type { MapLabels } from './labels';
4
- import type { LeafletModule } from './leaflet';
5
- import type { MapBox, MapTool } from './map-core';
4
+ import { type LeafletModule } from './leaflet';
5
+ import { type MapBox, type MapTool } from './map-core';
6
6
  import type { MapProvider } from './providers';
7
7
  /**
8
8
  * The tools under a map's zoom, those its page asks for: the satellite's
9
- * images (no button where the provider has none), full screen (filling the
9
+ * images (no button where the provider has none), the provider's live
10
+ * traffic over the map (no button where it has none), full screen (filling the
10
11
  * window where the browser refuses the screen, as a frame may), and measuring
11
12
  * a way (its drawing asked for as the tools come, so a key pressed straight
12
13
  * after its press is not lost). Loaded with the first map that has any.
@@ -22,6 +23,8 @@ export declare function wireTools(options: {
22
23
  provider: MapProvider;
23
24
  /** The satellite's images on or off: the map draws them. */
24
25
  satellite(on: boolean): void;
26
+ /** Traffic on or off: the map says its credits. */
27
+ traffic(on: boolean): void;
25
28
  /** What to undo when the map goes. */
26
29
  cleanup(done: () => void): void;
27
30
  }): void;
package/src/lib/tools.js CHANGED
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.wireTools = wireTools;
4
+ const leaflet_1 = require("./leaflet");
5
+ const map_core_1 = require("./map-core");
4
6
  /**
5
7
  * The tools under a map's zoom, those its page asks for: the satellite's
6
- * images (no button where the provider has none), full screen (filling the
8
+ * images (no button where the provider has none), the provider's live
9
+ * traffic over the map (no button where it has none), full screen (filling the
7
10
  * window where the browser refuses the screen, as a frame may), and measuring
8
11
  * a way (its drawing asked for as the tools come, so a key pressed straight
9
12
  * after its press is not lost). Loaded with the first map that has any.
@@ -23,6 +26,54 @@ function wireTools(options) {
23
26
  options.satellite(on);
24
27
  });
25
28
  }
29
+ const traffic = options.provider.traffic;
30
+ if (tools.has('traffic') && traffic) {
31
+ const button = box.tool(labels.traffic, '<rect x="7" y="2" width="10" height="20" rx="3"/><circle cx="12" cy="7" r="1.5"/><circle cx="12" cy="12" r="1.5"/><circle cx="12" cy="17" r="1.5"/>');
32
+ // None from the provider: no such button, as with no traffic at all.
33
+ button.hidden = true;
34
+ void traffic('road', locale).then((spec) => (button.hidden = !spec), () => (button.hidden = true));
35
+ let on = false;
36
+ let layer = null;
37
+ let asked = 0;
38
+ let timer;
39
+ /**
40
+ * The traffic for the map images drawn now (Azure's has colours of its own
41
+ * over the dark map): over them, under the routes and pins; drawn again
42
+ * as it goes out of date, the new over the old until it has come.
43
+ */
44
+ const draw = async () => {
45
+ const asking = ++asked;
46
+ clearTimeout(timer);
47
+ const spec = on ? await traffic((element.dataset['baseMap'] ?? 'road'), locale).catch((error) => ((0, map_core_1.warnOnce)(`The ${options.provider.id} traffic could not be drawn: ${error.message}`), null)) : null;
48
+ if (asking !== asked)
49
+ return;
50
+ const last = layer;
51
+ layer = spec && (0, leaflet_1.tileLayer)(options.L, spec.fresh ? { ...spec, url: `${spec.url}&t=${Date.now()}` } : spec);
52
+ if (layer) {
53
+ layer.options.className = 'fd-map-traffic';
54
+ layer.setZIndex(2).addTo(map);
55
+ if (spec?.fresh)
56
+ timer = setTimeout(draw, spec.fresh * 1000);
57
+ }
58
+ const drop = () => last?.remove();
59
+ if (layer && last) {
60
+ layer.once('load', drop);
61
+ setTimeout(drop, 5000);
62
+ }
63
+ else
64
+ drop();
65
+ };
66
+ button.addEventListener('click', () => {
67
+ on = !on;
68
+ button.setAttribute('aria-pressed', String(on));
69
+ options.traffic(on);
70
+ void draw();
71
+ });
72
+ // The map's images change kind (dark for a dark page, the satellite's): the traffic for them.
73
+ const watch = new MutationObserver(() => on && void draw());
74
+ watch.observe(element, { attributes: true, attributeFilter: ['data-base-map'] });
75
+ options.cleanup(() => (watch.disconnect(), clearTimeout(timer)));
76
+ }
26
77
  if (tools.has('fullscreen')) {
27
78
  const button = box.tool(labels.fullScreen, '<path d="M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5"/>');
28
79
  const mark = (on) => {
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/tools.ts"],"names":[],"mappings":"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"}