@fieldia/map 0.14.1 → 0.15.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 (72) hide show
  1. package/README.md +63 -3
  2. package/package.json +5 -4
  3. package/src/index.d.mts +3 -0
  4. package/src/index.d.ts +3 -0
  5. package/src/index.js +5 -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/area.js +29 -246
  10. package/src/lib/area.js.map +1 -1
  11. package/src/lib/area.mjs +29 -246
  12. package/src/lib/area.mjs.map +1 -1
  13. package/src/lib/card.d.mts +45 -0
  14. package/src/lib/card.d.ts +45 -0
  15. package/src/lib/card.js +89 -0
  16. package/src/lib/card.js.map +1 -0
  17. package/src/lib/card.mjs +85 -0
  18. package/src/lib/card.mjs.map +1 -0
  19. package/src/lib/cluster.d.mts +12 -0
  20. package/src/lib/cluster.d.ts +12 -0
  21. package/src/lib/cluster.js +60 -0
  22. package/src/lib/cluster.js.map +1 -0
  23. package/src/lib/cluster.mjs +57 -0
  24. package/src/lib/cluster.mjs.map +1 -0
  25. package/src/lib/drawing.d.mts +36 -0
  26. package/src/lib/drawing.d.ts +36 -0
  27. package/src/lib/drawing.js +267 -0
  28. package/src/lib/drawing.js.map +1 -0
  29. package/src/lib/drawing.mjs +263 -0
  30. package/src/lib/drawing.mjs.map +1 -0
  31. package/src/lib/kinds.js +9 -2
  32. package/src/lib/kinds.js.map +1 -1
  33. package/src/lib/kinds.mjs +9 -2
  34. package/src/lib/kinds.mjs.map +1 -1
  35. package/src/lib/labels.d.mts +28 -0
  36. package/src/lib/labels.d.ts +28 -0
  37. package/src/lib/labels.js +76 -1
  38. package/src/lib/labels.js.map +1 -1
  39. package/src/lib/labels.mjs +74 -0
  40. package/src/lib/labels.mjs.map +1 -1
  41. package/src/lib/list-view.d.mts +13 -0
  42. package/src/lib/list-view.d.ts +13 -0
  43. package/src/lib/list-view.js +481 -0
  44. package/src/lib/list-view.js.map +1 -0
  45. package/src/lib/list-view.mjs +478 -0
  46. package/src/lib/list-view.mjs.map +1 -0
  47. package/src/lib/map-core.d.mts +2 -2
  48. package/src/lib/map-core.d.ts +2 -2
  49. package/src/lib/map-core.js +1 -1
  50. package/src/lib/map-core.js.map +1 -1
  51. package/src/lib/map-core.mjs +1 -1
  52. package/src/lib/map-core.mjs.map +1 -1
  53. package/src/lib/map-icons.d.mts +8 -0
  54. package/src/lib/map-icons.d.ts +8 -0
  55. package/src/lib/map-icons.js +21 -0
  56. package/src/lib/map-icons.js.map +1 -0
  57. package/src/lib/map-icons.mjs +18 -0
  58. package/src/lib/map-icons.mjs.map +1 -0
  59. package/src/lib/pins.d.mts +56 -0
  60. package/src/lib/pins.d.ts +56 -0
  61. package/src/lib/pins.js +161 -0
  62. package/src/lib/pins.js.map +1 -0
  63. package/src/lib/pins.mjs +154 -0
  64. package/src/lib/pins.mjs.map +1 -0
  65. package/src/lib/settings.d.mts +5 -2
  66. package/src/lib/settings.d.ts +5 -2
  67. package/src/lib/styles.d.mts +8 -0
  68. package/src/lib/styles.d.ts +8 -0
  69. package/src/lib/styles.js +142 -1
  70. package/src/lib/styles.js.map +1 -1
  71. package/src/lib/styles.mjs +140 -0
  72. package/src/lib/styles.mjs.map +1 -1
@@ -0,0 +1,154 @@
1
+ import { compileModifier, expressionContext } from '@fieldia/core';
2
+ import { currencyOf, displayValue, drawIcon } from '@fieldia/widgets';
3
+ import { MAP_ICONS } from './map-icons.mjs';
4
+ /** The icons drawn as seen from above, facing north: they turn whole with a record's heading. */
5
+ const FROM_ABOVE = new Set(['car', 'arrow']);
6
+ const PIN = `<svg viewBox="0 0 30 40" aria-hidden="true" focusable="false"><path class="fd-map-face-body" d="M15 1C7.3 1 1 7.1 1 14.7 1 25.3 15 39 15 39s14-13.7 14-24.3C29 7.1 22.7 1 15 1z"/></svg>`;
7
+ export function makePins(options) {
8
+ const { document: doc, page, locale, pin } = options;
9
+ const icons = { ...MAP_ICONS, ...options.icons };
10
+ const look = pin.widget ? 'own' : (pin.look ?? (pin.label ? 'label' : pin.image ? 'photo' : pin.icon || pin.iconField ? 'icon' : 'pin'));
11
+ const drawer = pin.widget ? options.drawers?.[pin.widget] : undefined;
12
+ const tones = (pin.tones ?? []).map(({ tone, when }) => ({ tone, when: compileModifier(when) }));
13
+ const fields = [
14
+ ...new Set([options.title, pin.label, pin.iconField, pin.image, pin.turn, ...tones.flatMap((t) => t.when.fields)]
15
+ .filter((name) => !!name && name in page.fields)
16
+ .flatMap((name) => withCurrency(page, name))),
17
+ ];
18
+ const toneOf = (values) => {
19
+ if (!tones.length)
20
+ return undefined;
21
+ const context = expressionContext(values, page.fields);
22
+ return tones.find((t) => t.when.evaluate(context))?.tone;
23
+ };
24
+ const icon = (values) => {
25
+ const named = pin.iconField ? values[pin.iconField] : undefined;
26
+ const name = typeof named === 'string' && named ? named : pin.icon;
27
+ return drawIcon(doc, name, icons) ?? drawIcon(doc, pin.icon ?? 'pin', icons);
28
+ };
29
+ const span = (className, ...children) => {
30
+ const element = doc.createElement('span');
31
+ element.className = className;
32
+ element.append(...children);
33
+ return element;
34
+ };
35
+ function face(record) {
36
+ const { values } = record;
37
+ const element = doc.createElement('div');
38
+ element.className = 'fd-map-face';
39
+ element.dataset['look'] = look;
40
+ const tone = toneOf(values);
41
+ if (tone)
42
+ element.dataset['tone'] = tone;
43
+ const said = pin.label ? pinText(page, pin.label, values, locale) : '';
44
+ if (look === 'own') {
45
+ if (drawer)
46
+ element.append(drawer(record, { document: doc, locale, page }));
47
+ element.dataset['stands'] = 'middle';
48
+ return { element, stands: 'middle', height: 32 };
49
+ }
50
+ if (look === 'label' && said) {
51
+ element.append(span('fd-map-face-text', said));
52
+ element.dataset['stands'] = 'foot';
53
+ return { element, stands: 'foot', height: 34 };
54
+ }
55
+ if (look === 'pin') {
56
+ element.innerHTML = PIN;
57
+ const inside = pin.icon || pin.iconField ? icon(values) : null;
58
+ element.append(span('fd-map-face-icon', ...(inside ? [inside] : [])));
59
+ element.dataset['stands'] = 'foot';
60
+ return { element, stands: 'foot', height: 40 };
61
+ }
62
+ if (look === 'icon') {
63
+ const drawn = icon(values);
64
+ const glyph = span('fd-map-face-icon', ...(drawn ? [drawn] : []));
65
+ element.append(glyph);
66
+ const turn = pin.turn ? values[pin.turn] : null;
67
+ if (typeof turn === 'number' && Number.isFinite(turn)) {
68
+ // A car seen from above turns itself; a scooter seen from its side stays upright, a pointer on its edge showing the way.
69
+ if (FROM_ABOVE.has(drawn?.dataset['icon'] ?? ''))
70
+ glyph.style.transform = `rotate(${turn}deg)`;
71
+ else {
72
+ const pointer = span('fd-map-face-turn');
73
+ pointer.style.transform = `rotate(${turn}deg)`;
74
+ element.append(pointer);
75
+ }
76
+ }
77
+ element.dataset['stands'] = 'middle';
78
+ return { element, stands: 'middle', height: 34 };
79
+ }
80
+ if (look === 'photo') {
81
+ const source = pin.image ? imageSource(values[pin.image]) : '';
82
+ if (source) {
83
+ const img = doc.createElement('img');
84
+ img.className = 'fd-map-face-photo';
85
+ img.alt = '';
86
+ img.decoding = 'async';
87
+ img.src = source;
88
+ element.append(img);
89
+ }
90
+ else
91
+ element.append(span('fd-map-face-photo', ...[drawIcon(doc, 'user', icons)].filter((n) => !!n)));
92
+ if (said)
93
+ element.append(span('fd-map-face-text', said));
94
+ element.dataset['stands'] = 'middle';
95
+ return { element, stands: 'middle', height: 42 };
96
+ }
97
+ // A dot; and a label with nothing to say.
98
+ element.dataset['look'] = 'dot';
99
+ element.dataset['stands'] = 'middle';
100
+ return { element, stands: 'middle', height: 16 };
101
+ }
102
+ function name(record) {
103
+ const title = shown(page, options.title, record.values, locale);
104
+ const said = pin.label && pin.label !== options.title ? shown(page, pin.label, record.values, locale) : '';
105
+ return [title, said].filter(Boolean).join(', ') || String(record.id);
106
+ }
107
+ return { face, name, fields };
108
+ }
109
+ /** A field, and the field its amount's currency is in. */
110
+ export function withCurrency(page, name) {
111
+ const def = page.fields[name];
112
+ return def?.type === 'monetary' && def.currencyField && !def.currencyField.startsWith('parent.') ? [name, def.currencyField] : [name];
113
+ }
114
+ /** A value as a person reads it in full: a card's line, a pin's name. */
115
+ export function shown(page, name, values, locale) {
116
+ const def = page.fields[name];
117
+ const value = values[name];
118
+ if (value === null || value === undefined || value === '')
119
+ return '';
120
+ return def ? displayValue(def, value, values, locale) : String(value);
121
+ }
122
+ /**
123
+ * What a pin says, short enough for a pin: an amount or a number in the
124
+ * page's language, compact ("E£9.5M", "12K", "4.6"); anything else as a
125
+ * card would show it.
126
+ */
127
+ export function pinText(page, name, values, locale) {
128
+ const def = page.fields[name];
129
+ const value = values[name];
130
+ if (def && typeof value === 'number' && Number.isFinite(value) && (def.type === 'monetary' || def.type === 'integer' || def.type === 'float')) {
131
+ const currency = currencyOf(def, values);
132
+ const plain = { notation: 'compact', numberingSystem: 'latn', maximumFractionDigits: 1 };
133
+ try {
134
+ if (currency)
135
+ return new Intl.NumberFormat(locale, { ...plain, style: 'currency', currency, currencyDisplay: 'narrowSymbol' }).format(value);
136
+ }
137
+ catch {
138
+ // A currency named by words that are no code: written before the amount, as it is.
139
+ return `${currency} ${new Intl.NumberFormat(locale, plain).format(value)}`;
140
+ }
141
+ return new Intl.NumberFormat(locale, plain).format(value);
142
+ }
143
+ return shown(page, name, values, locale);
144
+ }
145
+ /** An image field's picture as an address: its first file's data, or where it is kept. */
146
+ export function imageSource(value) {
147
+ const file = (Array.isArray(value) ? value[0] : value);
148
+ if (!file)
149
+ return '';
150
+ if (typeof file === 'string')
151
+ return file;
152
+ return file.data ? `data:${file.type};base64,${file.data}` : (file.url ?? '');
153
+ }
154
+ //# sourceMappingURL=pins.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/pins.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { Locale } from '@fieldia/core';
2
2
  import type { LatLng } from './geo.mjs';
3
- import type { MapLabels } from './labels.mjs';
3
+ import type { ListMapLabels, MapLabels } from './labels.mjs';
4
+ import type { PinDrawer } from './pins.mjs';
4
5
  import type { AddressSearch, MapProvider, ReverseSearch } from './providers.mjs';
5
6
  /** What every map of an app shares: given once to `mapWidgets`. */
6
7
  export interface MapSettings {
@@ -14,6 +15,8 @@ export interface MapSettings {
14
15
  /** Where an empty map opens, and how close. */
15
16
  center?: LatLng;
16
17
  zoom?: number;
18
+ /** The app's own pins for a list's map, by the name a page's `pin.widget` gives. */
19
+ pins?: Record<string, PinDrawer>;
17
20
  /** The app's own words over the maps', by language. */
18
- labels?: Partial<Record<Locale, Partial<MapLabels>>>;
21
+ labels?: Partial<Record<Locale, Partial<MapLabels & ListMapLabels>>>;
19
22
  }
@@ -1,6 +1,7 @@
1
1
  import type { Locale } from '@fieldia/core';
2
2
  import type { LatLng } from './geo';
3
- import type { MapLabels } from './labels';
3
+ import type { ListMapLabels, MapLabels } from './labels';
4
+ import type { PinDrawer } from './pins';
4
5
  import type { AddressSearch, MapProvider, ReverseSearch } from './providers';
5
6
  /** What every map of an app shares: given once to `mapWidgets`. */
6
7
  export interface MapSettings {
@@ -14,6 +15,8 @@ export interface MapSettings {
14
15
  /** Where an empty map opens, and how close. */
15
16
  center?: LatLng;
16
17
  zoom?: number;
18
+ /** The app's own pins for a list's map, by the name a page's `pin.widget` gives. */
19
+ pins?: Record<string, PinDrawer>;
17
20
  /** The app's own words over the maps', by language. */
18
- labels?: Partial<Record<Locale, Partial<MapLabels>>>;
21
+ labels?: Partial<Record<Locale, Partial<MapLabels & ListMapLabels>>>;
19
22
  }
@@ -9,3 +9,11 @@ export declare const MAP_CSS = "\n.fd-map-field { display: grid; gap: 8px; min-w
9
9
  export declare function installMapStyles(doc: Document): void;
10
10
  /** Leaflet's stylesheet, once per document, before the maps' own (which add to it): it comes with Leaflet. */
11
11
  export declare function installLeafletStyles(doc: Document, css: string): void;
12
+ /**
13
+ * A list's map, on top of the maps' own: each record's pin in its look and
14
+ * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
15
+ * Its own stylesheet, so a form with only a place or an area never carries it.
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: space-between; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }\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";
18
+ /** The list map's stylesheet, once per document, after the maps' own. */
19
+ export declare function installListMapStyles(doc: Document): void;
@@ -9,3 +9,11 @@ export declare const MAP_CSS = "\n.fd-map-field { display: grid; gap: 8px; min-w
9
9
  export declare function installMapStyles(doc: Document): void;
10
10
  /** Leaflet's stylesheet, once per document, before the maps' own (which add to it): it comes with Leaflet. */
11
11
  export declare function installLeafletStyles(doc: Document, css: string): void;
12
+ /**
13
+ * A list's map, on top of the maps' own: each record's pin in its look and
14
+ * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
15
+ * Its own stylesheet, so a form with only a place or an area never carries it.
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: space-between; gap: 8px; }\n.fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }\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";
18
+ /** The list map's stylesheet, once per document, after the maps' own. */
19
+ export declare function installListMapStyles(doc: Document): void;
package/src/lib/styles.js CHANGED
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAP_CSS = void 0;
3
+ exports.LIST_MAP_CSS = exports.MAP_CSS = void 0;
4
4
  exports.installMapStyles = installMapStyles;
5
5
  exports.installLeafletStyles = installLeafletStyles;
6
+ exports.installListMapStyles = installListMapStyles;
6
7
  /**
7
8
  * The maps in Fieldia's colours: every colour a token, so a theme, a host's
8
9
  * tokens and the dark scheme reach the map's buttons, search, shapes and
@@ -127,4 +128,144 @@ function installLeafletStyles(doc, css) {
127
128
  else
128
129
  doc.head.prepend(leaflet);
129
130
  }
131
+ /**
132
+ * A list's map, on top of the maps' own: each record's pin in its look and
133
+ * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
134
+ * Its own stylesheet, so a form with only a place or an area never carries it.
135
+ */
136
+ exports.LIST_MAP_CSS = `
137
+ .fd-map-list { min-width: 0; }
138
+ .fd-map-mark { overflow: visible; }
139
+ .fd-map-mark:focus { outline: none; }
140
+ /* 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. */
141
+ .fd-map-mark.fd-map-foot { translate: -50% -100%; }
142
+ .fd-map-mark.fd-map-middle { translate: -50% -50%; }
143
+ .fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }
144
+ .fd-map-face {
145
+ --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);
146
+ position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;
147
+ }
148
+ .fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }
149
+ .fd-map-face[data-tone="info"] { --fd-map-tone: var(--fd-info); }
150
+ .fd-map-face[data-tone="success"] { --fd-map-tone: var(--fd-success); }
151
+ .fd-map-face[data-tone="warning"] { --fd-map-tone: var(--fd-warning); }
152
+ .fd-map-face[data-tone="danger"] { --fd-map-tone: var(--fd-error); }
153
+ .fd-map-face[data-tone="muted"] { --fd-map-tone: var(--fd-muted); }
154
+ .fd-map-face[data-stands="foot"] { transform-origin: 50% 100%; }
155
+ .fd-map-face[data-stands="middle"] { transform-origin: 50% 50%; }
156
+ .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; }
157
+ .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; }
158
+ .fd-map-face-icon { display: block; }
159
+ .fd-map-face-icon svg { display: block; width: 100%; height: 100%; }
160
+ .fd-map-face[data-look="label"] {
161
+ padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;
162
+ 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);
163
+ }
164
+ .fd-map-face[data-look="label"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }
165
+ .fd-map-face[data-look="label"]::after {
166
+ content: ""; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);
167
+ background: inherit; border: inherit; border-top: 0; border-left: 0;
168
+ }
169
+ .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); }
170
+ .fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
171
+ .fd-map-face[data-look="pin"] { width: 30px; height: 40px; }
172
+ .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)); }
173
+ .fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }
174
+ .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); }
175
+ .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); }
176
+ .fd-map-face[data-look="icon"] {
177
+ width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;
178
+ 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);
179
+ }
180
+ .fd-map-face[data-look="icon"] .fd-map-face-icon { width: 20px; height: 20px; }
181
+ .fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }
182
+ .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); }
183
+ .fd-map-face-photo {
184
+ display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;
185
+ 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);
186
+ }
187
+ span.fd-map-face-photo svg { width: 22px; height: 22px; }
188
+ .fd-map-face[data-look="photo"] .fd-map-face-text {
189
+ position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;
190
+ 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);
191
+ }
192
+ .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); }
193
+ .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); }
194
+ .fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {
195
+ content: "✓"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;
196
+ 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);
197
+ }
198
+ .fd-map-bubble {
199
+ position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;
200
+ background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;
201
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);
202
+ }
203
+ .fd-map-bubble[data-size="m"] { width: 40px; height: 40px; }
204
+ .fd-map-bubble[data-size="l"] { width: 48px; height: 48px; }
205
+ .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); }
206
+ .fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }
207
+ .fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }
208
+ .fd-map-card { display: grid; }
209
+ .fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }
210
+ .fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }
211
+ .fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }
212
+ .fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }
213
+ .fd-map-card-close {
214
+ flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;
215
+ background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;
216
+ }
217
+ .fd-map-card[dir="rtl"] .fd-map-card-close { margin: -4px 0 -4px -6px; }
218
+ .fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }
219
+ .fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }
220
+ .fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }
221
+ .fd-map-card-fields dt { color: var(--fd-muted); }
222
+ .fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
223
+ .fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; }
224
+ .fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }
225
+ .fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }
226
+ .fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }
227
+ .fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
228
+ .fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }
229
+ .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; }
230
+ .fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
231
+ .fd-map-here {
232
+ position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;
233
+ 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);
234
+ }
235
+ .fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }
236
+ .fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
237
+ /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */
238
+ @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }
239
+ .fd-map-ghost .fd-map-face { pointer-events: none; }
240
+ /* The tools that draw an area to search in: at the map's start, the zoom at its end. */
241
+ .fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }
242
+ .fd-map-box[data-side="left"] .fd-map-draw { left: auto; right: 8px; }
243
+ .fd-map-draw button {
244
+ width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;
245
+ 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);
246
+ }
247
+ .fd-map-draw button svg { width: 18px; height: 18px; }
248
+ .fd-map-draw button:hover, .fd-map-draw button[aria-pressed="true"] { color: var(--fd-accent); border-color: var(--fd-accent); }
249
+ .fd-map-draw button[aria-pressed="true"] { background: var(--fd-accent-soft); }
250
+ .fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
251
+ /* While an area is drawn, the pins let every press through to the map. */
252
+ .fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }
253
+ /* The drawing's bar starts after the tools. */
254
+ .fd-map-list .fd-map-hint { left: 48px; }
255
+ .fd-map-list .fd-map-box[data-side="left"] .fd-map-hint { left: 52px; right: 48px; }
256
+ .fd-map-list-note {
257
+ 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;
258
+ 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);
259
+ }
260
+ `;
261
+ /** The list map's stylesheet, once per document, after the maps' own. */
262
+ function installListMapStyles(doc) {
263
+ installMapStyles(doc);
264
+ if (doc.getElementById('fieldia-list-map-styles'))
265
+ return;
266
+ const own = doc.createElement('style');
267
+ own.id = 'fieldia-list-map-styles';
268
+ own.textContent = exports.LIST_MAP_CSS;
269
+ doc.getElementById('fieldia-map-styles')?.after(own);
270
+ }
130
271
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":";;;AAuGA,4CAOC;AAGD,oDAQC;AAzHD;;;;;GAKG;AACU,QAAA,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FtB,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"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":";;;AAuGA,4CAOC;AAGD,oDAQC;AAsID,oDAOC;AAtQD;;;;;GAKG;AACU,QAAA,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FtB,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"}
@@ -122,4 +122,144 @@ export function installLeafletStyles(doc, css) {
122
122
  else
123
123
  doc.head.prepend(leaflet);
124
124
  }
125
+ /**
126
+ * A list's map, on top of the maps' own: each record's pin in its look and
127
+ * tone, bubbles of pins that crowd, the card a pin opens, "Search this area".
128
+ * Its own stylesheet, so a form with only a place or an area never carries it.
129
+ */
130
+ export const LIST_MAP_CSS = `
131
+ .fd-map-list { min-width: 0; }
132
+ .fd-map-mark { overflow: visible; }
133
+ .fd-map-mark:focus { outline: none; }
134
+ /* 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. */
135
+ .fd-map-mark.fd-map-foot { translate: -50% -100%; }
136
+ .fd-map-mark.fd-map-middle { translate: -50% -50%; }
137
+ .fd-map-mark.fd-map-tail { translate: -50% calc(-100% - 6px); }
138
+ .fd-map-face {
139
+ --fd-map-tone: var(--fd-accent); --fd-map-on: var(--fd-accent-text);
140
+ position: relative; box-sizing: border-box; cursor: pointer; transition: scale 0.12s;
141
+ }
142
+ .fd-map-face[data-tone] { --fd-map-on: var(--fd-surface); }
143
+ .fd-map-face[data-tone="info"] { --fd-map-tone: var(--fd-info); }
144
+ .fd-map-face[data-tone="success"] { --fd-map-tone: var(--fd-success); }
145
+ .fd-map-face[data-tone="warning"] { --fd-map-tone: var(--fd-warning); }
146
+ .fd-map-face[data-tone="danger"] { --fd-map-tone: var(--fd-error); }
147
+ .fd-map-face[data-tone="muted"] { --fd-map-tone: var(--fd-muted); }
148
+ .fd-map-face[data-stands="foot"] { transform-origin: 50% 100%; }
149
+ .fd-map-face[data-stands="middle"] { transform-origin: 50% 50%; }
150
+ .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; }
151
+ .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; }
152
+ .fd-map-face-icon { display: block; }
153
+ .fd-map-face-icon svg { display: block; width: 100%; height: 100%; }
154
+ .fd-map-face[data-look="label"] {
155
+ padding: 4px 9px; border-radius: 999px; font-weight: 700; font-size: 13px; line-height: 1.25; font-variant-numeric: tabular-nums;
156
+ 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);
157
+ }
158
+ .fd-map-face[data-look="label"][data-tone] { color: var(--fd-map-tone); border-color: var(--fd-map-tone); }
159
+ .fd-map-face[data-look="label"]::after {
160
+ content: ""; position: absolute; left: 50%; bottom: -5px; width: 8px; height: 8px; margin-left: -4px; transform: rotate(45deg);
161
+ background: inherit; border: inherit; border-top: 0; border-left: 0;
162
+ }
163
+ .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); }
164
+ .fd-map-face-text { display: block; max-width: 16ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
165
+ .fd-map-face[data-look="pin"] { width: 30px; height: 40px; }
166
+ .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)); }
167
+ .fd-map-face-body { fill: var(--fd-map-tone); stroke: var(--fd-surface); stroke-width: 1.5; }
168
+ .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); }
169
+ .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); }
170
+ .fd-map-face[data-look="icon"] {
171
+ width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;
172
+ 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);
173
+ }
174
+ .fd-map-face[data-look="icon"] .fd-map-face-icon { width: 20px; height: 20px; }
175
+ .fd-map-face-turn { position: absolute; inset: -9px; pointer-events: none; }
176
+ .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); }
177
+ .fd-map-face-photo {
178
+ display: grid; place-items: center; width: 40px; height: 40px; box-sizing: border-box; border-radius: 50%; object-fit: cover;
179
+ 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);
180
+ }
181
+ span.fd-map-face-photo svg { width: 22px; height: 22px; }
182
+ .fd-map-face[data-look="photo"] .fd-map-face-text {
183
+ position: absolute; top: calc(100% + 2px); left: 50%; translate: -50% 0; max-width: 14ch; padding: 1px 6px; border-radius: 999px;
184
+ 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);
185
+ }
186
+ .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); }
187
+ .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); }
188
+ .fd-map-face[data-chosen]::before, .fd-map-bubble[data-chosen]::before {
189
+ content: "✓"; position: absolute; top: -7px; right: -7px; z-index: 1; width: 16px; height: 16px; border-radius: 50%; box-sizing: border-box;
190
+ 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);
191
+ }
192
+ .fd-map-bubble {
193
+ position: relative; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; cursor: pointer;
194
+ background: var(--fd-accent); color: var(--fd-accent-text); font-weight: 700; font-size: 13px; font-variant-numeric: tabular-nums; transition: scale 0.12s;
195
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--fd-accent) 30%, transparent), 0 1px 4px rgba(0, 0, 0, 0.3);
196
+ }
197
+ .fd-map-bubble[data-size="m"] { width: 40px; height: 40px; }
198
+ .fd-map-bubble[data-size="l"] { width: 48px; height: 48px; }
199
+ .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); }
200
+ .fd-map-card-popup .leaflet-popup-content { margin: 0; font: inherit; font-size: 14px; line-height: 1.4; }
201
+ .fd-map-card-popup .leaflet-popup-tip { background: var(--fd-surface); }
202
+ .fd-map-card { display: grid; }
203
+ .fd-map-card-image { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: var(--fd-fill); }
204
+ .fd-map-card-body { display: grid; gap: 8px; padding: 10px 12px 12px; }
205
+ .fd-map-card-head { display: flex; align-items: flex-start; gap: 8px; }
206
+ .fd-map-card-title { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.3; overflow-wrap: anywhere; }
207
+ .fd-map-card-close {
208
+ flex: none; width: 28px; height: 28px; margin: -4px -6px -4px 0; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%;
209
+ background: transparent; color: var(--fd-muted); font: 400 20px/1 system-ui, sans-serif; cursor: pointer;
210
+ }
211
+ .fd-map-card[dir="rtl"] .fd-map-card-close { margin: -4px 0 -4px -6px; }
212
+ .fd-map-card-close:hover { background: var(--fd-fill); color: var(--fd-text); }
213
+ .fd-map-card-fields { margin: 0; display: grid; gap: 3px; font-size: 13px; }
214
+ .fd-map-card-fields div { display: flex; justify-content: space-between; gap: 10px; }
215
+ .fd-map-card-fields dt { color: var(--fd-muted); }
216
+ .fd-map-card-fields dd { margin: 0; text-align: end; font-weight: 600; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
217
+ .fd-map-card-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; }
218
+ .fd-map-card-choose { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }
219
+ .fd-map-card-choose input { width: 16px; height: 16px; margin: 0; accent-color: var(--fd-accent); }
220
+ .fd-map-card .fd-button { min-height: 30px; padding-inline: 14px; }
221
+ .fd-map-card :focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
222
+ .fd-map-crowd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 220px; overflow: auto; }
223
+ .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; }
224
+ .fd-map-crowd-item:hover { background: var(--fd-accent-soft); }
225
+ .fd-map-here {
226
+ position: absolute; top: 10px; left: 50%; translate: -50% 0; z-index: 1000; padding: 7px 14px; border-radius: 999px; white-space: nowrap; cursor: pointer;
227
+ 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);
228
+ }
229
+ .fd-map-here:hover { color: var(--fd-accent); border-color: var(--fd-accent); }
230
+ .fd-map-here:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 2px; }
231
+ /* The map over the table when the list is too narrow for both side by side: shorter, so the table is in reach. */
232
+ @container fd-list (max-width: 860px) { .fd-list[data-view="both"] .fd-map-list .fd-map-box { height: clamp(260px, 46vh, 420px); } }
233
+ .fd-map-ghost .fd-map-face { pointer-events: none; }
234
+ /* The tools that draw an area to search in: at the map's start, the zoom at its end. */
235
+ .fd-map-draw { position: absolute; top: 8px; left: 8px; z-index: 1000; display: grid; gap: 4px; }
236
+ .fd-map-box[data-side="left"] .fd-map-draw { left: auto; right: 8px; }
237
+ .fd-map-draw button {
238
+ width: 32px; height: 32px; display: grid; place-items: center; padding: 0; cursor: pointer;
239
+ 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);
240
+ }
241
+ .fd-map-draw button svg { width: 18px; height: 18px; }
242
+ .fd-map-draw button:hover, .fd-map-draw button[aria-pressed="true"] { color: var(--fd-accent); border-color: var(--fd-accent); }
243
+ .fd-map-draw button[aria-pressed="true"] { background: var(--fd-accent-soft); }
244
+ .fd-map-draw button:focus-visible { outline: 2px solid var(--fd-focus); outline-offset: 1px; }
245
+ /* While an area is drawn, the pins let every press through to the map. */
246
+ .fd-map-box[data-drawing] .fd-map-mark { pointer-events: none; }
247
+ /* The drawing's bar starts after the tools. */
248
+ .fd-map-list .fd-map-hint { left: 48px; }
249
+ .fd-map-list .fd-map-box[data-side="left"] .fd-map-hint { left: 52px; right: 48px; }
250
+ .fd-map-list-note {
251
+ 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;
252
+ 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);
253
+ }
254
+ `;
255
+ /** The list map's stylesheet, once per document, after the maps' own. */
256
+ export function installListMapStyles(doc) {
257
+ installMapStyles(doc);
258
+ if (doc.getElementById('fieldia-list-map-styles'))
259
+ return;
260
+ const own = doc.createElement('style');
261
+ own.id = 'fieldia-list-map-styles';
262
+ own.textContent = LIST_MAP_CSS;
263
+ doc.getElementById('fieldia-map-styles')?.after(own);
264
+ }
125
265
  //# sourceMappingURL=styles.mjs.map
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FtB,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"}
1
+ {"version":3,"file":"styles.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/styles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FtB,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"}